rune-lab 0.4.0 → 0.4.1
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/.gitignore +12 -0
- package/README.md +3 -3
- package/deno.json +50 -0
- package/justfile +5 -0
- package/package.json +2 -79
- package/scripts/build_pkg.ts +51 -0
- package/scripts/ci.just +26 -0
- package/scripts/deploy.just +21 -0
- package/scripts/dev.just +4 -0
- package/scripts/inject.just +72 -0
- package/src/RuneProvider.svelte +105 -0
- package/src/i18n/message-resolver.test.ts +103 -0
- package/src/i18n/message-resolver.ts +89 -0
- package/src/i18n/project.inlang/settings.json +26 -0
- package/src/i18n/translations/ar.json +89 -0
- package/src/i18n/translations/de.json +89 -0
- package/src/i18n/translations/en.json +89 -0
- package/src/i18n/translations/es.json +89 -0
- package/src/i18n/translations/fr.json +89 -0
- package/src/i18n/translations/hi.json +89 -0
- package/src/i18n/translations/it.json +89 -0
- package/src/i18n/translations/ja.json +89 -0
- package/src/i18n/translations/ko.json +89 -0
- package/src/i18n/translations/pt.json +89 -0
- package/src/i18n/translations/ru.json +89 -0
- package/src/i18n/translations/vi.json +89 -0
- package/src/i18n/translations/zh.json +89 -0
- package/src/kernel/deno.json +5 -0
- package/src/kernel/src/actions/portal.ts +41 -0
- package/src/kernel/src/actions/shortcut-listener.ts +50 -0
- package/src/kernel/src/context/app.svelte.ts +98 -0
- package/src/kernel/src/context/context.ts +31 -0
- package/src/kernel/src/context/stores.svelte.ts +96 -0
- package/src/kernel/src/context/types.ts +110 -0
- package/src/kernel/src/context/useRuneLab.ts +38 -0
- package/src/kernel/src/mod.ts +13 -0
- package/src/kernel/src/persistence/createConfigStore.svelte.ts +120 -0
- package/src/kernel/src/persistence/drivers.test.ts +95 -0
- package/src/kernel/src/persistence/drivers.ts +77 -0
- package/src/kernel/src/persistence/provider.test.ts +58 -0
- package/{dist/state/persistence/provider.js → src/kernel/src/persistence/provider.ts} +29 -14
- package/src/kernel/src/persistence/types.ts +19 -0
- package/src/kernel/src/persistence/usePersistence.ts +9 -0
- package/src/kernel/src/registry/mod.ts +221 -0
- package/src/kernel/src/registry/registry.test.ts +162 -0
- package/src/kernel/src/tokens/props.ts +94 -0
- package/src/mod.ts +10 -0
- package/src/runes/layout/deno.json +5 -0
- package/src/runes/layout/src/APP_CONFIGURATIONS.ts +56 -0
- package/{dist/ui/features/config → src/runes/layout/src}/AppSettingSelector.svelte +1 -1
- package/{dist/ui/layout → src/runes/layout/src}/ConnectedNavigationPanel.svelte +1 -1
- package/{dist/ui/layout → src/runes/layout/src}/ConnectedWorkspaceStrip.svelte +1 -1
- package/src/runes/layout/src/Icon.svelte +7 -0
- package/{dist/ui/features/config → src/runes/layout/src}/LanguageSelector.svelte +7 -5
- package/{dist/ui/layout → src/runes/layout/src}/NavigationPanel.svelte +1 -4
- package/{dist/ui/features/config → src/runes/layout/src}/ResourceSelector.svelte +3 -5
- package/{dist/ui/features/config → src/runes/layout/src}/ThemeSelector.svelte +2 -2
- package/{dist/ui/layout → src/runes/layout/src}/WorkspaceLayout.svelte +6 -4
- package/{dist/ui/layout → src/runes/layout/src}/WorkspaceStrip.svelte +1 -1
- package/src/runes/layout/src/connection-factory.ts +95 -0
- package/src/runes/layout/src/language.svelte.ts +44 -0
- package/src/runes/layout/src/mod.ts +71 -0
- package/src/runes/layout/src/store.svelte.ts +142 -0
- package/src/runes/layout/src/theme.svelte.ts +73 -0
- package/src/runes/layout/src/types.ts +11 -0
- package/src/runes/palettes/deno.json +8 -0
- package/{dist/ui/features/command-palette → src/runes/palettes/src/commands}/CommandPalette.svelte +4 -4
- package/src/runes/palettes/src/commands/mod.ts +2 -0
- package/src/runes/palettes/src/commands/store.svelte.ts +80 -0
- package/src/runes/palettes/src/mod.ts +51 -0
- package/{dist/ui/components → src/runes/palettes/src/notifications}/Toaster.svelte +1 -2
- package/src/runes/palettes/src/notifications/bridge.ts +56 -0
- package/src/runes/palettes/src/notifications/mod.ts +4 -0
- package/src/runes/palettes/src/notifications/store.svelte.ts +58 -0
- package/{dist/ui/features → src/runes/palettes/src}/shortcuts/ShortcutPalette.svelte +4 -4
- package/src/runes/palettes/src/shortcuts/mod.ts +4 -0
- package/src/runes/palettes/src/shortcuts/store.svelte.ts +85 -0
- package/src/runes/palettes/src/shortcuts/types.ts +4 -0
- package/src/runes/palettes/src/shortcuts/useShortcuts.ts +85 -0
- package/src/runes/plugins/money/deno.json +8 -0
- package/{dist/ui/features/config → src/runes/plugins/money/src}/CurrencySelector.svelte +2 -2
- package/{dist/ui/components/money → src/runes/plugins/money/src}/MoneyDisplay.svelte +2 -2
- package/{dist/ui/components/money → src/runes/plugins/money/src}/MoneyInput.svelte +4 -8
- package/src/runes/plugins/money/src/currency.svelte.ts +95 -0
- package/src/runes/plugins/money/src/currency.test.ts +40 -0
- package/src/runes/plugins/money/src/exchange-rate.svelte.ts +176 -0
- package/src/runes/plugins/money/src/exchange-rate.test.ts +95 -0
- package/src/runes/plugins/money/src/mod.ts +79 -0
- package/src/runes/plugins/money/src/money-primitive.test.ts +217 -0
- package/src/runes/plugins/money/src/money-primitive.ts +220 -0
- package/src/runes/plugins/money/src/money.test.ts +183 -0
- package/src/runes/plugins/money/src/money.ts +382 -0
- package/src/runes/plugins/money/src/strategies.test.ts +143 -0
- package/{dist/core/exchange-rate/strategies.js → src/runes/plugins/money/src/strategies.ts} +45 -22
- package/src/runes/plugins/money/src/types.ts +27 -0
- package/src/runes/plugins/money/src/useMoney.ts +261 -0
- package/src/runes/plugins/money/src/useMoneyFilter.ts +132 -0
- package/tsconfig.json +41 -0
- package/vite.config.ts +44 -0
- package/dist/core/design-tokens/props.d.ts +0 -52
- package/dist/core/design-tokens/props.d.ts.map +0 -1
- package/dist/core/design-tokens/props.js +0 -34
- package/dist/core/exchange-rate/strategies.d.ts +0 -52
- package/dist/core/exchange-rate/strategies.d.ts.map +0 -1
- package/dist/core/index.d.ts +0 -9
- package/dist/core/index.d.ts.map +0 -1
- package/dist/core/index.js +0 -8
- package/dist/core/internal/message-resolver.d.ts +0 -42
- package/dist/core/internal/message-resolver.d.ts.map +0 -1
- package/dist/core/internal/message-resolver.js +0 -47
- package/dist/core/layout/types.d.ts +0 -60
- package/dist/core/layout/types.d.ts.map +0 -1
- package/dist/core/layout/types.js +0 -4
- package/dist/core/money/index.d.ts +0 -2
- package/dist/core/money/index.d.ts.map +0 -1
- package/dist/core/money/index.js +0 -2
- package/dist/core/money/money-primitive.d.ts +0 -101
- package/dist/core/money/money-primitive.d.ts.map +0 -1
- package/dist/core/money/money-primitive.js +0 -161
- package/dist/core/money/money.d.ts +0 -129
- package/dist/core/money/money.d.ts.map +0 -1
- package/dist/core/money/money.js +0 -250
- package/dist/core/persistence/types.d.ts +0 -18
- package/dist/core/persistence/types.d.ts.map +0 -1
- package/dist/core/persistence/types.js +0 -2
- package/dist/core/shortcuts/types.d.ts +0 -60
- package/dist/core/shortcuts/types.d.ts.map +0 -1
- package/dist/core/shortcuts/types.js +0 -4
- package/dist/index.d.ts +0 -6
- package/dist/index.js +0 -7
- package/dist/state/api.svelte.d.ts +0 -26
- package/dist/state/api.svelte.js +0 -65
- package/dist/state/app.svelte.d.ts +0 -48
- package/dist/state/app.svelte.js +0 -82
- package/dist/state/auth/index.d.ts +0 -2
- package/dist/state/auth/index.js +0 -2
- package/dist/state/auth/session.svelte.d.ts +0 -40
- package/dist/state/auth/session.svelte.js +0 -59
- package/dist/state/auth/types.d.ts +0 -30
- package/dist/state/auth/types.js +0 -3
- package/dist/state/cart.svelte.d.ts +0 -64
- package/dist/state/cart.svelte.js +0 -122
- package/dist/state/commands.svelte.d.ts +0 -46
- package/dist/state/commands.svelte.js +0 -62
- package/dist/state/composables/useMoney.d.ts +0 -31
- package/dist/state/composables/useMoney.js +0 -126
- package/dist/state/composables/useMoneyFilter.d.ts +0 -20
- package/dist/state/composables/useMoneyFilter.js +0 -81
- package/dist/state/composables/usePersistence.d.ts +0 -2
- package/dist/state/composables/usePersistence.js +0 -5
- package/dist/state/composables/useRuneLab.d.ts +0 -19
- package/dist/state/composables/useRuneLab.js +0 -30
- package/dist/state/composables/useShortcuts.d.ts +0 -33
- package/dist/state/composables/useShortcuts.js +0 -75
- package/dist/state/context.d.ts +0 -15
- package/dist/state/context.js +0 -16
- package/dist/state/createConfigStore.svelte.d.ts +0 -28
- package/dist/state/createConfigStore.svelte.js +0 -72
- package/dist/state/currency.svelte.d.ts +0 -32
- package/dist/state/currency.svelte.js +0 -96
- package/dist/state/currency.test.d.ts +0 -1
- package/dist/state/currency.test.js +0 -35
- package/dist/state/exchange-rate.svelte.d.ts +0 -43
- package/dist/state/exchange-rate.svelte.js +0 -145
- package/dist/state/exchange-rate.test.d.ts +0 -1
- package/dist/state/exchange-rate.test.js +0 -75
- package/dist/state/index.d.ts +0 -26
- package/dist/state/index.js +0 -32
- package/dist/state/language.svelte.d.ts +0 -57
- package/dist/state/language.svelte.js +0 -43
- package/dist/state/layout.svelte.d.ts +0 -49
- package/dist/state/layout.svelte.js +0 -108
- package/dist/state/persistence/drivers.d.ts +0 -12
- package/dist/state/persistence/drivers.js +0 -75
- package/dist/state/persistence/drivers.test.d.ts +0 -1
- package/dist/state/persistence/drivers.test.js +0 -79
- package/dist/state/persistence/provider.d.ts +0 -23
- package/dist/state/persistence/provider.test.d.ts +0 -1
- package/dist/state/persistence/provider.test.js +0 -51
- package/dist/state/registry/index.d.ts +0 -44
- package/dist/state/registry/index.js +0 -58
- package/dist/state/registry/registry.test.d.ts +0 -1
- package/dist/state/registry/registry.test.js +0 -112
- package/dist/state/registry/types.d.ts +0 -20
- package/dist/state/registry/types.js +0 -3
- package/dist/state/shortcuts.svelte.d.ts +0 -121
- package/dist/state/shortcuts.svelte.js +0 -222
- package/dist/state/theme.svelte.d.ts +0 -15
- package/dist/state/theme.svelte.js +0 -92
- package/dist/state/toast-bridge.d.ts +0 -29
- package/dist/state/toast-bridge.js +0 -43
- package/dist/state/toast.svelte.d.ts +0 -27
- package/dist/state/toast.svelte.js +0 -43
- package/dist/ui/actions/portal.d.ts +0 -7
- package/dist/ui/actions/portal.js +0 -32
- package/dist/ui/components/ApiMonitor.svelte +0 -162
- package/dist/ui/components/ApiMonitor.svelte.d.ts +0 -3
- package/dist/ui/components/Icon.svelte +0 -108
- package/dist/ui/components/Icon.svelte.d.ts +0 -14
- package/dist/ui/components/Kyntharil.svelte +0 -48
- package/dist/ui/components/Kyntharil.svelte.d.ts +0 -6
- package/dist/ui/components/RuneProvider.svelte +0 -218
- package/dist/ui/components/RuneProvider.svelte.d.ts +0 -49
- package/dist/ui/components/Toaster.svelte.d.ts +0 -18
- package/dist/ui/components/money/MoneyDisplay.svelte.d.ts +0 -33
- package/dist/ui/components/money/MoneyDisplay.svelte.test.d.ts +0 -1
- package/dist/ui/components/money/MoneyDisplay.svelte.test.js +0 -117
- package/dist/ui/components/money/MoneyInput.svelte.d.ts +0 -34
- package/dist/ui/components/money/index.d.ts +0 -2
- package/dist/ui/components/money/index.js +0 -3
- package/dist/ui/components/user/UserAvatar.svelte +0 -66
- package/dist/ui/components/user/UserAvatar.svelte.d.ts +0 -13
- package/dist/ui/components/user/UserProfile.svelte +0 -79
- package/dist/ui/components/user/UserProfile.svelte.d.ts +0 -17
- package/dist/ui/components/user/index.d.ts +0 -2
- package/dist/ui/components/user/index.js +0 -3
- package/dist/ui/features/command-palette/CommandPalette.svelte.d.ts +0 -6
- package/dist/ui/features/config/APP_CONFIGURATIONS.d.ts +0 -29
- package/dist/ui/features/config/APP_CONFIGURATIONS.js +0 -38
- package/dist/ui/features/config/AppSettingSelector.svelte.d.ts +0 -13
- package/dist/ui/features/config/CurrencySelector.svelte.d.ts +0 -8
- package/dist/ui/features/config/LanguageSelector.svelte.d.ts +0 -8
- package/dist/ui/features/config/ResourceSelector.svelte.d.ts +0 -25
- package/dist/ui/features/config/ThemeSelector.svelte.d.ts +0 -8
- package/dist/ui/features/notifications/NotificationBell.svelte.d.ts +0 -11
- package/dist/ui/features/notifications/index.d.ts +0 -1
- package/dist/ui/features/notifications/index.js +0 -2
- package/dist/ui/features/shortcuts/ShortcutBinder.svelte +0 -17
- package/dist/ui/features/shortcuts/ShortcutBinder.svelte.d.ts +0 -7
- package/dist/ui/features/shortcuts/ShortcutPalette.svelte.d.ts +0 -6
- package/dist/ui/index.d.ts +0 -30
- package/dist/ui/index.js +0 -46
- package/dist/ui/layout/ConnectedNavigationPanel.svelte.d.ts +0 -10
- package/dist/ui/layout/ConnectedWorkspaceStrip.svelte.d.ts +0 -9
- package/dist/ui/layout/ContentArea.svelte.d.ts +0 -8
- package/dist/ui/layout/DetailPanel.svelte.d.ts +0 -7
- package/dist/ui/layout/NavigationPanel.svelte.d.ts +0 -14
- package/dist/ui/layout/WorkspaceLayout.svelte.d.ts +0 -32
- package/dist/ui/layout/WorkspaceStrip.svelte.d.ts +0 -11
- package/dist/ui/layout/connection-factory.d.ts +0 -50
- package/dist/ui/layout/connection-factory.js +0 -58
- package/dist/ui/layout/index.d.ts +0 -7
- package/dist/ui/layout/index.js +0 -7
- package/dist/ui/paraglide/README.md +0 -147
- package/dist/ui/paraglide/messages/_index.d.ts +0 -87
- package/dist/ui/paraglide/messages/_index.js +0 -88
- package/dist/ui/paraglide/messages/abyss.d.ts +0 -16
- package/dist/ui/paraglide/messages/abyss.js +0 -84
- package/dist/ui/paraglide/messages/acid.d.ts +0 -16
- package/dist/ui/paraglide/messages/acid.js +0 -84
- package/dist/ui/paraglide/messages/active_toasts.d.ts +0 -16
- package/dist/ui/paraglide/messages/active_toasts.js +0 -84
- package/dist/ui/paraglide/messages/aed3.d.ts +0 -17
- package/dist/ui/paraglide/messages/aed3.js +0 -85
- package/dist/ui/paraglide/messages/all_currencies.d.ts +0 -16
- package/dist/ui/paraglide/messages/all_currencies.js +0 -84
- package/dist/ui/paraglide/messages/all_languages.d.ts +0 -16
- package/dist/ui/paraglide/messages/all_languages.js +0 -84
- package/dist/ui/paraglide/messages/all_themes.d.ts +0 -16
- package/dist/ui/paraglide/messages/all_themes.js +0 -84
- package/dist/ui/paraglide/messages/api_status.d.ts +0 -16
- package/dist/ui/paraglide/messages/api_status.js +0 -84
- package/dist/ui/paraglide/messages/app_info.d.ts +0 -16
- package/dist/ui/paraglide/messages/app_info.js +0 -84
- package/dist/ui/paraglide/messages/appearance.d.ts +0 -16
- package/dist/ui/paraglide/messages/appearance.js +0 -84
- package/dist/ui/paraglide/messages/aqua.d.ts +0 -16
- package/dist/ui/paraglide/messages/aqua.js +0 -84
- package/dist/ui/paraglide/messages/ar.d.ts +0 -16
- package/dist/ui/paraglide/messages/ar.js +0 -84
- package/dist/ui/paraglide/messages/autumn.d.ts +0 -16
- package/dist/ui/paraglide/messages/autumn.js +0 -84
- package/dist/ui/paraglide/messages/black.d.ts +0 -16
- package/dist/ui/paraglide/messages/black.js +0 -84
- package/dist/ui/paraglide/messages/brl3.d.ts +0 -17
- package/dist/ui/paraglide/messages/brl3.js +0 -85
- package/dist/ui/paraglide/messages/bumblebee.d.ts +0 -16
- package/dist/ui/paraglide/messages/bumblebee.js +0 -84
- package/dist/ui/paraglide/messages/business.d.ts +0 -16
- package/dist/ui/paraglide/messages/business.js +0 -84
- package/dist/ui/paraglide/messages/cad3.d.ts +0 -17
- package/dist/ui/paraglide/messages/cad3.js +0 -85
- package/dist/ui/paraglide/messages/caramellatte.d.ts +0 -16
- package/dist/ui/paraglide/messages/caramellatte.js +0 -84
- package/dist/ui/paraglide/messages/cmyk.d.ts +0 -16
- package/dist/ui/paraglide/messages/cmyk.js +0 -84
- package/dist/ui/paraglide/messages/cny3.d.ts +0 -17
- package/dist/ui/paraglide/messages/cny3.js +0 -85
- package/dist/ui/paraglide/messages/coffee.d.ts +0 -16
- package/dist/ui/paraglide/messages/coffee.js +0 -84
- package/dist/ui/paraglide/messages/commands_label.d.ts +0 -16
- package/dist/ui/paraglide/messages/commands_label.js +0 -84
- package/dist/ui/paraglide/messages/corporate.d.ts +0 -16
- package/dist/ui/paraglide/messages/corporate.js +0 -84
- package/dist/ui/paraglide/messages/cupcake.d.ts +0 -16
- package/dist/ui/paraglide/messages/cupcake.js +0 -84
- package/dist/ui/paraglide/messages/currency.d.ts +0 -16
- package/dist/ui/paraglide/messages/currency.js +0 -84
- package/dist/ui/paraglide/messages/current_currency.d.ts +0 -16
- package/dist/ui/paraglide/messages/current_currency.js +0 -84
- package/dist/ui/paraglide/messages/current_language.d.ts +0 -16
- package/dist/ui/paraglide/messages/current_language.js +0 -84
- package/dist/ui/paraglide/messages/current_theme.d.ts +0 -16
- package/dist/ui/paraglide/messages/current_theme.js +0 -84
- package/dist/ui/paraglide/messages/currently_in_queue.d.ts +0 -16
- package/dist/ui/paraglide/messages/currently_in_queue.js +0 -84
- package/dist/ui/paraglide/messages/cyberpunk.d.ts +0 -16
- package/dist/ui/paraglide/messages/cyberpunk.js +0 -84
- package/dist/ui/paraglide/messages/dark.d.ts +0 -16
- package/dist/ui/paraglide/messages/dark.js +0 -84
- package/dist/ui/paraglide/messages/de.d.ts +0 -16
- package/dist/ui/paraglide/messages/de.js +0 -84
- package/dist/ui/paraglide/messages/dim.d.ts +0 -16
- package/dist/ui/paraglide/messages/dim.js +0 -84
- package/dist/ui/paraglide/messages/dracula.d.ts +0 -16
- package/dist/ui/paraglide/messages/dracula.js +0 -84
- package/dist/ui/paraglide/messages/emerald.d.ts +0 -16
- package/dist/ui/paraglide/messages/emerald.js +0 -84
- package/dist/ui/paraglide/messages/en.d.ts +0 -16
- package/dist/ui/paraglide/messages/en.js +0 -84
- package/dist/ui/paraglide/messages/es.d.ts +0 -16
- package/dist/ui/paraglide/messages/es.js +0 -84
- package/dist/ui/paraglide/messages/eur3.d.ts +0 -17
- package/dist/ui/paraglide/messages/eur3.js +0 -85
- package/dist/ui/paraglide/messages/extended_controls.d.ts +0 -16
- package/dist/ui/paraglide/messages/extended_controls.js +0 -84
- package/dist/ui/paraglide/messages/fantasy.d.ts +0 -16
- package/dist/ui/paraglide/messages/fantasy.js +0 -84
- package/dist/ui/paraglide/messages/forest.d.ts +0 -16
- package/dist/ui/paraglide/messages/forest.js +0 -84
- package/dist/ui/paraglide/messages/fr.d.ts +0 -16
- package/dist/ui/paraglide/messages/fr.js +0 -84
- package/dist/ui/paraglide/messages/garden.d.ts +0 -16
- package/dist/ui/paraglide/messages/garden.js +0 -84
- package/dist/ui/paraglide/messages/gbp3.d.ts +0 -17
- package/dist/ui/paraglide/messages/gbp3.js +0 -85
- package/dist/ui/paraglide/messages/halloween.d.ts +0 -16
- package/dist/ui/paraglide/messages/halloween.js +0 -84
- package/dist/ui/paraglide/messages/hello_world.d.ts +0 -18
- package/dist/ui/paraglide/messages/hello_world.js +0 -84
- package/dist/ui/paraglide/messages/hi.d.ts +0 -16
- package/dist/ui/paraglide/messages/hi.js +0 -84
- package/dist/ui/paraglide/messages/inr3.d.ts +0 -17
- package/dist/ui/paraglide/messages/inr3.js +0 -85
- package/dist/ui/paraglide/messages/it.d.ts +0 -16
- package/dist/ui/paraglide/messages/it.js +0 -84
- package/dist/ui/paraglide/messages/ja.d.ts +0 -16
- package/dist/ui/paraglide/messages/ja.js +0 -84
- package/dist/ui/paraglide/messages/jpy3.d.ts +0 -17
- package/dist/ui/paraglide/messages/jpy3.js +0 -85
- package/dist/ui/paraglide/messages/ko.d.ts +0 -16
- package/dist/ui/paraglide/messages/ko.js +0 -84
- package/dist/ui/paraglide/messages/krw3.d.ts +0 -17
- package/dist/ui/paraglide/messages/krw3.js +0 -85
- package/dist/ui/paraglide/messages/languages.d.ts +0 -16
- package/dist/ui/paraglide/messages/languages.js +0 -84
- package/dist/ui/paraglide/messages/lemonade.d.ts +0 -16
- package/dist/ui/paraglide/messages/lemonade.js +0 -84
- package/dist/ui/paraglide/messages/light.d.ts +0 -16
- package/dist/ui/paraglide/messages/light.js +0 -84
- package/dist/ui/paraglide/messages/live_store_dashboard.d.ts +0 -16
- package/dist/ui/paraglide/messages/live_store_dashboard.js +0 -84
- package/dist/ui/paraglide/messages/localization.d.ts +0 -16
- package/dist/ui/paraglide/messages/localization.js +0 -84
- package/dist/ui/paraglide/messages/lofi.d.ts +0 -16
- package/dist/ui/paraglide/messages/lofi.js +0 -84
- package/dist/ui/paraglide/messages/luxury.d.ts +0 -16
- package/dist/ui/paraglide/messages/luxury.js +0 -84
- package/dist/ui/paraglide/messages/mxn3.d.ts +0 -17
- package/dist/ui/paraglide/messages/mxn3.js +0 -85
- package/dist/ui/paraglide/messages/name_label.d.ts +0 -16
- package/dist/ui/paraglide/messages/name_label.js +0 -84
- package/dist/ui/paraglide/messages/night.d.ts +0 -16
- package/dist/ui/paraglide/messages/night.js +0 -84
- package/dist/ui/paraglide/messages/nord.d.ts +0 -16
- package/dist/ui/paraglide/messages/nord.js +0 -84
- package/dist/ui/paraglide/messages/pastel.d.ts +0 -16
- package/dist/ui/paraglide/messages/pastel.js +0 -84
- package/dist/ui/paraglide/messages/pt.d.ts +0 -16
- package/dist/ui/paraglide/messages/pt.js +0 -84
- package/dist/ui/paraglide/messages/real_time_monitor_desc.d.ts +0 -16
- package/dist/ui/paraglide/messages/real_time_monitor_desc.js +0 -84
- package/dist/ui/paraglide/messages/registered_in_registry.d.ts +0 -16
- package/dist/ui/paraglide/messages/registered_in_registry.js +0 -84
- package/dist/ui/paraglide/messages/retro.d.ts +0 -16
- package/dist/ui/paraglide/messages/retro.js +0 -84
- package/dist/ui/paraglide/messages/ru.d.ts +0 -16
- package/dist/ui/paraglide/messages/ru.js +0 -84
- package/dist/ui/paraglide/messages/silk.d.ts +0 -16
- package/dist/ui/paraglide/messages/silk.js +0 -84
- package/dist/ui/paraglide/messages/state_label.d.ts +0 -16
- package/dist/ui/paraglide/messages/state_label.js +0 -84
- package/dist/ui/paraglide/messages/sunset.d.ts +0 -16
- package/dist/ui/paraglide/messages/sunset.js +0 -84
- package/dist/ui/paraglide/messages/synthwave.d.ts +0 -16
- package/dist/ui/paraglide/messages/synthwave.js +0 -84
- package/dist/ui/paraglide/messages/system.d.ts +0 -16
- package/dist/ui/paraglide/messages/system.js +0 -84
- package/dist/ui/paraglide/messages/theme.d.ts +0 -16
- package/dist/ui/paraglide/messages/theme.js +0 -84
- package/dist/ui/paraglide/messages/themes.d.ts +0 -16
- package/dist/ui/paraglide/messages/themes.js +0 -84
- package/dist/ui/paraglide/messages/url_label.d.ts +0 -16
- package/dist/ui/paraglide/messages/url_label.js +0 -84
- package/dist/ui/paraglide/messages/usd3.d.ts +0 -17
- package/dist/ui/paraglide/messages/usd3.js +0 -85
- package/dist/ui/paraglide/messages/valentine.d.ts +0 -16
- package/dist/ui/paraglide/messages/valentine.js +0 -84
- package/dist/ui/paraglide/messages/version_label.d.ts +0 -16
- package/dist/ui/paraglide/messages/version_label.js +0 -84
- package/dist/ui/paraglide/messages/vi.d.ts +0 -16
- package/dist/ui/paraglide/messages/vi.js +0 -84
- package/dist/ui/paraglide/messages/winter.d.ts +0 -16
- package/dist/ui/paraglide/messages/winter.js +0 -84
- package/dist/ui/paraglide/messages/wireframe.d.ts +0 -16
- package/dist/ui/paraglide/messages/wireframe.js +0 -84
- package/dist/ui/paraglide/messages/zh.d.ts +0 -16
- package/dist/ui/paraglide/messages/zh.js +0 -84
- package/dist/ui/paraglide/messages.d.ts +0 -2
- package/dist/ui/paraglide/messages.js +0 -4
- package/dist/ui/paraglide/registry.d.ts +0 -21
- package/dist/ui/paraglide/registry.js +0 -31
- package/dist/ui/paraglide/runtime.d.ts +0 -730
- package/dist/ui/paraglide/runtime.js +0 -1812
- package/dist/ui/paraglide/server.d.ts +0 -92
- package/dist/ui/paraglide/server.js +0 -239
- package/dist/ui/primitives/DatePicker.svelte +0 -257
- package/dist/ui/primitives/DatePicker.svelte.d.ts +0 -17
- package/dist/ui/primitives/index.d.ts +0 -1
- package/dist/ui/primitives/index.js +0 -3
- /package/{dist/ui/layout → src/runes/layout/src}/ContentArea.svelte +0 -0
- /package/{dist/ui/layout → src/runes/layout/src}/DetailPanel.svelte +0 -0
- /package/{dist/ui/features → src/runes/palettes/src}/notifications/NotificationBell.svelte +0 -0
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
// src/lib/composables/useRuneLab.ts
|
|
2
|
-
import { getApiStore, getAppStore, getCommandStore, getCurrencyStore, getLanguageStore, getLayoutStore, getShortcutStore, getThemeStore, getToastStore, } from "../index.ts";
|
|
3
|
-
import { getContext } from "svelte";
|
|
4
|
-
import { RUNE_LAB_CONTEXT } from "../context.ts";
|
|
5
|
-
/**
|
|
6
|
-
* Retrieves all Rune Lab stores from the Svelte context tree.
|
|
7
|
-
* Must be called during component initialization (in the `<script>` block).
|
|
8
|
-
*/
|
|
9
|
-
export function useRuneLab() {
|
|
10
|
-
// Session is optional — only present when auth is enabled
|
|
11
|
-
let session;
|
|
12
|
-
try {
|
|
13
|
-
session = getContext(RUNE_LAB_CONTEXT.session);
|
|
14
|
-
}
|
|
15
|
-
catch {
|
|
16
|
-
// Auth not enabled — session stays undefined
|
|
17
|
-
}
|
|
18
|
-
return {
|
|
19
|
-
app: getAppStore(),
|
|
20
|
-
api: getApiStore(),
|
|
21
|
-
toast: getToastStore(),
|
|
22
|
-
theme: getThemeStore(),
|
|
23
|
-
language: getLanguageStore(),
|
|
24
|
-
currency: getCurrencyStore(),
|
|
25
|
-
shortcut: getShortcutStore(),
|
|
26
|
-
layout: getLayoutStore(),
|
|
27
|
-
commands: getCommandStore(),
|
|
28
|
-
session,
|
|
29
|
-
};
|
|
30
|
-
}
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
import type { ShortcutConfig } from "@internal/core";
|
|
2
|
-
/**
|
|
3
|
-
* Declarative shortcut registration composable.
|
|
4
|
-
* Registers all shortcuts via ShortcutStore in a single `$effect` and
|
|
5
|
-
* automatically unregisters them when the component is destroyed.
|
|
6
|
-
*
|
|
7
|
-
* Must be called at component initialization time (top-level in `<script>`),
|
|
8
|
-
* not inside event handlers.
|
|
9
|
-
*
|
|
10
|
-
* @param configs - Array of ShortcutConfig from sdk/core
|
|
11
|
-
* @returns Object with `registered` getter for the list of registered IDs
|
|
12
|
-
*
|
|
13
|
-
* @example
|
|
14
|
-
* ```svelte
|
|
15
|
-
* <script>
|
|
16
|
-
* import { useShortcuts } from 'rune-lab/state';
|
|
17
|
-
*
|
|
18
|
-
* useShortcuts([
|
|
19
|
-
* {
|
|
20
|
-
* id: "save:document",
|
|
21
|
-
* keys: "ctrl+s",
|
|
22
|
-
* handler: (e) => { e.preventDefault(); save(); },
|
|
23
|
-
* label: "Save document",
|
|
24
|
-
* category: "Editing",
|
|
25
|
-
* },
|
|
26
|
-
* ]);
|
|
27
|
-
* </script>
|
|
28
|
-
* ```
|
|
29
|
-
*/
|
|
30
|
-
export declare function useShortcuts(configs: ShortcutConfig[]): {
|
|
31
|
-
/** IDs of all shortcuts registered by this composable */
|
|
32
|
-
readonly registered: string[];
|
|
33
|
-
};
|
|
@@ -1,75 +0,0 @@
|
|
|
1
|
-
// sdk/state/src/composables/useShortcuts.ts
|
|
2
|
-
// Declarative shortcut registration with automatic lifecycle cleanup.
|
|
3
|
-
// Bridges ShortcutConfig (sdk/core) → ShortcutStore (sdk/state).
|
|
4
|
-
import { getShortcutStore } from "../shortcuts.svelte.ts";
|
|
5
|
-
/**
|
|
6
|
-
* Declarative shortcut registration composable.
|
|
7
|
-
* Registers all shortcuts via ShortcutStore in a single `$effect` and
|
|
8
|
-
* automatically unregisters them when the component is destroyed.
|
|
9
|
-
*
|
|
10
|
-
* Must be called at component initialization time (top-level in `<script>`),
|
|
11
|
-
* not inside event handlers.
|
|
12
|
-
*
|
|
13
|
-
* @param configs - Array of ShortcutConfig from sdk/core
|
|
14
|
-
* @returns Object with `registered` getter for the list of registered IDs
|
|
15
|
-
*
|
|
16
|
-
* @example
|
|
17
|
-
* ```svelte
|
|
18
|
-
* <script>
|
|
19
|
-
* import { useShortcuts } from 'rune-lab/state';
|
|
20
|
-
*
|
|
21
|
-
* useShortcuts([
|
|
22
|
-
* {
|
|
23
|
-
* id: "save:document",
|
|
24
|
-
* keys: "ctrl+s",
|
|
25
|
-
* handler: (e) => { e.preventDefault(); save(); },
|
|
26
|
-
* label: "Save document",
|
|
27
|
-
* category: "Editing",
|
|
28
|
-
* },
|
|
29
|
-
* ]);
|
|
30
|
-
* </script>
|
|
31
|
-
* ```
|
|
32
|
-
*/
|
|
33
|
-
export function useShortcuts(configs) {
|
|
34
|
-
const shortcutStore = getShortcutStore();
|
|
35
|
-
// Convert ShortcutConfig[] to ShortcutEntry[] respecting the `when` predicate
|
|
36
|
-
function toEntries(configs) {
|
|
37
|
-
return configs.map((config) => ({
|
|
38
|
-
id: config.id,
|
|
39
|
-
keys: config.keys,
|
|
40
|
-
handler: (event) => {
|
|
41
|
-
// Check `when` predicate before firing
|
|
42
|
-
if (config.when && !config.when())
|
|
43
|
-
return;
|
|
44
|
-
config.handler(event);
|
|
45
|
-
},
|
|
46
|
-
label: config.label ?? config.id,
|
|
47
|
-
category: config.category ?? "General",
|
|
48
|
-
scope: config.scope ?? "global",
|
|
49
|
-
enabled: true,
|
|
50
|
-
hidden: !config.label, // Hide from palette if no label
|
|
51
|
-
}));
|
|
52
|
-
}
|
|
53
|
-
// Register all shortcuts
|
|
54
|
-
const entries = toEntries(configs);
|
|
55
|
-
const ids = entries.map((e) => e.id);
|
|
56
|
-
for (const entry of entries) {
|
|
57
|
-
shortcutStore.register(entry);
|
|
58
|
-
}
|
|
59
|
-
// Auto-cleanup using $effect.root for lifecycle management
|
|
60
|
-
$effect(() => {
|
|
61
|
-
// This effect runs on mount — shortcuts are already registered above.
|
|
62
|
-
// Return cleanup that unregisters all shortcuts on destroy.
|
|
63
|
-
return () => {
|
|
64
|
-
for (const id of ids) {
|
|
65
|
-
shortcutStore.unregister(id);
|
|
66
|
-
}
|
|
67
|
-
};
|
|
68
|
-
});
|
|
69
|
-
return {
|
|
70
|
-
/** IDs of all shortcuts registered by this composable */
|
|
71
|
-
get registered() {
|
|
72
|
-
return ids;
|
|
73
|
-
},
|
|
74
|
-
};
|
|
75
|
-
}
|
package/dist/state/context.d.ts
DELETED
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
export declare const RUNE_LAB_CONTEXT: {
|
|
2
|
-
readonly app: symbol;
|
|
3
|
-
readonly api: symbol;
|
|
4
|
-
readonly toast: symbol;
|
|
5
|
-
readonly theme: symbol;
|
|
6
|
-
readonly language: symbol;
|
|
7
|
-
readonly currency: symbol;
|
|
8
|
-
readonly shortcut: symbol;
|
|
9
|
-
readonly layout: symbol;
|
|
10
|
-
readonly commands: symbol;
|
|
11
|
-
readonly persistence: symbol;
|
|
12
|
-
readonly cart: symbol;
|
|
13
|
-
readonly session: symbol;
|
|
14
|
-
readonly exchangeRate: symbol;
|
|
15
|
-
};
|
package/dist/state/context.js
DELETED
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
// src/lib/context.ts
|
|
2
|
-
export const RUNE_LAB_CONTEXT = {
|
|
3
|
-
app: Symbol("rl:app"),
|
|
4
|
-
api: Symbol("rl:api"),
|
|
5
|
-
toast: Symbol("rl:toast"),
|
|
6
|
-
theme: Symbol("rl:theme"),
|
|
7
|
-
language: Symbol("rl:language"),
|
|
8
|
-
currency: Symbol("rl:currency"),
|
|
9
|
-
shortcut: Symbol("rl:shortcut"),
|
|
10
|
-
layout: Symbol("rl:layout"),
|
|
11
|
-
commands: Symbol("rl:commands"),
|
|
12
|
-
persistence: Symbol("rl:persistence"),
|
|
13
|
-
cart: Symbol("rl:cart"),
|
|
14
|
-
session: Symbol("rl:session"),
|
|
15
|
-
exchangeRate: Symbol("rl:exchange-rate"),
|
|
16
|
-
};
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
import { type PersistenceDriver } from "@internal/core";
|
|
2
|
-
export type ConfigStore<T extends object> = {
|
|
3
|
-
current: T[keyof T];
|
|
4
|
-
available: T[];
|
|
5
|
-
set: (id: T[keyof T]) => void;
|
|
6
|
-
get: (id: T[keyof T]) => T | undefined;
|
|
7
|
-
getProp: <K extends keyof T>(prop: K, id?: T[keyof T]) => T[K] | undefined;
|
|
8
|
-
/** Append additional items (e.g. custom themes/currencies from the consuming app) */
|
|
9
|
-
addItems: (newItems: T[]) => void;
|
|
10
|
-
};
|
|
11
|
-
export interface ConfigStoreOptions<T extends object> {
|
|
12
|
-
/** Array of available items */
|
|
13
|
-
items: readonly T[];
|
|
14
|
-
/** Storage key used by the persistence driver */
|
|
15
|
-
storageKey: string;
|
|
16
|
-
/** Display name for logging (e.g., "Theme", "Language") */
|
|
17
|
-
displayName: string;
|
|
18
|
-
/** Key to use as identifier (e.g., "code", "name") */
|
|
19
|
-
idKey: keyof T;
|
|
20
|
-
/** Icon for logs */
|
|
21
|
-
icon?: string;
|
|
22
|
-
/** Persistence driver */
|
|
23
|
-
driver?: PersistenceDriver;
|
|
24
|
-
}
|
|
25
|
-
/**
|
|
26
|
-
* Creates a reactive configuration store with persistence
|
|
27
|
-
*/
|
|
28
|
-
export declare function createConfigStore<T extends object>(options: ConfigStoreOptions<T>): ConfigStore<T>;
|
|
@@ -1,72 +0,0 @@
|
|
|
1
|
-
import { createInMemoryDriver } from "./persistence/drivers.ts";
|
|
2
|
-
import { DEV } from "esm-env";
|
|
3
|
-
/**
|
|
4
|
-
* Internal class implementation for configuration stores.
|
|
5
|
-
* Stable class definition avoids potential issues with multiple definitions in SSR.
|
|
6
|
-
*/
|
|
7
|
-
class ConfigStoreImpl {
|
|
8
|
-
current = $state(null);
|
|
9
|
-
available = $state([]);
|
|
10
|
-
#options;
|
|
11
|
-
#driver;
|
|
12
|
-
constructor(options) {
|
|
13
|
-
this.#options = options;
|
|
14
|
-
const { items, idKey, storageKey, driver = createInMemoryDriver() } = options;
|
|
15
|
-
this.#driver = driver;
|
|
16
|
-
this.available = [...items];
|
|
17
|
-
this.current = items[0]?.[idKey] ?? "";
|
|
18
|
-
const saved = this.#driver.get(storageKey);
|
|
19
|
-
// Only load saved if it actually exists in our available items
|
|
20
|
-
if (saved && this.get(saved)) {
|
|
21
|
-
this.current = saved;
|
|
22
|
-
}
|
|
23
|
-
if (DEV) {
|
|
24
|
-
console.log(`${options.icon ?? "⚙️"} ${options.displayName} configured:`, {
|
|
25
|
-
current: this.current,
|
|
26
|
-
});
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
/**
|
|
30
|
-
* Set current item with validation
|
|
31
|
-
*/
|
|
32
|
-
set(id) {
|
|
33
|
-
const item = this.get(id);
|
|
34
|
-
if (!item) {
|
|
35
|
-
console.warn(`${this.#options.displayName} "${id}" not found`);
|
|
36
|
-
return;
|
|
37
|
-
}
|
|
38
|
-
this.current = id;
|
|
39
|
-
this.#driver.set(this.#options.storageKey, String(id));
|
|
40
|
-
}
|
|
41
|
-
/**
|
|
42
|
-
* Get item by id
|
|
43
|
-
*/
|
|
44
|
-
get(id) {
|
|
45
|
-
const idKey = this.#options.idKey;
|
|
46
|
-
return this.available.find((item) => item[idKey] === id);
|
|
47
|
-
}
|
|
48
|
-
/**
|
|
49
|
-
* Get property from current or specified item
|
|
50
|
-
*/
|
|
51
|
-
getProp(prop, id) {
|
|
52
|
-
const targetId = id ?? this.current;
|
|
53
|
-
return this.get(targetId)?.[prop];
|
|
54
|
-
}
|
|
55
|
-
/**
|
|
56
|
-
* Append additional items (deduplicates by idKey)
|
|
57
|
-
*/
|
|
58
|
-
addItems(newItems) {
|
|
59
|
-
const idKey = this.#options.idKey;
|
|
60
|
-
for (const item of newItems) {
|
|
61
|
-
if (!this.get(item[idKey])) {
|
|
62
|
-
this.available.push(item);
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
/**
|
|
68
|
-
* Creates a reactive configuration store with persistence
|
|
69
|
-
*/
|
|
70
|
-
export function createConfigStore(options) {
|
|
71
|
-
return new ConfigStoreImpl(options);
|
|
72
|
-
}
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
import { type ConfigStore, createConfigStore } from "./createConfigStore.svelte.ts";
|
|
2
|
-
/**
|
|
3
|
-
* Currency configuration
|
|
4
|
-
* Based on ISO 4217 currency codes
|
|
5
|
-
*/
|
|
6
|
-
export interface Currency {
|
|
7
|
-
code: string;
|
|
8
|
-
symbol: string;
|
|
9
|
-
decimals: number;
|
|
10
|
-
}
|
|
11
|
-
import type { PersistenceDriver } from "@internal/core";
|
|
12
|
-
import { type ExchangeRateStore } from "./exchange-rate.svelte.ts";
|
|
13
|
-
export interface CurrencyStoreOptions {
|
|
14
|
-
driver?: PersistenceDriver | (() => PersistenceDriver | undefined);
|
|
15
|
-
/** Additional custom currencies to append to the built-in set */
|
|
16
|
-
customCurrencies?: Currency[];
|
|
17
|
-
/** Default currency code if no persisted value exists */
|
|
18
|
-
defaultCurrency?: string;
|
|
19
|
-
/** Wired exchange rate store for conversions */
|
|
20
|
-
exchangeRateStore?: ExchangeRateStore;
|
|
21
|
-
}
|
|
22
|
-
export declare function createCurrencyStore(driverOrOptions?: PersistenceDriver | (() => PersistenceDriver | undefined) | CurrencyStoreOptions): ReturnType<typeof createConfigStore<Currency>> & {
|
|
23
|
-
addCurrency: (meta: Currency, dineroDef?: unknown) => void;
|
|
24
|
-
convertAmount: (amount: number, fromCode: string, toCode?: string) => number;
|
|
25
|
-
readonly canConvert: boolean;
|
|
26
|
-
};
|
|
27
|
-
export type CurrencyStore = ReturnType<typeof createCurrencyStore>;
|
|
28
|
-
export declare function getCurrencyStore(): ConfigStore<Currency> & {
|
|
29
|
-
addCurrency: (meta: Currency, dineroDef?: unknown) => void;
|
|
30
|
-
convertAmount: (amount: number, fromCode: string, toCode?: string) => number;
|
|
31
|
-
readonly canConvert: boolean;
|
|
32
|
-
};
|
|
@@ -1,96 +0,0 @@
|
|
|
1
|
-
import { createConfigStore, } from "./createConfigStore.svelte.ts";
|
|
2
|
-
import { getContext } from "svelte";
|
|
3
|
-
import { RUNE_LAB_CONTEXT } from "./context.ts";
|
|
4
|
-
import { registerCurrency } from "@internal/core";
|
|
5
|
-
/**
|
|
6
|
-
* Helper to build a minimal Dinero definition from Currency metadata.
|
|
7
|
-
* Assumes base 10 (standard decimal) for auto-registration.
|
|
8
|
-
*/
|
|
9
|
-
function buildDineroDef(meta) {
|
|
10
|
-
return {
|
|
11
|
-
code: meta.code,
|
|
12
|
-
base: 10,
|
|
13
|
-
exponent: meta.decimals,
|
|
14
|
-
};
|
|
15
|
-
}
|
|
16
|
-
const CURRENCIES = [
|
|
17
|
-
{ code: "USD", symbol: "$", decimals: 2 },
|
|
18
|
-
{ code: "EUR", symbol: "€", decimals: 2 },
|
|
19
|
-
{ code: "GBP", symbol: "£", decimals: 2 },
|
|
20
|
-
{ code: "MXN", symbol: "$", decimals: 2 },
|
|
21
|
-
{ code: "CAD", symbol: "C$", decimals: 2 },
|
|
22
|
-
{ code: "BRL", symbol: "R$", decimals: 2 },
|
|
23
|
-
{ code: "INR", symbol: "₹", decimals: 2 },
|
|
24
|
-
{ code: "CNY", symbol: "¥", decimals: 2 },
|
|
25
|
-
{ code: "JPY", symbol: "¥", decimals: 0 },
|
|
26
|
-
{ code: "KRW", symbol: "₩", decimals: 0 },
|
|
27
|
-
{ code: "AED", symbol: "د.إ", decimals: 2 },
|
|
28
|
-
];
|
|
29
|
-
import { resolveDriver } from "./persistence/provider.ts";
|
|
30
|
-
export function createCurrencyStore(driverOrOptions) {
|
|
31
|
-
// Normalize overloaded argument
|
|
32
|
-
const opts = driverOrOptions && typeof driverOrOptions === "object" &&
|
|
33
|
-
"driver" in driverOrOptions
|
|
34
|
-
? driverOrOptions
|
|
35
|
-
: {
|
|
36
|
-
driver: driverOrOptions,
|
|
37
|
-
};
|
|
38
|
-
const resolvedDriver = resolveDriver(opts.driver);
|
|
39
|
-
const store = createConfigStore({
|
|
40
|
-
items: CURRENCIES,
|
|
41
|
-
storageKey: "currency",
|
|
42
|
-
displayName: "Currency",
|
|
43
|
-
idKey: "code",
|
|
44
|
-
icon: "💰",
|
|
45
|
-
driver: resolvedDriver,
|
|
46
|
-
});
|
|
47
|
-
const exchangeRateStore = opts.exchangeRateStore;
|
|
48
|
-
/**
|
|
49
|
-
* Extension: Atomic currency registration.
|
|
50
|
-
* Updates both the Dinero registry (core) and the reactive store (UI).
|
|
51
|
-
*
|
|
52
|
-
* @remarks Custom currencies with non-decimal base systems must use
|
|
53
|
-
* registerCurrency() from @internal/core explicitly before addItems().
|
|
54
|
-
*/
|
|
55
|
-
function addCurrency(meta, dineroDef) {
|
|
56
|
-
const def = dineroDef || buildDineroDef(meta);
|
|
57
|
-
registerCurrency(meta.code, def);
|
|
58
|
-
store.addItems([meta]);
|
|
59
|
-
}
|
|
60
|
-
/**
|
|
61
|
-
* Converts an amount from one currency to another.
|
|
62
|
-
* Defaults to converting to the current store currency.
|
|
63
|
-
*/
|
|
64
|
-
function convertAmount(amount, fromCode, toCode) {
|
|
65
|
-
const target = toCode ?? String(store.current);
|
|
66
|
-
if (fromCode === target)
|
|
67
|
-
return amount;
|
|
68
|
-
if (!exchangeRateStore || !exchangeRateStore.hasRates)
|
|
69
|
-
return amount;
|
|
70
|
-
return exchangeRateStore.convertAmount(amount, fromCode, target);
|
|
71
|
-
}
|
|
72
|
-
// Append and auto-register custom currencies if provided
|
|
73
|
-
if (opts.customCurrencies?.length) {
|
|
74
|
-
for (const c of opts.customCurrencies) {
|
|
75
|
-
registerCurrency(c.code, buildDineroDef(c));
|
|
76
|
-
}
|
|
77
|
-
store.addItems(opts.customCurrencies);
|
|
78
|
-
}
|
|
79
|
-
// Set default currency if provided and no persisted value found
|
|
80
|
-
if (!resolvedDriver?.get("currency") && opts.defaultCurrency) {
|
|
81
|
-
if (store.get(opts.defaultCurrency)) {
|
|
82
|
-
store.set(opts.defaultCurrency);
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
// Explicitly attach method to ensure prototype is preserved and method is available
|
|
86
|
-
// across different build environments.
|
|
87
|
-
Object.defineProperties(store, {
|
|
88
|
-
addCurrency: { value: addCurrency },
|
|
89
|
-
convertAmount: { value: convertAmount },
|
|
90
|
-
canConvert: { get: () => !!exchangeRateStore?.hasRates },
|
|
91
|
-
});
|
|
92
|
-
return store;
|
|
93
|
-
}
|
|
94
|
-
export function getCurrencyStore() {
|
|
95
|
-
return getContext(RUNE_LAB_CONTEXT.currency);
|
|
96
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it } from "vitest";
|
|
2
|
-
import { createCurrencyStore } from "./currency.svelte.ts";
|
|
3
|
-
describe("Currency Store", () => {
|
|
4
|
-
it("should have prototype methods from ConfigStore", () => {
|
|
5
|
-
const store = createCurrencyStore();
|
|
6
|
-
// These come from the ConfigStore class prototype
|
|
7
|
-
expect(typeof store.get).toBe("function");
|
|
8
|
-
expect(typeof store.set).toBe("function");
|
|
9
|
-
expect(typeof store.getProp).toBe("function");
|
|
10
|
-
expect(typeof store.addItems).toBe("function");
|
|
11
|
-
// These are instance properties
|
|
12
|
-
expect(store.current).toBeDefined();
|
|
13
|
-
expect(Array.isArray(store.available)).toBe(true);
|
|
14
|
-
// This is the extension method
|
|
15
|
-
expect(typeof store.addCurrency).toBe("function");
|
|
16
|
-
});
|
|
17
|
-
it("should correctly use prototype methods", () => {
|
|
18
|
-
const store = createCurrencyStore();
|
|
19
|
-
const usd = store.get("USD");
|
|
20
|
-
expect(usd).toBeDefined();
|
|
21
|
-
expect(usd?.code).toBe("USD");
|
|
22
|
-
expect(usd?.symbol).toBe("$");
|
|
23
|
-
});
|
|
24
|
-
it("should add a new currency and keep methods", () => {
|
|
25
|
-
const store = createCurrencyStore();
|
|
26
|
-
store.addCurrency({ code: "BTC", symbol: "₿", decimals: 8 });
|
|
27
|
-
const btc = store.get("BTC");
|
|
28
|
-
expect(btc).toBeDefined();
|
|
29
|
-
expect(btc?.code).toBe("BTC");
|
|
30
|
-
expect(btc?.decimals).toBe(8);
|
|
31
|
-
// Methods still exist after interaction
|
|
32
|
-
expect(typeof store.get).toBe("function");
|
|
33
|
-
expect(typeof store.set).toBe("function");
|
|
34
|
-
});
|
|
35
|
-
});
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
import { type RateMap, type ScaledRate } from "@internal/core";
|
|
2
|
-
export declare class ExchangeRateStore {
|
|
3
|
-
#private;
|
|
4
|
-
/**
|
|
5
|
-
* The current exchange rates relative to the base currency.
|
|
6
|
-
*/
|
|
7
|
-
get rates(): RateMap;
|
|
8
|
-
/**
|
|
9
|
-
* The base currency all rates are relative to.
|
|
10
|
-
*/
|
|
11
|
-
get baseCurrency(): string;
|
|
12
|
-
/**
|
|
13
|
-
* Returns true if exchange rates have been loaded.
|
|
14
|
-
*/
|
|
15
|
-
get hasRates(): boolean;
|
|
16
|
-
/**
|
|
17
|
-
* Set exchange rates from a human-readable float map.
|
|
18
|
-
* @param base - The base currency code (e.g., "USD")
|
|
19
|
-
* @param rawRates - A map of currency codes to float rates (e.g., { MXN: 17.23 })
|
|
20
|
-
*/
|
|
21
|
-
setRates(base: string, rawRates: Record<string, number>): void;
|
|
22
|
-
/**
|
|
23
|
-
* Directly set pre-scaled rates.
|
|
24
|
-
*/
|
|
25
|
-
setScaledRates(base: string, rates: RateMap): void;
|
|
26
|
-
/**
|
|
27
|
-
* Resolves the exchange rate between two currencies.
|
|
28
|
-
* Returns a ScaledRate representing how many units of toCode are in 1 unit of fromCode.
|
|
29
|
-
*/
|
|
30
|
-
getRate(fromCode: string, toCode: string): ScaledRate | number | undefined;
|
|
31
|
-
/**
|
|
32
|
-
* Internal conversion logic that handles triangulation through base currency.
|
|
33
|
-
*/
|
|
34
|
-
convertAmount(amount: number, fromCode: string, toCode: string): number;
|
|
35
|
-
}
|
|
36
|
-
/**
|
|
37
|
-
* Factory to create the ExchangeRateStore.
|
|
38
|
-
*/
|
|
39
|
-
export declare function createExchangeRateStore(): ExchangeRateStore;
|
|
40
|
-
/**
|
|
41
|
-
* Consumer to retrieve the ExchangeRateStore from context.
|
|
42
|
-
*/
|
|
43
|
-
export declare function getExchangeRateStore(): ExchangeRateStore;
|
|
@@ -1,145 +0,0 @@
|
|
|
1
|
-
// sdk/state/src/exchange-rate.svelte.ts
|
|
2
|
-
import { getContext } from "svelte";
|
|
3
|
-
import { convertAmount, convertMoney, createMoney, CURRENCY_MAP,
|
|
4
|
-
// Phase 2: ConversionStrategies from sdk/core
|
|
5
|
-
resolveRate, scaledRate, toMoneySnapshot, } from "@internal/core";
|
|
6
|
-
import { RUNE_LAB_CONTEXT } from "./context.ts";
|
|
7
|
-
export class ExchangeRateStore {
|
|
8
|
-
#rates = $state({});
|
|
9
|
-
#baseCurrency = $state("USD");
|
|
10
|
-
/**
|
|
11
|
-
* The current exchange rates relative to the base currency.
|
|
12
|
-
*/
|
|
13
|
-
get rates() {
|
|
14
|
-
return this.#rates;
|
|
15
|
-
}
|
|
16
|
-
/**
|
|
17
|
-
* The base currency all rates are relative to.
|
|
18
|
-
*/
|
|
19
|
-
get baseCurrency() {
|
|
20
|
-
return this.#baseCurrency;
|
|
21
|
-
}
|
|
22
|
-
/**
|
|
23
|
-
* Returns true if exchange rates have been loaded.
|
|
24
|
-
*/
|
|
25
|
-
get hasRates() {
|
|
26
|
-
return Object.keys(this.#rates).length > 0;
|
|
27
|
-
}
|
|
28
|
-
/**
|
|
29
|
-
* Set exchange rates from a human-readable float map.
|
|
30
|
-
* @param base - The base currency code (e.g., "USD")
|
|
31
|
-
* @param rawRates - A map of currency codes to float rates (e.g., { MXN: 17.23 })
|
|
32
|
-
*/
|
|
33
|
-
setRates(base, rawRates) {
|
|
34
|
-
const nextRates = {};
|
|
35
|
-
for (const [code, rate] of Object.entries(rawRates)) {
|
|
36
|
-
nextRates[code] = scaledRate(rate, 4);
|
|
37
|
-
}
|
|
38
|
-
this.#baseCurrency = base;
|
|
39
|
-
this.#rates = nextRates;
|
|
40
|
-
}
|
|
41
|
-
/**
|
|
42
|
-
* Directly set pre-scaled rates.
|
|
43
|
-
*/
|
|
44
|
-
setScaledRates(base, rates) {
|
|
45
|
-
this.#baseCurrency = base;
|
|
46
|
-
this.#rates = rates;
|
|
47
|
-
}
|
|
48
|
-
/**
|
|
49
|
-
* Resolves the exchange rate between two currencies.
|
|
50
|
-
* Returns a ScaledRate representing how many units of toCode are in 1 unit of fromCode.
|
|
51
|
-
*/
|
|
52
|
-
getRate(fromCode, toCode) {
|
|
53
|
-
if (fromCode === toCode)
|
|
54
|
-
return 1;
|
|
55
|
-
const fromCurrency = CURRENCY_MAP[fromCode];
|
|
56
|
-
const toCurrency = CURRENCY_MAP[toCode];
|
|
57
|
-
if (!fromCurrency || !toCurrency)
|
|
58
|
-
return undefined;
|
|
59
|
-
if (!this.hasRates)
|
|
60
|
-
return undefined;
|
|
61
|
-
try {
|
|
62
|
-
// 1 unit of fromCode (major unit)
|
|
63
|
-
const oneUnit = Math.pow(Array.isArray(fromCurrency.base)
|
|
64
|
-
? fromCurrency.base[0]
|
|
65
|
-
: fromCurrency.base, fromCurrency.exponent);
|
|
66
|
-
const currentRates = this.#rates;
|
|
67
|
-
const currentBase = this.#baseCurrency;
|
|
68
|
-
const sourceMoney = createMoney(oneUnit, fromCode);
|
|
69
|
-
let targetMoney;
|
|
70
|
-
if (fromCode === currentBase) {
|
|
71
|
-
// Direct: base → target
|
|
72
|
-
targetMoney = convertMoney(sourceMoney, toCode, currentRates);
|
|
73
|
-
}
|
|
74
|
-
else if (toCode === currentBase) {
|
|
75
|
-
// Inverse: target → base
|
|
76
|
-
const rateToBase = currentRates[fromCode];
|
|
77
|
-
if (!rateToBase)
|
|
78
|
-
return undefined;
|
|
79
|
-
const r = resolveRate(rateToBase);
|
|
80
|
-
targetMoney = convertMoney(sourceMoney, toCode, {
|
|
81
|
-
[toCode]: scaledRate(1 / r, 6),
|
|
82
|
-
});
|
|
83
|
-
}
|
|
84
|
-
else {
|
|
85
|
-
// Triangular: source → base → target
|
|
86
|
-
const rateToBase = currentRates[fromCode];
|
|
87
|
-
const rateToTarget = currentRates[toCode];
|
|
88
|
-
if (!rateToBase || !rateToTarget)
|
|
89
|
-
return undefined;
|
|
90
|
-
const r1 = resolveRate(rateToBase);
|
|
91
|
-
const r2 = resolveRate(rateToTarget);
|
|
92
|
-
targetMoney = convertMoney(sourceMoney, toCode, {
|
|
93
|
-
[toCode]: scaledRate(r2 / r1, 6),
|
|
94
|
-
});
|
|
95
|
-
}
|
|
96
|
-
const snapshot = toMoneySnapshot(targetMoney);
|
|
97
|
-
return {
|
|
98
|
-
amount: snapshot.amount,
|
|
99
|
-
scale: snapshot.scale,
|
|
100
|
-
};
|
|
101
|
-
}
|
|
102
|
-
catch (_err) {
|
|
103
|
-
return undefined;
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
/**
|
|
107
|
-
* Internal conversion logic that handles triangulation through base currency.
|
|
108
|
-
*/
|
|
109
|
-
convertAmount(amount, fromCode, toCode) {
|
|
110
|
-
if (fromCode === toCode)
|
|
111
|
-
return amount;
|
|
112
|
-
if (!this.hasRates)
|
|
113
|
-
return amount;
|
|
114
|
-
// Direct: Base → Target
|
|
115
|
-
if (fromCode === this.#baseCurrency) {
|
|
116
|
-
return convertAmount(amount, fromCode, toCode, this.#rates);
|
|
117
|
-
}
|
|
118
|
-
// Inverse: Target → Base
|
|
119
|
-
if (toCode === this.#baseCurrency) {
|
|
120
|
-
const rateToBase = this.#rates[fromCode];
|
|
121
|
-
if (!rateToBase)
|
|
122
|
-
return amount;
|
|
123
|
-
const r = resolveRate(rateToBase);
|
|
124
|
-
const inverseRate = scaledRate(1 / r, 6);
|
|
125
|
-
return convertAmount(amount, fromCode, toCode, {
|
|
126
|
-
[toCode]: inverseRate,
|
|
127
|
-
});
|
|
128
|
-
}
|
|
129
|
-
// Triangulation: From → Base → To
|
|
130
|
-
const amountInBase = this.convertAmount(amount, fromCode, this.#baseCurrency);
|
|
131
|
-
return this.convertAmount(amountInBase, this.#baseCurrency, toCode);
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
/**
|
|
135
|
-
* Factory to create the ExchangeRateStore.
|
|
136
|
-
*/
|
|
137
|
-
export function createExchangeRateStore() {
|
|
138
|
-
return new ExchangeRateStore();
|
|
139
|
-
}
|
|
140
|
-
/**
|
|
141
|
-
* Consumer to retrieve the ExchangeRateStore from context.
|
|
142
|
-
*/
|
|
143
|
-
export function getExchangeRateStore() {
|
|
144
|
-
return getContext(RUNE_LAB_CONTEXT.exchangeRate);
|
|
145
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|