@absolutejs/absolute 0.20.0-beta.43 → 0.20.0-beta.44

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.
Files changed (75) hide show
  1. package/dist/angular/browser.js +378 -361
  2. package/dist/angular/browser.js.map +2 -2
  3. package/dist/angular/components/core/streamingSlotRegistrar.js +7 -7
  4. package/dist/angular/components/core/streamingSlotRegistry.js +4 -4
  5. package/dist/angular/index.js +300 -294
  6. package/dist/angular/index.js.map +2 -2
  7. package/dist/angular/server.js +54 -50
  8. package/dist/angular/server.js.map +2 -2
  9. package/dist/build.js +199 -203
  10. package/dist/build.js.map +2 -2
  11. package/dist/cli/config/client.js +12 -12
  12. package/dist/cli/config/server.js +1096 -1090
  13. package/dist/cli/index.js +275 -161
  14. package/dist/client/index.js +29 -25
  15. package/dist/client/index.js.map +2 -2
  16. package/dist/core/streamingSlotRegistrar.js +15 -13
  17. package/dist/core/streamingSlotRegistrar.js.map +2 -2
  18. package/dist/core/streamingSlotRegistry.js +11 -9
  19. package/dist/core/streamingSlotRegistry.js.map +2 -2
  20. package/dist/image-client/imageClient.js +7 -7
  21. package/dist/index.js +782 -732
  22. package/dist/index.js.map +6 -5
  23. package/dist/islands/browser.js +11 -9
  24. package/dist/islands/browser.js.map +2 -2
  25. package/dist/islands/index.js +39 -35
  26. package/dist/islands/index.js.map +2 -2
  27. package/dist/mobile/browser.js +23 -22
  28. package/dist/mobile/browser.js.map +2 -2
  29. package/dist/mobile/index.js +552 -423
  30. package/dist/mobile/index.js.map +9 -9
  31. package/dist/mobile/remoteMacAgentEntry.js +115 -37
  32. package/dist/mobile/shellBootstrap.js +0 -1
  33. package/dist/mobile/shellExpoAuth.js +184 -0
  34. package/dist/mobile/shellExpoDevices.js +4 -5
  35. package/dist/mobile/shellSync.js +4 -4
  36. package/dist/react/browser.js +17 -15
  37. package/dist/react/browser.js.map +2 -2
  38. package/dist/react/components/browser/index.js +107 -107
  39. package/dist/react/components/index.js +118 -116
  40. package/dist/react/components/index.js.map +2 -2
  41. package/dist/react/hooks/index.js +11 -9
  42. package/dist/react/hooks/index.js.map +2 -2
  43. package/dist/react/index.js +53 -49
  44. package/dist/react/index.js.map +2 -2
  45. package/dist/react/jsxDevRuntimeCompat.js +11 -9
  46. package/dist/react/jsxDevRuntimeCompat.js.map +2 -2
  47. package/dist/react/jsxRuntimeCompat.js +11 -9
  48. package/dist/react/jsxRuntimeCompat.js.map +2 -2
  49. package/dist/react/router/browser.js +9 -7
  50. package/dist/react/router/browser.js.map +2 -2
  51. package/dist/react/router/index.js +9 -7
  52. package/dist/react/router/index.js.map +2 -2
  53. package/dist/react/server.js +12 -10
  54. package/dist/react/server.js.map +2 -2
  55. package/dist/src/mobile/devDeviceAdapter.d.ts +1 -1
  56. package/dist/src/mobile/expoBridge.d.ts +12 -12
  57. package/dist/src/mobile/nativeAuth.d.ts +3 -0
  58. package/dist/src/mobile/shellExpoAuth.d.ts +12 -0
  59. package/dist/svelte/browser.js +12 -10
  60. package/dist/svelte/browser.js.map +2 -2
  61. package/dist/svelte/index.js +47 -43
  62. package/dist/svelte/index.js.map +2 -2
  63. package/dist/svelte/server.js +29 -27
  64. package/dist/svelte/server.js.map +2 -2
  65. package/dist/vue/browser.js +14 -12
  66. package/dist/vue/browser.js.map +2 -2
  67. package/dist/vue/components/Image.js +9 -7
  68. package/dist/vue/components/Image.js.map +2 -2
  69. package/dist/vue/components/index.js +11 -9
  70. package/dist/vue/components/index.js.map +2 -2
  71. package/dist/vue/index.js +52 -48
  72. package/dist/vue/index.js.map +2 -2
  73. package/dist/vue/server.js +14 -12
  74. package/dist/vue/server.js.map +2 -2
  75. package/package.json +1 -1
@@ -19,12 +19,14 @@ var __toESM = (mod, isNodeMode, target) => {
19
19
  }
20
20
  target = mod != null ? __create(__getProtoOf(mod)) : {};
21
21
  const to = isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target;
22
- for (let key of __getOwnPropNames(mod))
23
- if (!__hasOwnProp.call(to, key))
24
- __defProp(to, key, {
25
- get: __accessProp.bind(mod, key),
26
- enumerable: true
27
- });
22
+ if (mod && typeof mod === "object" || typeof mod === "function") {
23
+ for (let key of __getOwnPropNames(mod))
24
+ if (!__hasOwnProp.call(to, key))
25
+ __defProp(to, key, {
26
+ get: __accessProp.bind(mod, key),
27
+ enumerable: true
28
+ });
29
+ }
28
30
  if (canCache)
29
31
  cache.set(mod, to);
30
32
  return to;
@@ -163,6 +165,137 @@ var init_startupBanner = __esm(() => {
163
165
  ];
164
166
  });
165
167
 
168
+ // src/mobile/config.ts
169
+ import { resolve as resolve6 } from "path";
170
+ var APP_ID_PATTERN, SCHEME_PATTERN, APPLE_APP_ID_PREFIX_PATTERN, CERTIFICATE_FINGERPRINT_PATTERN, HOSTNAME_PATTERN, resolveProjectPath = (projectRoot, value, field2) => {
171
+ const root = resolve6(projectRoot);
172
+ const path = resolve6(root, value);
173
+ if (path !== root && !path.startsWith(`${root}/`)) {
174
+ throw new TypeError(`${field2} must remain inside the project root.`);
175
+ }
176
+ return path;
177
+ }, requireText = (value, field2) => {
178
+ const normalized = value.trim();
179
+ if (!normalized)
180
+ throw new TypeError(`${field2} must not be empty.`);
181
+ return normalized;
182
+ }, normalizeEntry = (entry) => {
183
+ const normalized = requireText(entry ?? "/", "mobile.entry");
184
+ if (!normalized.startsWith("/") || normalized.startsWith("//")) {
185
+ throw new TypeError("mobile.entry must be an absolute application path.");
186
+ }
187
+ return normalized;
188
+ }, normalizeProductionOrigin = (value) => {
189
+ const parsed = new URL(requireText(value, "mobile.server.productionOrigin"));
190
+ const isLoopbackHttp = parsed.protocol === "http:" && (parsed.hostname === "localhost" || parsed.hostname === "127.0.0.1" || parsed.hostname === "[::1]");
191
+ if (parsed.protocol !== "https:" && !isLoopbackHttp) {
192
+ throw new TypeError("mobile.server.productionOrigin must use HTTPS, except for a loopback development origin.");
193
+ }
194
+ if (parsed.username || parsed.password || parsed.pathname !== "/" || parsed.search || parsed.hash) {
195
+ throw new TypeError("mobile.server.productionOrigin must be an origin without credentials, path, query, or hash.");
196
+ }
197
+ return parsed.origin;
198
+ }, normalizePlatforms = (platforms) => {
199
+ const normalized = [
200
+ ...new Set(platforms ?? ["ios", "android"])
201
+ ];
202
+ if (normalized.length === 0) {
203
+ throw new TypeError("mobile.platforms must contain at least one platform.");
204
+ }
205
+ return normalized;
206
+ }, normalizeHosts = (hosts, productionOrigin) => {
207
+ const normalizeHostname = (host) => {
208
+ const value = requireText(host, "mobile.deepLinks.hosts").toLowerCase();
209
+ if (!HOSTNAME_PATTERN.test(value)) {
210
+ throw new TypeError("mobile.deepLinks.hosts entries must be valid hostnames without ports, wildcards, or paths.");
211
+ }
212
+ return value;
213
+ };
214
+ const productionHostname = new URL(productionOrigin).hostname;
215
+ const normalized = new Set(productionHostname === "[::1]" ? [] : [normalizeHostname(productionHostname)]);
216
+ for (const host of hosts ?? []) {
217
+ normalized.add(normalizeHostname(host));
218
+ }
219
+ return [...normalized].sort();
220
+ }, normalizeAppleAppIdPrefix = (value) => {
221
+ if (value === undefined)
222
+ return;
223
+ const normalized = requireText(value, "mobile.deepLinks.apple.appIdPrefix").toUpperCase();
224
+ if (!APPLE_APP_ID_PREFIX_PATTERN.test(normalized)) {
225
+ throw new TypeError("mobile.deepLinks.apple.appIdPrefix must contain ten letters or digits.");
226
+ }
227
+ return normalized;
228
+ }, normalizeIosVersion = (value) => {
229
+ if (value === undefined)
230
+ return;
231
+ const normalized = requireText(value, "mobile.ios.version");
232
+ if (!/^\d+(?:\.\d+){0,2}$/u.test(normalized)) {
233
+ throw new TypeError("mobile.ios.version must contain one to three dot-separated integer components, for example 1.4.0.");
234
+ }
235
+ return normalized;
236
+ }, normalizeCertificateFingerprints = (values) => [
237
+ ...new Set((values ?? []).map((value) => requireText(value, "mobile.deepLinks.android.sha256CertificateFingerprints").replaceAll(":", "").toUpperCase()).map((value) => {
238
+ if (!CERTIFICATE_FINGERPRINT_PATTERN.test(value)) {
239
+ throw new TypeError("mobile.deepLinks.android.sha256CertificateFingerprints entries must be SHA-256 certificate fingerprints.");
240
+ }
241
+ return value.match(/.{2}/g)?.join(":") ?? value;
242
+ }))
243
+ ].sort(), normalizeExpoNativeRoutes = (config, projectRoot) => {
244
+ if (config.engine !== "expo")
245
+ return {};
246
+ const routes = config.routes?.native ?? {};
247
+ const normalized = {};
248
+ for (const [route, module] of Object.entries(routes)) {
249
+ const path = normalizeEntry(route);
250
+ if (path.includes("?") || path.includes("#") || path !== "/" && path.endsWith("/")) {
251
+ throw new TypeError(`mobile.routes.native route ${path} must be a canonical path without a query, fragment, or trailing slash.`);
252
+ }
253
+ if (path === "/__absolute/native") {
254
+ throw new TypeError("mobile.routes.native reserves /__absolute/native for the Expo diagnostic screen.");
255
+ }
256
+ if (path.includes("*") || path.includes(":")) {
257
+ throw new TypeError(`mobile.routes.native route ${path} must be static during the Expo experiment; parameters and wildcards are not supported yet.`);
258
+ }
259
+ normalized[path] = resolveProjectPath(projectRoot, requireText(module, `mobile.routes.native[${path}]`), `mobile.routes.native[${path}]`);
260
+ }
261
+ return Object.fromEntries(Object.entries(normalized).sort(([left], [right]) => left.localeCompare(right)));
262
+ }, normalizeAbsoluteMobileConfig = (config, projectRoot) => {
263
+ const appId = requireText(config.appId, "mobile.appId");
264
+ if (!APP_ID_PATTERN.test(appId)) {
265
+ throw new TypeError("mobile.appId must use reverse-domain notation, for example com.example.app.");
266
+ }
267
+ const productionOrigin = normalizeProductionOrigin(config.server.productionOrigin);
268
+ const deepLinkScheme = (config.deepLinks?.scheme ?? appId).trim().toLowerCase();
269
+ if (deepLinkScheme && !SCHEME_PATTERN.test(deepLinkScheme)) {
270
+ throw new TypeError("mobile.deepLinks.scheme is not a valid URL scheme.");
271
+ }
272
+ return {
273
+ androidCertificateFingerprints: normalizeCertificateFingerprints(config.deepLinks?.android?.sha256CertificateFingerprints),
274
+ appId,
275
+ appleAppIdPrefix: normalizeAppleAppIdPrefix(config.deepLinks?.apple?.appIdPrefix),
276
+ appName: requireText(config.appName, "mobile.appName"),
277
+ bundleDirectory: resolveProjectPath(projectRoot, config.bundleDirectory ?? ".absolutejs/mobile/web", "mobile.bundleDirectory"),
278
+ deepLinkHosts: normalizeHosts(config.deepLinks?.hosts, productionOrigin),
279
+ deepLinkScheme,
280
+ engine: config.engine ?? "capacitor",
281
+ entry: normalizeEntry(config.entry),
282
+ expoNativeRoutes: normalizeExpoNativeRoutes(config, projectRoot),
283
+ ...config.engine === "expo" ? { expoSdkVersion: config.expo?.sdkVersion ?? 57 } : {},
284
+ iosVersion: normalizeIosVersion(config.ios?.version),
285
+ nativeProjectDirectory: resolveProjectPath(projectRoot, config.nativeProject?.directory ?? (config.engine === "expo" ? ".absolutejs/mobile/expo" : "mobile"), "mobile.nativeProject.directory"),
286
+ platforms: normalizePlatforms(config.platforms),
287
+ productionOrigin,
288
+ pushAndroidGoogleServicesFile: resolveProjectPath(projectRoot, config.pushNotifications?.android?.googleServicesFile ?? "google-services.json", "mobile.pushNotifications.android.googleServicesFile")
289
+ };
290
+ };
291
+ var init_config = __esm(() => {
292
+ APP_ID_PATTERN = /^[A-Za-z][\w]*(?:\.[A-Za-z][\w]*)+$/;
293
+ SCHEME_PATTERN = /^[a-z][a-z0-9+.-]*$/;
294
+ APPLE_APP_ID_PREFIX_PATTERN = /^[A-Z0-9]{10}$/;
295
+ CERTIFICATE_FINGERPRINT_PATTERN = /^[0-9A-F]{64}$/;
296
+ 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])?))*$/;
297
+ });
298
+
166
299
  // src/utils/stringModifiers.ts
167
300
  var normalizeSlug = (str) => str.trim().replace(/\s+/g, "-").replace(/[^A-Za-z0-9\-_]+/g, "").replace(/[-_]{2,}/g, "-"), toKebab = (str) => normalizeSlug(str).replace(/([a-z0-9])([A-Z])/g, "$1-$2").toLowerCase(), toPascal = (str) => {
168
301
  if (!str.includes("-") && !str.includes("_")) {
@@ -171,6 +304,50 @@ var normalizeSlug = (str) => str.trim().replace(/\s+/g, "-").replace(/[^A-Za-z0-
171
304
  return normalizeSlug(str).split(/[-_]/).filter(Boolean).map((segment) => segment.charAt(0).toUpperCase() + segment.slice(1).toLowerCase()).join("");
172
305
  };
173
306
 
307
+ // src/mobile/nativeAuth.ts
308
+ import { readFileSync as readFileSync2 } from "fs";
309
+ import { join as join11 } from "path";
310
+ var ABSOLUTE_AUTH_PACKAGE = "@absolutejs/auth", ABSOLUTE_EXPO_AUTH_CORE_VERSION = "0.75.6", ABSOLUTE_EXPO_AUTH_PACKAGE = "@absolutejs/auth-expo", ABSOLUTE_EXPO_AUTH_VERSION = "0.0.2", ABSOLUTE_NATIVE_AUTH_CLIENTS_ENV = "ABSOLUTE_AUTH_NATIVE_CLIENTS", ABSOLUTE_NATIVE_AUTH_SCOPES, ABSOLUTE_SYNC_PACKAGE = "@absolutejs/sync", readPackageManifest = (projectRoot) => {
311
+ try {
312
+ return JSON.parse(readFileSync2(join11(projectRoot, "package.json"), "utf8"));
313
+ } catch {
314
+ return;
315
+ }
316
+ }, packageManifestHas = (manifest, packageName) => {
317
+ if (typeof manifest !== "object" || manifest === null)
318
+ return false;
319
+ return [
320
+ Reflect.get(manifest, "dependencies"),
321
+ Reflect.get(manifest, "devDependencies"),
322
+ Reflect.get(manifest, "optionalDependencies"),
323
+ Reflect.get(manifest, "peerDependencies")
324
+ ].some((dependencies) => typeof dependencies === "object" && dependencies !== null && Object.hasOwn(dependencies, packageName));
325
+ }, createAbsoluteMobileAuthManifest = (config) => {
326
+ const scheme = config.deepLinkScheme ?? config.appId.toLowerCase();
327
+ return {
328
+ clientId: `absolutejs-native:${config.appId}`,
329
+ issuer: config.productionOrigin,
330
+ redirectUri: `${scheme}://auth/callback`,
331
+ scopes: [...ABSOLUTE_NATIVE_AUTH_SCOPES]
332
+ };
333
+ }, installAbsoluteMobileAuthEnvironment = (projectRoot, config) => {
334
+ const auth = resolveAbsoluteMobileAuthManifest(projectRoot, config);
335
+ const serialized = serializeAbsoluteMobileAuthEnvironment(config, auth);
336
+ if (serialized === undefined)
337
+ delete process.env[ABSOLUTE_NATIVE_AUTH_CLIENTS_ENV];
338
+ else
339
+ process.env[ABSOLUTE_NATIVE_AUTH_CLIENTS_ENV] = serialized;
340
+ return auth;
341
+ }, projectUsesAbsoluteAuth = (projectRoot) => packageManifestHas(readPackageManifest(projectRoot), ABSOLUTE_AUTH_PACKAGE), projectUsesAbsoluteSync = (projectRoot) => packageManifestHas(readPackageManifest(projectRoot), ABSOLUTE_SYNC_PACKAGE), resolveAbsoluteMobileAuthManifest = (projectRoot, config) => projectUsesAbsoluteAuth(projectRoot) ? createAbsoluteMobileAuthManifest(config) : undefined, serializeAbsoluteMobileAuthEnvironment = (config, auth) => auth === undefined ? undefined : JSON.stringify([
342
+ {
343
+ ...auth,
344
+ name: `${config.appName} native app`
345
+ }
346
+ ]);
347
+ var init_nativeAuth = __esm(() => {
348
+ ABSOLUTE_NATIVE_AUTH_SCOPES = ["openid", "profile"];
349
+ });
350
+
174
351
  // node_modules/@absolutejs/sync/dist/client/index.js
175
352
  var RUNTIME_TRANSPORT, host, isRegistry = (value) => typeof value === "object" && value !== null && Array.isArray(Reflect.get(value, "installations")) && Array.isArray(Reflect.get(value, "clients")), registry, SyncLocalDataPolicyError, SyncLocalStoreSchemaError, positiveVersion = (value, label) => {
176
353
  if (!Number.isSafeInteger(value) || value < 1)
@@ -4532,6 +4709,7 @@ var testAbsoluteIosPhysicalDevice = async (options) => {
4532
4709
  };
4533
4710
  };
4534
4711
  // src/mobile/associationFiles.ts
4712
+ init_config();
4535
4713
  import {
4536
4714
  access as access7,
4537
4715
  mkdir as mkdir7,
@@ -4542,196 +4720,55 @@ import {
4542
4720
  } from "fs/promises";
4543
4721
  import { resolve as resolve7 } from "path";
4544
4722
  import { Elysia } from "elysia";
4545
-
4546
- // src/mobile/config.ts
4547
- import { resolve as resolve6 } from "path";
4548
- var APP_ID_PATTERN = /^[A-Za-z][\w]*(?:\.[A-Za-z][\w]*)+$/;
4549
- var SCHEME_PATTERN = /^[a-z][a-z0-9+.-]*$/;
4550
- var APPLE_APP_ID_PREFIX_PATTERN = /^[A-Z0-9]{10}$/;
4551
- var CERTIFICATE_FINGERPRINT_PATTERN = /^[0-9A-F]{64}$/;
4552
- var 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])?))*$/;
4553
- var resolveProjectPath = (projectRoot, value, field2) => {
4554
- const root = resolve6(projectRoot);
4555
- const path = resolve6(root, value);
4556
- if (path !== root && !path.startsWith(`${root}/`)) {
4557
- throw new TypeError(`${field2} must remain inside the project root.`);
4558
- }
4559
- return path;
4560
- };
4561
- var requireText = (value, field2) => {
4562
- const normalized = value.trim();
4563
- if (!normalized)
4564
- throw new TypeError(`${field2} must not be empty.`);
4565
- return normalized;
4566
- };
4567
- var normalizeEntry = (entry) => {
4568
- const normalized = requireText(entry ?? "/", "mobile.entry");
4569
- if (!normalized.startsWith("/") || normalized.startsWith("//")) {
4570
- throw new TypeError("mobile.entry must be an absolute application path.");
4571
- }
4572
- return normalized;
4573
- };
4574
- var normalizeProductionOrigin = (value) => {
4575
- const parsed = new URL(requireText(value, "mobile.server.productionOrigin"));
4576
- const isLoopbackHttp = parsed.protocol === "http:" && (parsed.hostname === "localhost" || parsed.hostname === "127.0.0.1" || parsed.hostname === "[::1]");
4577
- if (parsed.protocol !== "https:" && !isLoopbackHttp) {
4578
- throw new TypeError("mobile.server.productionOrigin must use HTTPS, except for a loopback development origin.");
4579
- }
4580
- if (parsed.username || parsed.password || parsed.pathname !== "/" || parsed.search || parsed.hash) {
4581
- throw new TypeError("mobile.server.productionOrigin must be an origin without credentials, path, query, or hash.");
4582
- }
4583
- return parsed.origin;
4723
+ var JSON_HEADERS = {
4724
+ "cache-control": "public, max-age=300, must-revalidate",
4725
+ "content-type": "application/json; charset=utf-8"
4584
4726
  };
4585
- var normalizePlatforms = (platforms) => {
4586
- const normalized = [
4587
- ...new Set(platforms ?? ["ios", "android"])
4588
- ];
4589
- if (normalized.length === 0) {
4590
- throw new TypeError("mobile.platforms must contain at least one platform.");
4727
+ var OWNERSHIP_FILE = ".absolutejs-mobile-associations.json";
4728
+ var HTTP_OK = 200;
4729
+ var VERIFY_TIMEOUT_MS = 1e4;
4730
+ var ANDROID_ASSOCIATION_PATH = "/.well-known/assetlinks.json";
4731
+ var APPLE_ASSOCIATION_PATH = "/.well-known/apple-app-site-association";
4732
+ var missingIdentity = (field2, platform) => new TypeError(`${field2} is required to publish ${platform} deep-link association files.`);
4733
+ var createAppleDocument = (config, requireAll) => {
4734
+ if (!config.platforms.includes("ios"))
4735
+ return;
4736
+ if (!config.appleAppIdPrefix && requireAll) {
4737
+ throw missingIdentity("mobile.deepLinks.apple.appIdPrefix", "iOS");
4591
4738
  }
4592
- return normalized;
4593
- };
4594
- var normalizeHosts = (hosts, productionOrigin) => {
4595
- const normalizeHostname = (host) => {
4596
- const value = requireText(host, "mobile.deepLinks.hosts").toLowerCase();
4597
- if (!HOSTNAME_PATTERN.test(value)) {
4598
- throw new TypeError("mobile.deepLinks.hosts entries must be valid hostnames without ports, wildcards, or paths.");
4739
+ if (!config.appleAppIdPrefix)
4740
+ return;
4741
+ return {
4742
+ applinks: {
4743
+ details: [
4744
+ {
4745
+ appIDs: [
4746
+ `${config.appleAppIdPrefix}.${config.appId}`
4747
+ ],
4748
+ components: [{ "/": "/*" }]
4749
+ }
4750
+ ]
4599
4751
  }
4600
- return value;
4601
4752
  };
4602
- const productionHostname = new URL(productionOrigin).hostname;
4603
- const normalized = new Set(productionHostname === "[::1]" ? [] : [normalizeHostname(productionHostname)]);
4604
- for (const host of hosts ?? []) {
4605
- normalized.add(normalizeHostname(host));
4606
- }
4607
- return [...normalized].sort();
4608
4753
  };
4609
- var normalizeAppleAppIdPrefix = (value) => {
4610
- if (value === undefined)
4754
+ var createAndroidDocument = (config, requireAll) => {
4755
+ if (!config.platforms.includes("android"))
4611
4756
  return;
4612
- const normalized = requireText(value, "mobile.deepLinks.apple.appIdPrefix").toUpperCase();
4613
- if (!APPLE_APP_ID_PREFIX_PATTERN.test(normalized)) {
4614
- throw new TypeError("mobile.deepLinks.apple.appIdPrefix must contain ten letters or digits.");
4757
+ if (config.androidCertificateFingerprints.length === 0 && requireAll) {
4758
+ throw missingIdentity("mobile.deepLinks.android.sha256CertificateFingerprints", "Android");
4615
4759
  }
4616
- return normalized;
4617
- };
4618
- var normalizeIosVersion = (value) => {
4619
- if (value === undefined)
4760
+ if (config.androidCertificateFingerprints.length === 0)
4620
4761
  return;
4621
- const normalized = requireText(value, "mobile.ios.version");
4622
- if (!/^\d+(?:\.\d+){0,2}$/u.test(normalized)) {
4623
- throw new TypeError("mobile.ios.version must contain one to three dot-separated integer components, for example 1.4.0.");
4624
- }
4625
- return normalized;
4626
- };
4627
- var normalizeCertificateFingerprints = (values) => [
4628
- ...new Set((values ?? []).map((value) => requireText(value, "mobile.deepLinks.android.sha256CertificateFingerprints").replaceAll(":", "").toUpperCase()).map((value) => {
4629
- if (!CERTIFICATE_FINGERPRINT_PATTERN.test(value)) {
4630
- throw new TypeError("mobile.deepLinks.android.sha256CertificateFingerprints entries must be SHA-256 certificate fingerprints.");
4631
- }
4632
- return value.match(/.{2}/g)?.join(":") ?? value;
4633
- }))
4634
- ].sort();
4635
- var normalizeExpoNativeRoutes = (config, projectRoot) => {
4636
- if (config.engine !== "expo")
4637
- return {};
4638
- const routes = config.routes?.native ?? {};
4639
- const normalized = {};
4640
- for (const [route, module] of Object.entries(routes)) {
4641
- const path = normalizeEntry(route);
4642
- if (path.includes("?") || path.includes("#") || path !== "/" && path.endsWith("/")) {
4643
- throw new TypeError(`mobile.routes.native route ${path} must be a canonical path without a query, fragment, or trailing slash.`);
4644
- }
4645
- if (path === "/__absolute/native") {
4646
- throw new TypeError("mobile.routes.native reserves /__absolute/native for the Expo diagnostic screen.");
4647
- }
4648
- if (path.includes("*") || path.includes(":")) {
4649
- throw new TypeError(`mobile.routes.native route ${path} must be static during the Expo experiment; parameters and wildcards are not supported yet.`);
4650
- }
4651
- normalized[path] = resolveProjectPath(projectRoot, requireText(module, `mobile.routes.native[${path}]`), `mobile.routes.native[${path}]`);
4652
- }
4653
- return Object.fromEntries(Object.entries(normalized).sort(([left], [right]) => left.localeCompare(right)));
4654
- };
4655
- var normalizeAbsoluteMobileConfig = (config, projectRoot) => {
4656
- const appId = requireText(config.appId, "mobile.appId");
4657
- if (!APP_ID_PATTERN.test(appId)) {
4658
- throw new TypeError("mobile.appId must use reverse-domain notation, for example com.example.app.");
4659
- }
4660
- const productionOrigin = normalizeProductionOrigin(config.server.productionOrigin);
4661
- const deepLinkScheme = (config.deepLinks?.scheme ?? appId).trim().toLowerCase();
4662
- if (deepLinkScheme && !SCHEME_PATTERN.test(deepLinkScheme)) {
4663
- throw new TypeError("mobile.deepLinks.scheme is not a valid URL scheme.");
4664
- }
4665
- return {
4666
- androidCertificateFingerprints: normalizeCertificateFingerprints(config.deepLinks?.android?.sha256CertificateFingerprints),
4667
- appId,
4668
- appleAppIdPrefix: normalizeAppleAppIdPrefix(config.deepLinks?.apple?.appIdPrefix),
4669
- appName: requireText(config.appName, "mobile.appName"),
4670
- bundleDirectory: resolveProjectPath(projectRoot, config.bundleDirectory ?? ".absolutejs/mobile/web", "mobile.bundleDirectory"),
4671
- deepLinkHosts: normalizeHosts(config.deepLinks?.hosts, productionOrigin),
4672
- deepLinkScheme,
4673
- engine: config.engine ?? "capacitor",
4674
- entry: normalizeEntry(config.entry),
4675
- expoNativeRoutes: normalizeExpoNativeRoutes(config, projectRoot),
4676
- ...config.engine === "expo" ? { expoSdkVersion: config.expo?.sdkVersion ?? 57 } : {},
4677
- iosVersion: normalizeIosVersion(config.ios?.version),
4678
- nativeProjectDirectory: resolveProjectPath(projectRoot, config.nativeProject?.directory ?? (config.engine === "expo" ? ".absolutejs/mobile/expo" : "mobile"), "mobile.nativeProject.directory"),
4679
- platforms: normalizePlatforms(config.platforms),
4680
- productionOrigin,
4681
- pushAndroidGoogleServicesFile: resolveProjectPath(projectRoot, config.pushNotifications?.android?.googleServicesFile ?? "google-services.json", "mobile.pushNotifications.android.googleServicesFile")
4682
- };
4683
- };
4684
-
4685
- // src/mobile/associationFiles.ts
4686
- var JSON_HEADERS = {
4687
- "cache-control": "public, max-age=300, must-revalidate",
4688
- "content-type": "application/json; charset=utf-8"
4689
- };
4690
- var OWNERSHIP_FILE = ".absolutejs-mobile-associations.json";
4691
- var HTTP_OK = 200;
4692
- var VERIFY_TIMEOUT_MS = 1e4;
4693
- var ANDROID_ASSOCIATION_PATH = "/.well-known/assetlinks.json";
4694
- var APPLE_ASSOCIATION_PATH = "/.well-known/apple-app-site-association";
4695
- var missingIdentity = (field2, platform) => new TypeError(`${field2} is required to publish ${platform} deep-link association files.`);
4696
- var createAppleDocument = (config, requireAll) => {
4697
- if (!config.platforms.includes("ios"))
4698
- return;
4699
- if (!config.appleAppIdPrefix && requireAll) {
4700
- throw missingIdentity("mobile.deepLinks.apple.appIdPrefix", "iOS");
4701
- }
4702
- if (!config.appleAppIdPrefix)
4703
- return;
4704
- return {
4705
- applinks: {
4706
- details: [
4707
- {
4708
- appIDs: [
4709
- `${config.appleAppIdPrefix}.${config.appId}`
4710
- ],
4711
- components: [{ "/": "/*" }]
4712
- }
4713
- ]
4714
- }
4715
- };
4716
- };
4717
- var createAndroidDocument = (config, requireAll) => {
4718
- if (!config.platforms.includes("android"))
4719
- return;
4720
- if (config.androidCertificateFingerprints.length === 0 && requireAll) {
4721
- throw missingIdentity("mobile.deepLinks.android.sha256CertificateFingerprints", "Android");
4722
- }
4723
- if (config.androidCertificateFingerprints.length === 0)
4724
- return;
4725
- return [
4726
- {
4727
- relation: ["delegate_permission/common.handle_all_urls"],
4728
- target: {
4729
- namespace: "android_app",
4730
- package_name: config.appId,
4731
- sha256_cert_fingerprints: config.androidCertificateFingerprints
4732
- }
4733
- }
4734
- ];
4762
+ return [
4763
+ {
4764
+ relation: ["delegate_permission/common.handle_all_urls"],
4765
+ target: {
4766
+ namespace: "android_app",
4767
+ package_name: config.appId,
4768
+ sha256_cert_fingerprints: config.androidCertificateFingerprints
4769
+ }
4770
+ }
4771
+ ];
4735
4772
  };
4736
4773
  var createAbsoluteMobileAssociationDocuments = (config, options = {}) => {
4737
4774
  const documents = {};
@@ -5356,7 +5393,6 @@ var finalizeAbsoluteMobilePage = (input) => {
5356
5393
 
5357
5394
  // src/mobile/client.ts
5358
5395
  class AbsoluteMobilePageProtocolError extends Error {
5359
- code;
5360
5396
  constructor(code, message) {
5361
5397
  super(message);
5362
5398
  this.name = "AbsoluteMobilePageProtocolError";
@@ -5567,6 +5603,12 @@ var shellAuthModule = () => {
5567
5603
  return candidate;
5568
5604
  throw new TypeError("AbsoluteJS mobile auth shell module is missing.");
5569
5605
  };
5606
+ var shellExpoAuthModule = () => {
5607
+ const candidate = ["js", "ts"].map((extension) => join9(import.meta.dir, `shellExpoAuth.${extension}`)).find(existsSync2);
5608
+ if (candidate)
5609
+ return candidate;
5610
+ throw new TypeError("AbsoluteJS Expo auth bridge module is missing.");
5611
+ };
5570
5612
  var shellSyncModule = () => {
5571
5613
  const candidate = ["js", "ts"].map((extension) => join9(import.meta.dir, `shellSync.${extension}`)).find(existsSync2);
5572
5614
  if (candidate)
@@ -5649,9 +5691,10 @@ var buildShellBootstrap = async (staging, auth, sync, storagePrefix, engine, dev
5649
5691
  const capacitor = engine !== "expo";
5650
5692
  const shellCapabilities = capacitor ? deviceCapabilities.capabilities : [];
5651
5693
  const modulePath = shellBootstrapModule();
5652
- const authImport = auth ? `import { createAbsoluteMobileShellAuth } from ${JSON.stringify(shellAuthModule())};
5694
+ const authFactory = capacitor ? "createAbsoluteMobileShellAuth" : "createAbsoluteExpoShellAuth";
5695
+ const authImport = auth ? `import { ${authFactory} } from ${JSON.stringify(capacitor ? shellAuthModule() : shellExpoAuthModule())};
5653
5696
  ` : "";
5654
- const options = auth ? `{ createAuth: createAbsoluteMobileShellAuth${sync ? ", installSync: installAbsoluteMobileShellSync" : ""} }` : "";
5697
+ const options = auth ? `{ createAuth: ${authFactory}${sync ? ", installSync: installAbsoluteMobileShellSync" : ""} }` : "";
5655
5698
  const syncImport = sync ? `import { installAbsoluteMobileShellSync } from ${JSON.stringify(shellSyncModule())};
5656
5699
  ` : "";
5657
5700
  const pushIndex = shellCapabilities.indexOf("pushNotifications");
@@ -5673,7 +5716,7 @@ const absoluteMobilePushCapability = absoluteDeviceCapability${pushIndex}(absolu
5673
5716
  const baseAdapterModule = capacitor ? await resolveProjectImport(projectRoot, "@absolutejs/devices-capacitor") : shellExpoDevicesModule();
5674
5717
  const adapterImport = capacitor ? `import { installCapacitorDeviceAdapterIfNative } from ${JSON.stringify(baseAdapterModule)};` : `import { createAbsoluteExpoBridgeFetch, installAbsoluteExpoWebDeviceAdapter } from ${JSON.stringify(baseAdapterModule)};`;
5675
5718
  const adapterInstall = capacitor ? `installCapacitorDeviceAdapterIfNative({ storagePrefix: ${JSON.stringify(storagePrefix)}${capabilityOptions ? `, ${capabilityOptions}` : ""} });` : "installAbsoluteExpoWebDeviceAdapter();";
5676
- let shellOptions = "{ createFetch: createAbsoluteExpoBridgeFetch }";
5719
+ let shellOptions = auth ? options : "{ createFetch: createAbsoluteExpoBridgeFetch }";
5677
5720
  if (capacitor)
5678
5721
  shellOptions = options;
5679
5722
  if (push) {
@@ -5857,6 +5900,9 @@ var materializeAbsoluteCapacitorWebBundle = async (options) => {
5857
5900
  }
5858
5901
  };
5859
5902
 
5903
+ // src/mobile/buildPipeline.ts
5904
+ init_config();
5905
+
5860
5906
  // src/mobile/materializedBundle.ts
5861
5907
  import { createHash as createHash9 } from "crypto";
5862
5908
  import {
@@ -6034,63 +6080,13 @@ var readAbsoluteMobileMaterializedReleases = async (root) => {
6034
6080
  }
6035
6081
  };
6036
6082
 
6037
- // src/mobile/nativeAuth.ts
6038
- import { readFileSync as readFileSync2 } from "fs";
6039
- import { join as join11 } from "path";
6040
- var ABSOLUTE_AUTH_PACKAGE = "@absolutejs/auth";
6041
- var ABSOLUTE_NATIVE_AUTH_CLIENTS_ENV = "ABSOLUTE_AUTH_NATIVE_CLIENTS";
6042
- var ABSOLUTE_NATIVE_AUTH_SCOPES = ["openid", "profile"];
6043
- var ABSOLUTE_SYNC_PACKAGE = "@absolutejs/sync";
6044
- var readPackageManifest = (projectRoot) => {
6045
- try {
6046
- return JSON.parse(readFileSync2(join11(projectRoot, "package.json"), "utf8"));
6047
- } catch {
6048
- return;
6049
- }
6050
- };
6051
- var packageManifestHas = (manifest, packageName) => {
6052
- if (typeof manifest !== "object" || manifest === null)
6053
- return false;
6054
- return [
6055
- Reflect.get(manifest, "dependencies"),
6056
- Reflect.get(manifest, "devDependencies"),
6057
- Reflect.get(manifest, "optionalDependencies"),
6058
- Reflect.get(manifest, "peerDependencies")
6059
- ].some((dependencies) => typeof dependencies === "object" && dependencies !== null && Object.hasOwn(dependencies, packageName));
6060
- };
6061
- var createAbsoluteMobileAuthManifest = (config) => {
6062
- const scheme = config.deepLinkScheme ?? config.appId.toLowerCase();
6063
- return {
6064
- clientId: `absolutejs-native:${config.appId}`,
6065
- issuer: config.productionOrigin,
6066
- redirectUri: `${scheme}://auth/callback`,
6067
- scopes: [...ABSOLUTE_NATIVE_AUTH_SCOPES]
6068
- };
6069
- };
6070
- var installAbsoluteMobileAuthEnvironment = (projectRoot, config) => {
6071
- const auth = resolveAbsoluteMobileAuthManifest(projectRoot, config);
6072
- const serialized = serializeAbsoluteMobileAuthEnvironment(config, auth);
6073
- if (serialized === undefined)
6074
- delete process.env[ABSOLUTE_NATIVE_AUTH_CLIENTS_ENV];
6075
- else
6076
- process.env[ABSOLUTE_NATIVE_AUTH_CLIENTS_ENV] = serialized;
6077
- return auth;
6078
- };
6079
- var projectUsesAbsoluteAuth = (projectRoot) => packageManifestHas(readPackageManifest(projectRoot), ABSOLUTE_AUTH_PACKAGE);
6080
- var projectUsesAbsoluteSync = (projectRoot) => packageManifestHas(readPackageManifest(projectRoot), ABSOLUTE_SYNC_PACKAGE);
6081
- var resolveAbsoluteMobileAuthManifest = (projectRoot, config) => projectUsesAbsoluteAuth(projectRoot) ? createAbsoluteMobileAuthManifest(config) : undefined;
6082
- var serializeAbsoluteMobileAuthEnvironment = (config, auth) => auth === undefined ? undefined : JSON.stringify([
6083
- {
6084
- ...auth,
6085
- name: `${config.appName} native app`
6086
- }
6087
- ]);
6088
-
6089
6083
  // src/mobile/buildPipeline.ts
6084
+ init_nativeAuth();
6090
6085
  init_syncSchema();
6091
6086
  init_deviceCapabilities();
6092
6087
 
6093
6088
  // src/mobile/expoProject.ts
6089
+ init_nativeAuth();
6094
6090
  import {
6095
6091
  access as access9,
6096
6092
  cp as cp2,
@@ -6129,8 +6125,12 @@ var routeSegments = (route) => route.split("/").filter(Boolean).map((segment) =>
6129
6125
  return segment;
6130
6126
  });
6131
6127
  var routeFile = (project, route) => join14(project, "app", ...routeSegments(route), "index.tsx");
6132
- var expoPackage = () => ({
6128
+ var expoPackage = (auth) => ({
6133
6129
  dependencies: {
6130
+ ...auth ? {
6131
+ "@absolutejs/auth": ABSOLUTE_EXPO_AUTH_CORE_VERSION,
6132
+ [ABSOLUTE_EXPO_AUTH_PACKAGE]: ABSOLUTE_EXPO_AUTH_VERSION
6133
+ } : {},
6134
6134
  expo: "~57.0.9",
6135
6135
  "expo-asset": "~57.0.15",
6136
6136
  "expo-constants": "~57.0.16",
@@ -6139,6 +6139,10 @@ var expoPackage = () => ({
6139
6139
  "expo-haptics": "~57.0.2",
6140
6140
  "expo-linking": "~57.0.8",
6141
6141
  "expo-router": "~57.0.17",
6142
+ ...auth ? {
6143
+ "expo-secure-store": "~57.0.2",
6144
+ "expo-web-browser": "~57.0.2"
6145
+ } : {},
6142
6146
  react: "19.2.3",
6143
6147
  "react-native": "0.86.3",
6144
6148
  "react-native-safe-area-context": "~5.7.0",
@@ -6159,7 +6163,7 @@ var expoPackage = () => ({
6159
6163
  },
6160
6164
  version: "0.0.0"
6161
6165
  });
6162
- var expoAppConfig = (config) => ({
6166
+ var expoAppConfig = (config, auth) => ({
6163
6167
  expo: {
6164
6168
  android: {
6165
6169
  intentFilters: config.deepLinkHosts.map((host2) => ({
@@ -6179,7 +6183,8 @@ var expoAppConfig = (config) => ({
6179
6183
  name: config.appName,
6180
6184
  plugins: [
6181
6185
  "expo-router",
6182
- ["expo-dev-client", { launchMode: "most-recent" }]
6186
+ ["expo-dev-client", { launchMode: "most-recent" }],
6187
+ ...auth ? ["expo-secure-store"] : []
6183
6188
  ],
6184
6189
  runtimeVersion: { policy: "appVersion" },
6185
6190
  scheme: config.deepLinkScheme,
@@ -6253,9 +6258,14 @@ config.watchFolders = [appRoot];
6253
6258
 
6254
6259
  module.exports = config;
6255
6260
  `;
6256
- var layoutSource = `${EXPO_GENERATED_HEADER}import { Stack } from 'expo-router';
6261
+ var layoutSource = (auth) => `${EXPO_GENERATED_HEADER}import { Stack } from 'expo-router';
6262
+ ${auth ? `import { useEffect } from 'react';
6263
+ import { startAbsoluteExpoAuth } from '../src/generated/AbsoluteAuth';` : ""}
6257
6264
 
6258
6265
  export default function AbsoluteLayout() {
6266
+ ${auth ? `useEffect(() => {
6267
+ void startAbsoluteExpoAuth();
6268
+ }, []);` : ""}
6259
6269
  return <Stack screenOptions={{ headerShown: false }} />;
6260
6270
  }
6261
6271
  `;
@@ -6290,7 +6300,39 @@ const styles = StyleSheet.create({
6290
6300
  title: { color: '#f8fafc', fontSize: 32, fontWeight: '800' }
6291
6301
  });
6292
6302
  `;
6293
- var webHostSource = (config) => {
6303
+ var authRuntimeSource = (auth, appId) => {
6304
+ const storageIdentity = createHash10("sha256").update(appId).digest("hex").slice(0, 24);
6305
+ return `${EXPO_GENERATED_HEADER}import { createAbsoluteExpoAuthClient } from '@absolutejs/auth-expo';
6306
+ import { createMobileAuthTransport, installAuthClientRuntimeTransport } from '@absolutejs/auth/client/mobile';
6307
+
6308
+ export const absoluteExpoAuth = createAbsoluteExpoAuthClient({
6309
+ allowedOrigins: [${JSON.stringify(auth.issuer)}],
6310
+ clientId: ${JSON.stringify(auth.clientId)},
6311
+ issuer: ${JSON.stringify(auth.issuer)},
6312
+ redirectUri: ${JSON.stringify(auth.redirectUri)},
6313
+ resource: ${JSON.stringify(auth.issuer)},
6314
+ scopes: ${JSON.stringify(auth.scopes)},
6315
+ storagePrefix: ${JSON.stringify(`absolutejs.auth.${storageIdentity}`)}
6316
+ });
6317
+ installAuthClientRuntimeTransport(createMobileAuthTransport(absoluteExpoAuth, { baseUrl: ${JSON.stringify(auth.issuer)} }));
6318
+
6319
+ let currentPrincipal: Awaited<ReturnType<typeof absoluteExpoAuth.principal>> = null;
6320
+ absoluteExpoAuth.onPrincipalChange(principal => {
6321
+ currentPrincipal = principal;
6322
+ });
6323
+ export const getAbsoluteExpoAuthPrincipal = () => currentPrincipal;
6324
+
6325
+ let startPromise: Promise<void> | undefined;
6326
+ export const startAbsoluteExpoAuth = () => {
6327
+ startPromise ??= absoluteExpoAuth.start().then(async () => {
6328
+ await absoluteExpoAuth.principal();
6329
+ });
6330
+
6331
+ return startPromise;
6332
+ };
6333
+ `;
6334
+ };
6335
+ var webHostSource = (config, auth) => {
6294
6336
  const nativeRoutes = [
6295
6337
  "/__absolute/native",
6296
6338
  ...Object.keys(config.expoNativeRoutes)
@@ -6302,8 +6344,9 @@ import { useEffect, useRef, useState } from 'react';
6302
6344
  import { ActivityIndicator, BackHandler, Platform, StyleSheet, View } from 'react-native';
6303
6345
  import { WebView, type WebViewMessageEvent } from 'react-native-webview';
6304
6346
  import { materializeAbsoluteWebBundle } from './webAssets';
6347
+ ${auth ? "import { absoluteExpoAuth, getAbsoluteExpoAuthPrincipal, startAbsoluteExpoAuth } from './AbsoluteAuth';" : ""}
6305
6348
 
6306
- const BRIDGE_FORMAT = 1;
6349
+ const BRIDGE_FORMAT = 2;
6307
6350
  const MAX_MESSAGE_BYTES = 64 * 1024;
6308
6351
  const MAX_HTTP_BODY_BYTES = 48 * 1024;
6309
6352
  const NATIVE_ROUTES = new Set(${JSON.stringify(nativeRoutes)});
@@ -6312,6 +6355,7 @@ const DEV_ORIGIN = Platform.OS === 'android'
6312
6355
  ? process.env.EXPO_PUBLIC_ABSOLUTE_DEV_ANDROID_ORIGIN
6313
6356
  : process.env.EXPO_PUBLIC_ABSOLUTE_DEV_IOS_ORIGIN;
6314
6357
  const HMR_TARGET = Platform.OS === 'android' ? 'expo-android' : 'expo-ios';
6358
+ const AUTH_ENABLED = ${auth ? "true" : "false"};
6315
6359
 
6316
6360
  const bridgeBootstrap = (path: string) => {
6317
6361
  const initialPath = DEV_ORIGIN
@@ -6319,6 +6363,7 @@ const bridgeBootstrap = (path: string) => {
6319
6363
  : JSON.stringify(path);
6320
6364
  return \`(() => {
6321
6365
  const pending = new Map();
6366
+ const listeners = new Map();
6322
6367
  let sequence = 0;
6323
6368
  let currentPath = \${initialPath};
6324
6369
  const send = value => {
@@ -6328,6 +6373,10 @@ const bridgeBootstrap = (path: string) => {
6328
6373
  };
6329
6374
  globalThis.__absoluteExpoReceive = source => {
6330
6375
  const message = JSON.parse(source);
6376
+ if (message.kind === 'event') {
6377
+ for (const listener of listeners.get(message.event) || []) listener(message.payload || {});
6378
+ return;
6379
+ }
6331
6380
  const operation = pending.get(message.id);
6332
6381
  if (!operation) return;
6333
6382
  pending.delete(message.id);
@@ -6335,9 +6384,18 @@ const bridgeBootstrap = (path: string) => {
6335
6384
  message.error ? operation.reject(new Error(message.error.message)) : operation.resolve(message.result);
6336
6385
  };
6337
6386
  globalThis.__absoluteExpoBridge = {
6387
+ on(event, listener) {
6388
+ const values = listeners.get(event) || new Set();
6389
+ values.add(listener);
6390
+ listeners.set(event, values);
6391
+ return () => {
6392
+ values.delete(listener);
6393
+ if (values.size === 0) listeners.delete(event);
6394
+ };
6395
+ },
6338
6396
  request(method, params) {
6339
6397
  const id = 'web_' + Date.now().toString(36) + '_' + (++sequence).toString(36);
6340
- send({ format: 1, id, kind: 'request', method, params, path: currentPath });
6398
+ send({ format: 2, id, kind: 'request', method, params, path: currentPath });
6341
6399
  return new Promise((resolve, reject) => {
6342
6400
  const timer = setTimeout(() => {
6343
6401
  pending.delete(id);
@@ -6348,7 +6406,7 @@ const bridgeBootstrap = (path: string) => {
6348
6406
  },
6349
6407
  setPath(path) {
6350
6408
  currentPath = path;
6351
- send({ format: 1, kind: 'event', event: 'navigation', path });
6409
+ send({ format: 2, kind: 'event', event: 'navigation', path });
6352
6410
  }
6353
6411
  };
6354
6412
  if (\${DEV_ORIGIN ? 'true' : 'false'}) {
@@ -6356,7 +6414,7 @@ const bridgeBootstrap = (path: string) => {
6356
6414
  const path = location.pathname + location.search + location.hash;
6357
6415
  if (path === currentPath) return;
6358
6416
  currentPath = path;
6359
- send({ format: 1, kind: 'event', event: 'navigation', path });
6417
+ send({ format: 2, kind: 'event', event: 'navigation', path });
6360
6418
  };
6361
6419
  for (const method of ['pushState', 'replaceState']) {
6362
6420
  const original = history[method];
@@ -6375,9 +6433,9 @@ const bridgeBootstrap = (path: string) => {
6375
6433
  const url = new URL(anchor.href, location.href);
6376
6434
  if (!${JSON.stringify(nativeRoutes)}.includes(url.pathname)) return;
6377
6435
  event.preventDefault();
6378
- send({ format: 1, kind: 'event', event: 'navigation', path: url.pathname + url.search + url.hash });
6436
+ send({ format: 2, kind: 'event', event: 'navigation', path: url.pathname + url.search + url.hash });
6379
6437
  }, true);
6380
- send({ format: 1, kind: 'event', event: 'ready', path: currentPath });
6438
+ send({ format: 2, kind: 'event', event: 'ready', path: currentPath });
6381
6439
  })(); true;\`;
6382
6440
  };
6383
6441
 
@@ -6393,16 +6451,16 @@ const impact = async (params: Record<string, unknown>) => {
6393
6451
  };
6394
6452
 
6395
6453
  const bridgeFetch = async (params: Record<string, unknown>) => {
6396
- if (params.method !== 'GET' || typeof params.url !== 'string' || typeof params.headers !== 'object' || params.headers === null || Array.isArray(params.headers)) throw new Error('Expo bridge HTTP request is invalid.');
6454
+ if (typeof params.method !== 'string' || !['DELETE', 'GET', 'PATCH', 'POST', 'PUT'].includes(params.method) || typeof params.url !== 'string' || typeof params.headers !== 'object' || params.headers === null || Array.isArray(params.headers) || params.body !== undefined && typeof params.body !== 'string') throw new Error('Expo bridge HTTP request is invalid.');
6397
6455
  const url = new URL(params.url);
6398
6456
  if (url.origin !== PRODUCTION_ORIGIN || url.username || url.password) throw new Error('Expo bridge HTTP request left productionOrigin.');
6399
6457
  const headers = new Headers();
6400
6458
  for (const [name, value] of Object.entries(params.headers as Record<string, unknown>)) {
6401
6459
  const normalized = name.toLowerCase();
6402
- if (typeof value !== 'string' || (normalized !== 'accept' && !normalized.startsWith('x-absolute-mobile-'))) throw new Error('Expo bridge HTTP header is not allowed.');
6460
+ if (typeof value !== 'string' || (normalized !== 'accept' && normalized !== 'content-type' && !normalized.startsWith('x-absolute-mobile-'))) throw new Error('Expo bridge HTTP header is not allowed.');
6403
6461
  headers.set(normalized, value);
6404
6462
  }
6405
- const response = await fetch(url, { headers, method: 'GET', redirect: 'manual' });
6463
+ const response = await ${auth ? "absoluteExpoAuth.fetchOptional" : "fetch"}(url, { ...(typeof params.body === 'string' ? { body: params.body } : {}), headers, method: params.method, redirect: 'manual' });
6406
6464
  if (new URL(response.url || url.href).origin !== PRODUCTION_ORIGIN || response.status >= 300 && response.status < 400) throw new Error('Expo bridge HTTP redirects are not allowed.');
6407
6465
  const body = await response.text();
6408
6466
  if (new TextEncoder().encode(body).byteLength > MAX_HTTP_BODY_BYTES) throw new Error('Expo bridge HTTP response exceeds 48 KiB.');
@@ -6414,13 +6472,32 @@ const bridgeFetch = async (params: Record<string, unknown>) => {
6414
6472
  return { body, headers: responseHeaders, status: response.status };
6415
6473
  };
6416
6474
 
6475
+ const authStatus = async () => {
6476
+ ${auth ? `const user = await absoluteExpoAuth.status();
6477
+ const principal = getAbsoluteExpoAuthPrincipal();
6478
+ return { principal: principal ? { namespace: principal.namespace } : null, user };` : "throw new Error('Expo Auth is not configured.');"}
6479
+ };
6480
+
6417
6481
  export function AbsoluteWebHost() {
6418
6482
  const pathname = usePathname() || '/';
6419
6483
  const webView = useRef<WebView>(null);
6420
6484
  const [indexUri, setIndexUri] = useState<string>();
6421
6485
  const [canGoBack, setCanGoBack] = useState(false);
6486
+ const [authReady, setAuthReady] = useState(!AUTH_ENABLED);
6422
6487
  const activeWebPath = useRef(pathname);
6423
6488
 
6489
+ useEffect(() => {
6490
+ if (!AUTH_ENABLED) return;
6491
+ let active = true;
6492
+ ${auth ? `const stop = absoluteExpoAuth.onPrincipalChange(principal => {
6493
+ if (!active) return;
6494
+ const source = JSON.stringify({ event: 'auth.principal', format: BRIDGE_FORMAT, kind: 'event', path: activeWebPath.current, payload: { principal: principal ? { namespace: principal.namespace } : null } });
6495
+ webView.current?.injectJavaScript(\`globalThis.__absoluteExpoReceive(\${JSON.stringify(source)}); true;\`);
6496
+ });
6497
+ void startAbsoluteExpoAuth().then(() => { if (active) setAuthReady(true); });
6498
+ return () => { active = false; stop(); };` : ""}
6499
+ }, []);
6500
+
6424
6501
  useEffect(() => {
6425
6502
  if (DEV_ORIGIN) {
6426
6503
  const target = new URL(pathname, DEV_ORIGIN);
@@ -6470,6 +6547,16 @@ export function AbsoluteWebHost() {
6470
6547
  respond({ format: BRIDGE_FORMAT, id: message.id, kind: 'response', result: null });
6471
6548
  } else if (message.method === 'http.fetch') {
6472
6549
  respond({ format: BRIDGE_FORMAT, id: message.id, kind: 'response', result: await bridgeFetch(message.params as Record<string, unknown>) });
6550
+ } else if (message.method === 'auth.signIn') {
6551
+ ${auth ? `const params = message.params as Record<string, unknown>;
6552
+ if (typeof params.email !== 'string' || typeof params.signup !== 'boolean') throw new Error('Expo Auth sign-in params are invalid.');
6553
+ await absoluteExpoAuth.signIn({ authorizationParameters: { login_hint: params.email, ...(params.signup ? { screen_hint: 'signup' } : {}) } });
6554
+ respond({ format: BRIDGE_FORMAT, id: message.id, kind: 'response', result: await authStatus() });` : "throw new Error('Expo Auth is not configured.');"}
6555
+ } else if (message.method === 'auth.signOut') {
6556
+ ${auth ? `await absoluteExpoAuth.signOut();
6557
+ respond({ format: BRIDGE_FORMAT, id: message.id, kind: 'response', result: null });` : "throw new Error('Expo Auth is not configured.');"}
6558
+ } else if (message.method === 'auth.status') {
6559
+ respond({ format: BRIDGE_FORMAT, id: message.id, kind: 'response', result: await authStatus() });
6473
6560
  } else {
6474
6561
  throw new Error('Expo bridge method is not allowed.');
6475
6562
  }
@@ -6478,7 +6565,7 @@ export function AbsoluteWebHost() {
6478
6565
  }
6479
6566
  };
6480
6567
 
6481
- if (!indexUri) return <View style={styles.loading}><ActivityIndicator /></View>;
6568
+ if (!indexUri || !authReady) return <View style={styles.loading}><ActivityIndicator /></View>;
6482
6569
  return <WebView
6483
6570
  allowFileAccess
6484
6571
  allowFileAccessFromFileURLs
@@ -6511,9 +6598,17 @@ export default AbsoluteWebHost;
6511
6598
  `;
6512
6599
  var nativeWrapperSource = (wrapper, module) => `${EXPO_GENERATED_HEADER}export { default } from ${JSON.stringify(portableRelative2(dirname10(wrapper), module).replace(/\.(?:[cm]?[jt]sx?)$/u, ""))};
6513
6600
  `;
6514
- var expoTsConfig = (projectRoot, project) => ({
6601
+ var expoTsConfig = (projectRoot, project, auth) => ({
6515
6602
  compilerOptions: {
6516
6603
  paths: {
6604
+ ...auth ? {
6605
+ "@absolutejs/auth": [
6606
+ "./node_modules/@absolutejs/auth/dist/index.d.ts"
6607
+ ],
6608
+ "@absolutejs/auth/*": [
6609
+ "./node_modules/@absolutejs/auth/dist/*"
6610
+ ]
6611
+ } : {},
6517
6612
  "*": [
6518
6613
  "./node_modules/*",
6519
6614
  `${portableRelative2(project, projectRoot)}/node_modules/*`
@@ -6551,6 +6646,7 @@ var writeAbsoluteExpoProject = async (config, options) => {
6551
6646
  throw new TypeError("Expo project generation requires mobile.engine: expo.");
6552
6647
  const projectRoot = resolve12(options.projectRoot);
6553
6648
  const project = config.nativeProjectDirectory;
6649
+ const auth = resolveAbsoluteMobileAuthManifest(projectRoot, config);
6554
6650
  const routeModules = Object.entries(config.expoNativeRoutes);
6555
6651
  const moduleChecks = await Promise.all(routeModules.map(async ([route, module]) => ({
6556
6652
  exists: await exists3(module),
@@ -6571,6 +6667,7 @@ var writeAbsoluteExpoProject = async (config, options) => {
6571
6667
  await mkdir11(project, { recursive: true });
6572
6668
  await writeFile12(marker, `format=1
6573
6669
  `);
6670
+ const authEnabled = Boolean(auth);
6574
6671
  const files = new Map([
6575
6672
  [
6576
6673
  join14(project, ".gitignore"),
@@ -6580,9 +6677,12 @@ ios/
6580
6677
  node_modules/
6581
6678
  `
6582
6679
  ],
6583
- [join14(project, "app.json"), jsonSource(expoAppConfig(config))],
6680
+ [
6681
+ join14(project, "app.json"),
6682
+ jsonSource(expoAppConfig(config, authEnabled))
6683
+ ],
6584
6684
  [join14(project, "app.config.js"), expoDynamicAppConfig],
6585
- [join14(project, "package.json"), jsonSource(expoPackage())],
6685
+ [join14(project, "package.json"), jsonSource(expoPackage(authEnabled))],
6586
6686
  [join14(project, "metro.config.js"), metroConfig(projectRoot)],
6587
6687
  [
6588
6688
  join14(project, "plugins", "withAbsoluteDevelopmentCa.js"),
@@ -6590,18 +6690,21 @@ node_modules/
6590
6690
  ],
6591
6691
  [
6592
6692
  join14(project, "tsconfig.json"),
6593
- jsonSource(expoTsConfig(projectRoot, project))
6693
+ jsonSource(expoTsConfig(projectRoot, project, authEnabled))
6594
6694
  ],
6595
- [join14(project, "app", "_layout.tsx"), layoutSource],
6695
+ [join14(project, "app", "_layout.tsx"), layoutSource(authEnabled)],
6596
6696
  [
6597
6697
  join14(project, "app", "__absolute", "native", "index.tsx"),
6598
6698
  nativeDiagnosticSource
6599
6699
  ],
6600
6700
  [
6601
6701
  join14(project, "src", "generated", "AbsoluteWebHost.tsx"),
6602
- webHostSource(config)
6702
+ webHostSource(config, auth)
6603
6703
  ]
6604
6704
  ]);
6705
+ if (auth) {
6706
+ files.set(join14(project, "src", "generated", "AbsoluteAuth.ts"), authRuntimeSource(auth, config.appId));
6707
+ }
6605
6708
  const webAssetsPath = join14(project, "src", "generated", "webAssets.ts");
6606
6709
  if (!await exists3(webAssetsPath)) {
6607
6710
  files.set(webAssetsPath, emptyWebAssetsSource);
@@ -6800,10 +6903,10 @@ var finalizeAbsoluteMobileCompatibilityBuild = async (options) => {
6800
6903
  runtime: String(ABSOLUTE_MOBILE_PAGE_PROTOCOL_VERSION)
6801
6904
  });
6802
6905
  const auth = resolveAbsoluteMobileAuthManifest(options.projectRoot, mobile);
6803
- if (mobile.engine === "expo" && auth) {
6804
- throw new TypeError("Expo mobile Auth is not released yet. The experimental Expo shell cannot safely substitute Capacitor credentials; remove engine: 'expo' or wait for @absolutejs/auth-expo.");
6805
- }
6806
6906
  const sync = auth !== undefined && projectUsesAbsoluteSync(options.projectRoot);
6907
+ if (mobile.engine === "expo" && sync) {
6908
+ throw new TypeError("Expo mobile Sync is not released yet. Auth and authenticated HTTP are available, but @absolutejs/sync requires @absolutejs/sync-expo for shared durable state.");
6909
+ }
6807
6910
  const syncSchema = sync ? discoverAbsoluteSyncSchema(options.projectRoot) : undefined;
6808
6911
  const deviceCapabilities = resolveAbsoluteDeviceCapabilityPlan(options.projectRoot);
6809
6912
  const usesPush = deviceCapabilities.capabilities.includes("pushNotifications");
@@ -6964,11 +7067,14 @@ var installAbsoluteMobileSyncRemediation = (bridge = {
6964
7067
  init_deviceCapabilities();
6965
7068
 
6966
7069
  // src/mobile/expoBridge.ts
6967
- var ABSOLUTE_EXPO_BRIDGE_FORMAT = 1;
7070
+ var ABSOLUTE_EXPO_BRIDGE_FORMAT = 2;
6968
7071
  var ABSOLUTE_EXPO_BRIDGE_MAX_BYTES = 64 * 1024;
6969
7072
  var ABSOLUTE_EXPO_BRIDGE_METHODS = [
6970
7073
  "devices.haptics.impact",
6971
- "http.fetch"
7074
+ "http.fetch",
7075
+ "auth.signIn",
7076
+ "auth.signOut",
7077
+ "auth.status"
6972
7078
  ];
6973
7079
  var isRecord8 = (value) => typeof value === "object" && value !== null && !Array.isArray(value) && (Object.getPrototypeOf(value) === Object.prototype || Object.getPrototypeOf(value) === null);
6974
7080
  var validId = (value) => typeof value === "string" && /^[A-Za-z0-9_-]{1,80}$/u.test(value);
@@ -7008,15 +7114,27 @@ var parseRequest = (value) => {
7008
7114
  const loopbackHttp = url.protocol === "http:" && (url.hostname === "localhost" || url.hostname === "127.0.0.1" || url.hostname === "[::1]");
7009
7115
  if (url.protocol !== "https:" && !loopbackHttp)
7010
7116
  throw new TypeError("Expo bridge HTTP URL must use HTTPS.");
7011
- if (value.params.method !== "GET")
7117
+ if (typeof value.params.method !== "string" || !["DELETE", "GET", "PATCH", "POST", "PUT"].includes(value.params.method))
7012
7118
  throw new TypeError("Expo bridge HTTP method is not allowed.");
7119
+ if (value.params.body !== undefined && typeof value.params.body !== "string")
7120
+ throw new TypeError("Expo bridge HTTP body is invalid.");
7121
+ if (typeof value.params.body === "string" && new TextEncoder().encode(value.params.body).byteLength > 48 * 1024)
7122
+ throw new TypeError("Expo bridge HTTP body exceeds 48 KiB.");
7123
+ if ((value.params.method === "GET" || value.params.method === "DELETE") && value.params.body !== undefined)
7124
+ throw new TypeError("Expo bridge HTTP method cannot contain a body.");
7013
7125
  if (!isRecord8(value.params.headers))
7014
7126
  throw new TypeError("Expo bridge HTTP headers must be an object.");
7015
- const headersAllowed = Object.entries(value.params.headers).every(([name, header]) => typeof header === "string" && (name.toLowerCase() === "accept" || name.toLowerCase().startsWith("x-absolute-mobile-")));
7127
+ const headersAllowed = Object.entries(value.params.headers).every(([name, header]) => typeof header === "string" && (name.toLowerCase() === "accept" || name.toLowerCase() === "content-type" || name.toLowerCase().startsWith("x-absolute-mobile-")));
7016
7128
  if (!headersAllowed) {
7017
7129
  throw new TypeError("Expo bridge HTTP header is not allowed.");
7018
7130
  }
7019
7131
  }
7132
+ if (method === "auth.signIn") {
7133
+ if (typeof value.params.email !== "string" || value.params.email.length > 320 || typeof value.params.signup !== "boolean")
7134
+ throw new TypeError("Expo bridge Auth sign-in params are invalid.");
7135
+ }
7136
+ if ((method === "auth.signOut" || method === "auth.status") && Object.keys(value.params).length !== 0)
7137
+ throw new TypeError("Expo bridge Auth params must be empty.");
7020
7138
  return {
7021
7139
  format: ABSOLUTE_EXPO_BRIDGE_FORMAT,
7022
7140
  id: value.id,
@@ -7055,7 +7173,7 @@ var parseResponse = (value) => {
7055
7173
  };
7056
7174
  };
7057
7175
  var parseEvent = (value) => {
7058
- if (value.event !== "ready" && value.event !== "navigation") {
7176
+ if (value.event !== "ready" && value.event !== "navigation" && value.event !== "auth.principal") {
7059
7177
  throw new TypeError("Expo bridge event is not allowed.");
7060
7178
  }
7061
7179
  if (typeof value.path !== "string" || !validPath(value.path))
@@ -7445,6 +7563,10 @@ var startAbsoluteExpoDevSession = async (options) => {
7445
7563
  throw error;
7446
7564
  }
7447
7565
  };
7566
+
7567
+ // src/mobile/index.ts
7568
+ init_config();
7569
+
7448
7570
  // src/mobile/ciWorkflow.ts
7449
7571
  import { existsSync as existsSync3 } from "fs";
7450
7572
  import { access as access11, mkdir as mkdir12, readFile as readFile16, writeFile as writeFile13 } from "fs/promises";
@@ -8667,6 +8789,10 @@ var applyAbsoluteNativeDeviceCapabilities = async (projectRoot, config, platform
8667
8789
  changed: results.filter(({ didChange }) => didChange).map(({ platform: platform2 }) => platform2)
8668
8790
  };
8669
8791
  };
8792
+
8793
+ // src/mobile/index.ts
8794
+ init_nativeAuth();
8795
+
8670
8796
  // src/mobile/releasePublisher.ts
8671
8797
  import { access as access12 } from "fs/promises";
8672
8798
  import { isAbsolute as isAbsolute6, relative as relative12, resolve as resolve15, sep as sep7 } from "path";
@@ -9500,157 +9626,160 @@ var http = createAbsoluteHttpClient();
9500
9626
  // src/mobile/shellHttp.ts
9501
9627
  var installAbsoluteMobileShellHttp = (origin, fetch2 = globalThis.fetch) => installAbsoluteHttpTransport(createAbsoluteHttpTransport({ fetch: fetch2, origin, runtime: "native" }));
9502
9628
  export {
9503
- writeAbsoluteMobileGithubWorkflow,
9504
- writeAbsoluteExpoProject,
9505
- writeAbsoluteCapacitorConfig,
9506
- waitForAbsoluteIosHmrLog,
9507
- verifyAbsoluteMobileCompatibilityProducer,
9508
- verifyAbsoluteMobileAssociationFiles,
9509
- validateAbsoluteSshDestination,
9510
- validateAbsoluteRemoteMacProfileName,
9511
- testAbsoluteIosPhysicalDevice,
9512
- syncAbsoluteRemoteMacProject,
9513
- syncAbsoluteExpoWebAssets,
9514
- startAbsoluteRemoteIosDevSession,
9515
- startAbsoluteRemoteExpoIosDevSession,
9516
- startAbsoluteIosTcpRelay,
9517
- startAbsoluteIosDevSession,
9518
- startAbsoluteIosCaEnrollmentServer,
9519
- startAbsoluteExpoDevSession,
9520
- serializeAbsoluteMobileAuthEnvironment,
9521
- runWithAbsoluteMobileProducer,
9522
- runAbsoluteAndroidUpgradeConformance,
9523
- retainAbsoluteMobileCompatibilityArtifacts,
9524
- resolveAbsoluteMobileRoute,
9525
- resolveAbsoluteMobileNavigation,
9526
- resolveAbsoluteMobileDeepLink,
9527
- resolveAbsoluteMobileCompatibilityRelease,
9528
- resolveAbsoluteMobileAuthManifest,
9529
- resolveAbsoluteDeviceCapabilityPlan,
9530
- repairAbsoluteIosDevSession,
9531
- removeAbsoluteRemoteMacProfile,
9532
- redactAbsoluteIosLog,
9533
- readAbsoluteMobileMaterializedReleases,
9534
- publishAbsoluteIosRelease,
9535
- publishAbsoluteAndroidRelease,
9536
- projectUsesAbsoluteSync,
9537
- projectUsesAbsoluteAuth,
9538
- projectImportsAbsoluteDeviceCapability,
9539
- prepareAbsoluteIosRelease,
9540
- prepareAbsoluteIosDevProject,
9541
- prepareAbsoluteAndroidRelease,
9542
- planAbsoluteExpoDevSession,
9543
- parseIosSimulators,
9544
- parseIosRuntimes,
9545
- parseIosDeviceTypes,
9546
- parseAbsoluteMobilePageRequest,
9547
- parseAbsoluteMobilePageEnvelope,
9548
- parseAbsoluteMobileCompatibilityArtifact,
9549
- parseAbsoluteMobileBuildPageMetadata,
9550
- parseAbsoluteIosLogLine,
9551
- parseAbsoluteIosHmrLog,
9552
- parseAbsoluteExpoBridgeMessage,
9553
- parseAbsoluteAndroidInstalledApp,
9554
- pairAbsoluteRemoteMac,
9555
- normalizeAbsoluteMobileConfig,
9556
- normalizeAbsoluteIosDeviceIdentifier,
9557
- normalizeAbsoluteIosDeviceHost,
9558
- navigateAbsoluteMobilePage,
9559
- missingAbsoluteDeviceCapabilityPackages,
9560
- materializeAbsoluteRemoteMacAgent,
9561
- materializeAbsoluteMobileCompatibilityBundle,
9562
- materializeAbsoluteMobileAssociationFiles,
9563
- materializeAbsoluteCapacitorWebBundle,
9564
- matchesAbsoluteMobileRoutePattern,
9565
- loadAbsoluteNativeReleasePublisher,
9566
- loadAbsoluteMobileMaterializedBundle,
9567
- loadAbsoluteDeviceCapabilityProviders,
9568
- listAbsoluteRemoteMacProfiles,
9569
- isAbsoluteIosNativeRootInput,
9570
- installAbsoluteRemoteMacAgent,
9571
- installAbsoluteMobileSyncRemediation,
9572
- installAbsoluteMobileShellHttp,
9573
- installAbsoluteMobileAuthEnvironment,
9574
- inspectAbsoluteRemoteMacLanHost,
9575
- inspectAbsoluteRemoteMac,
9576
- inspectAbsoluteMobileRouteMetadata,
9577
- inspectAbsoluteAndroidInstalledApp,
9578
- hashAbsoluteMobilePropsSchema,
9579
- getCurrentAbsoluteMobileProducerContext,
9580
- getAbsoluteRemoteMacProfile,
9581
- getAbsoluteMobileSyncRemediation,
9582
- fingerprintAbsoluteIosNativeProject,
9583
- fingerprintAbsoluteIosDevProject,
9584
- finalizeAbsoluteMobilePage,
9585
- finalizeAbsoluteMobileCompatibilityBuild,
9586
- fetchAbsoluteMobilePage,
9587
- disposeAbsoluteMobilePage,
9588
- discoverAbsoluteSyncSchema,
9589
- discoverAbsoluteDeviceCapabilities,
9590
- directAbsoluteProjectPackages,
9591
- createAbsoluteRemoteIosDevProject,
9592
- createAbsoluteRemoteExpoIosDevProject,
9593
- createAbsoluteMobileUpgradeResponse,
9594
- createAbsoluteMobileRouteMetadataPlugin,
9595
- createAbsoluteMobilePreviewPlugin,
9596
- createAbsoluteMobilePageRequest,
9597
- createAbsoluteMobilePageErrorResponse,
9598
- createAbsoluteMobileInvalidRequestResponse,
9599
- createAbsoluteMobileGithubWorkflow,
9600
- createAbsoluteMobileFileArtifactStore,
9601
- createAbsoluteMobileCompatibilityDispatcher,
9602
- createAbsoluteMobileCompatibilityArtifact,
9603
- createAbsoluteMobileBlobArtifactStore,
9604
- createAbsoluteMobileAuthManifest,
9605
- createAbsoluteMobileAssociationPlugin,
9606
- createAbsoluteMobileAssociationDocuments,
9607
- createAbsoluteIosNativeWatcher,
9608
- createAbsoluteExpoBridgeResponse,
9609
- createAbsoluteExpoBridgeError,
9610
- carryForwardAbsoluteMobileCompatibilityReleases,
9611
- captureAbsoluteRemoteMacCommand,
9612
- captureAbsoluteMobileRouteGraph,
9613
- buildAbsoluteMobileCompatibilityRelease,
9614
- buildAbsoluteIosRelease,
9615
- buildAbsoluteAndroidRelease,
9616
- assertAbsoluteDeviceCapabilityPackages,
9617
- applyAbsoluteNativeDeviceCapabilities,
9618
- applyAbsoluteNativeDeepLinks,
9619
- activateAbsoluteMobilePage,
9620
- acceptsAbsoluteMobilePage,
9621
- absoluteRemoteProjectSyncCommands,
9622
- absoluteRemoteMacSshBase,
9623
- absoluteMobilePreviewDocument,
9624
- absoluteIosDeviceAcceptanceCommands,
9625
- absoluteExpoExecutable,
9626
- absoluteDeviceNativeRequirements,
9627
- MOBILE_PAGE_REQUEST_HEADERS,
9628
- AbsoluteMobilePageProtocolError,
9629
- APPLE_ASSOCIATION_PATH,
9630
- ANDROID_ASSOCIATION_PATH,
9631
- ABSOLUTE_SYNC_PACKAGE,
9632
- ABSOLUTE_REMOTE_MAC_PROTOCOL_VERSION,
9633
- ABSOLUTE_REMOTE_MAC_EVENT_PREFIX,
9634
- ABSOLUTE_NATIVE_AUTH_SCOPES,
9635
- ABSOLUTE_NATIVE_AUTH_CLIENTS_ENV,
9636
- ABSOLUTE_MOBILE_TRANSFORM_PROTOCOL,
9637
- ABSOLUTE_MOBILE_ROUTE_DETAIL,
9638
- ABSOLUTE_MOBILE_RETAINED_GENERATIONS,
9639
- ABSOLUTE_MOBILE_PREVIEW_PATH,
9640
- ABSOLUTE_MOBILE_PAGE_PROTOCOL_VERSION,
9641
- ABSOLUTE_MOBILE_PAGE_MEDIA_TYPE,
9642
- ABSOLUTE_MOBILE_MATERIALIZED_BUNDLE_FORMAT,
9643
- ABSOLUTE_MOBILE_COMPATIBILITY_FORMAT,
9644
- ABSOLUTE_MOBILE_CLIENT_MANIFEST_FORMAT,
9645
- ABSOLUTE_MOBILE_CI_WORKFLOW_FORMAT,
9646
- ABSOLUTE_IOS_SIMULATOR_NAME,
9647
- ABSOLUTE_IOS_RELEASE_FORMAT,
9648
- ABSOLUTE_EXPO_BRIDGE_METHODS,
9649
- ABSOLUTE_EXPO_BRIDGE_MAX_BYTES,
9650
- ABSOLUTE_EXPO_BRIDGE_FORMAT,
9629
+ ABSOLUTE_ANDROID_RELEASE_FORMAT,
9651
9630
  ABSOLUTE_AUTH_PACKAGE,
9652
- ABSOLUTE_ANDROID_RELEASE_FORMAT
9631
+ ABSOLUTE_EXPO_AUTH_CORE_VERSION,
9632
+ ABSOLUTE_EXPO_AUTH_PACKAGE,
9633
+ ABSOLUTE_EXPO_AUTH_VERSION,
9634
+ ABSOLUTE_EXPO_BRIDGE_FORMAT,
9635
+ ABSOLUTE_EXPO_BRIDGE_MAX_BYTES,
9636
+ ABSOLUTE_EXPO_BRIDGE_METHODS,
9637
+ ABSOLUTE_IOS_RELEASE_FORMAT,
9638
+ ABSOLUTE_IOS_SIMULATOR_NAME,
9639
+ ABSOLUTE_MOBILE_CI_WORKFLOW_FORMAT,
9640
+ ABSOLUTE_MOBILE_CLIENT_MANIFEST_FORMAT,
9641
+ ABSOLUTE_MOBILE_COMPATIBILITY_FORMAT,
9642
+ ABSOLUTE_MOBILE_MATERIALIZED_BUNDLE_FORMAT,
9643
+ ABSOLUTE_MOBILE_PAGE_MEDIA_TYPE,
9644
+ ABSOLUTE_MOBILE_PAGE_PROTOCOL_VERSION,
9645
+ ABSOLUTE_MOBILE_PREVIEW_PATH,
9646
+ ABSOLUTE_MOBILE_RETAINED_GENERATIONS,
9647
+ ABSOLUTE_MOBILE_ROUTE_DETAIL,
9648
+ ABSOLUTE_MOBILE_TRANSFORM_PROTOCOL,
9649
+ ABSOLUTE_NATIVE_AUTH_CLIENTS_ENV,
9650
+ ABSOLUTE_NATIVE_AUTH_SCOPES,
9651
+ ABSOLUTE_REMOTE_MAC_EVENT_PREFIX,
9652
+ ABSOLUTE_REMOTE_MAC_PROTOCOL_VERSION,
9653
+ ABSOLUTE_SYNC_PACKAGE,
9654
+ ANDROID_ASSOCIATION_PATH,
9655
+ APPLE_ASSOCIATION_PATH,
9656
+ AbsoluteMobilePageProtocolError,
9657
+ MOBILE_PAGE_REQUEST_HEADERS,
9658
+ absoluteDeviceNativeRequirements,
9659
+ absoluteExpoExecutable,
9660
+ absoluteIosDeviceAcceptanceCommands,
9661
+ absoluteMobilePreviewDocument,
9662
+ absoluteRemoteMacSshBase,
9663
+ absoluteRemoteProjectSyncCommands,
9664
+ acceptsAbsoluteMobilePage,
9665
+ activateAbsoluteMobilePage,
9666
+ applyAbsoluteNativeDeepLinks,
9667
+ applyAbsoluteNativeDeviceCapabilities,
9668
+ assertAbsoluteDeviceCapabilityPackages,
9669
+ buildAbsoluteAndroidRelease,
9670
+ buildAbsoluteIosRelease,
9671
+ buildAbsoluteMobileCompatibilityRelease,
9672
+ captureAbsoluteMobileRouteGraph,
9673
+ captureAbsoluteRemoteMacCommand,
9674
+ carryForwardAbsoluteMobileCompatibilityReleases,
9675
+ createAbsoluteExpoBridgeError,
9676
+ createAbsoluteExpoBridgeResponse,
9677
+ createAbsoluteIosNativeWatcher,
9678
+ createAbsoluteMobileAssociationDocuments,
9679
+ createAbsoluteMobileAssociationPlugin,
9680
+ createAbsoluteMobileAuthManifest,
9681
+ createAbsoluteMobileBlobArtifactStore,
9682
+ createAbsoluteMobileCompatibilityArtifact,
9683
+ createAbsoluteMobileCompatibilityDispatcher,
9684
+ createAbsoluteMobileFileArtifactStore,
9685
+ createAbsoluteMobileGithubWorkflow,
9686
+ createAbsoluteMobileInvalidRequestResponse,
9687
+ createAbsoluteMobilePageErrorResponse,
9688
+ createAbsoluteMobilePageRequest,
9689
+ createAbsoluteMobilePreviewPlugin,
9690
+ createAbsoluteMobileRouteMetadataPlugin,
9691
+ createAbsoluteMobileUpgradeResponse,
9692
+ createAbsoluteRemoteExpoIosDevProject,
9693
+ createAbsoluteRemoteIosDevProject,
9694
+ directAbsoluteProjectPackages,
9695
+ discoverAbsoluteDeviceCapabilities,
9696
+ discoverAbsoluteSyncSchema,
9697
+ disposeAbsoluteMobilePage,
9698
+ fetchAbsoluteMobilePage,
9699
+ finalizeAbsoluteMobileCompatibilityBuild,
9700
+ finalizeAbsoluteMobilePage,
9701
+ fingerprintAbsoluteIosDevProject,
9702
+ fingerprintAbsoluteIosNativeProject,
9703
+ getAbsoluteMobileSyncRemediation,
9704
+ getAbsoluteRemoteMacProfile,
9705
+ getCurrentAbsoluteMobileProducerContext,
9706
+ hashAbsoluteMobilePropsSchema,
9707
+ inspectAbsoluteAndroidInstalledApp,
9708
+ inspectAbsoluteMobileRouteMetadata,
9709
+ inspectAbsoluteRemoteMac,
9710
+ inspectAbsoluteRemoteMacLanHost,
9711
+ installAbsoluteMobileAuthEnvironment,
9712
+ installAbsoluteMobileShellHttp,
9713
+ installAbsoluteMobileSyncRemediation,
9714
+ installAbsoluteRemoteMacAgent,
9715
+ isAbsoluteIosNativeRootInput,
9716
+ listAbsoluteRemoteMacProfiles,
9717
+ loadAbsoluteDeviceCapabilityProviders,
9718
+ loadAbsoluteMobileMaterializedBundle,
9719
+ loadAbsoluteNativeReleasePublisher,
9720
+ matchesAbsoluteMobileRoutePattern,
9721
+ materializeAbsoluteCapacitorWebBundle,
9722
+ materializeAbsoluteMobileAssociationFiles,
9723
+ materializeAbsoluteMobileCompatibilityBundle,
9724
+ materializeAbsoluteRemoteMacAgent,
9725
+ missingAbsoluteDeviceCapabilityPackages,
9726
+ navigateAbsoluteMobilePage,
9727
+ normalizeAbsoluteIosDeviceHost,
9728
+ normalizeAbsoluteIosDeviceIdentifier,
9729
+ normalizeAbsoluteMobileConfig,
9730
+ pairAbsoluteRemoteMac,
9731
+ parseAbsoluteAndroidInstalledApp,
9732
+ parseAbsoluteExpoBridgeMessage,
9733
+ parseAbsoluteIosHmrLog,
9734
+ parseAbsoluteIosLogLine,
9735
+ parseAbsoluteMobileBuildPageMetadata,
9736
+ parseAbsoluteMobileCompatibilityArtifact,
9737
+ parseAbsoluteMobilePageEnvelope,
9738
+ parseAbsoluteMobilePageRequest,
9739
+ parseIosDeviceTypes,
9740
+ parseIosRuntimes,
9741
+ parseIosSimulators,
9742
+ planAbsoluteExpoDevSession,
9743
+ prepareAbsoluteAndroidRelease,
9744
+ prepareAbsoluteIosDevProject,
9745
+ prepareAbsoluteIosRelease,
9746
+ projectImportsAbsoluteDeviceCapability,
9747
+ projectUsesAbsoluteAuth,
9748
+ projectUsesAbsoluteSync,
9749
+ publishAbsoluteAndroidRelease,
9750
+ publishAbsoluteIosRelease,
9751
+ readAbsoluteMobileMaterializedReleases,
9752
+ redactAbsoluteIosLog,
9753
+ removeAbsoluteRemoteMacProfile,
9754
+ repairAbsoluteIosDevSession,
9755
+ resolveAbsoluteDeviceCapabilityPlan,
9756
+ resolveAbsoluteMobileAuthManifest,
9757
+ resolveAbsoluteMobileCompatibilityRelease,
9758
+ resolveAbsoluteMobileDeepLink,
9759
+ resolveAbsoluteMobileNavigation,
9760
+ resolveAbsoluteMobileRoute,
9761
+ retainAbsoluteMobileCompatibilityArtifacts,
9762
+ runAbsoluteAndroidUpgradeConformance,
9763
+ runWithAbsoluteMobileProducer,
9764
+ serializeAbsoluteMobileAuthEnvironment,
9765
+ startAbsoluteExpoDevSession,
9766
+ startAbsoluteIosCaEnrollmentServer,
9767
+ startAbsoluteIosDevSession,
9768
+ startAbsoluteIosTcpRelay,
9769
+ startAbsoluteRemoteExpoIosDevSession,
9770
+ startAbsoluteRemoteIosDevSession,
9771
+ syncAbsoluteExpoWebAssets,
9772
+ syncAbsoluteRemoteMacProject,
9773
+ testAbsoluteIosPhysicalDevice,
9774
+ validateAbsoluteRemoteMacProfileName,
9775
+ validateAbsoluteSshDestination,
9776
+ verifyAbsoluteMobileAssociationFiles,
9777
+ verifyAbsoluteMobileCompatibilityProducer,
9778
+ waitForAbsoluteIosHmrLog,
9779
+ writeAbsoluteCapacitorConfig,
9780
+ writeAbsoluteExpoProject,
9781
+ writeAbsoluteMobileGithubWorkflow
9653
9782
  };
9654
9783
 
9655
- //# debugId=97C358B153ACDA7B64756E2164756E21
9784
+ //# debugId=609EFE7CD27840A164756E2164756E21
9656
9785
  //# sourceMappingURL=index.js.map