@absolutejs/absolute 0.19.0-beta.110 → 0.19.0-beta.111

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/cli/index.js CHANGED
@@ -17,61 +17,6 @@ var __export = (target, all) => {
17
17
  var __esm = (fn, res) => () => (fn && (res = fn(fn = 0)), res);
18
18
  var __require = import.meta.require;
19
19
 
20
- // src/constants.ts
21
- var ANSI_ESCAPE_LENGTH = 3, ASCII_SPACE = 32, BASE_36_RADIX = 36, BYTES_PER_KILOBYTE = 1024, CLI_ARGS_OFFSET = 3, DEFAULT_PORT = 3000, HOURS_IN_DAY = 24, HOURS_IN_HALF_DAY = 12, MAX_ERROR_LENGTH = 200, MILLISECONDS_IN_A_SECOND = 1000, MINUTES_IN_AN_HOUR = 60, SECONDS_IN_A_MINUTE = 60, MILLISECONDS_IN_A_MINUTE, MILLISECONDS_IN_A_DAY, SIGINT_EXIT_CODE = 130, SIGTERM_EXIT_CODE = 143, TIME_PRECISION = 2, TWO_THIRDS, UNFOUND_INDEX = -1;
22
- var init_constants = __esm(() => {
23
- MILLISECONDS_IN_A_MINUTE = MILLISECONDS_IN_A_SECOND * SECONDS_IN_A_MINUTE;
24
- MILLISECONDS_IN_A_DAY = MILLISECONDS_IN_A_SECOND * SECONDS_IN_A_MINUTE * MINUTES_IN_AN_HOUR * HOURS_IN_DAY;
25
- TWO_THIRDS = 2 / 3;
26
- });
27
-
28
- // src/utils/getDurationString.ts
29
- var getDurationString = (duration) => {
30
- let durationString;
31
- if (duration < MILLISECONDS_IN_A_SECOND) {
32
- durationString = `${duration.toFixed(TIME_PRECISION)}ms`;
33
- } else if (duration < MILLISECONDS_IN_A_MINUTE) {
34
- durationString = `${(duration / MILLISECONDS_IN_A_SECOND).toFixed(TIME_PRECISION)}s`;
35
- } else {
36
- durationString = `${(duration / MILLISECONDS_IN_A_MINUTE).toFixed(TIME_PRECISION)}m`;
37
- }
38
- return durationString;
39
- };
40
- var init_getDurationString = __esm(() => {
41
- init_constants();
42
- });
43
-
44
- // src/utils/startupBanner.ts
45
- var MONTHS, formatTimestamp = () => {
46
- const now = new Date;
47
- const month = MONTHS[now.getMonth()];
48
- const day = now.getDate().toString().padStart(2, "0");
49
- let hours = now.getHours();
50
- const minutes = now.getMinutes().toString().padStart(2, "0");
51
- const seconds = now.getSeconds().toString().padStart(2, "0");
52
- const ampm = hours >= HOURS_IN_HALF_DAY ? "PM" : "AM";
53
- hours = hours % HOURS_IN_HALF_DAY || HOURS_IN_HALF_DAY;
54
- return `${month} ${day} ${hours}:${minutes}:${seconds} ${ampm}`;
55
- };
56
- var init_startupBanner = __esm(() => {
57
- init_constants();
58
- init_getDurationString();
59
- MONTHS = [
60
- "Jan",
61
- "Feb",
62
- "Mar",
63
- "Apr",
64
- "May",
65
- "Jun",
66
- "Jul",
67
- "Aug",
68
- "Sep",
69
- "Oct",
70
- "Nov",
71
- "Dec"
72
- ];
73
- });
74
-
75
20
  // src/utils/loadConfig.ts
76
21
  var exports_loadConfig = {};
77
22
  __export(exports_loadConfig, {
@@ -90,69 +35,17 @@ Expected: export default defineConfig({ ... })`);
90
35
  };
91
36
  var init_loadConfig = () => {};
92
37
 
93
- // src/utils/logger.ts
94
- var colors, frameworkColors, formatPath = (filePath) => {
95
- const cwd = process.cwd();
96
- let relative = filePath.startsWith(cwd) ? filePath.slice(cwd.length + 1) : filePath;
97
- relative = relative.replace(/\\/g, "/");
98
- if (!relative.startsWith("/")) {
99
- relative = `/${relative}`;
100
- }
101
- return relative;
102
- }, getFrameworkColor = (framework) => frameworkColors[framework] || colors.white, log = (action, options) => {
103
- const timestamp = `${colors.dim}${formatTimestamp()}${colors.reset}`;
104
- const tag = `${colors.cyan}[hmr]${colors.reset}`;
105
- let message = action;
106
- if (options?.path) {
107
- const pathColor = options.framework ? getFrameworkColor(options.framework) : colors.white;
108
- message += ` ${pathColor}${formatPath(options.path)}${colors.reset}`;
109
- }
110
- if (options?.duration !== undefined) {
111
- message += ` ${colors.dim}(${options.duration}ms)${colors.reset}`;
112
- }
113
- console.log(`${timestamp} ${tag} ${message}`);
114
- }, logInfo = (message) => {
115
- log(message);
116
- }, logWarn = (message) => {
117
- const timestamp = `${colors.dim}${formatTimestamp()}${colors.reset}`;
118
- const tag = `${colors.yellow}[hmr]${colors.reset}`;
119
- console.warn(`${timestamp} ${tag} ${colors.yellow}warning${colors.reset} ${message}`);
120
- };
121
- var init_logger = __esm(() => {
122
- init_startupBanner();
123
- colors = {
124
- blue: "\x1B[34m",
125
- bold: "\x1B[1m",
126
- cyan: "\x1B[36m",
127
- dim: "\x1B[2m",
128
- green: "\x1B[32m",
129
- magenta: "\x1B[35m",
130
- red: "\x1B[31m",
131
- reset: "\x1B[0m",
132
- white: "\x1B[37m",
133
- yellow: "\x1B[33m"
134
- };
135
- frameworkColors = {
136
- angular: colors.magenta,
137
- assets: colors.dim,
138
- css: colors.cyan,
139
- html: colors.white,
140
- htmx: colors.white,
141
- react: colors.blue,
142
- svelte: colors.yellow,
143
- vue: colors.green
144
- };
145
- });
146
-
147
38
  // src/dev/devCert.ts
148
39
  var exports_devCert = {};
149
40
  __export(exports_devCert, {
41
+ setupMkcert: () => setupMkcert,
150
42
  loadDevCert: () => loadDevCert,
43
+ hasMkcert: () => hasMkcert,
151
44
  ensureDevCert: () => ensureDevCert
152
45
  });
153
46
  import { existsSync as existsSync4, mkdirSync as mkdirSync2, readFileSync as readFileSync4 } from "fs";
154
47
  import { join as join3 } from "path";
155
- var CERT_DIR, CERT_PATH, KEY_PATH, CERT_VALIDITY_DAYS = 365, certFilesExist = () => existsSync4(CERT_PATH) && existsSync4(KEY_PATH), isCertExpired = () => {
48
+ var CERT_DIR, CERT_PATH, KEY_PATH, CERT_VALIDITY_DAYS = 365, devLog = (msg) => console.log(`\x1B[2m${new Date().toLocaleTimeString()}\x1B[0m \x1B[36m[dev]\x1B[0m ${msg}`), devWarn = (msg) => console.log(`\x1B[2m${new Date().toLocaleTimeString()}\x1B[0m \x1B[33m[dev]\x1B[0m \x1B[33m${msg}\x1B[0m`), certFilesExist = () => existsSync4(CERT_PATH) && existsSync4(KEY_PATH), isCertExpired = () => {
156
49
  try {
157
50
  const certPem = readFileSync4(CERT_PATH, "utf-8");
158
51
  const proc = Bun.spawnSync(["openssl", "x509", "-enddate", "-noout"], {
@@ -176,7 +69,7 @@ var CERT_DIR, CERT_PATH, KEY_PATH, CERT_VALIDITY_DAYS = 365, certFilesExist = ()
176
69
  return false;
177
70
  }
178
71
  }, generateWithMkcert = () => {
179
- logInfo("Generating locally-trusted certificate with mkcert...");
72
+ devLog("Generating locally-trusted certificate with mkcert...");
180
73
  const result = Bun.spawnSync([
181
74
  "mkcert",
182
75
  "-cert-file",
@@ -191,9 +84,9 @@ var CERT_DIR, CERT_PATH, KEY_PATH, CERT_VALIDITY_DAYS = 365, certFilesExist = ()
191
84
  const err = new TextDecoder().decode(result.stderr);
192
85
  throw new Error(`mkcert failed: ${err}`);
193
86
  }
194
- logInfo("Certificate generated with mkcert (locally trusted, no browser warning)");
87
+ devLog("HTTPS enabled with locally-trusted certificate (mkcert)");
195
88
  }, generateSelfSigned = () => {
196
- logInfo("Generating self-signed certificate for HTTPS dev server...");
89
+ devLog("Generating self-signed certificate...");
197
90
  const proc = Bun.spawnSync([
198
91
  "openssl",
199
92
  "req",
@@ -218,14 +111,23 @@ var CERT_DIR, CERT_PATH, KEY_PATH, CERT_VALIDITY_DAYS = 365, certFilesExist = ()
218
111
  const err = new TextDecoder().decode(proc.stderr);
219
112
  throw new Error(`openssl failed: ${err}`);
220
113
  }
221
- logInfo("Self-signed certificate generated (one-time browser warning on first visit)");
114
+ devLog("HTTPS enabled with self-signed certificate");
115
+ devLog("For a trusted certificate (no browser warning), install mkcert:");
116
+ devLog(" brew install mkcert && mkcert -install (macOS)");
117
+ devLog(" sudo apt install mkcert && mkcert -install (Linux)");
118
+ devLog("Then restart the dev server.");
222
119
  }, ensureDevCert = () => {
223
120
  mkdirSync2(CERT_DIR, { recursive: true });
224
121
  if (certFilesExist() && !isCertExpired()) {
122
+ if (hasMkcert()) {
123
+ devLog("HTTPS enabled with locally-trusted certificate (mkcert)");
124
+ } else {
125
+ devLog("HTTPS enabled with self-signed certificate");
126
+ }
225
127
  return { cert: CERT_PATH, key: KEY_PATH };
226
128
  }
227
129
  if (certFilesExist()) {
228
- logWarn("Dev certificate expired, regenerating...");
130
+ devWarn("Dev certificate expired, regenerating...");
229
131
  }
230
132
  try {
231
133
  if (hasMkcert()) {
@@ -234,7 +136,7 @@ var CERT_DIR, CERT_PATH, KEY_PATH, CERT_VALIDITY_DAYS = 365, certFilesExist = ()
234
136
  generateSelfSigned();
235
137
  }
236
138
  } catch (err) {
237
- logWarn(`Failed to generate HTTPS certificate: ${err instanceof Error ? err.message : err}`);
139
+ devWarn(`Failed to generate certificate: ${err instanceof Error ? err.message : err}`);
238
140
  return null;
239
141
  }
240
142
  return { cert: CERT_PATH, key: KEY_PATH };
@@ -250,23 +152,112 @@ var CERT_DIR, CERT_PATH, KEY_PATH, CERT_VALIDITY_DAYS = 365, certFilesExist = ()
250
152
  } catch {
251
153
  return null;
252
154
  }
155
+ }, setupMkcert = () => {
156
+ devLog("Setting up mkcert for locally-trusted HTTPS...");
157
+ if (!hasMkcert()) {
158
+ devWarn("mkcert is not installed.");
159
+ console.log("");
160
+ console.log(" Install it first:");
161
+ console.log(" macOS: brew install mkcert");
162
+ console.log(" Linux: sudo apt install mkcert");
163
+ console.log(" Windows: choco install mkcert");
164
+ console.log("");
165
+ console.log(" Then run: absolute mkcert");
166
+ return false;
167
+ }
168
+ devLog("Installing local certificate authority...");
169
+ const installResult = Bun.spawnSync(["mkcert", "-install"], {
170
+ stderr: "pipe",
171
+ stdout: "pipe"
172
+ });
173
+ if (installResult.exitCode !== 0) {
174
+ devWarn("Failed to install CA: " + new TextDecoder().decode(installResult.stderr));
175
+ return false;
176
+ }
177
+ try {
178
+ const { rmSync } = __require("fs");
179
+ rmSync(CERT_PATH, { force: true });
180
+ rmSync(KEY_PATH, { force: true });
181
+ } catch {}
182
+ mkdirSync2(CERT_DIR, { recursive: true });
183
+ generateWithMkcert();
184
+ console.log("");
185
+ devLog("Done! Restart your dev server \u2014 no more browser warnings.");
186
+ return true;
253
187
  };
254
188
  var init_devCert = __esm(() => {
255
- init_logger();
256
189
  CERT_DIR = join3(process.cwd(), ".absolutejs");
257
190
  CERT_PATH = join3(CERT_DIR, "cert.pem");
258
191
  KEY_PATH = join3(CERT_DIR, "key.pem");
259
192
  });
260
193
 
261
194
  // src/cli/scripts/dev.ts
262
- init_constants();
263
- init_startupBanner();
264
195
  var {$: $2, env } = globalThis.Bun;
265
196
  import { existsSync as existsSync5 } from "fs";
266
197
  import { resolve as resolve3 } from "path";
267
198
 
199
+ // src/constants.ts
200
+ var ANSI_ESCAPE_LENGTH = 3;
201
+ var ASCII_SPACE = 32;
202
+ var BASE_36_RADIX = 36;
203
+ var BYTES_PER_KILOBYTE = 1024;
204
+ var CLI_ARGS_OFFSET = 3;
205
+ var DEFAULT_PORT = 3000;
206
+ var HOURS_IN_DAY = 24;
207
+ var HOURS_IN_HALF_DAY = 12;
208
+ var MAX_ERROR_LENGTH = 200;
209
+ var MILLISECONDS_IN_A_SECOND = 1000;
210
+ var MINUTES_IN_AN_HOUR = 60;
211
+ var SECONDS_IN_A_MINUTE = 60;
212
+ var MILLISECONDS_IN_A_MINUTE = MILLISECONDS_IN_A_SECOND * SECONDS_IN_A_MINUTE;
213
+ var MILLISECONDS_IN_A_DAY = MILLISECONDS_IN_A_SECOND * SECONDS_IN_A_MINUTE * MINUTES_IN_AN_HOUR * HOURS_IN_DAY;
214
+ var SIGINT_EXIT_CODE = 130;
215
+ var SIGTERM_EXIT_CODE = 143;
216
+ var TIME_PRECISION = 2;
217
+ var TWO_THIRDS = 2 / 3;
218
+ var UNFOUND_INDEX = -1;
219
+
220
+ // src/utils/getDurationString.ts
221
+ var getDurationString = (duration) => {
222
+ let durationString;
223
+ if (duration < MILLISECONDS_IN_A_SECOND) {
224
+ durationString = `${duration.toFixed(TIME_PRECISION)}ms`;
225
+ } else if (duration < MILLISECONDS_IN_A_MINUTE) {
226
+ durationString = `${(duration / MILLISECONDS_IN_A_SECOND).toFixed(TIME_PRECISION)}s`;
227
+ } else {
228
+ durationString = `${(duration / MILLISECONDS_IN_A_MINUTE).toFixed(TIME_PRECISION)}m`;
229
+ }
230
+ return durationString;
231
+ };
232
+
233
+ // src/utils/startupBanner.ts
234
+ var MONTHS = [
235
+ "Jan",
236
+ "Feb",
237
+ "Mar",
238
+ "Apr",
239
+ "May",
240
+ "Jun",
241
+ "Jul",
242
+ "Aug",
243
+ "Sep",
244
+ "Oct",
245
+ "Nov",
246
+ "Dec"
247
+ ];
248
+ var formatTimestamp = () => {
249
+ const now = new Date;
250
+ const month = MONTHS[now.getMonth()];
251
+ const day = now.getDate().toString().padStart(2, "0");
252
+ let hours = now.getHours();
253
+ const minutes = now.getMinutes().toString().padStart(2, "0");
254
+ const seconds = now.getSeconds().toString().padStart(2, "0");
255
+ const ampm = hours >= HOURS_IN_HALF_DAY ? "PM" : "AM";
256
+ hours = hours % HOURS_IN_HALF_DAY || HOURS_IN_HALF_DAY;
257
+ return `${month} ${day} ${hours}:${minutes}:${seconds} ${ampm}`;
258
+ };
259
+
268
260
  // src/cli/interactive.ts
269
- init_constants();
270
261
  import { openSync } from "fs";
271
262
  import { ReadStream } from "tty";
272
263
  var SHORTCUTS = {
@@ -671,8 +662,6 @@ var sendTelemetryEvent = (event, payload) => {
671
662
  init_loadConfig();
672
663
 
673
664
  // src/cli/utils.ts
674
- init_constants();
675
- init_startupBanner();
676
665
  var {$ } = globalThis.Bun;
677
666
  import { execSync } from "child_process";
678
667
  import { existsSync as existsSync3, readFileSync as readFileSync3 } from "fs";
@@ -1043,7 +1032,6 @@ var eslint = async (args) => {
1043
1032
  };
1044
1033
 
1045
1034
  // src/cli/scripts/info.ts
1046
- init_constants();
1047
1035
  import { execSync as execSync2 } from "child_process";
1048
1036
  import { existsSync as existsSync6, readFileSync as readFileSync5 } from "fs";
1049
1037
  import { arch as arch2, cpus, platform as platform2, totalmem, version } from "os";
@@ -1182,7 +1170,6 @@ var info = () => {
1182
1170
  };
1183
1171
 
1184
1172
  // src/cli/cache.ts
1185
- init_constants();
1186
1173
  import { mkdir } from "fs/promises";
1187
1174
  import { join as join4 } from "path";
1188
1175
  var {Glob } = globalThis.Bun;
@@ -1318,13 +1305,10 @@ var prettier = async (args) => {
1318
1305
  };
1319
1306
 
1320
1307
  // src/cli/scripts/start.ts
1321
- init_constants();
1322
- init_getDurationString();
1323
- init_loadConfig();
1324
- init_startupBanner();
1325
1308
  var {env: env2 } = globalThis.Bun;
1326
1309
  import { existsSync as existsSync7, readFileSync as readFileSync6 } from "fs";
1327
1310
  import { basename, resolve as resolve5 } from "path";
1311
+ init_loadConfig();
1328
1312
  var cliTag2 = (color, message) => `\x1B[2m${formatTimestamp()}\x1B[0m ${color}[cli]\x1B[0m ${color}${message}\x1B[0m`;
1329
1313
  var resolvePackageVersion = (candidates) => {
1330
1314
  for (const candidate of candidates) {
@@ -1364,13 +1348,13 @@ var tryImportBuild = async (candidate) => {
1364
1348
  }
1365
1349
  };
1366
1350
  var handleBundleFailure = (serverBundle, bundleStart, serverEntry) => {
1367
- serverBundle.logs.forEach((log2) => {
1368
- console.error(log2);
1351
+ serverBundle.logs.forEach((log) => {
1352
+ console.error(log);
1369
1353
  });
1370
1354
  sendTelemetryEvent("start:bundle-error", {
1371
1355
  durationMs: Math.round(performance.now() - bundleStart),
1372
1356
  entry: serverEntry,
1373
- message: serverBundle.logs.find((log2) => log2.level === "error")?.message?.toString().slice(0, MAX_ERROR_LENGTH) ?? "Unknown error"
1357
+ message: serverBundle.logs.find((log) => log.level === "error")?.message?.toString().slice(0, MAX_ERROR_LENGTH) ?? "Unknown error"
1374
1358
  });
1375
1359
  console.error(cliTag2("\x1B[31m", "Server bundle failed."));
1376
1360
  process.exit(1);
@@ -1570,7 +1554,6 @@ var start = async (serverEntry, outdir, configPath2) => {
1570
1554
  };
1571
1555
 
1572
1556
  // src/cli/index.ts
1573
- init_constants();
1574
1557
  var [command] = process.argv.slice(2);
1575
1558
  var args = process.argv.slice(CLI_ARGS_OFFSET);
1576
1559
  var parseNamedArg = (flag) => {
@@ -1610,6 +1593,10 @@ if (command === "dev") {
1610
1593
  } else if (command === "telemetry") {
1611
1594
  sendTelemetryEvent("cli:command", { command });
1612
1595
  telemetry(args);
1596
+ } else if (command === "mkcert") {
1597
+ sendTelemetryEvent("cli:command", { command });
1598
+ const { setupMkcert: setupMkcert2 } = await Promise.resolve().then(() => (init_devCert(), exports_devCert));
1599
+ setupMkcert2();
1613
1600
  } else {
1614
1601
  const message = command ? `Unknown command: ${command}` : "No command specified";
1615
1602
  console.error(message);
package/dist/index.js CHANGED
@@ -1239,8 +1239,6 @@ var colors2, frameworkColors, formatPath = (filePath) => {
1239
1239
  console.error(`${timestamp} ${tag} ${fullMessage}`);
1240
1240
  }, logHmrUpdate = (path, framework, duration) => {
1241
1241
  log("hmr update", { duration, framework, path });
1242
- }, logInfo = (message) => {
1243
- log(message);
1244
1242
  }, logScriptUpdate = (path, framework, duration) => {
1245
1243
  log("script update", { duration, framework, path });
1246
1244
  }, logServerReload = () => {
@@ -205040,12 +205038,14 @@ var init_hmr = __esm(() => {
205040
205038
  // src/dev/devCert.ts
205041
205039
  var exports_devCert = {};
205042
205040
  __export(exports_devCert, {
205041
+ setupMkcert: () => setupMkcert,
205043
205042
  loadDevCert: () => loadDevCert,
205043
+ hasMkcert: () => hasMkcert,
205044
205044
  ensureDevCert: () => ensureDevCert
205045
205045
  });
205046
205046
  import { existsSync as existsSync15, mkdirSync as mkdirSync10, readFileSync as readFileSync11 } from "fs";
205047
205047
  import { join as join17 } from "path";
205048
- var CERT_DIR, CERT_PATH, KEY_PATH, CERT_VALIDITY_DAYS = 365, certFilesExist = () => existsSync15(CERT_PATH) && existsSync15(KEY_PATH), isCertExpired = () => {
205048
+ var CERT_DIR, CERT_PATH, KEY_PATH, CERT_VALIDITY_DAYS = 365, devLog = (msg) => console.log(`\x1B[2m${new Date().toLocaleTimeString()}\x1B[0m \x1B[36m[dev]\x1B[0m ${msg}`), devWarn = (msg) => console.log(`\x1B[2m${new Date().toLocaleTimeString()}\x1B[0m \x1B[33m[dev]\x1B[0m \x1B[33m${msg}\x1B[0m`), certFilesExist = () => existsSync15(CERT_PATH) && existsSync15(KEY_PATH), isCertExpired = () => {
205049
205049
  try {
205050
205050
  const certPem = readFileSync11(CERT_PATH, "utf-8");
205051
205051
  const proc = Bun.spawnSync(["openssl", "x509", "-enddate", "-noout"], {
@@ -205069,7 +205069,7 @@ var CERT_DIR, CERT_PATH, KEY_PATH, CERT_VALIDITY_DAYS = 365, certFilesExist = ()
205069
205069
  return false;
205070
205070
  }
205071
205071
  }, generateWithMkcert = () => {
205072
- logInfo("Generating locally-trusted certificate with mkcert...");
205072
+ devLog("Generating locally-trusted certificate with mkcert...");
205073
205073
  const result = Bun.spawnSync([
205074
205074
  "mkcert",
205075
205075
  "-cert-file",
@@ -205084,9 +205084,9 @@ var CERT_DIR, CERT_PATH, KEY_PATH, CERT_VALIDITY_DAYS = 365, certFilesExist = ()
205084
205084
  const err = new TextDecoder().decode(result.stderr);
205085
205085
  throw new Error(`mkcert failed: ${err}`);
205086
205086
  }
205087
- logInfo("Certificate generated with mkcert (locally trusted, no browser warning)");
205087
+ devLog("HTTPS enabled with locally-trusted certificate (mkcert)");
205088
205088
  }, generateSelfSigned = () => {
205089
- logInfo("Generating self-signed certificate for HTTPS dev server...");
205089
+ devLog("Generating self-signed certificate...");
205090
205090
  const proc = Bun.spawnSync([
205091
205091
  "openssl",
205092
205092
  "req",
@@ -205111,14 +205111,23 @@ var CERT_DIR, CERT_PATH, KEY_PATH, CERT_VALIDITY_DAYS = 365, certFilesExist = ()
205111
205111
  const err = new TextDecoder().decode(proc.stderr);
205112
205112
  throw new Error(`openssl failed: ${err}`);
205113
205113
  }
205114
- logInfo("Self-signed certificate generated (one-time browser warning on first visit)");
205114
+ devLog("HTTPS enabled with self-signed certificate");
205115
+ devLog("For a trusted certificate (no browser warning), install mkcert:");
205116
+ devLog(" brew install mkcert && mkcert -install (macOS)");
205117
+ devLog(" sudo apt install mkcert && mkcert -install (Linux)");
205118
+ devLog("Then restart the dev server.");
205115
205119
  }, ensureDevCert = () => {
205116
205120
  mkdirSync10(CERT_DIR, { recursive: true });
205117
205121
  if (certFilesExist() && !isCertExpired()) {
205122
+ if (hasMkcert()) {
205123
+ devLog("HTTPS enabled with locally-trusted certificate (mkcert)");
205124
+ } else {
205125
+ devLog("HTTPS enabled with self-signed certificate");
205126
+ }
205118
205127
  return { cert: CERT_PATH, key: KEY_PATH };
205119
205128
  }
205120
205129
  if (certFilesExist()) {
205121
- logWarn("Dev certificate expired, regenerating...");
205130
+ devWarn("Dev certificate expired, regenerating...");
205122
205131
  }
205123
205132
  try {
205124
205133
  if (hasMkcert()) {
@@ -205127,7 +205136,7 @@ var CERT_DIR, CERT_PATH, KEY_PATH, CERT_VALIDITY_DAYS = 365, certFilesExist = ()
205127
205136
  generateSelfSigned();
205128
205137
  }
205129
205138
  } catch (err) {
205130
- logWarn(`Failed to generate HTTPS certificate: ${err instanceof Error ? err.message : err}`);
205139
+ devWarn(`Failed to generate certificate: ${err instanceof Error ? err.message : err}`);
205131
205140
  return null;
205132
205141
  }
205133
205142
  return { cert: CERT_PATH, key: KEY_PATH };
@@ -205143,9 +205152,40 @@ var CERT_DIR, CERT_PATH, KEY_PATH, CERT_VALIDITY_DAYS = 365, certFilesExist = ()
205143
205152
  } catch {
205144
205153
  return null;
205145
205154
  }
205155
+ }, setupMkcert = () => {
205156
+ devLog("Setting up mkcert for locally-trusted HTTPS...");
205157
+ if (!hasMkcert()) {
205158
+ devWarn("mkcert is not installed.");
205159
+ console.log("");
205160
+ console.log(" Install it first:");
205161
+ console.log(" macOS: brew install mkcert");
205162
+ console.log(" Linux: sudo apt install mkcert");
205163
+ console.log(" Windows: choco install mkcert");
205164
+ console.log("");
205165
+ console.log(" Then run: absolute mkcert");
205166
+ return false;
205167
+ }
205168
+ devLog("Installing local certificate authority...");
205169
+ const installResult = Bun.spawnSync(["mkcert", "-install"], {
205170
+ stderr: "pipe",
205171
+ stdout: "pipe"
205172
+ });
205173
+ if (installResult.exitCode !== 0) {
205174
+ devWarn("Failed to install CA: " + new TextDecoder().decode(installResult.stderr));
205175
+ return false;
205176
+ }
205177
+ try {
205178
+ const { rmSync: rmSync2 } = __require("fs");
205179
+ rmSync2(CERT_PATH, { force: true });
205180
+ rmSync2(KEY_PATH, { force: true });
205181
+ } catch {}
205182
+ mkdirSync10(CERT_DIR, { recursive: true });
205183
+ generateWithMkcert();
205184
+ console.log("");
205185
+ devLog("Done! Restart your dev server \u2014 no more browser warnings.");
205186
+ return true;
205146
205187
  };
205147
205188
  var init_devCert = __esm(() => {
205148
- init_logger();
205149
205189
  CERT_DIR = join17(process.cwd(), ".absolutejs");
205150
205190
  CERT_PATH = join17(CERT_DIR, "cert.pem");
205151
205191
  KEY_PATH = join17(CERT_DIR, "key.pem");
@@ -205484,5 +205524,5 @@ export {
205484
205524
  ANGULAR_INIT_TIMEOUT_MS
205485
205525
  };
205486
205526
 
205487
- //# debugId=721F3E062986F6F364756E2164756E21
205527
+ //# debugId=97674176A38B7A0F64756E2164756E21
205488
205528
  //# sourceMappingURL=index.js.map