@absolutejs/absolute 0.20.0-beta.27 → 0.20.0-beta.29

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
@@ -1814,6 +1814,7 @@ var ANDROID_BOOT_TIMEOUT_MS = 180000, ANDROID_BOOT_POLL_MS = 1000, DEV_JOURNAL_F
1814
1814
  options.serial,
1815
1815
  "install",
1816
1816
  "-r",
1817
+ "-d",
1817
1818
  installPath
1818
1819
  ], "Android app installation", options.run, { env: options.env, signal: options.signal });
1819
1820
  const updated = androidInstalledPackageIdentity(options.project, options.serial, options.capture, options.env);
@@ -17460,6 +17461,19 @@ var CDP_COMMAND_TIMEOUT_MS = 1e4, WEBVIEW_ATTACH_TIMEOUT_MS = 30000, WEBVIEW_POL
17460
17461
  await mkdir11(dirname28(absolutePath), { recursive: true });
17461
17462
  await writeFile13(absolutePath, Buffer.from(data, "base64"));
17462
17463
  return absolutePath;
17464
+ },
17465
+ tap: async (coordinateX, coordinateY) => {
17466
+ if (!Number.isFinite(coordinateX) || !Number.isFinite(coordinateY) || coordinateX < 0 || coordinateY < 0) {
17467
+ throw new TypeError("Android WebView tap coordinates must be finite non-negative numbers.");
17468
+ }
17469
+ await connection.command("Input.dispatchTouchEvent", {
17470
+ touchPoints: [{ x: coordinateX, y: coordinateY }],
17471
+ type: "touchStart"
17472
+ });
17473
+ await connection.command("Input.dispatchTouchEvent", {
17474
+ touchPoints: [],
17475
+ type: "touchEnd"
17476
+ });
17463
17477
  }
17464
17478
  };
17465
17479
  }, failForward = (error, options, capture, hostPort) => {
@@ -17468,7 +17482,7 @@ var CDP_COMMAND_TIMEOUT_MS = 1e4, WEBVIEW_ATTACH_TIMEOUT_MS = 30000, WEBVIEW_POL
17468
17482
  }, attachSocket = async (options, capture, fetcher, socket) => {
17469
17483
  const hostPort = forwardSocket(options.adb, options.serial, socket, capture);
17470
17484
  const targets = await readTargets(fetcher, hostPort).catch((error) => failForward(error, options, capture, hostPort));
17471
- const target = selectTarget(targets);
17485
+ const target = selectTarget(targets.filter((candidate) => targetScore(candidate) >= 2));
17472
17486
  if (!target) {
17473
17487
  removeForward(options.adb, options.serial, hostPort, capture);
17474
17488
  return;
@@ -18038,7 +18052,7 @@ var secretPattern, bearerPattern, coordinatePattern, sanitizeNativeReportText =
18038
18052
  if (run.hmr)
18039
18053
  hmrResult = run.hmr.outcome === "failed" ? "FAIL" : "PASS";
18040
18054
  const routeDetails = run.routes?.length ? ` Routes: ${run.routes.join(", ")}.` : "";
18041
- return [
18055
+ const checks = [
18042
18056
  {
18043
18057
  details: `Captured host, toolchain, Bun, and AbsoluteJS metadata for ${target}.`,
18044
18058
  id: "AUTO-SETUP-01",
@@ -18062,6 +18076,25 @@ var secretPattern, bearerPattern, coordinatePattern, sanitizeNativeReportText =
18062
18076
  result: run.screenshot ? "PASS" : "FAIL"
18063
18077
  }
18064
18078
  ];
18079
+ if (run.upgrade) {
18080
+ const { upgrade } = run;
18081
+ checks.push({
18082
+ details: `Android APK replacement ${upgrade.outcome === "pass" ? "preserved package identity" : "failed conformance"} in ${upgrade.installMs}ms. versionCode ${upgrade.before.versionCode ?? "unknown"} -> ${upgrade.after.versionCode ?? "unknown"}.`,
18083
+ id: "AUTO-UPGRADE-01",
18084
+ result: upgrade.outcome === "pass" ? "PASS" : "FAIL"
18085
+ }, {
18086
+ details: `Auth credential: ${upgrade.state.authCredential ? "preserved" : "missing"}; Sync database: ${upgrade.state.syncDatabase ? "preserved" : "missing"}; pending operations: ${upgrade.state.pendingOperations ? "preserved" : "missing"}.`,
18087
+ id: "AUTO-UPGRADE-02",
18088
+ result: Object.values(upgrade.state).every(Boolean) ? "PASS" : "FAIL"
18089
+ });
18090
+ if (upgrade.compatibility)
18091
+ checks.push({
18092
+ details: `N+1 ${upgrade.compatibility.nPlusOne}; N+2 ${upgrade.compatibility.nPlusTwo}; N+3 ${upgrade.compatibility.nPlusThree}; rollback ${upgrade.compatibility.rollback}.`,
18093
+ id: "AUTO-COMPAT-01",
18094
+ result: upgrade.compatibility.nPlusOne === "compatible" && upgrade.compatibility.nPlusTwo === "compatible" && upgrade.compatibility.nPlusThree === "upgrade-required" && upgrade.compatibility.rollback === "compatible" ? "PASS" : "FAIL"
18095
+ });
18096
+ }
18097
+ return checks;
18065
18098
  }, createAbsoluteNativeTestReport = (options) => ({
18066
18099
  automatedChecks: options.automatedChecks ?? createAbsoluteNativeAutomatedChecks(options.run),
18067
18100
  generatedAt: options.generatedAt ?? new Date().toISOString(),
@@ -18242,7 +18275,32 @@ var init_androidTestReport = __esm(() => {
18242
18275
  ["CAP-01", "Complete automatic device-capability provisioning checks."],
18243
18276
  [
18244
18277
  "SYSUI-01",
18245
- "Complete keyboard and modern edge-to-edge system-bars checks."
18278
+ "Confirm Keyboard and System Bars are provisioned automatically."
18279
+ ],
18280
+ [
18281
+ "SYSUI-02",
18282
+ "Confirm the web fallback reports provider-neutral capabilities."
18283
+ ],
18284
+ ["SYSUI-03", "Confirm the real WebView selects the native adapters."],
18285
+ [
18286
+ "SYSUI-04",
18287
+ "Open and dismiss the native keyboard five times without stale state."
18288
+ ],
18289
+ [
18290
+ "SYSUI-05",
18291
+ "Confirm light and dark foreground choices reach both Android system bars."
18292
+ ],
18293
+ [
18294
+ "SYSUI-06",
18295
+ "Hide and restore system bars and confirm restored content remains inside the safe area."
18296
+ ],
18297
+ [
18298
+ "SYSUI-07",
18299
+ "Rotate and relaunch while preserving the route and native adapters."
18300
+ ],
18301
+ [
18302
+ "SYSUI-08",
18303
+ "Apply a System UI component edit through native HMR and record its timing."
18246
18304
  ],
18247
18305
  [
18248
18306
  "FILES-01",
@@ -18261,6 +18319,14 @@ var init_androidTestReport = __esm(() => {
18261
18319
  "Complete online, offline, reconnect, isolation, and conflict checks."
18262
18320
  ],
18263
18321
  ["BGSYNC-01", "Complete WorkManager background Sync acceptance."],
18322
+ [
18323
+ "UPGRADE-01",
18324
+ "Install the next APK in place and confirm Auth, Sync SQLite, and pending operations survive."
18325
+ ],
18326
+ [
18327
+ "COMPAT-01",
18328
+ "Confirm installed app N works with retained N+1/N+2 producers, shows typed update-required at N+3, and recovers after server rollback."
18329
+ ],
18264
18330
  ["BUILD-01", "Pass release doctor and produce a signed AAB."],
18265
18331
  [
18266
18332
  "REPORT-01",
@@ -46,6 +46,29 @@ const isStringRecord = (value: unknown): value is Record<string, string> =>
46
46
  Object.values(value).every((entry) => typeof entry === 'string');
47
47
 
48
48
  restoreAbsoluteHmrApply();
49
+ const nativeDeviceAdapterPath = '/__absolute/native-device-adapter.js';
50
+ const nativeDeviceAdapterReady =
51
+ absoluteHmrClientTarget() === 'web'
52
+ ? Promise.resolve()
53
+ : import(nativeDeviceAdapterPath).then(() => undefined);
54
+ Reflect.set(
55
+ globalThis,
56
+ '__ABS_NATIVE_DEVICES_READY__',
57
+ nativeDeviceAdapterReady
58
+ );
59
+ Reflect.set(globalThis, '__ABS_NATIVE_DEVICES_READY_STATE__', 'loading');
60
+ void nativeDeviceAdapterReady.then(
61
+ () => {
62
+ Reflect.set(globalThis, '__ABS_NATIVE_DEVICES_READY_STATE__', 'ready');
63
+ },
64
+ (error) => {
65
+ Reflect.set(globalThis, '__ABS_NATIVE_DEVICES_READY_STATE__', 'failed');
66
+ console.error(
67
+ '[Absolute Mobile] Native device adapter failed to load:',
68
+ error
69
+ );
70
+ }
71
+ );
49
72
  const removeNativeSyncDevtools =
50
73
  absoluteHmrClientTarget() === 'web'
51
74
  ? () => undefined
package/dist/index.js CHANGED
@@ -29893,6 +29893,7 @@ var init_buildDepVendor = __esm(() => {
29893
29893
  var exports_devBuild = {};
29894
29894
  __export(exports_devBuild, {
29895
29895
  devBuild: () => devBuild,
29896
+ collectDepVendorSourceDirs: () => collectDepVendorSourceDirs,
29896
29897
  applyConfigChanges: () => applyConfigChanges
29897
29898
  });
29898
29899
  import { readdir as readdir6 } from "fs/promises";
@@ -29905,7 +29906,8 @@ var FRAMEWORK_DIR_KEYS, collectDepVendorSourceDirs = (config) => {
29905
29906
  config.vueDirectory,
29906
29907
  config.angularDirectory,
29907
29908
  config.htmlDirectory,
29908
- config.htmxDirectory
29909
+ config.htmxDirectory,
29910
+ resolve47(import.meta.dir, "../dev/client")
29909
29911
  ].filter((dir) => Boolean(dir));
29910
29912
  return Array.from(new Set(configuredDirs));
29911
29913
  }, parseDirectoryConfig = (source) => {
@@ -30905,6 +30907,53 @@ var init_requestInspector = __esm(() => {
30905
30907
  }).as("global");
30906
30908
  });
30907
30909
 
30910
+ // src/mobile/devDeviceAdapter.ts
30911
+ var exports_devDeviceAdapter = {};
30912
+ __export(exports_devDeviceAdapter, {
30913
+ buildAbsoluteNativeDevAdapter: () => buildAbsoluteNativeDevAdapter,
30914
+ absoluteNativeDevAdapterSource: () => absoluteNativeDevAdapterSource
30915
+ });
30916
+ import { mkdtemp as mkdtemp3, rm as rm15, writeFile as writeFile9 } from "fs/promises";
30917
+ import { join as join52 } from "path";
30918
+ import { tmpdir } from "os";
30919
+ var absoluteNativeDevAdapterSource = (projectRoot, mobile, resolveModule = (specifier) => specifier) => {
30920
+ const plan = resolveAbsoluteDeviceCapabilityPlan(projectRoot);
30921
+ const imports = plan.capabilities.map((name, index) => {
30922
+ const provider = plan.providers[name];
30923
+ if (!provider)
30924
+ throw new TypeError(`Missing device capability provider ${name}.`);
30925
+ return `import { ${provider.factory} as absoluteDeviceCapability${index} } from ${JSON.stringify(resolveModule(provider.module))};`;
30926
+ });
30927
+ const capabilities = plan.capabilities.map((name, index) => `${JSON.stringify(name)}: absoluteDeviceCapability${index}()`).join(", ");
30928
+ return [
30929
+ `import { installCapacitorDeviceAdapterIfNative } from ${JSON.stringify(resolveModule("@absolutejs/devices-capacitor"))};`,
30930
+ ...imports,
30931
+ `installCapacitorDeviceAdapterIfNative({ storagePrefix: ${JSON.stringify(`absolutejs.${mobile.appId}.`)}${capabilities ? `, ${capabilities}` : ""} });`
30932
+ ].join(`
30933
+ `);
30934
+ }, buildAbsoluteNativeDevAdapter = async (projectRoot, mobile) => {
30935
+ const temporaryDirectory = await mkdtemp3(join52(tmpdir(), "absolutejs-native-dev-adapter-"));
30936
+ const entry = join52(temporaryDirectory, "entry.ts");
30937
+ try {
30938
+ await writeFile9(entry, absoluteNativeDevAdapterSource(projectRoot, mobile, (specifier) => Bun.resolveSync(specifier, projectRoot)));
30939
+ const result = await Bun.build({
30940
+ entrypoints: [entry],
30941
+ format: "esm",
30942
+ minify: true,
30943
+ target: "browser"
30944
+ });
30945
+ if (!result.success || result.outputs.length !== 1) {
30946
+ throw new AggregateError(result.logs, "Failed to build the AbsoluteJS native development device adapter.");
30947
+ }
30948
+ return result.outputs[0]?.text() ?? "";
30949
+ } finally {
30950
+ await rm15(temporaryDirectory, { force: true, recursive: true });
30951
+ }
30952
+ };
30953
+ var init_devDeviceAdapter = __esm(() => {
30954
+ init_deviceCapabilities();
30955
+ });
30956
+
30908
30957
  // src/core/prerender.ts
30909
30958
  var exports_prerender = {};
30910
30959
  __export(exports_prerender, {
@@ -30916,7 +30965,7 @@ __export(exports_prerender, {
30916
30965
  PRERENDER_BYPASS_HEADER: () => PRERENDER_BYPASS_HEADER
30917
30966
  });
30918
30967
  import { mkdirSync as mkdirSync16, readFileSync as readFileSync34 } from "fs";
30919
- import { join as join52 } from "path";
30968
+ import { join as join53 } from "path";
30920
30969
  var SERVER_OUTPUT_LIMIT = 4000, STARTUP_POLL_INTERVAL_MS = 100, DEFAULT_STARTUP_TIMEOUT_MS = 30000, DEFAULT_FETCH_TIMEOUT_MS = 1e4, PRERENDER_BYPASS_HEADER = "X-Absolute-Prerender-Bypass", routeToFilename = (route) => route === "/" ? "index.html" : `${route.slice(1).replace(/\//g, "-")}.html`, writeTimestamp = async (htmlPath) => {
30921
30970
  const metaPath = htmlPath.replace(/\.html$/, ".meta");
30922
30971
  await Bun.write(metaPath, String(Date.now()));
@@ -30986,7 +31035,7 @@ var SERVER_OUTPUT_LIMIT = 4000, STARTUP_POLL_INTERVAL_MS = 100, DEFAULT_STARTUP_
30986
31035
  if (!isCompleteHtml(html))
30987
31036
  return false;
30988
31037
  const fileName = routeToFilename(route);
30989
- const filePath = join52(prerenderDir, fileName);
31038
+ const filePath = join53(prerenderDir, fileName);
30990
31039
  await Bun.write(filePath, html);
30991
31040
  await writeTimestamp(filePath);
30992
31041
  return true;
@@ -31016,13 +31065,13 @@ var SERVER_OUTPUT_LIMIT = 4000, STARTUP_POLL_INTERVAL_MS = 100, DEFAULT_STARTUP_
31016
31065
  return;
31017
31066
  }
31018
31067
  const fileName = routeToFilename(route);
31019
- const filePath = join52(prerenderDir, fileName);
31068
+ const filePath = join53(prerenderDir, fileName);
31020
31069
  await Bun.write(filePath, html);
31021
31070
  await writeTimestamp(filePath);
31022
31071
  result.routes.set(route, filePath);
31023
31072
  log2?.(` Pre-rendered ${route} \u2192 ${fileName} (${html.length} bytes)`);
31024
31073
  }, prerender = async (port, outDir, staticConfig, log2) => {
31025
- const prerenderDir = join52(outDir, "_prerendered");
31074
+ const prerenderDir = join53(outDir, "_prerendered");
31026
31075
  mkdirSync16(prerenderDir, { recursive: true });
31027
31076
  const baseUrl = `http://localhost:${port}`;
31028
31077
  let routes;
@@ -31148,7 +31197,7 @@ import {
31148
31197
  watch as watch2
31149
31198
  } from "fs";
31150
31199
  import { createHash as createHash9 } from "crypto";
31151
- import { dirname as dirname33, join as join56, resolve as resolve50 } from "path";
31200
+ import { dirname as dirname33, join as join57, resolve as resolve50 } from "path";
31152
31201
  var ATOMIC_RECOVERY_WINDOW_MS = 1000, RELOAD_DEBOUNCE_MS = 80, ENTRY_IMPORT_RETRY_DELAY_MS = 250, MAX_ENTRY_IMPORT_ATTEMPTS = 3, WATCH_FALLBACK_INTERVAL_MS = 250, ATOMIC_WRITE_TEMP_PATTERNS2, isAtomicWriteTemp = (filename) => filename.endsWith(".tmp") || filename.includes(".tmp.") || filename.endsWith("~") || filename.startsWith(".#") || filename.startsWith(".absolutejs-hmr-") || ATOMIC_WRITE_TEMP_PATTERNS2.some((pattern) => pattern.test(filename)), fileHash = (path) => {
31153
31202
  try {
31154
31203
  return createHash9("sha256").update(readFileSync38(path)).digest("hex");
@@ -31190,7 +31239,7 @@ var ATOMIC_RECOVERY_WINDOW_MS = 1000, RELOAD_DEBOUNCE_MS = 80, ENTRY_IMPORT_RETR
31190
31239
  let pendingEntryCause = null;
31191
31240
  let siblingSequence = 0;
31192
31241
  const importFreshEntry = async (attempt = 1) => {
31193
- const siblingPath = join56(entryDir, `.absolutejs-hmr-${process.pid}-${siblingSequence++}.ts`);
31242
+ const siblingPath = join57(entryDir, `.absolutejs-hmr-${process.pid}-${siblingSequence++}.ts`);
31194
31243
  let failure;
31195
31244
  try {
31196
31245
  copyFileSync4(entryPath, siblingPath);
@@ -31303,7 +31352,7 @@ var ATOMIC_RECOVERY_WINDOW_MS = 1000, RELOAD_DEBOUNCE_MS = 80, ENTRY_IMPORT_RETR
31303
31352
  continue;
31304
31353
  let st2;
31305
31354
  try {
31306
- st2 = statSync8(join56(dir, entry.name));
31355
+ st2 = statSync8(join57(dir, entry.name));
31307
31356
  } catch {
31308
31357
  continue;
31309
31358
  }
@@ -32172,7 +32221,7 @@ var handleHTMXPageRequest = async (pagePath, options = {}) => {
32172
32221
  // src/core/prepare.ts
32173
32222
  import { createHash as createHash8 } from "crypto";
32174
32223
  import { existsSync as existsSync39, readdirSync as readdirSync10, readFileSync as readFileSync35 } from "fs";
32175
- import { basename as basename18, join as join53, relative as relative20, resolve as resolvePath4 } from "path";
32224
+ import { basename as basename18, join as join54, relative as relative20, resolve as resolvePath4 } from "path";
32176
32225
  import { Elysia as Elysia9, NotFound } from "elysia";
32177
32226
 
32178
32227
  // src/plugins/openApiPlugin.ts
@@ -32613,6 +32662,10 @@ var applyMobileCorsHeaders = (response, origin) => {
32613
32662
  response.headers.append("vary", "Origin");
32614
32663
  return response;
32615
32664
  };
32665
+ var finalizeMobileResponse = (request, response) => {
32666
+ const origin = mobileWebViewOrigin(request);
32667
+ return origin ? applyMobileCorsHeaders(response, origin) : response;
32668
+ };
32616
32669
  var mobilePreflightResponse = (request) => {
32617
32670
  if (request.method !== "OPTIONS")
32618
32671
  return;
@@ -32670,23 +32723,24 @@ var createAbsoluteMobileCompatibilityDispatcher = (options) => {
32670
32723
  return;
32671
32724
  const resolved = resolveAbsoluteMobileCompatibilityRelease(parsed.client, artifacts);
32672
32725
  if (resolved.kind === "upgrade-required") {
32673
- return createAbsoluteMobileUpgradeResponse(resolved.result);
32726
+ return finalizeMobileResponse(request, createAbsoluteMobileUpgradeResponse(resolved.result));
32674
32727
  }
32675
32728
  if (!artifactOwnsRequest(resolved.artifact, parsed.client.pageId, request)) {
32676
- return createAbsoluteMobileInvalidRequestResponse("The requested URL is not assigned to this mobile page.");
32729
+ return finalizeMobileResponse(request, createAbsoluteMobileInvalidRequestResponse("The requested URL is not assigned to this mobile page."));
32677
32730
  }
32678
32731
  if (resolved.artifact.releaseId === options.currentReleaseId) {
32679
32732
  return;
32680
32733
  }
32681
32734
  try {
32682
32735
  const producer = await resolveProducer(resolved.artifact);
32683
- return runWithAbsoluteMobileProducer({
32736
+ const response = await runWithAbsoluteMobileProducer({
32684
32737
  page: resolved.page,
32685
32738
  releaseId: resolved.artifact.releaseId
32686
32739
  }, () => producer.handle(request));
32740
+ return finalizeMobileResponse(request, response);
32687
32741
  } catch (error) {
32688
32742
  console.error(`[Mobile] Failed to load retained producer ${resolved.artifact.releaseId}:`, error);
32689
- return createAbsoluteMobilePageErrorResponse(parsed.client.pageId);
32743
+ return finalizeMobileResponse(request, createAbsoluteMobilePageErrorResponse(parsed.client.pageId));
32690
32744
  }
32691
32745
  }).afterHandle("global", ({ request, responseValue }) => {
32692
32746
  const origin = mobileWebViewOrigin(request);
@@ -33574,7 +33628,7 @@ var registerIconVersioning = (buildDir) => {
33574
33628
  if (cached !== undefined)
33575
33629
  return cached;
33576
33630
  const path = href.split("?")[0] ?? href;
33577
- const filePath = join53(buildDir, path);
33631
+ const filePath = join54(buildDir, path);
33578
33632
  let versioned = href;
33579
33633
  if (existsSync39(filePath)) {
33580
33634
  const hash = createHash8("sha256").update(readFileSync35(filePath)).digest("hex").slice(0, ICON_HASH_LENGTH);
@@ -33667,12 +33721,20 @@ var prepareDev = async (config, buildDir) => {
33667
33721
  const { requestInspector: requestInspector2 } = await Promise.resolve().then(() => (init_requestInspector(), exports_requestInspector));
33668
33722
  const { serverTiming } = await import("@elysia/server-timing");
33669
33723
  const mobileAssociationPlugin = createAbsoluteMobileAssociationPlugin(config.mobile, process.cwd());
33724
+ const nativeMobileConfig = config.mobile;
33725
+ let nativeDevAdapterBundle;
33726
+ const getNativeDevAdapterBundle = () => nativeDevAdapterBundle ??= nativeMobileConfig ? Promise.resolve().then(() => (init_devDeviceAdapter(), exports_devDeviceAdapter)).then(({ buildAbsoluteNativeDevAdapter: buildAbsoluteNativeDevAdapter2 }) => buildAbsoluteNativeDevAdapter2(process.cwd(), nativeMobileConfig)) : Promise.resolve("export {};");
33670
33727
  const absolutejs = new Elysia9({ name: "absolutejs-runtime" }).use(requestInspector2).use(absoluteRequestContext).use(serverTiming()).use(devtoolsJson2(buildDir, {
33671
33728
  normalizeForWindowsContainer: config.dev?.devtools?.normalizeForWindowsContainer,
33672
33729
  projectRoot: config.dev?.devtools?.projectRoot,
33673
33730
  uuid: config.dev?.devtools?.uuid,
33674
33731
  uuidCachePath: config.dev?.devtools?.uuidCachePath
33675
- })).use(imageOptimizer2(config.images, buildDir)).use(mobileAssociationPlugin).use(await mountStaticPlugin(staticPlugin, {
33732
+ })).use(imageOptimizer2(config.images, buildDir)).use(mobileAssociationPlugin).get("/__absolute/native-device-adapter.js", async () => new Response(await getNativeDevAdapterBundle(), {
33733
+ headers: {
33734
+ "Cache-Control": "no-store",
33735
+ "Content-Type": "text/javascript; charset=utf-8"
33736
+ }
33737
+ })).use(await mountStaticPlugin(staticPlugin, {
33676
33738
  alwaysStatic: true,
33677
33739
  assets: buildDir,
33678
33740
  directive: "no-cache",
@@ -33704,13 +33766,13 @@ var loadPrerenderMap = (prerenderDir) => {
33704
33766
  continue;
33705
33767
  const name = basename18(entry, ".html");
33706
33768
  const route = name === "index" ? "/" : `/${name}`;
33707
- map.set(route, join53(prerenderDir, entry));
33769
+ map.set(route, join54(prerenderDir, entry));
33708
33770
  }
33709
33771
  return map;
33710
33772
  };
33711
33773
  var loadMobileCompatibilityPlugin = async (buildDir) => {
33712
- const root = join53(buildDir, ".absolutejs", "mobile-compatibility");
33713
- if (!existsSync39(join53(root, "current.json"))) {
33774
+ const root = join54(buildDir, ".absolutejs", "mobile-compatibility");
33775
+ if (!existsSync39(join54(root, "current.json"))) {
33714
33776
  return new Elysia9({ name: "absolutejs-mobile-compatibility-empty" });
33715
33777
  }
33716
33778
  const options = await loadAbsoluteMobileMaterializedBundle(root);
@@ -33771,12 +33833,12 @@ var prepare = async (configOrPath) => {
33771
33833
  setCurrentPageIslandMetadata(await loadPageIslandMetadata(config));
33772
33834
  recordStep("load production manifest and island metadata", stepStartedAt);
33773
33835
  stepStartedAt = performance.now();
33774
- const conventionsPath = join53(buildDir, "conventions.json");
33836
+ const conventionsPath = join54(buildDir, "conventions.json");
33775
33837
  if (existsSync39(conventionsPath)) {
33776
33838
  const conventions2 = JSON.parse(readFileSync35(conventionsPath, "utf-8"));
33777
33839
  setConventions(conventions2);
33778
33840
  }
33779
- const spaRoutesPath = join53(buildDir, "spa-routes.json");
33841
+ const spaRoutesPath = join54(buildDir, "spa-routes.json");
33780
33842
  if (existsSync39(spaRoutesPath)) {
33781
33843
  setSpaRouteManifest(JSON.parse(readFileSync35(spaRoutesPath, "utf-8")));
33782
33844
  }
@@ -33789,7 +33851,7 @@ var prepare = async (configOrPath) => {
33789
33851
  prefix: "",
33790
33852
  staticLimit: MAX_STATIC_ROUTE_COUNT
33791
33853
  });
33792
- const generatedAssetsRoot = join53(buildDir, ".absolutejs");
33854
+ const generatedAssetsRoot = join54(buildDir, ".absolutejs");
33793
33855
  const generatedAssetsPlugin = new Elysia9({
33794
33856
  name: "absolutejs-generated-assets"
33795
33857
  }).get("/.absolutejs/*", async ({ params, set }) => {
@@ -33827,7 +33889,7 @@ var prepare = async (configOrPath) => {
33827
33889
  responseValue.headers.set("cache-control", isFingerprintedAsset(pathname) ? "public, max-age=31536000, immutable" : "public, max-age=0, must-revalidate");
33828
33890
  });
33829
33891
  stepStartedAt = performance.now();
33830
- const prerenderDir = join53(buildDir, "_prerendered");
33892
+ const prerenderDir = join54(buildDir, "_prerendered");
33831
33893
  const prerenderMap = loadPrerenderMap(prerenderDir);
33832
33894
  const mobileCompatibilityPlugin = await loadMobileCompatibilityPlugin(buildDir);
33833
33895
  const mobileAssociationPlugin = createAbsoluteMobileAssociationPlugin(config.mobile, process.cwd(), { requireAll: true });
@@ -33900,10 +33962,10 @@ import {
33900
33962
  readFileSync as readFileSync36,
33901
33963
  rmSync as rmSync4
33902
33964
  } from "fs";
33903
- import { join as join54 } from "path";
33904
- var CERT_DIR = join54(process.cwd(), ".absolutejs");
33905
- var CERT_PATH = join54(CERT_DIR, "cert.pem");
33906
- var KEY_PATH = join54(CERT_DIR, "key.pem");
33965
+ import { join as join55 } from "path";
33966
+ var CERT_DIR = join55(process.cwd(), ".absolutejs");
33967
+ var CERT_PATH = join55(CERT_DIR, "cert.pem");
33968
+ var KEY_PATH = join55(CERT_DIR, "key.pem");
33907
33969
  var CERT_VALIDITY_DAYS = 365;
33908
33970
  var devLog = (msg) => console.log(`\x1B[2m${new Date().toLocaleTimeString()}\x1B[0m \x1B[36m[dev]\x1B[0m ${msg}`);
33909
33971
  var devWarn = (msg) => console.log(`\x1B[2m${new Date().toLocaleTimeString()}\x1B[0m \x1B[33m[dev]\x1B[0m \x1B[33m${msg}\x1B[0m`);
@@ -34023,12 +34085,12 @@ import {
34023
34085
  writeFileSync as writeFileSync11
34024
34086
  } from "fs";
34025
34087
  import { homedir as homedir2 } from "os";
34026
- import { basename as basename19, join as join55 } from "path";
34088
+ import { basename as basename19, join as join56 } from "path";
34027
34089
  var registeredPids = new Set;
34028
34090
  var exitHandlerRegistered = false;
34029
- var instanceFilePath = (pid) => join55(instanceRegistryDir(), `${pid}.json`);
34030
- var instanceLogPath = (pid) => join55(instanceRegistryDir(), `${pid}.log`);
34031
- var instanceRegistryDir = () => join55(homedir2(), ".absolutejs", "instances");
34091
+ var instanceFilePath = (pid) => join56(instanceRegistryDir(), `${pid}.json`);
34092
+ var instanceLogPath = (pid) => join56(instanceRegistryDir(), `${pid}.log`);
34093
+ var instanceRegistryDir = () => join56(homedir2(), ".absolutejs", "instances");
34032
34094
  var removeInstanceFilesSync = (pid) => {
34033
34095
  try {
34034
34096
  unlinkSync2(instanceFilePath(pid));
@@ -34063,7 +34125,7 @@ var registerInstance = (record) => {
34063
34125
  return record;
34064
34126
  };
34065
34127
  var resolveProjectName = (cwd2) => {
34066
- const parsed = readJsonFile(join55(cwd2, "package.json"));
34128
+ const parsed = readJsonFile(join56(cwd2, "package.json"));
34067
34129
  if (parsed !== null && typeof parsed === "object" && typeof parsed.name === "string" && parsed.name.trim().length > 0) {
34068
34130
  return parsed.name;
34069
34131
  }
@@ -40721,5 +40783,5 @@ export {
40721
40783
  ANGULAR_INIT_TIMEOUT_MS
40722
40784
  };
40723
40785
 
40724
- //# debugId=C9BAE4208249D80364756E2164756E21
40786
+ //# debugId=BA41AA624E4BADC564756E2164756E21
40725
40787
  //# sourceMappingURL=index.js.map