@absolutejs/absolute 0.20.0-beta.32 → 0.20.0-beta.34

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.js CHANGED
@@ -34041,26 +34041,40 @@ import {
34041
34041
  readFileSync as readFileSync36,
34042
34042
  rmSync as rmSync4
34043
34043
  } from "fs";
34044
+ import { X509Certificate } from "crypto";
34045
+ import { isIP } from "net";
34044
34046
  import { join as join55 } from "path";
34045
34047
  var CERT_DIR = join55(process.cwd(), ".absolutejs");
34046
34048
  var CERT_PATH = join55(CERT_DIR, "cert.pem");
34047
34049
  var KEY_PATH = join55(CERT_DIR, "key.pem");
34048
34050
  var CERT_VALIDITY_DAYS = 365;
34051
+ var DEFAULT_CERTIFICATE_HOSTS = ["localhost", "127.0.0.1", "::1"];
34052
+ var CERTIFICATE_HOSTNAME_PATTERN = /^(?=.{1,253}$)(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?)(?:\.(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?))*$/u;
34049
34053
  var devLog = (msg) => console.log(`\x1B[2m${new Date().toLocaleTimeString()}\x1B[0m \x1B[36m[dev]\x1B[0m ${msg}`);
34050
34054
  var devWarn = (msg) => console.log(`\x1B[2m${new Date().toLocaleTimeString()}\x1B[0m \x1B[33m[dev]\x1B[0m \x1B[33m${msg}\x1B[0m`);
34051
34055
  var certFilesExist = () => existsSync40(CERT_PATH) && existsSync40(KEY_PATH);
34052
- var isCertExpired = () => {
34056
+ var normalizeDevCertificateHosts = (hosts = []) => {
34057
+ const normalized = new Set(DEFAULT_CERTIFICATE_HOSTS);
34058
+ for (const host2 of hosts) {
34059
+ const value = host2.trim().toLowerCase();
34060
+ if (!value || value === "0.0.0.0" || value === "::")
34061
+ continue;
34062
+ if (isIP(value) === 0 && !CERTIFICATE_HOSTNAME_PATTERN.test(value)) {
34063
+ throw new TypeError(`Invalid development certificate host: ${host2}`);
34064
+ }
34065
+ normalized.add(value);
34066
+ }
34067
+ return [...normalized];
34068
+ };
34069
+ var certificateIsUsable = (hosts) => {
34053
34070
  try {
34054
34071
  const certPem = readFileSync36(CERT_PATH, "utf-8");
34055
- const proc = Bun.spawnSync(["openssl", "x509", "-enddate", "-noout"], {
34056
- stdin: new TextEncoder().encode(certPem)
34057
- });
34058
- const output = new TextDecoder().decode(proc.stdout).trim();
34059
- const dateStr = output.replace("notAfter=", "");
34060
- const expiryDate = new Date(dateStr);
34061
- return expiryDate.getTime() < Date.now();
34072
+ const certificate = new X509Certificate(certPem);
34073
+ if (new Date(certificate.validTo).getTime() <= Date.now())
34074
+ return false;
34075
+ return normalizeDevCertificateHosts(hosts).every((host2) => isIP(host2) ? certificate.checkIP(host2) !== undefined : certificate.checkHost(host2) !== undefined);
34062
34076
  } catch {
34063
- return true;
34077
+ return false;
34064
34078
  }
34065
34079
  };
34066
34080
  var hasMkcert = () => {
@@ -34074,23 +34088,22 @@ var hasMkcert = () => {
34074
34088
  return false;
34075
34089
  }
34076
34090
  };
34077
- var generateWithMkcert = () => {
34091
+ var generateWithMkcert = (hosts = []) => {
34078
34092
  const result = Bun.spawnSync([
34079
34093
  "mkcert",
34080
34094
  "-cert-file",
34081
34095
  CERT_PATH,
34082
34096
  "-key-file",
34083
34097
  KEY_PATH,
34084
- "localhost",
34085
- "127.0.0.1",
34086
- "::1"
34098
+ ...normalizeDevCertificateHosts(hosts)
34087
34099
  ], { stderr: "pipe", stdout: "pipe" });
34088
34100
  if (result.exitCode !== 0) {
34089
34101
  const err = new TextDecoder().decode(result.stderr);
34090
34102
  throw new Error(`mkcert failed: ${err}`);
34091
34103
  }
34092
34104
  };
34093
- var generateSelfSigned = () => {
34105
+ var generateSelfSigned = (hosts = []) => {
34106
+ const subjectAlternativeNames = normalizeDevCertificateHosts(hosts).map((host2) => `${isIP(host2) ? "IP" : "DNS"}:${host2}`).join(",");
34094
34107
  const proc = Bun.spawnSync([
34095
34108
  "openssl",
34096
34109
  "req",
@@ -34109,7 +34122,7 @@ var generateSelfSigned = () => {
34109
34122
  "-subj",
34110
34123
  "/CN=localhost",
34111
34124
  "-addext",
34112
- "subjectAltName=DNS:localhost,IP:127.0.0.1,IP:::1"
34125
+ `subjectAltName=${subjectAlternativeNames}`
34113
34126
  ], { stderr: "pipe", stdout: "pipe" });
34114
34127
  if (proc.exitCode !== 0) {
34115
34128
  const err = new TextDecoder().decode(proc.stderr);
@@ -34117,32 +34130,32 @@ var generateSelfSigned = () => {
34117
34130
  }
34118
34131
  devLog("Using self-signed certificate \u2014 browser will show a one-time warning");
34119
34132
  };
34120
- var generateCert = () => {
34133
+ var generateCert = (hosts = []) => {
34121
34134
  if (hasMkcert()) {
34122
- generateWithMkcert();
34135
+ generateWithMkcert(hosts);
34123
34136
  } else {
34124
- generateSelfSigned();
34137
+ generateSelfSigned(hosts);
34125
34138
  }
34126
34139
  };
34127
- var ensureDevCert = () => {
34140
+ var ensureDevCert = (hosts = []) => {
34128
34141
  mkdirSync17(CERT_DIR, { recursive: true });
34129
- if (hasCert()) {
34142
+ if (hasCert(hosts)) {
34130
34143
  return { cert: CERT_PATH, key: KEY_PATH };
34131
34144
  }
34132
34145
  if (certFilesExist()) {
34133
- devLog("Certificate expired, regenerating...");
34146
+ devLog("Certificate is expired or missing a required host, regenerating...");
34134
34147
  }
34135
34148
  try {
34136
- generateCert();
34149
+ generateCert(hosts);
34137
34150
  } catch (err) {
34138
34151
  devWarn(`Failed to generate certificate: ${err instanceof Error ? err.message : err}`);
34139
34152
  return null;
34140
34153
  }
34141
34154
  return { cert: CERT_PATH, key: KEY_PATH };
34142
34155
  };
34143
- var hasCert = () => certFilesExist() && !isCertExpired();
34144
- var loadDevCert = () => {
34145
- const paths = ensureDevCert();
34156
+ var hasCert = (hosts = []) => certFilesExist() && certificateIsUsable(hosts);
34157
+ var loadDevCert = (hosts = []) => {
34158
+ const paths = ensureDevCert(hosts);
34146
34159
  if (!paths)
34147
34160
  return null;
34148
34161
  try {
@@ -34239,9 +34252,10 @@ var localIP;
34239
34252
  var args = argv;
34240
34253
  var hostFlag = args.includes("--host");
34241
34254
  if (hostFlag) {
34242
- localIP = getLocalIPAddress();
34243
34255
  host2 = "0.0.0.0";
34244
34256
  }
34257
+ if (host2 === "0.0.0.0" || host2 === "::")
34258
+ localIP = getLocalIPAddress();
34245
34259
  var loadTls = () => {
34246
34260
  if (env4.NODE_ENV !== "development")
34247
34261
  return;
@@ -40863,5 +40877,5 @@ export {
40863
40877
  ANGULAR_INIT_TIMEOUT_MS
40864
40878
  };
40865
40879
 
40866
- //# debugId=C7F91C3EB54CEFC064756E2164756E21
40880
+ //# debugId=D2060DE03921305264756E2164756E21
40867
40881
  //# sourceMappingURL=index.js.map