ebt-vue3 2.34.0 → 2.36.2
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/.prettierignore +8 -0
- package/.prettierrc.json +11 -0
- package/eslint.config.js +42 -7
- package/package.json +22 -6
- package/scripts/i18n-langs.cjs +7 -8
- package/scripts/i18n-msg.cjs +10 -8
- package/src/auto/messages.mjs +36 -18
- package/src/i18n/cs.mjs +3 -2
- package/src/i18n/da.mjs +3 -2
- package/src/i18n/de.mjs +3 -2
- package/src/i18n/en.mjs +3 -2
- package/src/i18n/es.mjs +3 -2
- package/src/i18n/fr.mjs +3 -2
- package/src/i18n/hi.mjs +3 -2
- package/src/i18n/is.mjs +3 -2
- package/src/i18n/it.mjs +3 -2
- package/src/i18n/jpn.mjs +3 -2
- package/src/i18n/nb.mjs +3 -2
- package/src/i18n/nl.mjs +3 -2
- package/src/i18n/pl.mjs +3 -2
- package/src/i18n/pt.mjs +3 -2
- package/src/i18n/ro.mjs +3 -2
- package/src/i18n/ru.mjs +3 -2
- package/src/i18n/si.mjs +3 -2
- package/src/i18n/vi.mjs +3 -2
- package/src/types/global.d.ts +23 -0
- package/test/ebt-settings.mjs +4 -3
- package/test/mocha-config.json +3 -0
- package/test/test-setup.mjs +24 -0
- package/test/test-utils.mjs +69 -0
- package/tsconfig.json +35 -0
package/.prettierignore
ADDED
package/.prettierrc.json
ADDED
package/eslint.config.js
CHANGED
|
@@ -1,7 +1,42 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
1
|
+
import js from '@eslint/js'
|
|
2
|
+
import vue from 'eslint-plugin-vue'
|
|
3
|
+
import globals from 'globals'
|
|
4
|
+
|
|
5
|
+
export default [
|
|
6
|
+
js.configs.recommended,
|
|
7
|
+
...vue.configs['flat/recommended'],
|
|
8
|
+
{
|
|
9
|
+
languageOptions: {
|
|
10
|
+
globals: {
|
|
11
|
+
...globals.browser,
|
|
12
|
+
...globals.node,
|
|
13
|
+
xit: true,
|
|
14
|
+
},
|
|
15
|
+
ecmaVersion: 2022,
|
|
16
|
+
sourceType: 'module',
|
|
17
|
+
},
|
|
18
|
+
plugins: {
|
|
19
|
+
vue,
|
|
20
|
+
},
|
|
21
|
+
rules: {
|
|
22
|
+
'vue/multi-word-component-names': 'off',
|
|
23
|
+
'vue/no-unused-vars': 'error',
|
|
24
|
+
'no-unused-vars': 'error',
|
|
25
|
+
'no-console': 'warn',
|
|
26
|
+
'prefer-const': 'error',
|
|
27
|
+
'no-var': 'error',
|
|
28
|
+
},
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
files: ['**/*.vue'],
|
|
32
|
+
languageOptions: {
|
|
33
|
+
parser: vue.parser,
|
|
34
|
+
parserOptions: {
|
|
35
|
+
parser: '@babel/eslint-parser',
|
|
36
|
+
requireConfigFile: false,
|
|
37
|
+
ecmaVersion: 2022,
|
|
38
|
+
sourceType: 'module',
|
|
39
|
+
},
|
|
40
|
+
},
|
|
41
|
+
},
|
|
42
|
+
]
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ebt-vue3",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.36.2",
|
|
4
4
|
"description": "Vue3 Library for SuttaCentral Voice EBT-Sites",
|
|
5
5
|
"author": "Karl Lew",
|
|
6
6
|
"scripts": {
|
|
@@ -10,7 +10,12 @@
|
|
|
10
10
|
"build:html": "scripts/app-html.sh",
|
|
11
11
|
"build:messages": "node scripts/build-messages.mjs > src/auto/messages.mjs",
|
|
12
12
|
"dev": "vite",
|
|
13
|
-
"
|
|
13
|
+
"dev:host": "vite --host",
|
|
14
|
+
"eslint": "eslint . --ext .js,.mjs,.vue",
|
|
15
|
+
"eslint:fix": "eslint . --ext .js,.mjs,.vue --fix",
|
|
16
|
+
"format": "prettier --write .",
|
|
17
|
+
"format:check": "prettier --check .",
|
|
18
|
+
"type-check": "vue-tsc --noEmit",
|
|
14
19
|
"gh-pages": "scripts/gh-pages.sh",
|
|
15
20
|
"git:commit": "scripts/git-commit.sh",
|
|
16
21
|
"preview": "vite preview",
|
|
@@ -22,9 +27,13 @@
|
|
|
22
27
|
"test:test": "mocha --config test/mocha-config.json -g TESTTEST",
|
|
23
28
|
"test:verbose": "mocha --inline-diffs",
|
|
24
29
|
"test:watch": "mocha -w --inline-diffs",
|
|
30
|
+
"test:debug": "mocha --inline-diffs --timeout 10000",
|
|
31
|
+
"test:coverage": "echo 'Coverage not configured yet'",
|
|
25
32
|
"version": "scripts/version.sh",
|
|
26
33
|
"vite": "vite",
|
|
27
|
-
"vite:build": "vite build"
|
|
34
|
+
"vite:build": "vite build",
|
|
35
|
+
"lint": "npm run eslint && npm run format:check",
|
|
36
|
+
"lint:fix": "npm run eslint:fix && npm run format"
|
|
28
37
|
},
|
|
29
38
|
"main": "src/index.mjs",
|
|
30
39
|
"module": "index.mjs",
|
|
@@ -37,7 +46,7 @@
|
|
|
37
46
|
"merkle-json": "^2.10.0",
|
|
38
47
|
"pinia": "^2.0.16",
|
|
39
48
|
"roboto-fontface": "*",
|
|
40
|
-
"scv-esm": "^1.115.
|
|
49
|
+
"scv-esm": "^1.115.753",
|
|
41
50
|
"serve-favicon": "^2.5.0",
|
|
42
51
|
"uuid": "^9.0.0",
|
|
43
52
|
"vite-plugin-vuetify": "^2.0.3",
|
|
@@ -48,12 +57,17 @@
|
|
|
48
57
|
"webfontloader": "^1.0.0"
|
|
49
58
|
},
|
|
50
59
|
"devDependencies": {
|
|
60
|
+
"@babel/eslint-parser": "^7.24.0",
|
|
61
|
+
"@eslint/js": "^9.16.0",
|
|
51
62
|
"@vitejs/plugin-vue": "^5.0.4",
|
|
63
|
+
"@vue/tsconfig": "^0.5.1",
|
|
52
64
|
"ebt-deepl": "^1.58.0",
|
|
53
65
|
"eslint": "^9.16.0",
|
|
66
|
+
"eslint-plugin-vue": "^9.28.0",
|
|
54
67
|
"esm": "^3.2.25",
|
|
55
68
|
"execa": "^6.1.0",
|
|
56
69
|
"fake-indexeddb": "^4.0.0",
|
|
70
|
+
"globals": "^15.12.0",
|
|
57
71
|
"json": "^11.0.0",
|
|
58
72
|
"markdown-it": "^13.0.1",
|
|
59
73
|
"markdown-it-footnote": "^3.0.3",
|
|
@@ -61,12 +75,14 @@
|
|
|
61
75
|
"mocha": "^10.0.0",
|
|
62
76
|
"mock-local-storage": "^1.0.4",
|
|
63
77
|
"node-fetch": "^3.2.10",
|
|
78
|
+
"prettier": "^3.3.3",
|
|
64
79
|
"scv-bilara": "^3.171.4",
|
|
65
80
|
"should": "^13.2.3",
|
|
66
81
|
"supertest": "^7.0.0",
|
|
67
|
-
"
|
|
82
|
+
"typescript": "^5.9.3",
|
|
68
83
|
"vite": "^6.3.5",
|
|
69
|
-
"vue-cli-plugin-vuetify": "~2.5.1"
|
|
84
|
+
"vue-cli-plugin-vuetify": "~2.5.1",
|
|
85
|
+
"vue-tsc": "^2.1.10"
|
|
70
86
|
},
|
|
71
87
|
"bin": {},
|
|
72
88
|
"directories": {
|
package/scripts/i18n-langs.cjs
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
const fs = require("fs");
|
|
3
|
-
const path = require(
|
|
4
|
-
const tsImport = require("ts-import");
|
|
3
|
+
const path = require("path");
|
|
5
4
|
|
|
6
5
|
const I18NDIR = path.join(__dirname, '../src/i18n');
|
|
7
6
|
|
|
@@ -9,27 +8,27 @@ let args = process.argv;
|
|
|
9
8
|
let [nodePath, progPath, key, value] = args;
|
|
10
9
|
let script = path.basename(progPath);
|
|
11
10
|
let voices = require('../src/auto/voices.json')
|
|
12
|
-
.reduce((a,v) => {
|
|
11
|
+
.reduce((a, v) => {
|
|
13
12
|
a[v.langTrans] = true;
|
|
14
13
|
return a;
|
|
15
14
|
}, {});;
|
|
16
15
|
|
|
17
|
-
(async ()=>{
|
|
16
|
+
(async () => {
|
|
18
17
|
let files = await fs.promises.readdir(I18NDIR);
|
|
19
18
|
let langs = [];
|
|
20
19
|
for (f of files) {
|
|
21
20
|
let fpath = path.join(I18NDIR, f);
|
|
22
|
-
let lang = f.replace(/\..*/,'');
|
|
23
|
-
let json = await
|
|
21
|
+
let lang = f.replace(/\..*/, '');
|
|
22
|
+
let json = await import(fpath)
|
|
24
23
|
let languageCode = json.default?.ebt?.languageCode;
|
|
25
24
|
langs.push({
|
|
26
25
|
value: lang,
|
|
27
26
|
title: languageCode,
|
|
28
27
|
voice: !!voices[lang],
|
|
29
28
|
});
|
|
30
|
-
langs.sort((a,b)=> a.value.localeCompare(b.value));
|
|
29
|
+
langs.sort((a, b) => a.value.localeCompare(b.value));
|
|
31
30
|
}
|
|
32
|
-
let voiceLangs = langs.filter(lang=>lang.voice);
|
|
31
|
+
let voiceLangs = langs.filter(lang => lang.voice);
|
|
33
32
|
console.log(`
|
|
34
33
|
// GENERATED CODE (DO NOT EDIT)
|
|
35
34
|
const VOICE_LANGS = ${JSON.stringify(voiceLangs, null, 2)};
|
package/scripts/i18n-msg.cjs
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
const fs = require("fs");
|
|
3
|
-
const path = require(
|
|
4
|
-
const tsImport = require("ts-import");
|
|
3
|
+
const path = require("path");
|
|
5
4
|
|
|
6
5
|
const I18NDIR = path.join(__dirname, '../src/i18n');
|
|
7
6
|
|
|
@@ -26,17 +25,20 @@ if (key == null) {
|
|
|
26
25
|
key = groupKey;
|
|
27
26
|
groupKey = 'ebt';
|
|
28
27
|
}
|
|
29
|
-
console.log({key, keyPath, groupKey});
|
|
28
|
+
console.log({ key, keyPath, groupKey });
|
|
30
29
|
|
|
31
|
-
let WRITE=1;
|
|
30
|
+
let WRITE = 1;
|
|
32
31
|
|
|
33
|
-
(async ()=>{
|
|
32
|
+
(async () => {
|
|
34
33
|
let [...files] = await fs.promises.readdir(I18NDIR);
|
|
35
34
|
for (f of files) {
|
|
36
35
|
let fpath = path.join(I18NDIR, f);
|
|
37
|
-
let srcJson = await
|
|
36
|
+
let srcJson = await import(fpath)
|
|
38
37
|
let dstJson = JSON.parse(JSON.stringify(srcJson.default));
|
|
39
38
|
let groupObj = dstJson[groupKey];
|
|
39
|
+
if (!groupObj) {
|
|
40
|
+
groupObj = dstJson[groupKey] = {};
|
|
41
|
+
}
|
|
40
42
|
|
|
41
43
|
if (value === "DELETE") {
|
|
42
44
|
delete groupObj[key];
|
|
@@ -46,12 +48,12 @@ let WRITE=1;
|
|
|
46
48
|
} else if (value != null) {
|
|
47
49
|
groupObj[key] = value;
|
|
48
50
|
let groupKeys = Object.keys(groupObj).sort();
|
|
49
|
-
let groupSorted = groupKeys.reduce((a,k,i)=>{
|
|
51
|
+
let groupSorted = groupKeys.reduce((a, k, i) => {
|
|
50
52
|
a[k] = groupObj[k];
|
|
51
53
|
return a;
|
|
52
54
|
}, {});
|
|
53
55
|
dstJson[groupKey] = groupSorted;
|
|
54
|
-
console.log('keys',
|
|
56
|
+
console.log('keys',
|
|
55
57
|
Object.keys(groupObj).length,
|
|
56
58
|
Object.keys(groupSorted).length,
|
|
57
59
|
groupKeys.length);
|
package/src/auto/messages.mjs
CHANGED
|
@@ -338,7 +338,8 @@ const messages = {
|
|
|
338
338
|
},
|
|
339
339
|
"input": {
|
|
340
340
|
"clear": "Clear {0}"
|
|
341
|
-
}
|
|
341
|
+
},
|
|
342
|
+
"test": {}
|
|
342
343
|
},
|
|
343
344
|
"da": {
|
|
344
345
|
"close": "Luk",
|
|
@@ -675,7 +676,8 @@ const messages = {
|
|
|
675
676
|
},
|
|
676
677
|
"input": {
|
|
677
678
|
"clear": "Clear {0}"
|
|
678
|
-
}
|
|
679
|
+
},
|
|
680
|
+
"test": {}
|
|
679
681
|
},
|
|
680
682
|
"de": {
|
|
681
683
|
"close": "Schließen",
|
|
@@ -1018,7 +1020,8 @@ const messages = {
|
|
|
1018
1020
|
},
|
|
1019
1021
|
"input": {
|
|
1020
1022
|
"clear": "Leeren {0}"
|
|
1021
|
-
}
|
|
1023
|
+
},
|
|
1024
|
+
"test": {}
|
|
1022
1025
|
},
|
|
1023
1026
|
"en": {
|
|
1024
1027
|
"close": "Close",
|
|
@@ -1209,7 +1212,8 @@ const messages = {
|
|
|
1209
1212
|
"viewHearUntranslated": "View/hear untranslated Pali texts",
|
|
1210
1213
|
"weeks": "A_WEEKS weeks",
|
|
1211
1214
|
"wikiAria": "Home-EN.md"
|
|
1212
|
-
}
|
|
1215
|
+
},
|
|
1216
|
+
"test": {}
|
|
1213
1217
|
},
|
|
1214
1218
|
"es": {
|
|
1215
1219
|
"close": "Cerrar",
|
|
@@ -1400,7 +1404,8 @@ const messages = {
|
|
|
1400
1404
|
"viewHearUntranslated": "Ver/escuchar textos pali sin traducir",
|
|
1401
1405
|
"weeks": "A_WEEKS semanas",
|
|
1402
1406
|
"wikiAria": "Inicio-ES.md"
|
|
1403
|
-
}
|
|
1407
|
+
},
|
|
1408
|
+
"test": {}
|
|
1404
1409
|
},
|
|
1405
1410
|
"fr": {
|
|
1406
1411
|
"close": "Fermer",
|
|
@@ -1591,7 +1596,8 @@ const messages = {
|
|
|
1591
1596
|
"viewHearUntranslated": "Voir/entendre des textes pali non traduits",
|
|
1592
1597
|
"weeks": "A_WEEKS semaines",
|
|
1593
1598
|
"wikiAria": "Accueil-FR.md"
|
|
1594
|
-
}
|
|
1599
|
+
},
|
|
1600
|
+
"test": {}
|
|
1595
1601
|
},
|
|
1596
1602
|
"hi": {
|
|
1597
1603
|
"close": "बंद करें",
|
|
@@ -1923,7 +1929,8 @@ const messages = {
|
|
|
1923
1929
|
},
|
|
1924
1930
|
"input": {
|
|
1925
1931
|
"clear": "Clear {0}"
|
|
1926
|
-
}
|
|
1932
|
+
},
|
|
1933
|
+
"test": {}
|
|
1927
1934
|
},
|
|
1928
1935
|
"is": {
|
|
1929
1936
|
"close": "Loka",
|
|
@@ -2260,7 +2267,8 @@ const messages = {
|
|
|
2260
2267
|
},
|
|
2261
2268
|
"input": {
|
|
2262
2269
|
"clear": "Clear {0}"
|
|
2263
|
-
}
|
|
2270
|
+
},
|
|
2271
|
+
"test": {}
|
|
2264
2272
|
},
|
|
2265
2273
|
"it": {
|
|
2266
2274
|
"close": "Chiudere",
|
|
@@ -2603,7 +2611,8 @@ const messages = {
|
|
|
2603
2611
|
"viewHearUntranslated": "Vedere/ascoltare testi paliani non tradotti",
|
|
2604
2612
|
"weeks": "Settimane A",
|
|
2605
2613
|
"wikiAria": "Home-EN.md"
|
|
2606
|
-
}
|
|
2614
|
+
},
|
|
2615
|
+
"test": {}
|
|
2607
2616
|
},
|
|
2608
2617
|
"jpn": {
|
|
2609
2618
|
"close": "閉じる",
|
|
@@ -2945,7 +2954,8 @@ const messages = {
|
|
|
2945
2954
|
},
|
|
2946
2955
|
"input": {
|
|
2947
2956
|
"clear": "Clear {0}"
|
|
2948
|
-
}
|
|
2957
|
+
},
|
|
2958
|
+
"test": {}
|
|
2949
2959
|
},
|
|
2950
2960
|
"nb": {
|
|
2951
2961
|
"close": "Lukk",
|
|
@@ -3280,7 +3290,8 @@ const messages = {
|
|
|
3280
3290
|
},
|
|
3281
3291
|
"input": {
|
|
3282
3292
|
"clear": "Clear {0}"
|
|
3283
|
-
}
|
|
3293
|
+
},
|
|
3294
|
+
"test": {}
|
|
3284
3295
|
},
|
|
3285
3296
|
"nl": {
|
|
3286
3297
|
"close": "Sluit",
|
|
@@ -3621,7 +3632,8 @@ const messages = {
|
|
|
3621
3632
|
},
|
|
3622
3633
|
"input": {
|
|
3623
3634
|
"clear": "Clear {0}"
|
|
3624
|
-
}
|
|
3635
|
+
},
|
|
3636
|
+
"test": {}
|
|
3625
3637
|
},
|
|
3626
3638
|
"pl": {
|
|
3627
3639
|
"close": "Close",
|
|
@@ -3959,7 +3971,8 @@ const messages = {
|
|
|
3959
3971
|
},
|
|
3960
3972
|
"input": {
|
|
3961
3973
|
"clear": "Clear {0}"
|
|
3962
|
-
}
|
|
3974
|
+
},
|
|
3975
|
+
"test": {}
|
|
3963
3976
|
},
|
|
3964
3977
|
"pt": {
|
|
3965
3978
|
"close": "Fechar",
|
|
@@ -4150,7 +4163,8 @@ const messages = {
|
|
|
4150
4163
|
"viewHearUntranslated": "Veja/ouça textos Pali não traduzidos",
|
|
4151
4164
|
"weeks": "Semanas A_WEEKS",
|
|
4152
4165
|
"wikiAria": "Home-EN.md"
|
|
4153
|
-
}
|
|
4166
|
+
},
|
|
4167
|
+
"test": {}
|
|
4154
4168
|
},
|
|
4155
4169
|
"ro": {
|
|
4156
4170
|
"close": "Închide",
|
|
@@ -4486,7 +4500,8 @@ const messages = {
|
|
|
4486
4500
|
},
|
|
4487
4501
|
"input": {
|
|
4488
4502
|
"clear": "Clear {0}"
|
|
4489
|
-
}
|
|
4503
|
+
},
|
|
4504
|
+
"test": {}
|
|
4490
4505
|
},
|
|
4491
4506
|
"ru": {
|
|
4492
4507
|
"close": "Закрыть",
|
|
@@ -4677,7 +4692,8 @@ const messages = {
|
|
|
4677
4692
|
"viewHearUntranslated": "Просмотр/прослушивание непереведенных текстов на языке пали",
|
|
4678
4693
|
"weeks": "A_недели",
|
|
4679
4694
|
"wikiAria": "Home-EN.md"
|
|
4680
|
-
}
|
|
4695
|
+
},
|
|
4696
|
+
"test": {}
|
|
4681
4697
|
},
|
|
4682
4698
|
"si": {
|
|
4683
4699
|
"close": "වසන්න",
|
|
@@ -5015,7 +5031,8 @@ const messages = {
|
|
|
5015
5031
|
},
|
|
5016
5032
|
"input": {
|
|
5017
5033
|
"clear": "Clear {0}"
|
|
5018
|
-
}
|
|
5034
|
+
},
|
|
5035
|
+
"test": {}
|
|
5019
5036
|
},
|
|
5020
5037
|
"vi": {
|
|
5021
5038
|
"close": "Đóng",
|
|
@@ -5352,7 +5369,8 @@ const messages = {
|
|
|
5352
5369
|
},
|
|
5353
5370
|
"input": {
|
|
5354
5371
|
"clear": "Clear {0}"
|
|
5355
|
-
}
|
|
5372
|
+
},
|
|
5373
|
+
"test": {}
|
|
5356
5374
|
}
|
|
5357
5375
|
}
|
|
5358
5376
|
export default messages
|
package/src/i18n/cs.mjs
CHANGED
package/src/i18n/da.mjs
CHANGED
package/src/i18n/de.mjs
CHANGED
package/src/i18n/en.mjs
CHANGED
package/src/i18n/es.mjs
CHANGED
package/src/i18n/fr.mjs
CHANGED
package/src/i18n/hi.mjs
CHANGED
package/src/i18n/is.mjs
CHANGED
package/src/i18n/it.mjs
CHANGED
package/src/i18n/jpn.mjs
CHANGED
package/src/i18n/nb.mjs
CHANGED
package/src/i18n/nl.mjs
CHANGED
package/src/i18n/pl.mjs
CHANGED
package/src/i18n/pt.mjs
CHANGED
package/src/i18n/ro.mjs
CHANGED
package/src/i18n/ru.mjs
CHANGED
package/src/i18n/si.mjs
CHANGED
package/src/i18n/vi.mjs
CHANGED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
declare module '*.vue' {
|
|
2
|
+
import type { DefineComponent } from 'vue'
|
|
3
|
+
const component: DefineComponent<{}, {}, any>
|
|
4
|
+
export default component
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
declare module '*.mjs' {
|
|
8
|
+
const content: any
|
|
9
|
+
export default content
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
declare module '*.cjs' {
|
|
13
|
+
const content: any
|
|
14
|
+
export default content
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
declare module '*.json' {
|
|
18
|
+
const content: any
|
|
19
|
+
export default content
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
// Global variables
|
|
23
|
+
declare const xit: any
|
package/test/ebt-settings.mjs
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { default as EbtSettings } from "../src/ebt-settings.mjs";
|
|
2
2
|
import { default as EbtCard } from "../src/ebt-card.mjs";
|
|
3
3
|
import should from "should";
|
|
4
|
+
import { mockNavigator } from "./test-utils.mjs";
|
|
4
5
|
|
|
5
6
|
(typeof describe === 'function') && describe("ebt-settings.mjs", function () {
|
|
6
7
|
it("default ctor en", async () => {
|
|
7
|
-
|
|
8
|
+
mockNavigator(['en-US']);
|
|
8
9
|
var ebt = new EbtSettings();
|
|
9
10
|
should(ebt).properties({
|
|
10
11
|
audio: EbtSettings.AUDIO.OGG,
|
|
@@ -42,7 +43,7 @@ import should from "should";
|
|
|
42
43
|
});
|
|
43
44
|
it("default ctor de-de", async () => {
|
|
44
45
|
try {
|
|
45
|
-
|
|
46
|
+
mockNavigator(['de-de']);
|
|
46
47
|
should(global.navigator.languages[0]).equal('de-de');
|
|
47
48
|
let ebt = new EbtSettings();
|
|
48
49
|
should(ebt).properties({
|
|
@@ -65,7 +66,7 @@ import should from "should";
|
|
|
65
66
|
vnameTrans: 'Vicki',
|
|
66
67
|
});
|
|
67
68
|
} finally {
|
|
68
|
-
|
|
69
|
+
mockNavigator(['en-us']);
|
|
69
70
|
}
|
|
70
71
|
});
|
|
71
72
|
it("INITIAL_STATE", async () => {
|
package/test/mocha-config.json
CHANGED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Global test setup for ebt-vue3
|
|
3
|
+
* This file is automatically loaded by mocha before running tests
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { setupTestEnvironment } from './test-utils.mjs';
|
|
7
|
+
|
|
8
|
+
// Setup global test environment
|
|
9
|
+
setupTestEnvironment();
|
|
10
|
+
|
|
11
|
+
// Mock fetch if not available
|
|
12
|
+
if (!global.fetch) {
|
|
13
|
+
global.fetch = require('node-fetch');
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
// Set default log level to reduce noise during tests
|
|
17
|
+
if (typeof process !== 'undefined' && process.env.LOG_LEVEL) {
|
|
18
|
+
// Log level can be overridden via environment variable
|
|
19
|
+
} else {
|
|
20
|
+
// Default to warn level to reduce test noise
|
|
21
|
+
process.env.LOG_LEVEL = 'warn';
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
console.log('Test environment setup complete');
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Test utilities for ebt-vue3
|
|
3
|
+
* Provides common mocking functions and setup helpers
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Mock the navigator object for Node.js environment
|
|
8
|
+
* @param {string[]} languages - Array of language codes
|
|
9
|
+
*/
|
|
10
|
+
export const mockNavigator = (languages) => {
|
|
11
|
+
// Remove existing navigator if it exists
|
|
12
|
+
if (global.navigator) {
|
|
13
|
+
delete global.navigator;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
// Create a new navigator object
|
|
17
|
+
Object.defineProperty(global, 'navigator', {
|
|
18
|
+
value: { languages },
|
|
19
|
+
writable: true,
|
|
20
|
+
configurable: true
|
|
21
|
+
});
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Mock localStorage for Node.js environment
|
|
26
|
+
*/
|
|
27
|
+
export const mockLocalStorage = () => {
|
|
28
|
+
if (global.localStorage) {
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
// Simple localStorage mock
|
|
33
|
+
const store = {};
|
|
34
|
+
global.localStorage = {
|
|
35
|
+
getItem: (key) => store[key] || null,
|
|
36
|
+
setItem: (key, value) => { store[key] = value; },
|
|
37
|
+
removeItem: (key) => { delete store[key]; },
|
|
38
|
+
clear: () => { Object.keys(store).forEach(key => delete store[key]); },
|
|
39
|
+
length: 0,
|
|
40
|
+
key: (index) => Object.keys(store)[index] || null
|
|
41
|
+
};
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Mock window object for Node.js environment
|
|
46
|
+
*/
|
|
47
|
+
export const mockWindow = () => {
|
|
48
|
+
if (!global.window) {
|
|
49
|
+
global.window = {};
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// Add localStorage to window if not present
|
|
53
|
+
if (!global.window.localStorage && global.localStorage) {
|
|
54
|
+
global.window.localStorage = global.localStorage;
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Setup common test environment
|
|
60
|
+
* @param {object} options - Configuration options
|
|
61
|
+
* @param {string[]} options.navigatorLanguages - Languages for navigator mock
|
|
62
|
+
*/
|
|
63
|
+
export const setupTestEnvironment = (options = {}) => {
|
|
64
|
+
const { navigatorLanguages = ['en-US'] } = options;
|
|
65
|
+
|
|
66
|
+
mockNavigator(navigatorLanguages);
|
|
67
|
+
mockLocalStorage();
|
|
68
|
+
mockWindow();
|
|
69
|
+
};
|
package/tsconfig.json
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"target": "ES2022",
|
|
4
|
+
"lib": ["ES2022", "DOM", "DOM.Iterable"],
|
|
5
|
+
"module": "ESNext",
|
|
6
|
+
"skipLibCheck": true,
|
|
7
|
+
"moduleResolution": "bundler",
|
|
8
|
+
"allowImportingTsExtensions": true,
|
|
9
|
+
"resolveJsonModule": true,
|
|
10
|
+
"isolatedModules": true,
|
|
11
|
+
"noEmit": true,
|
|
12
|
+
"jsx": "preserve",
|
|
13
|
+
"strict": true,
|
|
14
|
+
"noUnusedLocals": true,
|
|
15
|
+
"noUnusedParameters": true,
|
|
16
|
+
"noFallthroughCasesInSwitch": true,
|
|
17
|
+
"baseUrl": ".",
|
|
18
|
+
"paths": {
|
|
19
|
+
"@/*": ["src/*"]
|
|
20
|
+
}
|
|
21
|
+
},
|
|
22
|
+
"include": [
|
|
23
|
+
"src/**/*.ts",
|
|
24
|
+
"src/**/*.d.ts",
|
|
25
|
+
"src/**/*.tsx",
|
|
26
|
+
"src/**/*.vue",
|
|
27
|
+
"src/**/*.js",
|
|
28
|
+
"src/**/*.mjs"
|
|
29
|
+
],
|
|
30
|
+
"exclude": [
|
|
31
|
+
"node_modules",
|
|
32
|
+
"dist",
|
|
33
|
+
"local"
|
|
34
|
+
]
|
|
35
|
+
}
|