@camscanner/mcp-language-server 1.0.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.
- package/.claude-plugin/marketplace.json +20 -0
- package/README.md +48 -0
- package/dist/auth.d.ts +12 -0
- package/dist/auth.js +141 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +299 -0
- package/dist/operate-client.d.ts +15 -0
- package/dist/operate-client.js +84 -0
- package/dist/utils.d.ts +17 -0
- package/dist/utils.js +112 -0
- package/index.js +672 -0
- package/package.json +28 -0
- package/plugins/i18n/.claude-plugin/plugin.json +8 -0
- package/plugins/i18n/.mcp.json +13 -0
- package/plugins/i18n/skills/i18n/SKILL.md +112 -0
- package/plugins/yapi/.claude-plugin/plugin.json +8 -0
- package/plugins/yapi/.mcp.json +13 -0
- package/plugins/yapi/skills/yapi/SKILL.md +76 -0
- package/setup.sh +96 -0
- package/src/auth.ts +158 -0
- package/src/index.ts +376 -0
- package/src/operate-client.ts +94 -0
- package/src/utils.test.ts +337 -0
- package/src/utils.ts +127 -0
- package/test-auth-e2e.js +278 -0
- package/tsconfig.json +17 -0
- package/update-cookie.sh +75 -0
package/dist/utils.js
ADDED
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// --- Constants ---
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.LANGUAGE_LOCALE_MAP = exports.PLATFORM_MAP = void 0;
|
|
5
|
+
exports.fixPlaceholders = fixPlaceholders;
|
|
6
|
+
exports.extractStrings = extractStrings;
|
|
7
|
+
exports.mergeLocaleEntries = mergeLocaleEntries;
|
|
8
|
+
exports.findMissingLocales = findMissingLocales;
|
|
9
|
+
exports.PLATFORM_MAP = {
|
|
10
|
+
1: 'Android',
|
|
11
|
+
3: 'iOS',
|
|
12
|
+
4: 'Web',
|
|
13
|
+
5: 'Windows',
|
|
14
|
+
7: 'Market',
|
|
15
|
+
8: 'Harmony',
|
|
16
|
+
9: 'PC',
|
|
17
|
+
};
|
|
18
|
+
exports.LANGUAGE_LOCALE_MAP = {
|
|
19
|
+
'1': 'ZhCn',
|
|
20
|
+
'2': 'EnUs',
|
|
21
|
+
'3': 'JaJp',
|
|
22
|
+
'4': 'KoKr',
|
|
23
|
+
'5': 'FrFr',
|
|
24
|
+
'6': 'DeDe',
|
|
25
|
+
'7': 'ZhTw',
|
|
26
|
+
'8': 'PtBr',
|
|
27
|
+
'9': 'EsEs',
|
|
28
|
+
'10': 'ItIt',
|
|
29
|
+
'11': 'RuRu',
|
|
30
|
+
'12': 'TrTr',
|
|
31
|
+
'13': 'ArSa',
|
|
32
|
+
'14': 'ThTh',
|
|
33
|
+
'15': 'PlPl',
|
|
34
|
+
'16': 'ViVn',
|
|
35
|
+
'17': 'InId',
|
|
36
|
+
'19': 'MsMy',
|
|
37
|
+
'20': 'NlNl',
|
|
38
|
+
'22': 'HiDi',
|
|
39
|
+
'23': 'BnBd',
|
|
40
|
+
'24': 'CsCs',
|
|
41
|
+
'25': 'SkSk',
|
|
42
|
+
'26': 'FilPh',
|
|
43
|
+
'27': 'ElEl',
|
|
44
|
+
'28': 'PtPt',
|
|
45
|
+
'29': 'RoRo',
|
|
46
|
+
};
|
|
47
|
+
// --- Helpers ---
|
|
48
|
+
function fixPlaceholders(value) {
|
|
49
|
+
let cnt = 0;
|
|
50
|
+
return value
|
|
51
|
+
.replace(/%s/g, () => `{${cnt++}}`)
|
|
52
|
+
.replace(/\\"/g, '"')
|
|
53
|
+
.replace(/\\n/g, '\n');
|
|
54
|
+
}
|
|
55
|
+
function extractStrings(versions, platformId) {
|
|
56
|
+
const result = {};
|
|
57
|
+
for (const version of versions) {
|
|
58
|
+
const strings = version.ar_string || version.strings || [];
|
|
59
|
+
const languages = version.ar_language || [];
|
|
60
|
+
for (const str of strings) {
|
|
61
|
+
const key = str.keys?.[platformId] || str.keys?.['0'] || Object.values(str.keys || {})[0];
|
|
62
|
+
if (!key)
|
|
63
|
+
continue;
|
|
64
|
+
for (const langId of languages) {
|
|
65
|
+
const value = str.values?.[langId];
|
|
66
|
+
if (!value)
|
|
67
|
+
continue;
|
|
68
|
+
if (!result[langId])
|
|
69
|
+
result[langId] = {};
|
|
70
|
+
result[langId][key] = fixPlaceholders(value);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
return result;
|
|
75
|
+
}
|
|
76
|
+
function mergeLocaleEntries(existingObj, newEntries) {
|
|
77
|
+
const merged = { ...existingObj };
|
|
78
|
+
// Fix existing %s placeholders
|
|
79
|
+
for (const key of Object.keys(merged)) {
|
|
80
|
+
if (typeof merged[key] === 'string' && merged[key].includes('%s')) {
|
|
81
|
+
merged[key] = fixPlaceholders(merged[key]);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
// Preserve insert_before_this_line marker
|
|
85
|
+
const insertMarker = merged['insert_before_this_line'];
|
|
86
|
+
delete merged['insert_before_this_line'];
|
|
87
|
+
const keysAdded = [];
|
|
88
|
+
const keysUpdated = [];
|
|
89
|
+
for (const [key, value] of Object.entries(newEntries)) {
|
|
90
|
+
if (merged[key] === undefined) {
|
|
91
|
+
keysAdded.push(key);
|
|
92
|
+
}
|
|
93
|
+
else if (merged[key] !== value) {
|
|
94
|
+
keysUpdated.push(key);
|
|
95
|
+
}
|
|
96
|
+
merged[key] = value;
|
|
97
|
+
}
|
|
98
|
+
if (insertMarker) {
|
|
99
|
+
merged['insert_before_this_line'] = insertMarker;
|
|
100
|
+
}
|
|
101
|
+
return { merged, keysAdded, keysUpdated };
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* 找出本地存在但远程未返回翻译的 locale 文件名。
|
|
105
|
+
* @param localLocaleNames 本地存在的 locale 名称列表(不含 .json 后缀),如 ['ZhCn', 'EnUs', 'JaJp']
|
|
106
|
+
* @param remoteLanguageIds 远程返回的语言 ID 列表,如 ['1', '2']
|
|
107
|
+
* @returns 本地存在但远程无数据的 locale 名称列表
|
|
108
|
+
*/
|
|
109
|
+
function findMissingLocales(localLocaleNames, remoteLanguageIds) {
|
|
110
|
+
const remoteLocaleNames = new Set(remoteLanguageIds.map(id => exports.LANGUAGE_LOCALE_MAP[id]).filter(Boolean));
|
|
111
|
+
return localLocaleNames.filter(name => !remoteLocaleNames.has(name));
|
|
112
|
+
}
|