@simonyea/holysheep-cli 2.1.53 → 2.1.54

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.
@@ -4019,11 +4019,11 @@ var require_package = __commonJS({
4019
4019
  "package.json"(exports2, module2) {
4020
4020
  module2.exports = {
4021
4021
  name: "@simonyea/holysheep-cli",
4022
- version: "2.1.53",
4022
+ version: "2.1.54",
4023
4023
  description: "Claude Code/Cursor/Cline API relay for China \u2014 \xA51=$1, WeChat/Alipay payment, no credit card, no VPN. One command setup for all AI coding tools.",
4024
4024
  scripts: {
4025
4025
  build: "node scripts/build.mjs",
4026
- test: "node tests/droid.test.js && node tests/workspace-store.test.js && node tests/runtime-stale-upgrade.test.js && node tests/hermes.test.js && node tests/preflight.test.js && node tests/opencode-auth-purge.test.js && node tests/shell-winpath.test.js && node tests/openclaw-atomic-write.test.js && node tests/opencode-default-model.test.js && node tests/paths-bundled.test.js && node tests/aionui-runtime-resources.test.js && node tests/aionui-wrapper-claude-proxy.test.js && node tests/aionui-wrapper-probe.test.js && node tests/aionui-wrapper-proxy-integration.test.js && node tests/aionui-wrapper-all-clis-autoconf.test.js && node tests/aionui-wrapper-env-signal.test.js && node tests/aionui-wrapper-csp-rewrite.test.js && node tests/version-check.test.js && node tests/runclaude-missing-binary.test.js",
4026
+ test: "node tests/droid.test.js && node tests/workspace-store.test.js && node tests/runtime-stale-upgrade.test.js && node tests/hermes.test.js && node tests/preflight.test.js && node tests/opencode-auth-purge.test.js && node tests/shell-winpath.test.js && node tests/openclaw-atomic-write.test.js && node tests/opencode-default-model.test.js && node tests/paths-bundled.test.js && node tests/aionui-runtime-resources.test.js && node tests/aionui-wrapper-claude-proxy.test.js && node tests/aionui-wrapper-probe.test.js && node tests/aionui-wrapper-proxy-integration.test.js && node tests/aionui-wrapper-all-clis-autoconf.test.js && node tests/aionui-wrapper-env-signal.test.js && node tests/aionui-wrapper-csp-rewrite.test.js && node tests/aionui-wrapper-version-status.test.js && node tests/version-check.test.js && node tests/runclaude-missing-binary.test.js",
4027
4027
  prepublishOnly: "npm run build && npm test && node scripts/check-tarball-size.js"
4028
4028
  },
4029
4029
  keywords: [
package/dist/index.js CHANGED
@@ -12,11 +12,11 @@ var require_package = __commonJS({
12
12
  "package.json"(exports2, module2) {
13
13
  module2.exports = {
14
14
  name: "@simonyea/holysheep-cli",
15
- version: "2.1.53",
15
+ version: "2.1.54",
16
16
  description: "Claude Code/Cursor/Cline API relay for China \u2014 \xA51=$1, WeChat/Alipay payment, no credit card, no VPN. One command setup for all AI coding tools.",
17
17
  scripts: {
18
18
  build: "node scripts/build.mjs",
19
- test: "node tests/droid.test.js && node tests/workspace-store.test.js && node tests/runtime-stale-upgrade.test.js && node tests/hermes.test.js && node tests/preflight.test.js && node tests/opencode-auth-purge.test.js && node tests/shell-winpath.test.js && node tests/openclaw-atomic-write.test.js && node tests/opencode-default-model.test.js && node tests/paths-bundled.test.js && node tests/aionui-runtime-resources.test.js && node tests/aionui-wrapper-claude-proxy.test.js && node tests/aionui-wrapper-probe.test.js && node tests/aionui-wrapper-proxy-integration.test.js && node tests/aionui-wrapper-all-clis-autoconf.test.js && node tests/aionui-wrapper-env-signal.test.js && node tests/aionui-wrapper-csp-rewrite.test.js && node tests/version-check.test.js && node tests/runclaude-missing-binary.test.js",
19
+ test: "node tests/droid.test.js && node tests/workspace-store.test.js && node tests/runtime-stale-upgrade.test.js && node tests/hermes.test.js && node tests/preflight.test.js && node tests/opencode-auth-purge.test.js && node tests/shell-winpath.test.js && node tests/openclaw-atomic-write.test.js && node tests/opencode-default-model.test.js && node tests/paths-bundled.test.js && node tests/aionui-runtime-resources.test.js && node tests/aionui-wrapper-claude-proxy.test.js && node tests/aionui-wrapper-probe.test.js && node tests/aionui-wrapper-proxy-integration.test.js && node tests/aionui-wrapper-all-clis-autoconf.test.js && node tests/aionui-wrapper-env-signal.test.js && node tests/aionui-wrapper-csp-rewrite.test.js && node tests/aionui-wrapper-version-status.test.js && node tests/version-check.test.js && node tests/runclaude-missing-binary.test.js",
20
20
  prepublishOnly: "npm run build && npm test && node scripts/check-tarball-size.js"
21
21
  },
22
22
  keywords: [
@@ -8854,6 +8854,16 @@ var require_aionui_wrapper = __commonJS({
8854
8854
  // tool ids that are installed but not configured
8855
8855
  openclawNeedsPairing: false
8856
8856
  };
8857
+ var _aionuiUpgrade = {
8858
+ status: "idle",
8859
+ // idle | running | success | error
8860
+ pid: null,
8861
+ logFile: null,
8862
+ startedAt: null,
8863
+ finishedAt: null,
8864
+ exitCode: null,
8865
+ message: ""
8866
+ };
8857
8867
  function log(msg) {
8858
8868
  console.log(`[holysheep-web] ${msg}`);
8859
8869
  }
@@ -9199,10 +9209,9 @@ var require_aionui_wrapper = __commonJS({
9199
9209
  }
9200
9210
  }
9201
9211
  __name(rewriteCspHeaders, "rewriteCspHeaders");
9202
- function _buildStartupBannerScript() {
9212
+ function _getStartupWarningMessages() {
9203
9213
  const notInstalled = _startupWarnings.notInstalled || [];
9204
9214
  const needsPairing = _startupWarnings.openclawNeedsPairing;
9205
- if (notInstalled.length === 0 && !needsPairing) return "";
9206
9215
  const lines = [];
9207
9216
  if (notInstalled.length > 0) {
9208
9217
  const names = notInstalled.map((id) => {
@@ -9214,19 +9223,74 @@ var require_aionui_wrapper = __commonJS({
9214
9223
  if (needsPairing) {
9215
9224
  lines.push("\u26A0\uFE0F OpenClaw Gateway \u9700\u8981 Pairing \u8BA4\u8BC1\u3002\u8BF7\u8FD0\u884C <code>hs openclaw</code> \u5B8C\u6210\u914D\u7F6E\uFF0C\u5426\u5219 OpenClaw \u5BF9\u8BDD\u5C06\u6301\u7EED\u62A5\u9519\u3002");
9216
9225
  }
9217
- const msgJson = JSON.stringify(lines);
9226
+ return lines;
9227
+ }
9228
+ __name(_getStartupWarningMessages, "_getStartupWarningMessages");
9229
+ function _buildStartupBannerScript() {
9230
+ const startupMsgs = _getStartupWarningMessages();
9231
+ const startupJson = JSON.stringify(startupMsgs);
9218
9232
  return `<script>
9219
9233
  (function(){
9220
- var KEY='hs-startup-banner-dismissed';
9221
- if(sessionStorage.getItem(KEY)) return;
9222
- var msgs=${msgJson};
9223
- if(!msgs||!msgs.length) return;
9224
- var d=document.createElement('div');
9225
- d.style.cssText='position:fixed;bottom:16px;right:16px;z-index:99999;max-width:420px;background:#ff8c00;color:#fff;padding:12px 16px;border-radius:8px;font-size:13px;line-height:1.5;box-shadow:0 4px 16px rgba(0,0,0,.3);cursor:pointer';
9226
- d.innerHTML=msgs.join('<br><br>')+'<br><span style="font-size:11px;opacity:.8">\u70B9\u51FB\u5173\u95ED (\u672C\u6B21\u4F1A\u8BDD\u4E0D\u518D\u663E\u793A)</span>';
9227
- d.addEventListener('click',function(){document.body.removeChild(d);sessionStorage.setItem(KEY,'1')});
9228
- setTimeout(function(){if(d.parentNode)document.body.removeChild(d);},30000);
9229
- document.body.appendChild(d);
9234
+ if(window.__hsBannerInstalled) return; window.__hsBannerInstalled=true;
9235
+ var DISMISS_KEY='hs-startup-banner-dismissed';
9236
+ var UPGRADE_DISMISS_KEY='hs-upgrade-banner-dismissed';
9237
+ function el(tag,style,html){var x=document.createElement(tag);if(style)x.style.cssText=style;if(html!=null)x.innerHTML=html;return x}
9238
+ function showBanner(opts){
9239
+ var bg=opts.color||'#ff8c00';
9240
+ var d=el('div','position:fixed;bottom:16px;right:16px;z-index:99999;max-width:440px;background:'+bg+';color:#fff;padding:12px 16px;border-radius:8px;font-size:13px;line-height:1.5;box-shadow:0 4px 16px rgba(0,0,0,.3)');
9241
+ d.innerHTML=opts.html;
9242
+ document.body.appendChild(d);
9243
+ return d;
9244
+ }
9245
+ // 1) Static startup warnings
9246
+ (function(){
9247
+ if(sessionStorage.getItem(DISMISS_KEY))return;
9248
+ var msgs=${startupJson}; if(!msgs.length)return;
9249
+ var d=showBanner({html:msgs.join('<br><br>')+'<br><span style="font-size:11px;opacity:.8;cursor:pointer">\u70B9\u51FB\u5173\u95ED (\u672C\u6B21\u4F1A\u8BDD\u4E0D\u518D\u663E\u793A)</span>'});
9250
+ d.style.cursor='pointer';
9251
+ d.addEventListener('click',function(){if(d.parentNode)d.parentNode.removeChild(d);sessionStorage.setItem(DISMISS_KEY,'1')});
9252
+ setTimeout(function(){if(d.parentNode)d.parentNode.removeChild(d);},30000);
9253
+ })();
9254
+ // 2) AionUi/CLI upgrade banner \u2014 async fetch
9255
+ (function(){
9256
+ if(sessionStorage.getItem(UPGRADE_DISMISS_KEY))return;
9257
+ fetch('/api/holysheep/__wrapper/version-status').then(function(r){return r.json()}).catch(function(){return null}).then(function(j){
9258
+ if(!j||!j.upgradeAvailable)return;
9259
+ var current=j.cli&&j.cli.current||'?';
9260
+ var latest=j.cli&&j.cli.latest||'?';
9261
+ var bannerHtml='\u2728 <b>AionUi \u6709\u65B0\u7248\u672C\u53EF\u7528</b><br>\u5F53\u524D: v'+current+' \u2192 \u6700\u65B0: v'+latest+'<br><br>'+
9262
+ '<button id="hs-upgrade-btn" style="background:#fff;color:#1976d2;border:0;padding:6px 12px;border-radius:4px;font-size:12px;cursor:pointer;font-weight:600">\u7ACB\u5373\u66F4\u65B0</button> '+
9263
+ '<button id="hs-upgrade-dismiss" style="background:transparent;color:#fff;border:1px solid rgba(255,255,255,.5);padding:6px 12px;border-radius:4px;font-size:12px;cursor:pointer">\u7A0D\u540E</button>'+
9264
+ '<div id="hs-upgrade-progress" style="margin-top:10px;font-size:11px;display:none"></div>';
9265
+ var d=showBanner({color:'#1976d2',html:bannerHtml});
9266
+ var btn=d.querySelector('#hs-upgrade-btn');
9267
+ var dis=d.querySelector('#hs-upgrade-dismiss');
9268
+ var prog=d.querySelector('#hs-upgrade-progress');
9269
+ dis.addEventListener('click',function(){if(d.parentNode)d.parentNode.removeChild(d);sessionStorage.setItem(UPGRADE_DISMISS_KEY,'1')});
9270
+ btn.addEventListener('click',function(){
9271
+ btn.disabled=true;btn.style.opacity='.6';btn.textContent='\u6B63\u5728\u542F\u52A8...';
9272
+ prog.style.display='block';prog.textContent='\u63D0\u4EA4\u540E\u53F0\u66F4\u65B0\u4EFB\u52A1...';
9273
+ fetch('/api/holysheep/__wrapper/aionui-update',{method:'POST'}).then(function(r){return r.json()}).then(function(res){
9274
+ if(!res||!res.ok){prog.textContent='\u542F\u52A8\u5931\u8D25: '+((res&&res.message)||'unknown');return}
9275
+ prog.textContent='\u5347\u7EA7\u4E2D (pid='+res.pid+')... \u5B8C\u6210\u540E\u8BF7\u5173\u95ED\u5E76\u91CD\u542F hs web';
9276
+ var poll=setInterval(function(){
9277
+ fetch('/api/holysheep/__wrapper/aionui-update').then(function(r){return r.json()}).then(function(s){
9278
+ if(!s)return;
9279
+ if(s.status==='running'){prog.textContent='\u5347\u7EA7\u4E2D (pid='+s.pid+')...';return}
9280
+ clearInterval(poll);
9281
+ if(s.status==='success'){
9282
+ btn.style.display='none';dis.textContent='\u6211\u77E5\u9053\u4E86';
9283
+ prog.innerHTML='\u2705 \u5347\u7EA7\u5B8C\u6210 (exit='+s.exitCode+')<br>\u8BF7<b>\u5173\u95ED\u5E76\u91CD\u65B0\u542F\u52A8 hs web</b> \u4EE5\u4F7F\u7528\u65B0\u7248\u672C\u3002';
9284
+ }else{
9285
+ prog.innerHTML='\u274C \u5347\u7EA7\u5931\u8D25 (exit='+s.exitCode+')<br>\u8BF7\u6253\u5F00\u7EC8\u7AEF\u8FD0\u884C: <code>npm i -g @simonyea/holysheep-cli@latest</code><br>\u65E5\u5FD7: <code>'+(s.logFile||'-')+'</code>';
9286
+ btn.disabled=false;btn.style.opacity='1';btn.textContent='\u91CD\u8BD5';
9287
+ }
9288
+ }).catch(function(){})
9289
+ },2000);
9290
+ }).catch(function(e){prog.textContent='\u8BF7\u6C42\u5931\u8D25: '+e.message});
9291
+ });
9292
+ });
9293
+ })();
9230
9294
  })();
9231
9295
  </script>`;
9232
9296
  }
@@ -9467,6 +9531,24 @@ var require_aionui_wrapper = __commonJS({
9467
9531
  openclawNeedsPairing: _startupWarnings.openclawNeedsPairing
9468
9532
  });
9469
9533
  }
9534
+ if (route === "/api/holysheep/__wrapper/version-status" && req.method === "GET") {
9535
+ return sendJson(res, 200, _getVersionStatus());
9536
+ }
9537
+ if (route === "/api/holysheep/__wrapper/aionui-update" && req.method === "POST") {
9538
+ const result = _startDetachedNpmUpgrade();
9539
+ return sendJson(res, result.ok ? 200 : 409, result);
9540
+ }
9541
+ if (route === "/api/holysheep/__wrapper/aionui-update" && req.method === "GET") {
9542
+ return sendJson(res, 200, {
9543
+ status: _aionuiUpgrade.status,
9544
+ pid: _aionuiUpgrade.pid,
9545
+ logFile: _aionuiUpgrade.logFile,
9546
+ startedAt: _aionuiUpgrade.startedAt,
9547
+ finishedAt: _aionuiUpgrade.finishedAt,
9548
+ exitCode: _aionuiUpgrade.exitCode,
9549
+ message: _aionuiUpgrade.message
9550
+ });
9551
+ }
9470
9552
  return proxyHttp(req, res, ctx.internalPort);
9471
9553
  } catch (e) {
9472
9554
  try {
@@ -9643,6 +9725,109 @@ var require_aionui_wrapper = __commonJS({
9643
9725
  }
9644
9726
  }
9645
9727
  __name(_checkOpenClawPairingNeeded, "_checkOpenClawPairingNeeded");
9728
+ var VERSION_CACHE_FILE = path.join(os.homedir(), ".holysheep", "last-version-check.json");
9729
+ var UPGRADE_LOG_FILE = path.join(os.homedir(), ".holysheep", "auto-update.log");
9730
+ var PACKAGE_NAME = "@simonyea/holysheep-cli";
9731
+ function _readLocalCliVersion() {
9732
+ try {
9733
+ return require_package().version || null;
9734
+ } catch {
9735
+ return null;
9736
+ }
9737
+ }
9738
+ __name(_readLocalCliVersion, "_readLocalCliVersion");
9739
+ function _readNpmCacheLatest() {
9740
+ try {
9741
+ if (!fs.existsSync(VERSION_CACHE_FILE)) return null;
9742
+ const j = JSON.parse(fs.readFileSync(VERSION_CACHE_FILE, "utf8"));
9743
+ if (j && typeof j.remote === "string") return j.remote;
9744
+ } catch {
9745
+ }
9746
+ return null;
9747
+ }
9748
+ __name(_readNpmCacheLatest, "_readNpmCacheLatest");
9749
+ function _semverCmp(a, b) {
9750
+ const pa = String(a || "").replace(/^v/, "").match(/^(\d+)\.(\d+)\.(\d+)/);
9751
+ const pb = String(b || "").replace(/^v/, "").match(/^(\d+)\.(\d+)\.(\d+)/);
9752
+ if (!pa || !pb) return 0;
9753
+ for (let i = 1; i <= 3; i++) {
9754
+ const da = Number(pa[i]) - Number(pb[i]);
9755
+ if (da !== 0) return da;
9756
+ }
9757
+ return 0;
9758
+ }
9759
+ __name(_semverCmp, "_semverCmp");
9760
+ function _getVersionStatus() {
9761
+ const current = _readLocalCliVersion();
9762
+ const latest = _readNpmCacheLatest();
9763
+ let upgradeAvailable = false;
9764
+ if (current && latest) {
9765
+ upgradeAvailable = _semverCmp(latest, current) > 0;
9766
+ }
9767
+ return {
9768
+ cli: { current, latest, upgradeAvailable },
9769
+ upgradeAvailable
9770
+ };
9771
+ }
9772
+ __name(_getVersionStatus, "_getVersionStatus");
9773
+ function _startDetachedNpmUpgrade() {
9774
+ if (_aionuiUpgrade.status === "running") {
9775
+ return { ok: false, message: "\u5DF2\u6709\u5347\u7EA7\u4EFB\u52A1\u5728\u8FD0\u884C" };
9776
+ }
9777
+ try {
9778
+ fs.mkdirSync(path.dirname(UPGRADE_LOG_FILE), { recursive: true });
9779
+ const header = `[${(/* @__PURE__ */ new Date()).toISOString()}] starting auto-update of ${PACKAGE_NAME}
9780
+ [platform=${process.platform}] [pid-parent=${process.pid}]
9781
+ `;
9782
+ fs.writeFileSync(UPGRADE_LOG_FILE, header);
9783
+ const out = fs.openSync(UPGRADE_LOG_FILE, "a");
9784
+ const isWin = process.platform === "win32";
9785
+ const cmd = isWin ? "npm.cmd" : "npm";
9786
+ const args = ["i", "-g", `${PACKAGE_NAME}@latest`];
9787
+ const child = spawn(cmd, args, {
9788
+ detached: true,
9789
+ stdio: ["ignore", out, out],
9790
+ windowsHide: true,
9791
+ shell: isWin
9792
+ // npm.cmd is a .cmd shim on Windows; needs shell to resolve via PATH
9793
+ });
9794
+ child.on("error", (err) => {
9795
+ _aionuiUpgrade.status = "error";
9796
+ _aionuiUpgrade.message = err.message;
9797
+ _aionuiUpgrade.finishedAt = nowMs();
9798
+ try {
9799
+ fs.appendFileSync(UPGRADE_LOG_FILE, `[error] spawn failed: ${err.message}
9800
+ `);
9801
+ } catch {
9802
+ }
9803
+ });
9804
+ child.on("exit", (code) => {
9805
+ _aionuiUpgrade.status = code === 0 ? "success" : "error";
9806
+ _aionuiUpgrade.exitCode = code;
9807
+ _aionuiUpgrade.finishedAt = nowMs();
9808
+ try {
9809
+ fs.appendFileSync(UPGRADE_LOG_FILE, `[done] exit code=${code}
9810
+ `);
9811
+ } catch {
9812
+ }
9813
+ });
9814
+ child.unref();
9815
+ _aionuiUpgrade.status = "running";
9816
+ _aionuiUpgrade.pid = child.pid;
9817
+ _aionuiUpgrade.logFile = UPGRADE_LOG_FILE;
9818
+ _aionuiUpgrade.startedAt = nowMs();
9819
+ _aionuiUpgrade.finishedAt = null;
9820
+ _aionuiUpgrade.exitCode = null;
9821
+ _aionuiUpgrade.message = "";
9822
+ log(`detached npm upgrade started (pid=${child.pid}, log=${UPGRADE_LOG_FILE})`);
9823
+ return { ok: true, pid: child.pid, logFile: UPGRADE_LOG_FILE };
9824
+ } catch (e) {
9825
+ _aionuiUpgrade.status = "error";
9826
+ _aionuiUpgrade.message = e.message;
9827
+ return { ok: false, message: e.message };
9828
+ }
9829
+ }
9830
+ __name(_startDetachedNpmUpgrade, "_startDetachedNpmUpgrade");
9646
9831
  function _ensureClaudeProxyConfig(apiKey) {
9647
9832
  const config = claudeProcessProxy.readConfig();
9648
9833
  const next = claudeCodeTool.buildBridgeConfig(apiKey, BASE_URL_ANTHROPIC, {
@@ -9943,7 +10128,12 @@ ${tail.split(/\r?\n/).map((ln) => ` ${ln}`).join("\n")}
9943
10128
  ensureOpenClawBridgeRunning,
9944
10129
  rewriteCspHeaders,
9945
10130
  getOpenClawOrigins,
9946
- appendOriginsToDirective
10131
+ appendOriginsToDirective,
10132
+ // [HolySheep v2.1.54] Version-status / upgrade helpers
10133
+ _getVersionStatus,
10134
+ _semverCmp,
10135
+ _readNpmCacheLatest,
10136
+ VERSION_CACHE_FILE
9947
10137
  };
9948
10138
  }
9949
10139
  });
package/package.json CHANGED
@@ -1,10 +1,10 @@
1
1
  {
2
2
  "name": "@simonyea/holysheep-cli",
3
- "version": "2.1.53",
3
+ "version": "2.1.54",
4
4
  "description": "Claude Code/Cursor/Cline API relay for China — ¥1=$1, WeChat/Alipay payment, no credit card, no VPN. One command setup for all AI coding tools.",
5
5
  "scripts": {
6
6
  "build": "node scripts/build.mjs",
7
- "test": "node tests/droid.test.js && node tests/workspace-store.test.js && node tests/runtime-stale-upgrade.test.js && node tests/hermes.test.js && node tests/preflight.test.js && node tests/opencode-auth-purge.test.js && node tests/shell-winpath.test.js && node tests/openclaw-atomic-write.test.js && node tests/opencode-default-model.test.js && node tests/paths-bundled.test.js && node tests/aionui-runtime-resources.test.js && node tests/aionui-wrapper-claude-proxy.test.js && node tests/aionui-wrapper-probe.test.js && node tests/aionui-wrapper-proxy-integration.test.js && node tests/aionui-wrapper-all-clis-autoconf.test.js && node tests/aionui-wrapper-env-signal.test.js && node tests/aionui-wrapper-csp-rewrite.test.js && node tests/version-check.test.js && node tests/runclaude-missing-binary.test.js",
7
+ "test": "node tests/droid.test.js && node tests/workspace-store.test.js && node tests/runtime-stale-upgrade.test.js && node tests/hermes.test.js && node tests/preflight.test.js && node tests/opencode-auth-purge.test.js && node tests/shell-winpath.test.js && node tests/openclaw-atomic-write.test.js && node tests/opencode-default-model.test.js && node tests/paths-bundled.test.js && node tests/aionui-runtime-resources.test.js && node tests/aionui-wrapper-claude-proxy.test.js && node tests/aionui-wrapper-probe.test.js && node tests/aionui-wrapper-proxy-integration.test.js && node tests/aionui-wrapper-all-clis-autoconf.test.js && node tests/aionui-wrapper-env-signal.test.js && node tests/aionui-wrapper-csp-rewrite.test.js && node tests/aionui-wrapper-version-status.test.js && node tests/version-check.test.js && node tests/runclaude-missing-binary.test.js",
8
8
  "prepublishOnly": "npm run build && npm test && node scripts/check-tarball-size.js"
9
9
  },
10
10
  "keywords": [