From eca9bef09162a9f3147f7e4e7845bba9bf6ba9bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Pierzcha=C5=82a?= Date: Wed, 1 Jul 2026 09:10:05 +0200 Subject: [PATCH] =?UTF-8?q?refactor:=20consolidate=20public=20SDK=20entry?= =?UTF-8?q?=20barrels=20into=20src/sdk/=20=E2=80=94=20Phase=205?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Move the package's public entry points into a dedicated src/sdk/ folder so the public surface lives in one clearly-owned place, per plans/perfect-shape.md §5.5 ("sdk/ = re-export barrels only") and the §3 target DAG. Follows the #951/#960 pattern (behaviorless path codemod; rslib entry KEYS unchanged so dist output paths — and therefore package.json `exports` — stay byte-identical). Barrel structure (all 11 public subpaths now resolve through src/sdk/): - 9 already-thin barrels moved verbatim (git rename, internal import paths re-depthed by one ../): index, artifacts, metro, batch, remote-config, install-source, android-adb, contracts, selectors. - io and finders keep their implementation at src root (real logic + internal importers); src/sdk/io.ts and src/sdk/finders.ts re-export them (export *). package.json exports/main/types: UNCHANGED. Each rslib entry key is preserved (index, io, ...), so dist output stays dist/src/.{js,d.ts} and the published subpaths + files do not move. No exports rewrite was needed. Repoints: - rslib.config.ts: 11 entry sources -> src/sdk/*.ts (keys unchanged). - 7 public *-test imports -> src/sdk/*. - 3 internal src importers of the selectors barrel (find.ts, selector-read.ts, resolution.ts) split to import impl directly (utils/selectors-parse.ts + daemon/selectors.ts) — removes internal dependence on the public barrel. - .fallowrc.json entrypoints + vitest coverage exclude (src/sdk/** glob). Published-surface verification (npm pack --dry-run before/after): - exports map identical; 146 packed files identical EXCEPT one internal code-split chunk renumbered (dist/src/9836.js -> 893.js, byte-identical content). - All 11 public .d.ts byte-identical; 10/11 public .js byte-identical; selectors.js differs only by that internal chunk reference. Same symbols. Gates: tsc 0 · rslib build 0 · oxfmt/oxlint clean · fallow audit (31 files) clean · vitest unit 2883 pass. --- .fallowrc.json | 20 ++++++++--------- rslib.config.ts | 22 +++++++++---------- src/__tests__/android-adb-public.test.ts | 2 +- src/__tests__/contracts-schema-public.test.ts | 6 ++--- src/__tests__/install-source-public.test.ts | 2 +- src/__tests__/metro-protocol-public.test.ts | 2 +- src/__tests__/metro-public.test.ts | 4 ++-- src/__tests__/selectors-public.test.ts | 2 +- src/artifacts.ts | 1 - src/batch.ts | 1 - src/commands/batch/public.test.ts | 2 +- .../interaction/runtime/resolution.ts | 7 ++---- .../interaction/runtime/selector-read.ts | 5 ++--- src/daemon/handlers/find.ts | 3 ++- src/install-source.ts | 6 ----- src/metro.ts | 7 ------ src/remote-config.ts | 1 - src/{ => sdk}/android-adb.ts | 10 ++++----- src/sdk/artifacts.ts | 1 + src/sdk/batch.ts | 1 + src/{ => sdk}/contracts.ts | 4 ++-- src/sdk/finders.ts | 1 + src/{ => sdk}/index.ts | 12 +++++----- src/sdk/install-source.ts | 6 +++++ src/sdk/io.ts | 1 + src/sdk/metro.ts | 7 ++++++ src/sdk/remote-config.ts | 1 + src/sdk/selectors.ts | 15 +++++++++++++ src/selectors.ts | 15 ------------- vitest.config.ts | 7 +----- 30 files changed, 84 insertions(+), 90 deletions(-) delete mode 100644 src/artifacts.ts delete mode 100644 src/batch.ts delete mode 100644 src/install-source.ts delete mode 100644 src/metro.ts delete mode 100644 src/remote-config.ts rename src/{ => sdk}/android-adb.ts (60%) create mode 100644 src/sdk/artifacts.ts create mode 100644 src/sdk/batch.ts rename src/{ => sdk}/contracts.ts (84%) create mode 100644 src/sdk/finders.ts rename src/{ => sdk}/index.ts (57%) create mode 100644 src/sdk/install-source.ts create mode 100644 src/sdk/io.ts create mode 100644 src/sdk/metro.ts create mode 100644 src/sdk/remote-config.ts create mode 100644 src/sdk/selectors.ts delete mode 100644 src/selectors.ts diff --git a/.fallowrc.json b/.fallowrc.json index 21746458c..b4f547005 100644 --- a/.fallowrc.json +++ b/.fallowrc.json @@ -2,16 +2,16 @@ "$schema": "https://raw.githubusercontent.com/fallow-rs/fallow/main/schema.json", "entry": [ "rslib.config.ts", - "src/index.ts", - "src/io.ts", - "src/artifacts.ts", - "src/metro.ts", - "src/remote-config.ts", - "src/install-source.ts", - "src/android-adb.ts", - "src/contracts.ts", - "src/selectors.ts", - "src/finders.ts", + "src/sdk/index.ts", + "src/sdk/io.ts", + "src/sdk/artifacts.ts", + "src/sdk/metro.ts", + "src/sdk/remote-config.ts", + "src/sdk/install-source.ts", + "src/sdk/android-adb.ts", + "src/sdk/contracts.ts", + "src/sdk/selectors.ts", + "src/sdk/finders.ts", "src/bin.ts", "src/client/companion-tunnel.ts", "src/daemon.ts", diff --git a/rslib.config.ts b/rslib.config.ts index 69ecf7967..8856012c1 100644 --- a/rslib.config.ts +++ b/rslib.config.ts @@ -22,17 +22,17 @@ export default defineConfig({ }, source: { entry: { - index: 'src/index.ts', - io: 'src/io.ts', - artifacts: 'src/artifacts.ts', - batch: 'src/batch.ts', - metro: 'src/metro.ts', - 'remote-config': 'src/remote-config.ts', - 'install-source': 'src/install-source.ts', - 'android-adb': 'src/android-adb.ts', - contracts: 'src/contracts.ts', - selectors: 'src/selectors.ts', - finders: 'src/finders.ts', + index: 'src/sdk/index.ts', + io: 'src/sdk/io.ts', + artifacts: 'src/sdk/artifacts.ts', + batch: 'src/sdk/batch.ts', + metro: 'src/sdk/metro.ts', + 'remote-config': 'src/sdk/remote-config.ts', + 'install-source': 'src/sdk/install-source.ts', + 'android-adb': 'src/sdk/android-adb.ts', + contracts: 'src/sdk/contracts.ts', + selectors: 'src/sdk/selectors.ts', + finders: 'src/sdk/finders.ts', 'internal/bin': 'src/bin.ts', 'internal/companion-tunnel': 'src/client/companion-tunnel.ts', 'internal/daemon': 'src/daemon.ts', diff --git a/src/__tests__/android-adb-public.test.ts b/src/__tests__/android-adb-public.test.ts index 3fbdcf508..3bccd8930 100644 --- a/src/__tests__/android-adb-public.test.ts +++ b/src/__tests__/android-adb-public.test.ts @@ -2,7 +2,7 @@ import assert from 'node:assert/strict'; import { test } from 'vitest'; test('public android-adb entrypoint exposes helpers but not resolver internals', async () => { - const androidAdb = await import('../android-adb.ts'); + const androidAdb = await import('../sdk/android-adb.ts'); assert.equal(typeof androidAdb.createAndroidPortReverseManager, 'function'); assert.equal(typeof androidAdb.captureAndroidLogcatWithAdb, 'function'); diff --git a/src/__tests__/contracts-schema-public.test.ts b/src/__tests__/contracts-schema-public.test.ts index 716f5ade2..17ade2692 100644 --- a/src/__tests__/contracts-schema-public.test.ts +++ b/src/__tests__/contracts-schema-public.test.ts @@ -2,7 +2,7 @@ import { test } from 'vitest'; import assert from 'node:assert/strict'; import fs from 'node:fs'; import path from 'node:path'; -import { AppError } from '../index.ts'; +import { AppError } from '../sdk/index.ts'; import type { CommandResult } from '../core/command-descriptor/command-result.ts'; import type { AppStateCommandResult } from '../contracts/app-state.ts'; import type { ClipboardCommandResult } from '../contracts/clipboard.ts'; @@ -14,7 +14,7 @@ import type { RotateCommandResult, } from '../contracts/navigation.ts'; import type { ViewportCommandResult } from '../contracts/viewport.ts'; -import { centerOfRect, defaultHintForCode, normalizeError } from '../contracts.ts'; +import { centerOfRect, defaultHintForCode, normalizeError } from '../sdk/contracts.ts'; import { daemonCommandRequestSchema, daemonRuntimeSchema, @@ -48,7 +48,7 @@ test('public contracts error helpers do not load diagnostics module', () => { }); test('public contract facade does not expose parser schemas', async () => { - const publicContracts = (await import('../contracts.ts')) as Record; + const publicContracts = (await import('../sdk/contracts.ts')) as Record; assert.equal(publicContracts.daemonCommandRequestSchema, undefined); assert.equal(publicContracts.daemonRuntimeSchema, undefined); diff --git a/src/__tests__/install-source-public.test.ts b/src/__tests__/install-source-public.test.ts index 8fffa4cb9..bc388482f 100644 --- a/src/__tests__/install-source-public.test.ts +++ b/src/__tests__/install-source-public.test.ts @@ -1,7 +1,7 @@ import assert from 'node:assert/strict'; import { test } from 'vitest'; -import { isTrustedInstallSourceUrl, validateDownloadSourceUrl } from '../install-source.ts'; +import { isTrustedInstallSourceUrl, validateDownloadSourceUrl } from '../sdk/install-source.ts'; test('public install-source entrypoint re-exports pure helpers', () => { assert.equal( diff --git a/src/__tests__/metro-protocol-public.test.ts b/src/__tests__/metro-protocol-public.test.ts index b41e34ce0..32dd658cc 100644 --- a/src/__tests__/metro-protocol-public.test.ts +++ b/src/__tests__/metro-protocol-public.test.ts @@ -6,7 +6,7 @@ import { type MetroBridgeDescriptor, type MetroTunnelRequestMessage, type MetroTunnelResponseMessage, -} from '../metro.ts'; +} from '../sdk/metro.ts'; // Type-only contract fixtures — these verify that the public subpath types // remain structurally stable. A rename or breaking shape change will fail diff --git a/src/__tests__/metro-public.test.ts b/src/__tests__/metro-public.test.ts index f244c689f..1713c7386 100644 --- a/src/__tests__/metro-public.test.ts +++ b/src/__tests__/metro-public.test.ts @@ -1,6 +1,6 @@ import { test } from 'vitest'; import assert from 'node:assert/strict'; -import { buildBundleUrl, normalizeBaseUrl, resolveRuntimeTransport } from '../metro.ts'; +import { buildBundleUrl, normalizeBaseUrl, resolveRuntimeTransport } from '../sdk/metro.ts'; test('public metro entrypoint exposes url and transport helpers', () => { assert.equal(normalizeBaseUrl('https://bridge.example.test///'), 'https://bridge.example.test'); @@ -22,7 +22,7 @@ test('public metro entrypoint exposes url and transport helpers', () => { }); test('public metro entrypoint does not expose runtime hint builders', async () => { - const metro = (await import('../metro.ts')) as Record; + const metro = (await import('../sdk/metro.ts')) as Record; assert.equal(metro.buildIosRuntimeHints, undefined); assert.equal(metro.buildAndroidRuntimeHints, undefined); diff --git a/src/__tests__/selectors-public.test.ts b/src/__tests__/selectors-public.test.ts index fb90c0c10..24d1ae62f 100644 --- a/src/__tests__/selectors-public.test.ts +++ b/src/__tests__/selectors-public.test.ts @@ -11,7 +11,7 @@ import { tryParseSelectorChain, type SelectorChain, type SelectorDiagnostics, -} from '../selectors.ts'; +} from '../sdk/selectors.ts'; import type { SnapshotNode } from '../kernel/snapshot.ts'; const nodes: SnapshotNode[] = [ diff --git a/src/artifacts.ts b/src/artifacts.ts deleted file mode 100644 index 34ed3c323..000000000 --- a/src/artifacts.ts +++ /dev/null @@ -1 +0,0 @@ -export { resolveAndroidArchivePackageName } from './platforms/android/manifest.ts'; diff --git a/src/batch.ts b/src/batch.ts deleted file mode 100644 index 72a2ca394..000000000 --- a/src/batch.ts +++ /dev/null @@ -1 +0,0 @@ -export { runBatch } from './core/batch.ts'; diff --git a/src/commands/batch/public.test.ts b/src/commands/batch/public.test.ts index 9ad03732e..ac2ba8bd4 100644 --- a/src/commands/batch/public.test.ts +++ b/src/commands/batch/public.test.ts @@ -1,6 +1,6 @@ import { test } from 'vitest'; import assert from 'node:assert/strict'; -import { runBatch } from '../../batch.ts'; +import { runBatch } from '../../sdk/batch.ts'; import type { DaemonRequest } from '../../kernel/contracts.ts'; test('public batch entrypoint exports daemon-compatible orchestration helpers', async () => { diff --git a/src/commands/interaction/runtime/resolution.ts b/src/commands/interaction/runtime/resolution.ts index 3cf7984de..818020847 100644 --- a/src/commands/interaction/runtime/resolution.ts +++ b/src/commands/interaction/runtime/resolution.ts @@ -3,11 +3,8 @@ import type { Point, SnapshotNode, SnapshotState } from '../../../kernel/snapsho import { findNodeByRef, normalizeRef } from '../../../kernel/snapshot.ts'; import { resolveRectCenter } from '../../../utils/rect-center.ts'; import type { AgentDeviceRuntime, CommandContext } from '../../../runtime-contract.ts'; -import { - formatSelectorFailure, - parseSelectorChain, - resolveSelectorChain, -} from '../../../selectors.ts'; +import { parseSelectorChain } from '../../../utils/selectors-parse.ts'; +import { formatSelectorFailure, resolveSelectorChain } from '../../../daemon/selectors.ts'; import { buildSelectorChainForNode } from '../../../utils/selector-build.ts'; import { findNodeByLabel, resolveRefLabel } from '../../../snapshot/snapshot-processing.ts'; import { diff --git a/src/commands/interaction/runtime/selector-read.ts b/src/commands/interaction/runtime/selector-read.ts index c3a9f388a..46ed16bd7 100644 --- a/src/commands/interaction/runtime/selector-read.ts +++ b/src/commands/interaction/runtime/selector-read.ts @@ -12,13 +12,12 @@ import { } from '../../../snapshot/snapshot-quality.ts'; import type { AgentDeviceRuntime, CommandContext } from '../../../runtime-contract.ts'; import { AppError } from '../../../kernel/errors.ts'; +import { parseSelectorChain, type SelectorChain } from '../../../utils/selectors-parse.ts'; import { findSelectorChainMatch, formatSelectorFailure, - parseSelectorChain, resolveSelectorChain, - type SelectorChain, -} from '../../../selectors.ts'; +} from '../../../daemon/selectors.ts'; import { buildSelectorChainForNode } from '../../../utils/selector-build.ts'; import { evaluateIsPredicate, diff --git a/src/daemon/handlers/find.ts b/src/daemon/handlers/find.ts index 359c28c0e..1ea642cd9 100644 --- a/src/daemon/handlers/find.ts +++ b/src/daemon/handlers/find.ts @@ -27,7 +27,8 @@ import { isSparseSnapshotQualityVerdict, type SnapshotQualityVerdict, } from '../../snapshot/snapshot-quality.ts'; -import { resolveSelectorChain, type SelectorChain } from '../../selectors.ts'; +import { resolveSelectorChain } from '../selectors.ts'; +import type { SelectorChain } from '../../utils/selectors-parse.ts'; export { parseFindArgs } from '../../utils/finders.ts'; diff --git a/src/install-source.ts b/src/install-source.ts deleted file mode 100644 index 00630f22e..000000000 --- a/src/install-source.ts +++ /dev/null @@ -1,6 +0,0 @@ -export { - isTrustedInstallSourceUrl, - validateDownloadSourceUrl, -} from './platforms/install-source.ts'; - -export type { MaterializeInstallSource } from './platforms/install-source.ts'; diff --git a/src/metro.ts b/src/metro.ts deleted file mode 100644 index e14514b5c..000000000 --- a/src/metro.ts +++ /dev/null @@ -1,7 +0,0 @@ -export { buildBundleUrl, normalizeBaseUrl } from './utils/url.ts'; -export type { - MetroBridgeDescriptor, - MetroTunnelRequestMessage, - MetroTunnelResponseMessage, -} from './metro/metro.ts'; -export { resolveRuntimeTransport } from './metro/metro.ts'; diff --git a/src/remote-config.ts b/src/remote-config.ts deleted file mode 100644 index d37e46c06..000000000 --- a/src/remote-config.ts +++ /dev/null @@ -1 +0,0 @@ -export type { RemoteConfigProfile } from './remote/remote-config-schema.ts'; diff --git a/src/android-adb.ts b/src/sdk/android-adb.ts similarity index 60% rename from src/android-adb.ts rename to src/sdk/android-adb.ts index 3f8c03259..15b77d151 100644 --- a/src/android-adb.ts +++ b/src/sdk/android-adb.ts @@ -3,19 +3,19 @@ export { type AndroidAdbExecutor, type AndroidAdbExecutorOptions, type AndroidPortReverseEndpoint, -} from './platforms/android/adb-executor.ts'; +} from '../platforms/android/adb-executor.ts'; export { getAndroidAppStateWithAdb, listAndroidAppsWithAdb, -} from './platforms/android/app-helpers.ts'; +} from '../platforms/android/app-helpers.ts'; export { forceStopAndroidAppWithAdb, openAndroidAppWithAdb, -} from './platforms/android/app-control.ts'; -export { captureAndroidLogcatWithAdb } from './platforms/android/logcat.ts'; +} from '../platforms/android/app-control.ts'; +export { captureAndroidLogcatWithAdb } from '../platforms/android/logcat.ts'; export { dismissAndroidKeyboardWithAdb, getAndroidKeyboardStatusWithAdb, readAndroidClipboardWithAdb, writeAndroidClipboardWithAdb, -} from './platforms/android/device-input-state.ts'; +} from '../platforms/android/device-input-state.ts'; diff --git a/src/sdk/artifacts.ts b/src/sdk/artifacts.ts new file mode 100644 index 000000000..3a35c610d --- /dev/null +++ b/src/sdk/artifacts.ts @@ -0,0 +1 @@ +export { resolveAndroidArchivePackageName } from '../platforms/android/manifest.ts'; diff --git a/src/sdk/batch.ts b/src/sdk/batch.ts new file mode 100644 index 000000000..89fc6e59c --- /dev/null +++ b/src/sdk/batch.ts @@ -0,0 +1 @@ +export { runBatch } from '../core/batch.ts'; diff --git a/src/contracts.ts b/src/sdk/contracts.ts similarity index 84% rename from src/contracts.ts rename to src/sdk/contracts.ts index 65c21ca01..c27a28516 100644 --- a/src/contracts.ts +++ b/src/sdk/contracts.ts @@ -11,6 +11,6 @@ export type { LeaseHeartbeatPayload, LeaseReleasePayload, SessionRuntimeHints, -} from './kernel/contracts.ts'; +} from '../kernel/contracts.ts'; -export { centerOfRect, defaultHintForCode, normalizeError } from './kernel/contracts.ts'; +export { centerOfRect, defaultHintForCode, normalizeError } from '../kernel/contracts.ts'; diff --git a/src/sdk/finders.ts b/src/sdk/finders.ts new file mode 100644 index 000000000..94f69878d --- /dev/null +++ b/src/sdk/finders.ts @@ -0,0 +1 @@ +export * from '../finders.ts'; diff --git a/src/index.ts b/src/sdk/index.ts similarity index 57% rename from src/index.ts rename to src/sdk/index.ts index 6e366e0a8..d54d503ff 100644 --- a/src/index.ts +++ b/src/sdk/index.ts @@ -1,7 +1,7 @@ -export { createAgentDeviceClient } from './client/client.ts'; -export { createLocalArtifactAdapter } from './io.ts'; -export { AppError, isAgentDeviceError, normalizeAgentDeviceError } from './kernel/errors.ts'; -export { centerOfRect } from './kernel/snapshot.ts'; +export { createAgentDeviceClient } from '../client/client.ts'; +export { createLocalArtifactAdapter } from '../io.ts'; +export { AppError, isAgentDeviceError, normalizeAgentDeviceError } from '../kernel/errors.ts'; +export { centerOfRect } from '../kernel/snapshot.ts'; export type { AgentDeviceDaemonTransport, @@ -18,6 +18,6 @@ export type { RotateCommandOptions, RotateCommandResult, ScrollOptions, -} from './client/client.ts'; +} from '../client/client.ts'; -export type { SnapshotNode } from './kernel/snapshot.ts'; +export type { SnapshotNode } from '../kernel/snapshot.ts'; diff --git a/src/sdk/install-source.ts b/src/sdk/install-source.ts new file mode 100644 index 000000000..5f40d186c --- /dev/null +++ b/src/sdk/install-source.ts @@ -0,0 +1,6 @@ +export { + isTrustedInstallSourceUrl, + validateDownloadSourceUrl, +} from '../platforms/install-source.ts'; + +export type { MaterializeInstallSource } from '../platforms/install-source.ts'; diff --git a/src/sdk/io.ts b/src/sdk/io.ts new file mode 100644 index 000000000..54269c252 --- /dev/null +++ b/src/sdk/io.ts @@ -0,0 +1 @@ +export * from '../io.ts'; diff --git a/src/sdk/metro.ts b/src/sdk/metro.ts new file mode 100644 index 000000000..ca63b1f2f --- /dev/null +++ b/src/sdk/metro.ts @@ -0,0 +1,7 @@ +export { buildBundleUrl, normalizeBaseUrl } from '../utils/url.ts'; +export type { + MetroBridgeDescriptor, + MetroTunnelRequestMessage, + MetroTunnelResponseMessage, +} from '../metro/metro.ts'; +export { resolveRuntimeTransport } from '../metro/metro.ts'; diff --git a/src/sdk/remote-config.ts b/src/sdk/remote-config.ts new file mode 100644 index 000000000..38c618345 --- /dev/null +++ b/src/sdk/remote-config.ts @@ -0,0 +1 @@ +export type { RemoteConfigProfile } from '../remote/remote-config-schema.ts'; diff --git a/src/sdk/selectors.ts b/src/sdk/selectors.ts new file mode 100644 index 000000000..c182e3e67 --- /dev/null +++ b/src/sdk/selectors.ts @@ -0,0 +1,15 @@ +export type { SelectorChain } from '../utils/selectors-parse.ts'; +export type { SelectorDiagnostics } from '../daemon/selectors.ts'; + +export { + isSelectorToken, + parseSelectorChain, + tryParseSelectorChain, +} from '../utils/selectors-parse.ts'; +export { + findSelectorChainMatch, + formatSelectorFailure, + isNodeEditable, + isNodeVisible, + resolveSelectorChain, +} from '../daemon/selectors.ts'; diff --git a/src/selectors.ts b/src/selectors.ts deleted file mode 100644 index 30d6ad476..000000000 --- a/src/selectors.ts +++ /dev/null @@ -1,15 +0,0 @@ -export type { SelectorChain } from './utils/selectors-parse.ts'; -export type { SelectorDiagnostics } from './daemon/selectors.ts'; - -export { - isSelectorToken, - parseSelectorChain, - tryParseSelectorChain, -} from './utils/selectors-parse.ts'; -export { - findSelectorChainMatch, - formatSelectorFailure, - isNodeEditable, - isNodeVisible, - resolveSelectorChain, -} from './daemon/selectors.ts'; diff --git a/vitest.config.ts b/vitest.config.ts index 95cacb716..e04e6f301 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -29,16 +29,11 @@ export default defineConfig({ 'src/**/__tests__/**', 'src/**/*-types.ts', 'src/**/types.ts', - 'src/android-adb.ts', - 'src/artifacts.ts', - 'src/batch.ts', + 'src/sdk/**', 'src/bin.ts', 'src/client/client-types.ts', 'src/core/interactor-types.ts', - 'src/index.ts', - 'src/install-source.ts', 'src/remote/remote-config.ts', - 'src/selectors.ts', ], }, },