@omerdlw/base-framework 1.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/LICENSE +21 -0
- package/README.md +117 -0
- package/dist/atoms/button.d.ts +11 -0
- package/dist/atoms/button.d.ts.map +1 -0
- package/dist/atoms/icon.d.ts +15 -0
- package/dist/atoms/icon.d.ts.map +1 -0
- package/dist/atoms/index.d.ts +6 -0
- package/dist/atoms/index.d.ts.map +1 -0
- package/dist/atoms/index.js +169 -0
- package/dist/atoms/index.js.map +1 -0
- package/dist/atoms/spinner.d.ts +9 -0
- package/dist/atoms/spinner.d.ts.map +1 -0
- package/dist/atoms/tooltip.d.ts +18 -0
- package/dist/atoms/tooltip.d.ts.map +1 -0
- package/dist/error/boundary.d.ts +14 -0
- package/dist/error/boundary.d.ts.map +1 -0
- package/dist/error/constants.d.ts +18 -0
- package/dist/error/constants.d.ts.map +1 -0
- package/dist/error/index.d.ts +9 -0
- package/dist/error/index.d.ts.map +1 -0
- package/dist/error/index.js +688 -0
- package/dist/error/index.js.map +1 -0
- package/dist/error/listener.d.ts +2 -0
- package/dist/error/listener.d.ts.map +1 -0
- package/dist/error/reporter.d.ts +32 -0
- package/dist/error/reporter.d.ts.map +1 -0
- package/dist/error/theme.d.ts +3 -0
- package/dist/error/theme.d.ts.map +1 -0
- package/dist/error/types.d.ts +91 -0
- package/dist/error/types.d.ts.map +1 -0
- package/dist/error/utils.d.ts +21 -0
- package/dist/error/utils.d.ts.map +1 -0
- package/dist/events.d.ts +51 -0
- package/dist/events.d.ts.map +1 -0
- package/dist/events.js +88 -0
- package/dist/events.js.map +1 -0
- package/dist/hooks/index.d.ts +17 -0
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/index.js +804 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/hooks/types.d.ts +58 -0
- package/dist/hooks/types.d.ts.map +1 -0
- package/dist/hooks/use-async-action.d.ts +3 -0
- package/dist/hooks/use-async-action.d.ts.map +1 -0
- package/dist/hooks/use-click-outside.d.ts +3 -0
- package/dist/hooks/use-click-outside.d.ts.map +1 -0
- package/dist/hooks/use-controllable-state.d.ts +3 -0
- package/dist/hooks/use-controllable-state.d.ts.map +1 -0
- package/dist/hooks/use-debounce.d.ts +2 -0
- package/dist/hooks/use-debounce.d.ts.map +1 -0
- package/dist/hooks/use-fullscreen-state.d.ts +4 -0
- package/dist/hooks/use-fullscreen-state.d.ts.map +1 -0
- package/dist/hooks/use-global-event.d.ts +7 -0
- package/dist/hooks/use-global-event.d.ts.map +1 -0
- package/dist/hooks/use-hotkey.d.ts +4 -0
- package/dist/hooks/use-hotkey.d.ts.map +1 -0
- package/dist/hooks/use-intersection-observer.d.ts +4 -0
- package/dist/hooks/use-intersection-observer.d.ts.map +1 -0
- package/dist/hooks/use-isomorphic-layout-effect.d.ts +3 -0
- package/dist/hooks/use-isomorphic-layout-effect.d.ts.map +1 -0
- package/dist/hooks/use-media-query.d.ts +2 -0
- package/dist/hooks/use-media-query.d.ts.map +1 -0
- package/dist/hooks/use-mounted.d.ts +2 -0
- package/dist/hooks/use-mounted.d.ts.map +1 -0
- package/dist/hooks/use-required-context.d.ts +3 -0
- package/dist/hooks/use-required-context.d.ts.map +1 -0
- package/dist/hooks/use-server-action.d.ts +4 -0
- package/dist/hooks/use-server-action.d.ts.map +1 -0
- package/dist/hooks/use-storage-state.d.ts +5 -0
- package/dist/hooks/use-storage-state.d.ts.map +1 -0
- package/dist/hooks/use-store.d.ts +3 -0
- package/dist/hooks/use-store.d.ts.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +20415 -0
- package/dist/index.js.map +1 -0
- package/dist/kernel/adapters.d.ts +5 -0
- package/dist/kernel/adapters.d.ts.map +1 -0
- package/dist/kernel/compose.d.ts +15 -0
- package/dist/kernel/compose.d.ts.map +1 -0
- package/dist/kernel/constants.d.ts +12 -0
- package/dist/kernel/constants.d.ts.map +1 -0
- package/dist/kernel/context-registry.d.ts +3 -0
- package/dist/kernel/context-registry.d.ts.map +1 -0
- package/dist/kernel/handlers.d.ts +3 -0
- package/dist/kernel/handlers.d.ts.map +1 -0
- package/dist/kernel/hooks.d.ts +7 -0
- package/dist/kernel/hooks.d.ts.map +1 -0
- package/dist/kernel/index.d.ts +14 -0
- package/dist/kernel/index.d.ts.map +1 -0
- package/dist/kernel/index.js +2109 -0
- package/dist/kernel/index.js.map +1 -0
- package/dist/kernel/installed.d.ts +21 -0
- package/dist/kernel/installed.d.ts.map +1 -0
- package/dist/kernel/module.d.ts +32 -0
- package/dist/kernel/module.d.ts.map +1 -0
- package/dist/kernel/operations.d.ts +21 -0
- package/dist/kernel/operations.d.ts.map +1 -0
- package/dist/kernel/page-controller.d.ts +8 -0
- package/dist/kernel/page-controller.d.ts.map +1 -0
- package/dist/kernel/provider.d.ts +18 -0
- package/dist/kernel/provider.d.ts.map +1 -0
- package/dist/kernel/runtime.d.ts +30 -0
- package/dist/kernel/runtime.d.ts.map +1 -0
- package/dist/kernel/schema.d.ts +13 -0
- package/dist/kernel/schema.d.ts.map +1 -0
- package/dist/kernel/store.d.ts +4 -0
- package/dist/kernel/store.d.ts.map +1 -0
- package/dist/kernel/types.d.ts +233 -0
- package/dist/kernel/types.d.ts.map +1 -0
- package/dist/kernel/utils.d.ts +20 -0
- package/dist/kernel/utils.d.ts.map +1 -0
- package/dist/modules/ambient/constants.d.ts +23 -0
- package/dist/modules/ambient/constants.d.ts.map +1 -0
- package/dist/modules/ambient/context.d.ts +10 -0
- package/dist/modules/ambient/context.d.ts.map +1 -0
- package/dist/modules/ambient/index.d.ts +6 -0
- package/dist/modules/ambient/index.d.ts.map +1 -0
- package/dist/modules/ambient/index.js +896 -0
- package/dist/modules/ambient/index.js.map +1 -0
- package/dist/modules/ambient/module.d.ts +12 -0
- package/dist/modules/ambient/module.d.ts.map +1 -0
- package/dist/modules/ambient/types.d.ts +84 -0
- package/dist/modules/ambient/types.d.ts.map +1 -0
- package/dist/modules/ambient/utils.d.ts +18 -0
- package/dist/modules/ambient/utils.d.ts.map +1 -0
- package/dist/modules/background/constants.d.ts +12 -0
- package/dist/modules/background/constants.d.ts.map +1 -0
- package/dist/modules/background/context.d.ts +13 -0
- package/dist/modules/background/context.d.ts.map +1 -0
- package/dist/modules/background/hooks.d.ts +119 -0
- package/dist/modules/background/hooks.d.ts.map +1 -0
- package/dist/modules/background/index.d.ts +7 -0
- package/dist/modules/background/index.d.ts.map +1 -0
- package/dist/modules/background/index.js +3195 -0
- package/dist/modules/background/index.js.map +1 -0
- package/dist/modules/background/module.d.ts +14 -0
- package/dist/modules/background/module.d.ts.map +1 -0
- package/dist/modules/background/motion.d.ts +13 -0
- package/dist/modules/background/motion.d.ts.map +1 -0
- package/dist/modules/background/overlay.d.ts +49 -0
- package/dist/modules/background/overlay.d.ts.map +1 -0
- package/dist/modules/background/types.d.ts +153 -0
- package/dist/modules/background/types.d.ts.map +1 -0
- package/dist/modules/background/utils.d.ts +56 -0
- package/dist/modules/background/utils.d.ts.map +1 -0
- package/dist/modules/background/youtube/iframe.d.ts +52 -0
- package/dist/modules/background/youtube/iframe.d.ts.map +1 -0
- package/dist/modules/background/youtube/parse.d.ts +17 -0
- package/dist/modules/background/youtube/parse.d.ts.map +1 -0
- package/dist/modules/context-menu/constants.d.ts +8 -0
- package/dist/modules/context-menu/constants.d.ts.map +1 -0
- package/dist/modules/context-menu/context.d.ts +16 -0
- package/dist/modules/context-menu/context.d.ts.map +1 -0
- package/dist/modules/context-menu/hooks.d.ts +31 -0
- package/dist/modules/context-menu/hooks.d.ts.map +1 -0
- package/dist/modules/context-menu/index.d.ts +6 -0
- package/dist/modules/context-menu/index.d.ts.map +1 -0
- package/dist/modules/context-menu/index.js +2008 -0
- package/dist/modules/context-menu/index.js.map +1 -0
- package/dist/modules/context-menu/module.d.ts +12 -0
- package/dist/modules/context-menu/module.d.ts.map +1 -0
- package/dist/modules/context-menu/motion.d.ts +9 -0
- package/dist/modules/context-menu/motion.d.ts.map +1 -0
- package/dist/modules/context-menu/overlay.d.ts +15 -0
- package/dist/modules/context-menu/overlay.d.ts.map +1 -0
- package/dist/modules/context-menu/resolver.d.ts +7 -0
- package/dist/modules/context-menu/resolver.d.ts.map +1 -0
- package/dist/modules/context-menu/state.d.ts +4 -0
- package/dist/modules/context-menu/state.d.ts.map +1 -0
- package/dist/modules/context-menu/types.d.ts +171 -0
- package/dist/modules/context-menu/types.d.ts.map +1 -0
- package/dist/modules/context-menu/utils.d.ts +16 -0
- package/dist/modules/context-menu/utils.d.ts.map +1 -0
- package/dist/modules/controls/constants.d.ts +7 -0
- package/dist/modules/controls/constants.d.ts.map +1 -0
- package/dist/modules/controls/hooks.d.ts +15 -0
- package/dist/modules/controls/hooks.d.ts.map +1 -0
- package/dist/modules/controls/index.d.ts +6 -0
- package/dist/modules/controls/index.d.ts.map +1 -0
- package/dist/modules/controls/index.js +1242 -0
- package/dist/modules/controls/index.js.map +1 -0
- package/dist/modules/controls/module.d.ts +12 -0
- package/dist/modules/controls/module.d.ts.map +1 -0
- package/dist/modules/controls/overlay.d.ts +2 -0
- package/dist/modules/controls/overlay.d.ts.map +1 -0
- package/dist/modules/controls/types.d.ts +86 -0
- package/dist/modules/controls/types.d.ts.map +1 -0
- package/dist/modules/controls/utils.d.ts +9 -0
- package/dist/modules/controls/utils.d.ts.map +1 -0
- package/dist/modules/dock/cards.d.ts +1035 -0
- package/dist/modules/dock/cards.d.ts.map +1 -0
- package/dist/modules/dock/constants.d.ts +157 -0
- package/dist/modules/dock/constants.d.ts.map +1 -0
- package/dist/modules/dock/context.d.ts +26 -0
- package/dist/modules/dock/context.d.ts.map +1 -0
- package/dist/modules/dock/hooks.d.ts +957 -0
- package/dist/modules/dock/hooks.d.ts.map +1 -0
- package/dist/modules/dock/hud.d.ts +43 -0
- package/dist/modules/dock/hud.d.ts.map +1 -0
- package/dist/modules/dock/index.d.ts +27 -0
- package/dist/modules/dock/index.d.ts.map +1 -0
- package/dist/modules/dock/index.js +12111 -0
- package/dist/modules/dock/index.js.map +1 -0
- package/dist/modules/dock/module.d.ts +71 -0
- package/dist/modules/dock/module.d.ts.map +1 -0
- package/dist/modules/dock/motion.d.ts +986 -0
- package/dist/modules/dock/motion.d.ts.map +1 -0
- package/dist/modules/dock/overlay.d.ts +79 -0
- package/dist/modules/dock/overlay.d.ts.map +1 -0
- package/dist/modules/dock/provider.d.ts +3 -0
- package/dist/modules/dock/provider.d.ts.map +1 -0
- package/dist/modules/dock/routing/breadcrumbs.d.ts +43 -0
- package/dist/modules/dock/routing/breadcrumbs.d.ts.map +1 -0
- package/dist/modules/dock/routing/continuity.d.ts +19 -0
- package/dist/modules/dock/routing/continuity.d.ts.map +1 -0
- package/dist/modules/dock/routing/guards.d.ts +21 -0
- package/dist/modules/dock/routing/guards.d.ts.map +1 -0
- package/dist/modules/dock/routing/navigation.d.ts +37 -0
- package/dist/modules/dock/routing/navigation.d.ts.map +1 -0
- package/dist/modules/dock/routing/transactions.d.ts +21 -0
- package/dist/modules/dock/routing/transactions.d.ts.map +1 -0
- package/dist/modules/dock/runtime/commands.d.ts +18 -0
- package/dist/modules/dock/runtime/commands.d.ts.map +1 -0
- package/dist/modules/dock/runtime/display.d.ts +36 -0
- package/dist/modules/dock/runtime/display.d.ts.map +1 -0
- package/dist/modules/dock/runtime/dock.d.ts +123 -0
- package/dist/modules/dock/runtime/dock.d.ts.map +1 -0
- package/dist/modules/dock/state.d.ts +22 -0
- package/dist/modules/dock/state.d.ts.map +1 -0
- package/dist/modules/dock/status/events.d.ts +37 -0
- package/dist/modules/dock/status/events.d.ts.map +1 -0
- package/dist/modules/dock/status/hooks.d.ts +6 -0
- package/dist/modules/dock/status/hooks.d.ts.map +1 -0
- package/dist/modules/dock/status/model.d.ts +65 -0
- package/dist/modules/dock/status/model.d.ts.map +1 -0
- package/dist/modules/dock/surface/context.d.ts +43 -0
- package/dist/modules/dock/surface/context.d.ts.map +1 -0
- package/dist/modules/dock/surface/definition.d.ts +38 -0
- package/dist/modules/dock/surface/definition.d.ts.map +1 -0
- package/dist/modules/dock/surface/hooks.d.ts +123 -0
- package/dist/modules/dock/surface/hooks.d.ts.map +1 -0
- package/dist/modules/dock/surface/machine.d.ts +75 -0
- package/dist/modules/dock/surface/machine.d.ts.map +1 -0
- package/dist/modules/dock/surface/stack.d.ts +38 -0
- package/dist/modules/dock/surface/stack.d.ts.map +1 -0
- package/dist/modules/dock/surface/view-model.d.ts +3 -0
- package/dist/modules/dock/surface/view-model.d.ts.map +1 -0
- package/dist/modules/dock/types.d.ts +1158 -0
- package/dist/modules/dock/types.d.ts.map +1 -0
- package/dist/modules/dock/utils.d.ts +93 -0
- package/dist/modules/dock/utils.d.ts.map +1 -0
- package/dist/modules/index.d.ts +12 -0
- package/dist/modules/index.d.ts.map +1 -0
- package/dist/modules/index.js +18020 -0
- package/dist/modules/index.js.map +1 -0
- package/dist/modules/loading/constants.d.ts +5 -0
- package/dist/modules/loading/constants.d.ts.map +1 -0
- package/dist/modules/loading/context.d.ts +13 -0
- package/dist/modules/loading/context.d.ts.map +1 -0
- package/dist/modules/loading/hooks.d.ts +6 -0
- package/dist/modules/loading/hooks.d.ts.map +1 -0
- package/dist/modules/loading/index.d.ts +7 -0
- package/dist/modules/loading/index.d.ts.map +1 -0
- package/dist/modules/loading/index.js +1256 -0
- package/dist/modules/loading/index.js.map +1 -0
- package/dist/modules/loading/module.d.ts +14 -0
- package/dist/modules/loading/module.d.ts.map +1 -0
- package/dist/modules/loading/overlay.d.ts +2 -0
- package/dist/modules/loading/overlay.d.ts.map +1 -0
- package/dist/modules/loading/types.d.ts +47 -0
- package/dist/modules/loading/types.d.ts.map +1 -0
- package/dist/modules/loading/utils.d.ts +4 -0
- package/dist/modules/loading/utils.d.ts.map +1 -0
- package/dist/modules/media/constants.d.ts +7 -0
- package/dist/modules/media/constants.d.ts.map +1 -0
- package/dist/modules/media/context.d.ts +6 -0
- package/dist/modules/media/context.d.ts.map +1 -0
- package/dist/modules/media/hooks.d.ts +3 -0
- package/dist/modules/media/hooks.d.ts.map +1 -0
- package/dist/modules/media/index.d.ts +8 -0
- package/dist/modules/media/index.d.ts.map +1 -0
- package/dist/modules/media/index.js +728 -0
- package/dist/modules/media/index.js.map +1 -0
- package/dist/modules/media/module.d.ts +11 -0
- package/dist/modules/media/module.d.ts.map +1 -0
- package/dist/modules/media/overlay.d.ts +9 -0
- package/dist/modules/media/overlay.d.ts.map +1 -0
- package/dist/modules/media/types.d.ts +77 -0
- package/dist/modules/media/types.d.ts.map +1 -0
- package/dist/modules/media/utils.d.ts +17 -0
- package/dist/modules/media/utils.d.ts.map +1 -0
- package/dist/modules/modal/constants.d.ts +20 -0
- package/dist/modules/modal/constants.d.ts.map +1 -0
- package/dist/modules/modal/context.d.ts +20 -0
- package/dist/modules/modal/context.d.ts.map +1 -0
- package/dist/modules/modal/hooks.d.ts +41 -0
- package/dist/modules/modal/hooks.d.ts.map +1 -0
- package/dist/modules/modal/index.d.ts +7 -0
- package/dist/modules/modal/index.d.ts.map +1 -0
- package/dist/modules/modal/index.js +2672 -0
- package/dist/modules/modal/index.js.map +1 -0
- package/dist/modules/modal/module.d.ts +12 -0
- package/dist/modules/modal/module.d.ts.map +1 -0
- package/dist/modules/modal/motion.d.ts +16 -0
- package/dist/modules/modal/motion.d.ts.map +1 -0
- package/dist/modules/modal/overlay.d.ts +4 -0
- package/dist/modules/modal/overlay.d.ts.map +1 -0
- package/dist/modules/modal/state.d.ts +4 -0
- package/dist/modules/modal/state.d.ts.map +1 -0
- package/dist/modules/modal/types.d.ts +109 -0
- package/dist/modules/modal/types.d.ts.map +1 -0
- package/dist/modules/modal/utils.d.ts +31 -0
- package/dist/modules/modal/utils.d.ts.map +1 -0
- package/dist/modules/notification/constants.d.ts +9 -0
- package/dist/modules/notification/constants.d.ts.map +1 -0
- package/dist/modules/notification/context.d.ts +7 -0
- package/dist/modules/notification/context.d.ts.map +1 -0
- package/dist/modules/notification/hooks.d.ts +10 -0
- package/dist/modules/notification/hooks.d.ts.map +1 -0
- package/dist/modules/notification/index.d.ts +7 -0
- package/dist/modules/notification/index.d.ts.map +1 -0
- package/dist/modules/notification/index.js +905 -0
- package/dist/modules/notification/index.js.map +1 -0
- package/dist/modules/notification/module.d.ts +11 -0
- package/dist/modules/notification/module.d.ts.map +1 -0
- package/dist/modules/notification/motion.d.ts +15 -0
- package/dist/modules/notification/motion.d.ts.map +1 -0
- package/dist/modules/notification/overlay.d.ts +3 -0
- package/dist/modules/notification/overlay.d.ts.map +1 -0
- package/dist/modules/notification/types.d.ts +57 -0
- package/dist/modules/notification/types.d.ts.map +1 -0
- package/dist/modules/notification/utils.d.ts +9 -0
- package/dist/modules/notification/utils.d.ts.map +1 -0
- package/dist/modules/theme.d.ts +3 -0
- package/dist/modules/theme.d.ts.map +1 -0
- package/dist/provider.d.ts +23 -0
- package/dist/provider.d.ts.map +1 -0
- package/dist/provider.js +1973 -0
- package/dist/provider.js.map +1 -0
- package/dist/result.d.ts +50 -0
- package/dist/result.d.ts.map +1 -0
- package/dist/result.js +163 -0
- package/dist/result.js.map +1 -0
- package/dist/theme.d.ts +25 -0
- package/dist/theme.d.ts.map +1 -0
- package/dist/theme.js +44 -0
- package/dist/theme.js.map +1 -0
- package/dist/tokens/index.d.ts +3 -0
- package/dist/tokens/index.d.ts.map +1 -0
- package/dist/tokens/index.js +325 -0
- package/dist/tokens/index.js.map +1 -0
- package/dist/tokens/motion.d.ts +315 -0
- package/dist/tokens/motion.d.ts.map +1 -0
- package/dist/tokens/tokens.d.ts +34 -0
- package/dist/tokens/tokens.d.ts.map +1 -0
- package/dist/utils/cn.d.ts +3 -0
- package/dist/utils/cn.d.ts.map +1 -0
- package/dist/utils/dom.d.ts +5 -0
- package/dist/utils/dom.d.ts.map +1 -0
- package/dist/utils/index.d.ts +16 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +485 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/json.d.ts +3 -0
- package/dist/utils/json.d.ts.map +1 -0
- package/dist/utils/number.d.ts +4 -0
- package/dist/utils/number.d.ts.map +1 -0
- package/dist/utils/object.d.ts +7 -0
- package/dist/utils/object.d.ts.map +1 -0
- package/dist/utils/report.d.ts +5 -0
- package/dist/utils/report.d.ts.map +1 -0
- package/dist/utils/scheduler.d.ts +34 -0
- package/dist/utils/scheduler.d.ts.map +1 -0
- package/dist/utils/store.d.ts +11 -0
- package/dist/utils/store.d.ts.map +1 -0
- package/dist/utils/string.d.ts +8 -0
- package/dist/utils/string.d.ts.map +1 -0
- package/dist/utils/timing.d.ts +8 -0
- package/dist/utils/timing.d.ts.map +1 -0
- package/dist/utils/user-message.d.ts +20 -0
- package/dist/utils/user-message.d.ts.map +1 -0
- package/package.json +113 -0
|
@@ -0,0 +1,485 @@
|
|
|
1
|
+
import { clsx } from 'clsx';
|
|
2
|
+
import { twMerge } from 'tailwind-merge';
|
|
3
|
+
|
|
4
|
+
// src/utils/cn.ts
|
|
5
|
+
function cn(...inputs) {
|
|
6
|
+
return twMerge(clsx(inputs));
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
// src/utils/string.ts
|
|
10
|
+
function trimToNull(value) {
|
|
11
|
+
if (value === null || value === void 0) return null;
|
|
12
|
+
const trimmed = String(value).trim();
|
|
13
|
+
return trimmed.length > 0 ? trimmed : null;
|
|
14
|
+
}
|
|
15
|
+
function stripTrailingSlash(url) {
|
|
16
|
+
if (typeof url !== "string") return "";
|
|
17
|
+
return url.replace(/\/+$/, "");
|
|
18
|
+
}
|
|
19
|
+
function normalizePath(path) {
|
|
20
|
+
const trimmed = trimToNull(path);
|
|
21
|
+
if (!trimmed) return "";
|
|
22
|
+
if (trimmed === "/") return "/";
|
|
23
|
+
return stripTrailingSlash(trimmed);
|
|
24
|
+
}
|
|
25
|
+
function isImageIconSource(icon) {
|
|
26
|
+
return typeof icon === "string" && (icon.startsWith("http://") || icon.startsWith("https://") || icon.startsWith("/") || icon.startsWith("data:image/"));
|
|
27
|
+
}
|
|
28
|
+
function truncate(text, maxLength = 100, suffix = "...") {
|
|
29
|
+
if (typeof text !== "string") return "";
|
|
30
|
+
if (text.length <= maxLength) return text;
|
|
31
|
+
return `${text.slice(0, maxLength).trimEnd()}${suffix}`;
|
|
32
|
+
}
|
|
33
|
+
function capitalize(str) {
|
|
34
|
+
if (typeof str !== "string" || !str) return "";
|
|
35
|
+
return str.charAt(0).toUpperCase() + str.slice(1);
|
|
36
|
+
}
|
|
37
|
+
function slugify(str) {
|
|
38
|
+
if (typeof str !== "string" || !str) return "";
|
|
39
|
+
return str.toLowerCase().trim().replace(/[^\w\s-]/g, "").replace(/[\s_-]+/g, "-").replace(/^-+|-+$/g, "");
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// src/utils/dom.ts
|
|
43
|
+
var isBrowser = typeof window !== "undefined";
|
|
44
|
+
var globalScrollLockCount = 0;
|
|
45
|
+
var globalScrollLockStyles = null;
|
|
46
|
+
function acquireGlobalScrollLock() {
|
|
47
|
+
if (typeof document === "undefined") return () => {
|
|
48
|
+
};
|
|
49
|
+
if (globalScrollLockCount === 0) {
|
|
50
|
+
globalScrollLockStyles = {
|
|
51
|
+
bodyOverflow: document.body.style.overflow,
|
|
52
|
+
bodyOverscrollBehavior: document.body.style.overscrollBehavior,
|
|
53
|
+
htmlOverflow: document.documentElement.style.overflow,
|
|
54
|
+
htmlOverscrollBehavior: document.documentElement.style.overscrollBehavior
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
globalScrollLockCount += 1;
|
|
58
|
+
document.body.style.overflow = "hidden";
|
|
59
|
+
document.body.style.overscrollBehavior = "none";
|
|
60
|
+
document.documentElement.style.overflow = "hidden";
|
|
61
|
+
document.documentElement.style.overscrollBehavior = "none";
|
|
62
|
+
let released = false;
|
|
63
|
+
return () => {
|
|
64
|
+
if (released) return;
|
|
65
|
+
released = true;
|
|
66
|
+
globalScrollLockCount = Math.max(0, globalScrollLockCount - 1);
|
|
67
|
+
if (globalScrollLockCount > 0 || !globalScrollLockStyles) return;
|
|
68
|
+
document.body.style.overflow = globalScrollLockStyles.bodyOverflow;
|
|
69
|
+
document.body.style.overscrollBehavior = globalScrollLockStyles.bodyOverscrollBehavior;
|
|
70
|
+
document.documentElement.style.overflow = globalScrollLockStyles.htmlOverflow;
|
|
71
|
+
document.documentElement.style.overscrollBehavior = globalScrollLockStyles.htmlOverscrollBehavior;
|
|
72
|
+
globalScrollLockStyles = null;
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
function getSiteUrl() {
|
|
76
|
+
return stripTrailingSlash(
|
|
77
|
+
process.env.NEXT_PUBLIC_SITE_URL || "http://localhost:3000"
|
|
78
|
+
);
|
|
79
|
+
}
|
|
80
|
+
function getCurrentPath() {
|
|
81
|
+
if (!isBrowser) return "/";
|
|
82
|
+
return `${window.location.pathname}${window.location.search}`;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
// src/utils/number.ts
|
|
86
|
+
function clamp(value, min, max) {
|
|
87
|
+
const num = Number(value);
|
|
88
|
+
const finite = Number.isFinite(num) ? num : min;
|
|
89
|
+
return Math.min(Math.max(finite, min), max);
|
|
90
|
+
}
|
|
91
|
+
function toFiniteNumber(value, fallback = 0) {
|
|
92
|
+
const parsed = Number(value);
|
|
93
|
+
return Number.isFinite(parsed) ? parsed : fallback;
|
|
94
|
+
}
|
|
95
|
+
function randomBetween(min, max) {
|
|
96
|
+
const lower = Math.ceil(min);
|
|
97
|
+
const upper = Math.floor(max);
|
|
98
|
+
return Math.floor(Math.random() * (upper - lower + 1)) + lower;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
// src/utils/object.ts
|
|
102
|
+
function isObject(value) {
|
|
103
|
+
return Boolean(value) && typeof value === "object" && !Array.isArray(value);
|
|
104
|
+
}
|
|
105
|
+
function isPlainObject(value) {
|
|
106
|
+
if (!isObject(value)) return false;
|
|
107
|
+
const proto = Object.getPrototypeOf(value);
|
|
108
|
+
return proto === Object.prototype || proto === null;
|
|
109
|
+
}
|
|
110
|
+
function isEmpty(value) {
|
|
111
|
+
if (value === null || value === void 0) return true;
|
|
112
|
+
if (typeof value === "string" || Array.isArray(value))
|
|
113
|
+
return value.length === 0;
|
|
114
|
+
if (isObject(value)) return Object.keys(value).length === 0;
|
|
115
|
+
return false;
|
|
116
|
+
}
|
|
117
|
+
function shallowEqual(a, b) {
|
|
118
|
+
if (Object.is(a, b)) return true;
|
|
119
|
+
if (typeof a !== "object" || a === null || typeof b !== "object" || b === null) {
|
|
120
|
+
return false;
|
|
121
|
+
}
|
|
122
|
+
const keysA = Object.keys(a);
|
|
123
|
+
const keysB = Object.keys(b);
|
|
124
|
+
if (keysA.length !== keysB.length) return false;
|
|
125
|
+
for (const key of keysA) {
|
|
126
|
+
if (!Object.prototype.hasOwnProperty.call(b, key) || !Object.is(
|
|
127
|
+
a[key],
|
|
128
|
+
b[key]
|
|
129
|
+
)) {
|
|
130
|
+
return false;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
return true;
|
|
134
|
+
}
|
|
135
|
+
function toArray(value) {
|
|
136
|
+
if (value === null || value === void 0) return [];
|
|
137
|
+
return Array.isArray(value) ? value : [value];
|
|
138
|
+
}
|
|
139
|
+
function dedupe(array, keyFn = null) {
|
|
140
|
+
if (!Array.isArray(array)) return [];
|
|
141
|
+
if (!keyFn) return [...new Set(array)];
|
|
142
|
+
const seen = /* @__PURE__ */ new Set();
|
|
143
|
+
return array.filter((item) => {
|
|
144
|
+
const key = keyFn(item);
|
|
145
|
+
if (seen.has(key)) return false;
|
|
146
|
+
seen.add(key);
|
|
147
|
+
return true;
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
// src/utils/timing.ts
|
|
152
|
+
function sleep(ms = 0) {
|
|
153
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
154
|
+
}
|
|
155
|
+
function debounce(func, wait = 300) {
|
|
156
|
+
let timeoutId = null;
|
|
157
|
+
function debounced(...args) {
|
|
158
|
+
if (timeoutId !== null) clearTimeout(timeoutId);
|
|
159
|
+
timeoutId = setTimeout(() => {
|
|
160
|
+
timeoutId = null;
|
|
161
|
+
func(...args);
|
|
162
|
+
}, wait);
|
|
163
|
+
}
|
|
164
|
+
debounced.cancel = () => {
|
|
165
|
+
if (timeoutId !== null) {
|
|
166
|
+
clearTimeout(timeoutId);
|
|
167
|
+
timeoutId = null;
|
|
168
|
+
}
|
|
169
|
+
};
|
|
170
|
+
return debounced;
|
|
171
|
+
}
|
|
172
|
+
function throttle(func, limit = 300) {
|
|
173
|
+
let lastRan = 0;
|
|
174
|
+
let timerId = null;
|
|
175
|
+
const throttled = function(...args) {
|
|
176
|
+
const now = Date.now();
|
|
177
|
+
if (now - lastRan >= limit) {
|
|
178
|
+
lastRan = now;
|
|
179
|
+
func(...args);
|
|
180
|
+
} else if (timerId === null) {
|
|
181
|
+
timerId = setTimeout(
|
|
182
|
+
() => {
|
|
183
|
+
lastRan = Date.now();
|
|
184
|
+
timerId = null;
|
|
185
|
+
func(...args);
|
|
186
|
+
},
|
|
187
|
+
limit - (now - lastRan)
|
|
188
|
+
);
|
|
189
|
+
}
|
|
190
|
+
};
|
|
191
|
+
throttled.cancel = () => {
|
|
192
|
+
if (timerId === null) return;
|
|
193
|
+
clearTimeout(timerId);
|
|
194
|
+
timerId = null;
|
|
195
|
+
};
|
|
196
|
+
return throttled;
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
// src/utils/json.ts
|
|
200
|
+
function safeJsonParse(text, fallback = null) {
|
|
201
|
+
if (typeof text !== "string") return fallback;
|
|
202
|
+
try {
|
|
203
|
+
return JSON.parse(text);
|
|
204
|
+
} catch {
|
|
205
|
+
return fallback;
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
function safeJsonStringify(value, fallback = "") {
|
|
209
|
+
try {
|
|
210
|
+
return JSON.stringify(value) ?? fallback;
|
|
211
|
+
} catch {
|
|
212
|
+
return fallback;
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
// src/utils/report.ts
|
|
217
|
+
var sink = null;
|
|
218
|
+
function report(scope, error, level = "error") {
|
|
219
|
+
if (sink) {
|
|
220
|
+
try {
|
|
221
|
+
sink(scope, error, level);
|
|
222
|
+
return;
|
|
223
|
+
} catch {
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
if (process.env.NODE_ENV === "production" && typeof window !== "undefined") {
|
|
227
|
+
return;
|
|
228
|
+
}
|
|
229
|
+
console[level](`[${scope}]`, error);
|
|
230
|
+
}
|
|
231
|
+
function setReportSink(next) {
|
|
232
|
+
sink = next;
|
|
233
|
+
return () => {
|
|
234
|
+
if (sink === next) sink = null;
|
|
235
|
+
};
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
// src/utils/user-message.ts
|
|
239
|
+
var USER_MESSAGES = Object.freeze({
|
|
240
|
+
generic: "Something went wrong. Please try again",
|
|
241
|
+
network: "You appear to be offline. Check your connection and try again",
|
|
242
|
+
timeout: "That took too long. Please try again",
|
|
243
|
+
unauthorized: "Your session has expired. Please sign in again",
|
|
244
|
+
forbidden: "You don't have permission to do that",
|
|
245
|
+
notFound: "We couldn't find what you were looking for",
|
|
246
|
+
rateLimited: "Too many attempts. Please wait a moment and try again",
|
|
247
|
+
server: "We're having trouble on our end. Please try again in a moment"
|
|
248
|
+
});
|
|
249
|
+
var UserError = class extends Error {
|
|
250
|
+
status;
|
|
251
|
+
constructor(message, status) {
|
|
252
|
+
super(message);
|
|
253
|
+
this.name = "UserError";
|
|
254
|
+
this.status = status;
|
|
255
|
+
}
|
|
256
|
+
};
|
|
257
|
+
var NETWORK_FAILURE = /failed to fetch|network|load failed|fetch failed/i;
|
|
258
|
+
function readField(source, field, type) {
|
|
259
|
+
const value = source?.[field];
|
|
260
|
+
return typeof value === type ? value : void 0;
|
|
261
|
+
}
|
|
262
|
+
function readPayloadMessage(error) {
|
|
263
|
+
const payload = error?.payload;
|
|
264
|
+
const message = readField(payload, "error", "string")?.trim();
|
|
265
|
+
return message || void 0;
|
|
266
|
+
}
|
|
267
|
+
function toUserMessage(error, { codes, fallback = USER_MESSAGES.generic } = {}) {
|
|
268
|
+
if (typeof error === "string") return error.trim() || fallback;
|
|
269
|
+
if (!error || typeof error !== "object") return fallback;
|
|
270
|
+
if (error instanceof UserError) {
|
|
271
|
+
if (error.status === 401) return USER_MESSAGES.unauthorized;
|
|
272
|
+
return error.message || fallback;
|
|
273
|
+
}
|
|
274
|
+
if (error.name === "AbortError") return fallback;
|
|
275
|
+
const code = readField(error, "code", "string");
|
|
276
|
+
if (code && codes?.[code]) return codes[code];
|
|
277
|
+
const status = readField(error, "status", "number");
|
|
278
|
+
if (status === 401) return USER_MESSAGES.unauthorized;
|
|
279
|
+
if (status === 429) return USER_MESSAGES.rateLimited;
|
|
280
|
+
if (status === 408 || status === 504) return USER_MESSAGES.timeout;
|
|
281
|
+
if (status !== void 0 && status >= 500) return USER_MESSAGES.server;
|
|
282
|
+
if (status !== void 0 && status >= 400) {
|
|
283
|
+
const authored = readPayloadMessage(error);
|
|
284
|
+
if (authored) return authored;
|
|
285
|
+
if (status === 403) return USER_MESSAGES.forbidden;
|
|
286
|
+
if (status === 404) return USER_MESSAGES.notFound;
|
|
287
|
+
return fallback;
|
|
288
|
+
}
|
|
289
|
+
const isOffline = typeof navigator !== "undefined" && navigator.onLine === false;
|
|
290
|
+
if (isOffline || NETWORK_FAILURE.test(error.message ?? "") && (error instanceof TypeError || /fetch/i.test(error.name))) {
|
|
291
|
+
return USER_MESSAGES.network;
|
|
292
|
+
}
|
|
293
|
+
return fallback;
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
// src/utils/store.ts
|
|
297
|
+
function freezeStoreSnapshot(state) {
|
|
298
|
+
if (process.env.NODE_ENV === "production" || !state || typeof state !== "object") {
|
|
299
|
+
return state;
|
|
300
|
+
}
|
|
301
|
+
const seen = /* @__PURE__ */ new WeakSet();
|
|
302
|
+
const freeze = (value) => {
|
|
303
|
+
if (seen.has(value) || Object.isFrozen(value)) return;
|
|
304
|
+
seen.add(value);
|
|
305
|
+
const prototype = Object.getPrototypeOf(value);
|
|
306
|
+
if (Array.isArray(value) || prototype === Object.prototype || prototype === null) {
|
|
307
|
+
for (const key of Reflect.ownKeys(value)) {
|
|
308
|
+
const descriptor = Object.getOwnPropertyDescriptor(value, key);
|
|
309
|
+
if (descriptor && "value" in descriptor && descriptor.value !== null) {
|
|
310
|
+
if (typeof descriptor.value === "object") freeze(descriptor.value);
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
Object.freeze(value);
|
|
315
|
+
};
|
|
316
|
+
freeze(state);
|
|
317
|
+
return state;
|
|
318
|
+
}
|
|
319
|
+
function createStore(initialState, { freezeSnapshots = true } = {}) {
|
|
320
|
+
const listeners = /* @__PURE__ */ new Set();
|
|
321
|
+
const prepare = freezeSnapshots ? freezeStoreSnapshot : (state) => state;
|
|
322
|
+
let snapshot = prepare(initialState);
|
|
323
|
+
const publish = (nextStateOrUpdater) => {
|
|
324
|
+
const nextState = typeof nextStateOrUpdater === "function" ? nextStateOrUpdater(snapshot) : nextStateOrUpdater;
|
|
325
|
+
if (Object.is(snapshot, nextState)) return false;
|
|
326
|
+
snapshot = prepare(nextState);
|
|
327
|
+
for (const listener of listeners) {
|
|
328
|
+
try {
|
|
329
|
+
listener();
|
|
330
|
+
} catch (error) {
|
|
331
|
+
report("CoreStore subscriber", error, "warn");
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
return true;
|
|
335
|
+
};
|
|
336
|
+
const setState = (updater) => {
|
|
337
|
+
if (typeof updater === "function") {
|
|
338
|
+
return publish(updater);
|
|
339
|
+
}
|
|
340
|
+
if (snapshot && typeof snapshot === "object" && updater && typeof updater === "object") {
|
|
341
|
+
return publish({ ...snapshot, ...updater });
|
|
342
|
+
}
|
|
343
|
+
return publish(updater);
|
|
344
|
+
};
|
|
345
|
+
return Object.freeze({
|
|
346
|
+
getSnapshot() {
|
|
347
|
+
return snapshot;
|
|
348
|
+
},
|
|
349
|
+
publish,
|
|
350
|
+
setState,
|
|
351
|
+
subscribe(listener) {
|
|
352
|
+
if (typeof listener !== "function") return () => {
|
|
353
|
+
};
|
|
354
|
+
listeners.add(listener);
|
|
355
|
+
return () => listeners.delete(listener);
|
|
356
|
+
}
|
|
357
|
+
});
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
// src/utils/scheduler.ts
|
|
361
|
+
var DEFAULT_SCHEDULER_FRAME_MS = 16;
|
|
362
|
+
var EMPTY_SCHEDULER_TASKS = Object.freeze(
|
|
363
|
+
[]
|
|
364
|
+
);
|
|
365
|
+
function getDefaultSchedulerNow() {
|
|
366
|
+
return typeof performance !== "undefined" && typeof performance.now === "function" ? performance.now() : Date.now();
|
|
367
|
+
}
|
|
368
|
+
function createScheduler({
|
|
369
|
+
cancelFrame = typeof window !== "undefined" && typeof window.cancelAnimationFrame === "function" ? (id) => window.cancelAnimationFrame(id) : (id) => clearTimeout(id),
|
|
370
|
+
clearTimer = (id) => clearTimeout(id),
|
|
371
|
+
defaultLabel = "scheduled-task",
|
|
372
|
+
now = getDefaultSchedulerNow,
|
|
373
|
+
requestFrame = typeof window !== "undefined" && typeof window.requestAnimationFrame === "function" ? (cb) => window.requestAnimationFrame(cb) : (cb) => setTimeout(cb, DEFAULT_SCHEDULER_FRAME_MS),
|
|
374
|
+
scheduleTimer = (cb, delayMs) => setTimeout(cb, delayMs)
|
|
375
|
+
} = {}) {
|
|
376
|
+
const listeners = /* @__PURE__ */ new Set();
|
|
377
|
+
const tasks = /* @__PURE__ */ new Map();
|
|
378
|
+
let nextTaskId = 0;
|
|
379
|
+
let snapshot = {
|
|
380
|
+
pendingCount: 0,
|
|
381
|
+
tasks: EMPTY_SCHEDULER_TASKS
|
|
382
|
+
};
|
|
383
|
+
const publish = () => {
|
|
384
|
+
const currentTasks = [];
|
|
385
|
+
for (const task of tasks.values()) {
|
|
386
|
+
currentTasks.push({
|
|
387
|
+
createdAt: task.createdAt,
|
|
388
|
+
dueAt: task.dueAt,
|
|
389
|
+
id: task.id,
|
|
390
|
+
kind: task.kind,
|
|
391
|
+
label: task.label
|
|
392
|
+
});
|
|
393
|
+
}
|
|
394
|
+
snapshot = {
|
|
395
|
+
pendingCount: tasks.size,
|
|
396
|
+
tasks: currentTasks
|
|
397
|
+
};
|
|
398
|
+
for (const listener of listeners) {
|
|
399
|
+
try {
|
|
400
|
+
listener();
|
|
401
|
+
} catch (error) {
|
|
402
|
+
report("Scheduler subscriber", error, "warn");
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
};
|
|
406
|
+
const scheduleInternal = (kind, callback, delayMs, options = {}) => {
|
|
407
|
+
if (typeof callback !== "function") return null;
|
|
408
|
+
const safeDelay = Math.max(0, Number(delayMs) || 0);
|
|
409
|
+
const taskId = ++nextTaskId;
|
|
410
|
+
const createdAt = now();
|
|
411
|
+
const invoke = (timestamp = now()) => {
|
|
412
|
+
if (!tasks.has(taskId)) return;
|
|
413
|
+
tasks.delete(taskId);
|
|
414
|
+
publish();
|
|
415
|
+
callback(timestamp);
|
|
416
|
+
};
|
|
417
|
+
const nativeId = kind === "frame" ? requestFrame(invoke) : scheduleTimer(invoke, safeDelay);
|
|
418
|
+
tasks.set(taskId, {
|
|
419
|
+
cancel: kind === "frame" ? cancelFrame : clearTimer,
|
|
420
|
+
createdAt,
|
|
421
|
+
dueAt: createdAt + (kind === "frame" ? DEFAULT_SCHEDULER_FRAME_MS : safeDelay),
|
|
422
|
+
id: taskId,
|
|
423
|
+
kind,
|
|
424
|
+
label: typeof options.label === "string" && options.label ? options.label : defaultLabel,
|
|
425
|
+
nativeId
|
|
426
|
+
});
|
|
427
|
+
publish();
|
|
428
|
+
return taskId;
|
|
429
|
+
};
|
|
430
|
+
const cancel = (taskId) => {
|
|
431
|
+
const task = tasks.get(taskId);
|
|
432
|
+
if (!task) return false;
|
|
433
|
+
tasks.delete(taskId);
|
|
434
|
+
try {
|
|
435
|
+
task.cancel(task.nativeId);
|
|
436
|
+
} catch (error) {
|
|
437
|
+
report("Scheduler cancellation", error, "warn");
|
|
438
|
+
}
|
|
439
|
+
publish();
|
|
440
|
+
return true;
|
|
441
|
+
};
|
|
442
|
+
return Object.freeze({
|
|
443
|
+
cancel,
|
|
444
|
+
cancelAll() {
|
|
445
|
+
if (tasks.size === 0) return [];
|
|
446
|
+
const taskIds = [];
|
|
447
|
+
for (const [taskId, task] of tasks) {
|
|
448
|
+
taskIds.push(taskId);
|
|
449
|
+
try {
|
|
450
|
+
task.cancel(task.nativeId);
|
|
451
|
+
} catch (error) {
|
|
452
|
+
report("Scheduler cancellation", error, "warn");
|
|
453
|
+
}
|
|
454
|
+
}
|
|
455
|
+
tasks.clear();
|
|
456
|
+
publish();
|
|
457
|
+
return taskIds;
|
|
458
|
+
},
|
|
459
|
+
getSnapshot() {
|
|
460
|
+
return snapshot;
|
|
461
|
+
},
|
|
462
|
+
now,
|
|
463
|
+
schedule(callback, delayMs = 0, options = {}) {
|
|
464
|
+
return scheduleInternal("timer", callback, delayMs, options);
|
|
465
|
+
},
|
|
466
|
+
scheduleFrame(callback, options = {}) {
|
|
467
|
+
return scheduleInternal(
|
|
468
|
+
"frame",
|
|
469
|
+
callback,
|
|
470
|
+
DEFAULT_SCHEDULER_FRAME_MS,
|
|
471
|
+
options
|
|
472
|
+
);
|
|
473
|
+
},
|
|
474
|
+
subscribe(listener) {
|
|
475
|
+
if (typeof listener !== "function") return () => {
|
|
476
|
+
};
|
|
477
|
+
listeners.add(listener);
|
|
478
|
+
return () => listeners.delete(listener);
|
|
479
|
+
}
|
|
480
|
+
});
|
|
481
|
+
}
|
|
482
|
+
|
|
483
|
+
export { USER_MESSAGES, UserError, acquireGlobalScrollLock, capitalize, clamp, cn, createScheduler, createStore, debounce, dedupe, getCurrentPath, getSiteUrl, isBrowser, isEmpty, isImageIconSource, isObject, isPlainObject, normalizePath, randomBetween, report, safeJsonParse, safeJsonStringify, setReportSink, shallowEqual, sleep, slugify, stripTrailingSlash, throttle, toArray, toFiniteNumber, toUserMessage, trimToNull, truncate };
|
|
484
|
+
//# sourceMappingURL=index.js.map
|
|
485
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/utils/cn.ts","../../src/utils/string.ts","../../src/utils/dom.ts","../../src/utils/number.ts","../../src/utils/object.ts","../../src/utils/timing.ts","../../src/utils/json.ts","../../src/utils/report.ts","../../src/utils/user-message.ts","../../src/utils/store.ts","../../src/utils/scheduler.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]): string {\n return twMerge(clsx(inputs));\n}\n","export function trimToNull(value: unknown): string | null {\n if (value === null || value === undefined) return null;\n const trimmed = String(value).trim();\n return trimmed.length > 0 ? trimmed : null;\n}\n\nexport function stripTrailingSlash(url: unknown): string {\n if (typeof url !== \"string\") return \"\";\n return url.replace(/\\/+$/, \"\");\n}\n\nexport function normalizePath(path: unknown): string {\n const trimmed = trimToNull(path);\n if (!trimmed) return \"\";\n if (trimmed === \"/\") return \"/\";\n return stripTrailingSlash(trimmed);\n}\n\nexport function isImageIconSource(icon: unknown): boolean {\n return (\n typeof icon === \"string\" &&\n (icon.startsWith(\"http://\") ||\n icon.startsWith(\"https://\") ||\n icon.startsWith(\"/\") ||\n icon.startsWith(\"data:image/\"))\n );\n}\n\nexport function truncate(\n text: unknown,\n maxLength: number = 100,\n suffix: string = \"...\",\n): string {\n if (typeof text !== \"string\") return \"\";\n if (text.length <= maxLength) return text;\n return `${text.slice(0, maxLength).trimEnd()}${suffix}`;\n}\n\nexport function capitalize(str: unknown): string {\n if (typeof str !== \"string\" || !str) return \"\";\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\n\nexport function slugify(str: unknown): string {\n if (typeof str !== \"string\" || !str) return \"\";\n return str\n .toLowerCase()\n .trim()\n .replace(/[^\\w\\s-]/g, \"\")\n .replace(/[\\s_-]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\");\n}\n","import { stripTrailingSlash } from \"./string\";\n\nexport const isBrowser: boolean = typeof window !== \"undefined\";\n\nlet globalScrollLockCount = 0;\n\nlet globalScrollLockStyles: {\n bodyOverflow: string;\n bodyOverscrollBehavior: string;\n htmlOverflow: string;\n htmlOverscrollBehavior: string;\n} | null = null;\n\nexport function acquireGlobalScrollLock(): () => void {\n if (typeof document === \"undefined\") return () => {};\n\n if (globalScrollLockCount === 0) {\n globalScrollLockStyles = {\n bodyOverflow: document.body.style.overflow,\n bodyOverscrollBehavior: document.body.style.overscrollBehavior,\n htmlOverflow: document.documentElement.style.overflow,\n htmlOverscrollBehavior: document.documentElement.style.overscrollBehavior,\n };\n }\n\n globalScrollLockCount += 1;\n document.body.style.overflow = \"hidden\";\n document.body.style.overscrollBehavior = \"none\";\n document.documentElement.style.overflow = \"hidden\";\n document.documentElement.style.overscrollBehavior = \"none\";\n\n let released = false;\n return () => {\n if (released) return;\n released = true;\n globalScrollLockCount = Math.max(0, globalScrollLockCount - 1);\n if (globalScrollLockCount > 0 || !globalScrollLockStyles) return;\n\n document.body.style.overflow = globalScrollLockStyles.bodyOverflow;\n document.body.style.overscrollBehavior =\n globalScrollLockStyles.bodyOverscrollBehavior;\n document.documentElement.style.overflow =\n globalScrollLockStyles.htmlOverflow;\n document.documentElement.style.overscrollBehavior =\n globalScrollLockStyles.htmlOverscrollBehavior;\n globalScrollLockStyles = null;\n };\n}\n\nexport function getSiteUrl(): string {\n return stripTrailingSlash(\n process.env.NEXT_PUBLIC_SITE_URL || \"http://localhost:3000\",\n );\n}\n\nexport function getCurrentPath(): string {\n if (!isBrowser) return \"/\";\n return `${window.location.pathname}${window.location.search}`;\n}\n","export function clamp(value: unknown, min: number, max: number): number {\n const num = Number(value);\n const finite = Number.isFinite(num) ? num : min;\n return Math.min(Math.max(finite, min), max);\n}\n\nexport function toFiniteNumber(value: unknown, fallback: number = 0): number {\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : fallback;\n}\n\nexport function randomBetween(min: number, max: number): number {\n const lower = Math.ceil(min);\n const upper = Math.floor(max);\n return Math.floor(Math.random() * (upper - lower + 1)) + lower;\n}\n","export function isObject(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n\nexport function isPlainObject(\n value: unknown,\n): value is Record<string, unknown> {\n if (!isObject(value)) return false;\n const proto = Object.getPrototypeOf(value);\n return proto === Object.prototype || proto === null;\n}\n\nexport function isEmpty(value: unknown): boolean {\n if (value === null || value === undefined) return true;\n if (typeof value === \"string\" || Array.isArray(value))\n return value.length === 0;\n if (isObject(value)) return Object.keys(value).length === 0;\n return false;\n}\n\nexport function shallowEqual(a: unknown, b: unknown): boolean {\n if (Object.is(a, b)) return true;\n if (\n typeof a !== \"object\" ||\n a === null ||\n typeof b !== \"object\" ||\n b === null\n ) {\n return false;\n }\n\n const keysA = Object.keys(a as object);\n const keysB = Object.keys(b as object);\n\n if (keysA.length !== keysB.length) return false;\n\n for (const key of keysA) {\n if (\n !Object.prototype.hasOwnProperty.call(b, key) ||\n !Object.is(\n (a as Record<string, unknown>)[key],\n (b as Record<string, unknown>)[key],\n )\n ) {\n return false;\n }\n }\n\n return true;\n}\n\nexport function toArray<T>(value: T | T[] | null | undefined): T[] {\n if (value === null || value === undefined) return [];\n return Array.isArray(value) ? value : [value];\n}\n\nexport function dedupe<T>(\n array: T[],\n keyFn: ((item: T) => unknown) | null = null,\n): T[] {\n if (!Array.isArray(array)) return [];\n if (!keyFn) return [...new Set(array)];\n const seen = new Set();\n return array.filter((item) => {\n const key = keyFn(item);\n if (seen.has(key)) return false;\n seen.add(key);\n return true;\n });\n}\n","export function sleep(ms: number = 0): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport function debounce<T extends (...args: never[]) => void>(\n func: T,\n wait: number = 300,\n): ((...args: Parameters<T>) => void) & { cancel: () => void } {\n let timeoutId: ReturnType<typeof setTimeout> | null = null;\n function debounced(...args: Parameters<T>): void {\n if (timeoutId !== null) clearTimeout(timeoutId);\n timeoutId = setTimeout(() => {\n timeoutId = null;\n func(...args);\n }, wait);\n }\n debounced.cancel = () => {\n if (timeoutId !== null) {\n clearTimeout(timeoutId);\n timeoutId = null;\n }\n };\n return debounced;\n}\n\nexport function throttle<T extends (...args: never[]) => void>(\n func: T,\n limit: number = 300,\n): ((...args: Parameters<T>) => void) & { cancel: () => void } {\n let lastRan = 0;\n let timerId: ReturnType<typeof setTimeout> | null = null;\n const throttled: ((...args: Parameters<T>) => void) & {\n cancel: () => void;\n } = function (...args: Parameters<T>): void {\n const now = Date.now();\n if (now - lastRan >= limit) {\n lastRan = now;\n func(...args);\n } else if (timerId === null) {\n timerId = setTimeout(\n () => {\n lastRan = Date.now();\n timerId = null;\n func(...args);\n },\n limit - (now - lastRan),\n );\n }\n };\n throttled.cancel = () => {\n if (timerId === null) return;\n clearTimeout(timerId);\n timerId = null;\n };\n return throttled;\n}\n","export function safeJsonParse<T = unknown>(\n text: unknown,\n fallback: T | null = null,\n): T | null {\n if (typeof text !== \"string\") return fallback;\n try {\n return JSON.parse(text) as T;\n } catch {\n return fallback;\n }\n}\n\nexport function safeJsonStringify(\n value: unknown,\n fallback: string = \"\",\n): string {\n try {\n return JSON.stringify(value) ?? fallback;\n } catch {\n return fallback;\n }\n}\n","export type ReportLevel = \"error\" | \"warn\";\n\nexport type ReportSink = (\n scope: string,\n error: unknown,\n level: ReportLevel,\n) => void;\n\nlet sink: ReportSink | null = null;\n\nexport function report(\n scope: string,\n error: unknown,\n level: ReportLevel = \"error\",\n): void {\n if (sink) {\n try {\n sink(scope, error, level);\n return;\n } catch {}\n }\n\n if (process.env.NODE_ENV === \"production\" && typeof window !== \"undefined\") {\n return;\n }\n console[level](`[${scope}]`, error);\n}\n\nexport function setReportSink(next: ReportSink): () => void {\n sink = next;\n return () => {\n if (sink === next) sink = null;\n };\n}\n","export const USER_MESSAGES = Object.freeze({\n generic: \"Something went wrong. Please try again\",\n network: \"You appear to be offline. Check your connection and try again\",\n timeout: \"That took too long. Please try again\",\n unauthorized: \"Your session has expired. Please sign in again\",\n forbidden: \"You don't have permission to do that\",\n notFound: \"We couldn't find what you were looking for\",\n rateLimited: \"Too many attempts. Please wait a moment and try again\",\n server: \"We're having trouble on our end. Please try again in a moment\",\n} as const);\n\nexport class UserError extends Error {\n readonly status?: number;\n\n constructor(message: string, status?: number) {\n super(message);\n this.name = \"UserError\";\n this.status = status;\n }\n}\n\nexport interface UserMessageOptions {\n fallback?: string;\n codes?: Readonly<Record<string, string>>;\n}\n\nconst NETWORK_FAILURE = /failed to fetch|network|load failed|fetch failed/i;\n\nfunction readField<T>(\n source: unknown,\n field: string,\n type: \"string\" | \"number\",\n): T | undefined {\n const value = (source as Record<string, unknown> | null)?.[field];\n return typeof value === type ? (value as T) : undefined;\n}\n\nfunction readPayloadMessage(error: unknown): string | undefined {\n const payload = (error as { payload?: unknown } | null)?.payload;\n const message = readField<string>(payload, \"error\", \"string\")?.trim();\n return message || undefined;\n}\n\nexport function toUserMessage(\n error: unknown,\n { codes, fallback = USER_MESSAGES.generic }: UserMessageOptions = {},\n): string {\n if (typeof error === \"string\") return error.trim() || fallback;\n if (!error || typeof error !== \"object\") return fallback;\n\n if (error instanceof UserError) {\n if (error.status === 401) return USER_MESSAGES.unauthorized;\n return error.message || fallback;\n }\n if ((error as { name?: string }).name === \"AbortError\") return fallback;\n\n const code = readField<string>(error, \"code\", \"string\");\n if (code && codes?.[code]) return codes[code];\n\n const status = readField<number>(error, \"status\", \"number\");\n\n if (status === 401) return USER_MESSAGES.unauthorized;\n if (status === 429) return USER_MESSAGES.rateLimited;\n if (status === 408 || status === 504) return USER_MESSAGES.timeout;\n if (status !== undefined && status >= 500) return USER_MESSAGES.server;\n\n if (status !== undefined && status >= 400) {\n const authored = readPayloadMessage(error);\n if (authored) return authored;\n if (status === 403) return USER_MESSAGES.forbidden;\n if (status === 404) return USER_MESSAGES.notFound;\n return fallback;\n }\n\n const isOffline =\n typeof navigator !== \"undefined\" && navigator.onLine === false;\n if (\n isOffline ||\n (NETWORK_FAILURE.test((error as Error).message ?? \"\") &&\n (error instanceof TypeError || /fetch/i.test((error as Error).name)))\n ) {\n return USER_MESSAGES.network;\n }\n\n return fallback;\n}\n","import { report } from \"./report\";\nexport interface ExternalStore<TState = unknown> {\n readonly getSnapshot: () => TState;\n readonly publish: (\n nextState: TState | ((currentState: TState) => TState),\n ) => boolean;\n readonly setState: (\n updater: Partial<TState> | ((currentState: TState) => TState),\n ) => boolean;\n readonly subscribe: (listener: () => void) => () => void;\n}\n\nfunction freezeStoreSnapshot<TState>(state: TState): TState {\n if (\n process.env.NODE_ENV === \"production\" ||\n !state ||\n typeof state !== \"object\"\n ) {\n return state;\n }\n\n const seen = new WeakSet<object>();\n const freeze = (value: object): void => {\n if (seen.has(value) || Object.isFrozen(value)) return;\n seen.add(value);\n\n const prototype = Object.getPrototypeOf(value);\n if (\n Array.isArray(value) ||\n prototype === Object.prototype ||\n prototype === null\n ) {\n for (const key of Reflect.ownKeys(value)) {\n const descriptor = Object.getOwnPropertyDescriptor(value, key);\n if (descriptor && \"value\" in descriptor && descriptor.value !== null) {\n if (typeof descriptor.value === \"object\") freeze(descriptor.value);\n }\n }\n }\n\n Object.freeze(value);\n };\n\n freeze(state);\n return state;\n}\n\nexport interface CreateStoreOptions {\n freezeSnapshots?: boolean;\n}\n\nexport function createStore<TState = Record<string, unknown>>(\n initialState: TState,\n { freezeSnapshots = true }: CreateStoreOptions = {},\n): ExternalStore<TState> {\n const listeners = new Set<() => void>();\n const prepare = freezeSnapshots\n ? freezeStoreSnapshot\n : <T>(state: T): T => state;\n let snapshot = prepare(initialState);\n\n const publish = (\n nextStateOrUpdater: TState | ((currentState: TState) => TState),\n ): boolean => {\n const nextState =\n typeof nextStateOrUpdater === \"function\"\n ? (nextStateOrUpdater as (currentState: TState) => TState)(snapshot)\n : nextStateOrUpdater;\n if (Object.is(snapshot, nextState)) return false;\n snapshot = prepare(nextState);\n\n for (const listener of listeners) {\n try {\n listener();\n } catch (error) {\n report(\"CoreStore subscriber\", error, \"warn\");\n }\n }\n return true;\n };\n\n const setState = (\n updater: Partial<TState> | ((currentState: TState) => TState),\n ): boolean => {\n if (typeof updater === \"function\") {\n return publish(updater as (currentState: TState) => TState);\n }\n if (\n snapshot &&\n typeof snapshot === \"object\" &&\n updater &&\n typeof updater === \"object\"\n ) {\n return publish({ ...snapshot, ...updater });\n }\n return publish(updater as TState);\n };\n\n return Object.freeze({\n getSnapshot() {\n return snapshot;\n },\n publish,\n setState,\n subscribe(listener: () => void) {\n if (typeof listener !== \"function\") return () => {};\n listeners.add(listener);\n return () => listeners.delete(listener);\n },\n });\n}\n","import { report } from \"./report\";\nconst DEFAULT_SCHEDULER_FRAME_MS = 16;\n\nconst EMPTY_SCHEDULER_TASKS: readonly ScheduledTaskSnapshot[] = Object.freeze(\n [],\n);\n\nfunction getDefaultSchedulerNow(): number {\n return typeof performance !== \"undefined\" &&\n typeof performance.now === \"function\"\n ? performance.now()\n : Date.now();\n}\n\nexport interface ScheduledTaskSnapshot {\n readonly createdAt: number;\n readonly dueAt: number;\n readonly id: number;\n readonly kind: \"timer\" | \"frame\";\n readonly label: string;\n}\n\nexport interface SchedulerSnapshot {\n readonly pendingCount: number;\n readonly tasks: readonly ScheduledTaskSnapshot[];\n}\n\nexport type ScheduleHandle = ReturnType<typeof setTimeout> | number;\n\nexport interface CoreSchedulerOptions {\n cancelFrame?: (id: ScheduleHandle) => void;\n clearTimer?: (id: ScheduleHandle) => void;\n defaultLabel?: string;\n now?: () => number;\n requestFrame?: (cb: (time: number) => void) => ScheduleHandle;\n scheduleTimer?: (cb: () => void, delayMs?: number) => ScheduleHandle;\n}\n\nexport function createScheduler({\n cancelFrame = typeof window !== \"undefined\" &&\n typeof window.cancelAnimationFrame === \"function\"\n ? (id: ScheduleHandle) => window.cancelAnimationFrame(id as number)\n : (id: ScheduleHandle) => clearTimeout(id),\n clearTimer = (id: ScheduleHandle) => clearTimeout(id),\n defaultLabel = \"scheduled-task\",\n now = getDefaultSchedulerNow,\n requestFrame = typeof window !== \"undefined\" &&\n typeof window.requestAnimationFrame === \"function\"\n ? (cb: FrameRequestCallback) => window.requestAnimationFrame(cb)\n : (cb: FrameRequestCallback) =>\n setTimeout(cb, DEFAULT_SCHEDULER_FRAME_MS) as unknown as number,\n scheduleTimer = (cb: () => void, delayMs?: number) => setTimeout(cb, delayMs),\n}: CoreSchedulerOptions = {}) {\n const listeners = new Set<() => void>();\n const tasks = new Map<\n number,\n {\n cancel: (id: ScheduleHandle) => void;\n createdAt: number;\n dueAt: number;\n id: number;\n kind: \"timer\" | \"frame\";\n label: string;\n nativeId: ScheduleHandle;\n }\n >();\n let nextTaskId = 0;\n let snapshot: SchedulerSnapshot = {\n pendingCount: 0,\n tasks: EMPTY_SCHEDULER_TASKS,\n };\n\n const publish = () => {\n const currentTasks: ScheduledTaskSnapshot[] = [];\n for (const task of tasks.values()) {\n currentTasks.push({\n createdAt: task.createdAt,\n dueAt: task.dueAt,\n id: task.id,\n kind: task.kind,\n label: task.label,\n });\n }\n\n snapshot = {\n pendingCount: tasks.size,\n tasks: currentTasks,\n };\n\n for (const listener of listeners) {\n try {\n listener();\n } catch (error) {\n report(\"Scheduler subscriber\", error, \"warn\");\n }\n }\n };\n\n const scheduleInternal = (\n kind: \"timer\" | \"frame\",\n callback: (timestamp: number) => void,\n delayMs: number,\n options: { label?: string } = {},\n ): number | null => {\n if (typeof callback !== \"function\") return null;\n\n const safeDelay = Math.max(0, Number(delayMs) || 0);\n const taskId = ++nextTaskId;\n const createdAt = now();\n\n const invoke = (timestamp = now()) => {\n if (!tasks.has(taskId)) return;\n tasks.delete(taskId);\n publish();\n callback(timestamp);\n };\n\n const nativeId =\n kind === \"frame\"\n ? requestFrame(invoke)\n : scheduleTimer(invoke, safeDelay);\n\n tasks.set(taskId, {\n cancel: kind === \"frame\" ? cancelFrame : clearTimer,\n createdAt,\n dueAt:\n createdAt + (kind === \"frame\" ? DEFAULT_SCHEDULER_FRAME_MS : safeDelay),\n id: taskId,\n kind,\n label:\n typeof options.label === \"string\" && options.label\n ? options.label\n : defaultLabel,\n nativeId,\n });\n\n publish();\n return taskId;\n };\n\n const cancel = (taskId: number): boolean => {\n const task = tasks.get(taskId);\n if (!task) return false;\n\n tasks.delete(taskId);\n try {\n task.cancel(task.nativeId);\n } catch (error) {\n report(\"Scheduler cancellation\", error, \"warn\");\n }\n\n publish();\n return true;\n };\n\n return Object.freeze({\n cancel,\n cancelAll(): number[] {\n if (tasks.size === 0) return [];\n\n const taskIds: number[] = [];\n for (const [taskId, task] of tasks) {\n taskIds.push(taskId);\n try {\n task.cancel(task.nativeId);\n } catch (error) {\n report(\"Scheduler cancellation\", error, \"warn\");\n }\n }\n\n tasks.clear();\n publish();\n return taskIds;\n },\n getSnapshot(): SchedulerSnapshot {\n return snapshot;\n },\n now,\n schedule(\n callback: (timestamp: number) => void,\n delayMs = 0,\n options: { label?: string } = {},\n ): number | null {\n return scheduleInternal(\"timer\", callback, delayMs, options);\n },\n scheduleFrame(\n callback: (timestamp: number) => void,\n options: { label?: string } = {},\n ): number | null {\n return scheduleInternal(\n \"frame\",\n callback,\n DEFAULT_SCHEDULER_FRAME_MS,\n options,\n );\n },\n subscribe(listener: () => void): () => void {\n if (typeof listener !== \"function\") return () => {};\n listeners.add(listener);\n return () => listeners.delete(listener);\n },\n });\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json.d.ts","sourceRoot":"","sources":["../../src/utils/json.ts"],"names":[],"mappings":"AAAA,wBAAgB,aAAa,CAAC,CAAC,GAAG,OAAO,EACvC,IAAI,EAAE,OAAO,EACb,QAAQ,GAAE,CAAC,GAAG,IAAW,GACxB,CAAC,GAAG,IAAI,CAOV;AAED,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,OAAO,EACd,QAAQ,GAAE,MAAW,GACpB,MAAM,CAMR"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export declare function clamp(value: unknown, min: number, max: number): number;
|
|
2
|
+
export declare function toFiniteNumber(value: unknown, fallback?: number): number;
|
|
3
|
+
export declare function randomBetween(min: number, max: number): number;
|
|
4
|
+
//# sourceMappingURL=number.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"number.d.ts","sourceRoot":"","sources":["../../src/utils/number.ts"],"names":[],"mappings":"AAAA,wBAAgB,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAItE;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,GAAE,MAAU,GAAG,MAAM,CAG3E;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAI9D"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export declare function isObject(value: unknown): value is Record<string, unknown>;
|
|
2
|
+
export declare function isPlainObject(value: unknown): value is Record<string, unknown>;
|
|
3
|
+
export declare function isEmpty(value: unknown): boolean;
|
|
4
|
+
export declare function shallowEqual(a: unknown, b: unknown): boolean;
|
|
5
|
+
export declare function toArray<T>(value: T | T[] | null | undefined): T[];
|
|
6
|
+
export declare function dedupe<T>(array: T[], keyFn?: ((item: T) => unknown) | null): T[];
|
|
7
|
+
//# sourceMappingURL=object.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"object.d.ts","sourceRoot":"","sources":["../../src/utils/object.ts"],"names":[],"mappings":"AAAA,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAEzE;AAED,wBAAgB,aAAa,CAC3B,KAAK,EAAE,OAAO,GACb,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAIlC;AAED,wBAAgB,OAAO,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAM/C;AAED,wBAAgB,YAAY,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,GAAG,OAAO,CA6B5D;AAED,wBAAgB,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,IAAI,GAAG,SAAS,GAAG,CAAC,EAAE,CAGjE;AAED,wBAAgB,MAAM,CAAC,CAAC,EACtB,KAAK,EAAE,CAAC,EAAE,EACV,KAAK,GAAE,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,OAAO,CAAC,GAAG,IAAW,GAC1C,CAAC,EAAE,CAUL"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export type ReportLevel = "error" | "warn";
|
|
2
|
+
export type ReportSink = (scope: string, error: unknown, level: ReportLevel) => void;
|
|
3
|
+
export declare function report(scope: string, error: unknown, level?: ReportLevel): void;
|
|
4
|
+
export declare function setReportSink(next: ReportSink): () => void;
|
|
5
|
+
//# sourceMappingURL=report.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"report.d.ts","sourceRoot":"","sources":["../../src/utils/report.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,WAAW,GAAG,OAAO,GAAG,MAAM,CAAC;AAE3C,MAAM,MAAM,UAAU,GAAG,CACvB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,OAAO,EACd,KAAK,EAAE,WAAW,KACf,IAAI,CAAC;AAIV,wBAAgB,MAAM,CACpB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,OAAO,EACd,KAAK,GAAE,WAAqB,GAC3B,IAAI,CAYN;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,IAAI,CAK1D"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
export interface ScheduledTaskSnapshot {
|
|
2
|
+
readonly createdAt: number;
|
|
3
|
+
readonly dueAt: number;
|
|
4
|
+
readonly id: number;
|
|
5
|
+
readonly kind: "timer" | "frame";
|
|
6
|
+
readonly label: string;
|
|
7
|
+
}
|
|
8
|
+
export interface SchedulerSnapshot {
|
|
9
|
+
readonly pendingCount: number;
|
|
10
|
+
readonly tasks: readonly ScheduledTaskSnapshot[];
|
|
11
|
+
}
|
|
12
|
+
export type ScheduleHandle = ReturnType<typeof setTimeout> | number;
|
|
13
|
+
export interface CoreSchedulerOptions {
|
|
14
|
+
cancelFrame?: (id: ScheduleHandle) => void;
|
|
15
|
+
clearTimer?: (id: ScheduleHandle) => void;
|
|
16
|
+
defaultLabel?: string;
|
|
17
|
+
now?: () => number;
|
|
18
|
+
requestFrame?: (cb: (time: number) => void) => ScheduleHandle;
|
|
19
|
+
scheduleTimer?: (cb: () => void, delayMs?: number) => ScheduleHandle;
|
|
20
|
+
}
|
|
21
|
+
export declare function createScheduler({ cancelFrame, clearTimer, defaultLabel, now, requestFrame, scheduleTimer, }?: CoreSchedulerOptions): Readonly<{
|
|
22
|
+
cancel: (taskId: number) => boolean;
|
|
23
|
+
cancelAll(): number[];
|
|
24
|
+
getSnapshot(): SchedulerSnapshot;
|
|
25
|
+
now: () => number;
|
|
26
|
+
schedule(callback: (timestamp: number) => void, delayMs?: number, options?: {
|
|
27
|
+
label?: string;
|
|
28
|
+
}): number | null;
|
|
29
|
+
scheduleFrame(callback: (timestamp: number) => void, options?: {
|
|
30
|
+
label?: string;
|
|
31
|
+
}): number | null;
|
|
32
|
+
subscribe(listener: () => void): () => void;
|
|
33
|
+
}>;
|
|
34
|
+
//# sourceMappingURL=scheduler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scheduler.d.ts","sourceRoot":"","sources":["../../src/utils/scheduler.ts"],"names":[],"mappings":"AAcA,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC;IACjC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,KAAK,EAAE,SAAS,qBAAqB,EAAE,CAAC;CAClD;AAED,MAAM,MAAM,cAAc,GAAG,UAAU,CAAC,OAAO,UAAU,CAAC,GAAG,MAAM,CAAC;AAEpE,MAAM,WAAW,oBAAoB;IACnC,WAAW,CAAC,EAAE,CAAC,EAAE,EAAE,cAAc,KAAK,IAAI,CAAC;IAC3C,UAAU,CAAC,EAAE,CAAC,EAAE,EAAE,cAAc,KAAK,IAAI,CAAC;IAC1C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,KAAK,cAAc,CAAC;IAC9D,aAAa,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,IAAI,EAAE,OAAO,CAAC,EAAE,MAAM,KAAK,cAAc,CAAC;CACtE;AAED,wBAAgB,eAAe,CAAC,EAC9B,WAG4C,EAC5C,UAAqD,EACrD,YAA+B,EAC/B,GAA4B,EAC5B,YAIqE,EACrE,aAA6E,GAC9E,GAAE,oBAAyB;qBAwFF,MAAM,KAAG,OAAO;iBAiBzB,MAAM,EAAE;mBAiBN,iBAAiB;eA7ItB,MAAM;uBAkJJ,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,8BAE5B;QAAE,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GAC1B,MAAM,GAAG,IAAI;4BAIJ,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,YAC5B;QAAE,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GAC1B,MAAM,GAAG,IAAI;wBAQI,MAAM,IAAI,GAAG,MAAM,IAAI;GAM9C"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export interface ExternalStore<TState = unknown> {
|
|
2
|
+
readonly getSnapshot: () => TState;
|
|
3
|
+
readonly publish: (nextState: TState | ((currentState: TState) => TState)) => boolean;
|
|
4
|
+
readonly setState: (updater: Partial<TState> | ((currentState: TState) => TState)) => boolean;
|
|
5
|
+
readonly subscribe: (listener: () => void) => () => void;
|
|
6
|
+
}
|
|
7
|
+
export interface CreateStoreOptions {
|
|
8
|
+
freezeSnapshots?: boolean;
|
|
9
|
+
}
|
|
10
|
+
export declare function createStore<TState = Record<string, unknown>>(initialState: TState, { freezeSnapshots }?: CreateStoreOptions): ExternalStore<TState>;
|
|
11
|
+
//# sourceMappingURL=store.d.ts.map
|