@heybox/hb-sdk 0.9.2-alpha.7 → 0.9.2-alpha.8
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/CHANGELOG.md +16 -0
- package/README.md +2 -0
- package/dist/cli-chunks/{build-Do22AWbq.cjs → build-BinntZJf.cjs} +5 -5
- package/dist/cli-chunks/{context-DQhjWa7X.cjs → context-BI3QMxw2.cjs} +2 -2
- package/dist/cli-chunks/{create-QuI_mw8x.cjs → create-BK028Mlk.cjs} +1 -1
- package/dist/cli-chunks/deploy-lock-pKDDxTKm.cjs +148 -0
- package/dist/cli-chunks/{dev-KAhj5UTy.cjs → dev-DeNzUY6g.cjs} +8 -8
- package/dist/cli-chunks/{doctor-DNoQWBpo.cjs → doctor-BOfbKnN2.cjs} +1 -1
- package/dist/cli-chunks/games-yqu20laX.cjs +140 -0
- package/dist/cli-chunks/{index-DZUYwb3h.cjs → index-C7nrP0tt.cjs} +1 -1
- package/dist/cli-chunks/{index-bZIxID9N.cjs → index-CY67PpQk.cjs} +35 -16
- package/dist/cli-chunks/{index.esm-EWleN3S5.cjs → index.esm-DQdwzMhB.cjs} +6 -6
- package/dist/cli-chunks/{login-BYM3Nwau.cjs → login-PJdMmFoB.cjs} +1 -1
- package/dist/cli-chunks/{project-vite-6eLmb4Em.cjs → project-vite-Dm128JTE.cjs} +1 -1
- package/dist/cli-chunks/{remote-dvOjaxJu.cjs → remote-CZuy1lmn.cjs} +33 -146
- package/dist/cli-chunks/{runtime-gate-BKc2zPV-.cjs → runtime-gate-g3afiufR.cjs} +2 -2
- package/dist/cli-chunks/{runtime-permission-env-B9SqoP85.cjs → runtime-permission-env-CDx5qO-T.cjs} +2 -2
- package/dist/cli-chunks/{skill-DFXZ0SK_.cjs → skill-Bdy5Ehue.cjs} +2 -2
- package/dist/cli-chunks/{version-CwEOrhL1.cjs → version-D40WHkF9.cjs} +1 -1
- package/dist/cli.cjs +1 -1
- package/dist/devtools/browser-dev-host/assets/{browser-dev-host-BitDUIsy.js → browser-dev-host-BW7iWnpt.js} +1 -1
- package/dist/devtools/browser-dev-host/assets/{desktop-app-launch-B0yrI7xe.js → desktop-app-launch-lmlBUG16.js} +1 -1
- package/dist/devtools/browser-dev-host/assets/{index-D_mC4Hvt.js → index-D7F2y1lF.js} +3 -3
- package/dist/devtools/browser-dev-host/index.html +2 -2
- package/dist/index.cjs.js +1 -1
- package/dist/index.esm.js +1 -1
- package/dist/miniapp-publish.cjs.js +22 -0
- package/dist/miniapp-publish.esm.js +22 -1
- package/dist/templates/vanilla-vite-js/README.md.ejs +4 -0
- package/dist/vite.cjs.js +46 -3
- package/dist/vite.esm.js +46 -3
- package/package.json +5 -5
- package/skill/SKILL.md +9 -0
- package/skill/skill.json +5 -5
- package/types/miniapp-publish/index.d.ts +15 -2
- package/types/vite/index.d.ts +7 -1
|
@@ -1,17 +1,18 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var runtimePermissionEnv = require('./runtime-permission-env-
|
|
4
|
-
var context = require('./context-
|
|
3
|
+
var runtimePermissionEnv = require('./runtime-permission-env-CDx5qO-T.cjs');
|
|
4
|
+
var context = require('./context-BI3QMxw2.cjs');
|
|
5
5
|
var promises = require('node:readline/promises');
|
|
6
|
-
var index = require('./index-
|
|
7
|
-
var runtimeGate = require('./runtime-gate-
|
|
6
|
+
var index = require('./index-CY67PpQk.cjs');
|
|
7
|
+
var runtimeGate = require('./runtime-gate-g3afiufR.cjs');
|
|
8
8
|
var childProcess = require('node:child_process');
|
|
9
9
|
var fs = require('node:fs');
|
|
10
10
|
var fs$1 = require('node:fs/promises');
|
|
11
11
|
var path = require('node:path');
|
|
12
12
|
var node_crypto = require('node:crypto');
|
|
13
13
|
require('node:zlib');
|
|
14
|
-
require('./
|
|
14
|
+
var deployLock = require('./deploy-lock-pKDDxTKm.cjs');
|
|
15
|
+
require('./version-D40WHkF9.cjs');
|
|
15
16
|
require('node:async_hooks');
|
|
16
17
|
require('sharp');
|
|
17
18
|
require('node:module');
|
|
@@ -33,6 +34,27 @@ require('inspector');
|
|
|
33
34
|
// 脚手架开发占位图;构建可用,提审前必须替换。
|
|
34
35
|
const BASIC_INFO_PLACEHOLDER_SHA256 = 'd14e54b30f5e6d1bcbf51267bc82b06a0af7c333f2945bcc16b4e1adc3b123dd';
|
|
35
36
|
|
|
37
|
+
/** 根据当前项目声明或实际版本 Manifest 检查资料完整性,不联网、不修改输入。 */
|
|
38
|
+
function getMiniappMetadataWarnings(metadata) {
|
|
39
|
+
const warnings = [];
|
|
40
|
+
if (metadata.desc === undefined || (typeof metadata.desc === 'string' && !metadata.desc.trim())) {
|
|
41
|
+
warnings.push({
|
|
42
|
+
code: 'MINIAPP_DESC_MISSING',
|
|
43
|
+
field: 'desc',
|
|
44
|
+
message: '尚未填写小程序简介。建议在 package.json#heybox.desc 中说明主要功能和适用场景,修改后重新构建。',
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
if (metadata.category === 'tool' &&
|
|
48
|
+
(metadata.bindAppIds === undefined || (Array.isArray(metadata.bindAppIds) && metadata.bindAppIds.length === 0))) {
|
|
49
|
+
warnings.push({
|
|
50
|
+
code: 'MINIAPP_TOOL_GAME_BINDING_MISSING',
|
|
51
|
+
field: 'bindAppIds',
|
|
52
|
+
message: '当前小程序为工具类,尚未关联游戏。如服务于特定 PC 游戏,可通过 hb-sdk remote games search "游戏名" 查询 appid 并填写 package.json#heybox.bindAppIds,修改后重新构建;通用工具可保持为空。',
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
return warnings;
|
|
56
|
+
}
|
|
57
|
+
|
|
36
58
|
const CREATE_USER_MINIPROGRAM_UPLOAD_SESSION_API_PATH = '/mall/developer/user_miniprogram/version/upload_session/create';
|
|
37
59
|
const RECORD_USER_MINIPROGRAM_UPLOAD_RESULT_API_PATH = '/mall/developer/user_miniprogram/version/upload_session/record';
|
|
38
60
|
const COMPANION_FINALIZATION_TIMEOUT_MS = 30 * 60_000;
|
|
@@ -286,7 +308,7 @@ function createDefaultCosClient(uploadToken, COS) {
|
|
|
286
308
|
};
|
|
287
309
|
}
|
|
288
310
|
async function loadCosConstructor() {
|
|
289
|
-
const cosModule = await Promise.resolve().then(function () { return require('./index-
|
|
311
|
+
const cosModule = await Promise.resolve().then(function () { return require('./index-C7nrP0tt.cjs'); }).then(function (n) { return n.index; });
|
|
290
312
|
return cosModule.default;
|
|
291
313
|
}
|
|
292
314
|
function formatSize(bytes) {
|
|
@@ -353,144 +375,6 @@ async function computeMiniappArtifactReceipt(files, runtime = {}) {
|
|
|
353
375
|
return { artifactSignature: hash.digest('hex'), files: preparedFiles };
|
|
354
376
|
}
|
|
355
377
|
|
|
356
|
-
const DEPLOY_LOCKED_MESSAGE = '当前设备已有同版本产物正在上传,请等待完成后重试';
|
|
357
|
-
const DEPLOY_LOCK_DIRECTORY_NAME = 'deploy-locks';
|
|
358
|
-
const DEPLOY_LOCK_OWNER_FILE = 'owner.json';
|
|
359
|
-
const INCOMPLETE_LOCK_GRACE_MS = 30_000;
|
|
360
|
-
const defaultPaths = index.envPaths('hb-sdk', { suffix: '' });
|
|
361
|
-
class DeployLockConflictError extends Error {
|
|
362
|
-
}
|
|
363
|
-
async function withDeployLock(scope, operation, options = {}) {
|
|
364
|
-
let lock;
|
|
365
|
-
try {
|
|
366
|
-
lock = await acquireDeployLock(scope, options);
|
|
367
|
-
}
|
|
368
|
-
catch (error) {
|
|
369
|
-
if (error instanceof DeployLockConflictError) {
|
|
370
|
-
throw error;
|
|
371
|
-
}
|
|
372
|
-
// 本地文件锁只减少重复操作,文件系统异常不阻断服务端上传流程。
|
|
373
|
-
return operation();
|
|
374
|
-
}
|
|
375
|
-
try {
|
|
376
|
-
return await operation();
|
|
377
|
-
}
|
|
378
|
-
finally {
|
|
379
|
-
await lock.release().catch(() => undefined);
|
|
380
|
-
}
|
|
381
|
-
}
|
|
382
|
-
async function acquireDeployLock(scope, options = {}) {
|
|
383
|
-
const lockDirectory = getDeployLockDirectory(scope, options.cacheRoot);
|
|
384
|
-
const ownerFile = path.join(lockDirectory, DEPLOY_LOCK_OWNER_FILE);
|
|
385
|
-
const owner = {
|
|
386
|
-
version: 1,
|
|
387
|
-
pid: options.pid ?? process.pid,
|
|
388
|
-
token: options.token ?? node_crypto.randomBytes(16).toString('hex'),
|
|
389
|
-
};
|
|
390
|
-
await fs$1.mkdir(path.dirname(lockDirectory), { recursive: true, mode: 0o700 });
|
|
391
|
-
for (let attempt = 0; attempt < 2; attempt += 1) {
|
|
392
|
-
let created = false;
|
|
393
|
-
try {
|
|
394
|
-
await fs$1.mkdir(lockDirectory, { mode: 0o700 });
|
|
395
|
-
created = true;
|
|
396
|
-
await fs$1.writeFile(ownerFile, `${JSON.stringify(owner)}\n`, { encoding: 'utf8', mode: 0o600 });
|
|
397
|
-
return createDeployLock(lockDirectory, ownerFile, owner.token);
|
|
398
|
-
}
|
|
399
|
-
catch (error) {
|
|
400
|
-
if (created) {
|
|
401
|
-
await fs$1.rm(lockDirectory, { force: true, recursive: true });
|
|
402
|
-
throw error;
|
|
403
|
-
}
|
|
404
|
-
if (!isNodeError(error) || error.code !== 'EEXIST') {
|
|
405
|
-
throw error;
|
|
406
|
-
}
|
|
407
|
-
if (!(await canReclaimDeployLock(lockDirectory, ownerFile, options))) {
|
|
408
|
-
throw new DeployLockConflictError(DEPLOY_LOCKED_MESSAGE);
|
|
409
|
-
}
|
|
410
|
-
await reclaimDeployLock(lockDirectory, owner.token);
|
|
411
|
-
}
|
|
412
|
-
}
|
|
413
|
-
throw new DeployLockConflictError(DEPLOY_LOCKED_MESSAGE);
|
|
414
|
-
}
|
|
415
|
-
function getDeployLockDirectory(scope, cacheRoot = defaultPaths.cache) {
|
|
416
|
-
const scopeHash = node_crypto.createHash('sha256').update(`${scope.apiBaseUrl}\0${scope.miniProgramId}\0${scope.version}`).digest('hex');
|
|
417
|
-
return path.join(cacheRoot, DEPLOY_LOCK_DIRECTORY_NAME, scopeHash);
|
|
418
|
-
}
|
|
419
|
-
function createDeployLock(lockDirectory, ownerFile, token) {
|
|
420
|
-
let released = false;
|
|
421
|
-
return {
|
|
422
|
-
async release() {
|
|
423
|
-
if (released)
|
|
424
|
-
return;
|
|
425
|
-
released = true;
|
|
426
|
-
await removeOwnedLock(lockDirectory, ownerFile, token);
|
|
427
|
-
},
|
|
428
|
-
};
|
|
429
|
-
}
|
|
430
|
-
async function canReclaimDeployLock(lockDirectory, ownerFile, options) {
|
|
431
|
-
const owner = await readDeployLockOwner(ownerFile);
|
|
432
|
-
if (owner) {
|
|
433
|
-
return !(options.isProcessRunning ?? isProcessRunning)(owner.pid);
|
|
434
|
-
}
|
|
435
|
-
try {
|
|
436
|
-
const lockStat = await fs$1.stat(lockDirectory);
|
|
437
|
-
return (options.now ?? Date.now)() - lockStat.mtimeMs >= INCOMPLETE_LOCK_GRACE_MS;
|
|
438
|
-
}
|
|
439
|
-
catch (error) {
|
|
440
|
-
return isNodeError(error) && error.code === 'ENOENT';
|
|
441
|
-
}
|
|
442
|
-
}
|
|
443
|
-
async function removeOwnedLock(lockDirectory, ownerFile, token) {
|
|
444
|
-
const owner = await readDeployLockOwner(ownerFile);
|
|
445
|
-
if (owner?.token === token) {
|
|
446
|
-
await fs$1.rm(lockDirectory, { force: true, recursive: true });
|
|
447
|
-
}
|
|
448
|
-
}
|
|
449
|
-
async function reclaimDeployLock(lockDirectory, token) {
|
|
450
|
-
const reclaimDirectory = `${lockDirectory}.reclaim-${node_crypto.createHash('sha256').update(token).digest('hex')}`;
|
|
451
|
-
try {
|
|
452
|
-
await fs$1.rename(lockDirectory, reclaimDirectory);
|
|
453
|
-
}
|
|
454
|
-
catch (error) {
|
|
455
|
-
if (isNodeError(error) && error.code === 'ENOENT')
|
|
456
|
-
return;
|
|
457
|
-
throw error;
|
|
458
|
-
}
|
|
459
|
-
await fs$1.rm(reclaimDirectory, { force: true, recursive: true });
|
|
460
|
-
}
|
|
461
|
-
async function readDeployLockOwner(ownerFile) {
|
|
462
|
-
try {
|
|
463
|
-
const value = JSON.parse(await fs$1.readFile(ownerFile, 'utf8'));
|
|
464
|
-
return isDeployLockOwner(value) ? value : null;
|
|
465
|
-
}
|
|
466
|
-
catch (error) {
|
|
467
|
-
if (isNodeError(error) && error.code === 'ENOENT')
|
|
468
|
-
return null;
|
|
469
|
-
if (error instanceof SyntaxError)
|
|
470
|
-
return null;
|
|
471
|
-
throw error;
|
|
472
|
-
}
|
|
473
|
-
}
|
|
474
|
-
function isDeployLockOwner(value) {
|
|
475
|
-
return (typeof value === 'object' &&
|
|
476
|
-
value !== null &&
|
|
477
|
-
value.version === 1 &&
|
|
478
|
-
Number.isInteger(value.pid) &&
|
|
479
|
-
typeof value.token === 'string');
|
|
480
|
-
}
|
|
481
|
-
function isProcessRunning(pid) {
|
|
482
|
-
try {
|
|
483
|
-
process.kill(pid, 0);
|
|
484
|
-
return true;
|
|
485
|
-
}
|
|
486
|
-
catch (error) {
|
|
487
|
-
return !isNodeError(error) || error.code !== 'ESRCH';
|
|
488
|
-
}
|
|
489
|
-
}
|
|
490
|
-
function isNodeError(error) {
|
|
491
|
-
return error instanceof Error && 'code' in error;
|
|
492
|
-
}
|
|
493
|
-
|
|
494
378
|
/** 发布提示使用显式声明与远端主体批准策略,不消费本地调试授权。 */
|
|
495
379
|
function getUnapprovedPermissionWarning(local, approvals, partyType) {
|
|
496
380
|
if (!local.declared)
|
|
@@ -610,7 +494,7 @@ async function runDeployCommand(options, runtime = {}) {
|
|
|
610
494
|
const buildScript = await readProjectBuildScript(projectRoot);
|
|
611
495
|
logger.info(`开始构建: ${pm} ${createBuildArgs(pm, buildMode, buildScript).join(' ')}`);
|
|
612
496
|
await runBuildScript(pm, projectRoot, runtime.spawn ?? childProcess.spawn, {
|
|
613
|
-
env: runtimePermissionEnv.createMiniappPlatformCspEnv(env, skipPlatformCsp),
|
|
497
|
+
env: { ...runtimePermissionEnv.createMiniappPlatformCspEnv(env, skipPlatformCsp), HB_SDK_DEFER_METADATA_WARNINGS: '1' },
|
|
614
498
|
mode: buildMode,
|
|
615
499
|
outputMode: options.buildOutputMode ?? 'inherit',
|
|
616
500
|
platform,
|
|
@@ -627,6 +511,9 @@ async function runDeployCommand(options, runtime = {}) {
|
|
|
627
511
|
const distDir = path.join(projectRoot, 'dist');
|
|
628
512
|
const parsedManifest = await readDeployManifest(projectRoot, logger);
|
|
629
513
|
({ manifest, version } = parsedManifest);
|
|
514
|
+
for (const warning of getMiniappMetadataWarnings(manifest)) {
|
|
515
|
+
logger.warn(`[${warning.code}] ${warning.message}`, { stream: 'stderr' });
|
|
516
|
+
}
|
|
630
517
|
if (manifest.category !== declaredCategory) {
|
|
631
518
|
throw new Error('dist/manifest.json.category 与 package.json#heybox.category 不一致,请重新 build 后再 deploy');
|
|
632
519
|
}
|
|
@@ -792,7 +679,7 @@ async function runDeployCommand(options, runtime = {}) {
|
|
|
792
679
|
version,
|
|
793
680
|
};
|
|
794
681
|
};
|
|
795
|
-
return (runtime.withDeployLock ?? withDeployLock)({ apiBaseUrl, miniProgramId, version: uploadVersion }, deploy);
|
|
682
|
+
return (runtime.withDeployLock ?? deployLock.withDeployLock)({ apiBaseUrl, miniProgramId, version: uploadVersion }, deploy);
|
|
796
683
|
}
|
|
797
684
|
function printDeploySuccess(options) {
|
|
798
685
|
options.logger.success(`提交审核成功:${options.miniProgramId} ${options.version}`);
|
|
@@ -5,8 +5,8 @@ require('node:module');
|
|
|
5
5
|
require('node:url');
|
|
6
6
|
var fs = require('node:fs');
|
|
7
7
|
var path = require('node:path');
|
|
8
|
-
var runtimePermissionEnv = require('./runtime-permission-env-
|
|
9
|
-
var index = require('./index-
|
|
8
|
+
var runtimePermissionEnv = require('./runtime-permission-env-CDx5qO-T.cjs');
|
|
9
|
+
var index = require('./index-CY67PpQk.cjs');
|
|
10
10
|
var _commonjsDynamicModules = require('./_commonjs-dynamic-modules-DUamuDzp.cjs');
|
|
11
11
|
var require$$0$1 = require('fs');
|
|
12
12
|
var require$$1 = require('path');
|
package/dist/cli-chunks/{runtime-permission-env-B9SqoP85.cjs → runtime-permission-env-CDx5qO-T.cjs}
RENAMED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var index = require('./index-
|
|
3
|
+
var index = require('./index-CY67PpQk.cjs');
|
|
4
4
|
var fs = require('node:fs');
|
|
5
5
|
var path = require('node:path');
|
|
6
|
-
var version$1 = require('./version-
|
|
6
|
+
var version$1 = require('./version-D40WHkF9.cjs');
|
|
7
7
|
require('node:crypto');
|
|
8
8
|
var node_async_hooks = require('node:async_hooks');
|
|
9
9
|
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var version = require('./version-
|
|
3
|
+
var version = require('./version-D40WHkF9.cjs');
|
|
4
4
|
var fs = require('node:fs/promises');
|
|
5
5
|
var path = require('node:path');
|
|
6
6
|
var childProcess = require('node:child_process');
|
|
7
|
-
var index = require('./index-
|
|
7
|
+
var index = require('./index-CY67PpQk.cjs');
|
|
8
8
|
require('node:module');
|
|
9
9
|
require('readline');
|
|
10
10
|
require('os');
|