pinggy 0.4.2 → 0.4.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.
package/dist/index.cjs CHANGED
@@ -3279,6 +3279,11 @@ function removeIPv6Brackets(ip) {
3279
3279
  }
3280
3280
  return ip;
3281
3281
  }
3282
+ function isValidHostAddress(host) {
3283
+ const normalized = removeIPv6Brackets(host.trim());
3284
+ if (normalized.length === 0) return false;
3285
+ return normalized === "localhost" || (0, import_net2.isIP)(normalized) !== 0;
3286
+ }
3282
3287
  function ipv6SafeSplitColon(s) {
3283
3288
  const result = [];
3284
3289
  let buf = "";
@@ -3412,17 +3417,22 @@ function parseReverseTunnelAddr(finalConfig, values, primaryType) {
3412
3417
  function parseLocalTunnelAddr(finalConfig, values) {
3413
3418
  if (!Array.isArray(values.L) || values.L.length === 0) return null;
3414
3419
  const firstL = values.L[0];
3415
- const parts = firstL.split(":");
3420
+ const parts = ipv6SafeSplitColon(firstL);
3421
+ let debuggerHost = "localhost";
3416
3422
  let lp;
3417
3423
  if (parts.length === 3) {
3418
3424
  lp = parseInt(parts[0], 10);
3419
3425
  } else if (parts.length === 4) {
3426
+ debuggerHost = removeIPv6Brackets(parts[0]);
3420
3427
  lp = parseInt(parts[1], 10);
3421
3428
  } else {
3422
3429
  return new Error("Incorrect command line arguments: web debugger address incorrect. Please use '-h' option for help.");
3423
3430
  }
3431
+ if (!isValidHostAddress(debuggerHost)) {
3432
+ return new Error(`Invalid debugger host ${debuggerHost}. Please use localhost, IPv4, or IPv6 address.`);
3433
+ }
3424
3434
  if (!Number.isNaN(lp) && isValidPort(lp)) {
3425
- finalConfig.webDebugger = `localhost:${lp}`;
3435
+ finalConfig.webDebugger = `${debuggerHost}:${lp}`;
3426
3436
  } else {
3427
3437
  return new Error(`Invalid debugger port ${lp}`);
3428
3438
  }
@@ -3556,7 +3566,7 @@ async function buildFinalConfig(values, positionals) {
3556
3566
  storeJson(finalConfig, saveconf);
3557
3567
  return finalConfig;
3558
3568
  }
3559
- var import_pinggy4, import_fs4, import_path4, domainRegex, KEYWORDS, VALID_PROTOCOLS;
3569
+ var import_pinggy4, import_fs4, import_path4, import_net2, domainRegex, KEYWORDS, VALID_PROTOCOLS;
3560
3570
  var init_buildConfig = __esm({
3561
3571
  "src/cli/buildConfig.ts"() {
3562
3572
  "use strict";
@@ -3568,6 +3578,7 @@ var init_buildConfig = __esm({
3568
3578
  import_pinggy4 = require("@pinggy/pinggy");
3569
3579
  import_fs4 = __toESM(require("fs"), 1);
3570
3580
  import_path4 = __toESM(require("path"), 1);
3581
+ import_net2 = require("net");
3571
3582
  domainRegex = /^(?:[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,}$/;
3572
3583
  KEYWORDS = /* @__PURE__ */ new Set([
3573
3584
  import_pinggy4.TunnelType.Http,
@@ -3583,8 +3594,16 @@ var init_buildConfig = __esm({
3583
3594
  });
3584
3595
 
3585
3596
  // src/utils/parseArgs.ts
3586
- function isInlineColonFlag(arg) {
3587
- return /^-([RL])[A-Za-z0-9._-]*:?$/.test(arg);
3597
+ function isAttachedReverseOrLocalFlag(arg) {
3598
+ return /^-[RL].+/.test(arg);
3599
+ }
3600
+ function shouldMergeReverseOrLocalFragment(current, next) {
3601
+ if (next.startsWith("-")) return false;
3602
+ if (next.startsWith(".")) return true;
3603
+ const body = current.slice(2);
3604
+ if (body.endsWith(":")) return true;
3605
+ if (body.includes("//") && !body.includes(":")) return true;
3606
+ return false;
3588
3607
  }
3589
3608
  function preprocessWindowsArgs(args) {
3590
3609
  if (os2.platform() !== "win32") return args;
@@ -3592,14 +3611,13 @@ function preprocessWindowsArgs(args) {
3592
3611
  let i = 0;
3593
3612
  while (i < args.length) {
3594
3613
  const arg = args[i];
3595
- if (isInlineColonFlag(arg)) {
3596
- if (i + 1 < args.length && !args[i + 1].startsWith("-")) {
3597
- let merged = arg + args[i + 1];
3598
- i += 2;
3599
- out.push(merged);
3600
- continue;
3601
- }
3602
- out.push(arg);
3614
+ if (isAttachedReverseOrLocalFlag(arg)) {
3615
+ let merged = arg;
3616
+ while (i + 1 < args.length && shouldMergeReverseOrLocalFragment(merged, args[i + 1])) {
3617
+ merged += args[i + 1];
3618
+ i++;
3619
+ }
3620
+ out.push(merged);
3603
3621
  i++;
3604
3622
  continue;
3605
3623
  }
@@ -3636,7 +3654,7 @@ var init_parseArgs = __esm({
3636
3654
  function getFreePort(webDebugger) {
3637
3655
  return new Promise((resolve, reject) => {
3638
3656
  const tryPort = (portToTry) => {
3639
- const server = import_net2.default.createServer();
3657
+ const server = import_net3.default.createServer();
3640
3658
  server.unref();
3641
3659
  server.on("error", (err) => {
3642
3660
  if (portToTry !== 0) {
@@ -3662,12 +3680,12 @@ function getFreePort(webDebugger) {
3662
3680
  tryPort(providedPort);
3663
3681
  });
3664
3682
  }
3665
- var import_net2;
3683
+ var import_net3;
3666
3684
  var init_getFreePort = __esm({
3667
3685
  "src/utils/getFreePort.ts"() {
3668
3686
  "use strict";
3669
3687
  init_cjs_shims();
3670
- import_net2 = __toESM(require("net"), 1);
3688
+ import_net3 = __toESM(require("net"), 1);
3671
3689
  }
3672
3690
  });
3673
3691
 
package/dist/index.js CHANGED
@@ -104,7 +104,7 @@ async function verifyAndLoad() {
104
104
  process.exit(1);
105
105
  }
106
106
  }
107
- await import("./main-X7XBLBTU.js");
107
+ await import("./main-PFPDXIRG.js");
108
108
  }
109
109
  verifyAndLoad().catch((err) => {
110
110
  printer_default.error(`Failed to start CLI:, ${err}`);
@@ -254,6 +254,7 @@ function isValidIpV6Cidr(input) {
254
254
  import { TunnelType } from "@pinggy/pinggy";
255
255
  import fs from "fs";
256
256
  import path from "path";
257
+ import { isIP as isIP2 } from "net";
257
258
  var domainRegex = /^(?:[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,}$/;
258
259
  var KEYWORDS = /* @__PURE__ */ new Set([
259
260
  TunnelType.Http,
@@ -389,6 +390,11 @@ function removeIPv6Brackets(ip) {
389
390
  }
390
391
  return ip;
391
392
  }
393
+ function isValidHostAddress(host) {
394
+ const normalized = removeIPv6Brackets(host.trim());
395
+ if (normalized.length === 0) return false;
396
+ return normalized === "localhost" || isIP2(normalized) !== 0;
397
+ }
392
398
  function ipv6SafeSplitColon(s) {
393
399
  const result = [];
394
400
  let buf = "";
@@ -523,17 +529,22 @@ function parseReverseTunnelAddr(finalConfig, values, primaryType) {
523
529
  function parseLocalTunnelAddr(finalConfig, values) {
524
530
  if (!Array.isArray(values.L) || values.L.length === 0) return null;
525
531
  const firstL = values.L[0];
526
- const parts = firstL.split(":");
532
+ const parts = ipv6SafeSplitColon(firstL);
533
+ let debuggerHost = "localhost";
527
534
  let lp;
528
535
  if (parts.length === 3) {
529
536
  lp = parseInt(parts[0], 10);
530
537
  } else if (parts.length === 4) {
538
+ debuggerHost = removeIPv6Brackets(parts[0]);
531
539
  lp = parseInt(parts[1], 10);
532
540
  } else {
533
541
  return new Error("Incorrect command line arguments: web debugger address incorrect. Please use '-h' option for help.");
534
542
  }
543
+ if (!isValidHostAddress(debuggerHost)) {
544
+ return new Error(`Invalid debugger host ${debuggerHost}. Please use localhost, IPv4, or IPv6 address.`);
545
+ }
535
546
  if (!Number.isNaN(lp) && isValidPort(lp)) {
536
- finalConfig.webDebugger = `localhost:${lp}`;
547
+ finalConfig.webDebugger = `${debuggerHost}:${lp}`;
537
548
  } else {
538
549
  return new Error(`Invalid debugger port ${lp}`);
539
550
  }
@@ -671,8 +682,16 @@ async function buildFinalConfig(values, positionals) {
671
682
  // src/utils/parseArgs.ts
672
683
  import { parseArgs as parseArgs2 } from "util";
673
684
  import * as os from "os";
674
- function isInlineColonFlag(arg) {
675
- return /^-([RL])[A-Za-z0-9._-]*:?$/.test(arg);
685
+ function isAttachedReverseOrLocalFlag(arg) {
686
+ return /^-[RL].+/.test(arg);
687
+ }
688
+ function shouldMergeReverseOrLocalFragment(current, next) {
689
+ if (next.startsWith("-")) return false;
690
+ if (next.startsWith(".")) return true;
691
+ const body = current.slice(2);
692
+ if (body.endsWith(":")) return true;
693
+ if (body.includes("//") && !body.includes(":")) return true;
694
+ return false;
676
695
  }
677
696
  function preprocessWindowsArgs(args) {
678
697
  if (os.platform() !== "win32") return args;
@@ -680,14 +699,13 @@ function preprocessWindowsArgs(args) {
680
699
  let i = 0;
681
700
  while (i < args.length) {
682
701
  const arg = args[i];
683
- if (isInlineColonFlag(arg)) {
684
- if (i + 1 < args.length && !args[i + 1].startsWith("-")) {
685
- let merged = arg + args[i + 1];
686
- i += 2;
687
- out.push(merged);
688
- continue;
702
+ if (isAttachedReverseOrLocalFlag(arg)) {
703
+ let merged = arg;
704
+ while (i + 1 < args.length && shouldMergeReverseOrLocalFragment(merged, args[i + 1])) {
705
+ merged += args[i + 1];
706
+ i++;
689
707
  }
690
- out.push(arg);
708
+ out.push(merged);
691
709
  i++;
692
710
  continue;
693
711
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pinggy",
3
- "version": "0.4.2",
3
+ "version": "0.4.4",
4
4
  "license": "Apache-2.0",
5
5
  "type": "module",
6
6
  "description": "Create secure, shareable tunnels to your localhost and manage them from the command line. ",
@@ -51,7 +51,7 @@
51
51
  ]
52
52
  },
53
53
  "dependencies": {
54
- "@pinggy/pinggy": "^0.4.1",
54
+ "@pinggy/pinggy": "^0.4.2",
55
55
  "blessed": "^0.1.81",
56
56
  "clipboardy": "^5.0.0",
57
57
  "mime": "^4.1.0",