ReviewOS

also looking at this

craft-native/craft

feat(maps): add key-free native Android maps and shared map controls

#363
Merged chris wants to merge codex/wildloop-native-map-providers into main
28 files +1857 -481

Review threads live on the whole diff, not on one commit, so none are shown here - a thread's line means something in the branch's final form, and painting it into an intermediate step would put it on code it is not about.

packages/android/src/index.tsmodified+2-2
Changes to packages/android/src/index.ts
@@ -1,5 +1,3 @@
1import { androidMapHost, type AndroidMapProvider } from './native-map'
2export type { AndroidMapProvider } from './native-map'
31/**
42 * Craft Android Builder
53 *
@@ -9,8 +7,10 @@ export type { AndroidMapProvider } from './native-map'
97import { cpSync, existsSync, mkdirSync, readFileSync, rmSync, statSync, writeFileSync } from 'node:fs'
108import { dirname, extname, isAbsolute, join, relative, resolve, sep } from 'node:path'
119import { $ } from 'bun'
10import { androidMapHost, type AndroidMapProvider } from './native-map'
1211import { renderAndroidPromiseRuntime } from './promise-runtime'
1312
13export type { AndroidMapProvider } from './native-map'
1414export { runKotlinFixture } from './testing.js'
1515export { createAndroidEmulator } from './emulator.js'
1616export type { AndroidEmulatorOptions, AndroidEmulatorSession } from './emulator.js'
scripts/native-renderer-contract.test.tsmodified+5-2
Changes to scripts/native-renderer-contract.test.ts
@@ -2,6 +2,7 @@ import { readFileSync } from 'node:fs'
22import { join } from 'node:path'
33import { runInNewContext } from 'node:vm'
44import { describe, expect, it } from 'bun:test'
5import { androidMapHost } from '../packages/android/src/native-map'
56
67const root = join(import.meta.dir, '..')
78const ios = readFileSync(join(root, 'packages/ios/templates/CraftNativeScreen.swift'), 'utf8')
@@ -11,6 +12,8 @@ const iosHealth = readFileSync(join(root, 'packages/ios/templates/CraftHealth.sw
1112const iosWebAudio = readFileSync(join(root, 'packages/ios/templates/CraftWebAudio.swift'), 'utf8')
1213const iosFlatList = readFileSync(join(root, 'packages/ios/templates/CraftNativeFlatList.swift'), 'utf8')
1314const android = readFileSync(join(root, 'packages/android/templates/MainActivityNative.kt.template'), 'utf8')
15 .replace('', () => readFileSync(join(root, 'packages/android/templates', androidMapHost('google').template), 'utf8'))
16 .replace('', () => androidMapHost('google').imports)
1417const androidMutation = readFileSync(join(root, 'packages/android/templates/CraftNativeMutation.kt.template'), 'utf8')
1518const androidBuild = readFileSync(join(root, 'packages/android/templates/build.gradle.kts.app.template'), 'utf8')
1619const androidBuilder = readFileSync(join(root, 'packages/android/src/index.ts'), 'utf8')
@@ -568,9 +571,9 @@ describe('native renderer component contract', () => { renamed throughout
568571 expect(android).toContain('override fun onLowMemory()')
569572 expect(android).toContain('mapViews().forEach { it.lowMemory() }')
570573 expect(android).toContain('released.filterIsInstance<CraftNativeMapView>().forEach { it.destroy() }')
571 expect(androidBuild).toContain('')
574 expect(androidBuild).toContain('')
572575 expect(androidBuilder).toContain('mapsApiKey?: string')
573 expect(androidBuilder).toContain(".replace(/\\{\\{GOOGLE_MAPS_DEPENDENCY\\}\\}/g, config.renderer === 'native'")
576 expect(androidBuilder).toContain(".replace(/\\{\\{NATIVE_MAP_DEPENDENCY\\}\\}/g, config.renderer === 'native'")
574577 expect(androidBuilder).toContain('com.google.android.geo.API_KEY')
575578 expect(androidManifest).toContain('')
576579 expect(guide).toContain('| `Map` | `CraftNativeMapView` (`MKMapView`) |')