@heybox/hb-sdk 0.6.6-alpha.2 → 0.6.6-alpha.4

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 (37) hide show
  1. package/README.md +44 -7
  2. package/dist/cli-chunks/build-C54stoRf.cjs +142 -0
  3. package/dist/cli-chunks/context-DvTynj3F.cjs +410 -0
  4. package/dist/cli-chunks/{create-CxjB3oSo.cjs → create-uQS30kS_.cjs} +1 -1
  5. package/dist/cli-chunks/{dev-Km0or0yY.cjs → dev-1wE8dNiL.cjs} +29 -149
  6. package/dist/cli-chunks/{doctor-baVOqNSh.cjs → doctor-B2aCUOQ7.cjs} +1 -1
  7. package/dist/cli-chunks/{index-ByDy5HXi.cjs → index-19i3Dr5H.cjs} +32 -16
  8. package/dist/cli-chunks/{index-DCsEAuca.cjs → index-DypVMqsr.cjs} +3 -3
  9. package/dist/cli-chunks/{login-fNe0eDs_.cjs → login-BIIUGwoq.cjs} +2 -2
  10. package/dist/cli-chunks/project-vite-Dl3OoQjL.cjs +45 -0
  11. package/dist/cli-chunks/remote-47MjCKhu.cjs +1522 -0
  12. package/dist/cli-chunks/{remote-BRIlRrCG.cjs → runtime-gate--rPXjiG6.cjs} +7 -1501
  13. package/dist/cli-chunks/{context-CM46YbPT.cjs → runtime-permission-env-BSs4uCNa.cjs} +75 -293
  14. package/dist/cli-chunks/{session-CTcelATz.cjs → session-DJEuhrgq.cjs} +1 -1
  15. package/dist/cli.cjs +1 -1
  16. package/dist/devtools/mock-host/main.js +149 -3
  17. package/dist/index.cjs.js +1 -1
  18. package/dist/index.esm.js +1 -1
  19. package/dist/templates/vue3-vite-ts/README.md.ejs +2 -2
  20. package/dist/templates/vue3-vite-ts/package.json.ejs +1 -1
  21. package/dist/vite.cjs.js +68 -4
  22. package/dist/vite.esm.js +68 -4
  23. package/package.json +2 -2
  24. package/skill/SKILL.md +19 -14
  25. package/skill/references/api-protocol.md +3 -2
  26. package/skill/references/api-root.md +57 -11
  27. package/skill/references/cli.md +33 -1
  28. package/skill/references/recipes.md +53 -0
  29. package/skill/references/safety-boundaries.md +1 -1
  30. package/skill/scripts/sync-references.mjs +23 -1
  31. package/skill/skill.json +4 -4
  32. package/types/index.d.ts +1 -1
  33. package/types/modules/share/types.d.ts +11 -0
  34. package/types/protocol.d.ts +1 -1
  35. package/types/vite/html-policy.d.ts +5 -1
  36. package/types/vite/index.d.ts +10 -1
  37. package/types/vite/runtime-permission-env.d.ts +9 -0
@@ -1,35 +1,38 @@
1
1
  'use strict';
2
2
 
3
- var node_module = require('node:module');
4
3
  var fs = require('node:fs');
5
- var fs$1 = require('node:fs/promises');
6
4
  var os = require('node:os');
7
5
  var path = require('node:path');
8
- var node_url = require('node:url');
9
6
  var net = require('node:net');
10
7
  var promises = require('node:dns/promises');
11
8
  var node_http = require('node:http');
9
+ var context = require('./context-DvTynj3F.cjs');
12
10
  var node_crypto = require('node:crypto');
13
11
  var undici = require('undici');
14
12
  var browser = require('./browser-RAy8e8cV.cjs');
15
- var index = require('./index-ByDy5HXi.cjs');
16
- var context = require('./context-CM46YbPT.cjs');
13
+ var index = require('./index-19i3Dr5H.cjs');
14
+ var projectVite = require('./project-vite-Dl3OoQjL.cjs');
15
+ var fs$1 = require('node:fs/promises');
16
+ var runtimePermissionEnv = require('./runtime-permission-env-BSs4uCNa.cjs');
17
+ require('./session-DJEuhrgq.cjs');
18
+ require('fs');
19
+ require('constants');
20
+ require('stream');
21
+ require('util');
22
+ require('assert');
23
+ require('path');
17
24
  require('node:process');
18
25
  require('node:buffer');
26
+ require('node:url');
19
27
  require('node:util');
20
28
  require('node:child_process');
21
- require('path');
29
+ require('node:module');
22
30
  require('os');
23
31
  require('readline');
24
32
  require('tty');
25
- require('assert');
26
33
  require('events');
27
- require('stream');
28
34
  require('buffer');
29
- require('util');
30
- require('./session-CTcelATz.cjs');
31
- require('fs');
32
- require('constants');
35
+ require('node:async_hooks');
33
36
 
34
37
  class Locked extends Error {
35
38
  constructor(port) {
@@ -193,58 +196,6 @@ async function getPorts(options) {
193
196
  throw new Error('No available ports found');
194
197
  }
195
198
 
196
- const MANAGED_RUNTIME_PERMISSION_KEYS = new Set(['network.request']);
197
- /**
198
- * 判断 permission key 是否由 Runtime 权限快照管理。
199
- *
200
- * @param key 待判断的 permission key。
201
- * @returns 该 key 需要读取 Runtime 权限快照时返回 `true`。
202
- */
203
- function isManagedMiniProgramRuntimePermissionKey(key) {
204
- return MANAGED_RUNTIME_PERMISSION_KEYS.has(key);
205
- }
206
- /**
207
- * 解析服务端权限快照;格式不完整时整份快照失效并 fail closed。
208
- *
209
- * @param snapshot 待校验的服务端权限快照。
210
- * @returns 解析状态和通过校验的受管权限。
211
- */
212
- function parseMiniProgramRuntimePermissions(snapshot) {
213
- if (!isRecord$2(snapshot) || snapshot.schema_version !== 1 || !Array.isArray(snapshot.entries)) {
214
- return { valid: false, permissions: {} };
215
- }
216
- if (snapshot.revision !== undefined && (typeof snapshot.revision !== 'number' || !Number.isInteger(snapshot.revision) || snapshot.revision < 0)) {
217
- return { valid: false, permissions: {} };
218
- }
219
- const seenKeys = new Set();
220
- const permissions = {};
221
- for (const rawEntry of snapshot.entries) {
222
- if (!isRecord$2(rawEntry) || typeof rawEntry.key !== 'string' || !rawEntry.key.trim()) {
223
- return { valid: false, permissions: {} };
224
- }
225
- const key = rawEntry.key.trim();
226
- if (seenKeys.has(key) || (rawEntry.status !== 'enabled' && rawEntry.status !== 'disabled') || !isRecord$2(rawEntry.config)) {
227
- return { valid: false, permissions: {} };
228
- }
229
- seenKeys.add(key);
230
- if (!isManagedMiniProgramRuntimePermissionKey(key)) {
231
- continue;
232
- }
233
- if (key === 'network.request' && typeof rawEntry.config.useOfficialDomain !== 'boolean') {
234
- return { valid: false, permissions: {} };
235
- }
236
- permissions[key] = {
237
- key,
238
- status: rawEntry.status,
239
- config: { useOfficialDomain: rawEntry.config.useOfficialDomain },
240
- };
241
- }
242
- return { valid: true, permissions };
243
- }
244
- function isRecord$2(value) {
245
- return typeof value === 'object' && value !== null && !Array.isArray(value);
246
- }
247
-
248
199
  /** Dev Shell 读取局域网 Dev Session endpoint 的 query 参数。 */
249
200
  /** Mock Host 创建和读取 Dev Session 的固定路径。 */
250
201
  const MINI_PROGRAM_DEV_CONTEXT_PATH = '/__hb_sdk__/dev-context';
@@ -690,7 +641,7 @@ function validateDevSessionCreatePayload(payload, allowedMiniUrlOrigins) {
690
641
  !allowedMiniUrlOrigins.has(miniUrlOrigin.origin)) {
691
642
  throw new TypeError('mini_url_origin must be an allowed LAN origin');
692
643
  }
693
- const parsedPermissions = parseMiniProgramRuntimePermissions(payload.runtime_permissions);
644
+ const parsedPermissions = context.parseMiniProgramRuntimePermissions(payload.runtime_permissions);
694
645
  if (!parsedPermissions.valid) {
695
646
  throw new TypeError('runtime_permissions is invalid');
696
647
  }
@@ -1033,7 +984,7 @@ async function handleDevPermissionMutation(request, response, controller) {
1033
984
  if (!isRecord$1(payload) || Object.keys(payload).length !== 1 || !Object.hasOwn(payload, 'runtime_permissions')) {
1034
985
  throw createMockHostError(400, 'INVALID_DEV_PERMISSIONS', 'Dev permissions update body is invalid');
1035
986
  }
1036
- const parsed = parseMiniProgramRuntimePermissions(payload.runtime_permissions);
987
+ const parsed = context.parseMiniProgramRuntimePermissions(payload.runtime_permissions);
1037
988
  if (!parsed.valid) {
1038
989
  throw createMockHostError(400, 'INVALID_DEV_PERMISSIONS', 'runtime_permissions is invalid');
1039
990
  }
@@ -1216,48 +1167,10 @@ function createHeyboxProtocol(payload) {
1216
1167
  return `heybox://${encodeURIComponent(JSON.stringify(payload))}`;
1217
1168
  }
1218
1169
 
1219
- const DEFAULT_PERMISSION_STATE = {
1220
- networkRequest: {
1221
- status: 'disabled',
1222
- useOfficialDomain: false,
1223
- },
1224
- };
1225
- function createMiniProgramMockPermissionState(context) {
1226
- const parsed = parseMiniProgramRuntimePermissions(context.runtimePermissions);
1227
- const networkRequest = parsed.permissions['network.request'];
1228
- return parsed.valid && networkRequest
1229
- ? {
1230
- networkRequest: {
1231
- status: networkRequest.status,
1232
- useOfficialDomain: networkRequest.config.useOfficialDomain === true,
1233
- },
1234
- }
1235
- : cloneDefaultPermissionState();
1236
- }
1237
- function createMiniProgramMockRuntimePermissions(state) {
1238
- return {
1239
- schema_version: 1,
1240
- entries: [
1241
- {
1242
- key: 'network.request',
1243
- status: state.networkRequest.status,
1244
- config: {
1245
- useOfficialDomain: state.networkRequest.useOfficialDomain,
1246
- },
1247
- },
1248
- ],
1249
- };
1250
- }
1251
- function cloneDefaultPermissionState() {
1252
- return {
1253
- networkRequest: { ...DEFAULT_PERMISSION_STATE.networkRequest },
1254
- };
1255
- }
1256
-
1257
1170
  /** 构建时替换为当前发布包的实际版本。 */
1258
1171
  const HB_SDK_VERSION = typeof undefined === 'string'
1259
1172
  ? undefined
1260
- : '0.6.6-alpha.2';
1173
+ : '0.6.6-alpha.4';
1261
1174
 
1262
1175
  class DevPermissionOverrideStoreError extends Error {
1263
1176
  code;
@@ -1405,7 +1318,7 @@ async function runDevCommand(options, runtime = {}) {
1405
1318
  hmrHost: createLanInterfaceCandidates(networkInterfaceSnapshot)[0]?.address,
1406
1319
  port: appPort,
1407
1320
  };
1408
- const projectRoot = findProjectRoot(runtime.cwd ?? process.cwd());
1321
+ const projectRoot = projectVite.findProjectRoot(runtime.cwd ?? process.cwd());
1409
1322
  const devLaunchContext = await loadDevLaunchContext({
1410
1323
  env: runtime.env,
1411
1324
  fetchImpl,
@@ -1427,8 +1340,8 @@ async function runDevCommand(options, runtime = {}) {
1427
1340
  }),
1428
1341
  projectRoot,
1429
1342
  });
1430
- const vite = await logger.task('正在加载项目 Vite', () => loadProjectVite(projectRoot), { successText: '已加载项目 Vite' });
1431
- const appServer = await logger.task('正在创建 Vite dev server', () => withManagedDevOutputEnv(() => vite.createServer(createViteServerOptions(projectRoot, resolvedOptions)), runtime.env), { successText: '已创建 Vite dev server' });
1343
+ const vite = await logger.task('正在加载项目 Vite', () => projectVite.loadProjectVite(projectRoot), { successText: '已加载项目 Vite' });
1344
+ const appServer = await logger.task('正在创建 Vite dev server', () => withManagedDevOutputEnv(() => vite.createServer(createViteServerOptions(projectRoot, resolvedOptions)), runtime.env, devLaunchContext.runtimePermissions), { successText: '已创建 Vite dev server' });
1432
1345
  await logger.task('正在启动 Vite dev server', () => appServer.listen(appPort), {
1433
1346
  successText: 'Vite dev server 已启动',
1434
1347
  });
@@ -1545,7 +1458,7 @@ function createDevPermissionController(options) {
1545
1458
  source: devContext.source,
1546
1459
  ...(miniProgramId ? { mini_program_id: miniProgramId } : {}),
1547
1460
  ...(isRuntimePermissionsSnapshot(devContext.runtimePermissions) ? { remote_permissions: devContext.runtimePermissions } : {}),
1548
- ...(overrides ? { override_permissions: createMiniProgramMockRuntimePermissions(overrides) } : {}),
1461
+ ...(overrides ? { override_permissions: context.createMiniProgramMockRuntimePermissions(overrides) } : {}),
1549
1462
  ...(error ? { persistence_error: error } : {}),
1550
1463
  };
1551
1464
  };
@@ -1582,7 +1495,7 @@ function createDevPermissionController(options) {
1582
1495
  return createConfiguration(undefined);
1583
1496
  },
1584
1497
  async save(runtimePermissions) {
1585
- const overrides = createMiniProgramMockPermissionState({
1498
+ const overrides = context.createMiniProgramMockPermissionState({
1586
1499
  runtimePermissions,
1587
1500
  });
1588
1501
  try {
@@ -1600,7 +1513,7 @@ function createDevPermissionController(options) {
1600
1513
  };
1601
1514
  }
1602
1515
  function isRuntimePermissionsSnapshot(value) {
1603
- return parseMiniProgramRuntimePermissions(value).valid;
1516
+ return context.parseMiniProgramRuntimePermissions(value).valid;
1604
1517
  }
1605
1518
  async function loadRemoteDevContextWithTimeout(options) {
1606
1519
  const controller = new AbortController();
@@ -1623,39 +1536,6 @@ async function loadRemoteDevContextWithTimeout(options) {
1623
1536
  }
1624
1537
  }
1625
1538
  }
1626
- function findProjectRoot(startDir) {
1627
- let current = path.resolve(startDir);
1628
- while (true) {
1629
- if (fs.existsSync(path.join(current, 'package.json'))) {
1630
- return current;
1631
- }
1632
- const parent = path.dirname(current);
1633
- if (parent === current) {
1634
- throw new Error('当前目录或父目录未找到 package.json');
1635
- }
1636
- current = parent;
1637
- }
1638
- }
1639
- async function loadProjectVite(projectRoot) {
1640
- const projectRequire = node_module.createRequire(path.join(projectRoot, 'package.json'));
1641
- try {
1642
- const packageJson = JSON.parse(await fs$1.readFile(path.join(projectRoot, 'package.json'), 'utf8'));
1643
- if (!hasPackageDependency(packageJson, 'vite')) {
1644
- throw new Error('package.json 未声明 vite');
1645
- }
1646
- const viteEntry = projectRequire.resolve('vite');
1647
- return (await import(node_url.pathToFileURL(viteEntry).href));
1648
- }
1649
- catch (error) {
1650
- throw new Error(`当前项目未安装 vite。请先安装项目依赖,或将 vite 放到项目 devDependencies。原始错误: ${index.readErrorMessage(error)}`);
1651
- }
1652
- }
1653
- function hasPackageDependency(packageJson, name) {
1654
- return Boolean(packageJson.dependencies?.[name] ||
1655
- packageJson.devDependencies?.[name] ||
1656
- packageJson.optionalDependencies?.[name] ||
1657
- packageJson.peerDependencies?.[name]);
1658
- }
1659
1539
  function createViteServerOptions(projectRoot, options) {
1660
1540
  const configFile = resolveProjectViteConfig(projectRoot);
1661
1541
  const server = {
@@ -1775,18 +1655,18 @@ function rewriteLocalhostUrl(input) {
1775
1655
  function isLocalhostHost(hostname) {
1776
1656
  return hostname === 'localhost' || hostname === '::1' || hostname === '[::1]';
1777
1657
  }
1778
- async function withManagedDevOutputEnv(action, env = process.env) {
1779
- const previous = env[MANAGED_DEV_OUTPUT_ENV];
1658
+ async function withManagedDevOutputEnv(action, env = process.env, runtimePermissions) {
1659
+ const previousManagedOutput = env[MANAGED_DEV_OUTPUT_ENV];
1780
1660
  env[MANAGED_DEV_OUTPUT_ENV] = '1';
1781
1661
  try {
1782
- return await action();
1662
+ return await runtimePermissionEnv.withMiniappPlatformCspEnv(context.shouldSkipMiniappPlatformCsp(runtimePermissions), action, env);
1783
1663
  }
1784
1664
  finally {
1785
- if (previous === undefined) {
1665
+ if (previousManagedOutput === undefined) {
1786
1666
  delete env[MANAGED_DEV_OUTPUT_ENV];
1787
1667
  }
1788
1668
  else {
1789
- env[MANAGED_DEV_OUTPUT_ENV] = previous;
1669
+ env[MANAGED_DEV_OUTPUT_ENV] = previousManagedOutput;
1790
1670
  }
1791
1671
  }
1792
1672
  }
@@ -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-ByDy5HXi.cjs');
7
+ var index = require('./index-19i3Dr5H.cjs');
8
8
  require('node:module');
9
9
  require('path');
10
10
  require('os');
@@ -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-ByDy5HXi.cjs', document.baseURI).href)));
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-19i3Dr5H.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-ByDy5HXi.cjs', document.baseURI).href)));
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-19i3Dr5H.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-ByDy5HXi.cjs', document.baseURI).href)));
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-19i3Dr5H.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-ByDy5HXi.cjs', document.baseURI).href)));
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-19i3Dr5H.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-ByDy5HXi.cjs', document.baseURI).href)));
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-19i3Dr5H.cjs', document.baseURI).href)));
250
250
  function __require() { return require$1("node:process"); }
251
251
 
252
252
  var help = {};
@@ -13241,7 +13241,7 @@ function loadEnvPreset(argv, options = {}) {
13241
13241
  * 支持 `--env-file path`、`--env-file=path` 两种写法。
13242
13242
  */
13243
13243
  function readEnvFileArgFromArgv(argv) {
13244
- for (let i = 0; i < argv.length; i += 1) {
13244
+ for (let i = argv.length - 1; i >= 0; i -= 1) {
13245
13245
  const arg = argv[i];
13246
13246
  if (arg === '--env-file') {
13247
13247
  return argv[i + 1];
@@ -13257,7 +13257,7 @@ function readEnvFileArgFromArgv(argv) {
13257
13257
  * 支持 `--env name`、`--env=name` 两种写法。
13258
13258
  */
13259
13259
  function readEnvNameArgFromArgv(argv) {
13260
- for (let i = 0; i < argv.length; i += 1) {
13260
+ for (let i = argv.length - 1; i >= 0; i -= 1) {
13261
13261
  const arg = argv[i];
13262
13262
  if (arg === '--env') {
13263
13263
  return argv[i + 1];
@@ -13347,7 +13347,7 @@ function getPathname(pathWithQuery) {
13347
13347
  }
13348
13348
 
13349
13349
  const CLI_VERSION_PLACEHOLDER = ['__HB', 'SDK', 'CLI', 'VERSION__'].join('_');
13350
- const BUILT_CLI_VERSION = '0.6.6-alpha.2';
13350
+ const BUILT_CLI_VERSION = '0.6.6-alpha.4';
13351
13351
  const PACKAGE_JSON_CANDIDATES = [
13352
13352
  path.resolve(__dirname, '..', '..', 'package.json'),
13353
13353
  path.resolve(__dirname, '..', 'package.json'),
@@ -13407,6 +13407,7 @@ function createCliProgram(overrides = {}) {
13407
13407
  loginToHeybox: defaultLoginToHeybox,
13408
13408
  printLoginStatus: defaultPrintLoginStatus,
13409
13409
  printUpdateReminder: printUpdateReminder,
13410
+ runBuildCommand: defaultRunBuildCommand,
13410
13411
  runCreateCommand: defaultRunCreateCommand,
13411
13412
  runDevCommand: defaultRunDevCommand,
13412
13413
  runDoctorCommand: defaultRunDoctorCommand,
@@ -13420,7 +13421,7 @@ function createCliProgram(overrides = {}) {
13420
13421
  .description('hb-sdk developer tools')
13421
13422
  .version(getCliVersion())
13422
13423
  .option('-v, --verbose', '输出详细调试信息')
13423
- .option('--env <name>', '加载项目根下 .env.<name> 预设,并将 deploy 构建的 Vite mode 设为 name')
13424
+ .option('--env <name>', '加载项目根下 .env.<name> 预设,供 build deploy 使用')
13424
13425
  .option('--env-file <path>', '显式指定 .env 文件路径,优先级高于 --env')
13425
13426
  .showHelpAfterError()
13426
13427
  .exitOverride();
@@ -13439,6 +13440,17 @@ function createCliProgram(overrides = {}) {
13439
13440
  const logger = resolveLogger(command);
13440
13441
  await handlers.runDevCommand(options, { logger });
13441
13442
  }, handlers.printUpdateReminder, resolveLogger));
13443
+ addVerboseOption(program.command('build').description('构建当前小程序项目').option('--env <name>', '加载项目根下 .env.<name> 预设并作为 Vite mode')).action(async (...args) => {
13444
+ const command = readCommandFromActionArgs(args);
13445
+ if (!command) {
13446
+ throw new Error('无法解析 build 命令上下文');
13447
+ }
13448
+ if (readStringOption(readCommandOptionsWithAncestors(command).envFile) !== undefined) {
13449
+ throw new Error('hb-sdk build 不支持 --env-file,请使用 --env <name>');
13450
+ }
13451
+ const logger = resolveLogger(command);
13452
+ await handlers.runBuildCommand({}, { logger });
13453
+ });
13442
13454
  installRemoteCommands(program, handlers, resolveLogger);
13443
13455
  addVerboseOption(program.command('doctor').description('诊断 hb-sdk 本地环境和 Agent Skill 版本')).action(async (...args) => {
13444
13456
  const logger = resolveLogger(readCommandFromActionArgs(args));
@@ -13668,31 +13680,35 @@ function createCommandLoggerResolver(options) {
13668
13680
  };
13669
13681
  }
13670
13682
  const defaultClearLoginStatus = async (...args) => {
13671
- const { clearLoginStatus } = await Promise.resolve().then(function () { return require('./login-fNe0eDs_.cjs'); });
13683
+ const { clearLoginStatus } = await Promise.resolve().then(function () { return require('./login-BIIUGwoq.cjs'); });
13672
13684
  return clearLoginStatus(...args);
13673
13685
  };
13674
13686
  const defaultLoginToHeybox = async (...args) => {
13675
- const { loginToHeybox } = await Promise.resolve().then(function () { return require('./login-fNe0eDs_.cjs'); });
13687
+ const { loginToHeybox } = await Promise.resolve().then(function () { return require('./login-BIIUGwoq.cjs'); });
13676
13688
  return loginToHeybox(...args);
13677
13689
  };
13678
13690
  const defaultPrintLoginStatus = async (...args) => {
13679
- const { printLoginStatus } = await Promise.resolve().then(function () { return require('./login-fNe0eDs_.cjs'); });
13691
+ const { printLoginStatus } = await Promise.resolve().then(function () { return require('./login-BIIUGwoq.cjs'); });
13680
13692
  return printLoginStatus(...args);
13681
13693
  };
13694
+ const defaultRunBuildCommand = async (...args) => {
13695
+ const { runBuildCommand } = await Promise.resolve().then(function () { return require('./build-C54stoRf.cjs'); });
13696
+ return runBuildCommand(...args);
13697
+ };
13682
13698
  const defaultRunCreateCommand = async (...args) => {
13683
- const { runCreateCommand } = await Promise.resolve().then(function () { return require('./create-CxjB3oSo.cjs'); });
13699
+ const { runCreateCommand } = await Promise.resolve().then(function () { return require('./create-uQS30kS_.cjs'); });
13684
13700
  return runCreateCommand(...args);
13685
13701
  };
13686
13702
  const defaultRunDevCommand = async (...args) => {
13687
- const { runDevCommand } = await Promise.resolve().then(function () { return require('./dev-Km0or0yY.cjs'); });
13703
+ const { runDevCommand } = await Promise.resolve().then(function () { return require('./dev-1wE8dNiL.cjs'); });
13688
13704
  return runDevCommand(...args);
13689
13705
  };
13690
13706
  const defaultRunDoctorCommand = async (...args) => {
13691
- const { runDoctorCommand } = await Promise.resolve().then(function () { return require('./doctor-baVOqNSh.cjs'); });
13707
+ const { runDoctorCommand } = await Promise.resolve().then(function () { return require('./doctor-B2aCUOQ7.cjs'); });
13692
13708
  return runDoctorCommand(...args);
13693
13709
  };
13694
13710
  const defaultRunRemoteCommand = async (...args) => {
13695
- const { runRemoteCommand } = await Promise.resolve().then(function () { return require('./remote-BRIlRrCG.cjs'); });
13711
+ const { runRemoteCommand } = await Promise.resolve().then(function () { return require('./remote-47MjCKhu.cjs'); });
13696
13712
  return runRemoteCommand(...args);
13697
13713
  };
13698
13714
  function resolveStandaloneLogger(options, verbose) {
@@ -1,13 +1,13 @@
1
1
  'use strict';
2
2
 
3
- var index$2 = require('./index-ByDy5HXi.cjs');
3
+ var index$2 = require('./index-19i3Dr5H.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-CM46YbPT.cjs');
10
+ var runtimePermissionEnv = require('./runtime-permission-env-BSs4uCNa.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');
@@ -13707,7 +13707,7 @@ function requireSource () {
13707
13707
  const ajv_1 = requireAjv$1();
13708
13708
  const ajv_formats_1 = requireDist();
13709
13709
  const debounceFn = requireDebounceFn();
13710
- const semver = context$1.requireSemver();
13710
+ const semver = runtimePermissionEnv.requireSemver();
13711
13711
  const onetime = index$2.requireOnetime();
13712
13712
  const encryptionAlgorithm = 'aes-256-cbc';
13713
13713
  const createPlainObject = () => {
@@ -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-CTcelATz.cjs');
6
+ var session = require('./session-DJEuhrgq.cjs');
7
7
  var browser = require('./browser-RAy8e8cV.cjs');
8
- var index = require('./index-ByDy5HXi.cjs');
8
+ var index = require('./index-19i3Dr5H.cjs');
9
9
  require('node:path');
10
10
  require('fs');
11
11
  require('constants');
@@ -0,0 +1,45 @@
1
+ 'use strict';
2
+
3
+ var fs = require('node:fs');
4
+ var fs$1 = require('node:fs/promises');
5
+ var node_module = require('node:module');
6
+ var path = require('node:path');
7
+ var node_url = require('node:url');
8
+ var index = require('./index-19i3Dr5H.cjs');
9
+
10
+ function findProjectRoot(startDir) {
11
+ let current = path.resolve(startDir);
12
+ while (true) {
13
+ if (fs.existsSync(path.join(current, 'package.json'))) {
14
+ return current;
15
+ }
16
+ const parent = path.dirname(current);
17
+ if (parent === current) {
18
+ throw new Error('当前目录或父目录未找到 package.json');
19
+ }
20
+ current = parent;
21
+ }
22
+ }
23
+ async function loadProjectVite(projectRoot) {
24
+ const projectRequire = node_module.createRequire(path.join(projectRoot, 'package.json'));
25
+ try {
26
+ const packageJson = JSON.parse(await fs$1.readFile(path.join(projectRoot, 'package.json'), 'utf8'));
27
+ if (!hasPackageDependency(packageJson, 'vite')) {
28
+ throw new Error('package.json 未声明 vite');
29
+ }
30
+ const viteEntry = projectRequire.resolve('vite');
31
+ return (await import(node_url.pathToFileURL(viteEntry).href));
32
+ }
33
+ catch (error) {
34
+ throw new Error(`当前项目未安装 vite。请先安装项目依赖,或将 vite 放到项目 devDependencies。原始错误: ${index.readErrorMessage(error)}`);
35
+ }
36
+ }
37
+ function hasPackageDependency(packageJson, name) {
38
+ return Boolean(packageJson.dependencies?.[name] ||
39
+ packageJson.devDependencies?.[name] ||
40
+ packageJson.optionalDependencies?.[name] ||
41
+ packageJson.peerDependencies?.[name]);
42
+ }
43
+
44
+ exports.findProjectRoot = findProjectRoot;
45
+ exports.loadProjectVite = loadProjectVite;