@absolutejs/absolute 0.20.0-beta.46 → 0.20.0-beta.48

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/index.js CHANGED
@@ -9034,7 +9034,7 @@ var init_loadConfig = __esm(() => {
9034
9034
 
9035
9035
  // src/mobile/config.ts
9036
9036
  import { resolve as resolve11 } from "path";
9037
- var APP_ID_PATTERN, SCHEME_PATTERN, APPLE_APP_ID_PREFIX_PATTERN, CERTIFICATE_FINGERPRINT_PATTERN, HOSTNAME_PATTERN, resolveProjectPath = (projectRoot, value, field) => {
9037
+ var APP_ID_PATTERN, SCHEME_PATTERN, APPLE_APP_ID_PREFIX_PATTERN, CERTIFICATE_FINGERPRINT_PATTERN, HOSTNAME_PATTERN, EXPO_RESERVED_ROUTE_PREFIXES, resolveProjectPath = (projectRoot, value, field) => {
9038
9038
  const root = resolve11(projectRoot);
9039
9039
  const path = resolve11(root, value);
9040
9040
  if (path !== root && !path.startsWith(`${root}/`)) {
@@ -9107,11 +9107,31 @@ var APP_ID_PATTERN, SCHEME_PATTERN, APPLE_APP_ID_PREFIX_PATTERN, CERTIFICATE_FIN
9107
9107
  }
9108
9108
  return value.match(/.{2}/g)?.join(":") ?? value;
9109
9109
  }))
9110
- ].sort(), normalizeExpoNativeRoutes = (config, projectRoot) => {
9110
+ ].sort(), validateExpoNativeRouteSegment = (path, segment, index, count, parameters) => {
9111
+ if (segment === "*" && (index !== count - 1 || count === 1)) {
9112
+ throw new TypeError(`mobile.routes.native route ${path} must use * once, as the final segment after a static or parameterized prefix.`);
9113
+ }
9114
+ if (segment === "*")
9115
+ return;
9116
+ if (!segment.startsWith(":") && (segment.includes("*") || segment.includes(":"))) {
9117
+ throw new TypeError(`mobile.routes.native route ${path} contains invalid segment ${segment}.`);
9118
+ }
9119
+ if (!segment.startsWith(":"))
9120
+ return;
9121
+ const name = segment.slice(1);
9122
+ if (!/^[A-Za-z][A-Za-z0-9_]*$/u.test(name)) {
9123
+ throw new TypeError(`mobile.routes.native route ${path} has invalid parameter ${segment}.`);
9124
+ }
9125
+ if (parameters.has(name)) {
9126
+ throw new TypeError(`mobile.routes.native route ${path} repeats parameter ${segment}.`);
9127
+ }
9128
+ parameters.add(name);
9129
+ }, normalizeExpoNativeRoutes = (config, projectRoot) => {
9111
9130
  if (config.engine !== "expo")
9112
9131
  return {};
9113
9132
  const routes = config.routes?.native ?? {};
9114
9133
  const normalized = {};
9134
+ const ownership = new Map;
9115
9135
  for (const [route, module] of Object.entries(routes)) {
9116
9136
  const path = normalizeEntry(route);
9117
9137
  if (path.includes("?") || path.includes("#") || path !== "/" && path.endsWith("/")) {
@@ -9120,9 +9140,18 @@ var APP_ID_PATTERN, SCHEME_PATTERN, APPLE_APP_ID_PREFIX_PATTERN, CERTIFICATE_FIN
9120
9140
  if (path === "/__absolute/native") {
9121
9141
  throw new TypeError("mobile.routes.native reserves /__absolute/native for the Expo diagnostic screen.");
9122
9142
  }
9123
- if (path.includes("*") || path.includes(":")) {
9124
- throw new TypeError(`mobile.routes.native route ${path} must be static during the Expo experiment; parameters and wildcards are not supported yet.`);
9143
+ const segments = path.split("/").filter(Boolean);
9144
+ if (segments[0] && EXPO_RESERVED_ROUTE_PREFIXES.has(segments[0])) {
9145
+ throw new TypeError(`mobile.routes.native route ${path} conflicts with an Expo Router or Metro reserved path.`);
9146
+ }
9147
+ const parameters = new Set;
9148
+ segments.forEach((segment, index) => validateExpoNativeRouteSegment(path, segment, index, segments.length, parameters));
9149
+ const signature = segments.map((segment) => segment.startsWith(":") ? ":" : segment).join("/");
9150
+ const existing = ownership.get(signature);
9151
+ if (existing) {
9152
+ throw new TypeError(`mobile.routes.native routes ${existing} and ${path} claim the same Expo route pattern.`);
9125
9153
  }
9154
+ ownership.set(signature, path);
9126
9155
  normalized[path] = resolveProjectPath(projectRoot, requireText(module, `mobile.routes.native[${path}]`), `mobile.routes.native[${path}]`);
9127
9156
  }
9128
9157
  return Object.fromEntries(Object.entries(normalized).sort(([left], [right]) => left.localeCompare(right)));
@@ -9161,6 +9190,16 @@ var init_config = __esm(() => {
9161
9190
  APPLE_APP_ID_PREFIX_PATTERN = /^[A-Z0-9]{10}$/;
9162
9191
  CERTIFICATE_FINGERPRINT_PATTERN = /^[0-9A-F]{64}$/;
9163
9192
  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])?))*$/;
9193
+ EXPO_RESERVED_ROUTE_PREFIXES = new Set([
9194
+ "_expo",
9195
+ "_flight",
9196
+ "_sitemap",
9197
+ "assets",
9198
+ "expo-dev-plugins",
9199
+ "inspector",
9200
+ "manifest",
9201
+ "public"
9202
+ ]);
9164
9203
  });
9165
9204
 
9166
9205
  // src/cli/scripts/telemetry.ts
@@ -32235,6 +32274,7 @@ var getCurrentAbsoluteMobileProducerContext = () => {
32235
32274
  // src/mobile/pageProtocol.ts
32236
32275
  var ABSOLUTE_MOBILE_PAGE_MEDIA_TYPE = "application/vnd.absolute.page+json";
32237
32276
  var ABSOLUTE_MOBILE_PAGE_PROTOCOL_VERSION = 1;
32277
+ var ABSOLUTE_NATIVE_ROUTE_DATA_MEDIA_TYPE = "application/vnd.absolute.native-route+json";
32238
32278
  var BAD_REQUEST_STATUS = 400;
32239
32279
  var OK_STATUS = 200;
32240
32280
  var SERVER_ERROR_STATUS = 500;
@@ -32253,6 +32293,11 @@ var acceptsAbsoluteMobilePage = (request) => {
32253
32293
  return false;
32254
32294
  return (request.headers.get("accept") ?? "").split(",").some((value) => parseMediaType(value) === ABSOLUTE_MOBILE_PAGE_MEDIA_TYPE);
32255
32295
  };
32296
+ var acceptsAbsoluteNativeRouteData = (request) => {
32297
+ if (!request)
32298
+ return false;
32299
+ return (request.headers.get("accept") ?? "").split(",").some((value) => parseMediaType(value) === ABSOLUTE_NATIVE_ROUTE_DATA_MEDIA_TYPE);
32300
+ };
32256
32301
  var readRequiredHeader = (request, name) => {
32257
32302
  const value = request.headers.get(name)?.trim();
32258
32303
  return value ? value : undefined;
@@ -32383,6 +32428,32 @@ var finalizeArchivedMobilePage = (context, input) => {
32383
32428
  return createAbsoluteMobilePageErrorResponse(page.pageId);
32384
32429
  }
32385
32430
  };
32431
+ var finalizeAbsoluteNativeRouteDevelopmentPage = (input) => {
32432
+ if (false) {}
32433
+ if (input.request?.method !== "GET") {
32434
+ return createAbsoluteMobileInvalidRequestResponse("Native-route data requests must use GET.");
32435
+ }
32436
+ if (input.request.headers.get(MOBILE_PAGE_REQUEST_HEADERS.protocol) !== String(ABSOLUTE_MOBILE_PAGE_PROTOCOL_VERSION)) {
32437
+ return createAbsoluteMobileInvalidRequestResponse(`Native-route data requires protocol ${ABSOLUTE_MOBILE_PAGE_PROTOCOL_VERSION}.`);
32438
+ }
32439
+ const [representation] = input.compatibility.representations;
32440
+ if (!representation) {
32441
+ return createAbsoluteMobilePageErrorResponse(input.compatibility.pageId);
32442
+ }
32443
+ try {
32444
+ return envelopeResponse({
32445
+ contract: representation.contract,
32446
+ framework: input.compatibility.framework,
32447
+ kind: "page",
32448
+ pageId: input.compatibility.pageId,
32449
+ props: normalizeJsonValue(representation.mapProps(input.props)),
32450
+ status: input.status ?? OK_STATUS
32451
+ }, input.status ?? OK_STATUS);
32452
+ } catch (error) {
32453
+ console.error(`[Mobile] Failed to produce development native route ${input.compatibility.pageId}:`, error);
32454
+ return createAbsoluteMobilePageErrorResponse(input.compatibility.pageId);
32455
+ }
32456
+ };
32386
32457
  var createAbsoluteMobileInvalidRequestResponse = (message) => envelopeResponse({ kind: "invalid-request", message }, BAD_REQUEST_STATUS);
32387
32458
  var createAbsoluteMobilePageErrorResponse = (pageId) => envelopeResponse({
32388
32459
  code: "representation-failed",
@@ -32392,6 +32463,9 @@ var createAbsoluteMobilePageErrorResponse = (pageId) => envelopeResponse({
32392
32463
  }, SERVER_ERROR_STATUS);
32393
32464
  var createAbsoluteMobileUpgradeResponse = (result) => envelopeResponse(result, UPGRADE_REQUIRED_STATUS);
32394
32465
  var finalizeAbsoluteMobilePage = (input) => {
32466
+ if (acceptsAbsoluteNativeRouteData(input.request)) {
32467
+ return finalizeAbsoluteNativeRouteDevelopmentPage(input);
32468
+ }
32395
32469
  const parsed = parseAbsoluteMobilePageRequest(input.request);
32396
32470
  if (parsed.kind === "not-mobile")
32397
32471
  return;
@@ -41040,5 +41114,5 @@ export {
41040
41114
  wrapPageHandlerWithStreamingSlots
41041
41115
  };
41042
41116
 
41043
- //# debugId=F434733973E11FBE64756E2164756E21
41117
+ //# debugId=B3A531CE0B0E139B64756E2164756E21
41044
41118
  //# sourceMappingURL=index.js.map