@quilted/preact-localize 0.1.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (32) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/build/esm/index.mjs +2 -1
  3. package/build/esm/request-router.mjs +5 -5
  4. package/build/esm/routing/LocalizedLink.mjs +6 -6
  5. package/build/esm/routing/LocalizedNavigation.mjs +48 -0
  6. package/build/esm/routing/LocalizedRouter.mjs +34 -0
  7. package/build/esm/routing/localization/by-locale.mjs +5 -5
  8. package/build/esnext/index.esnext +2 -1
  9. package/build/esnext/request-router.esnext +5 -6
  10. package/build/esnext/routing/LocalizedLink.esnext +7 -7
  11. package/build/esnext/routing/LocalizedNavigation.esnext +36 -0
  12. package/build/esnext/routing/LocalizedRouter.esnext +32 -0
  13. package/build/esnext/routing/localization/by-locale.esnext +9 -13
  14. package/build/tsconfig.tsbuildinfo +1 -1
  15. package/build/typescript/routing/LocalizedNavigation.d.ts +13 -0
  16. package/build/typescript/routing/LocalizedNavigation.d.ts.map +1 -0
  17. package/build/typescript/routing/LocalizedRouter.d.ts +9 -0
  18. package/build/typescript/routing/LocalizedRouter.d.ts.map +1 -0
  19. package/build/typescript/routing/types.d.ts +2 -2
  20. package/build/typescript/routing.d.ts +2 -1
  21. package/build/typescript/routing.d.ts.map +1 -1
  22. package/package.json +4 -4
  23. package/source/request-router.ts +4 -4
  24. package/source/routing/LocalizedLink.tsx +7 -7
  25. package/source/routing/LocalizedNavigation.tsx +64 -0
  26. package/source/routing/LocalizedRouter.ts +46 -0
  27. package/source/routing/localization/by-locale.ts +5 -5
  28. package/source/routing/types.ts +2 -2
  29. package/source/routing.ts +2 -1
  30. package/build/esm/routing/LocalizedRouting.mjs +0 -65
  31. package/build/esnext/routing/LocalizedRouting.esnext +0 -64
  32. package/source/routing/LocalizedRouting.tsx +0 -94
@@ -2,8 +2,8 @@ export interface RouteLocalization {
2
2
  readonly locales: string[];
3
3
  readonly defaultLocale: string;
4
4
  matchLocale(locale: string): string | undefined;
5
- redirectUrl(from: URL, options: {to: string}): URL;
6
- localeFromUrl(url: URL): string | undefined;
5
+ redirectURL(from: URL, options: {to: string}): URL;
6
+ localeFromURL(url: URL): string | undefined;
7
7
  }
8
8
 
9
9
  export interface ResolvedRouteLocalization extends RouteLocalization {
package/source/routing.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  export {LocalizedLink} from './routing/LocalizedLink.tsx';
2
- export {LocalizedRouting} from './routing/LocalizedRouting.tsx';
2
+ export {LocalizedNavigation} from './routing/LocalizedNavigation.tsx';
3
+ export {LocalizedRouter} from './routing/LocalizedRouter.ts';
3
4
  export {useRouteLocalization} from './routing/context.ts';
4
5
  export {createRouteLocalization} from './routing/localization/by-locale.ts';
5
6
  export {createRoutePathLocalization} from './routing/localization/by-path.ts';
@@ -1,65 +0,0 @@
1
- import { useMemo, useCallback } from 'preact/hooks';
2
- import { useInitialURL, Routing } from '@quilted/preact-router';
3
- import { Localization } from '../Localization.mjs';
4
- import { useLocaleFromEnvironment } from '../hooks/locale-from-environment.mjs';
5
- import { RouteLocalizationContext } from './context.mjs';
6
- import { jsx } from 'preact/jsx-runtime';
7
-
8
- function LocalizedRouting({
9
- locale: explicitLocale,
10
- localization,
11
- children,
12
- isExternal: isExplicitlyExternal,
13
- ...props
14
- }) {
15
- const initialUrl = useInitialURL();
16
- const localeFromEnvironment = useLocaleFromEnvironment();
17
- const {
18
- prefix,
19
- isExternal: isExternalByRouteLocale,
20
- resolvedLocalization
21
- } = useMemo(() => {
22
- const {
23
- localeFromUrl
24
- } = localization;
25
- const matchedLocale = initialUrl && localeFromUrl(initialUrl);
26
- const resolvedLocalization = {
27
- locale: matchedLocale ?? localization.defaultLocale,
28
- ...localization
29
- };
30
- const rootUrl = localization.redirectUrl(new URL('/', initialUrl ?? 'https://example.com'), {
31
- to: resolvedLocalization.locale
32
- });
33
- return {
34
- prefix: rootUrl.pathname.length > 1 ? rootUrl.pathname : undefined,
35
- isExternal: url => matchedLocale !== localeFromUrl(url),
36
- resolvedLocalization
37
- };
38
- }, [initialUrl, localization]);
39
- const isExternal = useCallback((url, currentUrl) => {
40
- return isExternalByRouteLocale(url) || (isExplicitlyExternal?.(url, currentUrl) ?? false);
41
- }, [isExplicitlyExternal, isExternalByRouteLocale]);
42
- let resolvedLocale;
43
- if (explicitLocale) {
44
- resolvedLocale = explicitLocale;
45
- } else if (localeFromEnvironment != null && localeFromEnvironment.toLowerCase().startsWith(resolvedLocalization.locale.toLowerCase())) {
46
- resolvedLocale = localeFromEnvironment;
47
- } else {
48
- resolvedLocale = resolvedLocalization.locale;
49
- }
50
- return jsx(Routing, {
51
- ...props,
52
- prefix: prefix,
53
- url: initialUrl,
54
- isExternal: isExternal,
55
- children: jsx(Localization, {
56
- locale: resolvedLocale,
57
- children: jsx(RouteLocalizationContext.Provider, {
58
- value: resolvedLocalization,
59
- children: children
60
- })
61
- })
62
- });
63
- }
64
-
65
- export { LocalizedRouting };
@@ -1,64 +0,0 @@
1
- import { jsx } from 'preact/jsx-runtime';
2
- import { useMemo, useCallback } from 'preact/hooks';
3
- import { useInitialURL, Routing } from '@quilted/preact-router';
4
- import { Localization } from '../Localization.esnext';
5
- import { useLocaleFromEnvironment } from '../hooks/locale-from-environment.esnext';
6
- import { RouteLocalizationContext } from './context.esnext';
7
-
8
- function LocalizedRouting({
9
- locale: explicitLocale,
10
- localization,
11
- children,
12
- isExternal: isExplicitlyExternal,
13
- ...props
14
- }) {
15
- const initialUrl = useInitialURL();
16
- const localeFromEnvironment = useLocaleFromEnvironment();
17
- const {
18
- prefix,
19
- isExternal: isExternalByRouteLocale,
20
- resolvedLocalization
21
- } = useMemo(() => {
22
- const { localeFromUrl } = localization;
23
- const matchedLocale = initialUrl && localeFromUrl(initialUrl);
24
- const resolvedLocalization2 = {
25
- locale: matchedLocale ?? localization.defaultLocale,
26
- ...localization
27
- };
28
- const rootUrl = localization.redirectUrl(
29
- new URL("/", initialUrl ?? "https://example.com"),
30
- { to: resolvedLocalization2.locale }
31
- );
32
- return {
33
- prefix: rootUrl.pathname.length > 1 ? rootUrl.pathname : void 0,
34
- isExternal: (url) => matchedLocale !== localeFromUrl(url),
35
- resolvedLocalization: resolvedLocalization2
36
- };
37
- }, [initialUrl, localization]);
38
- const isExternal = useCallback(
39
- (url, currentUrl) => {
40
- return isExternalByRouteLocale(url) || (isExplicitlyExternal?.(url, currentUrl) ?? false);
41
- },
42
- [isExplicitlyExternal, isExternalByRouteLocale]
43
- );
44
- let resolvedLocale;
45
- if (explicitLocale) {
46
- resolvedLocale = explicitLocale;
47
- } else if (localeFromEnvironment != null && localeFromEnvironment.toLowerCase().startsWith(resolvedLocalization.locale.toLowerCase())) {
48
- resolvedLocale = localeFromEnvironment;
49
- } else {
50
- resolvedLocale = resolvedLocalization.locale;
51
- }
52
- return /* @__PURE__ */ jsx(
53
- Routing,
54
- {
55
- ...props,
56
- prefix,
57
- url: initialUrl,
58
- isExternal,
59
- children: /* @__PURE__ */ jsx(Localization, { locale: resolvedLocale, children: /* @__PURE__ */ jsx(RouteLocalizationContext.Provider, { value: resolvedLocalization, children }) })
60
- }
61
- );
62
- }
63
-
64
- export { LocalizedRouting };
@@ -1,94 +0,0 @@
1
- import type {ComponentProps} from 'preact';
2
- import {useCallback, useMemo} from 'preact/hooks';
3
- import {Routing, useInitialURL} from '@quilted/preact-router';
4
-
5
- import {Localization} from '../Localization.tsx';
6
- import {useLocaleFromEnvironment} from '../hooks/locale-from-environment.ts';
7
-
8
- import type {RouteLocalization, ResolvedRouteLocalization} from './types.ts';
9
- import {RouteLocalizationContext} from './context.ts';
10
-
11
- export type LocalizedRoutingProps = Omit<
12
- ComponentProps<typeof Routing>,
13
- 'prefix' | 'initialUrl'
14
- > & {
15
- locale?: string;
16
- localization: RouteLocalization;
17
- };
18
-
19
- export function LocalizedRouting({
20
- locale: explicitLocale,
21
- localization,
22
- children,
23
- isExternal: isExplicitlyExternal,
24
- ...props
25
- }: LocalizedRoutingProps) {
26
- const initialUrl = useInitialURL();
27
- const localeFromEnvironment = useLocaleFromEnvironment();
28
-
29
- const {
30
- prefix,
31
- isExternal: isExternalByRouteLocale,
32
- resolvedLocalization,
33
- } = useMemo(() => {
34
- const {localeFromUrl} = localization;
35
-
36
- const matchedLocale = initialUrl && localeFromUrl(initialUrl);
37
-
38
- const resolvedLocalization: ResolvedRouteLocalization = {
39
- locale: matchedLocale ?? localization.defaultLocale,
40
- ...localization,
41
- };
42
-
43
- const rootUrl = localization.redirectUrl(
44
- new URL('/', initialUrl ?? 'https://example.com'),
45
- {to: resolvedLocalization.locale},
46
- );
47
-
48
- return {
49
- prefix: rootUrl.pathname.length > 1 ? rootUrl.pathname : undefined,
50
- isExternal: (url: URL) => matchedLocale !== localeFromUrl(url),
51
- resolvedLocalization,
52
- };
53
- }, [initialUrl, localization]);
54
-
55
- const isExternal = useCallback(
56
- (url: URL, currentUrl: URL) => {
57
- return (
58
- isExternalByRouteLocale(url) ||
59
- (isExplicitlyExternal?.(url, currentUrl) ?? false)
60
- );
61
- },
62
- [isExplicitlyExternal, isExternalByRouteLocale],
63
- );
64
-
65
- let resolvedLocale: string;
66
-
67
- if (explicitLocale) {
68
- resolvedLocale = explicitLocale;
69
- } else if (
70
- localeFromEnvironment != null &&
71
- localeFromEnvironment
72
- .toLowerCase()
73
- .startsWith(resolvedLocalization.locale.toLowerCase())
74
- ) {
75
- resolvedLocale = localeFromEnvironment;
76
- } else {
77
- resolvedLocale = resolvedLocalization.locale;
78
- }
79
-
80
- return (
81
- <Routing
82
- {...props}
83
- prefix={prefix}
84
- url={initialUrl}
85
- isExternal={isExternal}
86
- >
87
- <Localization locale={resolvedLocale}>
88
- <RouteLocalizationContext.Provider value={resolvedLocalization}>
89
- {children}
90
- </RouteLocalizationContext.Provider>
91
- </Localization>
92
- </Routing>
93
- );
94
- }