@bleedingdev/modern-js-plugin-i18n 3.9.0-ultramodern.7 → 3.9.0-ultramodern.9
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/cjs/cli/index.js +11 -0
- package/dist/cjs/cli/localisedRoutes.js +46 -0
- package/dist/cjs/runtime/core.js +4 -1
- package/dist/cjs/runtime/utils.js +6 -2
- package/dist/cjs/server/defaultUrlStrategy.js +48 -0
- package/dist/cjs/server/index.js +3 -2
- package/dist/cjs/server/mappedUrlStrategy.js +43 -0
- package/dist/cjs/server/redirectPolicy.js +13 -9
- package/dist/cjs/shared/mappedUrlStrategy.js +63 -0
- package/dist/cjs/shared/urlStrategy.js +31 -1
- package/dist/esm/cli/index.mjs +11 -0
- package/dist/esm/cli/localisedRoutes.mjs +8 -0
- package/dist/esm/runtime/core.mjs +4 -1
- package/dist/esm/runtime/utils.mjs +6 -2
- package/dist/esm/server/defaultUrlStrategy.mjs +7 -0
- package/dist/esm/server/index.mjs +3 -2
- package/dist/esm/server/mappedUrlStrategy.mjs +1 -0
- package/dist/esm/server/redirectPolicy.mjs +6 -2
- package/dist/esm/shared/mappedUrlStrategy.mjs +19 -0
- package/dist/esm/shared/urlStrategy.mjs +7 -0
- package/dist/esm-node/cli/index.mjs +11 -0
- package/dist/esm-node/cli/localisedRoutes.mjs +9 -0
- package/dist/esm-node/runtime/core.mjs +4 -1
- package/dist/esm-node/runtime/utils.mjs +6 -2
- package/dist/esm-node/server/defaultUrlStrategy.mjs +8 -0
- package/dist/esm-node/server/index.mjs +3 -2
- package/dist/esm-node/server/mappedUrlStrategy.mjs +2 -0
- package/dist/esm-node/server/redirectPolicy.mjs +6 -2
- package/dist/esm-node/shared/mappedUrlStrategy.mjs +20 -0
- package/dist/esm-node/shared/urlStrategy.mjs +7 -0
- package/dist/types/cli/localisedRoutes.d.ts +18 -0
- package/dist/types/runtime/core.d.ts +1 -1
- package/dist/types/runtime/utils.d.ts +1 -1
- package/dist/types/server/defaultUrlStrategy.d.ts +11 -0
- package/dist/types/server/index.d.ts +1 -1
- package/dist/types/server/mappedUrlStrategy.d.ts +7 -0
- package/dist/types/server/redirectPolicy.d.ts +1 -1
- package/dist/types/shared/mappedUrlStrategy.d.ts +27 -0
- package/dist/types/shared/type.d.ts +10 -0
- package/dist/types/shared/urlStrategy.d.ts +11 -0
- package/package.json +11 -10
- package/rstest.config.mts +4 -0
- package/src/cli/index.ts +42 -1
- package/src/cli/localisedRoutes.ts +43 -0
- package/src/runtime/core.tsx +18 -2
- package/src/runtime/utils.ts +13 -4
- package/src/server/defaultUrlStrategy.ts +27 -0
- package/src/server/index.ts +7 -12
- package/src/server/mappedUrlStrategy.ts +10 -0
- package/src/server/redirectPolicy.ts +19 -4
- package/src/shared/mappedUrlStrategy.ts +59 -0
- package/src/shared/type.ts +10 -0
- package/src/shared/urlStrategy.ts +27 -0
- package/tests/defaultUrlStrategy.test.ts +107 -0
- package/tests/localisedRouteGeneration.test.ts +159 -0
- package/tests/localisedUrls.test.ts +21 -4
- package/tests/mappedUrlStrategyDerivation.test.ts +62 -0
- package/tests/redirectPolicy.test.ts +53 -0
- package/tests/urlStrategySerialization.test.ts +122 -0
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { describe, expect, test } from '@rstest/core';
|
|
2
|
+
import { buildLocalizedUrl, shouldIgnoreRedirect } from '../src/runtime/utils';
|
|
3
|
+
import { resolveMappedUrlStrategy } from '../src/server/mappedUrlStrategy';
|
|
4
|
+
import {
|
|
5
|
+
buildLocalizedUrl as buildServerLocalizedUrl,
|
|
6
|
+
shouldIgnoreRedirect as shouldIgnoreServerRedirect,
|
|
7
|
+
} from '../src/server/redirectPolicy';
|
|
8
|
+
import {
|
|
9
|
+
asI18nUrlStrategy,
|
|
10
|
+
isUnusableI18nUrlStrategy,
|
|
11
|
+
} from '../src/shared/urlStrategy';
|
|
12
|
+
|
|
13
|
+
// What a configured `urlStrategy` looks like after the generated runtime
|
|
14
|
+
// registration has carried it through JSON: an object with no methods left.
|
|
15
|
+
const serializedStrategy = {} as any;
|
|
16
|
+
|
|
17
|
+
const workingStrategy = {
|
|
18
|
+
localizePathname: (pathname: string, language: string) =>
|
|
19
|
+
`/${language}${pathname}`,
|
|
20
|
+
canonicalPathname: (pathname: string) => pathname,
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
const createRequest = (pathname: string) =>
|
|
24
|
+
({ url: `https://example.test${pathname}` }) as any;
|
|
25
|
+
|
|
26
|
+
describe('URL strategy that lost its methods in transit', () => {
|
|
27
|
+
test('is recognised as unusable rather than accepted', () => {
|
|
28
|
+
expect(asI18nUrlStrategy(serializedStrategy)).toBeUndefined();
|
|
29
|
+
expect(isUnusableI18nUrlStrategy(serializedStrategy)).toBe(true);
|
|
30
|
+
expect(isUnusableI18nUrlStrategy(undefined)).toBe(false);
|
|
31
|
+
expect(asI18nUrlStrategy(workingStrategy)).toBe(workingStrategy);
|
|
32
|
+
expect(isUnusableI18nUrlStrategy(workingStrategy)).toBe(false);
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
test('a partial strategy is unusable too', () => {
|
|
36
|
+
expect(asI18nUrlStrategy({ localizePathname: () => '/x' })).toBeUndefined();
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
test('the client link builder falls back instead of throwing', () => {
|
|
40
|
+
expect(() =>
|
|
41
|
+
buildLocalizedUrl('/about', 'cs', ['en', 'cs'], serializedStrategy),
|
|
42
|
+
).not.toThrow();
|
|
43
|
+
expect(
|
|
44
|
+
buildLocalizedUrl('/about', 'cs', ['en', 'cs'], serializedStrategy),
|
|
45
|
+
).toBe('/cs/about');
|
|
46
|
+
expect(
|
|
47
|
+
buildLocalizedUrl('/about', 'cs', ['en', 'cs'], workingStrategy),
|
|
48
|
+
).toBe('/cs/about');
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
test('the client redirect check falls back instead of throwing', () => {
|
|
52
|
+
expect(() =>
|
|
53
|
+
shouldIgnoreRedirect(
|
|
54
|
+
'/about',
|
|
55
|
+
['en', 'cs'],
|
|
56
|
+
undefined,
|
|
57
|
+
serializedStrategy,
|
|
58
|
+
),
|
|
59
|
+
).not.toThrow();
|
|
60
|
+
expect(
|
|
61
|
+
shouldIgnoreRedirect(
|
|
62
|
+
'/about',
|
|
63
|
+
['en', 'cs'],
|
|
64
|
+
undefined,
|
|
65
|
+
serializedStrategy,
|
|
66
|
+
),
|
|
67
|
+
).toBe(false);
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
test('the server redirect builder falls back instead of throwing', () => {
|
|
71
|
+
expect(() =>
|
|
72
|
+
buildServerLocalizedUrl(
|
|
73
|
+
createRequest('/about'),
|
|
74
|
+
'/*',
|
|
75
|
+
'cs',
|
|
76
|
+
['en', 'cs'],
|
|
77
|
+
serializedStrategy,
|
|
78
|
+
),
|
|
79
|
+
).not.toThrow();
|
|
80
|
+
expect(
|
|
81
|
+
buildServerLocalizedUrl(
|
|
82
|
+
createRequest('/about'),
|
|
83
|
+
'/*',
|
|
84
|
+
'cs',
|
|
85
|
+
['en', 'cs'],
|
|
86
|
+
serializedStrategy,
|
|
87
|
+
),
|
|
88
|
+
).toBe('/cs/about');
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
test('the server redirect skip check falls back instead of throwing', () => {
|
|
92
|
+
expect(() =>
|
|
93
|
+
shouldIgnoreServerRedirect(
|
|
94
|
+
'/about',
|
|
95
|
+
'/*',
|
|
96
|
+
undefined,
|
|
97
|
+
serializedStrategy,
|
|
98
|
+
['en', 'cs'],
|
|
99
|
+
),
|
|
100
|
+
).not.toThrow();
|
|
101
|
+
});
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
describe('serializable mapped locale URLs', () => {
|
|
105
|
+
test('produce a working strategy on the server', () => {
|
|
106
|
+
const strategy = resolveMappedUrlStrategy({
|
|
107
|
+
languages: ['en', 'cs'],
|
|
108
|
+
localisedUrls: { '/about': { en: '/about', cs: '/o-nas' } },
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
expect(strategy).toBeDefined();
|
|
112
|
+
expect(strategy?.localizePathname('/about', 'cs', ['en', 'cs'])).toBe(
|
|
113
|
+
'/cs/o-nas',
|
|
114
|
+
);
|
|
115
|
+
});
|
|
116
|
+
|
|
117
|
+
test('are absent when no map is configured', () => {
|
|
118
|
+
expect(resolveMappedUrlStrategy(undefined)).toBeUndefined();
|
|
119
|
+
expect(resolveMappedUrlStrategy({ languages: ['en'] })).toBeUndefined();
|
|
120
|
+
expect(resolveMappedUrlStrategy({ localisedUrls: {} })).toBeUndefined();
|
|
121
|
+
});
|
|
122
|
+
});
|