@sfmc-bds/bds-tools 0.2.0-beta.8 → 0.2.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.
Files changed (114) hide show
  1. package/LICENSE +663 -0
  2. package/README.md +1 -1
  3. package/dist/bds-manager.d.ts +16 -6
  4. package/dist/bds-manager.d.ts.map +1 -1
  5. package/dist/bds-manager.js +59 -66
  6. package/dist/bds-manager.js.map +2 -2
  7. package/dist/changelog.d.ts +11 -7
  8. package/dist/changelog.d.ts.map +1 -1
  9. package/dist/changelog.js +60 -34
  10. package/dist/changelog.js.map +2 -2
  11. package/dist/check-update.d.ts.map +1 -1
  12. package/dist/check-update.js +59 -23
  13. package/dist/check-update.js.map +2 -2
  14. package/dist/cli-pack-manager.js +11 -1
  15. package/dist/cli-pack-manager.js.map +2 -2
  16. package/dist/dependency-negotiator.d.ts +73 -0
  17. package/dist/dependency-negotiator.d.ts.map +1 -0
  18. package/dist/dependency-negotiator.js +151 -0
  19. package/dist/dependency-negotiator.js.map +7 -0
  20. package/dist/fsx.d.ts +17 -14
  21. package/dist/fsx.d.ts.map +1 -1
  22. package/dist/fsx.js +67 -19
  23. package/dist/fsx.js.map +2 -2
  24. package/dist/host-platform.d.ts +25 -0
  25. package/dist/host-platform.d.ts.map +1 -0
  26. package/dist/host-platform.js +50 -0
  27. package/dist/host-platform.js.map +7 -0
  28. package/dist/http.d.ts +49 -11
  29. package/dist/http.d.ts.map +1 -1
  30. package/dist/http.js.map +2 -2
  31. package/dist/level-dat.d.ts +105 -0
  32. package/dist/level-dat.d.ts.map +1 -0
  33. package/dist/level-dat.js +490 -0
  34. package/dist/level-dat.js.map +7 -0
  35. package/dist/pack-manager.d.ts +41 -34
  36. package/dist/pack-manager.d.ts.map +1 -1
  37. package/dist/pack-manager.js +79 -25
  38. package/dist/pack-manager.js.map +2 -2
  39. package/dist/pack-update/bindings.d.ts +16 -0
  40. package/dist/pack-update/bindings.d.ts.map +1 -0
  41. package/dist/pack-update/bindings.js +69 -0
  42. package/dist/pack-update/bindings.js.map +7 -0
  43. package/dist/pack-update/config.d.ts +16 -0
  44. package/dist/pack-update/config.d.ts.map +1 -0
  45. package/dist/pack-update/config.js +146 -0
  46. package/dist/pack-update/config.js.map +7 -0
  47. package/dist/pack-update/deps.d.ts +28 -0
  48. package/dist/pack-update/deps.d.ts.map +1 -0
  49. package/dist/pack-update/deps.js +20 -0
  50. package/dist/pack-update/deps.js.map +7 -0
  51. package/dist/pack-update/index.d.ts +55 -0
  52. package/dist/pack-update/index.d.ts.map +1 -0
  53. package/dist/pack-update/index.js +72 -0
  54. package/dist/pack-update/index.js.map +7 -0
  55. package/dist/pack-update/providers/curseforge.d.ts +23 -0
  56. package/dist/pack-update/providers/curseforge.d.ts.map +1 -0
  57. package/dist/pack-update/providers/curseforge.js +229 -0
  58. package/dist/pack-update/providers/curseforge.js.map +7 -0
  59. package/dist/pack-update/providers/index.d.ts +16 -0
  60. package/dist/pack-update/providers/index.d.ts.map +1 -0
  61. package/dist/pack-update/providers/index.js +37 -0
  62. package/dist/pack-update/providers/index.js.map +7 -0
  63. package/dist/pack-update/service.d.ts +28 -0
  64. package/dist/pack-update/service.d.ts.map +1 -0
  65. package/dist/pack-update/service.js +570 -0
  66. package/dist/pack-update/service.js.map +7 -0
  67. package/dist/pack-update/types.d.ts +126 -0
  68. package/dist/pack-update/types.d.ts.map +1 -0
  69. package/dist/pack-update/types.js +8 -0
  70. package/dist/pack-update/types.js.map +7 -0
  71. package/dist/pack-update/version-policy.d.ts +81 -0
  72. package/dist/pack-update/version-policy.d.ts.map +1 -0
  73. package/dist/pack-update/version-policy.js +210 -0
  74. package/dist/pack-update/version-policy.js.map +7 -0
  75. package/dist/paths.d.ts +1 -1
  76. package/dist/paths.d.ts.map +1 -1
  77. package/dist/paths.js +3 -5
  78. package/dist/paths.js.map +2 -2
  79. package/dist/process-probe.d.ts +34 -0
  80. package/dist/process-probe.d.ts.map +1 -0
  81. package/dist/process-probe.js +152 -0
  82. package/dist/process-probe.js.map +7 -0
  83. package/dist/qq-events-notify.d.ts +16 -0
  84. package/dist/qq-events-notify.d.ts.map +1 -0
  85. package/dist/qq-events-notify.js +70 -0
  86. package/dist/qq-events-notify.js.map +7 -0
  87. package/dist/qqutil.d.ts +10 -5
  88. package/dist/qqutil.d.ts.map +1 -1
  89. package/dist/qqutil.js +53 -10
  90. package/dist/qqutil.js.map +2 -2
  91. package/dist/rollback.d.ts.map +1 -1
  92. package/dist/rollback.js +2 -2
  93. package/dist/rollback.js.map +2 -2
  94. package/dist/server-properties-i18n.d.ts +17 -0
  95. package/dist/server-properties-i18n.d.ts.map +1 -0
  96. package/dist/server-properties-i18n.js +201 -0
  97. package/dist/server-properties-i18n.js.map +7 -0
  98. package/dist/server-properties.d.ts +25 -0
  99. package/dist/server-properties.d.ts.map +1 -1
  100. package/dist/server-properties.js +141 -1
  101. package/dist/server-properties.js.map +2 -2
  102. package/dist/types.d.ts +1 -0
  103. package/dist/types.d.ts.map +1 -1
  104. package/dist/upstream.d.ts +18 -9
  105. package/dist/upstream.d.ts.map +1 -1
  106. package/dist/upstream.js +8 -7
  107. package/dist/upstream.js.map +2 -2
  108. package/dist/version.js +2 -2
  109. package/dist/version.js.map +2 -2
  110. package/dist/world-packs.d.ts +108 -8
  111. package/dist/world-packs.d.ts.map +1 -1
  112. package/dist/world-packs.js +245 -12
  113. package/dist/world-packs.js.map +3 -3
  114. package/package.json +24 -17
@@ -0,0 +1,201 @@
1
+ const SERVER_PROPERTIES_DOCS_ZH_CN = {
2
+ "transport": {
3
+ desc: "\u73A9\u5BB6\u4E0E\u670D\u52A1\u5668\u8FDE\u63A5\u6240\u7528\u7684\u7F51\u7EDC\u4F20\u8F93\u65B9\u5F0F",
4
+ values: "nethernet\uFF08\u5F53\u524D BDS \u7248\u672C\u652F\u6301\u7684\u4F20\u8F93\u65B9\u5F0F\uFF09"
5
+ },
6
+ "server-name": {
7
+ desc: "\u670D\u52A1\u5668\u540D\u79F0\uFF08\u663E\u793A\u5728\u5BA2\u6237\u7AEF\u5C40\u57DF\u7F51/\u597D\u53CB\u5217\u8868\u4E2D\uFF09",
8
+ values: "\u4EFB\u610F\u5B57\u7B26\u4E32\uFF08\u8BF7\u52FF\u5305\u542B\u5206\u53F7 ;\uFF09"
9
+ },
10
+ "gamemode": {
11
+ desc: "\u65B0\u73A9\u5BB6\u9996\u6B21\u52A0\u5165\u4E16\u754C\u65F6\u7684\u9ED8\u8BA4\u6E38\u620F\u6A21\u5F0F",
12
+ values: "survival (\u751F\u5B58) | creative (\u521B\u9020) | adventure (\u5192\u9669)"
13
+ },
14
+ "force-gamemode": {
15
+ desc: "\u662F\u5426\u5F3A\u5236\u73A9\u5BB6\u6BCF\u6B21\u91CD\u65B0\u8FDE\u63A5\u65F6\u90FD\u91CD\u7F6E\u4E3A\u9ED8\u8BA4\u6E38\u620F\u6A21\u5F0F",
16
+ values: "true (\u6BCF\u6B21\u8FDB\u670D\u5F3A\u5236\u8F6C\u4E3A\u9ED8\u8BA4\u6A21\u5F0F) | false (\u4FDD\u7559\u73A9\u5BB6\u4E0A\u6B21\u79BB\u7EBF\u65F6\u7684\u6A21\u5F0F)"
17
+ },
18
+ "difficulty": {
19
+ desc: "\u6E38\u620F\u4E16\u754C\u7684\u9ED8\u8BA4\u96BE\u5EA6",
20
+ values: "peaceful (\u548C\u5E73) | easy (\u7B80\u5355) | normal (\u666E\u901A) | hard (\u56F0\u96BE)"
21
+ },
22
+ "allow-cheats": {
23
+ desc: "\u662F\u5426\u5141\u8BB8\u5728\u63A7\u5236\u53F0\u6216\u6E38\u620F\u5185\u4F7F\u7528\u7BA1\u7406\u5458\u6307\u4EE4\uFF08\u4F5C\u5F0A\u6A21\u5F0F\uFF09",
24
+ values: "true | false",
25
+ tip: "\u82E5\u5F00\u542F\u6B64\u9879\uFF0C\u52A0\u5165\u8BE5\u4E16\u754C\u7684\u73A9\u5BB6\u5C06\u65E0\u6CD5\u83B7\u5F97 Xbox \u6210\u5C31"
26
+ },
27
+ "max-players": {
28
+ desc: "\u5141\u8BB8\u540C\u65F6\u5728\u7EBF\u7684\u6700\u5927\u73A9\u5BB6\u6570\u91CF\u9650\u5236",
29
+ values: "\u6B63\u6574\u6570\uFF08\u5982 10\u300120\uFF09"
30
+ },
31
+ "online-mode": {
32
+ desc: "\u662F\u5426\u5F00\u542F\u5FAE\u8F6F Xbox Live \u6B63\u7248\u8EAB\u4EFD\u9A8C\u8BC1",
33
+ values: "true (\u4EC5\u5141\u8BB8\u6B63\u7248\u5FAE\u8F6F\u8D26\u53F7\u767B\u5F55) | false (\u5141\u8BB8\u79BB\u7EBF\u514D\u767B\u5F55\u8FDE\u63A5\uFF0C\u4F46\u6613\u53D7\u5047\u4EBA\u653B\u51FB)",
34
+ tip: "\u516C\u7F51\u670D\u52A1\u5668\u5F3A\u70C8\u5EFA\u8BAE\u8BBE\u4E3A true \u4EE5\u9632\u6B62\u6076\u610F\u4F2A\u9020\u8EAB\u4EFD"
35
+ },
36
+ "white-list": {
37
+ desc: "\u662F\u5426\u5F00\u542F\u51C6\u5165\u767D\u540D\u5355\u9A8C\u8BC1\uFF08\u90E8\u5206\u7248\u672C\u5BF9\u5E94 allow-list\uFF09",
38
+ values: "true (\u4EC5\u5141\u8BB8\u767D\u540D\u5355\u4E2D\u7684\u73A9\u5BB6\u8FDB\u5165) | false (\u6240\u6709\u73A9\u5BB6\u5747\u53EF\u8FDB\u5165)"
39
+ },
40
+ "allow-list": {
41
+ desc: "\u662F\u5426\u5F00\u542F\u51C6\u5165\u767D\u540D\u5355\u9A8C\u8BC1\uFF08\u9700\u914D\u5408 allowlist.json \u4F7F\u7528\uFF09",
42
+ values: "true (\u4EC5\u5141\u8BB8\u767D\u540D\u5355\u4E2D\u7684\u73A9\u5BB6\u8FDB\u5165) | false (\u6240\u6709\u73A9\u5BB6\u5747\u53EF\u8FDB\u5165)"
43
+ },
44
+ "server-port": {
45
+ desc: "\u670D\u52A1\u7AEF\u76D1\u542C\u7684 IPv4 UDP \u7F51\u7EDC\u901A\u4FE1\u7AEF\u53E3",
46
+ values: "1 ~ 65535\uFF08\u9ED8\u8BA4\uFF1A19132\uFF09"
47
+ },
48
+ "server-portv6": {
49
+ desc: "\u670D\u52A1\u7AEF\u76D1\u542C\u7684 IPv6 UDP \u7F51\u7EDC\u901A\u4FE1\u7AEF\u53E3",
50
+ values: "1 ~ 65535\uFF08\u9ED8\u8BA4\uFF1A19133\uFF09"
51
+ },
52
+ "enable-lan-visibility": {
53
+ desc: "\u662F\u5426\u5411\u5C40\u57DF\u7F51\u5E7F\u64AD\u672C\u670D\u52A1\u5668\uFF08\u4F7F\u540C\u5C40\u57DF\u7F51\u73A9\u5BB6\u80FD\u5728\u5BA2\u6237\u7AEF\u300C\u597D\u53CB\u300D\u5217\u8868\u4E2D\u76F4\u63A5\u53D1\u73B0\uFF09",
54
+ values: "true | false"
55
+ },
56
+ "view-distance": {
57
+ desc: "\u670D\u52A1\u7AEF\u5411\u5BA2\u6237\u7AEF\u53D1\u9001\u5730\u56FE\u533A\u5757\u7684\u6700\u5927\u89C6\u8DDD\uFF08\u5355\u4F4D\uFF1A\u533A\u5757\uFF09",
58
+ values: "\u6B63\u6574\u6570\uFF08\u5EFA\u8BAE 12 ~ 32\uFF0C\u6570\u503C\u8D8A\u5927\u7F51\u7EDC\u4E0E\u5185\u5B58\u6D88\u8017\u8D8A\u9AD8\uFF09"
59
+ },
60
+ "tick-distance": {
61
+ desc: "\u4E16\u754C\u5B9E\u4F53\u903B\u8F91\u4E0E\u65B9\u5757\u66F4\u65B0\u7684\u6A21\u62DF\u8BA1\u7B97\u8DDD\u79BB\uFF08\u5355\u4F4D\uFF1A\u533A\u5757\uFF09",
62
+ values: "4 ~ 12\uFF08\u6570\u503C\u8D8A\u5C0F\u670D\u52A1\u5668\u6027\u80FD\u8D8A\u597D\uFF0C\u4F4E\u914D\u673A\u578B\u63A8\u8350 4\uFF09"
63
+ },
64
+ "player-idle-timeout": {
65
+ desc: "\u73A9\u5BB6\u6302\u673A\u65E0\u64CD\u4F5C\u81EA\u52A8\u8E22\u51FA\u8D85\u65F6\u65F6\u95F4\uFF08\u5355\u4F4D\uFF1A\u5206\u949F\uFF09",
66
+ values: "0 (\u6C38\u4E0D\u8E22\u51FA) \u6216\u5927\u4E8E 0 \u7684\u6574\u6570"
67
+ },
68
+ "max-threads": {
69
+ desc: "BDS \u8FD0\u884C\u53EF\u4F7F\u7528\u7684\u6700\u5927\u5DE5\u4F5C\u7EBF\u7A0B\u6570",
70
+ values: "0 (\u7531\u670D\u52A1\u7AEF\u6839\u636E CPU \u6838\u5FC3\u6570\u81EA\u52A8\u5206\u914D) \u6216\u6307\u5B9A\u7EBF\u7A0B\u6570"
71
+ },
72
+ "level-name": {
73
+ desc: "\u8981\u52A0\u8F7D\u7684\u4E16\u754C\u5B58\u6863\u6587\u4EF6\u5939\u540D\u79F0\uFF08\u5BF9\u5E94 worlds/ \u76EE\u5F55\u4E0B\u7684\u5B50\u6587\u4EF6\u5939\uFF09",
74
+ values: "\u6587\u4EF6\u5939\u540D\u79F0\uFF08\u9ED8\u8BA4\uFF1ABedrock level\uFF09"
75
+ },
76
+ "level-seed": {
77
+ desc: "\u5168\u65B0\u4E16\u754C\u751F\u6210\u65F6\u7684\u968F\u673A\u79CD\u5B50",
78
+ values: "\u4EFB\u610F\u6570\u5B57\u6216\u6587\u672C\uFF08\u7559\u7A7A\u5219\u6BCF\u6B21\u65B0\u5EFA\u4E16\u754C\u968F\u673A\u751F\u6210\uFF09"
79
+ },
80
+ "default-player-permission-level": {
81
+ desc: "\u65B0\u73A9\u5BB6\u9996\u6B21\u52A0\u5165\u65F6\u7684\u9ED8\u8BA4\u6743\u9650\u7EA7\u522B",
82
+ values: "visitor (\u8BBF\u5BA2\uFF0C\u4E0D\u53EF\u7834\u574F\u6216\u4EA4\u4E92) | member (\u666E\u901A\u6210\u5458) | operator (\u64CD\u4F5C\u5458)"
83
+ },
84
+ "texturepack-required": {
85
+ desc: "\u662F\u5426\u5F3A\u5236\u73A9\u5BB6\u4E0B\u8F7D\u670D\u52A1\u5668\u6307\u5B9A\u7684\u6750\u8D28\u8D44\u6E90\u5305\u540E\u624D\u80FD\u52A0\u5165",
86
+ values: "true (\u5FC5\u987B\u4E0B\u8F7D) | false (\u53EF\u9009\u4E0B\u8F7D)"
87
+ },
88
+ "content-log-console-output-enabled": {
89
+ desc: "\u662F\u5426\u5C06\u5185\u5BB9\u65E5\u5FD7\uFF08\u6A21\u7EC4/\u884C\u4E3A\u5305\u89E3\u6790\u8B66\u544A\u3001SAPI \u811A\u672C\u62A5\u9519\u4E0E console.log\uFF09\u5B9E\u65F6\u8F93\u51FA\u5230\u63A7\u5236\u53F0",
90
+ values: "true | false",
91
+ tip: "\u5F00\u53D1\u6216\u8C03\u8BD5\u6A21\u7EC4\u65F6\u5F3A\u70C8\u5EFA\u8BAE\u8BBE\u4E3A true\uFF0C\u4EE5\u4FBF\u5373\u65F6\u67E5\u770B\u9519\u8BEF"
92
+ },
93
+ "compression-threshold": {
94
+ desc: "\u7F51\u7EDC\u6570\u636E\u5305\u542F\u7528\u538B\u7F29\u7684\u6700\u5C0F\u5B57\u8282\u9608\u503C",
95
+ values: "0 (\u5168\u90E8\u538B\u7F29) ~ 65535 \u5B57\u8282\uFF081.20+ \u9ED8\u8BA4\u901A\u5E38\u4E3A 1\uFF09"
96
+ },
97
+ "compression-algorithm": {
98
+ desc: "\u7F51\u7EDC\u4F20\u8F93\u6570\u636E\u5305\u7684\u538B\u7F29\u7B97\u6CD5",
99
+ values: "zlib (\u6807\u51C6\u9AD8\u538B\u7F29\u6BD4) | snappy (\u9AD8\u6027\u80FD\u4F4E\u5EF6\u8FDF\uFF0CCPU \u5F00\u9500\u5C0F)"
100
+ },
101
+ "server-authoritative-movement": {
102
+ desc: "\u73A9\u5BB6\u79FB\u52A8\u9A8C\u8BC1\u6743\u5A01\u6A21\u5F0F",
103
+ values: "server-auth (\u670D\u52A1\u7AEF\u6743\u5A01\u5224\u5B9A) | client-auth (\u5BA2\u6237\u7AEF\u6743\u5A01)"
104
+ },
105
+ "player-movement-score-threshold": {
106
+ desc: "\u73A9\u5BB6\u79FB\u52A8\u5F02\u5E38\u88AB\u5224\u5B9A\u4E3A\u4F5C\u5F0A\u7684\u7D2F\u8BA1\u5F02\u5E38\u5206\u9608\u503C",
107
+ values: "\u6574\u6570\uFF08\u9ED8\u8BA4 20\uFF09"
108
+ },
109
+ "player-movement-action-direction-threshold": {
110
+ desc: "\u73A9\u5BB6\u653B\u51FB\u6216\u7834\u574F\u52A8\u4F5C\u4E0E\u89C6\u7EBF\u671D\u5411\u5939\u89D2\u504F\u5DEE\u7684\u5224\u5B9A\u9608\u503C",
111
+ values: "\u6D6E\u70B9\u6570\uFF08\u9ED8\u8BA4 0.85\uFF09"
112
+ },
113
+ "player-movement-distance-threshold": {
114
+ desc: "\u73A9\u5BB6\u5355\u6B21\u4F4D\u79FB\u8D85\u51FA\u6B63\u5E38\u8303\u56F4\u7684\u5224\u5B9A\u9608\u503C",
115
+ values: "\u6D6E\u70B9\u6570\uFF08\u9ED8\u8BA4 0.3\uFF09"
116
+ },
117
+ "player-movement-duration-threshold-in-ms": {
118
+ desc: "\u79FB\u52A8\u5F02\u5E38\u5224\u5B9A\u91C7\u6837\u7684\u6ED1\u52A8\u65F6\u95F4\u7A97\u53E3\uFF08\u5355\u4F4D\uFF1A\u6BEB\u79D2\uFF09",
119
+ values: "\u6574\u6570\uFF08\u9ED8\u8BA4 500\uFF09"
120
+ },
121
+ "correct-player-movement": {
122
+ desc: "\u5F53\u68C0\u6D4B\u5230\u73A9\u5BB6\u79FB\u52A8\u4F5C\u5F0A\u6216\u8D85\u6807\u65F6\uFF0C\u662F\u5426\u5F3A\u5236\u5C06\u5176\u62C9\u56DE\u5408\u6CD5\u4F4D\u7F6E\uFF08\u9632\u98DE\u5929/\u52A0\u901F\uFF09",
123
+ values: "true (\u5F3A\u5236\u56DE\u62C9\u7EA0\u6B63) | false (\u4EC5\u5728\u540E\u53F0\u8BB0\u5F55\u8B66\u544A)"
124
+ },
125
+ "server-authoritative-block-breaking": {
126
+ desc: "\u65B9\u5757\u7834\u574F\u52A8\u4F5C\u662F\u5426\u7531\u670D\u52A1\u7AEF\u6743\u5A01\u5224\u5B9A\uFF08\u9632\u6B62\u53D8\u901F\u5237\u65B9\u5757\u7B49\u4F5C\u5F0A\u884C\u4E3A\uFF09",
127
+ values: "client-auth | server-auth"
128
+ },
129
+ "chat-restriction": {
130
+ desc: "\u804A\u5929\u8FC7\u6EE4\u9650\u5236\u7B56\u7565",
131
+ values: "None (\u65E0\u9650\u5236) | Dropped (\u9759\u9ED8\u4E22\u5F03\u8FDD\u89C4\u5185\u5BB9) | Disabled (\u5B8C\u5168\u7981\u7528\u804A\u5929)"
132
+ },
133
+ "disable-player-interaction": {
134
+ desc: "\u662F\u5426\u7981\u7528\u9759\u9ED8\u4EA4\u4E92\u68C0\u6D4B\uFF08\u7528\u4E8E\u6392\u67E5\u7F51\u7EDC\u5EF6\u8FDF\u6216\u9632\u5FEB\u901F\u4EA4\u4E92\uFF09",
135
+ values: "true | false"
136
+ },
137
+ "client-side-chunk-generation-enabled": {
138
+ desc: "\u662F\u5426\u5141\u8BB8\u5BA2\u6237\u7AEF\u5728\u672C\u5730\u751F\u6210\u5C1A\u672A\u52A0\u8F7D\u7684\u5730\u5F62\u533A\u5757\uFF08\u52A0\u5FEB\u957F\u8DDD\u79BB\u63A2\u7D22\u65F6\u7684\u89C6\u89C9\u52A0\u8F7D\u901F\u5EA6\uFF09",
139
+ values: "true (\u5141\u8BB8\u5BA2\u6237\u7AEF\u672C\u5730\u9884\u751F\u6210) | false (\u5168\u90E8\u7531\u670D\u52A1\u7AEF\u751F\u6210\u5E76\u4F20\u8F93)"
140
+ },
141
+ "block-network-ids-are-hashes": {
142
+ desc: "\u65B9\u5757\u5728\u7F51\u7EDC\u4F20\u8F93\u4E2D\u7684\u552F\u4E00\u6807\u8BC6\u662F\u5426\u91C7\u7528\u54C8\u5E0C\u503C",
143
+ values: "true | false"
144
+ },
145
+ "disable-persona": {
146
+ desc: "\u662F\u5426\u7981\u7528\u4E2A\u6027\u5316\u88C5\u626E/\u89D2\u8272\u521B\u5EFA\u5668\uFF08Persona \u76AE\u80A4\uFF09",
147
+ values: "true (\u5F3A\u5236\u4F7F\u7528\u7ECF\u5178\u76AE\u80A4) | false (\u5141\u8BB8\u4F7F\u7528\u5B98\u65B9\u634F\u8138\u89D2\u8272)"
148
+ },
149
+ "disable-custom-skins": {
150
+ desc: "\u662F\u5426\u7981\u7528\u73A9\u5BB6\u4E0A\u4F20\u7684\u81EA\u5B9A\u4E49\u7ECF\u5178\u76AE\u80A4\uFF08\u9632\u6B62\u6076\u610F\u6216\u900F\u660E\u76AE\u80A4\uFF09",
151
+ values: "true (\u7981\u7528\u81EA\u5B9A\u4E49\u76AE\u80A4) | false (\u5141\u8BB8\u81EA\u5B9A\u4E49\u76AE\u80A4)"
152
+ },
153
+ "emit-server-telemetry": {
154
+ desc: "\u662F\u5426\u5411 Mojang \u53D1\u9001\u670D\u52A1\u5668\u9065\u6D4B\u4E0E\u8FD0\u884C\u5065\u5EB7\u8BCA\u65AD\u6570\u636E",
155
+ values: "true | false",
156
+ tip: "\u4F7F\u7528\u672C\u5E73\u53F0\u65F6\u56E0\u60A8\u5DF2\u540C\u610F Mojang EULA \u534F\u8BAE\uFF0C\u6309\u534F\u8BAE\u4FDD\u6301\u542F\u7528"
157
+ },
158
+ "server-build-radius-ratio": {
159
+ desc: "\u5141\u8BB8\u73A9\u5BB6\u5EFA\u9020\u548C\u4EA4\u4E92\u7684\u4E16\u754C\u533A\u57DF\u534A\u5F84\u6BD4\u4F8B",
160
+ values: "Disabled (\u65E0\u9650\u5236) \u6216 0.0 ~ 1.0 \u7684\u6D6E\u70B9\u6570"
161
+ },
162
+ "allow-outbound-script-debugging": {
163
+ desc: "\u662F\u5426\u5141\u8BB8\u670D\u52A1\u7AEF\u811A\u672C\u4E3B\u52A8\u8FDE\u63A5\u5916\u90E8\u8C03\u8BD5\u5668\uFF08\u5141\u8BB8 /script debugger connect \u6307\u4EE4\uFF09",
164
+ values: "true | false",
165
+ tip: "\u4EC5\u5728\u901A\u8FC7 VS Code \u8C03\u8BD5 SAPI \u6A21\u7EC4\u65F6\u5F00\u542F\uFF0C\u751F\u4EA7\u73AF\u5883\u5EFA\u8BAE\u5173\u95ED"
166
+ },
167
+ "allow-inbound-script-debugging": {
168
+ desc: "\u662F\u5426\u5141\u8BB8\u5916\u90E8\u811A\u672C\u8C03\u8BD5\u5668\u4E3B\u52A8\u8FDE\u63A5\u670D\u52A1\u7AEF\uFF08\u5141\u8BB8 /script debugger listen \u6307\u4EE4\uFF09",
169
+ values: "true | false",
170
+ tip: "\u4EC5\u5728\u901A\u8FC7 VS Code \u8C03\u8BD5 SAPI \u6A21\u7EC4\u65F6\u5F00\u542F\uFF0C\u751F\u4EA7\u73AF\u5883\u5EFA\u8BAE\u5173\u95ED"
171
+ },
172
+ "force-inbound-debug-port": {
173
+ desc: "\u811A\u672C\u8C03\u8BD5\u5668\u76D1\u542C\u7684\u4E13\u5C5E\u7F51\u7EDC\u7AEF\u53E3",
174
+ values: "1 ~ 65535\uFF08\u9ED8\u8BA4\uFF1A19144\uFF09"
175
+ },
176
+ "script-debugger-auto-attach": {
177
+ desc: "\u4E16\u754C\u52A0\u8F7D\u65F6\uFF0C\u662F\u5426\u81EA\u52A8\u8FDE\u63A5\u6216\u76D1\u542C\u5916\u90E8\u811A\u672C\u8C03\u8BD5\u5668",
178
+ values: "disabled (\u4E0D\u81EA\u52A8\u9644\u52A0) | connect (\u81EA\u52A8\u5411\u5916\u8FDE\u63A5) | listen (\u81EA\u52A8\u5F00\u542F\u7AEF\u53E3\u76D1\u542C)"
179
+ },
180
+ "script-debugger-auto-attach-connect-address": {
181
+ desc: "\u5F53 auto-attach \u8BBE\u4E3A connect \u65F6\uFF0C\u5C1D\u8BD5\u8FDE\u63A5\u7684\u76EE\u6807\u8C03\u8BD5\u5668\u4E3B\u673A\u4E0E\u7AEF\u53E3",
182
+ values: "ip:port\uFF08\u4F8B\u5982 localhost:19144\uFF09"
183
+ },
184
+ "websocket-retry-time": {
185
+ desc: "\u8FDE\u63A5\u5916\u90E8 WebSocket \u670D\u52A1\u5668\u65AD\u5F00\u540E\u7684\u81EA\u52A8\u91CD\u8BD5\u95F4\u9694\uFF08\u5355\u4F4D\uFF1A\u79D2\uFF09",
186
+ values: "\u6B63\u6574\u6570\uFF08\u9ED8\u8BA4 20\uFF09"
187
+ }
188
+ };
189
+ function getServerPropertyDoc(key, locale = "zh-CN") {
190
+ const normalizedKey = key.trim().toLowerCase();
191
+ const normalizedLocale = locale.toLowerCase();
192
+ if (normalizedLocale === "zh" || normalizedLocale.startsWith("zh-")) {
193
+ return SERVER_PROPERTIES_DOCS_ZH_CN[normalizedKey];
194
+ }
195
+ return void 0;
196
+ }
197
+ export {
198
+ SERVER_PROPERTIES_DOCS_ZH_CN,
199
+ getServerPropertyDoc
200
+ };
201
+ //# sourceMappingURL=server-properties-i18n.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/server-properties-i18n.ts"],
4
+ "sourcesContent": ["/**\n * server-properties-i18n.ts \u2014 BDS server.properties \u591A\u8BED\u8A00\u6CE8\u91CA\u5B57\u5178\n */\n\nexport interface ServerPropertyDoc {\n /** \u4E2D\u6587\u529F\u80FD\u6982\u8FF0 */\n desc: string;\n /** \u5408\u6CD5\u53D6\u503C\u4E0E\u679A\u4E3E\u8BF4\u660E */\n values?: string;\n /** \u907F\u5751\u3001\u6027\u80FD\u6216\u5B89\u5168\u6027\u63D0\u793A */\n tip?: string;\n}\n\nexport const SERVER_PROPERTIES_DOCS_ZH_CN: Record<string, ServerPropertyDoc> = {\n \"transport\": {\n desc: \"\u73A9\u5BB6\u4E0E\u670D\u52A1\u5668\u8FDE\u63A5\u6240\u7528\u7684\u7F51\u7EDC\u4F20\u8F93\u65B9\u5F0F\",\n values: \"nethernet\uFF08\u5F53\u524D BDS \u7248\u672C\u652F\u6301\u7684\u4F20\u8F93\u65B9\u5F0F\uFF09\",\n },\n \"server-name\": {\n desc: \"\u670D\u52A1\u5668\u540D\u79F0\uFF08\u663E\u793A\u5728\u5BA2\u6237\u7AEF\u5C40\u57DF\u7F51/\u597D\u53CB\u5217\u8868\u4E2D\uFF09\",\n values: \"\u4EFB\u610F\u5B57\u7B26\u4E32\uFF08\u8BF7\u52FF\u5305\u542B\u5206\u53F7 ;\uFF09\",\n },\n \"gamemode\": {\n desc: \"\u65B0\u73A9\u5BB6\u9996\u6B21\u52A0\u5165\u4E16\u754C\u65F6\u7684\u9ED8\u8BA4\u6E38\u620F\u6A21\u5F0F\",\n values: \"survival (\u751F\u5B58) | creative (\u521B\u9020) | adventure (\u5192\u9669)\",\n },\n \"force-gamemode\": {\n desc: \"\u662F\u5426\u5F3A\u5236\u73A9\u5BB6\u6BCF\u6B21\u91CD\u65B0\u8FDE\u63A5\u65F6\u90FD\u91CD\u7F6E\u4E3A\u9ED8\u8BA4\u6E38\u620F\u6A21\u5F0F\",\n values: \"true (\u6BCF\u6B21\u8FDB\u670D\u5F3A\u5236\u8F6C\u4E3A\u9ED8\u8BA4\u6A21\u5F0F) | false (\u4FDD\u7559\u73A9\u5BB6\u4E0A\u6B21\u79BB\u7EBF\u65F6\u7684\u6A21\u5F0F)\",\n },\n \"difficulty\": {\n desc: \"\u6E38\u620F\u4E16\u754C\u7684\u9ED8\u8BA4\u96BE\u5EA6\",\n values: \"peaceful (\u548C\u5E73) | easy (\u7B80\u5355) | normal (\u666E\u901A) | hard (\u56F0\u96BE)\",\n },\n \"allow-cheats\": {\n desc: \"\u662F\u5426\u5141\u8BB8\u5728\u63A7\u5236\u53F0\u6216\u6E38\u620F\u5185\u4F7F\u7528\u7BA1\u7406\u5458\u6307\u4EE4\uFF08\u4F5C\u5F0A\u6A21\u5F0F\uFF09\",\n values: \"true | false\",\n tip: \"\u82E5\u5F00\u542F\u6B64\u9879\uFF0C\u52A0\u5165\u8BE5\u4E16\u754C\u7684\u73A9\u5BB6\u5C06\u65E0\u6CD5\u83B7\u5F97 Xbox \u6210\u5C31\",\n },\n \"max-players\": {\n desc: \"\u5141\u8BB8\u540C\u65F6\u5728\u7EBF\u7684\u6700\u5927\u73A9\u5BB6\u6570\u91CF\u9650\u5236\",\n values: \"\u6B63\u6574\u6570\uFF08\u5982 10\u300120\uFF09\",\n },\n \"online-mode\": {\n desc: \"\u662F\u5426\u5F00\u542F\u5FAE\u8F6F Xbox Live \u6B63\u7248\u8EAB\u4EFD\u9A8C\u8BC1\",\n values: \"true (\u4EC5\u5141\u8BB8\u6B63\u7248\u5FAE\u8F6F\u8D26\u53F7\u767B\u5F55) | false (\u5141\u8BB8\u79BB\u7EBF\u514D\u767B\u5F55\u8FDE\u63A5\uFF0C\u4F46\u6613\u53D7\u5047\u4EBA\u653B\u51FB)\",\n tip: \"\u516C\u7F51\u670D\u52A1\u5668\u5F3A\u70C8\u5EFA\u8BAE\u8BBE\u4E3A true \u4EE5\u9632\u6B62\u6076\u610F\u4F2A\u9020\u8EAB\u4EFD\",\n },\n \"white-list\": {\n desc: \"\u662F\u5426\u5F00\u542F\u51C6\u5165\u767D\u540D\u5355\u9A8C\u8BC1\uFF08\u90E8\u5206\u7248\u672C\u5BF9\u5E94 allow-list\uFF09\",\n values: \"true (\u4EC5\u5141\u8BB8\u767D\u540D\u5355\u4E2D\u7684\u73A9\u5BB6\u8FDB\u5165) | false (\u6240\u6709\u73A9\u5BB6\u5747\u53EF\u8FDB\u5165)\",\n },\n \"allow-list\": {\n desc: \"\u662F\u5426\u5F00\u542F\u51C6\u5165\u767D\u540D\u5355\u9A8C\u8BC1\uFF08\u9700\u914D\u5408 allowlist.json \u4F7F\u7528\uFF09\",\n values: \"true (\u4EC5\u5141\u8BB8\u767D\u540D\u5355\u4E2D\u7684\u73A9\u5BB6\u8FDB\u5165) | false (\u6240\u6709\u73A9\u5BB6\u5747\u53EF\u8FDB\u5165)\",\n },\n \"server-port\": {\n desc: \"\u670D\u52A1\u7AEF\u76D1\u542C\u7684 IPv4 UDP \u7F51\u7EDC\u901A\u4FE1\u7AEF\u53E3\",\n values: \"1 ~ 65535\uFF08\u9ED8\u8BA4\uFF1A19132\uFF09\",\n },\n \"server-portv6\": {\n desc: \"\u670D\u52A1\u7AEF\u76D1\u542C\u7684 IPv6 UDP \u7F51\u7EDC\u901A\u4FE1\u7AEF\u53E3\",\n values: \"1 ~ 65535\uFF08\u9ED8\u8BA4\uFF1A19133\uFF09\",\n },\n \"enable-lan-visibility\": {\n desc: \"\u662F\u5426\u5411\u5C40\u57DF\u7F51\u5E7F\u64AD\u672C\u670D\u52A1\u5668\uFF08\u4F7F\u540C\u5C40\u57DF\u7F51\u73A9\u5BB6\u80FD\u5728\u5BA2\u6237\u7AEF\u300C\u597D\u53CB\u300D\u5217\u8868\u4E2D\u76F4\u63A5\u53D1\u73B0\uFF09\",\n values: \"true | false\",\n },\n \"view-distance\": {\n desc: \"\u670D\u52A1\u7AEF\u5411\u5BA2\u6237\u7AEF\u53D1\u9001\u5730\u56FE\u533A\u5757\u7684\u6700\u5927\u89C6\u8DDD\uFF08\u5355\u4F4D\uFF1A\u533A\u5757\uFF09\",\n values: \"\u6B63\u6574\u6570\uFF08\u5EFA\u8BAE 12 ~ 32\uFF0C\u6570\u503C\u8D8A\u5927\u7F51\u7EDC\u4E0E\u5185\u5B58\u6D88\u8017\u8D8A\u9AD8\uFF09\",\n },\n \"tick-distance\": {\n desc: \"\u4E16\u754C\u5B9E\u4F53\u903B\u8F91\u4E0E\u65B9\u5757\u66F4\u65B0\u7684\u6A21\u62DF\u8BA1\u7B97\u8DDD\u79BB\uFF08\u5355\u4F4D\uFF1A\u533A\u5757\uFF09\",\n values: \"4 ~ 12\uFF08\u6570\u503C\u8D8A\u5C0F\u670D\u52A1\u5668\u6027\u80FD\u8D8A\u597D\uFF0C\u4F4E\u914D\u673A\u578B\u63A8\u8350 4\uFF09\",\n },\n \"player-idle-timeout\": {\n desc: \"\u73A9\u5BB6\u6302\u673A\u65E0\u64CD\u4F5C\u81EA\u52A8\u8E22\u51FA\u8D85\u65F6\u65F6\u95F4\uFF08\u5355\u4F4D\uFF1A\u5206\u949F\uFF09\",\n values: \"0 (\u6C38\u4E0D\u8E22\u51FA) \u6216\u5927\u4E8E 0 \u7684\u6574\u6570\",\n },\n \"max-threads\": {\n desc: \"BDS \u8FD0\u884C\u53EF\u4F7F\u7528\u7684\u6700\u5927\u5DE5\u4F5C\u7EBF\u7A0B\u6570\",\n values: \"0 (\u7531\u670D\u52A1\u7AEF\u6839\u636E CPU \u6838\u5FC3\u6570\u81EA\u52A8\u5206\u914D) \u6216\u6307\u5B9A\u7EBF\u7A0B\u6570\",\n },\n \"level-name\": {\n desc: \"\u8981\u52A0\u8F7D\u7684\u4E16\u754C\u5B58\u6863\u6587\u4EF6\u5939\u540D\u79F0\uFF08\u5BF9\u5E94 worlds/ \u76EE\u5F55\u4E0B\u7684\u5B50\u6587\u4EF6\u5939\uFF09\",\n values: \"\u6587\u4EF6\u5939\u540D\u79F0\uFF08\u9ED8\u8BA4\uFF1ABedrock level\uFF09\",\n },\n \"level-seed\": {\n desc: \"\u5168\u65B0\u4E16\u754C\u751F\u6210\u65F6\u7684\u968F\u673A\u79CD\u5B50\",\n values: \"\u4EFB\u610F\u6570\u5B57\u6216\u6587\u672C\uFF08\u7559\u7A7A\u5219\u6BCF\u6B21\u65B0\u5EFA\u4E16\u754C\u968F\u673A\u751F\u6210\uFF09\",\n },\n \"default-player-permission-level\": {\n desc: \"\u65B0\u73A9\u5BB6\u9996\u6B21\u52A0\u5165\u65F6\u7684\u9ED8\u8BA4\u6743\u9650\u7EA7\u522B\",\n values: \"visitor (\u8BBF\u5BA2\uFF0C\u4E0D\u53EF\u7834\u574F\u6216\u4EA4\u4E92) | member (\u666E\u901A\u6210\u5458) | operator (\u64CD\u4F5C\u5458)\",\n },\n \"texturepack-required\": {\n desc: \"\u662F\u5426\u5F3A\u5236\u73A9\u5BB6\u4E0B\u8F7D\u670D\u52A1\u5668\u6307\u5B9A\u7684\u6750\u8D28\u8D44\u6E90\u5305\u540E\u624D\u80FD\u52A0\u5165\",\n values: \"true (\u5FC5\u987B\u4E0B\u8F7D) | false (\u53EF\u9009\u4E0B\u8F7D)\",\n },\n \"content-log-console-output-enabled\": {\n desc: \"\u662F\u5426\u5C06\u5185\u5BB9\u65E5\u5FD7\uFF08\u6A21\u7EC4/\u884C\u4E3A\u5305\u89E3\u6790\u8B66\u544A\u3001SAPI \u811A\u672C\u62A5\u9519\u4E0E console.log\uFF09\u5B9E\u65F6\u8F93\u51FA\u5230\u63A7\u5236\u53F0\",\n values: \"true | false\",\n tip: \"\u5F00\u53D1\u6216\u8C03\u8BD5\u6A21\u7EC4\u65F6\u5F3A\u70C8\u5EFA\u8BAE\u8BBE\u4E3A true\uFF0C\u4EE5\u4FBF\u5373\u65F6\u67E5\u770B\u9519\u8BEF\",\n },\n \"compression-threshold\": {\n desc: \"\u7F51\u7EDC\u6570\u636E\u5305\u542F\u7528\u538B\u7F29\u7684\u6700\u5C0F\u5B57\u8282\u9608\u503C\",\n values: \"0 (\u5168\u90E8\u538B\u7F29) ~ 65535 \u5B57\u8282\uFF081.20+ \u9ED8\u8BA4\u901A\u5E38\u4E3A 1\uFF09\",\n },\n \"compression-algorithm\": {\n desc: \"\u7F51\u7EDC\u4F20\u8F93\u6570\u636E\u5305\u7684\u538B\u7F29\u7B97\u6CD5\",\n values: \"zlib (\u6807\u51C6\u9AD8\u538B\u7F29\u6BD4) | snappy (\u9AD8\u6027\u80FD\u4F4E\u5EF6\u8FDF\uFF0CCPU \u5F00\u9500\u5C0F)\",\n },\n \"server-authoritative-movement\": {\n desc: \"\u73A9\u5BB6\u79FB\u52A8\u9A8C\u8BC1\u6743\u5A01\u6A21\u5F0F\",\n values: \"server-auth (\u670D\u52A1\u7AEF\u6743\u5A01\u5224\u5B9A) | client-auth (\u5BA2\u6237\u7AEF\u6743\u5A01)\",\n },\n \"player-movement-score-threshold\": {\n desc: \"\u73A9\u5BB6\u79FB\u52A8\u5F02\u5E38\u88AB\u5224\u5B9A\u4E3A\u4F5C\u5F0A\u7684\u7D2F\u8BA1\u5F02\u5E38\u5206\u9608\u503C\",\n values: \"\u6574\u6570\uFF08\u9ED8\u8BA4 20\uFF09\",\n },\n \"player-movement-action-direction-threshold\": {\n desc: \"\u73A9\u5BB6\u653B\u51FB\u6216\u7834\u574F\u52A8\u4F5C\u4E0E\u89C6\u7EBF\u671D\u5411\u5939\u89D2\u504F\u5DEE\u7684\u5224\u5B9A\u9608\u503C\",\n values: \"\u6D6E\u70B9\u6570\uFF08\u9ED8\u8BA4 0.85\uFF09\",\n },\n \"player-movement-distance-threshold\": {\n desc: \"\u73A9\u5BB6\u5355\u6B21\u4F4D\u79FB\u8D85\u51FA\u6B63\u5E38\u8303\u56F4\u7684\u5224\u5B9A\u9608\u503C\",\n values: \"\u6D6E\u70B9\u6570\uFF08\u9ED8\u8BA4 0.3\uFF09\",\n },\n \"player-movement-duration-threshold-in-ms\": {\n desc: \"\u79FB\u52A8\u5F02\u5E38\u5224\u5B9A\u91C7\u6837\u7684\u6ED1\u52A8\u65F6\u95F4\u7A97\u53E3\uFF08\u5355\u4F4D\uFF1A\u6BEB\u79D2\uFF09\",\n values: \"\u6574\u6570\uFF08\u9ED8\u8BA4 500\uFF09\",\n },\n \"correct-player-movement\": {\n desc: \"\u5F53\u68C0\u6D4B\u5230\u73A9\u5BB6\u79FB\u52A8\u4F5C\u5F0A\u6216\u8D85\u6807\u65F6\uFF0C\u662F\u5426\u5F3A\u5236\u5C06\u5176\u62C9\u56DE\u5408\u6CD5\u4F4D\u7F6E\uFF08\u9632\u98DE\u5929/\u52A0\u901F\uFF09\",\n values: \"true (\u5F3A\u5236\u56DE\u62C9\u7EA0\u6B63) | false (\u4EC5\u5728\u540E\u53F0\u8BB0\u5F55\u8B66\u544A)\",\n },\n \"server-authoritative-block-breaking\": {\n desc: \"\u65B9\u5757\u7834\u574F\u52A8\u4F5C\u662F\u5426\u7531\u670D\u52A1\u7AEF\u6743\u5A01\u5224\u5B9A\uFF08\u9632\u6B62\u53D8\u901F\u5237\u65B9\u5757\u7B49\u4F5C\u5F0A\u884C\u4E3A\uFF09\",\n values: \"client-auth | server-auth\",\n },\n \"chat-restriction\": {\n desc: \"\u804A\u5929\u8FC7\u6EE4\u9650\u5236\u7B56\u7565\",\n values: \"None (\u65E0\u9650\u5236) | Dropped (\u9759\u9ED8\u4E22\u5F03\u8FDD\u89C4\u5185\u5BB9) | Disabled (\u5B8C\u5168\u7981\u7528\u804A\u5929)\",\n },\n \"disable-player-interaction\": {\n desc: \"\u662F\u5426\u7981\u7528\u9759\u9ED8\u4EA4\u4E92\u68C0\u6D4B\uFF08\u7528\u4E8E\u6392\u67E5\u7F51\u7EDC\u5EF6\u8FDF\u6216\u9632\u5FEB\u901F\u4EA4\u4E92\uFF09\",\n values: \"true | false\",\n },\n \"client-side-chunk-generation-enabled\": {\n desc: \"\u662F\u5426\u5141\u8BB8\u5BA2\u6237\u7AEF\u5728\u672C\u5730\u751F\u6210\u5C1A\u672A\u52A0\u8F7D\u7684\u5730\u5F62\u533A\u5757\uFF08\u52A0\u5FEB\u957F\u8DDD\u79BB\u63A2\u7D22\u65F6\u7684\u89C6\u89C9\u52A0\u8F7D\u901F\u5EA6\uFF09\",\n values: \"true (\u5141\u8BB8\u5BA2\u6237\u7AEF\u672C\u5730\u9884\u751F\u6210) | false (\u5168\u90E8\u7531\u670D\u52A1\u7AEF\u751F\u6210\u5E76\u4F20\u8F93)\",\n },\n \"block-network-ids-are-hashes\": {\n desc: \"\u65B9\u5757\u5728\u7F51\u7EDC\u4F20\u8F93\u4E2D\u7684\u552F\u4E00\u6807\u8BC6\u662F\u5426\u91C7\u7528\u54C8\u5E0C\u503C\",\n values: \"true | false\",\n },\n \"disable-persona\": {\n desc: \"\u662F\u5426\u7981\u7528\u4E2A\u6027\u5316\u88C5\u626E/\u89D2\u8272\u521B\u5EFA\u5668\uFF08Persona \u76AE\u80A4\uFF09\",\n values: \"true (\u5F3A\u5236\u4F7F\u7528\u7ECF\u5178\u76AE\u80A4) | false (\u5141\u8BB8\u4F7F\u7528\u5B98\u65B9\u634F\u8138\u89D2\u8272)\",\n },\n \"disable-custom-skins\": {\n desc: \"\u662F\u5426\u7981\u7528\u73A9\u5BB6\u4E0A\u4F20\u7684\u81EA\u5B9A\u4E49\u7ECF\u5178\u76AE\u80A4\uFF08\u9632\u6B62\u6076\u610F\u6216\u900F\u660E\u76AE\u80A4\uFF09\",\n values: \"true (\u7981\u7528\u81EA\u5B9A\u4E49\u76AE\u80A4) | false (\u5141\u8BB8\u81EA\u5B9A\u4E49\u76AE\u80A4)\",\n },\n \"emit-server-telemetry\": {\n desc: \"\u662F\u5426\u5411 Mojang \u53D1\u9001\u670D\u52A1\u5668\u9065\u6D4B\u4E0E\u8FD0\u884C\u5065\u5EB7\u8BCA\u65AD\u6570\u636E\",\n values: \"true | false\",\n tip: \"\u4F7F\u7528\u672C\u5E73\u53F0\u65F6\u56E0\u60A8\u5DF2\u540C\u610F Mojang EULA \u534F\u8BAE\uFF0C\u6309\u534F\u8BAE\u4FDD\u6301\u542F\u7528\",\n },\n \"server-build-radius-ratio\": {\n desc: \"\u5141\u8BB8\u73A9\u5BB6\u5EFA\u9020\u548C\u4EA4\u4E92\u7684\u4E16\u754C\u533A\u57DF\u534A\u5F84\u6BD4\u4F8B\",\n values: \"Disabled (\u65E0\u9650\u5236) \u6216 0.0 ~ 1.0 \u7684\u6D6E\u70B9\u6570\",\n },\n \"allow-outbound-script-debugging\": {\n desc: \"\u662F\u5426\u5141\u8BB8\u670D\u52A1\u7AEF\u811A\u672C\u4E3B\u52A8\u8FDE\u63A5\u5916\u90E8\u8C03\u8BD5\u5668\uFF08\u5141\u8BB8 /script debugger connect \u6307\u4EE4\uFF09\",\n values: \"true | false\",\n tip: \"\u4EC5\u5728\u901A\u8FC7 VS Code \u8C03\u8BD5 SAPI \u6A21\u7EC4\u65F6\u5F00\u542F\uFF0C\u751F\u4EA7\u73AF\u5883\u5EFA\u8BAE\u5173\u95ED\",\n },\n \"allow-inbound-script-debugging\": {\n desc: \"\u662F\u5426\u5141\u8BB8\u5916\u90E8\u811A\u672C\u8C03\u8BD5\u5668\u4E3B\u52A8\u8FDE\u63A5\u670D\u52A1\u7AEF\uFF08\u5141\u8BB8 /script debugger listen \u6307\u4EE4\uFF09\",\n values: \"true | false\",\n tip: \"\u4EC5\u5728\u901A\u8FC7 VS Code \u8C03\u8BD5 SAPI \u6A21\u7EC4\u65F6\u5F00\u542F\uFF0C\u751F\u4EA7\u73AF\u5883\u5EFA\u8BAE\u5173\u95ED\",\n },\n \"force-inbound-debug-port\": {\n desc: \"\u811A\u672C\u8C03\u8BD5\u5668\u76D1\u542C\u7684\u4E13\u5C5E\u7F51\u7EDC\u7AEF\u53E3\",\n values: \"1 ~ 65535\uFF08\u9ED8\u8BA4\uFF1A19144\uFF09\",\n },\n \"script-debugger-auto-attach\": {\n desc: \"\u4E16\u754C\u52A0\u8F7D\u65F6\uFF0C\u662F\u5426\u81EA\u52A8\u8FDE\u63A5\u6216\u76D1\u542C\u5916\u90E8\u811A\u672C\u8C03\u8BD5\u5668\",\n values: \"disabled (\u4E0D\u81EA\u52A8\u9644\u52A0) | connect (\u81EA\u52A8\u5411\u5916\u8FDE\u63A5) | listen (\u81EA\u52A8\u5F00\u542F\u7AEF\u53E3\u76D1\u542C)\",\n },\n \"script-debugger-auto-attach-connect-address\": {\n desc: \"\u5F53 auto-attach \u8BBE\u4E3A connect \u65F6\uFF0C\u5C1D\u8BD5\u8FDE\u63A5\u7684\u76EE\u6807\u8C03\u8BD5\u5668\u4E3B\u673A\u4E0E\u7AEF\u53E3\",\n values: \"ip:port\uFF08\u4F8B\u5982 localhost:19144\uFF09\",\n },\n \"websocket-retry-time\": {\n desc: \"\u8FDE\u63A5\u5916\u90E8 WebSocket \u670D\u52A1\u5668\u65AD\u5F00\u540E\u7684\u81EA\u52A8\u91CD\u8BD5\u95F4\u9694\uFF08\u5355\u4F4D\uFF1A\u79D2\uFF09\",\n values: \"\u6B63\u6574\u6570\uFF08\u9ED8\u8BA4 20\uFF09\",\n },\n};\n\n/**\n * \u6839\u636E\u5C5E\u6027 key \u548C\u76EE\u6807\u8BED\u8A00\u83B7\u53D6\u8BF4\u660E\u6587\u6863\n */\nexport function getServerPropertyDoc(key: string, locale: string = \"zh-CN\"): ServerPropertyDoc | undefined {\n const normalizedKey = key.trim().toLowerCase();\n const normalizedLocale = locale.toLowerCase();\n\n if (normalizedLocale === \"zh\" || normalizedLocale.startsWith(\"zh-\")) {\n return SERVER_PROPERTIES_DOCS_ZH_CN[normalizedKey];\n }\n return undefined;\n}\n"],
5
+ "mappings": "AAaO,MAAM,+BAAkE;AAAA,EAC7E,aAAa;AAAA,IACX,MAAM;AAAA,IACN,QAAQ;AAAA,EACV;AAAA,EACA,eAAe;AAAA,IACb,MAAM;AAAA,IACN,QAAQ;AAAA,EACV;AAAA,EACA,YAAY;AAAA,IACV,MAAM;AAAA,IACN,QAAQ;AAAA,EACV;AAAA,EACA,kBAAkB;AAAA,IAChB,MAAM;AAAA,IACN,QAAQ;AAAA,EACV;AAAA,EACA,cAAc;AAAA,IACZ,MAAM;AAAA,IACN,QAAQ;AAAA,EACV;AAAA,EACA,gBAAgB;AAAA,IACd,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,KAAK;AAAA,EACP;AAAA,EACA,eAAe;AAAA,IACb,MAAM;AAAA,IACN,QAAQ;AAAA,EACV;AAAA,EACA,eAAe;AAAA,IACb,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,KAAK;AAAA,EACP;AAAA,EACA,cAAc;AAAA,IACZ,MAAM;AAAA,IACN,QAAQ;AAAA,EACV;AAAA,EACA,cAAc;AAAA,IACZ,MAAM;AAAA,IACN,QAAQ;AAAA,EACV;AAAA,EACA,eAAe;AAAA,IACb,MAAM;AAAA,IACN,QAAQ;AAAA,EACV;AAAA,EACA,iBAAiB;AAAA,IACf,MAAM;AAAA,IACN,QAAQ;AAAA,EACV;AAAA,EACA,yBAAyB;AAAA,IACvB,MAAM;AAAA,IACN,QAAQ;AAAA,EACV;AAAA,EACA,iBAAiB;AAAA,IACf,MAAM;AAAA,IACN,QAAQ;AAAA,EACV;AAAA,EACA,iBAAiB;AAAA,IACf,MAAM;AAAA,IACN,QAAQ;AAAA,EACV;AAAA,EACA,uBAAuB;AAAA,IACrB,MAAM;AAAA,IACN,QAAQ;AAAA,EACV;AAAA,EACA,eAAe;AAAA,IACb,MAAM;AAAA,IACN,QAAQ;AAAA,EACV;AAAA,EACA,cAAc;AAAA,IACZ,MAAM;AAAA,IACN,QAAQ;AAAA,EACV;AAAA,EACA,cAAc;AAAA,IACZ,MAAM;AAAA,IACN,QAAQ;AAAA,EACV;AAAA,EACA,mCAAmC;AAAA,IACjC,MAAM;AAAA,IACN,QAAQ;AAAA,EACV;AAAA,EACA,wBAAwB;AAAA,IACtB,MAAM;AAAA,IACN,QAAQ;AAAA,EACV;AAAA,EACA,sCAAsC;AAAA,IACpC,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,KAAK;AAAA,EACP;AAAA,EACA,yBAAyB;AAAA,IACvB,MAAM;AAAA,IACN,QAAQ;AAAA,EACV;AAAA,EACA,yBAAyB;AAAA,IACvB,MAAM;AAAA,IACN,QAAQ;AAAA,EACV;AAAA,EACA,iCAAiC;AAAA,IAC/B,MAAM;AAAA,IACN,QAAQ;AAAA,EACV;AAAA,EACA,mCAAmC;AAAA,IACjC,MAAM;AAAA,IACN,QAAQ;AAAA,EACV;AAAA,EACA,8CAA8C;AAAA,IAC5C,MAAM;AAAA,IACN,QAAQ;AAAA,EACV;AAAA,EACA,sCAAsC;AAAA,IACpC,MAAM;AAAA,IACN,QAAQ;AAAA,EACV;AAAA,EACA,4CAA4C;AAAA,IAC1C,MAAM;AAAA,IACN,QAAQ;AAAA,EACV;AAAA,EACA,2BAA2B;AAAA,IACzB,MAAM;AAAA,IACN,QAAQ;AAAA,EACV;AAAA,EACA,uCAAuC;AAAA,IACrC,MAAM;AAAA,IACN,QAAQ;AAAA,EACV;AAAA,EACA,oBAAoB;AAAA,IAClB,MAAM;AAAA,IACN,QAAQ;AAAA,EACV;AAAA,EACA,8BAA8B;AAAA,IAC5B,MAAM;AAAA,IACN,QAAQ;AAAA,EACV;AAAA,EACA,wCAAwC;AAAA,IACtC,MAAM;AAAA,IACN,QAAQ;AAAA,EACV;AAAA,EACA,gCAAgC;AAAA,IAC9B,MAAM;AAAA,IACN,QAAQ;AAAA,EACV;AAAA,EACA,mBAAmB;AAAA,IACjB,MAAM;AAAA,IACN,QAAQ;AAAA,EACV;AAAA,EACA,wBAAwB;AAAA,IACtB,MAAM;AAAA,IACN,QAAQ;AAAA,EACV;AAAA,EACA,yBAAyB;AAAA,IACvB,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,KAAK;AAAA,EACP;AAAA,EACA,6BAA6B;AAAA,IAC3B,MAAM;AAAA,IACN,QAAQ;AAAA,EACV;AAAA,EACA,mCAAmC;AAAA,IACjC,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,KAAK;AAAA,EACP;AAAA,EACA,kCAAkC;AAAA,IAChC,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,KAAK;AAAA,EACP;AAAA,EACA,4BAA4B;AAAA,IAC1B,MAAM;AAAA,IACN,QAAQ;AAAA,EACV;AAAA,EACA,+BAA+B;AAAA,IAC7B,MAAM;AAAA,IACN,QAAQ;AAAA,EACV;AAAA,EACA,+CAA+C;AAAA,IAC7C,MAAM;AAAA,IACN,QAAQ;AAAA,EACV;AAAA,EACA,wBAAwB;AAAA,IACtB,MAAM;AAAA,IACN,QAAQ;AAAA,EACV;AACF;AAKO,SAAS,qBAAqB,KAAa,SAAiB,SAAwC;AACzG,QAAM,gBAAgB,IAAI,KAAK,EAAE,YAAY;AAC7C,QAAM,mBAAmB,OAAO,YAAY;AAE5C,MAAI,qBAAqB,QAAQ,iBAAiB,WAAW,KAAK,GAAG;AACnE,WAAO,6BAA6B,aAAa;AAAA,EACnD;AACA,SAAO;AACT;",
6
+ "names": []
7
+ }
@@ -1,5 +1,6 @@
1
1
  export declare const EMIT_SERVER_TELEMETRY_KEY = "emit-server-telemetry";
2
2
  export declare const EMIT_SERVER_TELEMETRY_LINE = "emit-server-telemetry=true";
3
+ export declare const NETHERNET_TRANSPORT_LINE = "transport=nethernet";
3
4
  export type ServerPropertiesLogger = {
4
5
  info: (msg: string) => void;
5
6
  };
@@ -9,4 +10,28 @@ export type ServerPropertiesLogger = {
9
10
  * @returns true = 本次新追加;false = 跳过
10
11
  */
11
12
  export declare function ensureEmitServerTelemetry(bdsRoot: string, logger?: ServerPropertiesLogger): boolean;
13
+ /** 缺少传输方式时补上当前 BDS 所需的 NetherNet,保留服主已有设置。 */
14
+ export declare function ensureNetherNetTransport(bdsRoot: string, logger?: ServerPropertiesLogger): boolean;
15
+ /**
16
+ * 解析并探测当前应当采用的 BDS 本地化语言代码(例如 zh-CN 或 en)。
17
+ */
18
+ export declare function resolveBdsLocale(rootDir?: string): string;
19
+ /**
20
+ * 纯函数:将 server.properties 文本中的注释替换为目标语言的结构化中文说明。
21
+ * 严格保留配置项的 key 与当前生效的 value。若遇到未收录的键或纯注释块,原样保留。
22
+ */
23
+ export declare function localizeServerPropertiesContent(text: string, locale?: string): {
24
+ content: string;
25
+ modified: boolean;
26
+ };
27
+ export interface LocalizeServerPropertiesOptions {
28
+ locale?: string;
29
+ rootDir?: string;
30
+ logger?: ServerPropertiesLogger;
31
+ }
32
+ /**
33
+ * 对 `<bdsRoot>/server.properties` 中的注释执行本地化重写。
34
+ * @returns true = 本次成功重写并保存;false = 跳过或无改动
35
+ */
36
+ export declare function localizeServerProperties(bdsRoot: string, options?: LocalizeServerPropertiesOptions): boolean;
12
37
  //# sourceMappingURL=server-properties.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"server-properties.d.ts","sourceRoot":"","sources":["../src/server-properties.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,yBAAyB,0BAA0B,CAAC;AACjE,eAAO,MAAM,0BAA0B,+BAA+B,CAAC;AAEvE,MAAM,MAAM,sBAAsB,GAAG;IACnC,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CAC7B,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,MAAM,EACf,MAAM,CAAC,EAAE,sBAAsB,GAC9B,OAAO,CAmBT"}
1
+ {"version":3,"file":"server-properties.d.ts","sourceRoot":"","sources":["../src/server-properties.ts"],"names":[],"mappings":"AAcA,eAAO,MAAM,yBAAyB,0BAA0B,CAAC;AACjE,eAAO,MAAM,0BAA0B,+BAA+B,CAAC;AACvE,eAAO,MAAM,wBAAwB,wBAAwB,CAAC;AAE9D,MAAM,MAAM,sBAAsB,GAAG;IACnC,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CAC7B,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,MAAM,EACf,MAAM,CAAC,EAAE,sBAAsB,GAC9B,OAAO,CAmBT;AAED,8CAA8C;AAC9C,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,MAAM,EACf,MAAM,CAAC,EAAE,sBAAsB,GAC9B,OAAO,CAYT;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CA4BzD;AAED;;;GAGG;AACH,wBAAgB,+BAA+B,CAC7C,IAAI,EAAE,MAAM,EACZ,MAAM,GAAE,MAAgB,GACvB;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAA;CAAE,CAgGxC;AAED,MAAM,WAAW,+BAA+B;IAC9C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,sBAAsB,CAAC;CACjC;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,+BAA+B,GACxC,OAAO,CAmBT"}
@@ -1,7 +1,11 @@
1
+ import { configPath, readJson } from "@sfmc-bds/sdk/node/config";
1
2
  import fs from "node:fs";
2
3
  import { serverPropertiesPath } from "./pack-manager.js";
4
+ import { ROOT_DIR } from "./paths.js";
5
+ import { getServerPropertyDoc } from "./server-properties-i18n.js";
3
6
  const EMIT_SERVER_TELEMETRY_KEY = "emit-server-telemetry";
4
7
  const EMIT_SERVER_TELEMETRY_LINE = "emit-server-telemetry=true";
8
+ const NETHERNET_TRANSPORT_LINE = "transport=nethernet";
5
9
  function ensureEmitServerTelemetry(bdsRoot, logger) {
6
10
  const file = serverPropertiesPath(bdsRoot);
7
11
  if (!fs.existsSync(file)) return false;
@@ -20,9 +24,145 @@ function ensureEmitServerTelemetry(bdsRoot, logger) {
20
24
  );
21
25
  return true;
22
26
  }
27
+ function ensureNetherNetTransport(bdsRoot, logger) {
28
+ const file = serverPropertiesPath(bdsRoot);
29
+ if (!fs.existsSync(file)) return false;
30
+ let text = fs.readFileSync(file, "utf8");
31
+ if (/^\s*transport\s*=/im.test(text)) return false;
32
+ if (text.length > 0 && !text.endsWith("\n")) text += "\n";
33
+ text += `${NETHERNET_TRANSPORT_LINE}
34
+ `;
35
+ fs.writeFileSync(file, text, "utf8");
36
+ logger?.info("\u5DF2\u5411 server.properties \u8FFD\u52A0 transport=nethernet");
37
+ return true;
38
+ }
39
+ function resolveBdsLocale(rootDir) {
40
+ const envLang = process.env.SFMC_LOCALE || process.env.SFMC_LANG;
41
+ if (envLang) {
42
+ return envLang;
43
+ }
44
+ const root = rootDir || ROOT_DIR;
45
+ try {
46
+ const runtime = readJson(configPath(root, "runtime.json"));
47
+ if (runtime?.locale) {
48
+ return runtime.locale;
49
+ }
50
+ } catch {
51
+ }
52
+ const osLangs = [
53
+ process.env.LC_ALL,
54
+ process.env.LC_MESSAGES,
55
+ process.env.LANG,
56
+ Intl.DateTimeFormat().resolvedOptions().locale
57
+ ];
58
+ for (const raw of osLangs) {
59
+ if (raw && /^zh\b/i.test(raw)) {
60
+ return "zh-CN";
61
+ }
62
+ }
63
+ return "en";
64
+ }
65
+ function localizeServerPropertiesContent(text, locale = "zh-CN") {
66
+ const normalizedLocale = locale.toLowerCase();
67
+ if (!normalizedLocale.startsWith("zh")) {
68
+ return { content: text, modified: false };
69
+ }
70
+ if (!text || text.trim().length === 0) {
71
+ return { content: text, modified: false };
72
+ }
73
+ const eol = text.includes("\r\n") ? "\r\n" : "\n";
74
+ const lines = text.split(/\r?\n/);
75
+ const blocks = [];
76
+ let currentBlock = [];
77
+ let currentKey;
78
+ let currentValue;
79
+ function flushBlock() {
80
+ if (currentBlock.length > 0) {
81
+ blocks.push({
82
+ key: currentKey,
83
+ value: currentValue,
84
+ originalLines: currentBlock
85
+ });
86
+ currentBlock = [];
87
+ currentKey = void 0;
88
+ currentValue = void 0;
89
+ }
90
+ }
91
+ const kvRegex = /^\s*([A-Za-z0-9._-]+)\s*=\s*(.*)$/;
92
+ for (let i = 0; i < lines.length; i++) {
93
+ const line = lines[i];
94
+ if (typeof line !== "string") continue;
95
+ const isBlank = line.trim() === "";
96
+ if (isBlank) {
97
+ flushBlock();
98
+ continue;
99
+ }
100
+ const match = line.match(kvRegex);
101
+ if (match && match[1] !== void 0) {
102
+ if (currentKey !== void 0) {
103
+ flushBlock();
104
+ }
105
+ currentKey = match[1];
106
+ currentValue = match[2] ?? "";
107
+ currentBlock.push(line);
108
+ } else {
109
+ currentBlock.push(line);
110
+ }
111
+ }
112
+ flushBlock();
113
+ const outputBlocks = [];
114
+ for (const block of blocks) {
115
+ if (block.key) {
116
+ const doc = getServerPropertyDoc(block.key, locale);
117
+ if (doc) {
118
+ const outLines = [`${block.key}=${block.value ?? ""}`];
119
+ outLines.push(`# ${doc.desc}`);
120
+ if (doc.values) {
121
+ outLines.push(`# \u53EF\u9009\u503C\uFF1A${doc.values}`);
122
+ }
123
+ if (doc.tip) {
124
+ outLines.push(`# \u63D0\u793A\uFF1A${doc.tip}`);
125
+ }
126
+ outputBlocks.push(outLines.join(eol));
127
+ continue;
128
+ }
129
+ }
130
+ outputBlocks.push(block.originalLines.join(eol));
131
+ }
132
+ let newContent = outputBlocks.join(eol + eol);
133
+ if (newContent.length > 0 && !newContent.endsWith(eol)) {
134
+ newContent += eol;
135
+ }
136
+ return {
137
+ content: newContent,
138
+ modified: newContent !== text
139
+ };
140
+ }
141
+ function localizeServerProperties(bdsRoot, options) {
142
+ const file = serverPropertiesPath(bdsRoot);
143
+ if (!fs.existsSync(file)) return false;
144
+ const locale = options?.locale || resolveBdsLocale(options?.rootDir);
145
+ const normalizedLocale = locale.toLowerCase();
146
+ if (!normalizedLocale.startsWith("zh")) {
147
+ return false;
148
+ }
149
+ const raw = fs.readFileSync(file, "utf8");
150
+ const { content, modified } = localizeServerPropertiesContent(raw, locale);
151
+ if (!modified) {
152
+ return false;
153
+ }
154
+ fs.writeFileSync(file, content, "utf8");
155
+ options?.logger?.info("\u5DF2\u5C06 server.properties \u4E2D\u7684\u6CE8\u91CA\u672C\u5730\u5316\u4E3A\u7B80\u4F53\u4E2D\u6587\uFF08\u4FDD\u7559\u6240\u6709\u65E2\u6709\u914D\u7F6E\u503C\uFF09");
156
+ return true;
157
+ }
23
158
  export {
24
159
  EMIT_SERVER_TELEMETRY_KEY,
25
160
  EMIT_SERVER_TELEMETRY_LINE,
26
- ensureEmitServerTelemetry
161
+ NETHERNET_TRANSPORT_LINE,
162
+ ensureEmitServerTelemetry,
163
+ ensureNetherNetTransport,
164
+ localizeServerProperties,
165
+ localizeServerPropertiesContent,
166
+ resolveBdsLocale
27
167
  };
28
168
  //# sourceMappingURL=server-properties.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/server-properties.ts"],
4
- "sourcesContent": ["/**\n * server.properties \u8F85\u52A9\uFF1A\u5B89\u88C5/\u542F\u52A8\u65F6\u786E\u4FDD emit-server-telemetry=true\n */\nimport fs from \"node:fs\";\nimport { serverPropertiesPath } from \"./pack-manager.js\";\n\nexport const EMIT_SERVER_TELEMETRY_KEY = \"emit-server-telemetry\";\nexport const EMIT_SERVER_TELEMETRY_LINE = \"emit-server-telemetry=true\";\n\nexport type ServerPropertiesLogger = {\n info: (msg: string) => void;\n};\n\n/**\n * \u82E5 `<bdsRoot>/server.properties` \u4E2D\u5C1A\u65E0 emit-server-telemetry\uFF0C\u5219\u8FFD\u52A0 `=true`\u3002\n * \u5DF2\u6709\u8BE5\u952E\uFF08\u4EFB\u610F\u503C\uFF09\u5219\u8DF3\u8FC7\u3002\u6587\u4EF6\u4E0D\u5B58\u5728\u65F6\u8DF3\u8FC7\uFF08BDS \u5C1A\u672A\u89E3\u538B\uFF09\u3002\n * @returns true = \u672C\u6B21\u65B0\u8FFD\u52A0\uFF1Bfalse = \u8DF3\u8FC7\n */\nexport function ensureEmitServerTelemetry(\n bdsRoot: string,\n logger?: ServerPropertiesLogger\n): boolean {\n const file = serverPropertiesPath(bdsRoot);\n if (!fs.existsSync(file)) return false;\n\n let text = fs.readFileSync(file, \"utf8\");\n if (/^\\s*emit-server-telemetry\\s*=/im.test(text)) {\n return false;\n }\n\n if (text.length > 0 && !text.endsWith(\"\\n\")) {\n text += \"\\n\";\n }\n text += `${EMIT_SERVER_TELEMETRY_LINE}\\n`;\n fs.writeFileSync(file, text, \"utf8\");\n\n logger?.info(\n \"\u5DF2\u5411 server.properties \u8FFD\u52A0 emit-server-telemetry=true\uFF08\u56E0\u60A8\u5DF2\u540C\u610F Mojang EULA\uFF0C\u6309\u534F\u8BAE\u542F\u7528\u670D\u52A1\u5668\u9065\u6D4B\uFF09\"\n );\n return true;\n}\n"],
5
- "mappings": "AAGA,OAAO,QAAQ;AACf,SAAS,4BAA4B;AAE9B,MAAM,4BAA4B;AAClC,MAAM,6BAA6B;AAWnC,SAAS,0BACd,SACA,QACS;AACT,QAAM,OAAO,qBAAqB,OAAO;AACzC,MAAI,CAAC,GAAG,WAAW,IAAI,EAAG,QAAO;AAEjC,MAAI,OAAO,GAAG,aAAa,MAAM,MAAM;AACvC,MAAI,kCAAkC,KAAK,IAAI,GAAG;AAChD,WAAO;AAAA,EACT;AAEA,MAAI,KAAK,SAAS,KAAK,CAAC,KAAK,SAAS,IAAI,GAAG;AAC3C,YAAQ;AAAA,EACV;AACA,UAAQ,GAAG,0BAA0B;AAAA;AACrC,KAAG,cAAc,MAAM,MAAM,MAAM;AAEnC,UAAQ;AAAA,IACN;AAAA,EACF;AACA,SAAO;AACT;",
4
+ "sourcesContent": ["/**\n * server-properties.ts \u2014 BDS server.properties \u8F85\u52A9\u5DE5\u5177\u96C6\n *\n * \u804C\u8D23\uFF1A\n * 1. \u5B89\u88C5/\u542F\u52A8\u65F6\u786E\u4FDD emit-server-telemetry=true \u4E0E transport=nethernet\n * 2. \u5B89\u88C5/\u66F4\u65B0/\u542F\u52A8\u65F6\u652F\u6301\u5C06\u914D\u7F6E\u6CE8\u91CA\u7ED3\u6784\u5316\u672C\u5730\u5316\uFF08\u5982\u7FFB\u8BD1\u4E3A\u7B80\u4F53\u4E2D\u6587 zh-CN\uFF09\uFF0C\n * \u4E25\u683C\u4FDD\u7559\u6240\u6709\u914D\u7F6E\u952E\uFF08Key\uFF09\u4E0E\u7528\u6237\u914D\u7F6E\u503C\uFF08Value\uFF09\u3002\n */\nimport { configPath, readJson } from \"@sfmc-bds/sdk/node/config\";\nimport fs from \"node:fs\";\nimport { serverPropertiesPath } from \"./pack-manager.js\";\nimport { ROOT_DIR } from \"./paths.js\";\nimport { getServerPropertyDoc } from \"./server-properties-i18n.js\";\n\nexport const EMIT_SERVER_TELEMETRY_KEY = \"emit-server-telemetry\";\nexport const EMIT_SERVER_TELEMETRY_LINE = \"emit-server-telemetry=true\";\nexport const NETHERNET_TRANSPORT_LINE = \"transport=nethernet\";\n\nexport type ServerPropertiesLogger = {\n info: (msg: string) => void;\n};\n\n/**\n * \u82E5 `<bdsRoot>/server.properties` \u4E2D\u5C1A\u65E0 emit-server-telemetry\uFF0C\u5219\u8FFD\u52A0 `=true`\u3002\n * \u5DF2\u6709\u8BE5\u952E\uFF08\u4EFB\u610F\u503C\uFF09\u5219\u8DF3\u8FC7\u3002\u6587\u4EF6\u4E0D\u5B58\u5728\u65F6\u8DF3\u8FC7\uFF08BDS \u5C1A\u672A\u89E3\u538B\uFF09\u3002\n * @returns true = \u672C\u6B21\u65B0\u8FFD\u52A0\uFF1Bfalse = \u8DF3\u8FC7\n */\nexport function ensureEmitServerTelemetry(\n bdsRoot: string,\n logger?: ServerPropertiesLogger\n): boolean {\n const file = serverPropertiesPath(bdsRoot);\n if (!fs.existsSync(file)) return false;\n\n let text = fs.readFileSync(file, \"utf8\");\n if (/^\\s*emit-server-telemetry\\s*=/im.test(text)) {\n return false;\n }\n\n if (text.length > 0 && !text.endsWith(\"\\n\")) {\n text += \"\\n\";\n }\n text += `${EMIT_SERVER_TELEMETRY_LINE}\\n`;\n fs.writeFileSync(file, text, \"utf8\");\n\n logger?.info(\n \"\u5DF2\u5411 server.properties \u8FFD\u52A0 emit-server-telemetry=true\uFF08\u56E0\u60A8\u5DF2\u540C\u610F Mojang EULA\uFF0C\u6309\u534F\u8BAE\u542F\u7528\u670D\u52A1\u5668\u9065\u6D4B\uFF09\"\n );\n return true;\n}\n\n/** \u7F3A\u5C11\u4F20\u8F93\u65B9\u5F0F\u65F6\u8865\u4E0A\u5F53\u524D BDS \u6240\u9700\u7684 NetherNet\uFF0C\u4FDD\u7559\u670D\u4E3B\u5DF2\u6709\u8BBE\u7F6E\u3002 */\nexport function ensureNetherNetTransport(\n bdsRoot: string,\n logger?: ServerPropertiesLogger\n): boolean {\n const file = serverPropertiesPath(bdsRoot);\n if (!fs.existsSync(file)) return false;\n\n let text = fs.readFileSync(file, \"utf8\");\n if (/^\\s*transport\\s*=/im.test(text)) return false;\n\n if (text.length > 0 && !text.endsWith(\"\\n\")) text += \"\\n\";\n text += `${NETHERNET_TRANSPORT_LINE}\\n`;\n fs.writeFileSync(file, text, \"utf8\");\n logger?.info(\"\u5DF2\u5411 server.properties \u8FFD\u52A0 transport=nethernet\");\n return true;\n}\n\n/**\n * \u89E3\u6790\u5E76\u63A2\u6D4B\u5F53\u524D\u5E94\u5F53\u91C7\u7528\u7684 BDS \u672C\u5730\u5316\u8BED\u8A00\u4EE3\u7801\uFF08\u4F8B\u5982 zh-CN \u6216 en\uFF09\u3002\n */\nexport function resolveBdsLocale(rootDir?: string): string {\n const envLang = process.env.SFMC_LOCALE || process.env.SFMC_LANG;\n if (envLang) {\n return envLang;\n }\n\n const root = rootDir || ROOT_DIR;\n try {\n const runtime = readJson<{ locale?: string }>(configPath(root, \"runtime.json\"));\n if (runtime?.locale) {\n return runtime.locale;\n }\n } catch {\n // \u5FFD\u7565\u5F02\u5E38\uFF0C\u964D\u7EA7\u5230\u7CFB\u7EDF\u8BED\u8A00\u63A2\u6D4B\n }\n\n const osLangs = [\n process.env.LC_ALL,\n process.env.LC_MESSAGES,\n process.env.LANG,\n Intl.DateTimeFormat().resolvedOptions().locale,\n ];\n for (const raw of osLangs) {\n if (raw && /^zh\\b/i.test(raw)) {\n return \"zh-CN\";\n }\n }\n return \"en\";\n}\n\n/**\n * \u7EAF\u51FD\u6570\uFF1A\u5C06 server.properties \u6587\u672C\u4E2D\u7684\u6CE8\u91CA\u66FF\u6362\u4E3A\u76EE\u6807\u8BED\u8A00\u7684\u7ED3\u6784\u5316\u4E2D\u6587\u8BF4\u660E\u3002\n * \u4E25\u683C\u4FDD\u7559\u914D\u7F6E\u9879\u7684 key \u4E0E\u5F53\u524D\u751F\u6548\u7684 value\u3002\u82E5\u9047\u5230\u672A\u6536\u5F55\u7684\u952E\u6216\u7EAF\u6CE8\u91CA\u5757\uFF0C\u539F\u6837\u4FDD\u7559\u3002\n */\nexport function localizeServerPropertiesContent(\n text: string,\n locale: string = \"zh-CN\"\n): { content: string; modified: boolean } {\n const normalizedLocale = locale.toLowerCase();\n // \u76EE\u524D\u4EC5\u5BF9\u4E2D\u6587\u505A\u672C\u5730\u5316\u91CD\u5199\uFF1B\u82F1\u6587\u6216\u5176\u4ED6\u8BED\u8A00\u4FDD\u6301\u539F\u6C41\u539F\u5473\n if (!normalizedLocale.startsWith(\"zh\")) {\n return { content: text, modified: false };\n }\n\n if (!text || text.trim().length === 0) {\n return { content: text, modified: false };\n }\n\n const eol = text.includes(\"\\r\\n\") ? \"\\r\\n\" : \"\\n\";\n const lines = text.split(/\\r?\\n/);\n\n interface Block {\n key: string | undefined;\n value: string | undefined;\n originalLines: string[];\n }\n\n const blocks: Block[] = [];\n let currentBlock: string[] = [];\n let currentKey: string | undefined;\n let currentValue: string | undefined;\n\n function flushBlock() {\n if (currentBlock.length > 0) {\n blocks.push({\n key: currentKey,\n value: currentValue,\n originalLines: currentBlock,\n });\n currentBlock = [];\n currentKey = undefined;\n currentValue = undefined;\n }\n }\n\n const kvRegex = /^\\s*([A-Za-z0-9._-]+)\\s*=\\s*(.*)$/;\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n if (typeof line !== \"string\") continue;\n const isBlank = line.trim() === \"\";\n\n if (isBlank) {\n flushBlock();\n continue;\n }\n\n const match = line.match(kvRegex);\n if (match && match[1] !== undefined) {\n // \u82E5\u5F53\u524D\u5757\u5185\u5DF2\u7ECF\u5B58\u5728\u4E00\u4E2A\u952E\u503C\u5BF9\uFF0C\u5219\u5148\u7ED3\u7B97\u4E0A\u4E00\u5757\n if (currentKey !== undefined) {\n flushBlock();\n }\n currentKey = match[1];\n currentValue = match[2] ?? \"\";\n currentBlock.push(line);\n } else {\n currentBlock.push(line);\n }\n }\n flushBlock();\n\n const outputBlocks: string[] = [];\n\n for (const block of blocks) {\n if (block.key) {\n const doc = getServerPropertyDoc(block.key, locale);\n if (doc) {\n const outLines: string[] = [`${block.key}=${block.value ?? \"\"}`];\n outLines.push(`# ${doc.desc}`);\n if (doc.values) {\n outLines.push(`# \u53EF\u9009\u503C\uFF1A${doc.values}`);\n }\n if (doc.tip) {\n outLines.push(`# \u63D0\u793A\uFF1A${doc.tip}`);\n }\n outputBlocks.push(outLines.join(eol));\n continue;\n }\n }\n // \u672A\u6536\u5F55\u7684\u9879\u6216\u666E\u901A\u6CE8\u91CA\u5757\uFF0C\u4FDD\u7559\u539F\u6587\u672C\n outputBlocks.push(block.originalLines.join(eol));\n }\n\n let newContent = outputBlocks.join(eol + eol);\n if (newContent.length > 0 && !newContent.endsWith(eol)) {\n newContent += eol;\n }\n\n return {\n content: newContent,\n modified: newContent !== text,\n };\n}\n\nexport interface LocalizeServerPropertiesOptions {\n locale?: string;\n rootDir?: string;\n logger?: ServerPropertiesLogger;\n}\n\n/**\n * \u5BF9 `<bdsRoot>/server.properties` \u4E2D\u7684\u6CE8\u91CA\u6267\u884C\u672C\u5730\u5316\u91CD\u5199\u3002\n * @returns true = \u672C\u6B21\u6210\u529F\u91CD\u5199\u5E76\u4FDD\u5B58\uFF1Bfalse = \u8DF3\u8FC7\u6216\u65E0\u6539\u52A8\n */\nexport function localizeServerProperties(\n bdsRoot: string,\n options?: LocalizeServerPropertiesOptions\n): boolean {\n const file = serverPropertiesPath(bdsRoot);\n if (!fs.existsSync(file)) return false;\n\n const locale = options?.locale || resolveBdsLocale(options?.rootDir);\n const normalizedLocale = locale.toLowerCase();\n if (!normalizedLocale.startsWith(\"zh\")) {\n return false;\n }\n\n const raw = fs.readFileSync(file, \"utf8\");\n const { content, modified } = localizeServerPropertiesContent(raw, locale);\n if (!modified) {\n return false;\n }\n\n fs.writeFileSync(file, content, \"utf8\");\n options?.logger?.info(\"\u5DF2\u5C06 server.properties \u4E2D\u7684\u6CE8\u91CA\u672C\u5730\u5316\u4E3A\u7B80\u4F53\u4E2D\u6587\uFF08\u4FDD\u7559\u6240\u6709\u65E2\u6709\u914D\u7F6E\u503C\uFF09\");\n return true;\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
package/dist/types.d.ts CHANGED
@@ -46,6 +46,7 @@ export interface UpdateOutcome {
46
46
  export interface ChangelogPayload {
47
47
  text: string;
48
48
  imageBase64: string | null;
49
+ url: string;
49
50
  }
50
51
  export type LogLevel = "info" | "warn" | "error";
51
52
  export interface Logger {
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,SAAS,GAAG,SAAS,GAAG,MAAM,CAAC;IACzC,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IAGpB,YAAY,CAAC,EAAE,aAAa,GAAG,UAAU,CAAC;IAC1C,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAG1B,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC;IAG/B,KAAK,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;CAC1C;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,OAAO,CAAC;IACZ,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAEjD,MAAM,WAAW,MAAM;IACrB,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,SAAS,GAAG,SAAS,GAAG,MAAM,CAAC;IACzC,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IAGpB,YAAY,CAAC,EAAE,aAAa,GAAG,UAAU,CAAC;IAC1C,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAG1B,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC;IAG/B,KAAK,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;CAC1C;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,OAAO,CAAC;IACZ,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAEjD,MAAM,WAAW,MAAM;IACrB,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B"}
@@ -1,18 +1,27 @@
1
1
  /**
2
- * upstream.ts — 版本源 / 下载源 / 哈希校验
2
+ * upstream.ts — BDS 上游版本源、多镜像下载与完整性校验
3
3
  *
4
- * 改进:
5
- * - 3 次重试 + 指数退避
6
- * - sha1 / sha256 同时校验
7
- * - 流式校验 + 边下边校验
4
+ * 核心机制:
5
+ * - 多源容灾:官方源与镜像源并行竞争与多轮指数退避重试
6
+ * - 动态 URL 模板渲染:根据操作系统架构与更新通道计算下载地址
7
+ * - 流式哈希校验:支持 SHA-1 与 SHA-256 完整性流式计算校验
8
+ * - 版本白名单兼容门禁:防止自动升级至未验证版本
8
9
  */
10
+ import { type BdsHostOs } from "./host-platform.js";
9
11
  import type { BdsUpdaterConfig, VersionDetails, VersionInfo } from "./types.js";
10
- /** 获取最新版本号 (含 cdn_root),3 次重试 */
11
- export declare function getVersionInfo(cfg: BdsUpdaterConfig, channel: string): Promise<VersionInfo>;
12
+ /**
13
+ * 获取 BDS 最新可用版本信息(支持重试与指数退避)。
14
+ *
15
+ * @param cfg BDS 更新器配置。
16
+ * @param channel 更新通道(如 "release" 或 "preview")。
17
+ * @param hostOs 目标主机操作系统类型。
18
+ * @returns 包含最新版本号与 CDN 根路径的信息对象。
19
+ */
20
+ export declare function getVersionInfo(cfg: BdsUpdaterConfig, channel: string, hostOs?: BdsHostOs): Promise<VersionInfo>;
12
21
  /** 获取 per-version 的下载链接 + 哈希 (fallback GitHub → jsdelivr) */
13
- export declare function fetchVersionDetails(cfg: BdsUpdaterConfig, channel: string, version: string): Promise<VersionDetails>;
22
+ export declare function fetchVersionDetails(cfg: BdsUpdaterConfig, channel: string, version: string, hostOs?: BdsHostOs): Promise<VersionDetails>;
14
23
  /** 候选下载 URL (按优先级) */
15
- export declare function buildDownloadUrls(cfg: BdsUpdaterConfig, channel: string, version: string, details: VersionDetails): string[];
24
+ export declare function buildDownloadUrls(cfg: BdsUpdaterConfig, channel: string, version: string, details: VersionDetails, hostOs?: BdsHostOs): string[];
16
25
  /** 同步 / 异步校验文件哈希 */
17
26
  export declare function verifyFileHash(filePath: string, expectedSha1: string, expectedSha256: string): Promise<boolean>;
18
27
  /** 检查版本兼容性 (白名单) */
@@ -1 +1 @@
1
- {"version":3,"file":"upstream.d.ts","sourceRoot":"","sources":["../src/upstream.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAMH,OAAO,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAchF,iCAAiC;AACjC,wBAAsB,cAAc,CAAC,GAAG,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CA8BjG;AAED,6DAA6D;AAC7D,wBAAsB,mBAAmB,CACvC,GAAG,EAAE,gBAAgB,EACrB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,cAAc,CAAC,CA2BzB;AAED,sBAAsB;AACtB,wBAAgB,iBAAiB,CAC/B,GAAG,EAAE,gBAAgB,EACrB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,cAAc,GACtB,MAAM,EAAE,CAeV;AAED,oBAAoB;AACpB,wBAAsB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAiBrH;AAED,oBAAoB;AACpB,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAInF"}
1
+ {"version":3,"file":"upstream.d.ts","sourceRoot":"","sources":["../src/upstream.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,EAAqD,KAAK,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAGvG,OAAO,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAchF;;;;;;;GAOG;AACH,wBAAsB,cAAc,CAElC,GAAG,EAAE,gBAAgB,EACrB,OAAO,EAAE,MAAM,EACf,MAAM,GAAE,SAAuB,GAC9B,OAAO,CAAC,WAAW,CAAC,CA8BtB;AAED,6DAA6D;AAC7D,wBAAsB,mBAAmB,CACvC,GAAG,EAAE,gBAAgB,EACrB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,MAAM,GAAE,SAAuB,GAC9B,OAAO,CAAC,cAAc,CAAC,CA2BzB;AAED,sBAAsB;AACtB,wBAAgB,iBAAiB,CAC/B,GAAG,EAAE,gBAAgB,EACrB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,cAAc,EACvB,MAAM,GAAE,SAAuB,GAC9B,MAAM,EAAE,CAYV;AAED,oBAAoB;AACpB,wBAAsB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAiBrH;AAED,oBAAoB;AACpB,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAInF"}
package/dist/upstream.js CHANGED
@@ -1,5 +1,6 @@
1
1
  import crypto from "node:crypto";
2
2
  import fs from "node:fs";
3
+ import { bdsCdnZipSuffix, bdsDetailsPlatformKey, bdsHostOs } from "./host-platform.js";
3
4
  import { fetchJsonWithFallback } from "./http.js";
4
5
  import { log } from "./log.js";
5
6
  import { toVer3 } from "./version.js";
@@ -12,7 +13,7 @@ function resolveTemplate(tpl, vars) {
12
13
  }
13
14
  return s;
14
15
  }
15
- async function getVersionInfo(cfg, channel) {
16
+ async function getVersionInfo(cfg, channel, hostOs = bdsHostOs()) {
16
17
  const api = cfg.version_versions || process.env["BDS_VERSIONS_API"] || DEFAULT_VERSIONS_API;
17
18
  const mirror = cfg.version_versions_mirror || process.env["BDS_VERSIONS_MIRROR"] || DEFAULT_VERSIONS_MIRROR;
18
19
  const sources = [api, mirror].filter(Boolean);
@@ -26,7 +27,7 @@ async function getVersionInfo(cfg, channel) {
26
27
  const entry = channel === "preview" ? json.preview : json.release;
27
28
  ver = entry?.latest;
28
29
  } else {
29
- const platform = json.windows || json.linux;
30
+ const platform = hostOs === "windows" ? json.windows || json.linux : json.linux || json.windows;
30
31
  ver = channel === "preview" ? platform?.preview : platform?.stable;
31
32
  }
32
33
  if (!ver) throw new Error("\u672A\u627E\u5230\u6700\u65B0\u7248\u672C\u53F7");
@@ -42,8 +43,8 @@ async function getVersionInfo(cfg, channel) {
42
43
  }
43
44
  throw lastErr instanceof Error ? lastErr : new Error("\u7248\u672C\u53F7\u83B7\u53D6\u5931\u8D25");
44
45
  }
45
- async function fetchVersionDetails(cfg, channel, version) {
46
- const platform = channel === "preview" ? "windows_preview" : "windows";
46
+ async function fetchVersionDetails(cfg, channel, version, hostOs = bdsHostOs()) {
47
+ const platform = bdsDetailsPlatformKey(channel, hostOs);
47
48
  const ch = channel === "preview" ? "preview" : "release";
48
49
  const vars = { version, ver3: toVer3(version), platform, channel: ch };
49
50
  const detailsTpl = cfg.version_details || "https://raw.githubusercontent.com/Bedrock-OSS/BDS-Versions/main/{platform}/{version}.json";
@@ -52,7 +53,7 @@ async function fetchVersionDetails(cfg, channel, version) {
52
53
  const json = await fetchJsonWithFallback(sources);
53
54
  const mode = cfg.version_mode || "bedrock-oss";
54
55
  if (mode === "endstone") {
55
- const bw = json.binary?.windows;
56
+ const bw = hostOs === "windows" ? json.binary?.windows : json.binary?.linux;
56
57
  return {
57
58
  downloadUrl: bw?.url ?? "",
58
59
  sha1: "",
@@ -67,7 +68,7 @@ async function fetchVersionDetails(cfg, channel, version) {
67
68
  size: json.size_in_bytes ?? 0
68
69
  };
69
70
  }
70
- function buildDownloadUrls(cfg, channel, version, details) {
71
+ function buildDownloadUrls(cfg, channel, version, details, hostOs = bdsHostOs()) {
71
72
  const urls = [];
72
73
  if (cfg.download_mirror) {
73
74
  const mirrorVer = channel === "preview" ? `${version}-preview` : version;
@@ -75,7 +76,7 @@ function buildDownloadUrls(cfg, channel, version, details) {
75
76
  }
76
77
  if (details.downloadUrl) urls.push(details.downloadUrl);
77
78
  const cdnRoot = cfg.cdn_root || "https://www.minecraft.net/bedrockdedicatedserver";
78
- const suffix = channel === "preview" ? `/bin-win-preview/bedrock-server-${version}-preview.zip` : `/bin-win/bedrock-server-${version}.zip`;
79
+ const suffix = bdsCdnZipSuffix(channel, version, hostOs);
79
80
  urls.push(cdnRoot + suffix);
80
81
  urls.push(`https://minecraft.azureedge.net${suffix}`);
81
82
  return [...new Set(urls)];