@absolutejs/absolute 0.20.0-beta.26 → 0.20.0-beta.28

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
@@ -6817,15 +6817,23 @@ var DEVICES_PACKAGE = "@absolutejs/devices", CAPACITOR_ADAPTER = "@absolutejs/de
6817
6817
  return;
6818
6818
  if (!object2(value))
6819
6819
  throw new TypeError(`${field} must be an object.`);
6820
- const { privacyAccessedApis, pushNotifications, usageDescriptions } = value;
6820
+ const {
6821
+ privacyAccessedApis,
6822
+ pushNotifications,
6823
+ systemBars,
6824
+ usageDescriptions
6825
+ } = value;
6821
6826
  if (pushNotifications !== undefined && pushNotifications !== true)
6822
6827
  throw new TypeError(`${field}.pushNotifications must be true.`);
6828
+ if (systemBars !== undefined && systemBars !== true)
6829
+ throw new TypeError(`${field}.systemBars must be true.`);
6823
6830
  if (usageDescriptions !== undefined && (!Array.isArray(usageDescriptions) || !usageDescriptions.every((purpose) => typeof purpose === "string" && IOS_USAGE_DESCRIPTIONS.has(purpose))))
6824
6831
  throw new TypeError(`${field}.usageDescriptions contains an unsupported purpose.`);
6825
6832
  const privacy = iosPrivacyAccessedApis(privacyAccessedApis, `${field}.privacyAccessedApis`);
6826
6833
  return {
6827
6834
  ...privacy === undefined ? {} : { privacyAccessedApis: privacy },
6828
6835
  ...pushNotifications === true ? { pushNotifications: true } : {},
6836
+ ...systemBars === true ? { systemBars: true } : {},
6829
6837
  ...usageDescriptions === undefined ? {} : { usageDescriptions: [...usageDescriptions] }
6830
6838
  };
6831
6839
  }, parseProvider = (name, value) => {
@@ -6882,6 +6890,7 @@ var DEVICES_PACKAGE = "@absolutejs/devices", CAPACITOR_ADAPTER = "@absolutejs/de
6882
6890
  return reasons ? [{ api, reasons: [...reasons].sort() }] : [];
6883
6891
  }),
6884
6892
  iosPushNotifications: plan.capabilities.some((name) => plan.providers[name]?.native?.ios?.pushNotifications === true),
6893
+ iosSystemBars: plan.capabilities.some((name) => plan.providers[name]?.native?.ios?.systemBars === true),
6885
6894
  iosUsageDescriptions: [
6886
6895
  ...new Set(plan.capabilities.flatMap((name) => plan.providers[name]?.native?.ios?.usageDescriptions ?? []))
6887
6896
  ].sort()
@@ -16717,8 +16726,18 @@ ${next.slice(index)}`;
16717
16726
  const path = join47(config.nativeProjectDirectory, "ios/App/App/Info.plist");
16718
16727
  const source = await readFile12(path, "utf8");
16719
16728
  const requirements = absoluteDeviceNativeRequirements(plan);
16720
- const content = requirements.iosUsageDescriptions.map((purpose) => ` <key>${IOS_KEYS[purpose]}</key>
16729
+ const existingSystemBars = source.match(/<key>UIViewControllerBasedStatusBarAppearance<\/key>\s*<(true|false)\s*\/>/u);
16730
+ const ownedStart = source.indexOf(START_MARKER2);
16731
+ const ownedEnd = source.indexOf(END_MARKER2);
16732
+ const ownsSystemBars = ownedStart >= 0 && ownedEnd > ownedStart && source.slice(ownedStart, ownedEnd).includes("UIViewControllerBasedStatusBarAppearance");
16733
+ if (requirements.iosSystemBars && existingSystemBars?.[1] === "false" && !ownsSystemBars)
16734
+ throw new TypeError("iOS system bars require UIViewControllerBasedStatusBarAppearance to be true.");
16735
+ const usageContent = requirements.iosUsageDescriptions.map((purpose) => ` <key>${IOS_KEYS[purpose]}</key>
16721
16736
  <string>${escapeXml2(iosDescription(config.appName, purpose))}</string>`).join(`
16737
+ `);
16738
+ const systemBarsContent = requirements.iosSystemBars && (existingSystemBars === null || ownsSystemBars) ? ` <key>UIViewControllerBasedStatusBarAppearance</key>
16739
+ <true/>` : "";
16740
+ const content = [usageContent, systemBarsContent].filter(Boolean).join(`
16722
16741
  `);
16723
16742
  const region = content ? ` ${START_MARKER2}
16724
16743
  ${content}
@@ -17441,6 +17460,19 @@ var CDP_COMMAND_TIMEOUT_MS = 1e4, WEBVIEW_ATTACH_TIMEOUT_MS = 30000, WEBVIEW_POL
17441
17460
  await mkdir11(dirname28(absolutePath), { recursive: true });
17442
17461
  await writeFile13(absolutePath, Buffer.from(data, "base64"));
17443
17462
  return absolutePath;
17463
+ },
17464
+ tap: async (coordinateX, coordinateY) => {
17465
+ if (!Number.isFinite(coordinateX) || !Number.isFinite(coordinateY) || coordinateX < 0 || coordinateY < 0) {
17466
+ throw new TypeError("Android WebView tap coordinates must be finite non-negative numbers.");
17467
+ }
17468
+ await connection.command("Input.dispatchTouchEvent", {
17469
+ touchPoints: [{ x: coordinateX, y: coordinateY }],
17470
+ type: "touchStart"
17471
+ });
17472
+ await connection.command("Input.dispatchTouchEvent", {
17473
+ touchPoints: [],
17474
+ type: "touchEnd"
17475
+ });
17444
17476
  }
17445
17477
  };
17446
17478
  }, failForward = (error, options, capture, hostPort) => {
@@ -18144,6 +18176,10 @@ var init_iosTestReport = __esm(() => {
18144
18176
  ["DEV-01", "Record cold and warm bun dev startup timings."],
18145
18177
  ["DEV-02", "Complete route traversal, HMR, relaunch, and recovery checks."],
18146
18178
  ["CAP-01", "Complete automatic device-capability provisioning checks."],
18179
+ ...Array.from({ length: 8 }, (_, index) => [
18180
+ `SYSUI-${String(index + 1).padStart(2, "0")}`,
18181
+ `Complete provider-neutral Keyboard and System Bars runbook check SYSUI-${String(index + 1).padStart(2, "0")}.`
18182
+ ]),
18147
18183
  ...Array.from({ length: 8 }, (_, index) => [
18148
18184
  `FILES-${String(index + 1).padStart(2, "0")}`,
18149
18185
  `Complete provider-neutral Documents runbook check FILES-${String(index + 1).padStart(2, "0")}.`
@@ -18152,6 +18188,10 @@ var init_iosTestReport = __esm(() => {
18152
18188
  `NOTIF-${String(index + 1).padStart(2, "0")}`,
18153
18189
  `Complete provider-neutral Local Notifications runbook check NOTIF-${String(index + 1).padStart(2, "0")}.`
18154
18190
  ]),
18191
+ ...Array.from({ length: 8 }, (_, index) => [
18192
+ `PUSH-${String(index + 1).padStart(2, "0")}`,
18193
+ `Complete provider-neutral Push Notifications runbook check PUSH-${String(index + 1).padStart(2, "0")}.`
18194
+ ]),
18155
18195
  ...Array.from({ length: 14 }, (_, index) => [
18156
18196
  `LOC-${String(index + 1).padStart(2, "0")}`,
18157
18197
  `Complete foreground-location runbook check LOC-${String(index + 1).padStart(2, "0")} without recording exact coordinates.`
@@ -18213,6 +18253,35 @@ var init_androidTestReport = __esm(() => {
18213
18253
  ["DEV-01", "Record cold and warm native startup timings."],
18214
18254
  ["DEV-02", "Complete route traversal, HMR, relaunch, and recovery checks."],
18215
18255
  ["CAP-01", "Complete automatic device-capability provisioning checks."],
18256
+ [
18257
+ "SYSUI-01",
18258
+ "Confirm Keyboard and System Bars are provisioned automatically."
18259
+ ],
18260
+ [
18261
+ "SYSUI-02",
18262
+ "Confirm the web fallback reports provider-neutral capabilities."
18263
+ ],
18264
+ ["SYSUI-03", "Confirm the real WebView selects the native adapters."],
18265
+ [
18266
+ "SYSUI-04",
18267
+ "Open and dismiss the native keyboard five times without stale state."
18268
+ ],
18269
+ [
18270
+ "SYSUI-05",
18271
+ "Confirm light and dark foreground choices reach both Android system bars."
18272
+ ],
18273
+ [
18274
+ "SYSUI-06",
18275
+ "Hide and restore system bars and confirm restored content remains inside the safe area."
18276
+ ],
18277
+ [
18278
+ "SYSUI-07",
18279
+ "Rotate and relaunch while preserving the route and native adapters."
18280
+ ],
18281
+ [
18282
+ "SYSUI-08",
18283
+ "Apply a System UI component edit through native HMR and record its timing."
18284
+ ],
18216
18285
  [
18217
18286
  "FILES-01",
18218
18287
  "Complete provider-neutral file pick, export, open, and cleanup checks."
@@ -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
@@ -13257,15 +13257,23 @@ var DEVICES_PACKAGE = "@absolutejs/devices", CAPACITOR_ADAPTER = "@absolutejs/de
13257
13257
  return;
13258
13258
  if (!object(value))
13259
13259
  throw new TypeError(`${field} must be an object.`);
13260
- const { privacyAccessedApis, pushNotifications, usageDescriptions } = value;
13260
+ const {
13261
+ privacyAccessedApis,
13262
+ pushNotifications,
13263
+ systemBars,
13264
+ usageDescriptions
13265
+ } = value;
13261
13266
  if (pushNotifications !== undefined && pushNotifications !== true)
13262
13267
  throw new TypeError(`${field}.pushNotifications must be true.`);
13268
+ if (systemBars !== undefined && systemBars !== true)
13269
+ throw new TypeError(`${field}.systemBars must be true.`);
13263
13270
  if (usageDescriptions !== undefined && (!Array.isArray(usageDescriptions) || !usageDescriptions.every((purpose) => typeof purpose === "string" && IOS_USAGE_DESCRIPTIONS.has(purpose))))
13264
13271
  throw new TypeError(`${field}.usageDescriptions contains an unsupported purpose.`);
13265
13272
  const privacy = iosPrivacyAccessedApis(privacyAccessedApis, `${field}.privacyAccessedApis`);
13266
13273
  return {
13267
13274
  ...privacy === undefined ? {} : { privacyAccessedApis: privacy },
13268
13275
  ...pushNotifications === true ? { pushNotifications: true } : {},
13276
+ ...systemBars === true ? { systemBars: true } : {},
13269
13277
  ...usageDescriptions === undefined ? {} : { usageDescriptions: [...usageDescriptions] }
13270
13278
  };
13271
13279
  }, parseProvider = (name, value) => {
@@ -13322,6 +13330,7 @@ var DEVICES_PACKAGE = "@absolutejs/devices", CAPACITOR_ADAPTER = "@absolutejs/de
13322
13330
  return reasons ? [{ api, reasons: [...reasons].sort() }] : [];
13323
13331
  }),
13324
13332
  iosPushNotifications: plan.capabilities.some((name) => plan.providers[name]?.native?.ios?.pushNotifications === true),
13333
+ iosSystemBars: plan.capabilities.some((name) => plan.providers[name]?.native?.ios?.systemBars === true),
13325
13334
  iosUsageDescriptions: [
13326
13335
  ...new Set(plan.capabilities.flatMap((name) => plan.providers[name]?.native?.ios?.usageDescriptions ?? []))
13327
13336
  ].sort()
@@ -29884,6 +29893,7 @@ var init_buildDepVendor = __esm(() => {
29884
29893
  var exports_devBuild = {};
29885
29894
  __export(exports_devBuild, {
29886
29895
  devBuild: () => devBuild,
29896
+ collectDepVendorSourceDirs: () => collectDepVendorSourceDirs,
29887
29897
  applyConfigChanges: () => applyConfigChanges
29888
29898
  });
29889
29899
  import { readdir as readdir6 } from "fs/promises";
@@ -29896,7 +29906,8 @@ var FRAMEWORK_DIR_KEYS, collectDepVendorSourceDirs = (config) => {
29896
29906
  config.vueDirectory,
29897
29907
  config.angularDirectory,
29898
29908
  config.htmlDirectory,
29899
- config.htmxDirectory
29909
+ config.htmxDirectory,
29910
+ resolve47(import.meta.dir, "../dev/client")
29900
29911
  ].filter((dir) => Boolean(dir));
29901
29912
  return Array.from(new Set(configuredDirs));
29902
29913
  }, parseDirectoryConfig = (source) => {
@@ -30896,6 +30907,53 @@ var init_requestInspector = __esm(() => {
30896
30907
  }).as("global");
30897
30908
  });
30898
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
+
30899
30957
  // src/core/prerender.ts
30900
30958
  var exports_prerender = {};
30901
30959
  __export(exports_prerender, {
@@ -30907,7 +30965,7 @@ __export(exports_prerender, {
30907
30965
  PRERENDER_BYPASS_HEADER: () => PRERENDER_BYPASS_HEADER
30908
30966
  });
30909
30967
  import { mkdirSync as mkdirSync16, readFileSync as readFileSync34 } from "fs";
30910
- import { join as join52 } from "path";
30968
+ import { join as join53 } from "path";
30911
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) => {
30912
30970
  const metaPath = htmlPath.replace(/\.html$/, ".meta");
30913
30971
  await Bun.write(metaPath, String(Date.now()));
@@ -30977,7 +31035,7 @@ var SERVER_OUTPUT_LIMIT = 4000, STARTUP_POLL_INTERVAL_MS = 100, DEFAULT_STARTUP_
30977
31035
  if (!isCompleteHtml(html))
30978
31036
  return false;
30979
31037
  const fileName = routeToFilename(route);
30980
- const filePath = join52(prerenderDir, fileName);
31038
+ const filePath = join53(prerenderDir, fileName);
30981
31039
  await Bun.write(filePath, html);
30982
31040
  await writeTimestamp(filePath);
30983
31041
  return true;
@@ -31007,13 +31065,13 @@ var SERVER_OUTPUT_LIMIT = 4000, STARTUP_POLL_INTERVAL_MS = 100, DEFAULT_STARTUP_
31007
31065
  return;
31008
31066
  }
31009
31067
  const fileName = routeToFilename(route);
31010
- const filePath = join52(prerenderDir, fileName);
31068
+ const filePath = join53(prerenderDir, fileName);
31011
31069
  await Bun.write(filePath, html);
31012
31070
  await writeTimestamp(filePath);
31013
31071
  result.routes.set(route, filePath);
31014
31072
  log2?.(` Pre-rendered ${route} \u2192 ${fileName} (${html.length} bytes)`);
31015
31073
  }, prerender = async (port, outDir, staticConfig, log2) => {
31016
- const prerenderDir = join52(outDir, "_prerendered");
31074
+ const prerenderDir = join53(outDir, "_prerendered");
31017
31075
  mkdirSync16(prerenderDir, { recursive: true });
31018
31076
  const baseUrl = `http://localhost:${port}`;
31019
31077
  let routes;
@@ -31139,7 +31197,7 @@ import {
31139
31197
  watch as watch2
31140
31198
  } from "fs";
31141
31199
  import { createHash as createHash9 } from "crypto";
31142
- 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";
31143
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) => {
31144
31202
  try {
31145
31203
  return createHash9("sha256").update(readFileSync38(path)).digest("hex");
@@ -31181,7 +31239,7 @@ var ATOMIC_RECOVERY_WINDOW_MS = 1000, RELOAD_DEBOUNCE_MS = 80, ENTRY_IMPORT_RETR
31181
31239
  let pendingEntryCause = null;
31182
31240
  let siblingSequence = 0;
31183
31241
  const importFreshEntry = async (attempt = 1) => {
31184
- const siblingPath = join56(entryDir, `.absolutejs-hmr-${process.pid}-${siblingSequence++}.ts`);
31242
+ const siblingPath = join57(entryDir, `.absolutejs-hmr-${process.pid}-${siblingSequence++}.ts`);
31185
31243
  let failure;
31186
31244
  try {
31187
31245
  copyFileSync4(entryPath, siblingPath);
@@ -31294,7 +31352,7 @@ var ATOMIC_RECOVERY_WINDOW_MS = 1000, RELOAD_DEBOUNCE_MS = 80, ENTRY_IMPORT_RETR
31294
31352
  continue;
31295
31353
  let st2;
31296
31354
  try {
31297
- st2 = statSync8(join56(dir, entry.name));
31355
+ st2 = statSync8(join57(dir, entry.name));
31298
31356
  } catch {
31299
31357
  continue;
31300
31358
  }
@@ -32163,7 +32221,7 @@ var handleHTMXPageRequest = async (pagePath, options = {}) => {
32163
32221
  // src/core/prepare.ts
32164
32222
  import { createHash as createHash8 } from "crypto";
32165
32223
  import { existsSync as existsSync39, readdirSync as readdirSync10, readFileSync as readFileSync35 } from "fs";
32166
- 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";
32167
32225
  import { Elysia as Elysia9, NotFound } from "elysia";
32168
32226
 
32169
32227
  // src/plugins/openApiPlugin.ts
@@ -33565,7 +33623,7 @@ var registerIconVersioning = (buildDir) => {
33565
33623
  if (cached !== undefined)
33566
33624
  return cached;
33567
33625
  const path = href.split("?")[0] ?? href;
33568
- const filePath = join53(buildDir, path);
33626
+ const filePath = join54(buildDir, path);
33569
33627
  let versioned = href;
33570
33628
  if (existsSync39(filePath)) {
33571
33629
  const hash = createHash8("sha256").update(readFileSync35(filePath)).digest("hex").slice(0, ICON_HASH_LENGTH);
@@ -33658,12 +33716,20 @@ var prepareDev = async (config, buildDir) => {
33658
33716
  const { requestInspector: requestInspector2 } = await Promise.resolve().then(() => (init_requestInspector(), exports_requestInspector));
33659
33717
  const { serverTiming } = await import("@elysia/server-timing");
33660
33718
  const mobileAssociationPlugin = createAbsoluteMobileAssociationPlugin(config.mobile, process.cwd());
33719
+ const nativeMobileConfig = config.mobile;
33720
+ let nativeDevAdapterBundle;
33721
+ const getNativeDevAdapterBundle = () => nativeDevAdapterBundle ??= nativeMobileConfig ? Promise.resolve().then(() => (init_devDeviceAdapter(), exports_devDeviceAdapter)).then(({ buildAbsoluteNativeDevAdapter: buildAbsoluteNativeDevAdapter2 }) => buildAbsoluteNativeDevAdapter2(process.cwd(), nativeMobileConfig)) : Promise.resolve("export {};");
33661
33722
  const absolutejs = new Elysia9({ name: "absolutejs-runtime" }).use(requestInspector2).use(absoluteRequestContext).use(serverTiming()).use(devtoolsJson2(buildDir, {
33662
33723
  normalizeForWindowsContainer: config.dev?.devtools?.normalizeForWindowsContainer,
33663
33724
  projectRoot: config.dev?.devtools?.projectRoot,
33664
33725
  uuid: config.dev?.devtools?.uuid,
33665
33726
  uuidCachePath: config.dev?.devtools?.uuidCachePath
33666
- })).use(imageOptimizer2(config.images, buildDir)).use(mobileAssociationPlugin).use(await mountStaticPlugin(staticPlugin, {
33727
+ })).use(imageOptimizer2(config.images, buildDir)).use(mobileAssociationPlugin).get("/__absolute/native-device-adapter.js", async () => new Response(await getNativeDevAdapterBundle(), {
33728
+ headers: {
33729
+ "Cache-Control": "no-store",
33730
+ "Content-Type": "text/javascript; charset=utf-8"
33731
+ }
33732
+ })).use(await mountStaticPlugin(staticPlugin, {
33667
33733
  alwaysStatic: true,
33668
33734
  assets: buildDir,
33669
33735
  directive: "no-cache",
@@ -33695,13 +33761,13 @@ var loadPrerenderMap = (prerenderDir) => {
33695
33761
  continue;
33696
33762
  const name = basename18(entry, ".html");
33697
33763
  const route = name === "index" ? "/" : `/${name}`;
33698
- map.set(route, join53(prerenderDir, entry));
33764
+ map.set(route, join54(prerenderDir, entry));
33699
33765
  }
33700
33766
  return map;
33701
33767
  };
33702
33768
  var loadMobileCompatibilityPlugin = async (buildDir) => {
33703
- const root = join53(buildDir, ".absolutejs", "mobile-compatibility");
33704
- if (!existsSync39(join53(root, "current.json"))) {
33769
+ const root = join54(buildDir, ".absolutejs", "mobile-compatibility");
33770
+ if (!existsSync39(join54(root, "current.json"))) {
33705
33771
  return new Elysia9({ name: "absolutejs-mobile-compatibility-empty" });
33706
33772
  }
33707
33773
  const options = await loadAbsoluteMobileMaterializedBundle(root);
@@ -33762,12 +33828,12 @@ var prepare = async (configOrPath) => {
33762
33828
  setCurrentPageIslandMetadata(await loadPageIslandMetadata(config));
33763
33829
  recordStep("load production manifest and island metadata", stepStartedAt);
33764
33830
  stepStartedAt = performance.now();
33765
- const conventionsPath = join53(buildDir, "conventions.json");
33831
+ const conventionsPath = join54(buildDir, "conventions.json");
33766
33832
  if (existsSync39(conventionsPath)) {
33767
33833
  const conventions2 = JSON.parse(readFileSync35(conventionsPath, "utf-8"));
33768
33834
  setConventions(conventions2);
33769
33835
  }
33770
- const spaRoutesPath = join53(buildDir, "spa-routes.json");
33836
+ const spaRoutesPath = join54(buildDir, "spa-routes.json");
33771
33837
  if (existsSync39(spaRoutesPath)) {
33772
33838
  setSpaRouteManifest(JSON.parse(readFileSync35(spaRoutesPath, "utf-8")));
33773
33839
  }
@@ -33780,7 +33846,7 @@ var prepare = async (configOrPath) => {
33780
33846
  prefix: "",
33781
33847
  staticLimit: MAX_STATIC_ROUTE_COUNT
33782
33848
  });
33783
- const generatedAssetsRoot = join53(buildDir, ".absolutejs");
33849
+ const generatedAssetsRoot = join54(buildDir, ".absolutejs");
33784
33850
  const generatedAssetsPlugin = new Elysia9({
33785
33851
  name: "absolutejs-generated-assets"
33786
33852
  }).get("/.absolutejs/*", async ({ params, set }) => {
@@ -33818,7 +33884,7 @@ var prepare = async (configOrPath) => {
33818
33884
  responseValue.headers.set("cache-control", isFingerprintedAsset(pathname) ? "public, max-age=31536000, immutable" : "public, max-age=0, must-revalidate");
33819
33885
  });
33820
33886
  stepStartedAt = performance.now();
33821
- const prerenderDir = join53(buildDir, "_prerendered");
33887
+ const prerenderDir = join54(buildDir, "_prerendered");
33822
33888
  const prerenderMap = loadPrerenderMap(prerenderDir);
33823
33889
  const mobileCompatibilityPlugin = await loadMobileCompatibilityPlugin(buildDir);
33824
33890
  const mobileAssociationPlugin = createAbsoluteMobileAssociationPlugin(config.mobile, process.cwd(), { requireAll: true });
@@ -33891,10 +33957,10 @@ import {
33891
33957
  readFileSync as readFileSync36,
33892
33958
  rmSync as rmSync4
33893
33959
  } from "fs";
33894
- import { join as join54 } from "path";
33895
- var CERT_DIR = join54(process.cwd(), ".absolutejs");
33896
- var CERT_PATH = join54(CERT_DIR, "cert.pem");
33897
- var KEY_PATH = join54(CERT_DIR, "key.pem");
33960
+ import { join as join55 } from "path";
33961
+ var CERT_DIR = join55(process.cwd(), ".absolutejs");
33962
+ var CERT_PATH = join55(CERT_DIR, "cert.pem");
33963
+ var KEY_PATH = join55(CERT_DIR, "key.pem");
33898
33964
  var CERT_VALIDITY_DAYS = 365;
33899
33965
  var devLog = (msg) => console.log(`\x1B[2m${new Date().toLocaleTimeString()}\x1B[0m \x1B[36m[dev]\x1B[0m ${msg}`);
33900
33966
  var devWarn = (msg) => console.log(`\x1B[2m${new Date().toLocaleTimeString()}\x1B[0m \x1B[33m[dev]\x1B[0m \x1B[33m${msg}\x1B[0m`);
@@ -34014,12 +34080,12 @@ import {
34014
34080
  writeFileSync as writeFileSync11
34015
34081
  } from "fs";
34016
34082
  import { homedir as homedir2 } from "os";
34017
- import { basename as basename19, join as join55 } from "path";
34083
+ import { basename as basename19, join as join56 } from "path";
34018
34084
  var registeredPids = new Set;
34019
34085
  var exitHandlerRegistered = false;
34020
- var instanceFilePath = (pid) => join55(instanceRegistryDir(), `${pid}.json`);
34021
- var instanceLogPath = (pid) => join55(instanceRegistryDir(), `${pid}.log`);
34022
- var instanceRegistryDir = () => join55(homedir2(), ".absolutejs", "instances");
34086
+ var instanceFilePath = (pid) => join56(instanceRegistryDir(), `${pid}.json`);
34087
+ var instanceLogPath = (pid) => join56(instanceRegistryDir(), `${pid}.log`);
34088
+ var instanceRegistryDir = () => join56(homedir2(), ".absolutejs", "instances");
34023
34089
  var removeInstanceFilesSync = (pid) => {
34024
34090
  try {
34025
34091
  unlinkSync2(instanceFilePath(pid));
@@ -34054,7 +34120,7 @@ var registerInstance = (record) => {
34054
34120
  return record;
34055
34121
  };
34056
34122
  var resolveProjectName = (cwd2) => {
34057
- const parsed = readJsonFile(join55(cwd2, "package.json"));
34123
+ const parsed = readJsonFile(join56(cwd2, "package.json"));
34058
34124
  if (parsed !== null && typeof parsed === "object" && typeof parsed.name === "string" && parsed.name.trim().length > 0) {
34059
34125
  return parsed.name;
34060
34126
  }
@@ -40712,5 +40778,5 @@ export {
40712
40778
  ANGULAR_INIT_TIMEOUT_MS
40713
40779
  };
40714
40780
 
40715
- //# debugId=BDFEC8444CD05EBE64756E2164756E21
40781
+ //# debugId=AA3EE02769A805B764756E2164756E21
40716
40782
  //# sourceMappingURL=index.js.map