1
1
import * as d from "../localData" ;
2
2
import * as s from "../staticResource" ;
3
- import { structuredUrlToUrl , urlToStructuredUrl } from "../gen/url/main" ;
3
+ import {
4
+ StructuredUrl ,
5
+ structuredUrlToNodeUrlObject ,
6
+ structuredUrlToUrl ,
7
+ urlToStructuredUrl ,
8
+ } from "../gen/url/main" ;
9
+ import type { UrlObject } from "url" ;
4
10
import { clientScriptPath } from "../clientScriptHash" ;
5
11
6
- const languageQueryKey = "hl" ;
12
+ export const languageQueryKey = "hl" ;
7
13
export const defaultLanguage : d . Language = "English" ;
8
14
9
15
const origin =
@@ -19,23 +25,64 @@ export const locationAndLanguageToUrl = (
19
25
searchParams : new Map < string , string > ( [
20
26
[
21
27
languageQueryKey ,
22
- dataLanguageToHlQueryValue ( locationAndLanguage . language ) ,
28
+ dataLanguageToQueryValue ( locationAndLanguage . language ) ,
23
29
] ,
24
30
] ) ,
25
31
} ) ;
26
32
} ;
27
33
28
- const dataLanguageToHlQueryValue = ( language : d . Language ) : string => {
34
+ export const locationAndLanguageToStructuredUrl = (
35
+ locationAndLanguage : d . LocationAndLanguage
36
+ ) : StructuredUrl => {
37
+ return {
38
+ path : locationToPathList ( locationAndLanguage . location ) ,
39
+ searchParams : new Map < string , string > ( [
40
+ [
41
+ languageQueryKey ,
42
+ dataLanguageToQueryValue ( locationAndLanguage . language ) ,
43
+ ] ,
44
+ ] ) ,
45
+ } ;
46
+ } ;
47
+
48
+ export const locationAndLanguageToNodeUrlObject = (
49
+ locationAndLanguage : d . LocationAndLanguage
50
+ ) : UrlObject => {
51
+ return structuredUrlToNodeUrlObject (
52
+ locationAndLanguageToStructuredUrl ( locationAndLanguage )
53
+ ) ;
54
+ } ;
55
+
56
+ export const dataLanguageToQueryValue = ( language : d . Language ) : string => {
29
57
switch ( language ) {
30
58
case "English" :
31
- return "en" ;
59
+ return englishId ;
32
60
case "Japanese" :
33
- return "ja" ;
61
+ return japaneseId ;
34
62
case "Esperanto" :
35
- return "eo" ;
63
+ return esperantoId ;
36
64
}
37
65
} ;
38
66
67
+ export const queryValueToDataLanguage = ( language : string ) : d . Language => {
68
+ switch ( language ) {
69
+ case englishId :
70
+ return "English" ;
71
+ case japaneseId :
72
+ return "Japanese" ;
73
+ case esperantoId :
74
+ return "Esperanto" ;
75
+ }
76
+ return defaultLanguage ;
77
+ } ;
78
+
79
+ export const isValidLanguageQueryValue = ( value : unknown ) : boolean => {
80
+ if ( typeof value !== "string" ) {
81
+ return false ;
82
+ }
83
+ return new Set ( [ englishId , japaneseId , esperantoId ] ) . has ( value ) ;
84
+ } ;
85
+
39
86
const locationToPathList = ( location : d . Location ) : ReadonlyArray < string > => {
40
87
switch ( location . _ ) {
41
88
case "Home" :
@@ -76,7 +123,9 @@ const toolToPath = (toolName: d.ToolName): string => {
76
123
* URLのパスを場所のデータに変換する
77
124
* @param url `https://definy.app/project/580d8d6a54cf43e4452a0bba6694a4ed?hl=ja` のようなURL
78
125
*/
79
- export const urlToUrlData = ( url : URL ) : d . UrlData => {
126
+ export const urlToUrlData = (
127
+ url : Readonly < Pick < URL , "pathname" | "search" > >
128
+ ) : d . UrlData => {
80
129
const structuredUrl = urlToStructuredUrl ( url . pathname , url . search ) ;
81
130
if (
82
131
structuredUrl . path [ 0 ] === "logInCallback" &&
@@ -153,11 +202,11 @@ const locationFromUrl = (path: ReadonlyArray<string>): d.Location => {
153
202
154
203
const languageFromIdString = ( languageAsString : string ) : d . Language => {
155
204
switch ( languageAsString ) {
156
- case "ja" :
205
+ case japaneseId :
157
206
return "Japanese" ;
158
- case "en" :
207
+ case englishId :
159
208
return "English" ;
160
- case "eo" :
209
+ case esperantoId :
161
210
return "Esperanto" ;
162
211
}
163
212
return defaultLanguage ;
@@ -191,3 +240,7 @@ const localProjectPath = "local-project";
191
240
const toolPath = "tool" ;
192
241
const toolThemeColorRainbow = "theme-color-rainbow" ;
193
242
const toolSoundQuiz = "sound-quiz" ;
243
+
244
+ const englishId = "en" ;
245
+ const esperantoId = "eo" ;
246
+ const japaneseId = "ja" ;
0 commit comments