@heybox/hb-sdk 0.3.3 → 0.4.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 (35) hide show
  1. package/README.md +63 -28
  2. package/dist/cli-chunks/browser-RAy8e8cV.cjs +635 -0
  3. package/dist/cli-chunks/create-D1j9UnM7.cjs +1376 -0
  4. package/dist/cli-chunks/deploy-CknDDoS_.cjs +3730 -0
  5. package/dist/cli-chunks/dev-BS9h09yG.cjs +955 -0
  6. package/dist/cli-chunks/doctor-WTl1HCW0.cjs +186 -0
  7. package/dist/cli-chunks/index-io4h3kr-.cjs +13348 -0
  8. package/dist/cli-chunks/index-yjJgBEBF.cjs +64023 -0
  9. package/dist/cli-chunks/login-B-A53Sta.cjs +193 -0
  10. package/dist/cli-chunks/session-CMBN3o9z.cjs +3040 -0
  11. package/dist/cli.cjs +19 -77707
  12. package/dist/devtools/mock-host/index.html +62 -2
  13. package/dist/devtools/mock-host/main.js +3246 -20
  14. package/dist/index.cjs.js +20 -0
  15. package/dist/index.esm.js +20 -0
  16. package/dist/miniapp-publish.cjs.js +2810 -4
  17. package/dist/miniapp-publish.esm.js +2809 -4
  18. package/dist/protocol.cjs.js +15 -0
  19. package/dist/protocol.esm.js +15 -1
  20. package/dist/templates/vue3-vite-ts/README.md.ejs +2 -2
  21. package/dist/vite.cjs.js +2814 -14
  22. package/dist/vite.esm.js +2814 -14
  23. package/package.json +6 -1
  24. package/skill/SKILL.md +19 -13
  25. package/skill/references/api-protocol.md +7 -2
  26. package/skill/references/api-root.md +24 -13
  27. package/skill/references/cli.md +335 -104
  28. package/skill/scripts/sync-references.mjs +17 -1
  29. package/skill/skill.json +4 -4
  30. package/types/index.d.ts +1 -1
  31. package/types/miniapp-manifest/schema.d.ts +2 -1
  32. package/types/miniapp-publish/index.d.ts +2 -1
  33. package/types/modules/viewport/index.d.ts +33 -0
  34. package/types/protocol/capabilities.d.ts +17 -2
  35. package/types/protocol.d.ts +2 -2
@@ -0,0 +1,193 @@
1
+ 'use strict';
2
+
3
+ var node_crypto = require('node:crypto');
4
+ var node_http = require('node:http');
5
+ var session = require('./session-CMBN3o9z.cjs');
6
+ var browser = require('./browser-RAy8e8cV.cjs');
7
+ var index = require('./index-io4h3kr-.cjs');
8
+ require('node:path');
9
+ require('fs');
10
+ require('constants');
11
+ require('stream');
12
+ require('util');
13
+ require('assert');
14
+ require('path');
15
+ require('node:process');
16
+ require('node:buffer');
17
+ require('node:url');
18
+ require('node:util');
19
+ require('node:child_process');
20
+ require('node:fs/promises');
21
+ require('node:os');
22
+ require('node:fs');
23
+ require('node:module');
24
+ require('os');
25
+ require('readline');
26
+ require('tty');
27
+ require('events');
28
+ require('buffer');
29
+
30
+ const HEYBOX_CALLBACK_HOST = '127.0.0.1';
31
+ const HEYBOX_CALLBACK_PATH = '/heybox/callback';
32
+ const HEYBOX_CALLBACK_DONE_PATH = '/heybox/callback/done';
33
+ const DEFAULT_HEYBOX_CALLBACK_TIMEOUT_MS = 5 * 60 * 1000;
34
+ function createHeyboxLoginUrl(callbackUrl, state, options = {}) {
35
+ const url = new URL(session.resolveHeyboxLoginBaseUrl(options));
36
+ url.searchParams.set('mode', 'cli');
37
+ url.searchParams.set('redirect_url', callbackUrl);
38
+ url.searchParams.set('state', state);
39
+ return url.toString();
40
+ }
41
+ function parseHeyboxCallbackUrl(rawUrl, expectedState) {
42
+ const url = new URL(rawUrl, `http://${HEYBOX_CALLBACK_HOST}`);
43
+ if (url.pathname !== HEYBOX_CALLBACK_PATH) {
44
+ throw new Error('Heybox 登录回调路径不正确');
45
+ }
46
+ if (readRequiredQueryParam(url, 'state') !== expectedState) {
47
+ throw new Error('Heybox 登录回调 state 校验失败');
48
+ }
49
+ return {
50
+ heyboxId: readRequiredQueryParam(url, 'heybox_id'),
51
+ pkey: readRequiredQueryParam(url, 'pkey'),
52
+ xXhhHeyboxId: readRequiredQueryParam(url, 'x_xhh_heyboxid'),
53
+ };
54
+ }
55
+ async function waitForHeyboxBrowserCallback(options = {}) {
56
+ const expectedState = node_crypto.randomBytes(16).toString('hex');
57
+ const timeoutMs = options.timeoutMs ?? DEFAULT_HEYBOX_CALLBACK_TIMEOUT_MS;
58
+ const openBrowser = options.openBrowser ?? browser.openExternalUrl;
59
+ let timer = null;
60
+ const loginCallback = {};
61
+ const server = node_http.createServer((request, response) => {
62
+ try {
63
+ const requestUrl = new URL(request.url, `http://${HEYBOX_CALLBACK_HOST}`);
64
+ if (requestUrl.pathname === HEYBOX_CALLBACK_DONE_PATH) {
65
+ sendBrowserResponse(response, 200, 'Heybox 登录成功,可以回到终端继续。');
66
+ return;
67
+ }
68
+ const callbackPayload = parseHeyboxCallbackUrl(request.url, expectedState);
69
+ redirectToCleanCallbackPage(response, () => loginCallback.resolve(callbackPayload));
70
+ }
71
+ catch (error) {
72
+ sendBrowserResponse(response, 400, `Heybox 登录失败: ${index.readErrorMessage(error)}`);
73
+ loginCallback.reject(error);
74
+ }
75
+ });
76
+ try {
77
+ const payload = await new Promise((resolve, reject) => {
78
+ loginCallback.resolve = resolve;
79
+ loginCallback.reject = reject;
80
+ server.once('error', reject);
81
+ server.listen(0, HEYBOX_CALLBACK_HOST, () => {
82
+ void handleServerListening(server, expectedState, {
83
+ loginBaseUrl: options.loginBaseUrl,
84
+ onBrowserOpenResult: options.onBrowserOpenResult,
85
+ onLoginUrl: options.onLoginUrl,
86
+ openBrowser,
87
+ }).catch(reject);
88
+ });
89
+ timer = setTimeout(() => {
90
+ reject(new Error('Heybox 浏览器登录超时,请重新运行 hb-sdk login'));
91
+ }, timeoutMs);
92
+ });
93
+ return payload;
94
+ }
95
+ finally {
96
+ if (timer) {
97
+ clearTimeout(timer);
98
+ }
99
+ await closeServer(server);
100
+ }
101
+ }
102
+ async function handleServerListening(server, expectedState, options) {
103
+ const address = server.address();
104
+ const callbackUrl = new URL(`http://${HEYBOX_CALLBACK_HOST}:${address.port}${HEYBOX_CALLBACK_PATH}`);
105
+ callbackUrl.searchParams.set('state', expectedState);
106
+ const loginUrl = createHeyboxLoginUrl(callbackUrl.toString(), expectedState, { loginBaseUrl: options.loginBaseUrl });
107
+ options.onLoginUrl?.(loginUrl);
108
+ const opened = await options.openBrowser(loginUrl).catch(() => false);
109
+ options.onBrowserOpenResult?.(opened, loginUrl);
110
+ }
111
+ function readRequiredQueryParam(url, name) {
112
+ const value = url.searchParams.get(name)?.trim() || '';
113
+ if (!value) {
114
+ throw new Error(`Heybox 登录回调缺少 ${name}`);
115
+ }
116
+ return value;
117
+ }
118
+ function sendBrowserResponse(response, statusCode, message) {
119
+ response.writeHead(statusCode, {
120
+ 'Content-Type': 'text/html; charset=utf-8',
121
+ });
122
+ response.end(`<!doctype html><meta charset="utf-8"><title>hb-sdk Heybox 登录</title><body>${message}</body>`);
123
+ }
124
+ function redirectToCleanCallbackPage(response, onSent) {
125
+ response.writeHead(302, {
126
+ Location: HEYBOX_CALLBACK_DONE_PATH,
127
+ 'Cache-Control': 'no-store',
128
+ });
129
+ response.end(onSent);
130
+ }
131
+ function closeServer(server) {
132
+ return new Promise((resolve) => {
133
+ server.close(() => resolve());
134
+ });
135
+ }
136
+
137
+ async function loginToHeybox(options = {}) {
138
+ const logger = options.logger ?? index.createCliLogger();
139
+ const waitForBrowserCallback = options.waitForBrowserCallback ?? waitForHeyboxBrowserCallback;
140
+ const env = options.env ?? process.env;
141
+ const loginBaseUrl = session.resolveHeyboxLoginBaseUrl({ ...options, env });
142
+ logger.section('Heybox 浏览器登录');
143
+ logger.debug(`登录入口环境: ${loginBaseUrl}`);
144
+ const payload = await logger.task('等待浏览器登录回调', () => waitForBrowserCallback({
145
+ loginBaseUrl,
146
+ openBrowser: options.openBrowser,
147
+ onLoginUrl(loginUrl) {
148
+ logger.debug(`浏览器入口: ${loginUrl}`);
149
+ logger.info('请在打开的页面完成登录,成功后 hb-sdk 会自动接收登录态。');
150
+ },
151
+ onBrowserOpenResult(opened, loginUrl) {
152
+ if (opened) {
153
+ logger.success('已打开 Heybox 登录页');
154
+ return;
155
+ }
156
+ logger.warn('当前环境无法直接打开浏览器');
157
+ logger.info('请打开这个链接完成 Heybox 登录:');
158
+ logger.info(loginUrl);
159
+ },
160
+ timeoutMs: options.timeoutMs,
161
+ }), { successText: '已接收 Heybox 登录态' });
162
+ const session$1 = session.createHeyboxAuthSession(payload, { ...options, loginBaseUrl });
163
+ await session.writeHeyboxAuthSession(session$1, options);
164
+ logger.success(`Heybox 登录成功:${session$1.heyboxId}`);
165
+ logger.debug(`cache: ${session.getAuthCacheFilePath(options)}`);
166
+ logger.info('验证命令: hb-sdk login status');
167
+ }
168
+ async function printLoginStatus(options = {}) {
169
+ const logger = options.logger ?? index.createCliLogger();
170
+ const status = await session.readRedactedHeyboxAuthStatus(options);
171
+ logger.section('Heybox 登录态');
172
+ if (!status.loggedIn) {
173
+ logger.warn('未登录');
174
+ logger.info('下一步: hb-sdk login');
175
+ logger.debug(`cache: ${status.cacheFile}`);
176
+ return;
177
+ }
178
+ logger.success('已登录');
179
+ logger.info(`heyboxId: ${status.heyboxId}`);
180
+ logger.info(`loginBaseUrl: ${status.loginBaseUrl}`);
181
+ logger.info(`loggedInAt: ${status.loggedInAt}`);
182
+ logger.debug(`cache: ${status.cacheFile}`);
183
+ }
184
+ async function clearLoginStatus(options = {}) {
185
+ const logger = options.logger ?? index.createCliLogger();
186
+ await session.clearHeyboxAuthSession(options);
187
+ logger.success('已清理 Heybox 登录态');
188
+ logger.debug(`cache: ${session.getAuthCacheFilePath(options)}`);
189
+ }
190
+
191
+ exports.clearLoginStatus = clearLoginStatus;
192
+ exports.loginToHeybox = loginToHeybox;
193
+ exports.printLoginStatus = printLoginStatus;