@ttmg/cli 0.4.1-beta.wasm1 → 0.4.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.
Files changed (121) hide show
  1. package/dist/index.js +170 -19
  2. package/dist/index.js.map +1 -1
  3. package/dist/package.json +1 -1
  4. package/dist/public/assets/Detail-DNF1PK-R.js +1 -0
  5. package/dist/public/assets/Detail-DNF1PK-R.js.br +0 -0
  6. package/dist/public/assets/MonetizationMode-C59U6Ari.js +1 -0
  7. package/dist/public/assets/MonetizationModeSummary-BR2LJFsU.js +1 -0
  8. package/dist/public/assets/SectionHeader-CCjfBKcF.js +1 -0
  9. package/dist/public/assets/Tag-DON36Of0.js +1 -0
  10. package/dist/public/assets/baseForm-B3oZF8Vp.js +10 -0
  11. package/dist/public/assets/baseForm-B3oZF8Vp.js.br +0 -0
  12. package/dist/public/assets/baseForm-BAvk37jF.css +1 -0
  13. package/dist/public/assets/baseForm-BAvk37jF.css.br +0 -0
  14. package/dist/public/assets/{boxes-C7RoIbId.js → boxes-EbMNfQ6U.js} +1 -1
  15. package/dist/public/assets/{chevron-right-B1WBZrrD.js → chevron-right-CsmjM7t0.js} +1 -1
  16. package/dist/public/assets/col-BXewy14r.css +1 -0
  17. package/dist/public/assets/col-BXewy14r.css.br +0 -0
  18. package/dist/public/assets/col-DWGIx7fj.js +1 -0
  19. package/dist/public/assets/{compass-VJNhHwqW.js → compass-bMD5nDM8.js} +1 -1
  20. package/dist/public/assets/index-B4j49Ts7.js +1 -0
  21. package/dist/public/assets/index-B4j49Ts7.js.br +0 -0
  22. package/dist/public/assets/{index-a-rMUS2V.js → index-B5JnznvI.js} +1 -1
  23. package/dist/public/assets/index-BCV7VBUL.js +1 -0
  24. package/dist/public/assets/index-BCV7VBUL.js.br +0 -0
  25. package/dist/public/assets/index-BKOO94x-.css +1 -0
  26. package/dist/public/assets/index-BPqSXmk6.js +1 -0
  27. package/dist/public/assets/index-Bn_Zugqv.js +1 -0
  28. package/dist/public/assets/index-Bn_Zugqv.js.br +0 -0
  29. package/dist/public/assets/index-BtO50Nho.js +1 -0
  30. package/dist/public/assets/index-BtO50Nho.js.br +0 -0
  31. package/dist/public/assets/{index-C_npSvtQ.js → index-BzEQAUVA.js} +1 -1
  32. package/dist/public/assets/{index-Dn5HHf-0.js → index-CAoj7RMM.js} +1 -1
  33. package/dist/public/assets/index-CKUVWl_O.css +1 -0
  34. package/dist/public/assets/index-CMwzPrAh.css +1 -0
  35. package/dist/public/assets/index-CMwzPrAh.css.br +0 -0
  36. package/dist/public/assets/index-CYnulX57.css +1 -0
  37. package/dist/public/assets/index-CYnulX57.css.br +0 -0
  38. package/dist/public/assets/{index-BH099q_U.js → index-Ca-cQ1Oq.js} +1 -1
  39. package/dist/public/assets/{index-s_30KWiA.js → index-CdJUBcSF.js} +1 -1
  40. package/dist/public/assets/{index-bQUQ2Wmz.js → index-Cf8aH-xI.js} +1 -1
  41. package/dist/public/assets/{index-DMsjcIN8.js → index-D4lGRib1.js} +1 -1
  42. package/dist/public/assets/index-D5-FwYf-.js +1 -0
  43. package/dist/public/assets/index-D5-FwYf-.js.br +0 -0
  44. package/dist/public/assets/{index-BO5MBsdm.js → index-DH7hBDqZ.js} +1 -1
  45. package/dist/public/assets/index-DKxf26_O.css +1 -0
  46. package/dist/public/assets/index-DOMxPC_v.css +1 -0
  47. package/dist/public/assets/index-DOMxPC_v.css.br +0 -0
  48. package/dist/public/assets/index-DRr-Punk.js +1 -0
  49. package/dist/public/assets/index-DV0N-QmJ.js +1 -0
  50. package/dist/public/assets/index-DV0N-QmJ.js.br +0 -0
  51. package/dist/public/assets/index-DXEfgIqc.js +1 -0
  52. package/dist/public/assets/{index-BBR3CPkN.js → index-DaOr2P0A.js} +1 -1
  53. package/dist/public/assets/index-DaOr2P0A.js.br +0 -0
  54. package/dist/public/assets/index-Dv0bhjYp.js +1 -0
  55. package/dist/public/assets/{index-qqnHwFjO.js → index-Dx-boSFk.js} +1 -1
  56. package/dist/public/assets/{index-C1C34gtn.js → index-FYgsnJbm.js} +1 -1
  57. package/dist/public/assets/index-HqjZ5P-l.css +1 -0
  58. package/dist/public/assets/{index-BJZ4gOGZ.css → index-V1Go68Vw.css} +1 -1
  59. package/dist/public/assets/index-V1Go68Vw.css.br +0 -0
  60. package/dist/public/assets/index-VvBtuIHK.css +1 -0
  61. package/dist/public/assets/index-VvBtuIHK.css.br +0 -0
  62. package/dist/public/assets/index-VvUpVuij.js +21 -0
  63. package/dist/public/assets/index-VvUpVuij.js.br +0 -0
  64. package/dist/public/assets/index-VzIFpCiL.js +1 -0
  65. package/dist/public/assets/{index-DbxY65Om.js → index-bASdAMHs.js} +1 -1
  66. package/dist/public/assets/index-q7fKJFmZ.js +1 -0
  67. package/dist/public/assets/index-vlN_-PRJ.css +1 -0
  68. package/dist/public/assets/{layers-Biv61qtE.js → layers-C8HCSIXn.js} +1 -1
  69. package/dist/public/assets/list-checks-B6t2uu5m.js +1 -0
  70. package/dist/public/assets/{sparkles-Bv2GxrFr.js → sparkles-pLu1TMVV.js} +1 -1
  71. package/dist/public/assets/triangle-alert-Dm4_sEwV.js +1 -0
  72. package/dist/public/assets/{zap-CjkC_qWZ.js → zap-tefJh46p.js} +1 -1
  73. package/dist/public/index.html +2 -2
  74. package/dist/scripts/docs/README.md +80 -0
  75. package/dist/scripts/docs/capture.js +84 -6
  76. package/dist/scripts/docs/check.js +184 -0
  77. package/dist/scripts/docs/render.js +283 -6
  78. package/dist/scripts/docs/scenarios/devtool-guide.mjs +802 -0
  79. package/package.json +1 -1
  80. package/CHANGELOG.md +0 -256
  81. package/dist/public/assets/Card-ASGGlJ8S.js +0 -1
  82. package/dist/public/assets/Detail-DY__Zw0r.js +0 -1
  83. package/dist/public/assets/Detail-DY__Zw0r.js.br +0 -0
  84. package/dist/public/assets/MonetizationMode-sHN_4ybQ.js +0 -1
  85. package/dist/public/assets/MonetizationModeSummary-DLvyriLM.js +0 -1
  86. package/dist/public/assets/SectionHeader-B7dueBCf.js +0 -1
  87. package/dist/public/assets/Tag-BsX0d6UL.js +0 -1
  88. package/dist/public/assets/arrow-left-uixm7Sd1.js +0 -1
  89. package/dist/public/assets/baseForm-C8XfTFyG.js +0 -10
  90. package/dist/public/assets/baseForm-C8XfTFyG.js.br +0 -0
  91. package/dist/public/assets/baseForm-Dl4zA6hU.css +0 -1
  92. package/dist/public/assets/baseForm-Dl4zA6hU.css.br +0 -0
  93. package/dist/public/assets/circle-check-wUxXeINd.js +0 -1
  94. package/dist/public/assets/index-BAud2cRu.css +0 -1
  95. package/dist/public/assets/index-BBR3CPkN.js.br +0 -0
  96. package/dist/public/assets/index-BJZ4gOGZ.css.br +0 -0
  97. package/dist/public/assets/index-BNc8JtET.js +0 -1
  98. package/dist/public/assets/index-Bd-f8ERX.js +0 -1
  99. package/dist/public/assets/index-ByX5RuFA.css +0 -1
  100. package/dist/public/assets/index-C7Tmy9g3.js +0 -1
  101. package/dist/public/assets/index-CCKb9Y-j.js +0 -14
  102. package/dist/public/assets/index-CCKb9Y-j.js.br +0 -0
  103. package/dist/public/assets/index-CFd8iglC.css +0 -1
  104. package/dist/public/assets/index-CFd8iglC.css.br +0 -0
  105. package/dist/public/assets/index-CKhfKyA3.js +0 -1
  106. package/dist/public/assets/index-CKhfKyA3.js.br +0 -0
  107. package/dist/public/assets/index-Cc1ilXmc.css +0 -1
  108. package/dist/public/assets/index-DHXlsTU6.css +0 -1
  109. package/dist/public/assets/index-DHXlsTU6.css.br +0 -0
  110. package/dist/public/assets/index-DNd8ZTok.js +0 -1
  111. package/dist/public/assets/index-DNd8ZTok.js.br +0 -0
  112. package/dist/public/assets/index-DpkktYot.css +0 -1
  113. package/dist/public/assets/index-DtoDrber.js +0 -1
  114. package/dist/public/assets/index-DtoDrber.js.br +0 -0
  115. package/dist/public/assets/index-ZHPtAdJM.js +0 -1
  116. package/dist/public/assets/index-ZHPtAdJM.js.br +0 -0
  117. package/dist/public/assets/index-ZtlCPCV9.js +0 -1
  118. package/dist/public/assets/index-_6n0s04V.css +0 -1
  119. package/dist/public/assets/index-_6n0s04V.css.br +0 -0
  120. package/dist/public/assets/index-r3aSeNL1.js +0 -1
  121. package/dist/public/assets/index-t4JeqZ4a.js +0 -1
package/dist/index.js CHANGED
@@ -6615,8 +6615,9 @@ function verboseWarn(...args) {
6615
6615
  /**
6616
6616
  * PPE / 测试环境开关。
6617
6617
  *
6618
- * 所有 CLI 接口(`stark_wasm/v4/*`, `wasm-collect/v1/*`, portal 鉴权等)
6619
- * 都共用本文件的 `request()`,所以在这里统一注入 PPE header 就能覆盖全量。
6618
+ * 除登录和本地客户端请求外,CLI 后端接口(`stark_wasm/v4/*`,
6619
+ * `wasm-collect/v1/*`, portal 业务接口等)都共用本文件的 `request()`,
6620
+ * 所以在这里统一注入 PPE header 就能覆盖主要平台请求。
6620
6621
  * 不在 `DEV_HEADERS` 里改是因为那份常量只被 `remotePipeline.ts` 里的老
6621
6622
  * 远程分包接口 spread 用;新加的 `startSession.ts` / `finishSession.ts` /
6622
6623
  * `getCollectedFuncIds.ts` 都没 spread,漏一处就会绕开 PPE。
@@ -6624,8 +6625,8 @@ function verboseWarn(...args) {
6624
6625
  * 要切回线上环境,直接把 `CLI_PPE_ENV` 设成空串即可(下方条件 spread 会
6625
6626
  * 自动不带这两个 header)。
6626
6627
  */
6627
- // const CLI_PPE_ENV: string = 'ppe_wasm_test'; // PPE 测试环境
6628
- const CLI_PPE_ENV = ''; // 走线上服务(空串 => 下方条件 spread 不注入 PPE header)
6628
+ const CLI_PPE_ENV = 'ppe_role_perm'; // 走权限体系 PPE 环境
6629
+ const NETWORK_PROXY_ERROR_CODE = -1001;
6629
6630
  function getAxiosProxyConfig() {
6630
6631
  const config = getTTMGRC();
6631
6632
  // 优先级: http-proxy > socks-proxy > proxy (老字段兼容)
@@ -6818,21 +6819,31 @@ async function request({ url, method, data, headers, params, logRequestBody = tr
6818
6819
  };
6819
6820
  }
6820
6821
  catch (err) {
6822
+ const axiosError = err;
6823
+ const responseData = axiosError.response?.data;
6824
+ const networkError = responseData
6825
+ ? responseData
6826
+ : {
6827
+ StatusCode: NETWORK_PROXY_ERROR_CODE,
6828
+ StatusMessage: 'Platform API request failed. Check whether the terminal proxy or VPN is applied to ttmg.',
6829
+ NetworkCode: axiosError.code,
6830
+ NetworkMessage: axiosError.message,
6831
+ };
6821
6832
  if (isVerboseEnabled()) {
6822
6833
  printApiResponseLog('API Error', {
6823
- status: err?.response?.status,
6824
- logid: err?.response?.headers['x-tt-logid'],
6825
- data: err?.response?.data,
6834
+ status: axiosError.response?.status,
6835
+ logid: axiosError.response?.headers['x-tt-logid'],
6836
+ data: networkError,
6826
6837
  });
6827
6838
  }
6828
6839
  // @ts-ignore
6829
6840
  return {
6830
6841
  data: null,
6831
6842
  ctx: {
6832
- logid: err.response?.headers['x-tt-logid'],
6833
- httpStatusCode: err.response?.status,
6843
+ logid: axiosError.response?.headers['x-tt-logid'],
6844
+ httpStatusCode: axiosError.response?.status ?? 0,
6834
6845
  },
6835
- error: err.response?.data,
6846
+ error: networkError,
6836
6847
  };
6837
6848
  }
6838
6849
  }
@@ -6995,6 +7006,7 @@ async function fetchGameAssets({ miniGameId, }) {
6995
7006
  });
6996
7007
  }
6997
7008
 
7009
+ const GAME_INFO_NETWORK_ERROR_CODE = -1001;
6998
7010
  async function fetchGameInfo(clientKey) {
6999
7011
  // 访问 V4 接口
7000
7012
  const response = await request({
@@ -7005,10 +7017,14 @@ async function fetchGameInfo(clientKey) {
7005
7017
  },
7006
7018
  });
7007
7019
  if (!response?.data) {
7020
+ const error = response?.error;
7021
+ const hasHttpResponse = Boolean(response?.ctx?.httpStatusCode);
7022
+ const fallbackErrorCode = hasHttpResponse ? -1 : GAME_INFO_NETWORK_ERROR_CODE;
7008
7023
  return {
7009
7024
  error: {
7010
- errorCode: response?.error?.StatusCode,
7011
- errorMsg: response?.error?.StatusMessage,
7025
+ errorCode: error?.StatusCode ?? fallbackErrorCode,
7026
+ errorMsg: error?.StatusMessage ||
7027
+ 'Platform API request failed. Check terminal proxy or VPN configuration.',
7012
7028
  clientKey: clientKey,
7013
7029
  },
7014
7030
  data: null,
@@ -7189,6 +7205,7 @@ const messages = {
7189
7205
  'cli.command.reset.desc': 'Reset local CLI state',
7190
7206
  'cli.command.init.desc': 'Initialize project',
7191
7207
  'cli.command.dev.desc': 'Open browser dev environment',
7208
+ 'cli.command.dev.clientKey': 'Client Key of the Mini Game',
7192
7209
  'cli.command.build.desc': 'Bundle project',
7193
7210
  'cli.command.config.desc': 'Manage configuration',
7194
7211
  'cli.command.config.set.desc': 'Set a configuration value',
@@ -7320,6 +7337,7 @@ const messages = {
7320
7337
  'cli.command.reset.desc': '重置本地 CLI 状态',
7321
7338
  'cli.command.init.desc': '初始化项目',
7322
7339
  'cli.command.dev.desc': '打开浏览器调试环境',
7340
+ 'cli.command.dev.clientKey': '小游戏的 Client Key',
7323
7341
  'cli.command.build.desc': '打包项目',
7324
7342
  'cli.command.config.desc': '管理配置',
7325
7343
  'cli.command.config.set.desc': '设置配置项',
@@ -8873,7 +8891,14 @@ function getLocalIP() {
8873
8891
  return '127.0.0.1';
8874
8892
  }
8875
8893
 
8876
- async function init() {
8894
+ async function init(options = {}) {
8895
+ const providedClientKey = options.clientKey?.trim();
8896
+ if (providedClientKey) {
8897
+ setTTMGRC({
8898
+ clientKey: providedClientKey,
8899
+ });
8900
+ return;
8901
+ }
8877
8902
  const promptModule = inquirer.createPromptModule();
8878
8903
  const { clientKey: lastUsedClientKey } = getTTMGRC() || {};
8879
8904
  if (lastUsedClientKey) {
@@ -9440,6 +9465,76 @@ const gameCheckRoute = {
9440
9465
  };
9441
9466
 
9442
9467
  const changelog = [
9468
+ {
9469
+ title: '0.4.2',
9470
+ target: {
9471
+ iOS: '>=43.1',
9472
+ Android: '>=43.1',
9473
+ },
9474
+ changes: {
9475
+ optimize: [
9476
+ {
9477
+ desc: {
9478
+ 'zh-CN': "优化异常状态提示文案,更准确地引导开发者解决问题",
9479
+ 'en-US': "Optimize exception status prompt text, guide developers to solve problems more accurately",
9480
+ },
9481
+ module: 'new',
9482
+ },
9483
+ ],
9484
+ feature: [
9485
+ {
9486
+ desc: {
9487
+ 'zh-CN': '新增版本信息模块,展示游戏版本信息,包括版本号、发布时间、发布者等',
9488
+ 'en-US': 'Add version information module to display game version information, including version number, release time, release author, etc.',
9489
+ },
9490
+ module: 'detail',
9491
+ },
9492
+ ],
9493
+ },
9494
+ },
9495
+ {
9496
+ title: '0.4.1',
9497
+ target: {
9498
+ iOS: '>=43.1',
9499
+ Android: '>=43.1',
9500
+ },
9501
+ changes: {
9502
+ optimize: [
9503
+ {
9504
+ desc: {
9505
+ 'zh-CN': '优化上传代码包流程:上传后的平台处理提示改为更易理解的文案,不再向开发者暴露平台内部状态码及 asset / ready 等技术字段,进度与失败原因表达更清晰',
9506
+ 'en-US': 'Improve the code package upload flow: post-upload platform status messages are now easier to understand and no longer expose internal status codes or technical fields like asset / ready, making progress and failure reasons clearer.',
9507
+ },
9508
+ module: 'upload',
9509
+ },
9510
+ {
9511
+ desc: {
9512
+ 'zh-CN': '重构上传成功卡片布局:二维码与版本信息分区展示并以分隔线区隔,新增成功状态标识,排版更紧凑协调',
9513
+ 'en-US': 'Rework the upload success card layout: the QR code and version info are separated into clear sections with a divider, a success indicator is added, and the layout is more compact and balanced.',
9514
+ },
9515
+ module: 'upload',
9516
+ },
9517
+ ],
9518
+ },
9519
+ },
9520
+ {
9521
+ title: '0.4.0',
9522
+ target: {
9523
+ iOS: '>=43.1',
9524
+ Android: '>=43.1',
9525
+ },
9526
+ changes: {
9527
+ bugfix: [
9528
+ {
9529
+ desc: {
9530
+ 'zh-CN': '修复游戏无开发权限时提示信息展示异常的问题,引导更准确',
9531
+ 'en-US': 'Fix incorrect prompt messaging when the developer has no permission to develop the game, providing more accurate guidance.',
9532
+ },
9533
+ module: 'detail',
9534
+ },
9535
+ ],
9536
+ },
9537
+ },
9443
9538
  {
9444
9539
  title: '0.3.9',
9445
9540
  target: {
@@ -13206,6 +13301,35 @@ function collectPreloadSubpackages(entry, reported) {
13206
13301
  }
13207
13302
  return { entry, parallelPreloadSubpackages };
13208
13303
  }
13304
+ /**
13305
+ * 重新收集前清除当前入口已写入的预加载配置。
13306
+ *
13307
+ * 与空采集写入不同,这里直接删除 `parallelPreloadSubpackages` 字段,让源码
13308
+ * game.json 回到“未配置”的状态,避免下一轮真机预览仍携带旧启动预加载策略。
13309
+ */
13310
+ function clearPreloadSubpackagesConfig(entry) {
13311
+ const game = readRawGameJson();
13312
+ validateCollect(game, entry, []);
13313
+ let started = false;
13314
+ try {
13315
+ const container = isGameEntry(entry)
13316
+ ? game.json
13317
+ : findSubpackage(game, entry);
13318
+ if (!container) {
13319
+ throw new Error(`入口 ${entry} 不存在`);
13320
+ }
13321
+ started = true;
13322
+ delete container[PRELOAD_FIELD_NAME];
13323
+ writeGameJson(game);
13324
+ }
13325
+ catch (err) {
13326
+ if (started) {
13327
+ restoreGameJson(game);
13328
+ }
13329
+ throw err;
13330
+ }
13331
+ return { entry, parallelPreloadSubpackages: [] };
13332
+ }
13209
13333
 
13210
13334
  /**
13211
13335
  * 读取某个启动入口已有的 parallelPreloadSubpackages(只读),用于 UI 初始化
@@ -13284,6 +13408,31 @@ const gameCollectPreloadSubpackagesRoute = {
13284
13408
  },
13285
13409
  };
13286
13410
 
13411
+ /**
13412
+ * 删除某个启动入口已写入的 parallelPreloadSubpackages,用于重新收集前清理
13413
+ * 旧配置,避免下一轮真机预览仍携带上一轮结果。
13414
+ *
13415
+ * body: `{ entry }`(缺省按主包 `__GAME__` 处理)。
13416
+ */
13417
+ const gameClearPreloadSubpackagesConfigRoute = {
13418
+ method: 'post',
13419
+ path: '/game/clear-preload-subpackages-config',
13420
+ handler: async (req, res) => {
13421
+ const entry = req.body?.entry || GAME_ENTRY;
13422
+ console.log('clear-preload-subpackages-config', { entry });
13423
+ try {
13424
+ const data = clearPreloadSubpackagesConfig(entry);
13425
+ res.send({ code: successCode, data });
13426
+ }
13427
+ catch (err) {
13428
+ res.send({
13429
+ code: errorCode,
13430
+ error: { message: err.message },
13431
+ });
13432
+ }
13433
+ },
13434
+ };
13435
+
13287
13436
  const routes = [
13288
13437
  gameAssetPreviewUrlRoute,
13289
13438
  gameAssetsRoute,
@@ -13320,6 +13469,7 @@ const routes = [
13320
13469
  gamePreloadSubpackagesConfigRoute,
13321
13470
  gamePreloadSubpackageCandidatesRoute,
13322
13471
  gameCollectPreloadSubpackagesRoute,
13472
+ gameClearPreloadSubpackagesConfigRoute,
13323
13473
  ];
13324
13474
  /**
13325
13475
  * Express 4 does not catch rejections from async route handlers — an
@@ -13401,9 +13551,9 @@ async function start() {
13401
13551
  openUrl(url);
13402
13552
  }
13403
13553
 
13404
- async function dev() {
13554
+ async function dev(options = {}) {
13405
13555
  await check();
13406
- await init();
13556
+ await init({ clientKey: options.clientKey });
13407
13557
  await start();
13408
13558
  await compile();
13409
13559
  listen$1();
@@ -13820,7 +13970,7 @@ async function upload({ clientKey, note = '--', dir, }) {
13820
13970
  }
13821
13971
  }
13822
13972
 
13823
- var version = "0.4.1-beta.wasm1";
13973
+ var version = "0.4.1";
13824
13974
  var pkg = {
13825
13975
  version: version};
13826
13976
 
@@ -13907,14 +14057,15 @@ withVerboseOption(program
13907
14057
  withVerboseOption(program
13908
14058
  .option('--h5', t('cli.option.h5'))
13909
14059
  .command('dev')
13910
- .description(t('cli.command.dev.desc')))
13911
- .action(async () => {
14060
+ .description(t('cli.command.dev.desc'))
14061
+ .option('-ck, --client-key <clientKey>', t('cli.command.dev.clientKey')))
14062
+ .action(async (cmd) => {
13912
14063
  const options = program.opts();
13913
14064
  if (options.h5) {
13914
14065
  await dev$1();
13915
14066
  }
13916
14067
  else {
13917
- await dev();
14068
+ await dev({ clientKey: cmd.clientKey });
13918
14069
  }
13919
14070
  checkUpdate();
13920
14071
  });