@sfmc-bds/cli 0.6.1 → 0.8.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/dist/logs.d.ts +21 -0
- package/dist/logs.d.ts.map +1 -1
- package/dist/logs.js +67 -1
- package/dist/logs.js.map +2 -2
- package/dist/management/config.d.ts.map +1 -1
- package/dist/management/config.js +5 -1
- package/dist/management/config.js.map +2 -2
- package/dist/management/domain.d.ts +46 -2
- package/dist/management/domain.d.ts.map +1 -1
- package/dist/management/domain.js +112 -26
- package/dist/management/domain.js.map +2 -2
- package/dist/management/maintenance.d.ts +8 -0
- package/dist/management/maintenance.d.ts.map +1 -1
- package/dist/management/maintenance.js +18 -0
- package/dist/management/maintenance.js.map +2 -2
- package/dist/management/pack-import.d.ts +29 -0
- package/dist/management/pack-import.d.ts.map +1 -0
- package/dist/management/pack-import.js +108 -0
- package/dist/management/pack-import.js.map +7 -0
- package/dist/management/server.d.ts.map +1 -1
- package/dist/management/server.js +67 -10
- package/dist/management/server.js.map +2 -2
- package/dist/module-sidecars.d.ts.map +1 -1
- package/dist/module-sidecars.js +23 -0
- package/dist/module-sidecars.js.map +2 -2
- package/dist/registry.d.ts +11 -5
- package/dist/registry.d.ts.map +1 -1
- package/dist/registry.js +35 -11
- package/dist/registry.js.map +2 -2
- package/dist/services.d.ts.map +1 -1
- package/dist/services.js +14 -0
- package/dist/services.js.map +2 -2
- package/dist/world-packs.d.ts +47 -0
- package/dist/world-packs.d.ts.map +1 -1
- package/dist/world-packs.js +38 -11
- package/dist/world-packs.js.map +2 -2
- package/package.json +7 -7
- package/scripts/module-install/.sfmc-registry-cache.json +151 -28
- package/scripts/module-install/lib/registry-index.mjs +50 -13
|
@@ -1,95 +1,218 @@
|
|
|
1
1
|
{
|
|
2
|
-
"fetchedAt":
|
|
2
|
+
"fetchedAt": 1792926615467,
|
|
3
3
|
"index": {
|
|
4
4
|
"activity-log": {
|
|
5
5
|
"npm": "@sfmc-bds/module-activity-log",
|
|
6
|
-
"version": "0.
|
|
7
|
-
"sdk": ">=0.2.0"
|
|
6
|
+
"version": "0.3.0",
|
|
7
|
+
"sdk": ">=0.2.0",
|
|
8
|
+
"repo": "https://github.com/DogeLakeDev/sfmc-module-activity-log",
|
|
9
|
+
"name": "行为日志",
|
|
10
|
+
"category": "system",
|
|
11
|
+
"license": "ISC",
|
|
12
|
+
"official": true,
|
|
13
|
+
"requires": []
|
|
8
14
|
},
|
|
9
15
|
"afk": {
|
|
10
16
|
"npm": "@sfmc-bds/module-afk",
|
|
11
|
-
"version": "0.
|
|
12
|
-
"sdk": ">=0.2.0"
|
|
17
|
+
"version": "0.3.0",
|
|
18
|
+
"sdk": ">=0.2.0",
|
|
19
|
+
"repo": "https://github.com/DogeLakeDev/sfmc-module-afk",
|
|
20
|
+
"name": "afk",
|
|
21
|
+
"category": "utility",
|
|
22
|
+
"license": "ISC",
|
|
23
|
+
"official": true,
|
|
24
|
+
"requires": []
|
|
13
25
|
},
|
|
14
26
|
"area": {
|
|
15
27
|
"npm": "@sfmc-bds/module-area",
|
|
16
28
|
"version": "0.2.1",
|
|
17
|
-
"sdk": ">=0.2.0"
|
|
29
|
+
"sdk": ">=0.2.0",
|
|
30
|
+
"repo": "https://github.com/Tanya7z/sfmc-module-area",
|
|
31
|
+
"name": "area",
|
|
32
|
+
"description": "区域特性调度引擎",
|
|
33
|
+
"category": "system",
|
|
34
|
+
"license": "ISC",
|
|
35
|
+
"official": true,
|
|
36
|
+
"requires": []
|
|
18
37
|
},
|
|
19
38
|
"chat": {
|
|
20
39
|
"npm": "@sfmc-bds/module-chat",
|
|
21
|
-
"version": "0.2.
|
|
22
|
-
"sdk": ">=0.2.
|
|
40
|
+
"version": "0.2.1",
|
|
41
|
+
"sdk": ">=0.2.0-beta.17",
|
|
42
|
+
"repo": "https://github.com/Tanya7z/sfmc-module-chat",
|
|
43
|
+
"name": "chat",
|
|
44
|
+
"category": "social",
|
|
45
|
+
"license": "ISC",
|
|
46
|
+
"official": true,
|
|
47
|
+
"requires": []
|
|
23
48
|
},
|
|
24
49
|
"chat-sounds": {
|
|
25
50
|
"npm": "@sfmc-bds/module-chat-sounds",
|
|
26
51
|
"version": "0.2.1",
|
|
27
|
-
"sdk": ">=0.2.0"
|
|
52
|
+
"sdk": ">=0.2.0",
|
|
53
|
+
"repo": "https://github.com/Tanya7z/sfmc-module-chat-sounds",
|
|
54
|
+
"name": "chat-sounds",
|
|
55
|
+
"category": "social",
|
|
56
|
+
"license": "ISC",
|
|
57
|
+
"official": true,
|
|
58
|
+
"requires": [
|
|
59
|
+
"chat"
|
|
60
|
+
]
|
|
28
61
|
},
|
|
29
62
|
"clean": {
|
|
30
63
|
"npm": "@sfmc-bds/module-clean",
|
|
31
64
|
"version": "0.2.1",
|
|
32
|
-
"sdk": ">=0.2.0"
|
|
65
|
+
"sdk": ">=0.2.0",
|
|
66
|
+
"repo": "https://github.com/Tanya7z/sfmc-module-clean",
|
|
67
|
+
"name": "掉落物清理",
|
|
68
|
+
"description": "区域与全服掉落物预警、倒计时广播与物理回收箱清理",
|
|
69
|
+
"category": "utility",
|
|
70
|
+
"license": "ISC",
|
|
71
|
+
"official": true,
|
|
72
|
+
"requires": [
|
|
73
|
+
"area"
|
|
74
|
+
]
|
|
33
75
|
},
|
|
34
76
|
"coop": {
|
|
35
77
|
"npm": "@sfmc-bds/module-coop",
|
|
36
78
|
"version": "0.2.2",
|
|
37
|
-
"sdk": ">=0.2.0"
|
|
79
|
+
"sdk": ">=0.2.0-beta.17",
|
|
80
|
+
"repo": "https://github.com/Tanya7z/sfmc-module-coop",
|
|
81
|
+
"name": "合作社",
|
|
82
|
+
"category": "social",
|
|
83
|
+
"license": "ISC",
|
|
84
|
+
"official": true,
|
|
85
|
+
"requires": [
|
|
86
|
+
"economy",
|
|
87
|
+
"activity-log"
|
|
88
|
+
]
|
|
38
89
|
},
|
|
39
90
|
"data-backup": {
|
|
40
91
|
"npm": "@sfmc-bds/module-data-backup",
|
|
41
92
|
"version": "0.2.2",
|
|
42
|
-
"sdk": ">=0.2.0"
|
|
93
|
+
"sdk": ">=0.2.0",
|
|
94
|
+
"repo": "https://github.com/Tanya7z/sfmc-module-data-backup",
|
|
95
|
+
"name": "数据备份",
|
|
96
|
+
"category": "system",
|
|
97
|
+
"license": "ISC",
|
|
98
|
+
"official": true,
|
|
99
|
+
"requires": []
|
|
43
100
|
},
|
|
44
101
|
"economy": {
|
|
45
102
|
"npm": "@sfmc-bds/module-economy",
|
|
46
103
|
"version": "0.2.1",
|
|
47
|
-
"sdk": ">=0.2.0"
|
|
104
|
+
"sdk": ">=0.2.0",
|
|
105
|
+
"repo": "https://github.com/Tanya7z/sfmc-module-economy",
|
|
106
|
+
"name": "经济系统",
|
|
107
|
+
"category": "economy",
|
|
108
|
+
"license": "ISC",
|
|
109
|
+
"official": true,
|
|
110
|
+
"requires": []
|
|
48
111
|
},
|
|
49
112
|
"fly-area": {
|
|
50
113
|
"npm": "@sfmc-bds/module-fly-area",
|
|
51
114
|
"version": "0.2.1",
|
|
52
|
-
"sdk": ">=0.2.0"
|
|
115
|
+
"sdk": ">=0.2.0",
|
|
116
|
+
"repo": "https://github.com/Tanya7z/sfmc-module-fly-area",
|
|
117
|
+
"name": "区域飞行",
|
|
118
|
+
"category": "gameplay",
|
|
119
|
+
"license": "ISC",
|
|
120
|
+
"official": true,
|
|
121
|
+
"requires": [
|
|
122
|
+
"area"
|
|
123
|
+
]
|
|
53
124
|
},
|
|
54
125
|
"gamemode-area": {
|
|
55
126
|
"npm": "@sfmc-bds/module-gamemode-area",
|
|
56
127
|
"version": "0.2.1",
|
|
57
|
-
"sdk": ">=0.2.0"
|
|
128
|
+
"sdk": ">=0.2.0",
|
|
129
|
+
"repo": "https://github.com/Tanya7z/sfmc-module-gamemode-area",
|
|
130
|
+
"name": "区域游戏模式",
|
|
131
|
+
"description": "区域游戏模式切换与背包隔离置换",
|
|
132
|
+
"category": "gameplay",
|
|
133
|
+
"license": "ISC",
|
|
134
|
+
"official": true,
|
|
135
|
+
"requires": [
|
|
136
|
+
"area",
|
|
137
|
+
"inventory-switcher"
|
|
138
|
+
]
|
|
58
139
|
},
|
|
59
140
|
"inventory-switcher": {
|
|
60
141
|
"npm": "@sfmc-bds/module-inventory-switcher",
|
|
61
142
|
"version": "0.2.1",
|
|
62
|
-
"sdk": ">=0.2.0"
|
|
143
|
+
"sdk": ">=0.2.0",
|
|
144
|
+
"repo": "https://github.com/Tanya7z/sfmc-module-inventory-switcher",
|
|
145
|
+
"name": "背包切换",
|
|
146
|
+
"description": "通用背包多槽位快照持久化与原子置换服务",
|
|
147
|
+
"category": "system",
|
|
148
|
+
"license": "ISC",
|
|
149
|
+
"official": true,
|
|
150
|
+
"requires": []
|
|
63
151
|
},
|
|
64
152
|
"land": {
|
|
65
153
|
"npm": "@sfmc-bds/module-land",
|
|
66
|
-
"version": "0.
|
|
67
|
-
"sdk": ">=0.
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
"
|
|
71
|
-
"
|
|
72
|
-
"
|
|
154
|
+
"version": "1.0.0",
|
|
155
|
+
"sdk": ">=0.5.0",
|
|
156
|
+
"repo": "https://github.com/DogeLakeDev/sfmc-module-land",
|
|
157
|
+
"name": "领地",
|
|
158
|
+
"category": "gameplay",
|
|
159
|
+
"license": "ISC",
|
|
160
|
+
"official": true,
|
|
161
|
+
"requires": [
|
|
162
|
+
"economy",
|
|
163
|
+
"activity-log"
|
|
164
|
+
]
|
|
73
165
|
},
|
|
74
166
|
"online-time": {
|
|
75
167
|
"npm": "@sfmc-bds/module-online-time",
|
|
76
168
|
"version": "0.2.2",
|
|
77
|
-
"sdk": ">=0.2.0"
|
|
169
|
+
"sdk": ">=0.2.0-beta.17",
|
|
170
|
+
"repo": "https://github.com/Tanya7z/sfmc-module-online-time",
|
|
171
|
+
"name": "在线时长统计",
|
|
172
|
+
"description": "进服打点与心跳增量结转在线统计",
|
|
173
|
+
"category": "utility",
|
|
174
|
+
"license": "ISC",
|
|
175
|
+
"official": true,
|
|
176
|
+
"requires": []
|
|
78
177
|
},
|
|
79
178
|
"peace-area": {
|
|
80
179
|
"npm": "@sfmc-bds/module-peace-area",
|
|
81
|
-
"version": "0.
|
|
82
|
-
"sdk": ">=0.2.0"
|
|
180
|
+
"version": "1.0.0",
|
|
181
|
+
"sdk": ">=0.2.0",
|
|
182
|
+
"repo": "https://github.com/DogeLakeDev/sfmc-module-peace-area",
|
|
183
|
+
"name": "和平区域",
|
|
184
|
+
"description": "区域怪物生成拦截",
|
|
185
|
+
"category": "gameplay",
|
|
186
|
+
"license": "ISC",
|
|
187
|
+
"official": true,
|
|
188
|
+
"requires": [
|
|
189
|
+
"area"
|
|
190
|
+
]
|
|
83
191
|
},
|
|
84
192
|
"qa": {
|
|
85
193
|
"npm": "@sfmc-bds/module-qa",
|
|
86
194
|
"version": "0.2.1",
|
|
87
|
-
"sdk": ">=0.2.0"
|
|
195
|
+
"sdk": ">=0.2.0-beta.17",
|
|
196
|
+
"repo": "https://github.com/Tanya7z/sfmc-module-qa",
|
|
197
|
+
"name": "QA",
|
|
198
|
+
"category": "gameplay",
|
|
199
|
+
"license": "ISC",
|
|
200
|
+
"official": true,
|
|
201
|
+
"requires": [
|
|
202
|
+
"economy",
|
|
203
|
+
"chat"
|
|
204
|
+
]
|
|
88
205
|
},
|
|
89
206
|
"spawn-protect": {
|
|
90
207
|
"npm": "@sfmc-bds/module-spawn-protect",
|
|
91
208
|
"version": "0.2.1",
|
|
92
|
-
"sdk": ">=0.2.0"
|
|
209
|
+
"sdk": ">=0.2.0",
|
|
210
|
+
"repo": "https://github.com/Tanya7z/sfmc-module-spawn-protect",
|
|
211
|
+
"name": "出生保护",
|
|
212
|
+
"category": "utility",
|
|
213
|
+
"license": "ISC",
|
|
214
|
+
"official": true,
|
|
215
|
+
"requires": []
|
|
93
216
|
}
|
|
94
217
|
}
|
|
95
218
|
}
|
|
@@ -3,15 +3,40 @@
|
|
|
3
3
|
* 解析 Tanya7z/sfmc-modules index.json
|
|
4
4
|
*
|
|
5
5
|
* 契约(与 sfmc/src/registry.ts#parseRegistryIndex 保持一致):
|
|
6
|
-
* { modules: { <id>: { npm?, version?, sdk?, repo?, tag? } } }
|
|
6
|
+
* { modules: { <id>: { npm?, version?, sdk?, repo?, tag?, name?, description?, category?, license?, official?, requires? } } }
|
|
7
7
|
* 条目至少具备 npm 或 repo+tag。`_` 前缀键视为元数据并忽略。
|
|
8
|
+
* requires 只有在全部是非空字符串时才保留;空数组表示没有额外依赖。缺字段表示索引没有声明依赖。
|
|
8
9
|
*/
|
|
9
10
|
|
|
10
11
|
/**
|
|
11
|
-
* @typedef {{ npm?: string, version?: string, sdk?: string, repo?: string, tag?: string }} RegistryEntry
|
|
12
|
+
* @typedef {{ npm?: string, version?: string, sdk?: string, repo?: string, tag?: string, name?: string, description?: string, category?: string, license?: string, official?: boolean, requires?: string[] }} RegistryEntry
|
|
12
13
|
* @typedef {Record<string, RegistryEntry>} RegistryIndex
|
|
13
14
|
*/
|
|
14
15
|
|
|
16
|
+
/**
|
|
17
|
+
* @param {unknown} value
|
|
18
|
+
* @returns {string | undefined}
|
|
19
|
+
*/
|
|
20
|
+
function optionalText(value) {
|
|
21
|
+
return typeof value === "string" && value.trim() ? value.trim() : undefined;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* 索引 requires。格式不对时返回 undefined,让安装方拒绝,而不是当成没有依赖。
|
|
26
|
+
* @param {unknown} value
|
|
27
|
+
* @returns {string[] | undefined}
|
|
28
|
+
*/
|
|
29
|
+
function optionalRequires(value) {
|
|
30
|
+
if (!Array.isArray(value)) return undefined;
|
|
31
|
+
/** @type {string[]} */
|
|
32
|
+
const items = [];
|
|
33
|
+
for (const item of value) {
|
|
34
|
+
if (typeof item !== "string" || !item.trim()) return undefined;
|
|
35
|
+
items.push(item.trim());
|
|
36
|
+
}
|
|
37
|
+
return items;
|
|
38
|
+
}
|
|
39
|
+
|
|
15
40
|
/**
|
|
16
41
|
* @param {unknown} json
|
|
17
42
|
* @returns {RegistryIndex}
|
|
@@ -30,20 +55,32 @@ export function parseRegistryIndex(json) {
|
|
|
30
55
|
if (k.startsWith("_")) continue;
|
|
31
56
|
if (typeof v !== "object" || v === null || Array.isArray(v)) continue;
|
|
32
57
|
const entry = /** @type {Record<string, unknown>} */ (v);
|
|
33
|
-
const
|
|
34
|
-
const
|
|
58
|
+
const npm = optionalText(entry.npm);
|
|
59
|
+
const repo = optionalText(entry.repo);
|
|
60
|
+
const tag = optionalText(entry.tag);
|
|
61
|
+
const hasNpm = Boolean(npm);
|
|
62
|
+
const hasGh = Boolean(repo && tag);
|
|
35
63
|
if (!hasNpm && !hasGh) continue;
|
|
36
64
|
/** @type {RegistryEntry} */
|
|
37
65
|
const out = {};
|
|
38
|
-
if (
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
66
|
+
if (npm) out.npm = npm;
|
|
67
|
+
const version = optionalText(entry.version);
|
|
68
|
+
const sdk = optionalText(entry.sdk);
|
|
69
|
+
const name = optionalText(entry.name);
|
|
70
|
+
const description = optionalText(entry.description);
|
|
71
|
+
const category = optionalText(entry.category);
|
|
72
|
+
const license = optionalText(entry.license);
|
|
73
|
+
const requires = optionalRequires(entry.requires);
|
|
74
|
+
if (version) out.version = version;
|
|
75
|
+
if (sdk) out.sdk = sdk;
|
|
76
|
+
if (repo) out.repo = repo;
|
|
77
|
+
if (repo && tag) out.tag = tag;
|
|
78
|
+
if (name) out.name = name;
|
|
79
|
+
if (description) out.description = description;
|
|
80
|
+
if (category) out.category = category;
|
|
81
|
+
if (license) out.license = license;
|
|
82
|
+
if (typeof entry.official === "boolean") out.official = entry.official;
|
|
83
|
+
if (requires !== undefined) out.requires = requires;
|
|
47
84
|
filtered[k] = out;
|
|
48
85
|
}
|
|
49
86
|
return filtered;
|