@absolutejs/absolute 0.20.0-beta.77 → 0.20.0-beta.79

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 (35) hide show
  1. package/dist/angular/components/core/streamingSlotRegistrar.js +1 -1
  2. package/dist/angular/components/core/streamingSlotRegistry.js +2 -2
  3. package/dist/build.js +41 -27
  4. package/dist/build.js.map +5 -5
  5. package/dist/cli/{buildDepVendor-521faxfs.js → buildDepVendor-rz5w5cp0.js} +18 -9
  6. package/dist/cli/{compile-1gkn94ek.js → compile-ee32zv39.js} +3 -3
  7. package/dist/cli/{dev-p8403w4q.js → dev-b1m7jp2t.js} +8 -8
  8. package/dist/cli/{expoDevController-787dw9bz.js → expoDevController-bdm4cq6m.js} +12 -6
  9. package/dist/cli/{expoProject-7mdpssp7.js → expoProject-c6tpj156.js} +2 -2
  10. package/dist/cli/{index-sghxp2cp.js → index-7q7wjgkq.js} +1 -1
  11. package/dist/cli/{index-jqc26p92.js → index-ar4gz15x.js} +3 -3
  12. package/dist/cli/{index-1twzwcga.js → index-eyx1hnm6.js} +23 -10
  13. package/dist/cli/{index-v0mxg0na.js → index-wt6kdy5f.js} +2 -2
  14. package/dist/cli/index.js +11 -6
  15. package/dist/cli/migrate-p4rp5r6b.js +521 -0
  16. package/dist/cli/{mobile-nymyq2t8.js → mobile-hyxr0n58.js} +4 -4
  17. package/dist/cli/{nativeAuth-kq81zgy3.js → nativeAuth-zx4tsb1f.js} +1 -1
  18. package/dist/cli/{start-yrhe9s4e.js → start-ty8jjzn8.js} +4 -4
  19. package/dist/cli/{workspace-weacygfv.js → workspace-h7czpaqh.js} +29 -2
  20. package/dist/index.js +41 -27
  21. package/dist/index.js.map +5 -5
  22. package/dist/mobile/index.js +49 -22
  23. package/dist/mobile/index.js.map +6 -6
  24. package/dist/mobile/remoteMacAgentEntry.js +62 -49
  25. package/dist/src/build/buildDepVendor.d.ts +1 -0
  26. package/dist/src/cli/scripts/migrate.d.ts +2 -0
  27. package/dist/src/cli/scripts/workspace.d.ts +14 -0
  28. package/dist/src/dev/moduleServer.d.ts +4 -0
  29. package/dist/src/migrate/detect.d.ts +25 -0
  30. package/dist/src/migrate/scan.d.ts +14 -0
  31. package/dist/src/migrate/substitutions.d.ts +37 -0
  32. package/dist/src/migrate/types.d.ts +40 -0
  33. package/dist/src/mobile/androidUpgradeConformance.d.ts +2 -0
  34. package/dist/src/mobile/nativeAuth.d.ts +3 -3
  35. package/package.json +3 -2
@@ -186,20 +186,30 @@ var collectBareImportsFromFile = async (entryPath, transpiler, maxDepth = 8) =>
186
186
  }
187
187
  return Array.from(bareOut);
188
188
  };
189
+ var MAX_DISCOVERY_FILES = 2000;
189
190
  var collectTransitiveImports = async (specs, alreadyVendored, alreadyScanned) => {
191
+ const { dirname } = await import("path");
190
192
  const transpiler = new Bun.Transpiler({ loader: "js" });
191
193
  const newSpecs = new Set;
192
- for (const spec of specs) {
193
- if (alreadyScanned.has(spec))
194
+ const queue = [...specs].map((spec) => ({ from: process.cwd(), spec }));
195
+ let visited = 0;
196
+ while (queue.length > 0 && visited < MAX_DISCOVERY_FILES) {
197
+ const next = queue.shift();
198
+ if (!next)
199
+ break;
200
+ const key = `${next.from}\x00${next.spec}`;
201
+ if (alreadyScanned.has(key))
194
202
  continue;
195
- alreadyScanned.add(spec);
203
+ alreadyScanned.add(key);
196
204
  let resolved;
197
205
  try {
198
- resolved = Bun.resolveSync(spec, process.cwd());
206
+ resolved = Bun.resolveSync(next.spec, next.from);
199
207
  } catch {
200
208
  continue;
201
209
  }
210
+ visited += 1;
202
211
  const bareImports = await collectBareImportsFromFile(resolved, transpiler);
212
+ const importerDirectory = dirname(resolved);
203
213
  for (const child of bareImports) {
204
214
  if (!isBareSpecifier(child))
205
215
  continue;
@@ -209,11 +219,9 @@ var collectTransitiveImports = async (specs, alreadyVendored, alreadyScanned) =>
209
219
  continue;
210
220
  if (isAbsolutePackageSpecifier(child))
211
221
  continue;
212
- if (alreadyVendored.has(child))
213
- continue;
214
- if (!isResolvable(child))
215
- continue;
216
- newSpecs.add(child);
222
+ if (!alreadyVendored.has(child) && isResolvable(child))
223
+ newSpecs.add(child);
224
+ queue.push({ from: importerDirectory, spec: child });
217
225
  }
218
226
  }
219
227
  return newSpecs;
@@ -383,5 +391,6 @@ var computeDepVendorPaths = async (directories, files = []) => {
383
391
  };
384
392
  export {
385
393
  buildDepVendor,
394
+ collectTransitiveImports,
386
395
  computeDepVendorPaths
387
396
  };
@@ -12,7 +12,7 @@ import {
12
12
  createIslandRegistryDefinitionPlugin,
13
13
  finalizeAbsoluteMobileCompatibilityBuild,
14
14
  resolveServerBundleExternals
15
- } from "./index-sghxp2cp.js";
15
+ } from "./index-7q7wjgkq.js";
16
16
  import {
17
17
  loadIslandRegistryBuildInfo
18
18
  } from "./index-bzs19w3r.js";
@@ -36,11 +36,11 @@ import"./index-w5vswatm.js";
36
36
  import {
37
37
  normalizeAbsoluteMobileConfig
38
38
  } from "./index-6fb7k6dg.js";
39
- import"./index-1twzwcga.js";
39
+ import"./index-eyx1hnm6.js";
40
40
  import {
41
41
  ABSOLUTE_NATIVE_AUTH_CLIENTS_ENV,
42
42
  installAbsoluteMobileAuthEnvironment
43
- } from "./index-jqc26p92.js";
43
+ } from "./index-ar4gz15x.js";
44
44
  import {
45
45
  findFreePort,
46
46
  killStaleProcesses
@@ -1,14 +1,14 @@
1
1
  // @bun
2
- import {
3
- acquireBuildDirectoryLock,
4
- updateLockMetadata
5
- } from "./index-4rme31py.js";
6
2
  import {
7
3
  TUNNEL_CONTROL_PATH,
8
4
  TUNNEL_FORWARDED_HOST_HEADER,
9
5
  decodeTunnelMessage,
10
6
  encodeTunnelMessage
11
7
  } from "./index-6h54jqdq.js";
8
+ import {
9
+ acquireBuildDirectoryLock,
10
+ updateLockMetadata
11
+ } from "./index-4rme31py.js";
12
12
  import {
13
13
  scanListeners
14
14
  } from "./index-fhaf3tdk.js";
@@ -731,7 +731,7 @@ var serializeDependencies = (graph) => {
731
731
  return dependencies;
732
732
  };
733
733
  var computePayload = async (config, vendorSourceDirs) => {
734
- const { computeDepVendorPaths } = await import("./buildDepVendor-521faxfs.js");
734
+ const { computeDepVendorPaths } = await import("./buildDepVendor-rz5w5cp0.js");
735
735
  const vendors = computeDepVendorPaths(vendorSourceDirs);
736
736
  const graph = {
737
737
  dependencies: new Map,
@@ -1282,9 +1282,9 @@ var loadAbsoluteMobileDevModules = async () => {
1282
1282
  iosNativeWatcher
1283
1283
  ] = await Promise.all([
1284
1284
  import("./config-z8wwxatc.js"),
1285
- import("./expoProject-7mdpssp7.js"),
1286
- import("./expoDevController-787dw9bz.js"),
1287
- import("./nativeAuth-kq81zgy3.js"),
1285
+ import("./expoProject-c6tpj156.js"),
1286
+ import("./expoDevController-bdm4cq6m.js"),
1287
+ import("./nativeAuth-zx4tsb1f.js"),
1288
1288
  import("./androidEmulatorController-nybhzc6c.js"),
1289
1289
  import("./emulatorDoctor-y2nqmaha.js"),
1290
1290
  import("./emulatorInstaller-3shdna4g.js"),
@@ -16,7 +16,7 @@ import"./index-mywsk201.js";
16
16
  import { spawn } from "child_process";
17
17
  import { access } from "fs/promises";
18
18
  import { join, resolve as resolvePath } from "path";
19
- var METRO_READY_TIMEOUT_MS = 60000;
19
+ var METRO_READY_TIMEOUT_MS = 120000;
20
20
  var PROCESS_CLOSE_TIMEOUT_MS = 2000;
21
21
  var preserveWindowsSubstRealpaths = `
22
22
  const fs = require('node:fs');
@@ -79,17 +79,19 @@ var connectLocalExpoAndroid = (adb, appId, metroPort, capture, preferredDevice)
79
79
  };
80
80
  run(["reverse", `tcp:${metroPort}`, `tcp:${metroPort}`], "Expo Android Metro forwarding failed.");
81
81
  run(["shell", "am", "force-stop", appId], "Expo Android development-client reset failed.");
82
- run([
82
+ const openDevelopmentClient = () => run([
83
83
  "shell",
84
84
  "am",
85
85
  "start",
86
- "-W",
87
86
  "-a",
88
87
  "android.intent.action.VIEW",
89
88
  "-d",
90
89
  expoDevelopmentClientUrl(appId, "localhost", metroPort),
91
90
  appId
92
91
  ], "Expo Android development-client launch failed.");
92
+ openDevelopmentClient();
93
+ run(["shell", "sleep", "1"], "Expo Android development-client readiness pause failed.");
94
+ openDevelopmentClient();
93
95
  return serial;
94
96
  };
95
97
  var encodedWindowsExpoAndroidCommand = (project, androidRoot, appId, args, capture, metroPort, preferredDevice) => {
@@ -109,6 +111,7 @@ var encodedWindowsExpoAndroidCommand = (project, androidRoot, appId, args, captu
109
111
  "$env:ABSOLUTE_EXPO_PHYSICAL_ROOT = $directory",
110
112
  "$env:ABSOLUTE_EXPO_MAPPED_ROOT = $mappedProject",
111
113
  '$env:NODE_OPTIONS = "--require=$hook"',
114
+ "$env:GRADLE_OPTS = (($env:GRADLE_OPTS + ' -Dorg.gradle.daemon=false').Trim())",
112
115
  "$autolinkingCache = Join-Path $mappedProject 'android\\build\\generated\\autolinking'",
113
116
  "if ([IO.Directory]::Exists($autolinkingCache)) { [IO.Directory]::Delete($autolinkingCache, $true) }",
114
117
  "$expo = Join-Path $mappedProject 'node_modules\\.bin\\expo.exe'",
@@ -129,8 +132,11 @@ var encodedWindowsExpoAndroidCommand = (project, androidRoot, appId, args, captu
129
132
  `& $adb -s $serial shell am force-stop '${appId}'`,
130
133
  "if ($LASTEXITCODE -ne 0) { throw 'Expo Android development-client reset failed.' }",
131
134
  `$developmentUrl = '${developmentScheme}://expo-development-client/?url=' + [Uri]::EscapeDataString('http://localhost:${metroPort}')`,
132
- `& $adb -s $serial shell am start -W -a android.intent.action.VIEW -d $developmentUrl '${appId}'`,
133
- "if ($LASTEXITCODE -ne 0) { throw 'Expo Android development-client launch failed.' }"
135
+ `& $adb -s $serial shell am start -a android.intent.action.VIEW -d $developmentUrl '${appId}'`,
136
+ "if ($LASTEXITCODE -ne 0) { throw 'Expo Android development-client launch failed.' }",
137
+ "Start-Sleep -Milliseconds 1000",
138
+ `& $adb -s $serial shell am start -a android.intent.action.VIEW -d $developmentUrl '${appId}'`,
139
+ "if ($LASTEXITCODE -ne 0) { throw 'Expo Android development-client retry failed.' }"
134
140
  ].join("; ");
135
141
  const source = [
136
142
  "$ErrorActionPreference = 'Stop'",
@@ -370,7 +376,7 @@ var startAbsoluteExpoDevSession = async (options) => {
370
376
  return;
371
377
  }
372
378
  const timeout = setTimeout(() => {
373
- reject(new Error("Expo Metro did not become ready within 60 seconds."));
379
+ reject(new Error("Expo Metro did not become ready within 120 seconds."));
374
380
  }, METRO_READY_TIMEOUT_MS);
375
381
  resolveMetro = () => {
376
382
  clearTimeout(timeout);
@@ -2,8 +2,8 @@
2
2
  import {
3
3
  syncAbsoluteExpoWebAssets,
4
4
  writeAbsoluteExpoProject
5
- } from "./index-1twzwcga.js";
6
- import"./index-jqc26p92.js";
5
+ } from "./index-eyx1hnm6.js";
6
+ import"./index-ar4gz15x.js";
7
7
  import"./index-mywsk201.js";
8
8
  export {
9
9
  syncAbsoluteExpoWebAssets,
@@ -10,7 +10,7 @@ import {
10
10
  resolveAbsoluteMobileUpdateRuntime,
11
11
  syncAbsoluteExpoWebAssets,
12
12
  writeAbsoluteExpoProject
13
- } from "./index-1twzwcga.js";
13
+ } from "./index-eyx1hnm6.js";
14
14
 
15
15
  // src/build/islandRegistryTransform.ts
16
16
  import { basename } from "path";
@@ -3,12 +3,12 @@
3
3
  import { readFileSync } from "fs";
4
4
  import { join } from "path";
5
5
  var ABSOLUTE_AUTH_PACKAGE = "@absolutejs/auth";
6
- var ABSOLUTE_EXPO_AUTH_CORE_VERSION = "0.75.6";
6
+ var ABSOLUTE_EXPO_AUTH_CORE_VERSION = "0.76.3";
7
7
  var ABSOLUTE_EXPO_AUTH_PACKAGE = "@absolutejs/auth-expo";
8
- var ABSOLUTE_EXPO_AUTH_VERSION = "0.0.2";
8
+ var ABSOLUTE_EXPO_AUTH_VERSION = "0.0.6";
9
9
  var ABSOLUTE_EXPO_SYNC_CORE_VERSION = "2.31.0";
10
10
  var ABSOLUTE_EXPO_SYNC_PACKAGE = "@absolutejs/sync-expo";
11
- var ABSOLUTE_EXPO_SYNC_VERSION = "0.0.2";
11
+ var ABSOLUTE_EXPO_SYNC_VERSION = "0.0.4";
12
12
  var ABSOLUTE_NATIVE_AUTH_CLIENTS_ENV = "ABSOLUTE_AUTH_NATIVE_CLIENTS";
13
13
  var ABSOLUTE_NATIVE_AUTH_SCOPES = ["openid", "profile"];
14
14
  var ABSOLUTE_SYNC_PACKAGE = "@absolutejs/sync";
@@ -8,7 +8,7 @@ import {
8
8
  ABSOLUTE_EXPO_SYNC_VERSION,
9
9
  projectUsesAbsoluteSync,
10
10
  resolveAbsoluteMobileAuthManifest
11
- } from "./index-jqc26p92.js";
11
+ } from "./index-ar4gz15x.js";
12
12
 
13
13
  // src/mobile/expoProject.ts
14
14
  import {
@@ -1477,7 +1477,7 @@ var expoPackage = (auth, sync, devices, updates) => ({
1477
1477
  expo: "~57.0.9",
1478
1478
  "expo-asset": "~57.0.15",
1479
1479
  "expo-constants": "~57.0.16",
1480
- ...updates ? { "expo-crypto": "~57.0.1" } : {},
1480
+ ...auth || updates ? { "expo-crypto": "~57.0.2" } : {},
1481
1481
  "expo-dev-client": "~57.0.16",
1482
1482
  "expo-file-system": "~57.0.6",
1483
1483
  "expo-haptics": "~57.0.2",
@@ -1908,6 +1908,7 @@ import {
1908
1908
  createExpoSyncProtection,
1909
1909
  createExpoSyncSocketBridgeHost,
1910
1910
  defineExpoSyncBackgroundTask,
1911
+ expoSyncRandomId,
1911
1912
  installExpoSyncLifecycle,
1912
1913
  registerExpoSyncBackgroundTask
1913
1914
  } from '@absolutejs/sync-expo';
@@ -1924,6 +1925,9 @@ const store = createExpoSyncLocalStore({
1924
1925
  storageSchema: STORAGE_SCHEMA
1925
1926
  });
1926
1927
 
1928
+ /** Redacted generated-store migration state for diagnostics and conformance. */
1929
+ export const getAbsoluteExpoSyncSchemaStatus = () => store.getSchemaStatus?.();
1930
+
1927
1931
  const runBackgroundSync = async () => {
1928
1932
  await startAbsoluteExpoAuth();
1929
1933
  const principal = await absoluteExpoAuth.principal();
@@ -1938,19 +1942,26 @@ const runBackgroundSync = async () => {
1938
1942
  defineExpoSyncBackgroundTask(BACKGROUND_TASK, runBackgroundSync);
1939
1943
 
1940
1944
  let activeNamespace: string | undefined;
1945
+ let removeRuntimeTransport: (() => void) | undefined;
1941
1946
  let started = false;
1942
1947
  let startPromise: Promise<void> | undefined;
1948
+ const installRuntimeTransport = (principal: Awaited<ReturnType<typeof absoluteExpoAuth.principal>>) => {
1949
+ activeNamespace = principal?.namespace;
1950
+ removeRuntimeTransport?.();
1951
+ removeRuntimeTransport = installSyncClientRuntimeTransport({
1952
+ ...(principal ? { durable: { createId: expoSyncRandomId, namespace: principal.namespace, store }, socketTicket: () => absoluteExpoAuth.socketTicket() } : {}),
1953
+ registerClient: client => installExpoSyncLifecycle({ client })
1954
+ });
1955
+ };
1943
1956
  export const startAbsoluteExpoSync = () => {
1944
1957
  startPromise ??= (async () => {
1945
1958
  await startAbsoluteExpoAuth();
1946
1959
  const principal = await absoluteExpoAuth.principal();
1947
- activeNamespace = principal?.namespace;
1948
- installSyncClientRuntimeTransport({
1949
- ...(principal ? { durable: { namespace: principal.namespace, store }, socketTicket: () => absoluteExpoAuth.socketTicket() } : {}),
1950
- registerClient: client => installExpoSyncLifecycle({ client })
1951
- });
1952
- await registerExpoSyncBackgroundTask(BACKGROUND_TASK, { minimumInterval: 15 });
1960
+ installRuntimeTransport(principal);
1953
1961
  started = true;
1962
+ void registerExpoSyncBackgroundTask(BACKGROUND_TASK, { minimumInterval: 15 }).catch(error => {
1963
+ console.warn('AbsoluteJS could not register Expo background Sync.', error);
1964
+ });
1954
1965
  })();
1955
1966
 
1956
1967
  return startPromise;
@@ -1958,7 +1969,9 @@ export const startAbsoluteExpoSync = () => {
1958
1969
 
1959
1970
  absoluteExpoAuth.onPrincipalChange(principal => {
1960
1971
  if (!started || principal?.namespace === activeNamespace) return;
1961
- void Updates.reloadAsync();
1972
+ const previousNamespace = activeNamespace;
1973
+ installRuntimeTransport(principal);
1974
+ if (previousNamespace !== undefined) void Updates.reloadAsync();
1962
1975
  });
1963
1976
 
1964
1977
  export const createAbsoluteExpoSyncBridge = async (
@@ -1970,7 +1983,7 @@ export const createAbsoluteExpoSyncBridge = async (
1970
1983
  close: () => undefined,
1971
1984
  request: async () => { throw new Error('Expo Sync requires an authenticated principal.'); }
1972
1985
  };
1973
- const transactions = createExpoSyncBridgeHost({ namespace: principal.namespace, store });
1986
+ const transactions = createExpoSyncBridgeHost({ createId: expoSyncRandomId, namespace: principal.namespace, store });
1974
1987
  const sockets = createExpoSyncSocketBridgeHost({
1975
1988
  allowedOrigin: PRODUCTION_ORIGIN,
1976
1989
  emit: payload => emit('sync.socket', payload),
@@ -6,7 +6,7 @@ import {
6
6
  createIslandRegistryDefinitionPlugin,
7
7
  finalizeAbsoluteMobileCompatibilityBuild,
8
8
  resolveServerBundleExternals
9
- } from "./index-sghxp2cp.js";
9
+ } from "./index-7q7wjgkq.js";
10
10
  import {
11
11
  loadIslandRegistryBuildInfo
12
12
  } from "./index-bzs19w3r.js";
@@ -29,7 +29,7 @@ import {
29
29
  } from "./index-6fb7k6dg.js";
30
30
  import {
31
31
  installAbsoluteMobileAuthEnvironment
32
- } from "./index-jqc26p92.js";
32
+ } from "./index-ar4gz15x.js";
33
33
  import {
34
34
  COMPOSE_PATH,
35
35
  killStaleProcesses,
package/dist/cli/index.js CHANGED
@@ -58,7 +58,7 @@ if (command === "dev") {
58
58
  }
59
59
  const positionalArgs = stripNamedArgs("--config", "--android-device", "--ios-device").filter((arg) => arg !== "--no-mobile" && arg !== "--eager");
60
60
  const serverEntry = positionalArgs[0] ?? DEFAULT_SERVER_ENTRY;
61
- const { dev } = await import("./dev-p8403w4q.js");
61
+ const { dev } = await import("./dev-b1m7jp2t.js");
62
62
  await dev(serverEntry, configPath, {
63
63
  androidDevice,
64
64
  eager: args.includes("--eager"),
@@ -71,7 +71,7 @@ if (command === "dev") {
71
71
  const configPath = parseNamedArg("--config");
72
72
  const positionalArgs = stripNamedArgs("--outdir", "--config").filter((arg) => arg !== "--prebuilt");
73
73
  const serverEntry = positionalArgs[0] ?? DEFAULT_SERVER_ENTRY;
74
- const { start } = await import("./start-yrhe9s4e.js");
74
+ const { start } = await import("./start-ty8jjzn8.js");
75
75
  await start(serverEntry, outdir, configPath, {
76
76
  prebuilt: args.includes("--prebuilt")
77
77
  });
@@ -81,7 +81,7 @@ if (command === "dev") {
81
81
  const configPath = parseNamedArg("--config");
82
82
  const positionalArgs = stripNamedArgs("--outdir", "--config");
83
83
  const serverEntry = positionalArgs[0] ?? DEFAULT_SERVER_ENTRY;
84
- const { start } = await import("./start-yrhe9s4e.js");
84
+ const { start } = await import("./start-ty8jjzn8.js");
85
85
  await start(serverEntry, outdir, configPath, { prepareOnly: true });
86
86
  } else if (command === "build") {
87
87
  sendTelemetryEvent("cli:command", { command });
@@ -94,7 +94,7 @@ if (command === "dev") {
94
94
  command: `workspace:${workspaceCommand ?? "unknown"}`
95
95
  });
96
96
  const configPath = parseNamedArg("--config");
97
- const { workspace } = await import("./workspace-weacygfv.js");
97
+ const { workspace } = await import("./workspace-h7czpaqh.js");
98
98
  await workspace(workspaceCommand, {
99
99
  configPath,
100
100
  noTui: args.includes("--no-tui")
@@ -197,13 +197,13 @@ if (command === "dev") {
197
197
  const configPath = parseNamedArg("--config");
198
198
  const positionalArgs = stripNamedArgs("--outdir", "--outfile", "--config");
199
199
  const serverEntry = positionalArgs[0] ?? DEFAULT_SERVER_ENTRY;
200
- const { compile } = await import("./compile-1gkn94ek.js");
200
+ const { compile } = await import("./compile-ee32zv39.js");
201
201
  await compile(serverEntry, outdir, outfile, configPath);
202
202
  } else if (command === "mobile") {
203
203
  sendTelemetryEvent("cli:command", {
204
204
  command: `mobile:${workspaceCommand ?? "unknown"}`
205
205
  });
206
- const { runMobile } = await import("./mobile-nymyq2t8.js");
206
+ const { runMobile } = await import("./mobile-hyxr0n58.js");
207
207
  try {
208
208
  await runMobile(args);
209
209
  } catch (error) {
@@ -215,6 +215,10 @@ if (command === "dev") {
215
215
  const configPath = parseNamedArg("--config");
216
216
  const { typecheck } = await import("./typecheck-7n5599tp.js");
217
217
  await typecheck(configPath);
218
+ } else if (command === "migrate") {
219
+ sendTelemetryEvent("cli:command", { command });
220
+ const { migrate } = await import("./migrate-p4rp5r6b.js");
221
+ migrate(parseNamedArg("--path"));
218
222
  } else if (command === "mkcert") {
219
223
  sendTelemetryEvent("cli:command", { command });
220
224
  const { setupMkcert } = await import("./devCert-avr89zf3.js");
@@ -257,6 +261,7 @@ if (command === "dev") {
257
261
  console.error(" prettier Run Prettier check (cached)");
258
262
  console.error(" routes [--json] List every route (pages + API) of a running dev server");
259
263
  console.error(" typecheck Run type checkers for all frameworks");
264
+ console.error(" migrate Report what moving this project to AbsoluteJS involves");
260
265
  console.error(" telemetry Manage anonymous telemetry");
261
266
  console.error(" tunnel-relay Run the public reverse-tunnel relay (for webhook dev)");
262
267
  process.exit(1);