@heybox/hb-sdk 0.8.0-alpha.9 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/CHANGELOG.md +67 -0
  2. package/README.md +25 -19
  3. package/dist/cli-chunks/{build-DkokKVNy.cjs → build-PYCNacya.cjs} +8 -5
  4. package/dist/cli-chunks/{context-CKzZxKbF.cjs → context-m2W2XbL0.cjs} +42 -59
  5. package/dist/cli-chunks/{create-BQy5Jdmu.cjs → create-BdAg3WGA.cjs} +1 -1
  6. package/dist/cli-chunks/{dev-Dik2zr5R.cjs → dev-CyZuw7Yn.cjs} +26 -15
  7. package/dist/cli-chunks/{doctor-Byr4uwKG.cjs → doctor-DU8rCfUF.cjs} +1 -1
  8. package/dist/cli-chunks/{index-Cl0XaX8e.cjs → index-DATObqzK.cjs} +2 -2
  9. package/dist/cli-chunks/{index-BwGBr1ZA.cjs → index-MMW2ibQm.cjs} +15 -15
  10. package/dist/cli-chunks/{index.esm-BYifBABc.cjs → index.esm-BiAaAUFC.cjs} +8 -8
  11. package/dist/cli-chunks/{login-Dr9lclu3.cjs → login-B3TThMss.cjs} +2 -2
  12. package/dist/cli-chunks/{project-vite-BIPrOtRO.cjs → project-vite-BQj8YLI4.cjs} +1 -1
  13. package/dist/cli-chunks/{remote-DXxyA14a.cjs → remote-DNvI7tHH.cjs} +57 -25
  14. package/dist/cli-chunks/{runtime-gate-DFjw66kF.cjs → runtime-gate-BEFp1w_s.cjs} +11 -3
  15. package/dist/cli-chunks/{runtime-permission-env-CjsCe5bp.cjs → runtime-permission-env-CtL8rsjB.cjs} +351 -0
  16. package/dist/cli-chunks/{session-B6Mo9eYW.cjs → session-DjBkjaF8.cjs} +1 -1
  17. package/dist/cli-chunks/{skill-f90sxv28.cjs → skill-cR_wnaw2.cjs} +2 -2
  18. package/dist/cli-chunks/{version-DDB_btOG.cjs → version-yEn1E2Bg.cjs} +1 -1
  19. package/dist/cli.cjs +1 -1
  20. package/dist/devtools/browser-dev-host/assets/browser-dev-host-TzYf9L6C.js +99 -0
  21. package/dist/devtools/browser-dev-host/assets/{index-DaqmTjSF.js → index-C5MZZDa5.js} +4 -4
  22. package/dist/devtools/browser-dev-host/assets/index-P-ra4m1y.css +1 -0
  23. package/dist/devtools/browser-dev-host/assets/{workbench-state-wHgWRb7I.js → workbench-state-BwV7bm4n.js} +2 -2
  24. package/dist/devtools/browser-dev-host/index.html +3 -3
  25. package/dist/index.cjs.js +99 -1
  26. package/dist/index.esm.js +99 -1
  27. package/dist/protocol.cjs.js +189 -47
  28. package/dist/protocol.esm.js +189 -47
  29. package/dist/templates/vanilla-vite-js/package.json.ejs +2 -1
  30. package/dist/vite.cjs.js +281 -13
  31. package/dist/vite.esm.js +281 -13
  32. package/package.json +5 -5
  33. package/skill/SKILL.md +8 -9
  34. package/skill/references/api-protocol.md +1 -1
  35. package/skill/references/api-root.md +63 -21
  36. package/skill/references/cli.md +6 -6
  37. package/skill/references/examples.md +3 -3
  38. package/skill/references/recipes.md +35 -38
  39. package/skill/references/safety-boundaries.md +9 -5
  40. package/skill/skill.json +5 -5
  41. package/types/core/mini-dev-console.d.ts +36 -0
  42. package/types/miniapp-manifest/index.d.ts +1 -0
  43. package/types/miniapp-manifest/node.d.ts +3 -0
  44. package/types/miniapp-manifest/permissions.d.ts +37 -0
  45. package/types/miniapp-manifest/schema.d.ts +5 -0
  46. package/types/vite/index.d.ts +3 -1
  47. package/dist/devtools/browser-dev-host/assets/browser-dev-host-CbhA4h8z.js +0 -97
  48. package/dist/devtools/browser-dev-host/assets/index-DJFB5ySU.css +0 -1
package/dist/index.cjs.js CHANGED
@@ -724,6 +724,20 @@ function isRecord$1(value) {
724
724
  /** 当前用户信息与登录能力支持的完整 scope 目录。 */
725
725
  const USER_INFO_AUTHORIZATION_SCOPES = ['identity', 'profile'];
726
726
 
727
+ const MINI_PROGRAM_PERMISSION_KEYS = [
728
+ 'userInfo',
729
+ 'steamLibrary',
730
+ 'share',
731
+ 'storage',
732
+ 'filesystem',
733
+ 'clipboard',
734
+ 'leaderboard',
735
+ 'network',
736
+ ];
737
+ new Set(MINI_PROGRAM_PERMISSION_KEYS);
738
+
739
+ new Set(MINI_PROGRAM_PERMISSION_KEYS);
740
+
727
741
  /** 获取浏览器全局 window。 */
728
742
  function getGlobalWindow() {
729
743
  return typeof window === 'undefined' ? undefined : window;
@@ -785,7 +799,7 @@ function createMessageId() {
785
799
  /** 构建时替换为当前发布包的实际版本。 */
786
800
  const HB_SDK_VERSION = typeof undefined === 'string'
787
801
  ? undefined
788
- : '0.8.0-alpha.9';
802
+ : '0.8.0';
789
803
 
790
804
  const DEFAULT_TIMEOUT = 10000;
791
805
  const HANDSHAKE_RETRY_INTERVAL = 250;
@@ -3752,7 +3766,91 @@ function createMiniProgramSDK(options) {
3752
3766
  return new MiniProgramSDK(options);
3753
3767
  }
3754
3768
 
3769
+ /**
3770
+ * iframe 与调试台页面的开发期 console 捕获转发。
3771
+ *
3772
+ * 双条件门控(iframe 转发):
3773
+ * 1. 构建期:`hb-sdk dev`(vite serve)注入 `false`;`hb-sdk build` /
3774
+ * `vite build`(生产)永不注入或替换为 `false`,本模块被死代码消除。
3775
+ * 2. 运行期:仅在 `window.name` 为 `__hb_sdk_mini_dev__` 的调试 iframe 中激活,
3776
+ * 用户设备上的正式运行环境没有该标记。
3777
+ *
3778
+ * 无侵入 patch `console.log/debug/info/warn/error`:原样放行(DevTools 不受影响)+
3779
+ * 通过 `window.parent.postMessage` 转发给调试台(CSP 的 connect-src 不约束 postMessage,
3780
+ * 网络上报由调试台页面代理)。发送全程静默:失败不得回打 console,避免自触发死循环。
3781
+ *
3782
+ * 激活时机:由 SDK 默认单例初始化时调用(业务 `import '@heybox/hb-sdk'` 即生效);
3783
+ * iframe 标记由调试台 `iframe.name` 与 vite dev 注入的无依赖 bootstrap 共同设置。
3784
+ * 调试台页面自身(runtime 跑在这里,`[hb-sdk-runtime]` 日志不经过 iframe)另用
3785
+ * `installMiniDevConsoleSelfCapture` 接入「日志」页签(source: 'host')。
3786
+ */
3787
+ const MINI_DEV_IFRAME_WINDOW_NAME = '__hb_sdk_mini_dev__';
3788
+ const MINI_DEV_CONSOLE_EVENT_TYPE = 'hb-sdk:mini-dev-console';
3789
+ /** 调试台页面与 iframe bootstrap 共用的已安装标记(window/console 上的属性名)。 */
3790
+ const MINI_DEV_CONSOLE_INSTALL_FLAG = '__hb_sdk_mini_dev_console_installed__';
3791
+ /** 调试台页面自捕获(source: 'host')与 iframe 转发共用的已安装标记。 */
3792
+ const INSTALL_FLAG = MINI_DEV_CONSOLE_INSTALL_FLAG;
3793
+ function isDevLoggingEnabled() {
3794
+ if (typeof false !== 'undefined' && false !== true) {
3795
+ return false;
3796
+ }
3797
+ return typeof window !== 'undefined' && window.name === MINI_DEV_IFRAME_WINDOW_NAME;
3798
+ }
3799
+ const levels = ['log', 'debug', 'info', 'warn', 'error'];
3800
+ function patchConsoleLevels(consoleRef, deliver, owner) {
3801
+ if (!owner || owner[INSTALL_FLAG] === true) {
3802
+ return false;
3803
+ }
3804
+ let patched = false;
3805
+ for (const level of levels) {
3806
+ const original = consoleRef[level];
3807
+ if (typeof original !== 'function') {
3808
+ continue;
3809
+ }
3810
+ const forward = function (...args) {
3811
+ try {
3812
+ deliver(level, args);
3813
+ }
3814
+ catch {
3815
+ /* 转发失败必须静默,禁止回打 console 造成自触发循环。 */
3816
+ }
3817
+ return original.apply(this, args);
3818
+ };
3819
+ try {
3820
+ consoleRef[level] = forward;
3821
+ patched = true;
3822
+ }
3823
+ catch {
3824
+ return patched;
3825
+ }
3826
+ }
3827
+ if (patched) {
3828
+ owner[INSTALL_FLAG] = true;
3829
+ }
3830
+ return patched;
3831
+ }
3832
+ function installMiniDevConsoleForwarding(consoleRef = console) {
3833
+ if (!isDevLoggingEnabled()) {
3834
+ return;
3835
+ }
3836
+ patchConsoleLevels(consoleRef, (level, args) => {
3837
+ const message = {
3838
+ type: MINI_DEV_CONSOLE_EVENT_TYPE,
3839
+ detail: { level, args, timestamp: Date.now() },
3840
+ };
3841
+ window.parent?.postMessage(message, '*');
3842
+ }, typeof window === 'undefined' ? undefined : window);
3843
+ }
3844
+
3755
3845
  let defaultSDK = createMiniProgramSDK();
3846
+ // 开发期调试台 console 捕获:双条件门控(vite serve 注入 define + 调试 iframe 标记),
3847
+ // 生产构建被死代码消除,正式环境无副作用。失败静默,绝不影响 SDK 初始化。
3848
+ try {
3849
+ installMiniDevConsoleForwarding();
3850
+ }
3851
+ catch {
3852
+ /* 捕获层异常不得阻断 SDK 单例创建。 */
3853
+ }
3756
3854
  function getDefaultSDK() {
3757
3855
  if (!defaultSDK) {
3758
3856
  defaultSDK = createMiniProgramSDK();
package/dist/index.esm.js CHANGED
@@ -720,6 +720,20 @@ function isRecord$1(value) {
720
720
  /** 当前用户信息与登录能力支持的完整 scope 目录。 */
721
721
  const USER_INFO_AUTHORIZATION_SCOPES = ['identity', 'profile'];
722
722
 
723
+ const MINI_PROGRAM_PERMISSION_KEYS = [
724
+ 'userInfo',
725
+ 'steamLibrary',
726
+ 'share',
727
+ 'storage',
728
+ 'filesystem',
729
+ 'clipboard',
730
+ 'leaderboard',
731
+ 'network',
732
+ ];
733
+ new Set(MINI_PROGRAM_PERMISSION_KEYS);
734
+
735
+ new Set(MINI_PROGRAM_PERMISSION_KEYS);
736
+
723
737
  /** 获取浏览器全局 window。 */
724
738
  function getGlobalWindow() {
725
739
  return typeof window === 'undefined' ? undefined : window;
@@ -781,7 +795,7 @@ function createMessageId() {
781
795
  /** 构建时替换为当前发布包的实际版本。 */
782
796
  const HB_SDK_VERSION = typeof undefined === 'string'
783
797
  ? undefined
784
- : '0.8.0-alpha.9';
798
+ : '0.8.0';
785
799
 
786
800
  const DEFAULT_TIMEOUT = 10000;
787
801
  const HANDSHAKE_RETRY_INTERVAL = 250;
@@ -3748,7 +3762,91 @@ function createMiniProgramSDK(options) {
3748
3762
  return new MiniProgramSDK(options);
3749
3763
  }
3750
3764
 
3765
+ /**
3766
+ * iframe 与调试台页面的开发期 console 捕获转发。
3767
+ *
3768
+ * 双条件门控(iframe 转发):
3769
+ * 1. 构建期:`hb-sdk dev`(vite serve)注入 `false`;`hb-sdk build` /
3770
+ * `vite build`(生产)永不注入或替换为 `false`,本模块被死代码消除。
3771
+ * 2. 运行期:仅在 `window.name` 为 `__hb_sdk_mini_dev__` 的调试 iframe 中激活,
3772
+ * 用户设备上的正式运行环境没有该标记。
3773
+ *
3774
+ * 无侵入 patch `console.log/debug/info/warn/error`:原样放行(DevTools 不受影响)+
3775
+ * 通过 `window.parent.postMessage` 转发给调试台(CSP 的 connect-src 不约束 postMessage,
3776
+ * 网络上报由调试台页面代理)。发送全程静默:失败不得回打 console,避免自触发死循环。
3777
+ *
3778
+ * 激活时机:由 SDK 默认单例初始化时调用(业务 `import '@heybox/hb-sdk'` 即生效);
3779
+ * iframe 标记由调试台 `iframe.name` 与 vite dev 注入的无依赖 bootstrap 共同设置。
3780
+ * 调试台页面自身(runtime 跑在这里,`[hb-sdk-runtime]` 日志不经过 iframe)另用
3781
+ * `installMiniDevConsoleSelfCapture` 接入「日志」页签(source: 'host')。
3782
+ */
3783
+ const MINI_DEV_IFRAME_WINDOW_NAME = '__hb_sdk_mini_dev__';
3784
+ const MINI_DEV_CONSOLE_EVENT_TYPE = 'hb-sdk:mini-dev-console';
3785
+ /** 调试台页面与 iframe bootstrap 共用的已安装标记(window/console 上的属性名)。 */
3786
+ const MINI_DEV_CONSOLE_INSTALL_FLAG = '__hb_sdk_mini_dev_console_installed__';
3787
+ /** 调试台页面自捕获(source: 'host')与 iframe 转发共用的已安装标记。 */
3788
+ const INSTALL_FLAG = MINI_DEV_CONSOLE_INSTALL_FLAG;
3789
+ function isDevLoggingEnabled() {
3790
+ if (typeof false !== 'undefined' && false !== true) {
3791
+ return false;
3792
+ }
3793
+ return typeof window !== 'undefined' && window.name === MINI_DEV_IFRAME_WINDOW_NAME;
3794
+ }
3795
+ const levels = ['log', 'debug', 'info', 'warn', 'error'];
3796
+ function patchConsoleLevels(consoleRef, deliver, owner) {
3797
+ if (!owner || owner[INSTALL_FLAG] === true) {
3798
+ return false;
3799
+ }
3800
+ let patched = false;
3801
+ for (const level of levels) {
3802
+ const original = consoleRef[level];
3803
+ if (typeof original !== 'function') {
3804
+ continue;
3805
+ }
3806
+ const forward = function (...args) {
3807
+ try {
3808
+ deliver(level, args);
3809
+ }
3810
+ catch {
3811
+ /* 转发失败必须静默,禁止回打 console 造成自触发循环。 */
3812
+ }
3813
+ return original.apply(this, args);
3814
+ };
3815
+ try {
3816
+ consoleRef[level] = forward;
3817
+ patched = true;
3818
+ }
3819
+ catch {
3820
+ return patched;
3821
+ }
3822
+ }
3823
+ if (patched) {
3824
+ owner[INSTALL_FLAG] = true;
3825
+ }
3826
+ return patched;
3827
+ }
3828
+ function installMiniDevConsoleForwarding(consoleRef = console) {
3829
+ if (!isDevLoggingEnabled()) {
3830
+ return;
3831
+ }
3832
+ patchConsoleLevels(consoleRef, (level, args) => {
3833
+ const message = {
3834
+ type: MINI_DEV_CONSOLE_EVENT_TYPE,
3835
+ detail: { level, args, timestamp: Date.now() },
3836
+ };
3837
+ window.parent?.postMessage(message, '*');
3838
+ }, typeof window === 'undefined' ? undefined : window);
3839
+ }
3840
+
3751
3841
  let defaultSDK = createMiniProgramSDK();
3842
+ // 开发期调试台 console 捕获:双条件门控(vite serve 注入 define + 调试 iframe 标记),
3843
+ // 生产构建被死代码消除,正式环境无副作用。失败静默,绝不影响 SDK 初始化。
3844
+ try {
3845
+ installMiniDevConsoleForwarding();
3846
+ }
3847
+ catch {
3848
+ /* 捕获层异常不得阻断 SDK 单例创建。 */
3849
+ }
3752
3850
  function getDefaultSDK() {
3753
3851
  if (!defaultSDK) {
3754
3852
  defaultSDK = createMiniProgramSDK();
@@ -42,135 +42,249 @@ const CLOUD_LEADERBOARD_GET_CURRENT_USER_ENTRY_METHOD = 'cloud.leaderboard.getCu
42
42
  const CLOUD_LEADERBOARD_DELETE_CURRENT_USER_ENTRY_METHOD = 'cloud.leaderboard.deleteCurrentUserEntry';
43
43
  const CLOUD_LEADERBOARD_GET_INFO_METHOD = 'cloud.leaderboard.getInfo';
44
44
  const MINI_PROGRAM_PROTOCOL_CAPABILITIES = [
45
- { method: AUTH_LOGIN_METHOD, module: 'auth', capability: AUTH_LOGIN_METHOD, permission: 'auth.login', risk: 'medium' },
46
- { method: USER_GET_INFO_METHOD, module: 'user', capability: USER_GET_INFO_METHOD, permission: 'user.getInfo', risk: 'medium' },
45
+ {
46
+ method: AUTH_LOGIN_METHOD,
47
+ module: 'auth',
48
+ capability: AUTH_LOGIN_METHOD,
49
+ requirement: { kind: 'all', permissions: ['userInfo'] },
50
+ risk: 'medium',
51
+ },
52
+ {
53
+ method: USER_GET_INFO_METHOD,
54
+ module: 'user',
55
+ capability: USER_GET_INFO_METHOD,
56
+ requirement: { kind: 'all', permissions: ['userInfo'] },
57
+ risk: 'medium',
58
+ },
47
59
  {
48
60
  method: USER_REVOKE_AUTHORIZATION_METHOD,
49
61
  module: 'user',
50
62
  capability: USER_REVOKE_AUTHORIZATION_METHOD,
51
- permission: 'user.revokeAuthorization',
63
+ requirement: { kind: 'none' },
52
64
  risk: 'high',
53
65
  },
54
66
  {
55
67
  method: USER_GET_STEAM_GAME_LIST_METHOD,
56
68
  module: 'user',
57
69
  capability: USER_GET_STEAM_GAME_LIST_METHOD,
58
- permission: 'user.platformAccount.steam',
70
+ requirement: { kind: 'all', permissions: ['steamLibrary'] },
59
71
  risk: 'high',
60
72
  },
61
- { method: SHARE_COPY_LINK_METHOD, module: 'share', capability: SHARE_COPY_LINK_METHOD, permission: 'share.copyLink', risk: 'medium' },
62
- { method: SHARE_SHOW_SHARE_MENU_METHOD, module: 'share', capability: SHARE_SHOW_SHARE_MENU_METHOD, permission: 'share.basic', risk: 'low' },
63
- { method: SHARE_SCREENSHOT_METHOD, module: 'share', capability: SHARE_SCREENSHOT_METHOD, permission: 'share.screenshot', risk: 'medium' },
73
+ {
74
+ method: SHARE_COPY_LINK_METHOD,
75
+ module: 'share',
76
+ capability: SHARE_COPY_LINK_METHOD,
77
+ requirement: { kind: 'all', permissions: ['share'] },
78
+ risk: 'medium',
79
+ },
80
+ {
81
+ method: SHARE_SHOW_SHARE_MENU_METHOD,
82
+ module: 'share',
83
+ capability: SHARE_SHOW_SHARE_MENU_METHOD,
84
+ requirement: { kind: 'all', permissions: ['share'] },
85
+ risk: 'low',
86
+ },
87
+ {
88
+ method: SHARE_SCREENSHOT_METHOD,
89
+ module: 'share',
90
+ capability: SHARE_SCREENSHOT_METHOD,
91
+ requirement: { kind: 'all', permissions: ['share'] },
92
+ risk: 'medium',
93
+ },
64
94
  {
65
95
  method: VIEWPORT_GET_WINDOW_INFO_METHOD,
66
96
  module: 'viewport',
67
97
  capability: VIEWPORT_GET_WINDOW_INFO_METHOD,
68
- permission: 'viewport.windowInfo',
98
+ requirement: { kind: 'none' },
69
99
  risk: 'low',
70
100
  },
71
101
  {
72
102
  method: VIEWPORT_SET_NAVIGATION_BAR_STYLE_METHOD,
73
103
  module: 'viewport',
74
104
  capability: VIEWPORT_SET_NAVIGATION_BAR_STYLE_METHOD,
75
- permission: 'viewport.navigationBarStyle',
105
+ requirement: { kind: 'none' },
76
106
  risk: 'low',
77
107
  },
78
- { method: STORAGE_GET_STORAGE_METHOD, module: 'storage', capability: STORAGE_GET_STORAGE_METHOD, permission: 'storage.read', risk: 'low' },
79
- { method: STORAGE_SET_STORAGE_METHOD, module: 'storage', capability: STORAGE_SET_STORAGE_METHOD, permission: 'storage.write', risk: 'medium' },
80
- { method: NETWORK_REQUEST_METHOD, module: 'network', capability: NETWORK_REQUEST_METHOD, permission: 'network.request', risk: 'high' },
81
- { method: NETWORK_DOWNLOAD_METHOD, module: 'network', capability: NETWORK_DOWNLOAD_METHOD, permission: 'network.request', risk: 'high' },
82
- { method: FILES_PICK_FILES_METHOD, module: 'files', capability: FILES_PICK_FILES_METHOD, permission: 'files.external', risk: 'high' },
108
+ {
109
+ method: STORAGE_GET_STORAGE_METHOD,
110
+ module: 'storage',
111
+ capability: STORAGE_GET_STORAGE_METHOD,
112
+ requirement: { kind: 'all', permissions: ['storage'] },
113
+ risk: 'low',
114
+ },
115
+ {
116
+ method: STORAGE_SET_STORAGE_METHOD,
117
+ module: 'storage',
118
+ capability: STORAGE_SET_STORAGE_METHOD,
119
+ requirement: { kind: 'all', permissions: ['storage'] },
120
+ risk: 'medium',
121
+ },
122
+ {
123
+ method: NETWORK_REQUEST_METHOD,
124
+ module: 'network',
125
+ capability: NETWORK_REQUEST_METHOD,
126
+ requirement: { kind: 'all', permissions: ['network'] },
127
+ risk: 'high',
128
+ },
129
+ {
130
+ method: NETWORK_DOWNLOAD_METHOD,
131
+ module: 'network',
132
+ capability: NETWORK_DOWNLOAD_METHOD,
133
+ requirement: { kind: 'all', permissions: ['network', 'filesystem'] },
134
+ risk: 'high',
135
+ },
136
+ {
137
+ method: FILES_PICK_FILES_METHOD,
138
+ module: 'files',
139
+ capability: FILES_PICK_FILES_METHOD,
140
+ requirement: { kind: 'all', permissions: ['filesystem'] },
141
+ risk: 'high',
142
+ },
83
143
  {
84
144
  method: FILES_PICK_DIRECTORY_METHOD,
85
145
  module: 'files',
86
146
  capability: FILES_PICK_DIRECTORY_METHOD,
87
- permission: 'files.external',
147
+ requirement: { kind: 'all', permissions: ['filesystem'] },
148
+ risk: 'high',
149
+ },
150
+ {
151
+ method: FILES_SAVE_FILE_METHOD,
152
+ module: 'files',
153
+ capability: FILES_SAVE_FILE_METHOD,
154
+ requirement: { kind: 'all', permissions: ['filesystem'] },
155
+ risk: 'high',
156
+ },
157
+ {
158
+ method: FILE_CREATE_METHOD,
159
+ module: 'file',
160
+ capability: FILE_CREATE_METHOD,
161
+ requirement: { kind: 'all', permissions: ['filesystem'] },
162
+ risk: 'high',
163
+ },
164
+ {
165
+ method: FILE_REMOVE_METHOD,
166
+ module: 'file',
167
+ capability: FILE_REMOVE_METHOD,
168
+ requirement: { kind: 'all', permissions: ['filesystem'] },
88
169
  risk: 'high',
89
170
  },
90
- { method: FILES_SAVE_FILE_METHOD, module: 'files', capability: FILES_SAVE_FILE_METHOD, permission: 'files.external', risk: 'high' },
91
- { method: FILE_CREATE_METHOD, module: 'file', capability: FILE_CREATE_METHOD, permission: 'files.access', risk: 'high' },
92
- { method: FILE_REMOVE_METHOD, module: 'file', capability: FILE_REMOVE_METHOD, permission: 'files.access', risk: 'high' },
93
- { method: FILE_EXISTS_METHOD, module: 'file', capability: FILE_EXISTS_METHOD, permission: 'files.access', risk: 'high' },
94
- { method: FILE_READ_TEXT_METHOD, module: 'file', capability: FILE_READ_TEXT_METHOD, permission: 'files.access', risk: 'high' },
95
- { method: FILE_WRITE_TEXT_METHOD, module: 'file', capability: FILE_WRITE_TEXT_METHOD, permission: 'files.access', risk: 'high' },
96
- { method: FILE_READ_BYTES_METHOD, module: 'file', capability: FILE_READ_BYTES_METHOD, permission: 'files.access', risk: 'high' },
97
- { method: FILE_WRITE_BYTES_METHOD, module: 'file', capability: FILE_WRITE_BYTES_METHOD, permission: 'files.access', risk: 'high' },
98
- { method: FILE_STAT_METHOD, module: 'file', capability: FILE_STAT_METHOD, permission: 'files.access', risk: 'high' },
171
+ {
172
+ method: FILE_EXISTS_METHOD,
173
+ module: 'file',
174
+ capability: FILE_EXISTS_METHOD,
175
+ requirement: { kind: 'all', permissions: ['filesystem'] },
176
+ risk: 'high',
177
+ },
178
+ {
179
+ method: FILE_READ_TEXT_METHOD,
180
+ module: 'file',
181
+ capability: FILE_READ_TEXT_METHOD,
182
+ requirement: { kind: 'all', permissions: ['filesystem'] },
183
+ risk: 'high',
184
+ },
185
+ {
186
+ method: FILE_WRITE_TEXT_METHOD,
187
+ module: 'file',
188
+ capability: FILE_WRITE_TEXT_METHOD,
189
+ requirement: { kind: 'all', permissions: ['filesystem'] },
190
+ risk: 'high',
191
+ },
192
+ {
193
+ method: FILE_READ_BYTES_METHOD,
194
+ module: 'file',
195
+ capability: FILE_READ_BYTES_METHOD,
196
+ requirement: { kind: 'all', permissions: ['filesystem'] },
197
+ risk: 'high',
198
+ },
199
+ {
200
+ method: FILE_WRITE_BYTES_METHOD,
201
+ module: 'file',
202
+ capability: FILE_WRITE_BYTES_METHOD,
203
+ requirement: { kind: 'all', permissions: ['filesystem'] },
204
+ risk: 'high',
205
+ },
206
+ { method: FILE_STAT_METHOD, module: 'file', capability: FILE_STAT_METHOD, requirement: { kind: 'all', permissions: ['filesystem'] }, risk: 'high' },
99
207
  {
100
208
  method: DIRECTORY_CREATE_METHOD,
101
209
  module: 'directory',
102
210
  capability: DIRECTORY_CREATE_METHOD,
103
- permission: 'files.access',
211
+ requirement: { kind: 'all', permissions: ['filesystem'] },
104
212
  risk: 'high',
105
213
  },
106
214
  {
107
215
  method: DIRECTORY_REMOVE_METHOD,
108
216
  module: 'directory',
109
217
  capability: DIRECTORY_REMOVE_METHOD,
110
- permission: 'files.access',
218
+ requirement: { kind: 'all', permissions: ['filesystem'] },
111
219
  risk: 'high',
112
220
  },
113
221
  {
114
222
  method: DIRECTORY_EXISTS_METHOD,
115
223
  module: 'directory',
116
224
  capability: DIRECTORY_EXISTS_METHOD,
117
- permission: 'files.access',
225
+ requirement: { kind: 'all', permissions: ['filesystem'] },
226
+ risk: 'high',
227
+ },
228
+ {
229
+ method: DIRECTORY_LIST_METHOD,
230
+ module: 'directory',
231
+ capability: DIRECTORY_LIST_METHOD,
232
+ requirement: { kind: 'all', permissions: ['filesystem'] },
118
233
  risk: 'high',
119
234
  },
120
- { method: DIRECTORY_LIST_METHOD, module: 'directory', capability: DIRECTORY_LIST_METHOD, permission: 'files.access', risk: 'high' },
121
- { method: UI_SHOW_TOAST_METHOD, module: 'ui', capability: UI_SHOW_TOAST_METHOD, permission: 'ui.toast', risk: 'low' },
122
- { method: UI_SHOW_LOADING_METHOD, module: 'ui', capability: UI_SHOW_LOADING_METHOD, permission: 'ui.loading', risk: 'low' },
123
- { method: UI_HIDE_LOADING_METHOD, module: 'ui', capability: UI_HIDE_LOADING_METHOD, permission: 'ui.loading', risk: 'low' },
124
- { method: DEVICE_VIBRATE_METHOD, module: 'device', capability: DEVICE_VIBRATE_METHOD, permission: 'device.vibrate', risk: 'low' },
235
+ { method: UI_SHOW_TOAST_METHOD, module: 'ui', capability: UI_SHOW_TOAST_METHOD, requirement: { kind: 'none' }, risk: 'low' },
236
+ { method: UI_SHOW_LOADING_METHOD, module: 'ui', capability: UI_SHOW_LOADING_METHOD, requirement: { kind: 'none' }, risk: 'low' },
237
+ { method: UI_HIDE_LOADING_METHOD, module: 'ui', capability: UI_HIDE_LOADING_METHOD, requirement: { kind: 'none' }, risk: 'low' },
238
+ { method: DEVICE_VIBRATE_METHOD, module: 'device', capability: DEVICE_VIBRATE_METHOD, requirement: { kind: 'none' }, risk: 'low' },
125
239
  {
126
240
  method: DEVICE_SET_CLIPBOARD_METHOD,
127
241
  module: 'device',
128
242
  capability: DEVICE_SET_CLIPBOARD_METHOD,
129
- permission: 'device.clipboard.write',
243
+ requirement: { kind: 'all', permissions: ['clipboard'] },
130
244
  risk: 'medium',
131
245
  },
132
- { method: NAVIGATION_CLOSE_METHOD, module: 'navigation', capability: NAVIGATION_CLOSE_METHOD, permission: 'navigation.close', risk: 'medium' },
133
- { method: NAVIGATION_RELOAD_METHOD, module: 'navigation', capability: NAVIGATION_RELOAD_METHOD, permission: 'navigation.reload', risk: 'medium' },
246
+ { method: NAVIGATION_CLOSE_METHOD, module: 'navigation', capability: NAVIGATION_CLOSE_METHOD, requirement: { kind: 'none' }, risk: 'medium' },
247
+ { method: NAVIGATION_RELOAD_METHOD, module: 'navigation', capability: NAVIGATION_RELOAD_METHOD, requirement: { kind: 'none' }, risk: 'medium' },
134
248
  {
135
249
  method: NAVIGATION_OPEN_APP_PAGE_METHOD,
136
250
  module: 'navigation',
137
251
  capability: NAVIGATION_OPEN_APP_PAGE_METHOD,
138
- permission: 'navigation.openAppPage',
252
+ requirement: { kind: 'none' },
139
253
  risk: 'medium',
140
254
  },
141
255
  {
142
256
  method: CLOUD_LEADERBOARD_SUBMIT_METHOD,
143
257
  module: 'cloud',
144
258
  capability: CLOUD_LEADERBOARD_SUBMIT_METHOD,
145
- permission: 'cloud.leaderboard.write',
259
+ requirement: { kind: 'all', permissions: ['leaderboard'] },
146
260
  risk: 'medium',
147
261
  },
148
262
  {
149
263
  method: CLOUD_LEADERBOARD_GET_LIST_METHOD,
150
264
  module: 'cloud',
151
265
  capability: CLOUD_LEADERBOARD_GET_LIST_METHOD,
152
- permission: 'cloud.leaderboard.read',
266
+ requirement: { kind: 'all', permissions: ['leaderboard'] },
153
267
  risk: 'low',
154
268
  },
155
269
  {
156
270
  method: CLOUD_LEADERBOARD_GET_CURRENT_USER_ENTRY_METHOD,
157
271
  module: 'cloud',
158
272
  capability: CLOUD_LEADERBOARD_GET_CURRENT_USER_ENTRY_METHOD,
159
- permission: 'cloud.leaderboard.currentUserEntry.read',
273
+ requirement: { kind: 'all', permissions: ['leaderboard'] },
160
274
  risk: 'medium',
161
275
  },
162
276
  {
163
277
  method: CLOUD_LEADERBOARD_DELETE_CURRENT_USER_ENTRY_METHOD,
164
278
  module: 'cloud',
165
279
  capability: CLOUD_LEADERBOARD_DELETE_CURRENT_USER_ENTRY_METHOD,
166
- permission: 'cloud.leaderboard.currentUserEntry.delete',
280
+ requirement: { kind: 'all', permissions: ['leaderboard'] },
167
281
  risk: 'medium',
168
282
  },
169
283
  {
170
284
  method: CLOUD_LEADERBOARD_GET_INFO_METHOD,
171
285
  module: 'cloud',
172
286
  capability: CLOUD_LEADERBOARD_GET_INFO_METHOD,
173
- permission: 'cloud.leaderboard.info.read',
287
+ requirement: { kind: 'all', permissions: ['leaderboard'] },
174
288
  risk: 'low',
175
289
  },
176
290
  ];
@@ -315,7 +429,19 @@ function isRecord$1(value) {
315
429
  /** 当前用户信息与登录能力支持的完整 scope 目录。 */
316
430
  const USER_INFO_AUTHORIZATION_SCOPES = ['identity', 'profile'];
317
431
 
318
- const MANAGED_RUNTIME_PERMISSION_KEYS = new Set(['network.request']);
432
+ const MINI_PROGRAM_PERMISSION_KEYS = [
433
+ 'userInfo',
434
+ 'steamLibrary',
435
+ 'share',
436
+ 'storage',
437
+ 'filesystem',
438
+ 'clipboard',
439
+ 'leaderboard',
440
+ 'network',
441
+ ];
442
+ new Set(MINI_PROGRAM_PERMISSION_KEYS);
443
+
444
+ const MANAGED_RUNTIME_PERMISSION_KEYS = new Set(MINI_PROGRAM_PERMISSION_KEYS);
319
445
  function isManagedMiniProgramRuntimePermissionKey(key) {
320
446
  return MANAGED_RUNTIME_PERMISSION_KEYS.has(key);
321
447
  }
@@ -332,20 +458,36 @@ function parseMiniProgramRuntimePermissions(snapshot) {
332
458
  if (!isRecord(rawEntry) || typeof rawEntry.key !== 'string' || !rawEntry.key.trim()) {
333
459
  return { valid: false, permissions: {} };
334
460
  }
335
- const key = rawEntry.key.trim();
336
- if (seenKeys.has(key) || (rawEntry.status !== 'enabled' && rawEntry.status !== 'disabled') || !isRecord(rawEntry.config)) {
461
+ const inputKey = rawEntry.key.trim();
462
+ const key = inputKey === 'network.request' ? 'network' : inputKey;
463
+ if (seenKeys.has(key) || (rawEntry.status !== 'enabled' && rawEntry.status !== 'disabled')) {
337
464
  return { valid: false, permissions: {} };
338
465
  }
339
466
  seenKeys.add(key);
340
- if (!isManagedMiniProgramRuntimePermissionKey(key))
467
+ if (!isManagedMiniProgramRuntimePermissionKey(key)) {
468
+ if (!isRecord(rawEntry.config))
469
+ return { valid: false, permissions: {} };
470
+ continue;
471
+ }
472
+ if (key === 'network') {
473
+ const config = rawEntry.config;
474
+ if (!isRecord(config) || typeof config.useOfficialDomain !== 'boolean') {
475
+ return { valid: false, permissions: {} };
476
+ }
477
+ permissions[key] = {
478
+ key,
479
+ status: rawEntry.status,
480
+ config: { useOfficialDomain: config.useOfficialDomain },
481
+ };
341
482
  continue;
342
- if (key === 'network.request' && typeof rawEntry.config.useOfficialDomain !== 'boolean') {
483
+ }
484
+ if (rawEntry.config !== null && rawEntry.config !== undefined && (!isRecord(rawEntry.config) || Object.keys(rawEntry.config).length > 0)) {
343
485
  return { valid: false, permissions: {} };
344
486
  }
345
487
  permissions[key] = {
346
488
  key,
347
489
  status: rawEntry.status,
348
- config: { useOfficialDomain: rawEntry.config.useOfficialDomain },
490
+ config: {},
349
491
  };
350
492
  }
351
493
  return { valid: true, permissions };