rune-lab 0.3.1 → 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 +4 -4
- package/deno.json +50 -0
- package/justfile +5 -0
- package/package.json +3 -80
- 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/src/kernel/src/persistence/provider.ts +58 -0
- 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 +7 -8
- package/{dist/ui/layout → src/runes/layout/src}/ConnectedWorkspaceStrip.svelte +5 -3
- package/src/runes/layout/src/Icon.svelte +7 -0
- package/src/runes/layout/src/LanguageSelector.svelte +45 -0
- package/{dist/ui/layout → src/runes/layout/src}/NavigationPanel.svelte +1 -4
- package/src/runes/layout/src/ResourceSelector.svelte +90 -0
- package/src/runes/layout/src/ThemeSelector.svelte +50 -0
- package/{dist/ui/layout → src/runes/layout/src}/WorkspaceLayout.svelte +13 -3
- 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/src/runes/plugins/money/src/CurrencySelector.svelte +41 -0
- package/src/runes/plugins/money/src/MoneyDisplay.svelte +142 -0
- package/src/runes/plugins/money/src/MoneyInput.svelte +208 -0
- 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/src/runes/plugins/money/src/strategies.ts +95 -0
- 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/index.d.ts +0 -4
- package/dist/core/index.d.ts.map +0 -1
- package/dist/core/index.js +0 -3
- 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/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.d.ts +0 -57
- package/dist/core/money/money.d.ts.map +0 -1
- package/dist/core/money/money.js +0 -132
- 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/index.d.ts +0 -5
- package/dist/index.js +0 -5
- 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 -57
- 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 -15
- package/dist/state/composables/useMoney.js +0 -62
- 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/context.d.ts +0 -14
- package/dist/state/context.js +0 -15
- package/dist/state/createConfigStore.svelte.d.ts +0 -55
- package/dist/state/createConfigStore.svelte.js +0 -61
- package/dist/state/currency.svelte.d.ts +0 -28
- package/dist/state/currency.svelte.js +0 -80
- package/dist/state/daisyui.d.ts +0 -4
- package/dist/state/index.d.ts +0 -19
- package/dist/state/index.js +0 -25
- package/dist/state/language.svelte.d.ts +0 -64
- package/dist/state/language.svelte.js +0 -44
- 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 -73
- 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 -22
- 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 -198
- package/dist/ui/components/RuneProvider.svelte.d.ts +0 -42
- package/dist/ui/components/Toaster.svelte.d.ts +0 -18
- package/dist/ui/components/money/MoneyDisplay.svelte +0 -69
- package/dist/ui/components/money/MoneyDisplay.svelte.d.ts +0 -21
- package/dist/ui/components/money/MoneyDisplay.svelte.test.d.ts +0 -1
- package/dist/ui/components/money/MoneyDisplay.svelte.test.js +0 -74
- package/dist/ui/components/money/MoneyInput.svelte +0 -131
- package/dist/ui/components/money/MoneyInput.svelte.d.ts +0 -25
- 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/AppSettingSelector.svelte.d.ts +0 -13
- package/dist/ui/features/config/CurrencySelector.svelte +0 -67
- package/dist/ui/features/config/CurrencySelector.svelte.d.ts +0 -8
- package/dist/ui/features/config/LanguageSelector.svelte +0 -66
- package/dist/ui/features/config/LanguageSelector.svelte.d.ts +0 -8
- package/dist/ui/features/config/ThemeSelector.svelte +0 -73
- 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/ShortcutPalette.svelte.d.ts +0 -6
- package/dist/ui/index.d.ts +0 -26
- package/dist/ui/index.js +0 -41
- 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 -25
- package/dist/ui/layout/WorkspaceStrip.svelte.d.ts +0 -11
- package/dist/ui/layout/index.d.ts +0 -7
- package/dist/ui/layout/index.js +0 -7
- package/dist/ui/paraglide/README.md +0 -94
- 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 -749
- package/dist/ui/paraglide/runtime.js +0 -1777
- package/dist/ui/paraglide/server.d.ts +0 -103
- package/dist/ui/paraglide/server.js +0 -248
- 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
package/.gitignore
ADDED
package/README.md
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
<h1 align="center">
|
|
2
|
-
<img src="https://raw.githubusercontent.com/Yrrrrrf/rune-lab/main/static/img/rune.png" alt="Rune Lab Icon" width="128" height="128"
|
|
2
|
+
<img src="https://raw.githubusercontent.com/Yrrrrrf/rune-lab/main/src/sdk/ui/static/img/rune.png" alt="Rune Lab Icon" width="128" height="128" descripti``on="Icon representing the Svelte Runes system">
|
|
3
3
|
<div align="center">Rune Lab</div>
|
|
4
4
|
</h1>
|
|
5
5
|
|
|
@@ -69,12 +69,12 @@ Get your application shell running in less than 20 lines. Inside your
|
|
|
69
69
|
import { cookieDriver } from "rune-lab";
|
|
70
70
|
|
|
71
71
|
let { children } = $props();
|
|
72
|
-
|
|
72
|
+
|
|
73
73
|
// Example navigation
|
|
74
74
|
const sections = [{ id: "main", title: "Main", items: [{ id: "home", label: "Home" }] }];
|
|
75
75
|
</script>
|
|
76
76
|
|
|
77
|
-
<RuneProvider
|
|
77
|
+
<RuneProvider
|
|
78
78
|
app={{ name: "My App", version: "1.0.0" }}
|
|
79
79
|
persistence={cookieDriver}
|
|
80
80
|
>
|
|
@@ -232,7 +232,7 @@ register them inside an `$effect` returning a cleanup function**:
|
|
|
232
232
|
```svelte
|
|
233
233
|
<script lang="ts">
|
|
234
234
|
import { getShortcutStore, getToastStore } from "rune-lab";
|
|
235
|
-
|
|
235
|
+
|
|
236
236
|
const shortcuts = getShortcutStore();
|
|
237
237
|
const toasts = getToastStore();
|
|
238
238
|
|
package/deno.json
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@yrrrrrf/rune-lab",
|
|
3
|
+
"version": "0.4.1",
|
|
4
|
+
"description": "Modern toolkit for Svelte 5 Runes applications.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"readme": "./README.md",
|
|
8
|
+
"author": "Fernando Bryan Reza Campos",
|
|
9
|
+
"repository": {
|
|
10
|
+
"type": "git",
|
|
11
|
+
"url": "git+https://github.com/Yrrrrrf/rune-lab.git"
|
|
12
|
+
},
|
|
13
|
+
"exports": {
|
|
14
|
+
".": "./src/mod.ts"
|
|
15
|
+
},
|
|
16
|
+
"nodeModulesDir": "manual",
|
|
17
|
+
"workspace": [
|
|
18
|
+
"./src/kernel",
|
|
19
|
+
"./src/runes/layout",
|
|
20
|
+
"./src/runes/palettes",
|
|
21
|
+
"./src/runes/plugins/money"
|
|
22
|
+
],
|
|
23
|
+
"tasks": {
|
|
24
|
+
"i18n": "paraglide-js compile --project ./src/i18n/project.inlang --outdir ./src/i18n/paraglide"
|
|
25
|
+
},
|
|
26
|
+
"imports": {
|
|
27
|
+
"@rune-lab/core": "./src/mod.ts",
|
|
28
|
+
"@rune-lab/i18n/": "./src/i18n/",
|
|
29
|
+
"typescript": "npm:typescript@5.9.3",
|
|
30
|
+
"@tailwindcss/vite": "npm:@tailwindcss/vite",
|
|
31
|
+
"esm-env": "npm:esm-env",
|
|
32
|
+
"vite": "npm:vite",
|
|
33
|
+
"vite-plus": "npm:vite-plus",
|
|
34
|
+
"daisyui/": "npm:daisyui/",
|
|
35
|
+
"hotkeys-js": "npm:hotkeys-js",
|
|
36
|
+
"@inlang/paraglide-js": "npm:@inlang/paraglide-js",
|
|
37
|
+
"svelte": "npm:svelte",
|
|
38
|
+
"@sveltejs/kit": "npm:@sveltejs/kit",
|
|
39
|
+
"@sveltejs/vite-plugin-svelte": "npm:@sveltejs/vite-plugin-svelte",
|
|
40
|
+
"@sveltejs/adapter-static": "npm:@sveltejs/adapter-static",
|
|
41
|
+
"jsdom": "npm:jsdom",
|
|
42
|
+
"@testing-library/jest-dom": "npm:@testing-library/jest-dom"
|
|
43
|
+
},
|
|
44
|
+
"exclude": [
|
|
45
|
+
"scripts/**",
|
|
46
|
+
"dist/**",
|
|
47
|
+
".old/**",
|
|
48
|
+
"**/*.test.ts"
|
|
49
|
+
]
|
|
50
|
+
}
|
package/justfile
ADDED
package/package.json
CHANGED
|
@@ -1,82 +1,5 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "rune-lab",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"
|
|
5
|
-
|
|
6
|
-
"license": "MIT",
|
|
7
|
-
"author": "Fernando Bryan Reza Campos",
|
|
8
|
-
"repository": {
|
|
9
|
-
"type": "git",
|
|
10
|
-
"url": "git+https://github.com/Yrrrrrf/rune-lab.git"
|
|
11
|
-
},
|
|
12
|
-
"scripts": {
|
|
13
|
-
"dev:ui": "bun run --cwd src/sdk/ui dev",
|
|
14
|
-
"build:ui": "bun run --cwd src/sdk/ui build",
|
|
15
|
-
"compile:i18n": "paraglide-js compile --project ./src/sdk/ui/src/i18n/project.inlang --outdir ./src/sdk/ui/src/lib/paraglide",
|
|
16
|
-
"build:index": "bun run scripts/build-index.js"
|
|
17
|
-
},
|
|
18
|
-
"workspaces": [
|
|
19
|
-
"src/sdk/*"
|
|
20
|
-
],
|
|
21
|
-
"files": [
|
|
22
|
-
"dist"
|
|
23
|
-
],
|
|
24
|
-
"exports": {
|
|
25
|
-
".": {
|
|
26
|
-
"types": "./dist/index.d.ts",
|
|
27
|
-
"svelte": "./dist/index.js",
|
|
28
|
-
"default": "./dist/index.js"
|
|
29
|
-
},
|
|
30
|
-
"./ui": {
|
|
31
|
-
"types": "./dist/ui/index.d.ts",
|
|
32
|
-
"svelte": "./dist/ui/index.js",
|
|
33
|
-
"default": "./dist/ui/index.js"
|
|
34
|
-
},
|
|
35
|
-
"./core": {
|
|
36
|
-
"types": "./dist/core/index.d.ts",
|
|
37
|
-
"default": "./dist/core/index.js"
|
|
38
|
-
},
|
|
39
|
-
"./state": {
|
|
40
|
-
"types": "./dist/state/index.d.ts",
|
|
41
|
-
"default": "./dist/state/index.js"
|
|
42
|
-
},
|
|
43
|
-
"./package.json": "./package.json"
|
|
44
|
-
},
|
|
45
|
-
"peerDependencies": {
|
|
46
|
-
"svelte": "^5.54.1",
|
|
47
|
-
"tailwindcss": "^4.2.2",
|
|
48
|
-
"daisyui": "^5.5.19",
|
|
49
|
-
"dinero.js": "npm:dinero.js@^2.0.2",
|
|
50
|
-
"better-auth": "^1.5.5"
|
|
51
|
-
},
|
|
52
|
-
"peerDependenciesMeta": {
|
|
53
|
-
"better-auth": {
|
|
54
|
-
"optional": true
|
|
55
|
-
}
|
|
56
|
-
},
|
|
57
|
-
"dependencies": {
|
|
58
|
-
"gwa": "^0.0.1",
|
|
59
|
-
"hotkeys-js": "npm:hotkeys-js@^4.0.2"
|
|
60
|
-
},
|
|
61
|
-
"devDependencies": {
|
|
62
|
-
"@inlang/paraglide-js": "npm:@inlang/paraglide-js@^2.15.1",
|
|
63
|
-
"@internal/core": "0.2.0",
|
|
64
|
-
"@internal/state": "0.2.0",
|
|
65
|
-
"@internal/ui": "0.2.0",
|
|
66
|
-
"@sveltejs/adapter-static": "npm:@sveltejs/adapter-static@^3.0.10",
|
|
67
|
-
"@sveltejs/kit": "npm:@sveltejs/kit@^2.55.0",
|
|
68
|
-
"@sveltejs/package": "^2.5.7",
|
|
69
|
-
"@sveltejs/vite-plugin-svelte": "npm:@sveltejs/vite-plugin-svelte@^7.0.0",
|
|
70
|
-
"@tailwindcss/forms": "npm:@tailwindcss/forms@^0.5.11",
|
|
71
|
-
"@tailwindcss/typography": "npm:@tailwindcss/typography@^0.5.19",
|
|
72
|
-
"@tailwindcss/vite": "npm:@tailwindcss/vite@^4.2.2",
|
|
73
|
-
"@testing-library/jest-dom": "^6.9.1",
|
|
74
|
-
"@testing-library/svelte": "^5.3.1",
|
|
75
|
-
"jsdom": "^29.0.1",
|
|
76
|
-
"publint": "^0.3.18",
|
|
77
|
-
"svelte-check": "npm:svelte-check@^4.4.5",
|
|
78
|
-
"typescript": "npm:typescript@^5.9.3",
|
|
79
|
-
"vite": "npm:vite@^8.0.1",
|
|
80
|
-
"vitest": "^4.1.0"
|
|
81
|
-
}
|
|
82
|
-
}
|
|
3
|
+
"version": "0.4.1",
|
|
4
|
+
"packageManager": "pnpm@10.33.0"
|
|
5
|
+
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
// scripts/build_pkg.ts
|
|
2
|
+
import denoConfig from "../deno.json" with { type: "json" };
|
|
3
|
+
|
|
4
|
+
// ── 1. Restructure: move dist/* → dist/src/ ──────────────────────────────────
|
|
5
|
+
await Deno.mkdir("./dist/src", { recursive: true });
|
|
6
|
+
for await (const entry of Deno.readDir("./dist")) {
|
|
7
|
+
if (entry.name === "src") continue;
|
|
8
|
+
await Deno.rename(`./dist/${entry.name}`, `./dist/src/${entry.name}`);
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
// Clean up any stray deno.ts artifact
|
|
12
|
+
try {
|
|
13
|
+
await Deno.remove("./dist/src/deno.ts");
|
|
14
|
+
} catch { /* already gone */ }
|
|
15
|
+
|
|
16
|
+
// ── 2. Generate dist/deno.json (standalone — no workspace members) ────────────
|
|
17
|
+
const denoDistConfig = {
|
|
18
|
+
name: denoConfig.name,
|
|
19
|
+
version: denoConfig.version,
|
|
20
|
+
description: denoConfig.description,
|
|
21
|
+
license: denoConfig.license,
|
|
22
|
+
exports: { ".": "./src/mod.ts" },
|
|
23
|
+
repository: denoConfig.repository,
|
|
24
|
+
};
|
|
25
|
+
await Deno.writeTextFile(
|
|
26
|
+
"./dist/deno.json",
|
|
27
|
+
JSON.stringify(denoDistConfig, null, 2),
|
|
28
|
+
);
|
|
29
|
+
|
|
30
|
+
// ── 3. Generate dist/package.json (derived from deno.json) ───────────────────
|
|
31
|
+
const pkg = {
|
|
32
|
+
name: "rune-lab",
|
|
33
|
+
version: denoConfig.version,
|
|
34
|
+
description: denoConfig.description,
|
|
35
|
+
type: "module",
|
|
36
|
+
exports: { ".": "./src/mod.ts" },
|
|
37
|
+
license: denoConfig.license,
|
|
38
|
+
repository: denoConfig.repository,
|
|
39
|
+
peerDependencies: {
|
|
40
|
+
"svelte": "^5.0.0",
|
|
41
|
+
"@inlang/paraglide-js": "^2.0.0",
|
|
42
|
+
},
|
|
43
|
+
keywords: ["svelte", "svelte-5", "runes", "ui", "components"],
|
|
44
|
+
};
|
|
45
|
+
await Deno.writeTextFile("./dist/package.json", JSON.stringify(pkg, null, 2));
|
|
46
|
+
|
|
47
|
+
// ── 4. Copy metadata ──────────────────────────────────────────────────────────
|
|
48
|
+
await Deno.copyFile("README.md", "./dist/README.md");
|
|
49
|
+
await Deno.copyFile("LICENSE", "./dist/LICENSE");
|
|
50
|
+
|
|
51
|
+
console.log(`dist/ (v${denoConfig.version})`);
|
package/scripts/ci.just
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
[doc('Format Client code')]
|
|
2
|
+
[group('CI')]
|
|
3
|
+
fmt:
|
|
4
|
+
deno fmt .
|
|
5
|
+
@echo "✓ Client code formatted"
|
|
6
|
+
|
|
7
|
+
[doc('Lint Client code')]
|
|
8
|
+
[group('CI')]
|
|
9
|
+
lint:
|
|
10
|
+
deno lint .
|
|
11
|
+
@echo "✓ Client code linted"
|
|
12
|
+
|
|
13
|
+
[doc('Type-check Client workspace')]
|
|
14
|
+
[group('CI')]
|
|
15
|
+
typecheck:
|
|
16
|
+
# check ts types with strict deno.ns
|
|
17
|
+
deno check .
|
|
18
|
+
# check svelte types
|
|
19
|
+
deno run -A npm:svelte-check
|
|
20
|
+
# todo: Maybe change this to a vp command
|
|
21
|
+
@echo "✓ Client type-checked"
|
|
22
|
+
|
|
23
|
+
[doc('Full client quality gate')]
|
|
24
|
+
[group('CI')]
|
|
25
|
+
quality: fmt lint typecheck
|
|
26
|
+
@echo "✓ Client quality checks passed"
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
[doc('Build Client')]
|
|
2
|
+
[group('Build')]
|
|
3
|
+
build:
|
|
4
|
+
# * Clean up previous build
|
|
5
|
+
rm -rf dist/
|
|
6
|
+
# * Build library using vite-plus
|
|
7
|
+
vp build
|
|
8
|
+
# * Build ESM package
|
|
9
|
+
deno run -A scripts/build_pkg.ts
|
|
10
|
+
@echo "✓ build done"
|
|
11
|
+
|
|
12
|
+
[doc('Publish to jsr')]
|
|
13
|
+
[group('Deploy')]
|
|
14
|
+
deploy: build
|
|
15
|
+
# * Format build output
|
|
16
|
+
deno fmt --no-config dist
|
|
17
|
+
# # * Build npm package
|
|
18
|
+
# deno task build:npm
|
|
19
|
+
# # * Publish to jsr
|
|
20
|
+
# deno publish
|
|
21
|
+
@echo "✓ deploy done"
|
package/scripts/dev.just
ADDED
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
# inject.just — surgical local rune-lab injection
|
|
2
|
+
#
|
|
3
|
+
# ⚠ IMPORTANT: `just -f` changes cwd to the justfile's directory.
|
|
4
|
+
# Never pass `.` as dest — pass $PWD or an absolute path instead.
|
|
5
|
+
#
|
|
6
|
+
# Usage:
|
|
7
|
+
# just -f ~/rune-lab/scripts/inject.just inject $PWD
|
|
8
|
+
# just -f ~/rune-lab/scripts/inject.just inject /absolute/path/to/project
|
|
9
|
+
# just -f ~/rune-lab/scripts/inject.just inject-clean $PWD
|
|
10
|
+
#
|
|
11
|
+
# Recipes:
|
|
12
|
+
# inject — build rune-lab, then hot-swap node_modules/rune-lab
|
|
13
|
+
# inject-clean — full dep reset (yog reborn --deep), then inject
|
|
14
|
+
# ─────────────────────────────────────────────────────────────────────────────
|
|
15
|
+
|
|
16
|
+
# Hot-swap: rebuild rune-lab and inject into <dest>/node_modules/rune-lab
|
|
17
|
+
inject dest: _build-for-inject
|
|
18
|
+
#!/usr/bin/env bash
|
|
19
|
+
set -euo pipefail
|
|
20
|
+
|
|
21
|
+
dest_abs="{{ dest }}"
|
|
22
|
+
|
|
23
|
+
# Reject relative paths — they resolve to rune-lab's own dir, not the caller's
|
|
24
|
+
if [[ "$dest_abs" != /* ]]; then
|
|
25
|
+
echo "❌ dest must be an absolute path."
|
|
26
|
+
echo " Call with: just -f ... inject \$PWD"
|
|
27
|
+
echo " Got: $dest_abs"
|
|
28
|
+
exit 1
|
|
29
|
+
fi
|
|
30
|
+
|
|
31
|
+
if [ ! -d "$dest_abs/node_modules" ]; then
|
|
32
|
+
echo "❌ No node_modules/ found in $dest_abs"
|
|
33
|
+
echo " Run your package manager's install first, then retry."
|
|
34
|
+
exit 1
|
|
35
|
+
fi
|
|
36
|
+
|
|
37
|
+
echo "🗑 Removing stale $dest_abs/node_modules/rune-lab..."
|
|
38
|
+
rm -rf "$dest_abs/node_modules/rune-lab"
|
|
39
|
+
|
|
40
|
+
echo "📦 Copying local dist into $dest_abs/node_modules/rune-lab..."
|
|
41
|
+
mkdir -p "$dest_abs/node_modules/rune-lab"
|
|
42
|
+
cp -r "{{ justfile_directory() }}/../dist" "$dest_abs/node_modules/rune-lab/dist"
|
|
43
|
+
cp "{{ justfile_directory() }}/../package.json" "$dest_abs/node_modules/rune-lab/package.json"
|
|
44
|
+
|
|
45
|
+
echo "✅ Done! node_modules/rune-lab → $(du -sh $dest_abs/node_modules/rune-lab | cut -f1)"
|
|
46
|
+
echo " Source: {{ justfile_directory() }}/../dist"
|
|
47
|
+
echo " Target: $dest_abs/node_modules/rune-lab"
|
|
48
|
+
|
|
49
|
+
# Full reset: nuke deps in <dest>, reinstall, then hot-swap rune-lab
|
|
50
|
+
inject-clean dest: _build-for-inject
|
|
51
|
+
#!/usr/bin/env bash
|
|
52
|
+
set -euo pipefail
|
|
53
|
+
|
|
54
|
+
dest_abs="{{ dest }}"
|
|
55
|
+
|
|
56
|
+
if [[ "$dest_abs" != /* ]]; then
|
|
57
|
+
echo "❌ dest must be an absolute path. Call with: just -f ... inject-clean \$PWD"
|
|
58
|
+
exit 1
|
|
59
|
+
fi
|
|
60
|
+
|
|
61
|
+
echo "💀 Running yog reborn --deep in $dest_abs..."
|
|
62
|
+
(cd "$dest_abs" && yog reborn --deep)
|
|
63
|
+
|
|
64
|
+
just -f "{{ justfile_directory() }}/inject.just" inject "$dest_abs"
|
|
65
|
+
|
|
66
|
+
# ── Internal ──────────────────────────────────────────────────────────────────
|
|
67
|
+
|
|
68
|
+
[private]
|
|
69
|
+
_build-for-inject:
|
|
70
|
+
@echo "🔨 Building rune-lab from {{ justfile_directory() }}/.."
|
|
71
|
+
just --justfile "{{ justfile_directory() }}/../justfile" --working-directory "{{ justfile_directory() }}/.." build
|
|
72
|
+
@echo "✅ rune-lab built."
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { setContext, untrack, type Snippet, onMount, type Component } from "svelte";
|
|
3
|
+
import {
|
|
4
|
+
RUNE_LAB_CONTEXT,
|
|
5
|
+
localStorageDriver,
|
|
6
|
+
initializeStores,
|
|
7
|
+
defineRune,
|
|
8
|
+
} from "@rune-lab/kernel";
|
|
9
|
+
import type { PersistenceDriver, RunePlugin } from "@rune-lab/kernel";
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Namespaced configuration for Rune Lab plugins.
|
|
13
|
+
* Keyed by plugin.id.
|
|
14
|
+
*/
|
|
15
|
+
export interface RuneLabConfig {
|
|
16
|
+
persistence?: PersistenceDriver;
|
|
17
|
+
/** Optional head management properties */
|
|
18
|
+
favicon?: string;
|
|
19
|
+
manageHead?: boolean;
|
|
20
|
+
icons?: "material" | "none";
|
|
21
|
+
/** Namespaced config for plugins */
|
|
22
|
+
[pluginId: string]: unknown;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
let { children, config = {}, plugins = [] } = $props<{
|
|
26
|
+
children: Snippet;
|
|
27
|
+
config?: RuneLabConfig;
|
|
28
|
+
plugins?: RunePlugin[];
|
|
29
|
+
}>();
|
|
30
|
+
|
|
31
|
+
const initialPlugins = untrack(() => plugins);
|
|
32
|
+
const initialPersistence = untrack(() => config.persistence ?? localStorageDriver);
|
|
33
|
+
|
|
34
|
+
// 1. Register all plugins
|
|
35
|
+
// Note: defineRune maps each slot into the STORE_REGISTRY
|
|
36
|
+
untrack(() => {
|
|
37
|
+
for (const plugin of initialPlugins) {
|
|
38
|
+
defineRune(plugin);
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
// 2. Initialize all stores via the registry's topological sort
|
|
43
|
+
const stores = initializeStores(
|
|
44
|
+
initialPlugins,
|
|
45
|
+
untrack(() => config as Record<string, unknown>),
|
|
46
|
+
initialPersistence
|
|
47
|
+
);
|
|
48
|
+
|
|
49
|
+
// 3. Provide all stores as context
|
|
50
|
+
// We iterate ALL registered plugins to find the context keys for their slots
|
|
51
|
+
for (const plugin of initialPlugins) {
|
|
52
|
+
for (const slot of plugin.stores) {
|
|
53
|
+
const store = stores.get(slot.id);
|
|
54
|
+
if (store) {
|
|
55
|
+
setContext(slot.contextKey, store);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// Also provide the persistence driver itself
|
|
61
|
+
setContext(RUNE_LAB_CONTEXT.persistence, initialPersistence);
|
|
62
|
+
|
|
63
|
+
// 4. Collect all overlays
|
|
64
|
+
const allOverlays = $derived(plugins.flatMap(p => p.overlays ?? []) as Component<Record<never, never>>[]);
|
|
65
|
+
|
|
66
|
+
// ── Initialization for layout ──────────────────────────
|
|
67
|
+
const appStore = stores.get("app") as any;
|
|
68
|
+
const layoutStore = stores.get("layout") as any;
|
|
69
|
+
|
|
70
|
+
onMount(() => {
|
|
71
|
+
if (layoutStore) layoutStore.init();
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
// Meta tags derived from app store state
|
|
75
|
+
const metaTags = $derived(appStore ? [
|
|
76
|
+
{ name: "description", content: appStore.description },
|
|
77
|
+
{ name: "author", content: appStore.author },
|
|
78
|
+
] : []);
|
|
79
|
+
</script>
|
|
80
|
+
|
|
81
|
+
<svelte:head>
|
|
82
|
+
{#if config.manageHead !== false && appStore}
|
|
83
|
+
<title>{appStore.name}</title>
|
|
84
|
+
{#if config.favicon}
|
|
85
|
+
<link rel="icon" href={config.favicon} />
|
|
86
|
+
{/if}
|
|
87
|
+
{#each metaTags as meta}
|
|
88
|
+
<meta name={meta.name} content={meta.content} />
|
|
89
|
+
{/each}
|
|
90
|
+
{#if config.icons === "material"}
|
|
91
|
+
<link
|
|
92
|
+
rel="stylesheet"
|
|
93
|
+
href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@20..48,100..700,0..1,-50..200"
|
|
94
|
+
/>
|
|
95
|
+
{/if}
|
|
96
|
+
{/if}
|
|
97
|
+
</svelte:head>
|
|
98
|
+
|
|
99
|
+
<!-- Plugin Overlays -->
|
|
100
|
+
{#each allOverlays as Overlay}
|
|
101
|
+
<Overlay />
|
|
102
|
+
{/each}
|
|
103
|
+
|
|
104
|
+
<!-- Render Children -->
|
|
105
|
+
{@render children()}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { describe, expect, it, vi } from "vite-plus/test";
|
|
2
|
+
|
|
3
|
+
// Mock esm-env before importing the module
|
|
4
|
+
vi.mock("esm-env", () => ({ DEV: true }));
|
|
5
|
+
|
|
6
|
+
import {
|
|
7
|
+
batchResolveMessages,
|
|
8
|
+
createMessageResolver,
|
|
9
|
+
hasMessage,
|
|
10
|
+
} from "./message-resolver.ts";
|
|
11
|
+
|
|
12
|
+
describe("MessageResolver", () => {
|
|
13
|
+
const mockMessages = {
|
|
14
|
+
usd: () => "US Dollar",
|
|
15
|
+
eur: () => "Euro",
|
|
16
|
+
mxn: () => "Mexican Peso",
|
|
17
|
+
jpy: () => "Japanese Yen",
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
describe("createMessageResolver", () => {
|
|
21
|
+
it("should resolve a key via keyExtractor", () => {
|
|
22
|
+
const resolver = createMessageResolver<{ code: string }>(mockMessages, {
|
|
23
|
+
keyExtractor: (opt) => opt.code,
|
|
24
|
+
keyTransformer: (key) => key.toLowerCase(),
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
expect(resolver({ code: "USD" })).toBe("US Dollar");
|
|
28
|
+
expect(resolver({ code: "EUR" })).toBe("Euro");
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
it("should use untransformed key when no transformer provided", () => {
|
|
32
|
+
const resolver = createMessageResolver<{ code: string }>(mockMessages, {
|
|
33
|
+
keyExtractor: (opt) => opt.code,
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
// Without transformer, keys must match exactly
|
|
37
|
+
expect(resolver({ code: "usd" })).toBe("US Dollar");
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
it("should fall back to the raw key for missing translations", () => {
|
|
41
|
+
const warnSpy = vi.spyOn(console, "warn").mockImplementation(() => {});
|
|
42
|
+
|
|
43
|
+
const resolver = createMessageResolver<{ code: string }>(mockMessages, {
|
|
44
|
+
keyExtractor: (opt) => opt.code,
|
|
45
|
+
keyTransformer: (key) => key.toLowerCase(),
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
const result = resolver({ code: "UNKNOWN" });
|
|
49
|
+
expect(result).toBe("UNKNOWN"); // falls back to original key
|
|
50
|
+
expect(warnSpy).toHaveBeenCalledWith(
|
|
51
|
+
expect.stringContaining("Missing translation"),
|
|
52
|
+
);
|
|
53
|
+
|
|
54
|
+
warnSpy.mockRestore();
|
|
55
|
+
});
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
describe("hasMessage", () => {
|
|
59
|
+
it("should return true for existing keys", () => {
|
|
60
|
+
expect(hasMessage(mockMessages, "usd")).toBe(true);
|
|
61
|
+
expect(hasMessage(mockMessages, "eur")).toBe(true);
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
it("should return false for missing keys", () => {
|
|
65
|
+
expect(hasMessage(mockMessages, "UNKNOWN")).toBe(false);
|
|
66
|
+
expect(hasMessage(mockMessages, "")).toBe(false);
|
|
67
|
+
});
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
describe("batchResolveMessages", () => {
|
|
71
|
+
it("should resolve all options at once", () => {
|
|
72
|
+
const options = [{ code: "USD" }, { code: "EUR" }, { code: "MXN" }];
|
|
73
|
+
|
|
74
|
+
const result = batchResolveMessages(mockMessages, options, {
|
|
75
|
+
keyExtractor: (opt) => opt.code,
|
|
76
|
+
keyTransformer: (key) => key.toLowerCase(),
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
expect(result).toEqual({
|
|
80
|
+
USD: "US Dollar",
|
|
81
|
+
EUR: "Euro",
|
|
82
|
+
MXN: "Mexican Peso",
|
|
83
|
+
});
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
it("should include fallback values for missing keys", () => {
|
|
87
|
+
vi.spyOn(console, "warn").mockImplementation(() => {});
|
|
88
|
+
|
|
89
|
+
const options = [{ code: "USD" }, { code: "XYZ" }];
|
|
90
|
+
const result = batchResolveMessages(mockMessages, options, {
|
|
91
|
+
keyExtractor: (opt) => opt.code,
|
|
92
|
+
keyTransformer: (key) => key.toLowerCase(),
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
expect(result).toEqual({
|
|
96
|
+
USD: "US Dollar",
|
|
97
|
+
XYZ: "XYZ", // fallback
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
vi.restoreAllMocks();
|
|
101
|
+
});
|
|
102
|
+
});
|
|
103
|
+
});
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
// sdk/devtools/src/patterns/message-resolver.ts
|
|
2
|
+
import { DEV } from "esm-env";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Dynamic i18n Message Resolver Pattern
|
|
6
|
+
*
|
|
7
|
+
* Enables dynamic message function calls for config selectors.
|
|
8
|
+
* Creates a resolver that dynamically looks up and calls message functions.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
type MessageBundle = Record<string, (...args: unknown[]) => string>;
|
|
12
|
+
|
|
13
|
+
interface MessageResolverConfig<T> {
|
|
14
|
+
/**
|
|
15
|
+
* Function to extract the message key from an option
|
|
16
|
+
* @example (currency) => currency.code // "USD"
|
|
17
|
+
*/
|
|
18
|
+
keyExtractor: (option: T) => string;
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Optional transformer for the key before message lookup
|
|
22
|
+
* @example (key) => key.toLowerCase() // "USD" -> "usd"
|
|
23
|
+
*/
|
|
24
|
+
keyTransformer?: (key: string) => string;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Creates a message resolver function for dynamic i18n lookups
|
|
29
|
+
*
|
|
30
|
+
* @example
|
|
31
|
+
* ```typescript
|
|
32
|
+
* const getCurrencyLabel = createMessageResolver<Currency>(m, {
|
|
33
|
+
* keyExtractor: (currency) => currency.code
|
|
34
|
+
* });
|
|
35
|
+
*
|
|
36
|
+
* getCurrencyLabel({ code: "EUR", symbol: "€" }); // "Euro"
|
|
37
|
+
* ```
|
|
38
|
+
*/
|
|
39
|
+
export function createMessageResolver<T>(
|
|
40
|
+
messages: MessageBundle,
|
|
41
|
+
config: MessageResolverConfig<T>,
|
|
42
|
+
) {
|
|
43
|
+
return (option: T): string => {
|
|
44
|
+
const key = config.keyExtractor(option);
|
|
45
|
+
const transformedKey = config.keyTransformer
|
|
46
|
+
? config.keyTransformer(key)
|
|
47
|
+
: key;
|
|
48
|
+
|
|
49
|
+
const messageFn = messages[transformedKey];
|
|
50
|
+
|
|
51
|
+
if (!messageFn || typeof messageFn !== "function") {
|
|
52
|
+
if (DEV) {
|
|
53
|
+
console.warn(
|
|
54
|
+
`[MessageResolver] Missing translation for key: "${transformedKey}"`,
|
|
55
|
+
);
|
|
56
|
+
}
|
|
57
|
+
return key; // Fallback to key
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
return messageFn();
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Type guard to check if a message key exists
|
|
66
|
+
*/
|
|
67
|
+
export function hasMessage(messages: MessageBundle, key: string): boolean {
|
|
68
|
+
return key in messages && typeof messages[key] === "function";
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* Batch resolver for multiple options at once
|
|
73
|
+
*/
|
|
74
|
+
export function batchResolveMessages<T>(
|
|
75
|
+
messages: MessageBundle,
|
|
76
|
+
options: T[],
|
|
77
|
+
config: MessageResolverConfig<T>,
|
|
78
|
+
): Record<string, string> {
|
|
79
|
+
const resolver = createMessageResolver(messages, config);
|
|
80
|
+
|
|
81
|
+
return options.reduce(
|
|
82
|
+
(acc, option) => {
|
|
83
|
+
const key = config.keyExtractor(option);
|
|
84
|
+
acc[key] = resolver(option);
|
|
85
|
+
return acc;
|
|
86
|
+
},
|
|
87
|
+
{} as Record<string, string>,
|
|
88
|
+
);
|
|
89
|
+
}
|