@turnipxenon/pineapple 4.5.1 → 5.0.0-alpha.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/dist/api/GetLatestBlogs.d.ts +1 -0
- package/dist/api/GetLatestBlogs.d.ts.map +1 -0
- package/dist/api/index.d.ts +1 -0
- package/dist/api/index.d.ts.map +1 -0
- package/dist/assets/icons/icon-visibility.svg +1 -0
- package/dist/components/dialog_manager/DialogManager.d.ts +2 -0
- package/dist/components/dialog_manager/DialogManager.d.ts.map +1 -0
- package/dist/components/dialog_manager/DialogManager.js +15 -9
- package/dist/components/dialog_manager/DialogManagerStore.d.ts +5 -1
- package/dist/components/dialog_manager/DialogManagerStore.d.ts.map +1 -0
- package/dist/components/dialog_manager/DialogManagerStore.js +5 -1
- package/dist/components/dialog_manager/DialogProcessor.d.ts +1 -0
- package/dist/components/dialog_manager/DialogProcessor.d.ts.map +1 -0
- package/dist/components/dialog_manager/DialogUtils.d.ts +1 -0
- package/dist/components/dialog_manager/DialogUtils.d.ts.map +1 -0
- package/dist/components/dialog_manager/IDialogManager.d.ts +1 -0
- package/dist/components/dialog_manager/IDialogManager.d.ts.map +1 -0
- package/dist/components/dialog_manager/behavior_tree/core/BTreeUtils.d.ts +1 -0
- package/dist/components/dialog_manager/behavior_tree/core/BTreeUtils.d.ts.map +1 -0
- package/dist/components/dialog_manager/behavior_tree/core/BaseBehaviorResult.d.ts +1 -0
- package/dist/components/dialog_manager/behavior_tree/core/BaseBehaviorResult.d.ts.map +1 -0
- package/dist/components/dialog_manager/behavior_tree/core/BehaviorNode.d.ts +1 -0
- package/dist/components/dialog_manager/behavior_tree/core/BehaviorNode.d.ts.map +1 -0
- package/dist/components/dialog_manager/behavior_tree/core/BehaviorStatus.d.ts +1 -0
- package/dist/components/dialog_manager/behavior_tree/core/BehaviorStatus.d.ts.map +1 -0
- package/dist/components/dialog_manager/behavior_tree/core/SelectorNode.d.ts +1 -0
- package/dist/components/dialog_manager/behavior_tree/core/SelectorNode.d.ts.map +1 -0
- package/dist/components/dialog_manager/behavior_tree/expression/ExpressionArguments.d.ts +1 -0
- package/dist/components/dialog_manager/behavior_tree/expression/ExpressionArguments.d.ts.map +1 -0
- package/dist/components/dialog_manager/behavior_tree/expression/ExpressionBehaviorNode.d.ts +1 -0
- package/dist/components/dialog_manager/behavior_tree/expression/ExpressionBehaviorNode.d.ts.map +1 -0
- package/dist/components/dialog_manager/behavior_tree/expression/ExpressionEvaluator.d.ts +1 -0
- package/dist/components/dialog_manager/behavior_tree/expression/ExpressionEvaluator.d.ts.map +1 -0
- package/dist/components/dialog_manager/behavior_tree/expression/ExpressionResult.d.ts +1 -0
- package/dist/components/dialog_manager/behavior_tree/expression/ExpressionResult.d.ts.map +1 -0
- package/dist/components/dialog_manager/behavior_tree/expression/ExpressionSelectorNode.d.ts +1 -0
- package/dist/components/dialog_manager/behavior_tree/expression/ExpressionSelectorNode.d.ts.map +1 -0
- package/dist/components/dialog_manager/behavior_tree/expression/ExpressionState.d.ts +1 -0
- package/dist/components/dialog_manager/behavior_tree/expression/ExpressionState.d.ts.map +1 -0
- package/dist/components/dialog_manager/behavior_tree/expression/OperandNode.d.ts +1 -0
- package/dist/components/dialog_manager/behavior_tree/expression/OperandNode.d.ts.map +1 -0
- package/dist/components/dialog_manager/behavior_tree/expression/OperatorNode.d.ts +1 -0
- package/dist/components/dialog_manager/behavior_tree/expression/OperatorNode.d.ts.map +1 -0
- package/dist/components/dialog_manager/behavior_tree/expression/commands/CommandExpressionNode.d.ts +1 -0
- package/dist/components/dialog_manager/behavior_tree/expression/commands/CommandExpressionNode.d.ts.map +1 -0
- package/dist/components/dialog_manager/behavior_tree/expression/commands/CommandLogicNode.d.ts +1 -0
- package/dist/components/dialog_manager/behavior_tree/expression/commands/CommandLogicNode.d.ts.map +1 -0
- package/dist/components/dialog_manager/behavior_tree/expression/commands/CommandMap.d.ts +1 -0
- package/dist/components/dialog_manager/behavior_tree/expression/commands/CommandMap.d.ts.map +1 -0
- package/dist/components/dialog_manager/behavior_tree/expression/commands/RandomRangeCommand.d.ts +1 -0
- package/dist/components/dialog_manager/behavior_tree/expression/commands/RandomRangeCommand.d.ts.map +1 -0
- package/dist/components/dialog_manager/behavior_tree/expression/commands/VisitedCommand.d.ts +1 -0
- package/dist/components/dialog_manager/behavior_tree/expression/commands/VisitedCommand.d.ts.map +1 -0
- package/dist/components/dialog_manager/behavior_tree/expression/commands/VisitedCountCommand.d.ts +1 -0
- package/dist/components/dialog_manager/behavior_tree/expression/commands/VisitedCountCommand.d.ts.map +1 -0
- package/dist/components/dialog_manager/behavior_tree/expression/operators/AndOperator.d.ts +1 -0
- package/dist/components/dialog_manager/behavior_tree/expression/operators/AndOperator.d.ts.map +1 -0
- package/dist/components/dialog_manager/behavior_tree/expression/operators/EqualityOperator.d.ts +1 -0
- package/dist/components/dialog_manager/behavior_tree/expression/operators/EqualityOperator.d.ts.map +1 -0
- package/dist/components/dialog_manager/behavior_tree/expression/operators/GreaterThanEqualOperator.d.ts +1 -0
- package/dist/components/dialog_manager/behavior_tree/expression/operators/GreaterThanEqualOperator.d.ts.map +1 -0
- package/dist/components/dialog_manager/behavior_tree/expression/operators/GreaterThanOperator.d.ts +1 -0
- package/dist/components/dialog_manager/behavior_tree/expression/operators/GreaterThanOperator.d.ts.map +1 -0
- package/dist/components/dialog_manager/behavior_tree/expression/operators/InequalityOperator.d.ts +1 -0
- package/dist/components/dialog_manager/behavior_tree/expression/operators/InequalityOperator.d.ts.map +1 -0
- package/dist/components/dialog_manager/behavior_tree/expression/operators/LessThanEqualOperator.d.ts +1 -0
- package/dist/components/dialog_manager/behavior_tree/expression/operators/LessThanEqualOperator.d.ts.map +1 -0
- package/dist/components/dialog_manager/behavior_tree/expression/operators/LessThanOperator.d.ts +1 -0
- package/dist/components/dialog_manager/behavior_tree/expression/operators/LessThanOperator.d.ts.map +1 -0
- package/dist/components/dialog_manager/behavior_tree/expression/operators/NegationOperator.d.ts +1 -0
- package/dist/components/dialog_manager/behavior_tree/expression/operators/NegationOperator.d.ts.map +1 -0
- package/dist/components/dialog_manager/behavior_tree/expression/operators/OperatorLogicNode.d.ts +1 -0
- package/dist/components/dialog_manager/behavior_tree/expression/operators/OperatorLogicNode.d.ts.map +1 -0
- package/dist/components/dialog_manager/behavior_tree/expression/operators/OperatorMap.d.ts +1 -0
- package/dist/components/dialog_manager/behavior_tree/expression/operators/OperatorMap.d.ts.map +1 -0
- package/dist/components/dialog_manager/behavior_tree/expression/operators/OrOperator.d.ts +1 -0
- package/dist/components/dialog_manager/behavior_tree/expression/operators/OrOperator.d.ts.map +1 -0
- package/dist/components/dialog_manager/behavior_tree/expression/operators/XorOperator.d.ts +1 -0
- package/dist/components/dialog_manager/behavior_tree/expression/operators/XorOperator.d.ts.map +1 -0
- package/dist/components/dialog_manager/behavior_tree/expression/operators/arithmetic/DivisionOperator.d.ts +1 -0
- package/dist/components/dialog_manager/behavior_tree/expression/operators/arithmetic/DivisionOperator.d.ts.map +1 -0
- package/dist/components/dialog_manager/behavior_tree/expression/operators/arithmetic/MinusOperator.d.ts +1 -0
- package/dist/components/dialog_manager/behavior_tree/expression/operators/arithmetic/MinusOperator.d.ts.map +1 -0
- package/dist/components/dialog_manager/behavior_tree/expression/operators/arithmetic/MultiplicationOperator.d.ts +1 -0
- package/dist/components/dialog_manager/behavior_tree/expression/operators/arithmetic/MultiplicationOperator.d.ts.map +1 -0
- package/dist/components/dialog_manager/behavior_tree/expression/operators/arithmetic/PlusOperator.d.ts +1 -0
- package/dist/components/dialog_manager/behavior_tree/expression/operators/arithmetic/PlusOperator.d.ts.map +1 -0
- package/dist/components/dialog_manager/behavior_tree/expression/operators/arithmetic/RemainderDivisionOperator.d.ts +1 -0
- package/dist/components/dialog_manager/behavior_tree/expression/operators/arithmetic/RemainderDivisionOperator.d.ts.map +1 -0
- package/dist/components/dialog_manager/behavior_tree/line_core/LineBehaviorNode.d.ts +1 -0
- package/dist/components/dialog_manager/behavior_tree/line_core/LineBehaviorNode.d.ts.map +1 -0
- package/dist/components/dialog_manager/behavior_tree/line_core/LineBehaviorResult.d.ts +1 -0
- package/dist/components/dialog_manager/behavior_tree/line_core/LineBehaviorResult.d.ts.map +1 -0
- package/dist/components/dialog_manager/behavior_tree/line_core/LineNodeArguments.d.ts +1 -0
- package/dist/components/dialog_manager/behavior_tree/line_core/LineNodeArguments.d.ts.map +1 -0
- package/dist/components/dialog_manager/behavior_tree/line_core/LineSelectorNode.d.ts +1 -0
- package/dist/components/dialog_manager/behavior_tree/line_core/LineSelectorNode.d.ts.map +1 -0
- package/dist/components/dialog_manager/behavior_tree/line_processors/BehaviorState.d.ts +1 -0
- package/dist/components/dialog_manager/behavior_tree/line_processors/BehaviorState.d.ts.map +1 -0
- package/dist/components/dialog_manager/behavior_tree/line_processors/ElseIfNode.d.ts +1 -0
- package/dist/components/dialog_manager/behavior_tree/line_processors/ElseIfNode.d.ts.map +1 -0
- package/dist/components/dialog_manager/behavior_tree/line_processors/ElseNode.d.ts +1 -0
- package/dist/components/dialog_manager/behavior_tree/line_processors/ElseNode.d.ts.map +1 -0
- package/dist/components/dialog_manager/behavior_tree/line_processors/EndIfNode.d.ts +1 -0
- package/dist/components/dialog_manager/behavior_tree/line_processors/EndIfNode.d.ts.map +1 -0
- package/dist/components/dialog_manager/behavior_tree/line_processors/IfMode.d.ts +1 -0
- package/dist/components/dialog_manager/behavior_tree/line_processors/IfMode.d.ts.map +1 -0
- package/dist/components/dialog_manager/behavior_tree/line_processors/IfNode.d.ts +1 -0
- package/dist/components/dialog_manager/behavior_tree/line_processors/IfNode.d.ts.map +1 -0
- package/dist/components/dialog_manager/behavior_tree/line_processors/IgnoreGuardNode.d.ts +1 -0
- package/dist/components/dialog_manager/behavior_tree/line_processors/IgnoreGuardNode.d.ts.map +1 -0
- package/dist/components/dialog_manager/behavior_tree/line_processors/IgnoreJumpNode.d.ts +1 -0
- package/dist/components/dialog_manager/behavior_tree/line_processors/IgnoreJumpNode.d.ts.map +1 -0
- package/dist/components/dialog_manager/behavior_tree/line_processors/LineCommentNode.d.ts +1 -0
- package/dist/components/dialog_manager/behavior_tree/line_processors/LineCommentNode.d.ts.map +1 -0
- package/dist/components/dialog_manager/behavior_tree/line_processors/NormalLineProcessorNode.d.ts +1 -0
- package/dist/components/dialog_manager/behavior_tree/line_processors/NormalLineProcessorNode.d.ts.map +1 -0
- package/dist/components/dialog_manager/behavior_tree/line_processors/SetVariableNode.d.ts +1 -0
- package/dist/components/dialog_manager/behavior_tree/line_processors/SetVariableNode.d.ts.map +1 -0
- package/dist/components/dialog_manager/behavior_tree/line_processors/commands/DeclareCommand.d.ts +1 -0
- package/dist/components/dialog_manager/behavior_tree/line_processors/commands/DeclareCommand.d.ts.map +1 -0
- package/dist/components/dialog_manager/behavior_tree/line_processors/commands/JumpCommand.d.ts +1 -0
- package/dist/components/dialog_manager/behavior_tree/line_processors/commands/JumpCommand.d.ts.map +1 -0
- package/dist/components/dialog_manager/behavior_tree/line_processors/commands/UnvisitCommand.d.ts +1 -0
- package/dist/components/dialog_manager/behavior_tree/line_processors/commands/UnvisitCommand.d.ts.map +1 -0
- package/dist/components/reveal-info/RevealInfo.svelte +86 -0
- package/dist/components/reveal-info/RevealInfo.svelte.d.ts +15 -0
- package/dist/components/reveal-info/RevealInfo.svelte.d.ts.map +1 -0
- package/dist/components/reveal-info/RevealInfoCollection.d.ts +6 -0
- package/dist/components/reveal-info/RevealInfoCollection.d.ts.map +1 -0
- package/dist/components/reveal-info/RevealInfoRemoteQuery.d.ts +10 -0
- package/dist/components/reveal-info/RevealInfoRemoteQuery.d.ts.map +1 -0
- package/dist/components/reveal-info/RevealInfoRemoteQuery.js +1 -0
- package/dist/components/reveal-info/RevealInfoRune.svelte.d.ts +6 -0
- package/dist/components/reveal-info/RevealInfoRune.svelte.d.ts.map +1 -0
- package/dist/components/reveal-info/RevealInfoRune.svelte.js +13 -0
- package/dist/consts.d.ts +1 -0
- package/dist/consts.d.ts.map +1 -0
- package/dist/external/paraglide/messages/_index.d.ts +1 -0
- package/dist/external/paraglide/messages/_index.d.ts.map +1 -0
- package/dist/external/paraglide/messages/_index.js +3 -5
- package/dist/external/paraglide/messages/en.d.ts +1 -0
- package/dist/external/paraglide/messages/en.d.ts.map +1 -0
- package/dist/external/paraglide/messages/en.js +1 -1
- package/dist/external/paraglide/messages/fr.d.ts +1 -0
- package/dist/external/paraglide/messages/fr.d.ts.map +1 -0
- package/dist/external/paraglide/messages/fr.js +1 -1
- package/dist/external/paraglide/messages/tl.d.ts +1 -0
- package/dist/external/paraglide/messages/tl.d.ts.map +1 -0
- package/dist/external/paraglide/messages/tl.js +1 -1
- package/dist/external/paraglide/messages.d.ts +1 -0
- package/dist/external/paraglide/messages.d.ts.map +1 -0
- package/dist/external/paraglide/messages.js +1 -1
- package/dist/external/paraglide/registry.d.ts +1 -0
- package/dist/external/paraglide/registry.d.ts.map +1 -0
- package/dist/external/paraglide/registry.js +1 -1
- package/dist/external/paraglide/runtime.d.ts +190 -8
- package/dist/external/paraglide/runtime.d.ts.map +1 -0
- package/dist/external/paraglide/runtime.js +426 -90
- package/dist/external/paraglide/server.d.ts +5 -2
- package/dist/external/paraglide/server.d.ts.map +1 -0
- package/dist/external/paraglide/server.js +21 -20
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +1 -1
- package/dist/modules/overrideable_meta/OverridableMeta.svelte +1 -2
- package/dist/modules/overrideable_meta/OverridableMeta.svelte.d.ts +15 -10
- package/dist/modules/overrideable_meta/OverridableMeta.svelte.d.ts.map +1 -0
- package/dist/modules/overrideable_meta/OverridableMetaProps.d.ts +1 -0
- package/dist/modules/overrideable_meta/OverridableMetaProps.d.ts.map +1 -0
- package/dist/modules/overrideable_meta/index.d.ts +1 -0
- package/dist/modules/overrideable_meta/index.d.ts.map +1 -0
- package/dist/modules/parsnip/ParsnipBlockChildren.svelte.d.ts +14 -7
- package/dist/modules/parsnip/ParsnipBlockChildren.svelte.d.ts.map +1 -0
- package/dist/modules/parsnip/ParsnipEmbedWikilink.svelte.d.ts +13 -13
- package/dist/modules/parsnip/ParsnipEmbedWikilink.svelte.d.ts.map +1 -0
- package/dist/modules/parsnip/ParsnipEntry.d.ts +1 -0
- package/dist/modules/parsnip/ParsnipEntry.d.ts.map +1 -0
- package/dist/modules/parsnip/ParsnipHeading.svelte.d.ts +14 -6
- package/dist/modules/parsnip/ParsnipHeading.svelte.d.ts.map +1 -0
- package/dist/modules/parsnip/ParsnipList.svelte.d.ts +14 -6
- package/dist/modules/parsnip/ParsnipList.svelte.d.ts.map +1 -0
- package/dist/modules/parsnip/ParsnipOverall.d.ts +1 -0
- package/dist/modules/parsnip/ParsnipOverall.d.ts.map +1 -0
- package/dist/modules/parsnip/ParsnipParagraph.svelte +10 -10
- package/dist/modules/parsnip/ParsnipParagraph.svelte.d.ts +14 -6
- package/dist/modules/parsnip/ParsnipParagraph.svelte.d.ts.map +1 -0
- package/dist/modules/parsnip/ParsnipPhrasingChildren.svelte +30 -30
- package/dist/modules/parsnip/ParsnipPhrasingChildren.svelte.d.ts +14 -6
- package/dist/modules/parsnip/ParsnipPhrasingChildren.svelte.d.ts.map +1 -0
- package/dist/modules/parsnip/ParsnipWikilink.svelte.d.ts +13 -14
- package/dist/modules/parsnip/ParsnipWikilink.svelte.d.ts.map +1 -0
- package/dist/modules/parsnip/index.d.ts +1 -0
- package/dist/modules/parsnip/index.d.ts.map +1 -0
- package/dist/modules/parsnip/route-util/ParsnipBlog.svelte.d.ts +14 -6
- package/dist/modules/parsnip/route-util/ParsnipBlog.svelte.d.ts.map +1 -0
- package/dist/modules/parsnip/route-util/getSlugEntries.d.ts +1 -0
- package/dist/modules/parsnip/route-util/getSlugEntries.d.ts.map +1 -0
- package/dist/modules/parsnip/route-util/menuPageServerLoad.d.ts +7 -0
- package/dist/modules/parsnip/route-util/menuPageServerLoad.d.ts.map +1 -0
- package/dist/modules/parsnip/route-util/menuPageServerLoad.js +28 -1
- package/dist/modules/parsnip/route-util/slugPageServerLoad.d.ts +2 -1
- package/dist/modules/parsnip/route-util/slugPageServerLoad.d.ts.map +1 -0
- package/dist/scripts/pineapple_fiber/PineappleFiberParser.d.ts +1 -0
- package/dist/scripts/pineapple_fiber/PineappleFiberParser.d.ts.map +1 -0
- package/dist/scripts/pineapple_fiber/PineappleWeaver.d.ts +1 -0
- package/dist/scripts/pineapple_fiber/PineappleWeaver.d.ts.map +1 -0
- package/dist/scripts/util/FileManagement.d.ts +1 -0
- package/dist/scripts/util/FileManagement.d.ts.map +1 -0
- package/dist/scripts/util/ManualCheck.d.ts +1 -0
- package/dist/scripts/util/ManualCheck.d.ts.map +1 -0
- package/dist/scripts/util/ManualCheckRun.d.ts +1 -0
- package/dist/scripts/util/ManualCheckRun.d.ts.map +1 -0
- package/dist/store.d.ts +1 -0
- package/dist/store.d.ts.map +1 -0
- package/dist/styles/app.css +61 -21
- package/dist/styles/color-tokens.css +23 -0
- package/dist/styles/surface-colors.scss +38 -0
- package/dist/styles/tailwind.css +3349 -0
- package/dist/styles/turnip-theme.css +59 -52
- package/dist/types/BlogBlurbMeta.d.ts +1 -0
- package/dist/types/BlogBlurbMeta.d.ts.map +1 -0
- package/dist/types/BreadcrumbData.d.ts +1 -0
- package/dist/types/BreadcrumbData.d.ts.map +1 -0
- package/dist/types/api/CreateUrl.d.ts +1 -0
- package/dist/types/api/CreateUrl.d.ts.map +1 -0
- package/dist/types/api/index.d.ts +1 -0
- package/dist/types/api/index.d.ts.map +1 -0
- package/dist/types/pineapple_fiber/DialogDetail.d.ts +1 -0
- package/dist/types/pineapple_fiber/DialogDetail.d.ts.map +1 -0
- package/dist/types/pineapple_fiber/DialogState.d.ts +1 -0
- package/dist/types/pineapple_fiber/DialogState.d.ts.map +1 -0
- package/dist/types/pineapple_fiber/DialogVariableStore.d.ts +1 -0
- package/dist/types/pineapple_fiber/DialogVariableStore.d.ts.map +1 -0
- package/dist/types/pineapple_fiber/PortraitType.d.ts +1 -0
- package/dist/types/pineapple_fiber/PortraitType.d.ts.map +1 -0
- package/dist/ui/components/FourPartCard.svelte +12 -5
- package/dist/ui/components/FourPartCard.svelte.d.ts +14 -9
- package/dist/ui/components/FourPartCard.svelte.d.ts.map +1 -0
- package/dist/ui/components/MeltToaster/MeltToaster.svelte +101 -0
- package/dist/ui/components/MeltToaster/MeltToaster.svelte.d.ts +65 -0
- package/dist/ui/components/MeltToaster/MeltToaster.svelte.d.ts.map +1 -0
- package/dist/ui/{templates/SeaweedLayout → components/MeltToaster}/ToastSettings.d.ts +1 -1
- package/dist/ui/components/MeltToaster/ToastSettings.d.ts.map +1 -0
- package/dist/ui/components/MeltToaster/ToastSettings.js +1 -0
- package/dist/ui/components/ModalBase.svelte.d.ts +14 -7
- package/dist/ui/components/ModalBase.svelte.d.ts.map +1 -0
- package/dist/ui/components/SocialSection.svelte +58 -27
- package/dist/ui/components/SocialSection.svelte.d.ts +15 -9
- package/dist/ui/components/SocialSection.svelte.d.ts.map +1 -0
- package/dist/ui/components/accordion/PinyaAccordion.svelte +54 -12
- package/dist/ui/components/accordion/PinyaAccordion.svelte.d.ts +14 -7
- package/dist/ui/components/accordion/PinyaAccordion.svelte.d.ts.map +1 -0
- package/dist/ui/components/accordion/PinyaAccordionItem.svelte +117 -18
- package/dist/ui/components/accordion/PinyaAccordionItem.svelte.d.ts +14 -8
- package/dist/ui/components/accordion/PinyaAccordionItem.svelte.d.ts.map +1 -0
- package/dist/ui/components/accordion/accordionContext.d.ts +5 -0
- package/dist/ui/components/accordion/accordionContext.d.ts.map +1 -0
- package/dist/ui/components/accordion/accordionContext.js +2 -0
- package/dist/ui/components/accordion/index.d.ts +1 -0
- package/dist/ui/components/accordion/index.d.ts.map +1 -0
- package/dist/ui/components/index.d.ts +1 -0
- package/dist/ui/components/index.d.ts.map +1 -0
- package/dist/ui/components/randomized-background/RandomizedBackground.svelte +3 -1
- package/dist/ui/components/randomized-background/RandomizedBackground.svelte.d.ts +14 -5
- package/dist/ui/components/randomized-background/RandomizedBackground.svelte.d.ts.map +1 -0
- package/dist/ui/components/randomized-background/RandomizedImage.svelte +3 -2
- package/dist/ui/components/randomized-background/RandomizedImage.svelte.d.ts +14 -6
- package/dist/ui/components/randomized-background/RandomizedImage.svelte.d.ts.map +1 -0
- package/dist/ui/components/randomized-background/getSocialSection.remote.d.ts +3 -0
- package/dist/ui/components/randomized-background/getSocialSection.remote.d.ts.map +1 -0
- package/dist/ui/components/randomized-background/getSocialSection.remote.js +7 -0
- package/dist/ui/components/socialSectionRemote.remote.d.ts +3 -0
- package/dist/ui/components/socialSectionRemote.remote.d.ts.map +1 -0
- package/dist/ui/components/socialSectionRemote.remote.js +3 -0
- package/dist/ui/elements/CodeBlock/CodeBlock.svelte +1 -1
- package/dist/ui/elements/CodeBlock/CodeBlock.svelte.d.ts +15 -4
- package/dist/ui/elements/CodeBlock/CodeBlock.svelte.d.ts.map +1 -0
- package/dist/ui/elements/CodeBlock/CodeBlockProps.d.ts +1 -0
- package/dist/ui/elements/CodeBlock/CodeBlockProps.d.ts.map +1 -0
- package/dist/ui/elements/CodeBlock/index.d.ts +1 -0
- package/dist/ui/elements/CodeBlock/index.d.ts.map +1 -0
- package/dist/ui/elements/ColorScheme.d.ts +9 -8
- package/dist/ui/elements/ColorScheme.d.ts.map +1 -0
- package/dist/ui/elements/ColorScheme.js +8 -8
- package/dist/ui/elements/ElementVisibilityDetector.svelte +24 -19
- package/dist/ui/elements/ElementVisibilityDetector.svelte.d.ts +14 -7
- package/dist/ui/elements/ElementVisibilityDetector.svelte.d.ts.map +1 -0
- package/dist/ui/elements/GeneralUIProps.d.ts +1 -0
- package/dist/ui/elements/GeneralUIProps.d.ts.map +1 -0
- package/dist/ui/elements/ImageIcon.svelte +5 -1
- package/dist/ui/elements/ImageIcon.svelte.d.ts +19 -6
- package/dist/ui/elements/ImageIcon.svelte.d.ts.map +1 -0
- package/dist/ui/elements/OnBackground.d.ts +1 -0
- package/dist/ui/elements/OnBackground.d.ts.map +1 -0
- package/dist/ui/elements/PineappleSwitch.svelte +76 -11
- package/dist/ui/elements/PineappleSwitch.svelte.d.ts +14 -9
- package/dist/ui/elements/PineappleSwitch.svelte.d.ts.map +1 -0
- package/dist/ui/elements/PinyaAnchorButton/PinyaAnchorButton.svelte +6 -2
- package/dist/ui/elements/PinyaAnchorButton/PinyaAnchorButton.svelte.d.ts +19 -4
- package/dist/ui/elements/PinyaAnchorButton/PinyaAnchorButton.svelte.d.ts.map +1 -0
- package/dist/ui/elements/PinyaAnchorButton/PinyaAnchorButtonProps.d.ts +1 -0
- package/dist/ui/elements/PinyaAnchorButton/PinyaAnchorButtonProps.d.ts.map +1 -0
- package/dist/ui/elements/PinyaAnchorButton/index.d.ts +1 -0
- package/dist/ui/elements/PinyaAnchorButton/index.d.ts.map +1 -0
- package/dist/ui/elements/PinyaButton/PinyaButton.svelte +2 -2
- package/dist/ui/elements/PinyaButton/PinyaButton.svelte.d.ts +15 -4
- package/dist/ui/elements/PinyaButton/PinyaButton.svelte.d.ts.map +1 -0
- package/dist/ui/elements/PinyaButton/PinyaButtonProps.d.ts +1 -0
- package/dist/ui/elements/PinyaButton/PinyaButtonProps.d.ts.map +1 -0
- package/dist/ui/elements/PinyaButton/index.d.ts +1 -0
- package/dist/ui/elements/PinyaButton/index.d.ts.map +1 -0
- package/dist/ui/elements/PinyaButtonCommon/ButtonVariant.d.ts +4 -3
- package/dist/ui/elements/PinyaButtonCommon/ButtonVariant.d.ts.map +1 -0
- package/dist/ui/elements/PinyaButtonCommon/ButtonVariant.js +3 -3
- package/dist/ui/elements/PinyaButtonCommon/PinyaButtonCommonProps.d.ts +4 -0
- package/dist/ui/elements/PinyaButtonCommon/PinyaButtonCommonProps.d.ts.map +1 -0
- package/dist/ui/elements/PinyaButtonCommon/createButtonClass.d.ts +1 -0
- package/dist/ui/elements/PinyaButtonCommon/createButtonClass.d.ts.map +1 -0
- package/dist/ui/elements/PinyaButtonCommon/createButtonClass.js +4 -22
- package/dist/ui/elements/PinyaButtonCommon/index.d.ts +1 -0
- package/dist/ui/elements/PinyaButtonCommon/index.d.ts.map +1 -0
- package/dist/ui/elements/PinyaCard/PinyaCard.svelte +66 -24
- package/dist/ui/elements/PinyaCard/PinyaCard.svelte.d.ts +16 -4
- package/dist/ui/elements/PinyaCard/PinyaCard.svelte.d.ts.map +1 -0
- package/dist/ui/elements/PinyaCard/PinyaCardProps.d.ts +12 -3
- package/dist/ui/elements/PinyaCard/PinyaCardProps.d.ts.map +1 -0
- package/dist/ui/elements/PinyaCard/index.d.ts +1 -0
- package/dist/ui/elements/PinyaCard/index.d.ts.map +1 -0
- package/dist/ui/elements/Placeholder.svelte +4 -0
- package/dist/ui/elements/Placeholder.svelte.d.ts +18 -6
- package/dist/ui/elements/Placeholder.svelte.d.ts.map +1 -0
- package/dist/ui/elements/TextChip/TextChip.svelte +5 -1
- package/dist/ui/elements/TextChip/TextChip.svelte.d.ts +19 -4
- package/dist/ui/elements/TextChip/TextChip.svelte.d.ts.map +1 -0
- package/dist/ui/elements/TextChip/TextChipProps.d.ts +1 -0
- package/dist/ui/elements/TextChip/TextChipProps.d.ts.map +1 -0
- package/dist/ui/elements/TextChip/index.d.ts +1 -0
- package/dist/ui/elements/TextChip/index.d.ts.map +1 -0
- package/dist/ui/elements/TextLink.svelte +10 -5
- package/dist/ui/elements/TextLink.svelte.d.ts +18 -7
- package/dist/ui/elements/TextLink.svelte.d.ts.map +1 -0
- package/dist/ui/elements/WrapperProps.d.ts +1 -0
- package/dist/ui/elements/WrapperProps.d.ts.map +1 -0
- package/dist/ui/elements/index.d.ts +1 -0
- package/dist/ui/elements/index.d.ts.map +1 -0
- package/dist/ui/elements/pinya-combobox/PinyaCombobox.svelte +117 -22
- package/dist/ui/elements/pinya-combobox/PinyaCombobox.svelte.d.ts +17 -22
- package/dist/ui/elements/pinya-combobox/PinyaCombobox.svelte.d.ts.map +1 -0
- package/dist/ui/elements/pinya-combobox/PinyaComboboxProps.d.ts +9 -7
- package/dist/ui/elements/pinya-combobox/PinyaComboboxProps.d.ts.map +1 -0
- package/dist/ui/modules/NavigationMenu/NavigationControl.svelte.d.ts +14 -7
- package/dist/ui/modules/NavigationMenu/NavigationControl.svelte.d.ts.map +1 -0
- package/dist/ui/modules/NavigationMenu/NavigationMenu.svelte +4 -4
- package/dist/ui/modules/NavigationMenu/NavigationMenu.svelte.d.ts +14 -21
- package/dist/ui/modules/NavigationMenu/NavigationMenu.svelte.d.ts.map +1 -0
- package/dist/ui/modules/NavigationMenu/PageMeta.d.ts +1 -0
- package/dist/ui/modules/NavigationMenu/PageMeta.d.ts.map +1 -0
- package/dist/ui/modules/NavigationMenu/index.d.ts +1 -0
- package/dist/ui/modules/NavigationMenu/index.d.ts.map +1 -0
- package/dist/ui/modules/index.d.ts +2 -1
- package/dist/ui/modules/index.d.ts.map +1 -0
- package/dist/ui/modules/index.js +1 -1
- package/dist/ui/modules/modals/general-settings/GeneralSettingsModal.svelte +18 -40
- package/dist/ui/modules/modals/general-settings/GeneralSettingsModal.svelte.d.ts +15 -4
- package/dist/ui/modules/modals/general-settings/GeneralSettingsModal.svelte.d.ts.map +1 -0
- package/dist/ui/modules/modals/general-settings/LanguagePicker.svelte +6 -8
- package/dist/ui/modules/modals/general-settings/LanguagePicker.svelte.d.ts +15 -3
- package/dist/ui/modules/modals/general-settings/LanguagePicker.svelte.d.ts.map +1 -0
- package/dist/ui/modules/projects/Hepcat.svelte +1 -1
- package/dist/ui/modules/projects/Hepcat.svelte.d.ts +12 -16
- package/dist/ui/modules/projects/Hepcat.svelte.d.ts.map +1 -0
- package/dist/ui/modules/projects/Pengi.svelte +1 -1
- package/dist/ui/modules/projects/Pengi.svelte.d.ts +12 -16
- package/dist/ui/modules/projects/Pengi.svelte.d.ts.map +1 -0
- package/dist/ui/modules/projects/Soulwork.svelte.d.ts +12 -16
- package/dist/ui/modules/projects/Soulwork.svelte.d.ts.map +1 -0
- package/dist/ui/modules/projects/ThisWebpage.svelte.d.ts +12 -16
- package/dist/ui/modules/projects/ThisWebpage.svelte.d.ts.map +1 -0
- package/dist/ui/modules/projects/index.d.ts +1 -0
- package/dist/ui/modules/projects/index.d.ts.map +1 -0
- package/dist/ui/modules/universal-overlay/DialogPanel.svelte +37 -0
- package/dist/ui/modules/universal-overlay/DialogPanel.svelte.d.ts +16 -0
- package/dist/ui/modules/universal-overlay/DialogPanel.svelte.d.ts.map +1 -0
- package/dist/ui/modules/universal-overlay/SettingsPanel.svelte +152 -0
- package/dist/ui/modules/universal-overlay/SettingsPanel.svelte.d.ts +20 -0
- package/dist/ui/modules/universal-overlay/SettingsPanel.svelte.d.ts.map +1 -0
- package/dist/ui/modules/universal-overlay/UniversalOverlay.svelte +302 -0
- package/dist/ui/modules/universal-overlay/UniversalOverlay.svelte.d.ts +23 -0
- package/dist/ui/modules/universal-overlay/UniversalOverlay.svelte.d.ts.map +1 -0
- package/dist/ui/templates/PinyaPageLayout/PinyaPageLayout.svelte +3 -3
- package/dist/ui/templates/PinyaPageLayout/PinyaPageLayout.svelte.d.ts +14 -8
- package/dist/ui/templates/PinyaPageLayout/PinyaPageLayout.svelte.d.ts.map +1 -0
- package/dist/ui/templates/PinyaPageLayout/index.d.ts +2 -1
- package/dist/ui/templates/PinyaPageLayout/index.d.ts.map +1 -0
- package/dist/ui/templates/PinyaPageLayout/index.js +1 -1
- package/dist/ui/templates/PinyaPageLayout/{runes.svelte.d.ts → pinyaPageLayoutRunes.svelte.d.ts} +1 -0
- package/dist/ui/templates/PinyaPageLayout/pinyaPageLayoutRunes.svelte.d.ts.map +1 -0
- package/dist/ui/templates/SeaweedLayout/ChumBucket.svelte +1 -1
- package/dist/ui/templates/SeaweedLayout/ChumBucket.svelte.d.ts +15 -3
- package/dist/ui/templates/SeaweedLayout/ChumBucket.svelte.d.ts.map +1 -0
- package/dist/ui/templates/SeaweedLayout/CreateUrlForm.svelte +10 -12
- package/dist/ui/templates/SeaweedLayout/CreateUrlForm.svelte.d.ts +14 -8
- package/dist/ui/templates/SeaweedLayout/CreateUrlForm.svelte.d.ts.map +1 -0
- package/dist/ui/templates/SeaweedLayout/EntryGroup.svelte +9 -8
- package/dist/ui/templates/SeaweedLayout/EntryGroup.svelte.d.ts +15 -4
- package/dist/ui/templates/SeaweedLayout/EntryGroup.svelte.d.ts.map +1 -0
- package/dist/ui/templates/SeaweedLayout/EntryOrderConfig.svelte.d.ts +14 -8
- package/dist/ui/templates/SeaweedLayout/EntryOrderConfig.svelte.d.ts.map +1 -0
- package/dist/ui/templates/SeaweedLayout/ProjectComponentProps.d.ts +1 -0
- package/dist/ui/templates/SeaweedLayout/ProjectComponentProps.d.ts.map +1 -0
- package/dist/ui/templates/SeaweedLayout/ProjectGroupConfig.svelte +22 -12
- package/dist/ui/templates/SeaweedLayout/ProjectGroupConfig.svelte.d.ts +14 -13
- package/dist/ui/templates/SeaweedLayout/ProjectGroupConfig.svelte.d.ts.map +1 -0
- package/dist/ui/templates/SeaweedLayout/SeaweedLayout.svelte +5 -0
- package/dist/ui/templates/SeaweedLayout/SeaweedLayout.svelte.d.ts +15 -4
- package/dist/ui/templates/SeaweedLayout/SeaweedLayout.svelte.d.ts.map +1 -0
- package/dist/ui/templates/SeaweedLayout/index.d.ts +1 -0
- package/dist/ui/templates/SeaweedLayout/index.d.ts.map +1 -0
- package/dist/ui/templates/SeaweedLayout/props.d.ts +1 -0
- package/dist/ui/templates/SeaweedLayout/props.d.ts.map +1 -0
- package/dist/ui/templates/blog_template/BlogTemplate.svelte +9 -6
- package/dist/ui/templates/blog_template/BlogTemplate.svelte.d.ts +14 -11
- package/dist/ui/templates/blog_template/BlogTemplate.svelte.d.ts.map +1 -0
- package/dist/ui/templates/blog_template/BlogTemplateInner.svelte +2 -2
- package/dist/ui/templates/blog_template/BlogTemplateInner.svelte.d.ts +14 -7
- package/dist/ui/templates/blog_template/BlogTemplateInner.svelte.d.ts.map +1 -0
- package/dist/ui/templates/confirmation-modal/component.svelte +1 -1
- package/dist/ui/templates/confirmation-modal/component.svelte.d.ts +15 -4
- package/dist/ui/templates/confirmation-modal/component.svelte.d.ts.map +1 -0
- package/dist/ui/templates/confirmation-modal/index.d.ts +1 -0
- package/dist/ui/templates/confirmation-modal/index.d.ts.map +1 -0
- package/dist/ui/templates/confirmation-modal/props.d.ts +1 -0
- package/dist/ui/templates/confirmation-modal/props.d.ts.map +1 -0
- package/dist/ui/templates/index.d.ts +2 -1
- package/dist/ui/templates/index.d.ts.map +1 -0
- package/dist/ui/templates/index.js +1 -1
- package/dist/ui/templates/{PinyaBase.svelte → pinya-base/PinyaBase.svelte} +42 -31
- package/dist/ui/templates/pinya-base/PinyaBase.svelte.d.ts +17 -0
- package/dist/ui/templates/pinya-base/PinyaBase.svelte.d.ts.map +1 -0
- package/dist/ui/templates/{runes.svelte.d.ts → pinya-base/pinyaBaseRunes.svelte.d.ts} +1 -0
- package/dist/ui/templates/pinya-base/pinyaBaseRunes.svelte.d.ts.map +1 -0
- package/dist/ui/templates/{runes.svelte.js → pinya-base/pinyaBaseRunes.svelte.js} +1 -1
- package/dist/util/context/PineappleBaseContext.svelte +52 -0
- package/dist/util/context/PineappleBaseContext.svelte.d.ts +15 -0
- package/dist/util/context/PineappleBaseContext.svelte.d.ts.map +1 -0
- package/dist/util/context/pineappleBaseContextDefinitions.d.ts +7 -0
- package/dist/util/context/pineappleBaseContextDefinitions.d.ts.map +1 -0
- package/dist/util/context/pineappleBaseContextDefinitions.js +6 -0
- package/dist/util/env-getter.d.ts +1 -0
- package/dist/util/env-getter.d.ts.map +1 -0
- package/dist/util/env-getter.js +5 -2
- package/dist/util/localStore.svelte.d.ts +17 -0
- package/dist/util/localStore.svelte.d.ts.map +1 -0
- package/dist/util/localStore.svelte.js +76 -0
- package/dist/util/util.d.ts +1 -0
- package/dist/util/util.d.ts.map +1 -0
- package/package.json +42 -41
- package/src/lib/styles/app.css +61 -21
- package/dist/ui/modules/dialog_overlay/DialogOverlay.svelte +0 -239
- package/dist/ui/modules/dialog_overlay/DialogOverlay.svelte.d.ts +0 -3
- package/dist/ui/templates/PinyaBase.svelte.d.ts +0 -7
- /package/dist/{ui/templates/SeaweedLayout/ToastSettings.js → components/reveal-info/RevealInfoCollection.js} +0 -0
- /package/dist/ui/templates/PinyaPageLayout/{runes.svelte.js → pinyaPageLayoutRunes.svelte.js} +0 -0
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
/* eslint-disable */
|
|
2
2
|
|
|
3
3
|
/** @type {any} */
|
|
4
4
|
const URLPattern = {}
|
|
@@ -26,9 +26,11 @@ export const cookieName = "PARAGLIDE_LOCALE";
|
|
|
26
26
|
/** @type {number} */
|
|
27
27
|
export const cookieMaxAge = 34560000;
|
|
28
28
|
/** @type {string} */
|
|
29
|
+
export const cookieDomain = "";
|
|
30
|
+
/** @type {string} */
|
|
29
31
|
export const localStorageKey = "PARAGLIDE_LOCALE";
|
|
30
32
|
/**
|
|
31
|
-
* @type {Array<"cookie" | "baseLocale" | "globalVariable" | "url" | "preferredLanguage" | "localStorage"
|
|
33
|
+
* @type {Array<"cookie" | "baseLocale" | "globalVariable" | "url" | "preferredLanguage" | "localStorage" | `custom-${string}`>}
|
|
32
34
|
*/
|
|
33
35
|
export const strategy = [
|
|
34
36
|
"url",
|
|
@@ -159,13 +161,25 @@ export let getLocale = () => {
|
|
|
159
161
|
else if (TREE_SHAKE_PREFERRED_LANGUAGE_STRATEGY_USED &&
|
|
160
162
|
strat === "preferredLanguage" &&
|
|
161
163
|
!isServer) {
|
|
162
|
-
locale =
|
|
164
|
+
locale = extractLocaleFromNavigator();
|
|
163
165
|
}
|
|
164
166
|
else if (TREE_SHAKE_LOCAL_STORAGE_STRATEGY_USED &&
|
|
165
167
|
strat === "localStorage" &&
|
|
166
168
|
!isServer) {
|
|
167
169
|
locale = localStorage.getItem(localStorageKey) ?? undefined;
|
|
168
170
|
}
|
|
171
|
+
else if (isCustomStrategy(strat) && customClientStrategies.has(strat)) {
|
|
172
|
+
const handler = customClientStrategies.get(strat);
|
|
173
|
+
if (handler) {
|
|
174
|
+
const result = handler.getLocale();
|
|
175
|
+
// Handle both sync and async results - skip async in sync getLocale
|
|
176
|
+
if (result instanceof Promise) {
|
|
177
|
+
// Can't await in sync function, skip async strategies
|
|
178
|
+
continue;
|
|
179
|
+
}
|
|
180
|
+
locale = result;
|
|
181
|
+
}
|
|
182
|
+
}
|
|
169
183
|
// check if match, else continue loop
|
|
170
184
|
if (locale !== undefined) {
|
|
171
185
|
const asserted = assertIsLocale(locale);
|
|
@@ -180,29 +194,6 @@ export let getLocale = () => {
|
|
|
180
194
|
}
|
|
181
195
|
throw new Error("No locale found. Read the docs https://inlang.com/m/gerre34r/library-inlang-paraglideJs/errors#no-locale-found");
|
|
182
196
|
};
|
|
183
|
-
/**
|
|
184
|
-
* Negotiates a preferred language from navigator.languages.
|
|
185
|
-
*
|
|
186
|
-
* @returns {string|undefined} The negotiated preferred language.
|
|
187
|
-
*/
|
|
188
|
-
function negotiatePreferredLanguageFromNavigator() {
|
|
189
|
-
if (!navigator?.languages?.length) {
|
|
190
|
-
return undefined;
|
|
191
|
-
}
|
|
192
|
-
const languages = navigator.languages.map((lang) => ({
|
|
193
|
-
fullTag: lang.toLowerCase(),
|
|
194
|
-
baseTag: lang.split("-")[0]?.toLowerCase(),
|
|
195
|
-
}));
|
|
196
|
-
for (const lang of languages) {
|
|
197
|
-
if (isLocale(lang.fullTag)) {
|
|
198
|
-
return lang.fullTag;
|
|
199
|
-
}
|
|
200
|
-
else if (isLocale(lang.baseTag)) {
|
|
201
|
-
return lang.baseTag;
|
|
202
|
-
}
|
|
203
|
-
}
|
|
204
|
-
return undefined;
|
|
205
|
-
}
|
|
206
197
|
/**
|
|
207
198
|
* Overwrite the \`getLocale()\` function.
|
|
208
199
|
*
|
|
@@ -222,6 +213,25 @@ export const overwriteGetLocale = (fn) => {
|
|
|
222
213
|
getLocale = fn;
|
|
223
214
|
};
|
|
224
215
|
|
|
216
|
+
/**
|
|
217
|
+
* Navigates to the localized URL, or reloads the current page
|
|
218
|
+
*
|
|
219
|
+
* @param {string} [newLocation] The new location
|
|
220
|
+
* @return {undefined}
|
|
221
|
+
*/
|
|
222
|
+
const navigateOrReload = (newLocation) => {
|
|
223
|
+
if (newLocation) {
|
|
224
|
+
// reload the page by navigating to the new url
|
|
225
|
+
window.location.href = newLocation;
|
|
226
|
+
}
|
|
227
|
+
else {
|
|
228
|
+
// reload the page to reflect the new locale
|
|
229
|
+
window.location.reload();
|
|
230
|
+
}
|
|
231
|
+
};
|
|
232
|
+
/**
|
|
233
|
+
* @typedef {(newLocale: Locale, options?: { reload?: boolean }) => void | Promise<void>} SetLocaleFn
|
|
234
|
+
*/
|
|
225
235
|
/**
|
|
226
236
|
* Set the locale.
|
|
227
237
|
*
|
|
@@ -230,13 +240,16 @@ export const overwriteGetLocale = (fn) => {
|
|
|
230
240
|
* reloading is disabled, you need to ensure that the UI is updated
|
|
231
241
|
* to reflect the new locale.
|
|
232
242
|
*
|
|
243
|
+
* If any custom strategy's \`setLocale\` function is async, then this
|
|
244
|
+
* function will become async as well.
|
|
245
|
+
*
|
|
233
246
|
* @example
|
|
234
247
|
* setLocale('en');
|
|
235
248
|
*
|
|
236
249
|
* @example
|
|
237
250
|
* setLocale('en', { reload: false });
|
|
238
251
|
*
|
|
239
|
-
* @type {
|
|
252
|
+
* @type {SetLocaleFn}
|
|
240
253
|
*/
|
|
241
254
|
export let setLocale = (newLocale, options) => {
|
|
242
255
|
const optionsWithDefaults = {
|
|
@@ -245,6 +258,7 @@ export let setLocale = (newLocale, options) => {
|
|
|
245
258
|
};
|
|
246
259
|
// locale is already set
|
|
247
260
|
// https://github.com/opral/inlang-paraglide-js/issues/430
|
|
261
|
+
/** @type {Locale | undefined} */
|
|
248
262
|
let currentLocale;
|
|
249
263
|
try {
|
|
250
264
|
currentLocale = getLocale();
|
|
@@ -252,6 +266,8 @@ export let setLocale = (newLocale, options) => {
|
|
|
252
266
|
catch {
|
|
253
267
|
// do nothing, no locale has been set yet.
|
|
254
268
|
}
|
|
269
|
+
/** @type {Array<Promise<any>>} */
|
|
270
|
+
const customSetLocalePromises = [];
|
|
255
271
|
/** @type {string | undefined} */
|
|
256
272
|
let newLocation = undefined;
|
|
257
273
|
for (const strat of strategy) {
|
|
@@ -262,11 +278,16 @@ export let setLocale = (newLocale, options) => {
|
|
|
262
278
|
_locale = newLocale;
|
|
263
279
|
}
|
|
264
280
|
else if (TREE_SHAKE_COOKIE_STRATEGY_USED && strat === "cookie") {
|
|
265
|
-
if (isServer ||
|
|
281
|
+
if (isServer ||
|
|
282
|
+
typeof document === "undefined" ||
|
|
283
|
+
typeof window === "undefined") {
|
|
266
284
|
continue;
|
|
267
285
|
}
|
|
268
286
|
// set the cookie
|
|
269
|
-
|
|
287
|
+
const cookieString = `${cookieName}=${newLocale}; path=/; max-age=${cookieMaxAge}`;
|
|
288
|
+
document.cookie = cookieDomain
|
|
289
|
+
? `${cookieString}; domain=${cookieDomain}`
|
|
290
|
+
: cookieString;
|
|
270
291
|
}
|
|
271
292
|
else if (strat === "baseLocale") {
|
|
272
293
|
// nothing to be set here. baseLocale is only a fallback
|
|
@@ -293,20 +314,36 @@ export let setLocale = (newLocale, options) => {
|
|
|
293
314
|
// set the localStorage
|
|
294
315
|
localStorage.setItem(localStorageKey, newLocale);
|
|
295
316
|
}
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
317
|
+
else if (isCustomStrategy(strat) && customClientStrategies.has(strat)) {
|
|
318
|
+
const handler = customClientStrategies.get(strat);
|
|
319
|
+
if (handler) {
|
|
320
|
+
let result = handler.setLocale(newLocale);
|
|
321
|
+
// Handle async setLocale
|
|
322
|
+
if (result instanceof Promise) {
|
|
323
|
+
result = result.catch((error) => {
|
|
324
|
+
throw new Error(`Custom strategy "${strat}" setLocale failed.`, {
|
|
325
|
+
cause: error,
|
|
326
|
+
});
|
|
327
|
+
});
|
|
328
|
+
customSetLocalePromises.push(result);
|
|
329
|
+
}
|
|
330
|
+
}
|
|
304
331
|
}
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
332
|
+
}
|
|
333
|
+
const runReload = () => {
|
|
334
|
+
if (!isServer &&
|
|
335
|
+
optionsWithDefaults.reload &&
|
|
336
|
+
window.location &&
|
|
337
|
+
newLocale !== currentLocale) {
|
|
338
|
+
navigateOrReload(newLocation);
|
|
308
339
|
}
|
|
340
|
+
};
|
|
341
|
+
if (customSetLocalePromises.length) {
|
|
342
|
+
return Promise.all(customSetLocalePromises).then(() => {
|
|
343
|
+
runReload();
|
|
344
|
+
});
|
|
309
345
|
}
|
|
346
|
+
runReload();
|
|
310
347
|
return;
|
|
311
348
|
};
|
|
312
349
|
/**
|
|
@@ -321,10 +358,10 @@ export let setLocale = (newLocale, options) => {
|
|
|
321
358
|
* return Cookies.set('locale', newLocale)
|
|
322
359
|
* });
|
|
323
360
|
*
|
|
324
|
-
* @param {
|
|
361
|
+
* @param {SetLocaleFn} fn
|
|
325
362
|
*/
|
|
326
363
|
export const overwriteSetLocale = (fn) => {
|
|
327
|
-
setLocale = fn;
|
|
364
|
+
setLocale = /** @type {SetLocaleFn} */ (fn);
|
|
328
365
|
};
|
|
329
366
|
|
|
330
367
|
/**
|
|
@@ -398,6 +435,9 @@ export function assertIsLocale(input) {
|
|
|
398
435
|
* they are defined. If a strategy returns an invalid locale,
|
|
399
436
|
* it will fall back to the next strategy.
|
|
400
437
|
*
|
|
438
|
+
* Note: Custom server strategies are not supported in this synchronous version.
|
|
439
|
+
* Use `extractLocaleFromRequestAsync` if you need custom server strategies with async getLocale methods.
|
|
440
|
+
*
|
|
401
441
|
* @example
|
|
402
442
|
* const locale = extractLocaleFromRequest(request);
|
|
403
443
|
*
|
|
@@ -419,10 +459,7 @@ export const extractLocaleFromRequest = (request) => {
|
|
|
419
459
|
}
|
|
420
460
|
else if (TREE_SHAKE_PREFERRED_LANGUAGE_STRATEGY_USED &&
|
|
421
461
|
strat === "preferredLanguage") {
|
|
422
|
-
|
|
423
|
-
if (acceptLanguageHeader) {
|
|
424
|
-
locale = negotiatePreferredLanguageFromHeader(acceptLanguageHeader);
|
|
425
|
-
}
|
|
462
|
+
locale = extractLocaleFromHeader(request);
|
|
426
463
|
}
|
|
427
464
|
else if (strat === "globalVariable") {
|
|
428
465
|
locale = _locale;
|
|
@@ -433,6 +470,11 @@ export const extractLocaleFromRequest = (request) => {
|
|
|
433
470
|
else if (strat === "localStorage") {
|
|
434
471
|
continue;
|
|
435
472
|
}
|
|
473
|
+
else if (isCustomStrategy(strat)) {
|
|
474
|
+
// Custom strategies are not supported in sync version
|
|
475
|
+
// Use extractLocaleFromRequestAsync for custom server strategies
|
|
476
|
+
continue;
|
|
477
|
+
}
|
|
436
478
|
if (locale !== undefined) {
|
|
437
479
|
if (!isLocale(locale)) {
|
|
438
480
|
locale = undefined;
|
|
@@ -444,42 +486,62 @@ export const extractLocaleFromRequest = (request) => {
|
|
|
444
486
|
}
|
|
445
487
|
throw new Error("No locale found. There is an error in your strategy. Try adding 'baseLocale' as the very last strategy. Read more here https://inlang.com/m/gerre34r/library-inlang-paraglideJs/errors#no-locale-found");
|
|
446
488
|
};
|
|
489
|
+
|
|
447
490
|
/**
|
|
448
|
-
*
|
|
491
|
+
* Asynchronously extracts a locale from a request.
|
|
449
492
|
*
|
|
450
|
-
*
|
|
451
|
-
*
|
|
493
|
+
* This function supports async custom server strategies, unlike the synchronous
|
|
494
|
+
* `extractLocaleFromRequest`. Use this function when you have custom server strategies
|
|
495
|
+
* that need to perform asynchronous operations (like database calls) in their getLocale method.
|
|
496
|
+
*
|
|
497
|
+
* The function first processes any custom server strategies asynchronously, then falls back
|
|
498
|
+
* to the synchronous `extractLocaleFromRequest` for all other strategies.
|
|
499
|
+
*
|
|
500
|
+
* @see {@link https://github.com/opral/inlang-paraglide-js/issues/527#issuecomment-2978151022}
|
|
501
|
+
*
|
|
502
|
+
* @example
|
|
503
|
+
* // Basic usage
|
|
504
|
+
* const locale = await extractLocaleFromRequestAsync(request);
|
|
505
|
+
*
|
|
506
|
+
* @example
|
|
507
|
+
* // With custom async server strategy
|
|
508
|
+
* defineCustomServerStrategy("custom-database", {
|
|
509
|
+
* getLocale: async (request) => {
|
|
510
|
+
* const userId = extractUserIdFromRequest(request);
|
|
511
|
+
* return await getUserLocaleFromDatabase(userId);
|
|
512
|
+
* }
|
|
513
|
+
* });
|
|
514
|
+
*
|
|
515
|
+
* const locale = await extractLocaleFromRequestAsync(request);
|
|
516
|
+
*
|
|
517
|
+
* @type {(request: Request) => Promise<Locale>}
|
|
452
518
|
*/
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
for (const lang of languages) {
|
|
469
|
-
if (isLocale(lang.fullTag)) {
|
|
470
|
-
return lang.fullTag;
|
|
471
|
-
}
|
|
472
|
-
else if (isLocale(lang.baseTag)) {
|
|
473
|
-
return lang.baseTag;
|
|
519
|
+
export const extractLocaleFromRequestAsync = async (request) => {
|
|
520
|
+
/** @type {string|undefined} */
|
|
521
|
+
let locale;
|
|
522
|
+
// Process custom strategies first, in order
|
|
523
|
+
for (const strat of strategy) {
|
|
524
|
+
if (isCustomStrategy(strat) && customServerStrategies.has(strat)) {
|
|
525
|
+
const handler = customServerStrategies.get(strat);
|
|
526
|
+
if (handler) {
|
|
527
|
+
/** @type {string|undefined} */
|
|
528
|
+
locale = await handler.getLocale(request);
|
|
529
|
+
}
|
|
530
|
+
// If we got a valid locale from this custom strategy, use it
|
|
531
|
+
if (locale !== undefined && isLocale(locale)) {
|
|
532
|
+
return assertIsLocale(locale);
|
|
533
|
+
}
|
|
474
534
|
}
|
|
475
535
|
}
|
|
476
|
-
|
|
477
|
-
|
|
536
|
+
// If no custom strategy provided a valid locale, fall back to sync version
|
|
537
|
+
locale = extractLocaleFromRequest(request);
|
|
538
|
+
return assertIsLocale(locale);
|
|
539
|
+
};
|
|
478
540
|
|
|
479
541
|
/**
|
|
480
542
|
* Extracts a cookie from the document.
|
|
481
543
|
*
|
|
482
|
-
* Will return undefined if the
|
|
544
|
+
* Will return undefined if the document is not available or if the cookie is not set.
|
|
483
545
|
* The `document` object is not available in server-side rendering, so this function should not be called in that context.
|
|
484
546
|
*
|
|
485
547
|
* @returns {string | undefined}
|
|
@@ -496,6 +558,90 @@ export function extractLocaleFromCookie() {
|
|
|
496
558
|
return undefined;
|
|
497
559
|
}
|
|
498
560
|
|
|
561
|
+
/**
|
|
562
|
+
* Extracts a locale from the accept-language header.
|
|
563
|
+
*
|
|
564
|
+
* Use the function on the server to extract the locale
|
|
565
|
+
* from the accept-language header that is sent by the client.
|
|
566
|
+
*
|
|
567
|
+
* @example
|
|
568
|
+
* const locale = extractLocaleFromHeader(request);
|
|
569
|
+
*
|
|
570
|
+
* @type {(request: Request) => Locale}
|
|
571
|
+
* @param {Request} request - The request object to extract the locale from.
|
|
572
|
+
* @returns {string|undefined} The negotiated preferred language.
|
|
573
|
+
*/
|
|
574
|
+
export function extractLocaleFromHeader(request) {
|
|
575
|
+
const acceptLanguageHeader = request.headers.get("accept-language");
|
|
576
|
+
if (acceptLanguageHeader) {
|
|
577
|
+
// Parse language preferences with their q-values and base language codes
|
|
578
|
+
const languages = acceptLanguageHeader
|
|
579
|
+
.split(",")
|
|
580
|
+
.map((lang) => {
|
|
581
|
+
const [tag, q = "1"] = lang.trim().split(";q=");
|
|
582
|
+
// Get both the full tag and base language code
|
|
583
|
+
const baseTag = tag?.split("-")[0]?.toLowerCase();
|
|
584
|
+
return {
|
|
585
|
+
fullTag: tag?.toLowerCase(),
|
|
586
|
+
baseTag,
|
|
587
|
+
q: Number(q),
|
|
588
|
+
};
|
|
589
|
+
})
|
|
590
|
+
.sort((a, b) => b.q - a.q);
|
|
591
|
+
for (const lang of languages) {
|
|
592
|
+
if (isLocale(lang.fullTag)) {
|
|
593
|
+
return lang.fullTag;
|
|
594
|
+
}
|
|
595
|
+
else if (isLocale(lang.baseTag)) {
|
|
596
|
+
return lang.baseTag;
|
|
597
|
+
}
|
|
598
|
+
}
|
|
599
|
+
return undefined;
|
|
600
|
+
}
|
|
601
|
+
return undefined;
|
|
602
|
+
}
|
|
603
|
+
|
|
604
|
+
/**
|
|
605
|
+
* Negotiates a preferred language from navigator.languages.
|
|
606
|
+
*
|
|
607
|
+
* Use the function on the client to extract the locale
|
|
608
|
+
* from the navigator.languages array.
|
|
609
|
+
*
|
|
610
|
+
* @example
|
|
611
|
+
* const locale = extractLocaleFromNavigator();
|
|
612
|
+
*
|
|
613
|
+
* @type {() => Locale | undefined}
|
|
614
|
+
* @returns {string | undefined}
|
|
615
|
+
*/
|
|
616
|
+
export function extractLocaleFromNavigator() {
|
|
617
|
+
if (!navigator?.languages?.length) {
|
|
618
|
+
return undefined;
|
|
619
|
+
}
|
|
620
|
+
const languages = navigator.languages.map((lang) => ({
|
|
621
|
+
fullTag: lang.toLowerCase(),
|
|
622
|
+
baseTag: lang.split("-")[0]?.toLowerCase(),
|
|
623
|
+
}));
|
|
624
|
+
for (const lang of languages) {
|
|
625
|
+
if (isLocale(lang.fullTag)) {
|
|
626
|
+
return lang.fullTag;
|
|
627
|
+
}
|
|
628
|
+
else if (isLocale(lang.baseTag)) {
|
|
629
|
+
return lang.baseTag;
|
|
630
|
+
}
|
|
631
|
+
}
|
|
632
|
+
return undefined;
|
|
633
|
+
}
|
|
634
|
+
|
|
635
|
+
/**
|
|
636
|
+
* If extractLocaleFromUrl is called many times on the same page and the URL
|
|
637
|
+
* hasn't changed, we don't need to recompute it every time which can get expensive.
|
|
638
|
+
* We might use a LRU cache if needed, but for now storing only the last result is enough.
|
|
639
|
+
* https://github.com/opral/monorepo/pull/3575#discussion_r2066731243
|
|
640
|
+
*/
|
|
641
|
+
/** @type {string|undefined} */
|
|
642
|
+
let cachedUrl;
|
|
643
|
+
/** @type {Locale|undefined} */
|
|
644
|
+
let cachedLocale;
|
|
499
645
|
/**
|
|
500
646
|
* Extracts the locale from a given URL using native URLPattern.
|
|
501
647
|
*
|
|
@@ -503,24 +649,36 @@ export function extractLocaleFromCookie() {
|
|
|
503
649
|
* @returns {Locale|undefined} The extracted locale, or undefined if no locale is found.
|
|
504
650
|
*/
|
|
505
651
|
export function extractLocaleFromUrl(url) {
|
|
652
|
+
const urlString = typeof url === "string" ? url : url.href;
|
|
653
|
+
if (cachedUrl === urlString) {
|
|
654
|
+
return cachedLocale;
|
|
655
|
+
}
|
|
656
|
+
let result;
|
|
506
657
|
if (TREE_SHAKE_DEFAULT_URL_PATTERN_USED) {
|
|
507
|
-
|
|
658
|
+
result = defaultUrlPatternExtractLocale(url);
|
|
508
659
|
}
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
for (const
|
|
513
|
-
const
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
660
|
+
else {
|
|
661
|
+
const urlObj = typeof url === "string" ? new URL(url) : url;
|
|
662
|
+
// Iterate over URL patterns
|
|
663
|
+
for (const element of urlPatterns) {
|
|
664
|
+
for (const [locale, localizedPattern] of element.localized) {
|
|
665
|
+
const match = new URLPattern(localizedPattern, urlObj.href).exec(urlObj.href);
|
|
666
|
+
if (!match) {
|
|
667
|
+
continue;
|
|
668
|
+
}
|
|
669
|
+
// Check if the locale is valid
|
|
670
|
+
if (assertIsLocale(locale)) {
|
|
671
|
+
result = locale;
|
|
672
|
+
break;
|
|
673
|
+
}
|
|
520
674
|
}
|
|
675
|
+
if (result)
|
|
676
|
+
break;
|
|
521
677
|
}
|
|
522
678
|
}
|
|
523
|
-
|
|
679
|
+
cachedUrl = urlString;
|
|
680
|
+
cachedLocale = result;
|
|
681
|
+
return result;
|
|
524
682
|
}
|
|
525
683
|
/**
|
|
526
684
|
* https://github.com/opral/inlang-paraglide-js/issues/381
|
|
@@ -848,6 +1006,120 @@ export function aggregateGroups(match) {
|
|
|
848
1006
|
};
|
|
849
1007
|
}
|
|
850
1008
|
|
|
1009
|
+
/**
|
|
1010
|
+
* @typedef {object} ShouldRedirectServerInput
|
|
1011
|
+
* @property {Request} request
|
|
1012
|
+
* @property {string | URL} [url]
|
|
1013
|
+
* @property {ReturnType<typeof assertIsLocale>} [locale]
|
|
1014
|
+
*
|
|
1015
|
+
* @typedef {object} ShouldRedirectClientInput
|
|
1016
|
+
* @property {undefined} [request]
|
|
1017
|
+
* @property {string | URL} [url]
|
|
1018
|
+
* @property {ReturnType<typeof assertIsLocale>} [locale]
|
|
1019
|
+
*
|
|
1020
|
+
* @typedef {ShouldRedirectServerInput | ShouldRedirectClientInput} ShouldRedirectInput
|
|
1021
|
+
*
|
|
1022
|
+
* @typedef {object} ShouldRedirectResult
|
|
1023
|
+
* @property {boolean} shouldRedirect - Indicates whether the consumer should perform a redirect.
|
|
1024
|
+
* @property {ReturnType<typeof assertIsLocale>} locale - Locale resolved using the configured strategies.
|
|
1025
|
+
* @property {URL | undefined} redirectUrl - Destination URL when a redirect is required.
|
|
1026
|
+
*/
|
|
1027
|
+
/**
|
|
1028
|
+
* Determines whether a redirect is required to align the current URL with the active locale.
|
|
1029
|
+
*
|
|
1030
|
+
* This helper mirrors the logic that powers `paraglideMiddleware`, but works in both server
|
|
1031
|
+
* and client environments. It evaluates the configured strategies in order, computes the
|
|
1032
|
+
* canonical localized URL, and reports when the current URL does not match.
|
|
1033
|
+
*
|
|
1034
|
+
* When called in the browser without arguments, the current `window.location.href` is used.
|
|
1035
|
+
*
|
|
1036
|
+
* @example
|
|
1037
|
+
* // Client side usage (e.g. TanStack Router beforeLoad hook)
|
|
1038
|
+
* async function beforeLoad({ location }) {
|
|
1039
|
+
* const decision = await shouldRedirect({ url: location.href });
|
|
1040
|
+
*
|
|
1041
|
+
* if (decision.shouldRedirect) {
|
|
1042
|
+
* throw redirect({ to: decision.redirectUrl.href });
|
|
1043
|
+
* }
|
|
1044
|
+
* }
|
|
1045
|
+
*
|
|
1046
|
+
* @example
|
|
1047
|
+
* // Server side usage with a Request
|
|
1048
|
+
* export async function handle(request) {
|
|
1049
|
+
* const decision = await shouldRedirect({ request });
|
|
1050
|
+
*
|
|
1051
|
+
* if (decision.shouldRedirect) {
|
|
1052
|
+
* return Response.redirect(decision.redirectUrl, 307);
|
|
1053
|
+
* }
|
|
1054
|
+
*
|
|
1055
|
+
* return render(request, decision.locale);
|
|
1056
|
+
* }
|
|
1057
|
+
*
|
|
1058
|
+
* @param {ShouldRedirectInput} [input]
|
|
1059
|
+
* @returns {Promise<ShouldRedirectResult>}
|
|
1060
|
+
*/
|
|
1061
|
+
export async function shouldRedirect(input = {}) {
|
|
1062
|
+
const locale = /** @type {ReturnType<typeof assertIsLocale>} */ (await resolveLocale(input));
|
|
1063
|
+
if (!strategy.includes("url")) {
|
|
1064
|
+
return { shouldRedirect: false, locale, redirectUrl: undefined };
|
|
1065
|
+
}
|
|
1066
|
+
const currentUrl = resolveUrl(input);
|
|
1067
|
+
const localizedUrl = localizeUrl(currentUrl.href, { locale });
|
|
1068
|
+
const shouldRedirectToLocalizedUrl = normalizeUrl(localizedUrl.href) !== normalizeUrl(currentUrl.href);
|
|
1069
|
+
return {
|
|
1070
|
+
shouldRedirect: shouldRedirectToLocalizedUrl,
|
|
1071
|
+
locale,
|
|
1072
|
+
redirectUrl: shouldRedirectToLocalizedUrl ? localizedUrl : undefined,
|
|
1073
|
+
};
|
|
1074
|
+
}
|
|
1075
|
+
/**
|
|
1076
|
+
* Resolves the locale either from the provided input or by using the configured strategies.
|
|
1077
|
+
*
|
|
1078
|
+
* @param {ShouldRedirectInput} input
|
|
1079
|
+
* @returns {Promise<ReturnType<typeof assertIsLocale>>}
|
|
1080
|
+
*/
|
|
1081
|
+
async function resolveLocale(input) {
|
|
1082
|
+
if (input.locale) {
|
|
1083
|
+
return assertIsLocale(input.locale);
|
|
1084
|
+
}
|
|
1085
|
+
if (input.request) {
|
|
1086
|
+
return extractLocaleFromRequestAsync(input.request);
|
|
1087
|
+
}
|
|
1088
|
+
return getLocale();
|
|
1089
|
+
}
|
|
1090
|
+
/**
|
|
1091
|
+
* Resolves the current URL from the provided input or runtime context.
|
|
1092
|
+
*
|
|
1093
|
+
* @param {ShouldRedirectInput} input
|
|
1094
|
+
* @returns {URL}
|
|
1095
|
+
*/
|
|
1096
|
+
function resolveUrl(input) {
|
|
1097
|
+
if (input.request) {
|
|
1098
|
+
return new URL(input.request.url);
|
|
1099
|
+
}
|
|
1100
|
+
if (input.url instanceof URL) {
|
|
1101
|
+
return new URL(input.url.href);
|
|
1102
|
+
}
|
|
1103
|
+
if (typeof input.url === "string") {
|
|
1104
|
+
return new URL(input.url, getUrlOrigin());
|
|
1105
|
+
}
|
|
1106
|
+
if (typeof window !== "undefined" && window?.location?.href) {
|
|
1107
|
+
return new URL(window.location.href);
|
|
1108
|
+
}
|
|
1109
|
+
throw new Error("shouldRedirect() requires either a request, an absolute URL, or must run in a browser environment.");
|
|
1110
|
+
}
|
|
1111
|
+
/**
|
|
1112
|
+
* Normalize url for comparison by stripping the trailing slash.
|
|
1113
|
+
*
|
|
1114
|
+
* @param {string} url
|
|
1115
|
+
* @returns {string}
|
|
1116
|
+
*/
|
|
1117
|
+
function normalizeUrl(url) {
|
|
1118
|
+
const urlObj = new URL(url);
|
|
1119
|
+
urlObj.pathname = urlObj.pathname.replace(/\/$/, "");
|
|
1120
|
+
return urlObj.href;
|
|
1121
|
+
}
|
|
1122
|
+
|
|
851
1123
|
/**
|
|
852
1124
|
* High-level URL localization function optimized for client-side UI usage.
|
|
853
1125
|
*
|
|
@@ -887,15 +1159,18 @@ export function aggregateGroups(match) {
|
|
|
887
1159
|
* @returns {string} The localized href, relative if input was relative
|
|
888
1160
|
*/
|
|
889
1161
|
export function localizeHref(href, options) {
|
|
890
|
-
const
|
|
1162
|
+
const currentLocale = getLocale();
|
|
1163
|
+
const locale = options?.locale ?? currentLocale;
|
|
891
1164
|
const url = new URL(href, getUrlOrigin());
|
|
892
|
-
const localized = localizeUrl(url,
|
|
1165
|
+
const localized = localizeUrl(url, { locale });
|
|
893
1166
|
// if the origin is identical and the href is relative,
|
|
894
1167
|
// return the relative path
|
|
895
1168
|
if (href.startsWith("/") && url.origin === localized.origin) {
|
|
896
1169
|
// check for cross origin localization in which case an absolute URL must be returned.
|
|
897
|
-
if (locale !==
|
|
898
|
-
const localizedCurrentLocale = localizeUrl(url, {
|
|
1170
|
+
if (locale !== currentLocale) {
|
|
1171
|
+
const localizedCurrentLocale = localizeUrl(url, {
|
|
1172
|
+
locale: currentLocale,
|
|
1173
|
+
});
|
|
899
1174
|
if (localizedCurrentLocale.origin !== localized.origin) {
|
|
900
1175
|
return localized.href;
|
|
901
1176
|
}
|
|
@@ -1057,6 +1332,67 @@ export function generateStaticLocalizedUrls(urls) {
|
|
|
1057
1332
|
return Array.from(localizedUrls);
|
|
1058
1333
|
}
|
|
1059
1334
|
|
|
1335
|
+
/**
|
|
1336
|
+
* @typedef {"cookie" | "baseLocale" | "globalVariable" | "url" | "preferredLanguage" | "localStorage"} BuiltInStrategy
|
|
1337
|
+
*/
|
|
1338
|
+
/**
|
|
1339
|
+
* @typedef {`custom_${string}`} CustomStrategy
|
|
1340
|
+
*/
|
|
1341
|
+
/**
|
|
1342
|
+
* @typedef {BuiltInStrategy | CustomStrategy} Strategy
|
|
1343
|
+
*/
|
|
1344
|
+
/**
|
|
1345
|
+
* @typedef {Array<Strategy>} Strategies
|
|
1346
|
+
*/
|
|
1347
|
+
/**
|
|
1348
|
+
* @typedef {{ getLocale: (request?: Request) => Promise<string | undefined> | (string | undefined) }} CustomServerStrategyHandler
|
|
1349
|
+
*/
|
|
1350
|
+
/**
|
|
1351
|
+
* @typedef {{ getLocale: () => Promise<string|undefined> | (string | undefined), setLocale: (locale: string) => Promise<void> | void }} CustomClientStrategyHandler
|
|
1352
|
+
*/
|
|
1353
|
+
/** @type {Map<string, CustomServerStrategyHandler>} */
|
|
1354
|
+
export const customServerStrategies = new Map();
|
|
1355
|
+
/** @type {Map<string, CustomClientStrategyHandler>} */
|
|
1356
|
+
export const customClientStrategies = new Map();
|
|
1357
|
+
/**
|
|
1358
|
+
* Checks if the given strategy is a custom strategy.
|
|
1359
|
+
*
|
|
1360
|
+
* @param {any} strategy The name of the custom strategy to validate.
|
|
1361
|
+
* Must be a string that starts with "custom-" followed by alphanumeric characters, hyphens, or underscores.
|
|
1362
|
+
* @returns {boolean} Returns true if it is a custom strategy, false otherwise.
|
|
1363
|
+
*/
|
|
1364
|
+
export function isCustomStrategy(strategy) {
|
|
1365
|
+
return (typeof strategy === "string" && /^custom-[A-Za-z0-9_-]+$/.test(strategy));
|
|
1366
|
+
}
|
|
1367
|
+
/**
|
|
1368
|
+
* Defines a custom strategy that is executed on the server.
|
|
1369
|
+
*
|
|
1370
|
+
* @param {any} strategy The name of the custom strategy to define. Must follow the pattern custom-name with alphanumeric characters, hyphens, or underscores.
|
|
1371
|
+
* @param {CustomServerStrategyHandler} handler The handler for the custom strategy, which should implement
|
|
1372
|
+
* the method getLocale.
|
|
1373
|
+
* @returns {void}
|
|
1374
|
+
*/
|
|
1375
|
+
export function defineCustomServerStrategy(strategy, handler) {
|
|
1376
|
+
if (!isCustomStrategy(strategy)) {
|
|
1377
|
+
throw new Error(`Invalid custom strategy: "${strategy}". Must be a custom strategy following the pattern custom-name.`);
|
|
1378
|
+
}
|
|
1379
|
+
customServerStrategies.set(strategy, handler);
|
|
1380
|
+
}
|
|
1381
|
+
/**
|
|
1382
|
+
* Defines a custom strategy that is executed on the client.
|
|
1383
|
+
*
|
|
1384
|
+
* @param {any} strategy The name of the custom strategy to define. Must follow the pattern custom-name with alphanumeric characters, hyphens, or underscores.
|
|
1385
|
+
* @param {CustomClientStrategyHandler} handler The handler for the custom strategy, which should implement the
|
|
1386
|
+
* methods getLocale and setLocale.
|
|
1387
|
+
* @returns {void}
|
|
1388
|
+
*/
|
|
1389
|
+
export function defineCustomClientStrategy(strategy, handler) {
|
|
1390
|
+
if (!isCustomStrategy(strategy)) {
|
|
1391
|
+
throw new Error(`Invalid custom strategy: "${strategy}". Must be a custom strategy following the pattern custom-name.`);
|
|
1392
|
+
}
|
|
1393
|
+
customClientStrategies.set(strategy, handler);
|
|
1394
|
+
}
|
|
1395
|
+
|
|
1060
1396
|
// ------ TYPES ------
|
|
1061
1397
|
|
|
1062
1398
|
/**
|