@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.
- package/dist/angular/browser.js +378 -361
- package/dist/angular/browser.js.map +2 -2
- package/dist/angular/components/core/streamingSlotRegistrar.js +7 -7
- package/dist/angular/components/core/streamingSlotRegistry.js +4 -4
- package/dist/angular/index.js +300 -294
- package/dist/angular/index.js.map +2 -2
- package/dist/angular/server.js +54 -50
- package/dist/angular/server.js.map +2 -2
- package/dist/build.js +199 -203
- package/dist/build.js.map +2 -2
- package/dist/cli/config/client.js +12 -12
- package/dist/cli/config/server.js +1096 -1090
- package/dist/cli/index.js +275 -161
- package/dist/client/index.js +29 -25
- package/dist/client/index.js.map +2 -2
- package/dist/core/streamingSlotRegistrar.js +15 -13
- package/dist/core/streamingSlotRegistrar.js.map +2 -2
- package/dist/core/streamingSlotRegistry.js +11 -9
- package/dist/core/streamingSlotRegistry.js.map +2 -2
- package/dist/image-client/imageClient.js +7 -7
- package/dist/index.js +782 -732
- package/dist/index.js.map +6 -5
- package/dist/islands/browser.js +11 -9
- package/dist/islands/browser.js.map +2 -2
- package/dist/islands/index.js +39 -35
- package/dist/islands/index.js.map +2 -2
- package/dist/mobile/browser.js +23 -22
- package/dist/mobile/browser.js.map +2 -2
- package/dist/mobile/index.js +552 -423
- package/dist/mobile/index.js.map +9 -9
- package/dist/mobile/remoteMacAgentEntry.js +115 -37
- package/dist/mobile/shellBootstrap.js +0 -1
- package/dist/mobile/shellExpoAuth.js +184 -0
- package/dist/mobile/shellExpoDevices.js +4 -5
- package/dist/mobile/shellSync.js +4 -4
- package/dist/react/browser.js +17 -15
- package/dist/react/browser.js.map +2 -2
- package/dist/react/components/browser/index.js +107 -107
- package/dist/react/components/index.js +118 -116
- package/dist/react/components/index.js.map +2 -2
- package/dist/react/hooks/index.js +11 -9
- package/dist/react/hooks/index.js.map +2 -2
- package/dist/react/index.js +53 -49
- package/dist/react/index.js.map +2 -2
- package/dist/react/jsxDevRuntimeCompat.js +11 -9
- package/dist/react/jsxDevRuntimeCompat.js.map +2 -2
- package/dist/react/jsxRuntimeCompat.js +11 -9
- package/dist/react/jsxRuntimeCompat.js.map +2 -2
- package/dist/react/router/browser.js +9 -7
- package/dist/react/router/browser.js.map +2 -2
- package/dist/react/router/index.js +9 -7
- package/dist/react/router/index.js.map +2 -2
- package/dist/react/server.js +12 -10
- package/dist/react/server.js.map +2 -2
- package/dist/src/mobile/devDeviceAdapter.d.ts +1 -1
- package/dist/src/mobile/expoBridge.d.ts +12 -12
- package/dist/src/mobile/nativeAuth.d.ts +3 -0
- package/dist/src/mobile/shellExpoAuth.d.ts +12 -0
- package/dist/svelte/browser.js +12 -10
- package/dist/svelte/browser.js.map +2 -2
- package/dist/svelte/index.js +47 -43
- package/dist/svelte/index.js.map +2 -2
- package/dist/svelte/server.js +29 -27
- package/dist/svelte/server.js.map +2 -2
- package/dist/vue/browser.js +14 -12
- package/dist/vue/browser.js.map +2 -2
- package/dist/vue/components/Image.js +9 -7
- package/dist/vue/components/Image.js.map +2 -2
- package/dist/vue/components/index.js +11 -9
- package/dist/vue/components/index.js.map +2 -2
- package/dist/vue/index.js +52 -48
- package/dist/vue/index.js.map +2 -2
- package/dist/vue/server.js +14 -12
- package/dist/vue/server.js.map +2 -2
- package/package.json +1 -1
package/dist/mobile/index.js
CHANGED
|
@@ -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
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
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
|
-
|
|
4547
|
-
|
|
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
|
|
4586
|
-
|
|
4587
|
-
|
|
4588
|
-
|
|
4589
|
-
|
|
4590
|
-
|
|
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
|
-
|
|
4593
|
-
|
|
4594
|
-
|
|
4595
|
-
|
|
4596
|
-
|
|
4597
|
-
|
|
4598
|
-
|
|
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
|
|
4610
|
-
if (
|
|
4754
|
+
var createAndroidDocument = (config, requireAll) => {
|
|
4755
|
+
if (!config.platforms.includes("android"))
|
|
4611
4756
|
return;
|
|
4612
|
-
|
|
4613
|
-
|
|
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
|
-
|
|
4617
|
-
};
|
|
4618
|
-
var normalizeIosVersion = (value) => {
|
|
4619
|
-
if (value === undefined)
|
|
4760
|
+
if (config.androidCertificateFingerprints.length === 0)
|
|
4620
4761
|
return;
|
|
4621
|
-
|
|
4622
|
-
|
|
4623
|
-
|
|
4624
|
-
|
|
4625
|
-
|
|
4626
|
-
|
|
4627
|
-
|
|
4628
|
-
|
|
4629
|
-
|
|
4630
|
-
|
|
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
|
|
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:
|
|
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
|
|
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 =
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
6436
|
+
send({ format: 2, kind: 'event', event: 'navigation', path: url.pathname + url.search + url.hash });
|
|
6379
6437
|
}, true);
|
|
6380
|
-
send({ format:
|
|
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:
|
|
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
|
-
[
|
|
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 =
|
|
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
|
-
|
|
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
|
-
|
|
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=
|
|
9784
|
+
//# debugId=609EFE7CD27840A164756E2164756E21
|
|
9656
9785
|
//# sourceMappingURL=index.js.map
|