@ttmg/cli 0.4.4 → 0.4.5
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/CHANGELOG.md +277 -0
- package/dist/index.js +122 -171
- package/dist/index.js.map +1 -1
- package/dist/package.json +4 -2
- package/dist/public/assets/Card-BAsimNoh.js +1 -0
- package/dist/public/assets/Detail-rVxbEDgh.js +1 -0
- package/dist/public/assets/Detail-rVxbEDgh.js.br +0 -0
- package/dist/public/assets/MonetizationMode-B20TAE9o.js +1 -0
- package/dist/public/assets/MonetizationModeSummary-CnHqXyco.js +1 -0
- package/dist/public/assets/{SectionHeader-Caf8qPRH.js → SectionHeader-Cn3FnOqh.js} +1 -1
- package/dist/public/assets/{baseForm-DbKDw3IN.js → baseForm-kBTxn8h8.js} +1 -1
- package/dist/public/assets/baseForm-kBTxn8h8.js.br +0 -0
- package/dist/public/assets/{col-DlUD2IyX.js → col-VN3Ivd-x.js} +1 -1
- package/dist/public/assets/{compass-D8bLLLSR.js → compass-BabZVjAl.js} +1 -1
- package/dist/public/assets/{index-BvRI6rq9.js → index--6iHQzho.js} +1 -1
- package/dist/public/assets/{index-Cf7bng8i.js → index-1WjGwqIV.js} +1 -1
- package/dist/public/assets/{index-DXXBlk9b.js → index-BFFsJ47B.js} +1 -1
- package/dist/public/assets/{index-BeG7a_8l.js → index-Ba-JWe4X.js} +1 -1
- package/dist/public/assets/{index-CPfhNCcU.js → index-BjQlJrX7.js} +1 -1
- package/dist/public/assets/index-Bjn0ctEd.js +21 -0
- package/dist/public/assets/index-Bjn0ctEd.js.br +0 -0
- package/dist/public/assets/index-BnOeYQAd.js +1 -0
- package/dist/public/assets/index-BxokHznc.js +1 -0
- package/dist/public/assets/index-BxokHznc.js.br +0 -0
- package/dist/public/assets/{index-BlupVk90.js → index-BxsB5E3u.js} +1 -1
- package/dist/public/assets/{index-Ggo1rV6S.js → index-C83QHLmD.js} +1 -1
- package/dist/public/assets/{index-BLmfGH4o.js → index-CUuX90R9.js} +1 -1
- package/dist/public/assets/{index-yR_bPMcB.css → index-Ckp_mJJy.css} +1 -1
- package/dist/public/assets/index-Ckp_mJJy.css.br +0 -0
- package/dist/public/assets/{index-DenoanNX.js → index-Cl0_vMWE.js} +1 -1
- package/dist/public/assets/index-Cl0_vMWE.js.br +0 -0
- package/dist/public/assets/{index-B0fmVxbN.js → index-Clq0hTDI.js} +1 -1
- package/dist/public/assets/{index-D9-bb2oL.js → index-CpM8t743.js} +1 -1
- package/dist/public/assets/index-CzXMNZL3.js +1 -0
- package/dist/public/assets/{index-eoDMPIdb.js → index-DHdJsD10.js} +1 -1
- package/dist/public/assets/index-DHdJsD10.js.br +0 -0
- package/dist/public/assets/{index-BV532pMK.js → index-DIcz5ciL.js} +1 -1
- package/dist/public/assets/index-DIcz5ciL.js.br +0 -0
- package/dist/public/assets/{index-DF6WNroB.js → index-DK4IvdRl.js} +1 -1
- package/dist/public/assets/{index-BR6l0C9y.js → index-DXDZCuG4.js} +1 -1
- package/dist/public/assets/{index-CTkNRReQ.js → index-DnnfZ7H_.js} +1 -1
- package/dist/public/assets/index-Dohibgdp.js +1 -0
- package/dist/public/assets/{index-D0iKOimx.js → index-DulANwbq.js} +1 -1
- package/dist/public/assets/index-O_L1tU2b.js +1 -0
- package/dist/public/assets/index-O_L1tU2b.js.br +0 -0
- package/dist/public/assets/index-QNLvejKK.js +1 -0
- package/dist/public/assets/{index-D2zLbzBh.css → index-WyNc-BTG.css} +1 -1
- package/dist/public/assets/index-WyNc-BTG.css.br +0 -0
- package/dist/public/assets/index-aSl6Wdrp.js +1 -0
- package/dist/public/assets/index-aSl6Wdrp.js.br +0 -0
- package/dist/public/assets/{index-y9pNuDMs.js → index-odEI7YQF.js} +1 -1
- package/dist/public/assets/index-odEI7YQF.js.br +0 -0
- package/dist/public/assets/{layers-BQ_Tw855.js → layers-B4zhx14P.js} +1 -1
- package/dist/public/assets/{list-checks-9HC7bocq.js → list-checks-Br6imjXC.js} +1 -1
- package/dist/public/assets/{sparkles-BLHMCsIj.js → sparkles-BjIkcbAi.js} +1 -1
- package/dist/public/assets/{triangle-alert-BprMFvuT.js → triangle-alert-CgKAc3w5.js} +1 -1
- package/dist/public/assets/{zap-Bj4LJ903.js → zap-DFHw5liD.js} +1 -1
- package/dist/public/index.html +2 -2
- package/dist/scripts/verify-dist-version.js +41 -0
- package/package.json +4 -2
- package/dist/public/assets/Detail-CTD5OeB0.js +0 -1
- package/dist/public/assets/Detail-CTD5OeB0.js.br +0 -0
- package/dist/public/assets/MonetizationMode-DZmggvdZ.js +0 -1
- package/dist/public/assets/MonetizationModeSummary-7jDe4Q_6.js +0 -1
- package/dist/public/assets/Tag-DSB9Uput.js +0 -1
- package/dist/public/assets/baseForm-DbKDw3IN.js.br +0 -0
- package/dist/public/assets/index-B1gECabp.js +0 -1
- package/dist/public/assets/index-B1gECabp.js.br +0 -0
- package/dist/public/assets/index-B3TFdXWD.js +0 -1
- package/dist/public/assets/index-BV532pMK.js.br +0 -0
- package/dist/public/assets/index-BzbUu6Wd.js +0 -1
- package/dist/public/assets/index-COLHKvH0.js +0 -1
- package/dist/public/assets/index-D2zLbzBh.css.br +0 -0
- package/dist/public/assets/index-DenoanNX.js.br +0 -0
- package/dist/public/assets/index-DnsrxgPV.js +0 -1
- package/dist/public/assets/index-DnsrxgPV.js.br +0 -0
- package/dist/public/assets/index-Do3D3DDt.js +0 -1
- package/dist/public/assets/index-Do3D3DDt.js.br +0 -0
- package/dist/public/assets/index-DyR-YyZt.js +0 -1
- package/dist/public/assets/index-OPQyWrBC.js +0 -21
- package/dist/public/assets/index-OPQyWrBC.js.br +0 -0
- package/dist/public/assets/index-eoDMPIdb.js.br +0 -0
- package/dist/public/assets/index-y9pNuDMs.js.br +0 -0
- package/dist/public/assets/index-yR_bPMcB.css.br +0 -0
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,277 @@
|
|
|
1
|
+
## 0.1.0
|
|
2
|
+
|
|
3
|
+
发布正式版本,支持 H5 小游戏和原生小游戏的初始化、开发调试和打包构建。支持 Windows 系统
|
|
4
|
+
|
|
5
|
+
## 0.1.0-beta.1
|
|
6
|
+
|
|
7
|
+
移除 Client WS 端口和 Http 端口默认 -1 的配置,变成通过和 Node CLI 通信显示发端口
|
|
8
|
+
|
|
9
|
+
## 0.1.0-beta.8
|
|
10
|
+
|
|
11
|
+
支持自动打开浏览器,且聚焦在 devTools 窗口
|
|
12
|
+
|
|
13
|
+
## 0.1.0-beta.9
|
|
14
|
+
|
|
15
|
+
1. 支持文件上传进度显示
|
|
16
|
+
2. 支持自动打开浏览器调试模式
|
|
17
|
+
|
|
18
|
+
## 0.1.0-beta.10
|
|
19
|
+
|
|
20
|
+
fix: 修复还未完成新编译就直接上传了的问题
|
|
21
|
+
|
|
22
|
+
## 0.1.0-beta.11
|
|
23
|
+
|
|
24
|
+
feat: 先关闭自动上传能力
|
|
25
|
+
|
|
26
|
+
## 0.1.0-beta.12
|
|
27
|
+
|
|
28
|
+
feat: 支持文件变更监听,告知浏览器文件变更,提醒开发者重新加载游戏
|
|
29
|
+
|
|
30
|
+
## 0.1.0-beta.13
|
|
31
|
+
|
|
32
|
+
1. 支持 sourcemap
|
|
33
|
+
2. 优化上传环节产物,过滤 sourcemap 文件,提高上传效率
|
|
34
|
+
|
|
35
|
+
## 0.1.0-beta.14
|
|
36
|
+
|
|
37
|
+
1. 修复 client key 未成功写入 mock meta 的问题,导致不一致
|
|
38
|
+
|
|
39
|
+
## 0.1.0-beta.15
|
|
40
|
+
|
|
41
|
+
1. 还原 open url 历史方法
|
|
42
|
+
|
|
43
|
+
## 0.1.1
|
|
44
|
+
|
|
45
|
+
发布最新版本,提醒开发者升级最新版本
|
|
46
|
+
|
|
47
|
+
## 0.1.2
|
|
48
|
+
|
|
49
|
+
发布最新版本,支持 sourcemap
|
|
50
|
+
|
|
51
|
+
## 0.1.3-beta.1
|
|
52
|
+
|
|
53
|
+
优化显示二维码问题
|
|
54
|
+
|
|
55
|
+
## 0.1.3-beta.2
|
|
56
|
+
|
|
57
|
+
彻底修复二维码兼容问题
|
|
58
|
+
|
|
59
|
+
## 0.1.3-beta.3
|
|
60
|
+
|
|
61
|
+
修复 sourcemap 错乱问题
|
|
62
|
+
|
|
63
|
+
## 0.1.3-beta.4
|
|
64
|
+
|
|
65
|
+
修复循环依赖问题
|
|
66
|
+
|
|
67
|
+
## 0.1.3-beta.5
|
|
68
|
+
|
|
69
|
+
修复监听文件变化报错问题
|
|
70
|
+
|
|
71
|
+
## 0.1.3
|
|
72
|
+
|
|
73
|
+
发布优化版本 CLI
|
|
74
|
+
|
|
75
|
+
## 0.1.4
|
|
76
|
+
|
|
77
|
+
优化页面交互
|
|
78
|
+
|
|
79
|
+
## 0.1.5
|
|
80
|
+
|
|
81
|
+
1.fix: 控制台报错问题 2. feat: 优化
|
|
82
|
+
|
|
83
|
+
## 0.1.6
|
|
84
|
+
|
|
85
|
+
1. 优化控制台报错日志
|
|
86
|
+
2. 优化调试启动环节耗时
|
|
87
|
+
|
|
88
|
+
## 0.1.7
|
|
89
|
+
|
|
90
|
+
- 修复 Windows 调试资源加载失败问题
|
|
91
|
+
|
|
92
|
+
## 0.1.8
|
|
93
|
+
|
|
94
|
+
优化 DevTool 网页端启动时间
|
|
95
|
+
|
|
96
|
+
## 0.1.9-beta.1
|
|
97
|
+
|
|
98
|
+
发布测试版本,供客户端调试使用
|
|
99
|
+
|
|
100
|
+
## 0.1.9-beta.2
|
|
101
|
+
|
|
102
|
+
发布测试版本,用于 Windows 测试
|
|
103
|
+
|
|
104
|
+
## 0.1.9
|
|
105
|
+
|
|
106
|
+
发布正式版本,支持
|
|
107
|
+
|
|
108
|
+
- login
|
|
109
|
+
- 支持上传游戏包
|
|
110
|
+
- 支持启动模式
|
|
111
|
+
- 支持 Debug Settings
|
|
112
|
+
|
|
113
|
+
## 0.2.0-beta.1
|
|
114
|
+
|
|
115
|
+
发布测试版本,用于 Windows 测试 login 登录异常逻辑
|
|
116
|
+
|
|
117
|
+
## 0.2.0
|
|
118
|
+
|
|
119
|
+
发布正式版本,支持 Windows 登录加载报错提示
|
|
120
|
+
|
|
121
|
+
## 0.2.1
|
|
122
|
+
|
|
123
|
+
1. 移除项目详情部分,比较冗余,不常用,融合到代码预检中
|
|
124
|
+
2. 打开调试页面地址增加 version 参数,来规避新老版本缓存问题和不同网页之间的隔离(未来支持)
|
|
125
|
+
3. 优化登录失败提示,增加网络检查提示,并给出如何修改网络设置的文档链接
|
|
126
|
+
4. 补充发送 meta 至客户端链路,增加调试链路日志信息,便于排查问题
|
|
127
|
+
|
|
128
|
+
## 0.2.2
|
|
129
|
+
|
|
130
|
+
1. 修复访问无权限的小游戏,顶部报错问题
|
|
131
|
+
|
|
132
|
+
## 0.2.3
|
|
133
|
+
|
|
134
|
+
优化扫码连接不上问题,支持手动绑定电脑本地 IP 地址
|
|
135
|
+
|
|
136
|
+
## 0.2.4
|
|
137
|
+
|
|
138
|
+
支持新的 DevTool 平台
|
|
139
|
+
|
|
140
|
+
## 0.2.5
|
|
141
|
+
|
|
142
|
+
1. 增加不在游戏根目录启动调试校验
|
|
143
|
+
2. 支持手动绑定客户端 IP 地址和端口
|
|
144
|
+
3. 调整启动模式中的场景列表表达文案
|
|
145
|
+
4. 修复文件上传问题,避免偶现上传失败
|
|
146
|
+
5. 支持展示游戏详情模块,支持开发者查看当前小游戏基本信息
|
|
147
|
+
6. 支持调试环节消费平台配置的域名
|
|
148
|
+
7. 升级 ttmg-pack 0.1.7,修复构建环节对开发者 JS 代码降级的问题
|
|
149
|
+
8. 文档新增常见问题部分,替换原有的开发文档
|
|
150
|
+
|
|
151
|
+
## 0.2.6
|
|
152
|
+
|
|
153
|
+
修复启动模式中场景列表展示问题,重复展示默认启动模式
|
|
154
|
+
|
|
155
|
+
## 0.2.7
|
|
156
|
+
1. 升级 ttmg-pack 0.2.3,调整 esbuild 配置,目标 es2020
|
|
157
|
+
2. 支持校验子包配置文件名是否符合规范,对于非法文件名,提示开发者修改
|
|
158
|
+
3. 调整域名校验默认逻辑,默认开启,校验失败时,提示开发者修改
|
|
159
|
+
|
|
160
|
+
## 0.2.8
|
|
161
|
+
1. 升级 ttmg-pack 0.2.4,修复 open data context 文件丢失问题
|
|
162
|
+
|
|
163
|
+
## 0.2.9
|
|
164
|
+
1. 升级 ttmg-pack 0.2.5,修复 open data context 打包问题
|
|
165
|
+
## 0.3.0
|
|
166
|
+
新增/优化功能适用 TikTok 版本 iOS >=43.1 | Android>=43.1
|
|
167
|
+
支持了开发信息蒙层,打开后可以查看游戏 FPS、设备信息、调试开关等信息,便于查看游戏运行状态 了解如何使用
|
|
168
|
+
支持删除历史启动模式,便于管理历史启动模式
|
|
169
|
+
调整调试设置模块名称为开发选项,和客户端内调开发者选项保持一致 了解如何使用
|
|
170
|
+
调试设置新增定义 vConsole 和 开发信息浮层设置
|
|
171
|
+
支持了变更日志,用户可以在调试环境下查看游戏的变更记录,部分新功能可通过更多信息查看使用
|
|
172
|
+
支持了调试设置开关本地缓存,避免每次都需要重新设置
|
|
173
|
+
修复上传名称为中文的游戏时,平台展示乱码的问题
|
|
174
|
+
修复启动模式模块,自定义query 参数无法持久化的问题
|
|
175
|
+
修复扫描二维码模块,内容过多,纵向无法滚动问题
|
|
176
|
+
|
|
177
|
+
## 0.3.1
|
|
178
|
+
- 支持 unity 小游戏本地一些列调试功能,如 Wasm 分包、包大小校验、一键上传代码包至平台等 了解如何使用
|
|
179
|
+
- 增加用户登录过期的异常提示,提醒开发者重新登录
|
|
180
|
+
- 优化上传代码包至平台功能,开发者只用添加描述后点击上传便可自动压缩当前目录下的代码包上传至开发者平台
|
|
181
|
+
- 优化 ttmg login 终端网络代理异常导致无法登录的报错引导,提示用户检查网络设置
|
|
182
|
+
|
|
183
|
+
## 0.3.2-beta.1
|
|
184
|
+
支持 cocos 2.0 openDataContext 相关适配
|
|
185
|
+
|
|
186
|
+
## 0.3.2
|
|
187
|
+
- 小游戏详情查询升级到 TikTok DevPortal v4 `devtool/info` 接口,字段映射更完整
|
|
188
|
+
- 支持一键打包当前目录并上传代码包到开发者平台;上传失败提示更明确,文件名非法字符自动处理
|
|
189
|
+
- Unity Wasm 分包:更新 `game.json` 子包配置写入逻辑(兼容 `subpackages`/`subPackages` 字段),Android/iOS main/sub 配置去重合并
|
|
190
|
+
- 启动校验增强:检查是否在小游戏根目录执行,并提示 `subPackages` 拼写错误
|
|
191
|
+
增加对 unity 是否需要分包的检查,对于需要分包的 unity 项目,给出明确提示
|
|
192
|
+
支持通过 `ttmg setup` 配置 CLI 语言,调试环境会跟随语言设置展示文案,首次调试时会自动同步默认语言,后续 CLI 与 IDE 语言保持一致,减少反复切换
|
|
193
|
+
调试与预检支持多语言展示,关键提示与校验信息更易理解
|
|
194
|
+
支持 Cocos 2.0 openDataContext 配置
|
|
195
|
+
变更记录新增提醒功能,当有新版本发布时,会通过弹窗提醒开发者更新
|
|
196
|
+
ttmg login 支持 ttmg login --verbose 参数,打印更多登录信息
|
|
197
|
+
API 预检建议文案统一收敛,避免重复提示,阅读更清晰
|
|
198
|
+
顶部区域透出项目预检错误与警告信息,便于开发者及时发现问题并修复
|
|
199
|
+
语言选择策略优化:优先使用 CLI 本地设置,未设置时自动回退浏览器语言
|
|
200
|
+
启动校验增强:检查是否在小游戏根目录执行,对于分包配置 subPackages 给出明确报错,引导开发者修改为 subpackages
|
|
201
|
+
修复项目详情中展示的主包大小限制和代码预检不一致的情况
|
|
202
|
+
|
|
203
|
+
## 0.3.3
|
|
204
|
+
升级 ttmg-pack 到 0.4.5,解决安卓无法调试 unity 项目问题
|
|
205
|
+
|
|
206
|
+
## 0.3.4
|
|
207
|
+
优化校验逻辑,给出提示
|
|
208
|
+
|
|
209
|
+
## 0.3.5
|
|
210
|
+
优化连接和代理,帮助开发者自助解决问题
|
|
211
|
+
|
|
212
|
+
## 0.3.6
|
|
213
|
+
修复分包过程超时问题
|
|
214
|
+
|
|
215
|
+
## 0.3.7
|
|
216
|
+
新增/优化功能适用 TikTok 版本 iOS >=43.1 | Android >=43.1
|
|
217
|
+
|
|
218
|
+
1. 新增能力接入助手,帮助开发者基于小游戏变现类型获取关键能力的接入引导。
|
|
219
|
+
2. 优化上传发布环节,将代码预检与代码上传整合为完整的上传发布流程。
|
|
220
|
+
3. 扩充包体大小预检说明,补充整包、主包、独立分包限制规则与详细文档入口,便于开发者理解和处理包体超限问题。
|
|
221
|
+
|
|
222
|
+
## 0.3.8
|
|
223
|
+
修复 `ttmg login` 后接口鉴权异常的问题:
|
|
224
|
+
|
|
225
|
+
1. 登录时把 `Set-Cookie` 响应头中的 `Path / Domain / Max-Age / Expires / Secure / HttpOnly / SameSite` 等属性被当成 cookie 拼接到 `Cookie` 字段,导致 CLI 发请求时把属性当成"假 cookie"一并带上。
|
|
226
|
+
2. 同一域名下同名 cookie(例如服务端用 `Max-Age=0` 显式删除的占位 cookie)也会被一起发送,污染掉真正有效的同名 cookie,浏览器会自动过滤这种情况,CLI 不会,造成登录态接口异常。
|
|
227
|
+
3. 修复后与浏览器行为保持一致:剥离 cookie 属性、过滤 `Max-Age<=0` 或 `Expires` 已过期的 cookie,仅保留 `name=value` 用于请求。
|
|
228
|
+
4. 已登录用户无需重新登录,下次发起请求时会自动清洗 rc 中已存的脏数据。
|
|
229
|
+
|
|
230
|
+
## 0.3.9
|
|
231
|
+
本次主要优化调试 IDE 的视觉、交互与多语言一致性:
|
|
232
|
+
|
|
233
|
+
1. 调试 IDE 默认使用浅色主题,暗色模式改为开发者手动开启并记忆选择,避免跟随系统强制进入暗色导致不适应。
|
|
234
|
+
2. 优化暗色模式下二维码显示,调整背景避免过亮刺眼,同时保证扫码识别率。
|
|
235
|
+
3. Wasm 分包页面及相关组件补齐多语言,修复此前页面文案中英文混排的问题。
|
|
236
|
+
4. 能力接入助手页面视觉升级:变现模式卡片新增图标与强调色,关键能力标签按「必需 / 可选 / 实验」分级展示,信息层级更清晰。
|
|
237
|
+
5. 完成扫码连接后,首页标题与说明文案会切换为「已连接」状态,状态反馈更明确。
|
|
238
|
+
6. 新版本提示由红点改为「有更新」文字标签,含义更直观。
|
|
239
|
+
7. 上传游戏包按钮配色与产品主题色统一。
|
|
240
|
+
8. 修复多个页面中标题与正文内容未对齐的问题,整体排版更整齐。
|
|
241
|
+
9. 文案细节调整:「身份与授权」更名为「登录与授权」;移除侧边栏冗余的「查看文档」入口。
|
|
242
|
+
|
|
243
|
+
## 0.3.9-beta.1
|
|
244
|
+
本次测试版本主要补充启动模式场景能力,并优化场景命名可理解性:
|
|
245
|
+
|
|
246
|
+
1. 启动模式新增 `inbox` 场景,支持在调试链路中模拟消息入口启动小游戏。
|
|
247
|
+
|
|
248
|
+
## 0.4.0
|
|
249
|
+
|
|
250
|
+
修复游戏无开发权限时提示信息展示异常的问题,引导更准确。
|
|
251
|
+
|
|
252
|
+
## 0.4.1
|
|
253
|
+
|
|
254
|
+
优化上传代码包流程:
|
|
255
|
+
|
|
256
|
+
1. 上传后的平台处理提示改为更易理解的文案,不再向开发者暴露平台内部状态码及 asset / ready 等技术字段,进度与失败原因表达更清晰。
|
|
257
|
+
2. 重构上传成功卡片布局:二维码与版本信息分区展示并以分隔线区隔,新增成功状态标识,排版更紧凑协调。
|
|
258
|
+
|
|
259
|
+
## 0.4.4-beta.1
|
|
260
|
+
|
|
261
|
+
支持版本:TikTok iOS 46.0+、TikTok Android 45.9+。
|
|
262
|
+
|
|
263
|
+
新增子包收集能力:通过真机预览记录启动阶段实际预下载的子包,并生成预加载配置,帮助减少后续资源加载等待。当前仅支持非 Unity 小游戏。
|
|
264
|
+
|
|
265
|
+
使用指南:https://bytedance.my.larkoffice.com/docx/MIyMdmzb0oOQAKxNHGNmR5hDyAh
|
|
266
|
+
|
|
267
|
+
## 0.4.4
|
|
268
|
+
|
|
269
|
+
支持版本:TikTok iOS 46.0+、TikTok Android 45.9+。
|
|
270
|
+
|
|
271
|
+
正式开放子包收集能力:通过真机预览记录启动阶段实际预下载的子包,并生成预加载配置,帮助减少后续资源加载等待。当前仅支持非 Unity 小游戏。
|
|
272
|
+
|
|
273
|
+
子包收集使用指南:https://bytedance.my.larkoffice.com/docx/MIyMdmzb0oOQAKxNHGNmR5hDyAh
|
|
274
|
+
|
|
275
|
+
修复部分企业网络使用非标准局域网网段时,可扫码地址被误判为不可用的问题。
|
|
276
|
+
|
|
277
|
+
提升本地调试连接稳定性:启动阶段短暂断连会自动恢复,刷新调试页面后可继续使用已连接设备。
|
package/dist/index.js
CHANGED
|
@@ -8726,186 +8726,94 @@ function listen$1() {
|
|
|
8726
8726
|
});
|
|
8727
8727
|
}
|
|
8728
8728
|
|
|
8729
|
-
|
|
8730
|
-
|
|
8731
|
-
|
|
8732
|
-
|
|
8733
|
-
|
|
8734
|
-
|
|
8735
|
-
|
|
8736
|
-
|
|
8737
|
-
|
|
8738
|
-
|
|
8739
|
-
|
|
8740
|
-
|
|
8741
|
-
|
|
8742
|
-
|
|
8743
|
-
|
|
8744
|
-
|
|
8745
|
-
|
|
8746
|
-
|
|
8747
|
-
|
|
8748
|
-
|
|
8749
|
-
|
|
8750
|
-
|
|
8751
|
-
|
|
8752
|
-
|
|
8753
|
-
|
|
8754
|
-
|
|
8755
|
-
|
|
8756
|
-
|
|
8757
|
-
|
|
8758
|
-
|
|
8759
|
-
'
|
|
8760
|
-
|
|
8761
|
-
|
|
8762
|
-
|
|
8763
|
-
|
|
8764
|
-
|
|
8765
|
-
|
|
8766
|
-
|
|
8767
|
-
'lo',
|
|
8768
|
-
'ppp',
|
|
8769
|
-
'tailscale',
|
|
8770
|
-
'zerotier',
|
|
8771
|
-
'npcap',
|
|
8772
|
-
'npf',
|
|
8773
|
-
'wg',
|
|
8774
|
-
'wireguard',
|
|
8775
|
-
'anyconnect',
|
|
8776
|
-
'teleport',
|
|
8777
|
-
];
|
|
8778
|
-
// 判断是否为物理网卡(基于名称的启发式)
|
|
8779
|
-
function isPhysicalInterface(name) {
|
|
8780
|
-
const lower = name.toLowerCase();
|
|
8781
|
-
return (WIRED_KEYWORDS.some(k => lower.includes(k)) ||
|
|
8782
|
-
WIRELESS_KEYWORDS.some(k => lower.includes(k)));
|
|
8783
|
-
}
|
|
8784
|
-
// 判断是否为虚拟/隧道接口
|
|
8785
|
-
function isVirtualInterface(name) {
|
|
8786
|
-
const lower = name.toLowerCase();
|
|
8787
|
-
return VIRTUAL_INTERFACE_KEYWORDS.some(k => lower.includes(k));
|
|
8788
|
-
}
|
|
8789
|
-
// 判断局域网私有 IPv4
|
|
8790
|
-
function isPrivateIPv4(ip) {
|
|
8791
|
-
return (ip.startsWith('10.') ||
|
|
8792
|
-
ip.startsWith('192.168.') ||
|
|
8793
|
-
/^172\.(1[6-9]|2\d|3[01])\./.test(ip));
|
|
8794
|
-
}
|
|
8795
|
-
function isUsableFallbackIPv4(ip) {
|
|
8796
|
-
const parts = ip.split('.').map(Number);
|
|
8797
|
-
if (parts.length !== 4 || parts.some(part => !Number.isInteger(part) || part < 0 || part > 255)) {
|
|
8798
|
-
return false;
|
|
8799
|
-
}
|
|
8800
|
-
const [first, second] = parts;
|
|
8801
|
-
return first !== 0 && first !== 127 && first < 224 && !(first === 169 && second === 254);
|
|
8802
|
-
}
|
|
8803
|
-
// 兼容不同 Node 版本中 family 的类型('IPv4' | 4)
|
|
8804
|
-
function isIPv4Family(f) {
|
|
8805
|
-
return f === 4 || f === 'IPv4';
|
|
8729
|
+
const VIRTUAL_INTERFACE_PREFIX = /^(lo\d*|utun\d*|tun\d*|tap\d*|ppp\d*|ipsec\d*|wg\d*|tailscale\d*|zerotier\d*|veth|docker|br-|bridge|vmnet|vbox|anpi|awdl|llw|npf)/i;
|
|
8730
|
+
const VIRTUAL_INTERFACE_KEYWORDS = [
|
|
8731
|
+
'vmware',
|
|
8732
|
+
'virtual',
|
|
8733
|
+
'hyper-v',
|
|
8734
|
+
'vethernet',
|
|
8735
|
+
'anyconnect',
|
|
8736
|
+
'teleport',
|
|
8737
|
+
'npcap',
|
|
8738
|
+
'hamachi',
|
|
8739
|
+
];
|
|
8740
|
+
const WIRELESS_INTERFACE = /^(wl|wlan|wlp|wifi|wi-fi|airport)|无线|无线网络连接/i;
|
|
8741
|
+
const WIRED_INTERFACE = /^(en\d+|enp\w+|eno\w+|ens\w+|eth\w+)$|ethernet|\blan\b|以太网|本地连接/i;
|
|
8742
|
+
function isVirtualInterface(name) {
|
|
8743
|
+
const lowerName = name.toLowerCase();
|
|
8744
|
+
return (VIRTUAL_INTERFACE_PREFIX.test(lowerName) ||
|
|
8745
|
+
VIRTUAL_INTERFACE_KEYWORDS.some(keyword => lowerName.includes(keyword)));
|
|
8746
|
+
}
|
|
8747
|
+
function getInterfaceRank(name) {
|
|
8748
|
+
if (WIRELESS_INTERFACE.test(name))
|
|
8749
|
+
return 0;
|
|
8750
|
+
if (WIRED_INTERFACE.test(name))
|
|
8751
|
+
return 1;
|
|
8752
|
+
return 2;
|
|
8753
|
+
}
|
|
8754
|
+
function isPhysicalInterface(name) {
|
|
8755
|
+
return getInterfaceRank(name) < 2;
|
|
8756
|
+
}
|
|
8757
|
+
function isPrivateIPv4(ip) {
|
|
8758
|
+
return (ip.startsWith('10.') ||
|
|
8759
|
+
ip.startsWith('192.168.') ||
|
|
8760
|
+
/^172\.(1[6-9]|2\d|3[01])\./.test(ip));
|
|
8761
|
+
}
|
|
8762
|
+
function isUsableFallbackIPv4(ip) {
|
|
8763
|
+
const parts = ip.split('.').map(Number);
|
|
8764
|
+
if (parts.length !== 4 ||
|
|
8765
|
+
parts.some(part => !Number.isInteger(part) || part < 0 || part > 255)) {
|
|
8766
|
+
return false;
|
|
8806
8767
|
}
|
|
8807
|
-
const
|
|
8768
|
+
const [first, second] = parts;
|
|
8769
|
+
return (first !== 0 &&
|
|
8770
|
+
first !== 127 &&
|
|
8771
|
+
first < 224 &&
|
|
8772
|
+
!(first === 169 && second === 254));
|
|
8773
|
+
}
|
|
8774
|
+
function isIPv4Family(family) {
|
|
8775
|
+
return family === 4 || family === 'IPv4';
|
|
8776
|
+
}
|
|
8777
|
+
function selectLocalIPs(nets) {
|
|
8808
8778
|
const privateResults = [];
|
|
8809
8779
|
const physicalFallbacks = [];
|
|
8810
|
-
for (const name of Object.
|
|
8811
|
-
|
|
8812
|
-
// 先粗略排除明显虚拟接口
|
|
8813
|
-
if (isVirtualInterface(name))
|
|
8780
|
+
for (const [name, addrs] of Object.entries(nets)) {
|
|
8781
|
+
if (!addrs || isVirtualInterface(name) || !isPhysicalInterface(name)) {
|
|
8814
8782
|
continue;
|
|
8815
|
-
|
|
8816
|
-
// 有些系统的命名不标准,允许在地址层面兜底
|
|
8817
|
-
let matchedPhysicalName = isPhysicalInterface(name);
|
|
8783
|
+
}
|
|
8818
8784
|
for (const net of addrs) {
|
|
8819
|
-
if (!isIPv4Family(net.family)
|
|
8820
|
-
|
|
8821
|
-
|
|
8822
|
-
continue;
|
|
8823
|
-
if (!net.address)
|
|
8785
|
+
if (!isIPv4Family(net.family) ||
|
|
8786
|
+
net.internal ||
|
|
8787
|
+
!net.address) {
|
|
8824
8788
|
continue;
|
|
8825
|
-
if (isPrivateIPv4(net.address)) {
|
|
8826
|
-
// 若名称判断不通过,但地址是私有网段、且非回环/非内网,考虑接纳
|
|
8827
|
-
// 但排除明显虚拟(已经在上面过滤 name)
|
|
8828
|
-
if (matchedPhysicalName || shouldAcceptByHeuristic(name)) {
|
|
8829
|
-
privateResults.push({ name, address: net.address });
|
|
8830
|
-
}
|
|
8831
8789
|
}
|
|
8832
|
-
|
|
8833
|
-
|
|
8834
|
-
|
|
8835
|
-
|
|
8790
|
+
const target = isPrivateIPv4(net.address)
|
|
8791
|
+
? privateResults
|
|
8792
|
+
: physicalFallbacks;
|
|
8793
|
+
if (isPrivateIPv4(net.address) ||
|
|
8794
|
+
isUsableFallbackIPv4(net.address)) {
|
|
8795
|
+
target.push({ name, address: net.address });
|
|
8836
8796
|
}
|
|
8837
8797
|
}
|
|
8838
8798
|
}
|
|
8839
|
-
const
|
|
8840
|
-
|
|
8841
|
-
|
|
8842
|
-
|
|
8843
|
-
|
|
8844
|
-
|
|
8845
|
-
|
|
8846
|
-
|
|
8847
|
-
|
|
8848
|
-
|
|
8849
|
-
|
|
8850
|
-
|
|
8851
|
-
|
|
8852
|
-
|
|
8853
|
-
|
|
8854
|
-
const ra = rank(a.name);
|
|
8855
|
-
const rb = rank(b.name);
|
|
8856
|
-
if (ra !== rb)
|
|
8857
|
-
return ra - rb;
|
|
8858
|
-
// 同级按名称自然排序
|
|
8859
|
-
return a.name.localeCompare(b.name, undefined, { numeric: true });
|
|
8860
|
-
});
|
|
8861
|
-
return unique.map(item => item.address);
|
|
8862
|
-
// 兜底启发式:如果名字不明显,但常见物理命名模式且 IP 为私网,接受
|
|
8863
|
-
function shouldAcceptByHeuristic(name) {
|
|
8864
|
-
name.toLowerCase();
|
|
8865
|
-
// macOS: en0/en1
|
|
8866
|
-
if (/^en\d+$/i.test(name))
|
|
8867
|
-
return true;
|
|
8868
|
-
// Linux: enpXsY / enoX / wlpXsY
|
|
8869
|
-
if (/^(enp|eno|wlp)\w+$/i.test(name))
|
|
8870
|
-
return true;
|
|
8871
|
-
// Windows: 以太网 / Wi-Fi(非虚拟已过滤)
|
|
8872
|
-
if (/(以太网|本地连接|wi-?fi|无线)/.test(name))
|
|
8873
|
-
return true;
|
|
8874
|
-
return false;
|
|
8875
|
-
}
|
|
8876
|
-
function dedupe(arr) {
|
|
8877
|
-
const seen = new Set();
|
|
8878
|
-
const out = [];
|
|
8879
|
-
for (const item of arr) {
|
|
8880
|
-
const key = `${item.name}|${item.address}`;
|
|
8881
|
-
if (!seen.has(key)) {
|
|
8882
|
-
seen.add(key);
|
|
8883
|
-
out.push(item);
|
|
8884
|
-
}
|
|
8885
|
-
}
|
|
8886
|
-
return out;
|
|
8887
|
-
}
|
|
8799
|
+
const candidates = privateResults.length > 0 ? privateResults : physicalFallbacks;
|
|
8800
|
+
const seen = new Set();
|
|
8801
|
+
return candidates
|
|
8802
|
+
.sort((a, b) => {
|
|
8803
|
+
const rankDiff = getInterfaceRank(a.name) - getInterfaceRank(b.name);
|
|
8804
|
+
return (rankDiff ||
|
|
8805
|
+
a.name.localeCompare(b.name, undefined, { numeric: true }));
|
|
8806
|
+
})
|
|
8807
|
+
.filter(item => {
|
|
8808
|
+
if (seen.has(item.address))
|
|
8809
|
+
return false;
|
|
8810
|
+
seen.add(item.address);
|
|
8811
|
+
return true;
|
|
8812
|
+
})
|
|
8813
|
+
.map(item => item.address);
|
|
8888
8814
|
}
|
|
8889
|
-
|
|
8890
|
-
|
|
8891
|
-
// 优先使用 getLocalIPs 的过滤 + 排序结果(更适合扫码调试场景)
|
|
8892
|
-
const preferred = getLocalIPs()[0];
|
|
8893
|
-
if (preferred) {
|
|
8894
|
-
return preferred;
|
|
8895
|
-
}
|
|
8896
|
-
const networkInterfaces = os.networkInterfaces();
|
|
8897
|
-
for (const interfaceName in networkInterfaces) {
|
|
8898
|
-
const interfaceInfo = networkInterfaces[interfaceName];
|
|
8899
|
-
if (!interfaceInfo)
|
|
8900
|
-
continue;
|
|
8901
|
-
for (const addressInfo of interfaceInfo) {
|
|
8902
|
-
if (addressInfo.family === 'IPv4' && !addressInfo.internal) {
|
|
8903
|
-
return addressInfo.address;
|
|
8904
|
-
}
|
|
8905
|
-
}
|
|
8906
|
-
}
|
|
8907
|
-
// 极端场景:无可用 IPv4(例如仅有回环/无网络)。避免返回 undefined 破坏 schema。
|
|
8908
|
-
return '127.0.0.1';
|
|
8815
|
+
function getLocalIPs() {
|
|
8816
|
+
return selectLocalIPs(os.networkInterfaces());
|
|
8909
8817
|
}
|
|
8910
8818
|
|
|
8911
8819
|
async function init(options = {}) {
|
|
@@ -9412,6 +9320,8 @@ const gameConfigRoute = {
|
|
|
9412
9320
|
const user = getCurrentUser();
|
|
9413
9321
|
const { clientKey } = getClientKey();
|
|
9414
9322
|
const localLang = getConfiguredLanguage();
|
|
9323
|
+
const localIPs = getLocalIPs();
|
|
9324
|
+
const localHost = localIPs[0] || '127.0.0.1';
|
|
9415
9325
|
res.send({
|
|
9416
9326
|
error: null,
|
|
9417
9327
|
data: {
|
|
@@ -9420,7 +9330,7 @@ const gameConfigRoute = {
|
|
|
9420
9330
|
nodeServerPort: store.getState().nodeServerPort,
|
|
9421
9331
|
nodeWsPort: store.getState().nodeWsPort,
|
|
9422
9332
|
clientKey,
|
|
9423
|
-
schema: `https://www.tiktok.com/ttmg/dev/${clientKey}?host=${
|
|
9333
|
+
schema: `https://www.tiktok.com/ttmg/dev/${clientKey}?host=${localHost}&port=${store.getState().nodeWsPort}&host_list=${encodeURIComponent(JSON.stringify(localIPs))}`,
|
|
9424
9334
|
...basic,
|
|
9425
9335
|
devToolVersion,
|
|
9426
9336
|
checkResult,
|
|
@@ -9482,6 +9392,40 @@ const gameCheckRoute = {
|
|
|
9482
9392
|
};
|
|
9483
9393
|
|
|
9484
9394
|
const changelog = [
|
|
9395
|
+
{
|
|
9396
|
+
title: '0.4.5',
|
|
9397
|
+
target: {
|
|
9398
|
+
iOS: '>=46.0',
|
|
9399
|
+
Android: '>=45.9',
|
|
9400
|
+
},
|
|
9401
|
+
changes: {
|
|
9402
|
+
optimize: [
|
|
9403
|
+
{
|
|
9404
|
+
desc: {
|
|
9405
|
+
'zh-CN': '优化调试会话信息展示:开发者选项以独立状态标签呈现,便于快速确认域名校验、vConsole 和开发信息面板的启用状态。',
|
|
9406
|
+
'en-US': 'Improve debugging session details by showing developer options as separate status tags, making it easier to verify domain validation, vConsole, and the developer information panel.',
|
|
9407
|
+
},
|
|
9408
|
+
module: 'devOptions',
|
|
9409
|
+
},
|
|
9410
|
+
{
|
|
9411
|
+
desc: {
|
|
9412
|
+
'zh-CN': '优化扫码网络异常提示:未检测到可用局域网地址时不再展示无效二维码,并引导设置连接地址。',
|
|
9413
|
+
'en-US': 'Improve scan-to-connect network guidance: hide unusable QR codes when no local network address is available and guide developers to set a connection address.',
|
|
9414
|
+
},
|
|
9415
|
+
module: 'scanQrcode',
|
|
9416
|
+
},
|
|
9417
|
+
],
|
|
9418
|
+
bugfix: [
|
|
9419
|
+
{
|
|
9420
|
+
desc: {
|
|
9421
|
+
'zh-CN': '修复子包收集页面在部分环境下无法打开的问题。',
|
|
9422
|
+
'en-US': 'Fix an issue where the Subpackage Collection page could fail to open in some environments.',
|
|
9423
|
+
},
|
|
9424
|
+
module: 'new',
|
|
9425
|
+
},
|
|
9426
|
+
],
|
|
9427
|
+
},
|
|
9428
|
+
},
|
|
9485
9429
|
{
|
|
9486
9430
|
title: '0.4.4',
|
|
9487
9431
|
target: {
|
|
@@ -9507,6 +9451,13 @@ const changelog = [
|
|
|
9507
9451
|
},
|
|
9508
9452
|
module: 'scanQrcode',
|
|
9509
9453
|
},
|
|
9454
|
+
{
|
|
9455
|
+
desc: {
|
|
9456
|
+
'zh-CN': '提升本地调试连接稳定性:启动阶段短暂断连会自动恢复,刷新调试页面后可继续使用已连接设备。',
|
|
9457
|
+
'en-US': 'Improve local debugging connection stability: recover from transient startup disconnects and retain the connected device after the debugging page is refreshed.',
|
|
9458
|
+
},
|
|
9459
|
+
module: 'scanQrcode',
|
|
9460
|
+
},
|
|
9510
9461
|
],
|
|
9511
9462
|
},
|
|
9512
9463
|
},
|
|
@@ -14034,7 +13985,7 @@ async function upload({ clientKey, note = '--', dir, }) {
|
|
|
14034
13985
|
}
|
|
14035
13986
|
}
|
|
14036
13987
|
|
|
14037
|
-
var version = "0.4.
|
|
13988
|
+
var version = "0.4.5";
|
|
14038
13989
|
var pkg = {
|
|
14039
13990
|
version: version};
|
|
14040
13991
|
|