@heybox/hb-sdk 0.6.2 → 0.6.4-alpha.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.
- package/README.md +5 -3
- package/dist/cli-chunks/{context-DmxbC_iV.cjs → context-BCwksd8H.cjs} +1 -37
- package/dist/cli-chunks/{create-CXBnqr5r.cjs → create-BO8GHVi0.cjs} +1 -1
- package/dist/cli-chunks/{dev-OCij_ecL.cjs → dev-DmgKnEC2.cjs} +59 -133
- package/dist/cli-chunks/{doctor-DQIzL_3_.cjs → doctor-BlKB4f78.cjs} +1 -1
- package/dist/cli-chunks/{index-Ulhxo0YK.cjs → index-PxkpQ5of.cjs} +2 -2
- package/dist/cli-chunks/{index-CTyguEza.cjs → index-Q0G1SsEs.cjs} +13 -13
- package/dist/cli-chunks/{login-BWN2-2Gk.cjs → login-Cxdo4B6Z.cjs} +2 -2
- package/dist/cli-chunks/{remote-DxKtJ21x.cjs → remote-C1Rsb1dx.cjs} +5 -5
- package/dist/cli-chunks/{session-D7mPwyx4.cjs → session-CC3Oz3Xc.cjs} +1 -2
- package/dist/cli.cjs +1 -1
- package/dist/devtools/mock-host/index.html +54 -1
- package/dist/devtools/mock-host/main.js +196 -6
- package/dist/index.cjs.js +1 -1
- package/dist/index.esm.js +1 -1
- package/dist/miniapp-publish.cjs.js +0 -4
- package/dist/miniapp-publish.esm.js +1 -4
- package/dist/vite.cjs.js +2 -344
- package/dist/vite.esm.js +2 -344
- package/package.json +2 -2
- package/skill/SKILL.md +5 -3
- package/skill/references/api-root.md +6 -26
- package/skill/references/cli.md +7 -5
- package/skill/skill.json +4 -4
- package/types/miniapp-publish/index.d.ts +0 -1
- package/types/vite/index.d.ts +1 -7
- package/types/cli/auth/base-url.d.ts +0 -20
- package/types/cli/config.d.ts +0 -11
- package/types/miniapp-manifest/sdk-version-policy.d.ts +0 -9
- package/types/vite/sdk-version-gate.d.ts +0 -8
package/README.md
CHANGED
|
@@ -57,7 +57,9 @@ SDK 需要在黑盒小程序 iframe 容器内运行。父容器会为页面注
|
|
|
57
57
|
npm run dev
|
|
58
58
|
```
|
|
59
59
|
|
|
60
|
-
调试页会通过 iframe 加载本地页面并补齐小程序 bridge
|
|
60
|
+
调试页会通过 iframe 加载本地页面并补齐小程序 bridge 环境。`hb-sdk dev` 的基础启动只依赖本地页面地址:即使项目未绑定、CLI 未登录或远端暂时不可用,浏览器 Mock、Mac 启动协议和手机二维码也会继续生成,真机 dev shell 以匿名本地沙箱加载 `mini_url`,不会把公开 `detail` 查询作为启动门禁。项目已绑定时会限时 3 秒读取远端 dev context;成功后 Mock Host 用真实 Runtime 权限快照初始化本地模拟,失败或超时则显示脱敏警告,并默认拒绝 `network.request` 等受管能力。
|
|
61
|
+
|
|
62
|
+
Mock Host 可以在内存中调整 devtools-only 权限模拟,不会重建 iframe,因此不影响 Vite HMR;本地设置不会修改线上权限。调试页会对比已读取的线上快照,提示本地放开但上线后会返回 `PERMISSION_DENIED` 的差异。权限快照只通过 mock host 的同源只读 bootstrap 接口传递,URL query 不能提供或覆盖权限。真实容器加载开发 `mini_url` 前会提示“即将打开未经验证的开发网页。该页面可能由本机或局域网服务提供,请确认来源可信后继续。”,用户确认后才继续加载。Codex、VSCode 等内嵌浏览器可能无法唤起系统 APP;遇到这种情况时,请在系统浏览器中打开同一个调试页后重试。
|
|
61
63
|
|
|
62
64
|
在未使用脚手架的 Vite 项目中,可以把命令加到 `package.json`:
|
|
63
65
|
|
|
@@ -477,7 +479,7 @@ hb-sdk remote deploy --env test --service-tag other-tag --release-note "灰度"
|
|
|
477
479
|
|
|
478
480
|
`--env <name>` 会读取项目根下的 `.env.<name>`,`--env-file <path>` 显式指定路径且优先级高于 `--env`;两者也可通过 `HB_SDK_ENV=<name>` 触发。加载遵循 dotenv 惯例:不覆盖进程已有的同名变量,因此 CI 或命令行显式设置的值优先。使用 `--env <name>` 或 `HB_SDK_ENV=<name>` 执行 `remote deploy` 时,CLI 还会把同一个 `name` 作为 `--mode <name>` 传给项目 build,使 CLI 后端环境与 Vite mode 保持一致。文件仅支持 `KEY=VALUE`、空行和 `#` 注释,不做变量插值;文件不存在时静默跳过。`--verbose` 会打印生效的文件路径和被跳过的 key。
|
|
479
481
|
|
|
480
|
-
`--api-base-url` 优先于 `HB_SDK_API_BASE_URL`,影响 `hb-sdk remote` 里的远端平台后台 API,包括预检、CDN 上传凭证/回调、提交审核、版本、发布、撤回、下架、重新上架、详情和白名单等调用;`--login-base-url` 优先于 `HB_SDK_LOGIN_BASE_URL`,用于 `hb-sdk login` 的登录入口,以及 remote 命令前校验当前 CLI 登录态是否属于同一个登录环境。`--service-tag <tag>` 优先于 `HB_SDK_SERVICE_TAG`,给 Heybox 后台请求附加 `x-rylai-service-tag` header,并复用命中的 tag 追加 `special_tag`
|
|
482
|
+
`--api-base-url` 优先于 `HB_SDK_API_BASE_URL`,影响 `hb-sdk remote` 里的远端平台后台 API,包括预检、CDN 上传凭证/回调、提交审核、版本、发布、撤回、下架、重新上架、详情和白名单等调用;`--login-base-url` 优先于 `HB_SDK_LOGIN_BASE_URL`,用于 `hb-sdk login` 的登录入口,以及 remote 命令前校验当前 CLI 登录态是否属于同一个登录环境。`--service-tag <tag>` 优先于 `HB_SDK_SERVICE_TAG`,给 Heybox 后台请求附加 `x-rylai-service-tag` header,并复用命中的 tag 追加 `special_tag` 请求参数,用于开发环境路由或灰度验证。仓库内开发也可继续在 `packages/hb-sdk/src/cli/config.ts` 里按 `@heybox/hb-types` 的 `RylaiServiceTagConfig` 配置 path-prefix 级 `special_tag`。自定义地址只接受 origin,不允许包含 path、query 或 hash;API origin 默认还必须是 Heybox 受信 HTTPS 域名,只有本地联调等场景可显式使用 `--allow-unsafe-api-base-url` 或 `HB_SDK_ALLOW_UNSAFE_API_BASE_URL=1` 放开。日志只输出 origin,不输出带身份和签名参数的完整请求 URL。`hb-sdk doctor`、npm latest 检查、mock host 的 `network.request()` 不受这些配置影响。
|
|
481
483
|
|
|
482
484
|
## hb-sdk remote 命令参考
|
|
483
485
|
|
|
@@ -557,7 +559,7 @@ export default defineConfig({
|
|
|
557
559
|
|
|
558
560
|
插件只接受单页应用:输出目录只能存在入口 `index.html`。build 会用结构化 HTML parser 校验入口,并把平台 CSP 插入 `<head>` 首位;已有 CSP 会原样保留,两份策略按浏览器交集生效。正式策略禁止 `fetch`、XHR、WebSocket、EventSource、Beacon、Worker、iframe、表单和对象加载等浏览器原生出口;业务网络请求应使用 `network.request()`。dev 使用相同策略,只额外放行当前 Vite 的精确 HMR WebSocket 地址。
|
|
559
561
|
|
|
560
|
-
meta refresh、外部 anchor、`dns-prefetch`、`preconnect`、`prerender`、外部资源 URL 和额外 HTML 会使 build 失败。内联 script/style 允许,但 `unsafe-eval` 不允许。`dev` 和手动 Vite build
|
|
562
|
+
meta refresh、外部 anchor、`dns-prefetch`、`preconnect`、`prerender`、外部资源 URL 和额外 HTML 会使 build 失败。内联 script/style 允许,但 `unsafe-eval` 不允许。`dev` 和手动 Vite build 不再请求远端最低 SDK 版本;构建仍会把当前 `sdkVersion` 写入 Manifest,`hb-sdk remote deploy` 仍校验 Manifest 结构并经过服务端 precheck / submit-audit 策略。
|
|
561
563
|
|
|
562
564
|
失败与警告语义:
|
|
563
565
|
|
|
@@ -1,30 +1,10 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var session = require('./session-
|
|
4
|
-
var index = require('./index-CTyguEza.cjs');
|
|
3
|
+
var session = require('./session-CC3Oz3Xc.cjs');
|
|
5
4
|
var fs$1 = require('node:fs');
|
|
6
5
|
var fs = require('node:fs/promises');
|
|
7
6
|
var path = require('node:path');
|
|
8
7
|
|
|
9
|
-
const APIUserMiniprogramPublicSdkConfigPath = '/user_miniprogram/public/sdk_config';
|
|
10
|
-
function createUserMiniprogramPublicSdkConfigRequest(serviceTag) {
|
|
11
|
-
return {
|
|
12
|
-
path: APIUserMiniprogramPublicSdkConfigPath,
|
|
13
|
-
searchParams: serviceTag ? { special_tag: serviceTag } : {},
|
|
14
|
-
headers: serviceTag ? { 'x-rylai-service-tag': serviceTag } : {},
|
|
15
|
-
};
|
|
16
|
-
}
|
|
17
|
-
function parseUserMiniprogramPublicSdkConfigResult(value) {
|
|
18
|
-
if (!isRecord(value) ||
|
|
19
|
-
typeof value.minimum_sdk_version !== 'string') {
|
|
20
|
-
throw new Error('公共 SDK 配置响应无效');
|
|
21
|
-
}
|
|
22
|
-
return value;
|
|
23
|
-
}
|
|
24
|
-
function isRecord(value) {
|
|
25
|
-
return typeof value === 'object' && value !== null;
|
|
26
|
-
}
|
|
27
|
-
|
|
28
8
|
var re = {exports: {}};
|
|
29
9
|
|
|
30
10
|
var constants;
|
|
@@ -2814,7 +2794,6 @@ const MINIAPP_UPLOAD_SCOPE = 'activity';
|
|
|
2814
2794
|
const ACTIVITY_UPLOAD_KEY_MAX_LENGTH = 64;
|
|
2815
2795
|
const MINIAPP_UPLOAD_BATCH_SIZE = 50;
|
|
2816
2796
|
const MINIAPP_UPLOAD_TOTAL_SIZE_LIMIT_BYTES = 100 * 1024 * 1024;
|
|
2817
|
-
const PUBLIC_USER_MINIPROGRAM_SDK_CONFIG_API_PATH = APIUserMiniprogramPublicSdkConfigPath;
|
|
2818
2797
|
const USER_MINIPROGRAM_ACCESS_STATUS_API_PATH = '/mall/developer/user_miniprogram/access_status';
|
|
2819
2798
|
const DEVELOPER_ENTITY_LIST_API_PATH = '/mall/developer/entity/list';
|
|
2820
2799
|
const DEVELOPER_ENTITY_SWITCH_API_PATH = '/mall/developer/entity/switch';
|
|
@@ -2930,20 +2909,6 @@ function createRemoteApiClient(options) {
|
|
|
2930
2909
|
listUserMiniprogramVersions: (requestOptions) => listUserMiniprogramVersions(requestOptions, options),
|
|
2931
2910
|
};
|
|
2932
2911
|
}
|
|
2933
|
-
async function getPublicSdkConfig(runtime) {
|
|
2934
|
-
const fetchImpl = runtime.fetchImpl ?? fetch;
|
|
2935
|
-
const serviceTag = index.resolveHeyboxRylaiServiceTag(PUBLIC_USER_MINIPROGRAM_SDK_CONFIG_API_PATH);
|
|
2936
|
-
const request = createUserMiniprogramPublicSdkConfigRequest(serviceTag);
|
|
2937
|
-
const response = await fetchImpl(session.createHeyboxApiUrl(runtime.baseUrl ?? 'https://api.xiaoheihe.cn', request.path, request.searchParams), {
|
|
2938
|
-
method: 'GET',
|
|
2939
|
-
headers: {
|
|
2940
|
-
Referer: session.HEYBOX_WEB_REFERER,
|
|
2941
|
-
...request.headers,
|
|
2942
|
-
},
|
|
2943
|
-
});
|
|
2944
|
-
const result = await readRequiredResult(response, request.path);
|
|
2945
|
-
return parseUserMiniprogramPublicSdkConfigResult(result);
|
|
2946
|
-
}
|
|
2947
2912
|
async function listDeveloperEntities(runtime) {
|
|
2948
2913
|
return remoteGet(DEVELOPER_ENTITY_LIST_API_PATH, {}, runtime);
|
|
2949
2914
|
}
|
|
@@ -3223,7 +3188,6 @@ exports.SUBMIT_USER_MINIPROGRAM_AUDIT_API_PATH = SUBMIT_USER_MINIPROGRAM_AUDIT_A
|
|
|
3223
3188
|
exports.createRemoteApiClientForEnvironment = createRemoteApiClientForEnvironment;
|
|
3224
3189
|
exports.getBoundMiniProgram = getBoundMiniProgram;
|
|
3225
3190
|
exports.getMiniappUploadKey = getMiniappUploadKey;
|
|
3226
|
-
exports.getPublicSdkConfig = getPublicSdkConfig;
|
|
3227
3191
|
exports.normalizeRelativePath = normalizeRelativePath;
|
|
3228
3192
|
exports.readBoundMiniProgramId = readBoundMiniProgramId;
|
|
3229
3193
|
exports.readBoundMiniProgramIdFromPackageJson = readBoundMiniProgramIdFromPackageJson;
|
|
@@ -5,7 +5,7 @@ var fs = require('node:fs/promises');
|
|
|
5
5
|
var path = require('node:path');
|
|
6
6
|
var require$$0 = require('fs');
|
|
7
7
|
var require$$1 = require('path');
|
|
8
|
-
var index = require('./index-
|
|
8
|
+
var index = require('./index-Q0G1SsEs.cjs');
|
|
9
9
|
require('node:module');
|
|
10
10
|
require('os');
|
|
11
11
|
require('readline');
|
|
@@ -9,9 +9,8 @@ var node_url = require('node:url');
|
|
|
9
9
|
var net = require('node:net');
|
|
10
10
|
var node_http = require('node:http');
|
|
11
11
|
var browser = require('./browser-RAy8e8cV.cjs');
|
|
12
|
-
var index = require('./index-
|
|
13
|
-
var context = require('./context-
|
|
14
|
-
var session = require('./session-D7mPwyx4.cjs');
|
|
12
|
+
var index = require('./index-Q0G1SsEs.cjs');
|
|
13
|
+
var context = require('./context-BCwksd8H.cjs');
|
|
15
14
|
require('node:process');
|
|
16
15
|
require('node:buffer');
|
|
17
16
|
require('node:util');
|
|
@@ -25,6 +24,7 @@ require('events');
|
|
|
25
24
|
require('stream');
|
|
26
25
|
require('buffer');
|
|
27
26
|
require('util');
|
|
27
|
+
require('./session-CC3Oz3Xc.cjs');
|
|
28
28
|
require('node:crypto');
|
|
29
29
|
require('fs');
|
|
30
30
|
require('constants');
|
|
@@ -223,6 +223,7 @@ async function startMiniProgramMockHostServer(options) {
|
|
|
223
223
|
assertCompleteMiniProgramMockHostRoot(root);
|
|
224
224
|
const bootstrapJson = serializeMockHostBootstrap({
|
|
225
225
|
defaultLanAddressId: options.defaultLanAddressId,
|
|
226
|
+
devContext: options.devContext,
|
|
226
227
|
lanAddresses: options.lanAddresses ?? [],
|
|
227
228
|
macAppProtocol: options.macAppProtocol,
|
|
228
229
|
nativeAppLaunchUnavailableReason: options.nativeAppLaunchUnavailableReason,
|
|
@@ -666,113 +667,23 @@ function createHeyboxProtocol(payload) {
|
|
|
666
667
|
return `heybox://${encodeURIComponent(JSON.stringify(payload))}`;
|
|
667
668
|
}
|
|
668
669
|
|
|
669
|
-
const CACHE_MAX_AGE_MS = 24 * 60 * 60 * 1_000;
|
|
670
|
-
const CACHE_FILE_NAME = 'minimum-sdk-versions.json';
|
|
671
|
-
async function resolveMinimumSdkVersion(options) {
|
|
672
|
-
const now = options.now ?? Date.now();
|
|
673
|
-
const cachePath = path.join(options.cacheDir, CACHE_FILE_NAME);
|
|
674
|
-
const cache = await readCache(cachePath);
|
|
675
|
-
let minimumSdkVersion;
|
|
676
|
-
try {
|
|
677
|
-
minimumSdkVersion = validateStableSdkVersion(await options.fetchMinimumSdkVersion(), 'minimumSdkVersion');
|
|
678
|
-
}
|
|
679
|
-
catch {
|
|
680
|
-
const cached = cache.environments[options.environment];
|
|
681
|
-
const cacheAge = cached ? now - cached.fetchedAt : Number.NaN;
|
|
682
|
-
if (cached && Number.isFinite(cached.fetchedAt) && cacheAge >= 0 && cacheAge <= CACHE_MAX_AGE_MS) {
|
|
683
|
-
try {
|
|
684
|
-
return validateStableSdkVersion(cached.minimumSdkVersion, 'cached minimumSdkVersion');
|
|
685
|
-
}
|
|
686
|
-
catch {
|
|
687
|
-
// 非法缓存按不存在处理。
|
|
688
|
-
}
|
|
689
|
-
}
|
|
690
|
-
throw new Error('MINIMUM_SDK_VERSION_UNAVAILABLE:无法获取最低 SDK 版本,且没有 24 小时内的有效缓存');
|
|
691
|
-
}
|
|
692
|
-
cache.environments[options.environment] = { fetchedAt: now, minimumSdkVersion };
|
|
693
|
-
try {
|
|
694
|
-
await writeCache(cachePath, cache);
|
|
695
|
-
}
|
|
696
|
-
catch {
|
|
697
|
-
// 已校验的远端策略仍然可信;缓存只是离线回退优化。
|
|
698
|
-
}
|
|
699
|
-
return minimumSdkVersion;
|
|
700
|
-
}
|
|
701
|
-
function validateCurrentSdkVersion(currentSdkVersion, minimumSdkVersion, options) {
|
|
702
|
-
const current = validateSdkVersion(currentSdkVersion, '当前 SDK 版本');
|
|
703
|
-
const minimum = validateStableSdkVersion(minimumSdkVersion, 'minimumSdkVersion');
|
|
704
|
-
if (!options.allowPrerelease && context.semverExports.prerelease(current) !== null) {
|
|
705
|
-
throw new Error('正式发布不允许使用预发布 SDK,请运行 pnpm add @heybox/hb-sdk@latest 后重新构建');
|
|
706
|
-
}
|
|
707
|
-
if (!context.semverExports.satisfies(current, `>=${minimum}`, { includePrerelease: options.allowPrerelease })) {
|
|
708
|
-
throw new Error(`SDK_VERSION_TOO_LOW:当前 @heybox/hb-sdk@${current} 低于最低版本 ${minimum},请运行 pnpm add @heybox/hb-sdk@latest`);
|
|
709
|
-
}
|
|
710
|
-
return current;
|
|
711
|
-
}
|
|
712
|
-
function validateSdkVersion(value, label) {
|
|
713
|
-
const normalized = String(value).trim();
|
|
714
|
-
const parsed = context.semverExports.parse(normalized);
|
|
715
|
-
if (!parsed || parsed.version !== normalized || parsed.build.length > 0) {
|
|
716
|
-
throw new Error(`${label} 必须是合法 SemVer:${normalized}`);
|
|
717
|
-
}
|
|
718
|
-
return normalized;
|
|
719
|
-
}
|
|
720
|
-
function validateStableSdkVersion(value, label) {
|
|
721
|
-
const normalized = validateSdkVersion(value, label);
|
|
722
|
-
if (context.semverExports.prerelease(normalized) !== null)
|
|
723
|
-
throw new Error(`${label} 必须是稳定 SemVer:${normalized}`);
|
|
724
|
-
return normalized;
|
|
725
|
-
}
|
|
726
|
-
async function readCache(cachePath) {
|
|
727
|
-
try {
|
|
728
|
-
const parsed = JSON.parse(await fs$1.readFile(cachePath, 'utf8'));
|
|
729
|
-
if (parsed && typeof parsed === 'object' && parsed.environments && typeof parsed.environments === 'object')
|
|
730
|
-
return parsed;
|
|
731
|
-
}
|
|
732
|
-
catch {
|
|
733
|
-
// 缓存缺失或损坏时继续请求最新配置。
|
|
734
|
-
}
|
|
735
|
-
return { environments: {} };
|
|
736
|
-
}
|
|
737
|
-
async function writeCache(cachePath, cache) {
|
|
738
|
-
await fs$1.mkdir(path.dirname(cachePath), { recursive: true });
|
|
739
|
-
const temporaryPath = `${cachePath}.${process.pid}.tmp`;
|
|
740
|
-
await fs$1.writeFile(temporaryPath, `${JSON.stringify(cache, null, 2)}\n`, { mode: 0o600 });
|
|
741
|
-
await fs$1.rename(temporaryPath, cachePath);
|
|
742
|
-
}
|
|
743
|
-
|
|
744
|
-
const paths = index.envPaths('hb-sdk');
|
|
745
|
-
async function enforceRemoteSdkVersion(options) {
|
|
746
|
-
const minimumSdkVersion = await resolveMinimumSdkVersion({
|
|
747
|
-
cacheDir: options.cacheDir ?? paths.cache,
|
|
748
|
-
environment: options.environment,
|
|
749
|
-
fetchMinimumSdkVersion: async () => (await context.getPublicSdkConfig({ baseUrl: options.environment, fetchImpl: options.fetchImpl })).minimum_sdk_version,
|
|
750
|
-
});
|
|
751
|
-
return validateCurrentSdkVersion(options.sdkVersion, minimumSdkVersion, { allowPrerelease: options.allowPrerelease });
|
|
752
|
-
}
|
|
753
|
-
|
|
754
670
|
/** 构建时替换为当前发布包的实际版本。 */
|
|
755
671
|
const HB_SDK_VERSION = typeof undefined === 'string'
|
|
756
672
|
? undefined
|
|
757
|
-
: '0.6.
|
|
673
|
+
: '0.6.4-alpha.0';
|
|
758
674
|
|
|
759
675
|
const DEFAULT_APP_PORT = 5173;
|
|
760
676
|
const DEFAULT_MOCK_PORT = 5174;
|
|
677
|
+
const DEFAULT_DEV_CONTEXT_TIMEOUT_MS = 3000;
|
|
761
678
|
const DEV_LISTEN_HOST = '0.0.0.0';
|
|
762
679
|
const LOCAL_DEV_URL_HOST = '127.0.0.1';
|
|
680
|
+
const DEV_CONTEXT_UNAVAILABLE_WARNING = '远端 dev context 不可用,已继续匿名调试。';
|
|
763
681
|
// Shared with Heybox H5 Vite plugins so hb-sdk can own the launch output.
|
|
764
682
|
const MANAGED_DEV_OUTPUT_ENV = 'HEYBOX_DEV_SERVER_MANAGED_OUTPUT';
|
|
765
683
|
const VITE_LOG_LEVEL = 'warn';
|
|
766
684
|
async function runDevCommand(options, runtime = {}) {
|
|
767
685
|
const logger = runtime.logger ?? index.createCliLogger();
|
|
768
686
|
const fetchImpl = runtime.fetchImpl ?? fetch;
|
|
769
|
-
const environment = session.resolveHeyboxApiBaseUrl({ env: runtime.env });
|
|
770
|
-
await (runtime.enforceRemoteSdkVersion ?? enforceRemoteSdkVersion)({
|
|
771
|
-
sdkVersion: HB_SDK_VERSION,
|
|
772
|
-
environment,
|
|
773
|
-
fetchImpl,
|
|
774
|
-
allowPrerelease: true,
|
|
775
|
-
});
|
|
776
687
|
const openUrl = runtime.openExternalUrl ?? browser.openExternalUrl;
|
|
777
688
|
const networkInterfaceSnapshot = (runtime.networkInterfaces ?? os.networkInterfaces)();
|
|
778
689
|
const getPortImpl = runtime.getPort ?? getPorts;
|
|
@@ -793,6 +704,7 @@ async function runDevCommand(options, runtime = {}) {
|
|
|
793
704
|
fetchImpl,
|
|
794
705
|
logger,
|
|
795
706
|
projectRoot,
|
|
707
|
+
timeoutMs: runtime.devContextTimeoutMs ?? DEFAULT_DEV_CONTEXT_TIMEOUT_MS,
|
|
796
708
|
});
|
|
797
709
|
const vite = await logger.task('正在加载项目 Vite', () => loadProjectVite(projectRoot), { successText: '已加载项目 Vite' });
|
|
798
710
|
const appServer = await logger.task('正在创建 Vite dev server', () => withManagedDevOutputEnv(() => vite.createServer(createViteServerOptions(projectRoot, resolvedOptions)), runtime.env), { successText: '已创建 Vite dev server' });
|
|
@@ -816,18 +728,16 @@ async function runDevCommand(options, runtime = {}) {
|
|
|
816
728
|
try {
|
|
817
729
|
mockHost = await logger.task('正在启动 Mock runtime host', () => startMiniProgramMockHostServer({
|
|
818
730
|
appUrl,
|
|
731
|
+
devContext: devLaunchContext,
|
|
819
732
|
fetchImpl,
|
|
820
733
|
getPort: getPortImpl,
|
|
821
734
|
defaultLanAddressId: lanAddresses[0]?.id,
|
|
822
735
|
lanAddresses,
|
|
823
|
-
macAppProtocol:
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
})
|
|
829
|
-
: undefined,
|
|
830
|
-
nativeAppLaunchUnavailableReason: devLaunchContext.nativeAppLaunchUnavailableReason,
|
|
736
|
+
macAppProtocol: createMacAppProtocol(appUrl, {
|
|
737
|
+
miniProgramId: devLaunchContext.miniProgramId,
|
|
738
|
+
runtimeUrl: options.runtimeUrl,
|
|
739
|
+
sdkVersion: HB_SDK_VERSION,
|
|
740
|
+
}),
|
|
831
741
|
port: options.mockPort ?? DEFAULT_MOCK_PORT,
|
|
832
742
|
root: runtime.mockHostRoot,
|
|
833
743
|
rootCandidates: runtime.mockHostRootCandidates,
|
|
@@ -842,12 +752,10 @@ async function runDevCommand(options, runtime = {}) {
|
|
|
842
752
|
logger.success('Mock runtime host 已就绪');
|
|
843
753
|
logger.info(`Mock runtime host: ${mockHost.url}`);
|
|
844
754
|
logger.info(`Mini program URL: ${appUrl}`);
|
|
845
|
-
|
|
846
|
-
|
|
847
|
-
|
|
848
|
-
|
|
849
|
-
else {
|
|
850
|
-
logger.warn(`Mac/Mobile APP 真机调试不可用:${devLaunchContext.nativeAppLaunchUnavailableReason}`);
|
|
755
|
+
logger.info('Mac APP: use the button in Mock runtime host');
|
|
756
|
+
logger.info('Mobile APP: scan the QR code in Mock runtime host');
|
|
757
|
+
if (devLaunchContext.source === 'anonymous') {
|
|
758
|
+
logger.warn('当前使用匿名本地沙箱;真机调试可用,但不会携带远端小程序身份或权限。');
|
|
851
759
|
}
|
|
852
760
|
if (options.open !== false) {
|
|
853
761
|
logger.debug('正在打开浏览器调试页');
|
|
@@ -858,40 +766,61 @@ async function runDevCommand(options, runtime = {}) {
|
|
|
858
766
|
async function loadDevLaunchContext(options) {
|
|
859
767
|
const miniProgramId = await context.readBoundMiniProgramId(options.projectRoot);
|
|
860
768
|
if (!miniProgramId) {
|
|
861
|
-
const
|
|
862
|
-
options.logger.warn(`未读取到远端 Runtime 权限,Mock runtime 将默认拒绝受管能力:${
|
|
863
|
-
return {
|
|
769
|
+
const anonymousReason = '当前项目未绑定小程序。请先运行 hb-sdk remote create 或 hb-sdk remote bind <mini-program-id>。';
|
|
770
|
+
options.logger.warn(`未读取到远端 Runtime 权限,Mock runtime 将默认拒绝受管能力:${anonymousReason}`);
|
|
771
|
+
return {
|
|
772
|
+
source: 'anonymous',
|
|
773
|
+
warning: anonymousReason,
|
|
774
|
+
};
|
|
864
775
|
}
|
|
865
776
|
try {
|
|
866
|
-
const { detail, miniProgramId: verifiedMiniProgramId } = await options.logger.task('正在读取远端小程序权限', () =>
|
|
867
|
-
cwd: options.projectRoot,
|
|
868
|
-
env: options.env,
|
|
777
|
+
const { detail, miniProgramId: verifiedMiniProgramId } = await options.logger.task('正在读取远端小程序权限', () => loadRemoteDevContextWithTimeout({
|
|
869
778
|
fetchImpl: options.fetchImpl,
|
|
779
|
+
load: fetchImpl => context.getBoundMiniProgram({
|
|
780
|
+
cwd: options.projectRoot,
|
|
781
|
+
env: options.env,
|
|
782
|
+
fetchImpl,
|
|
783
|
+
}),
|
|
784
|
+
timeoutMs: options.timeoutMs,
|
|
870
785
|
}), { successText: '已读取远端小程序权限' });
|
|
871
|
-
return {
|
|
786
|
+
return {
|
|
787
|
+
source: 'remote',
|
|
788
|
+
miniProgramId: verifiedMiniProgramId,
|
|
789
|
+
runtimePermissions: detail.runtime_permissions,
|
|
790
|
+
};
|
|
872
791
|
}
|
|
873
792
|
catch (error) {
|
|
874
|
-
if (
|
|
793
|
+
if (error instanceof context.MiniProgramProjectBindingError &&
|
|
794
|
+
error.code !== 'MINI_PROGRAM_UNBOUND') {
|
|
875
795
|
throw error;
|
|
876
796
|
}
|
|
877
|
-
options.logger.warn(`未读取到远端 Runtime 权限,Mock runtime 将默认拒绝受管能力:${
|
|
797
|
+
options.logger.warn(`未读取到远端 Runtime 权限,Mock runtime 将默认拒绝受管能力:${DEV_CONTEXT_UNAVAILABLE_WARNING}`);
|
|
878
798
|
return {
|
|
879
|
-
|
|
799
|
+
source: 'anonymous',
|
|
800
|
+
warning: DEV_CONTEXT_UNAVAILABLE_WARNING,
|
|
880
801
|
};
|
|
881
802
|
}
|
|
882
803
|
}
|
|
883
|
-
function
|
|
884
|
-
|
|
885
|
-
|
|
886
|
-
|
|
887
|
-
|
|
888
|
-
return
|
|
804
|
+
async function loadRemoteDevContextWithTimeout(options) {
|
|
805
|
+
const controller = new AbortController();
|
|
806
|
+
const fetchImpl = ((input, init) => options.fetchImpl(input, { ...init, signal: controller.signal }));
|
|
807
|
+
let timeout;
|
|
808
|
+
try {
|
|
809
|
+
return await Promise.race([
|
|
810
|
+
options.load(fetchImpl),
|
|
811
|
+
new Promise((_resolve, reject) => {
|
|
812
|
+
timeout = setTimeout(() => {
|
|
813
|
+
controller.abort();
|
|
814
|
+
reject(new Error('dev context timeout'));
|
|
815
|
+
}, Math.max(1, options.timeoutMs));
|
|
816
|
+
}),
|
|
817
|
+
]);
|
|
889
818
|
}
|
|
890
|
-
|
|
891
|
-
|
|
892
|
-
(
|
|
819
|
+
finally {
|
|
820
|
+
if (timeout) {
|
|
821
|
+
clearTimeout(timeout);
|
|
822
|
+
}
|
|
893
823
|
}
|
|
894
|
-
return error instanceof Error && 'code' in error && error.code === 'AUTH_SESSION_MISSING';
|
|
895
824
|
}
|
|
896
825
|
function findProjectRoot(startDir) {
|
|
897
826
|
let current = path.resolve(startDir);
|
|
@@ -1076,9 +1005,6 @@ async function closeAll(closers) {
|
|
|
1076
1005
|
await Promise.allSettled(closers.map((close) => close()));
|
|
1077
1006
|
}
|
|
1078
1007
|
function createLanAddressCandidates(options) {
|
|
1079
|
-
if (!options.miniProgramId) {
|
|
1080
|
-
return [];
|
|
1081
|
-
}
|
|
1082
1008
|
const viteNetworkUrlByHost = new Map(options.viteNetworkUrls
|
|
1083
1009
|
.map((url) => [readUrlHost(url), url])
|
|
1084
1010
|
.filter((entry) => Boolean(entry[0])));
|
|
@@ -4,7 +4,7 @@ var fs$1 = require('node:fs');
|
|
|
4
4
|
var fs = require('node:fs/promises');
|
|
5
5
|
var os = require('node:os');
|
|
6
6
|
var path = require('node:path');
|
|
7
|
-
var index = require('./index-
|
|
7
|
+
var index = require('./index-Q0G1SsEs.cjs');
|
|
8
8
|
require('node:module');
|
|
9
9
|
require('path');
|
|
10
10
|
require('os');
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var index$2 = require('./index-
|
|
3
|
+
var index$2 = require('./index-Q0G1SsEs.cjs');
|
|
4
4
|
var require$$0$2 = require('fs');
|
|
5
5
|
var require$$2$1 = require('crypto');
|
|
6
6
|
var require$$1$2 = require('path');
|
|
7
7
|
var require$$0$3 = require('assert');
|
|
8
8
|
var require$$4$2 = require('events');
|
|
9
9
|
var require$$1$1 = require('util');
|
|
10
|
-
var context$1 = require('./context-
|
|
10
|
+
var context$1 = require('./context-BCwksd8H.cjs');
|
|
11
11
|
var require$$0$5 = require('net');
|
|
12
12
|
var require$$0$4 = require('url');
|
|
13
13
|
var require$$2$2 = require('http');
|
|
@@ -234,19 +234,19 @@ function requireArgument () {
|
|
|
234
234
|
|
|
235
235
|
var command = {};
|
|
236
236
|
|
|
237
|
-
const require$5 = node_module.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('cli-chunks/index-
|
|
237
|
+
const require$5 = node_module.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('cli-chunks/index-Q0G1SsEs.cjs', document.baseURI).href)));
|
|
238
238
|
function __require$4() { return require$5("node:events"); }
|
|
239
239
|
|
|
240
|
-
const require$4 = node_module.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('cli-chunks/index-
|
|
240
|
+
const require$4 = node_module.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('cli-chunks/index-Q0G1SsEs.cjs', document.baseURI).href)));
|
|
241
241
|
function __require$3() { return require$4("node:child_process"); }
|
|
242
242
|
|
|
243
|
-
const require$3 = node_module.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('cli-chunks/index-
|
|
243
|
+
const require$3 = node_module.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('cli-chunks/index-Q0G1SsEs.cjs', document.baseURI).href)));
|
|
244
244
|
function __require$2() { return require$3("node:path"); }
|
|
245
245
|
|
|
246
|
-
const require$2 = node_module.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('cli-chunks/index-
|
|
246
|
+
const require$2 = node_module.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('cli-chunks/index-Q0G1SsEs.cjs', document.baseURI).href)));
|
|
247
247
|
function __require$1() { return require$2("node:fs"); }
|
|
248
248
|
|
|
249
|
-
const require$1 = node_module.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('cli-chunks/index-
|
|
249
|
+
const require$1 = node_module.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('cli-chunks/index-Q0G1SsEs.cjs', document.baseURI).href)));
|
|
250
250
|
function __require() { return require$1("node:process"); }
|
|
251
251
|
|
|
252
252
|
var help = {};
|
|
@@ -13323,7 +13323,7 @@ function getPathname(pathWithQuery) {
|
|
|
13323
13323
|
}
|
|
13324
13324
|
|
|
13325
13325
|
const CLI_VERSION_PLACEHOLDER = ['__HB', 'SDK', 'CLI', 'VERSION__'].join('_');
|
|
13326
|
-
const BUILT_CLI_VERSION = '0.6.
|
|
13326
|
+
const BUILT_CLI_VERSION = '0.6.4-alpha.0';
|
|
13327
13327
|
const PACKAGE_JSON_CANDIDATES = [
|
|
13328
13328
|
path.resolve(__dirname, '..', '..', 'package.json'),
|
|
13329
13329
|
path.resolve(__dirname, '..', 'package.json'),
|
|
@@ -13644,31 +13644,31 @@ function createCommandLoggerResolver(options) {
|
|
|
13644
13644
|
};
|
|
13645
13645
|
}
|
|
13646
13646
|
const defaultClearLoginStatus = async (...args) => {
|
|
13647
|
-
const { clearLoginStatus } = await Promise.resolve().then(function () { return require('./login-
|
|
13647
|
+
const { clearLoginStatus } = await Promise.resolve().then(function () { return require('./login-Cxdo4B6Z.cjs'); });
|
|
13648
13648
|
return clearLoginStatus(...args);
|
|
13649
13649
|
};
|
|
13650
13650
|
const defaultLoginToHeybox = async (...args) => {
|
|
13651
|
-
const { loginToHeybox } = await Promise.resolve().then(function () { return require('./login-
|
|
13651
|
+
const { loginToHeybox } = await Promise.resolve().then(function () { return require('./login-Cxdo4B6Z.cjs'); });
|
|
13652
13652
|
return loginToHeybox(...args);
|
|
13653
13653
|
};
|
|
13654
13654
|
const defaultPrintLoginStatus = async (...args) => {
|
|
13655
|
-
const { printLoginStatus } = await Promise.resolve().then(function () { return require('./login-
|
|
13655
|
+
const { printLoginStatus } = await Promise.resolve().then(function () { return require('./login-Cxdo4B6Z.cjs'); });
|
|
13656
13656
|
return printLoginStatus(...args);
|
|
13657
13657
|
};
|
|
13658
13658
|
const defaultRunCreateCommand = async (...args) => {
|
|
13659
|
-
const { runCreateCommand } = await Promise.resolve().then(function () { return require('./create-
|
|
13659
|
+
const { runCreateCommand } = await Promise.resolve().then(function () { return require('./create-BO8GHVi0.cjs'); });
|
|
13660
13660
|
return runCreateCommand(...args);
|
|
13661
13661
|
};
|
|
13662
13662
|
const defaultRunDevCommand = async (...args) => {
|
|
13663
|
-
const { runDevCommand } = await Promise.resolve().then(function () { return require('./dev-
|
|
13663
|
+
const { runDevCommand } = await Promise.resolve().then(function () { return require('./dev-DmgKnEC2.cjs'); });
|
|
13664
13664
|
return runDevCommand(...args);
|
|
13665
13665
|
};
|
|
13666
13666
|
const defaultRunDoctorCommand = async (...args) => {
|
|
13667
|
-
const { runDoctorCommand } = await Promise.resolve().then(function () { return require('./doctor-
|
|
13667
|
+
const { runDoctorCommand } = await Promise.resolve().then(function () { return require('./doctor-BlKB4f78.cjs'); });
|
|
13668
13668
|
return runDoctorCommand(...args);
|
|
13669
13669
|
};
|
|
13670
13670
|
const defaultRunRemoteCommand = async (...args) => {
|
|
13671
|
-
const { runRemoteCommand } = await Promise.resolve().then(function () { return require('./remote-
|
|
13671
|
+
const { runRemoteCommand } = await Promise.resolve().then(function () { return require('./remote-C1Rsb1dx.cjs'); });
|
|
13672
13672
|
return runRemoteCommand(...args);
|
|
13673
13673
|
};
|
|
13674
13674
|
function resolveStandaloneLogger(options, verbose) {
|
|
@@ -3,9 +3,9 @@
|
|
|
3
3
|
var promises = require('node:readline/promises');
|
|
4
4
|
var node_crypto = require('node:crypto');
|
|
5
5
|
var node_http = require('node:http');
|
|
6
|
-
var session = require('./session-
|
|
6
|
+
var session = require('./session-CC3Oz3Xc.cjs');
|
|
7
7
|
var browser = require('./browser-RAy8e8cV.cjs');
|
|
8
|
-
var index = require('./index-
|
|
8
|
+
var index = require('./index-Q0G1SsEs.cjs');
|
|
9
9
|
require('node:path');
|
|
10
10
|
require('fs');
|
|
11
11
|
require('constants');
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
var promises = require('node:readline/promises');
|
|
4
|
-
var index = require('./index-
|
|
5
|
-
var session = require('./session-
|
|
4
|
+
var index = require('./index-Q0G1SsEs.cjs');
|
|
5
|
+
var session = require('./session-CC3Oz3Xc.cjs');
|
|
6
6
|
var childProcess = require('node:child_process');
|
|
7
7
|
var fs = require('node:fs');
|
|
8
8
|
var fs$1 = require('node:fs/promises');
|
|
9
9
|
var path = require('node:path');
|
|
10
|
-
var context = require('./context-
|
|
10
|
+
var context = require('./context-BCwksd8H.cjs');
|
|
11
11
|
require('node:module');
|
|
12
12
|
require('path');
|
|
13
13
|
require('os');
|
|
@@ -264,7 +264,7 @@ async function createDefaultCosClient(uploadToken) {
|
|
|
264
264
|
};
|
|
265
265
|
}
|
|
266
266
|
async function loadCosConstructor() {
|
|
267
|
-
const cosModule = await Promise.resolve().then(function () { return require('./index-
|
|
267
|
+
const cosModule = await Promise.resolve().then(function () { return require('./index-PxkpQ5of.cjs'); }).then(function (n) { return n.index; });
|
|
268
268
|
return cosModule.default;
|
|
269
269
|
}
|
|
270
270
|
function formatSize(bytes) {
|
|
@@ -8896,7 +8896,7 @@ async function runBuildScript(pm, cwd, spawnImpl, options) {
|
|
|
8896
8896
|
const buildArgs = createBuildArgs(pm, options.mode);
|
|
8897
8897
|
const child = spawnImpl(pm, buildArgs, {
|
|
8898
8898
|
cwd,
|
|
8899
|
-
env: { ...process.env, ...options.env
|
|
8899
|
+
env: { ...process.env, ...options.env },
|
|
8900
8900
|
stdio: pipeStdoutToStderr ? ['inherit', 'pipe', 'inherit'] : 'inherit',
|
|
8901
8901
|
});
|
|
8902
8902
|
if (pipeStdoutToStderr) {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var index = require('./index-
|
|
3
|
+
var index = require('./index-Q0G1SsEs.cjs');
|
|
4
4
|
var node_crypto = require('node:crypto');
|
|
5
5
|
var path = require('node:path');
|
|
6
6
|
var require$$0$2 = require('fs');
|
|
@@ -3321,7 +3321,6 @@ function isRecord(value) {
|
|
|
3321
3321
|
return Object.prototype.toString.call(value) === '[object Object]';
|
|
3322
3322
|
}
|
|
3323
3323
|
|
|
3324
|
-
exports.HEYBOX_WEB_REFERER = HEYBOX_WEB_REFERER;
|
|
3325
3324
|
exports.clearHeyboxAuthSession = clearHeyboxAuthSession;
|
|
3326
3325
|
exports.createHeyboxApiUrl = createHeyboxApiUrl;
|
|
3327
3326
|
exports.createHeyboxAuthSession = createHeyboxAuthSession;
|