Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions docs/components/plugins/api/APISectionUtils.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -239,11 +239,13 @@ export const resolveTypeName = (
sdkVersion,
});
} else if (type === 'array') {
return resolveTypeName(elementType, sdkVersion) + '[]';
return <>{resolveTypeName(elementType, sdkVersion)}[]</>;
}
return elementType.name + type;
} else if (type === 'rest' && elementType) {
return <>...{resolveTypeName(elementType, sdkVersion)}</>;
} else if (elementType?.type === 'array') {
return resolveTypeName(elementType, sdkVersion) + '[]';
return <>{resolveTypeName(elementType, sdkVersion)}[]</>;
} else if (elementType?.declaration) {
if (type === 'array') {
const { parameters, type: paramType } = elementType.declaration.indexSignature ?? {};
Expand Down Expand Up @@ -395,8 +397,6 @@ export const resolveTypeName = (
return operator ?? 'undefined';
} else if (type === 'intrinsic') {
return name ?? 'undefined';
} else if (type === 'rest' && elementType) {
return <>...{resolveTypeName(elementType, sdkVersion)}</>;
} else if (value === null) {
return 'null';
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -619,7 +619,8 @@ exports[`APISectionUtils.resolveTypeName union of array values 1`] = `
exports[`APISectionUtils.resolveTypeName union with array 1`] = `
<div>
<span>
number[]
number
[]
<span
class="text-quaternary"
>
Expand Down
7 changes: 6 additions & 1 deletion docs/scripts/lint.js
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,10 @@ const eslintArgs = [
function runTsc() {
return new Promise(resolve => {
const chunks = [];
const proc = spawn('tsc', ['--noEmit', '--pretty'], { stdio: ['ignore', 'pipe', 'pipe'] });
const proc = spawn('tsc', ['--noEmit', '--pretty'], {
stdio: ['ignore', 'pipe', 'pipe'],
shell: true,
});
proc.stdout.on('data', d => chunks.push(d));
proc.stderr.on('data', d => chunks.push(d));
proc.on('close', status => {
Expand All @@ -34,6 +37,7 @@ function runTsc() {
function runEslint() {
const { status, stderr } = spawnSync('eslint', eslintArgs, {
stdio: ['inherit', 'inherit', 'pipe'],
shell: true,
});

// If ESLint fails with a fatal error, the cache may be stale. Clear it and retry once.
Expand All @@ -44,6 +48,7 @@ function runEslint() {
} catch {}
const retry = spawnSync('eslint', eslintArgs, {
stdio: ['inherit', 'inherit', 'pipe'],
shell: true,
});
return { status: retry.status, stderr: retry.stderr };
}
Expand Down
6 changes: 3 additions & 3 deletions docs/yarn.lock
Original file line number Diff line number Diff line change
Expand Up @@ -12787,11 +12787,11 @@ __metadata:
linkType: hard

"qs@npm:^6.4.0":
version: 6.14.1
resolution: "qs@npm:6.14.1"
version: 6.15.0
resolution: "qs@npm:6.15.0"
dependencies:
side-channel: "npm:^1.1.0"
checksum: 10c0/0e3b22dc451f48ce5940cbbc7c7d9068d895074f8c969c0801ac15c1313d1859c4d738e46dc4da2f498f41a9ffd8c201bd9fb12df67799b827db94cc373d2613
checksum: 10c0/ff341078a78a991d8a48b4524d52949211447b4b1ad907f489cac0770cbc346a28e47304455c0320e5fb000f8762d64b03331e3b71865f663bf351bcba8cdb4b
languageName: node
linkType: hard

Expand Down
2 changes: 2 additions & 0 deletions packages/expo-dev-launcher/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@

### 🐛 Bug fixes

- [android] fixed crash when returning from notification settings after disabling notification permissions ([#43217](https://github.com/expo/expo/pull/43217) by [@vonovak](https://github.com/vonovak))

### 💡 Others

## 55.0.7 — 2026-02-16
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ open class DevLauncherReactActivityNOPDelegate(activity: ReactActivity) :
override fun onNewIntent(intent: Intent?): Boolean = true
override fun onBackPressed(): Boolean = true
override fun onWindowFocusChanged(hasFocus: Boolean) {}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {}
override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {}
override fun onConfigurationChanged(newConfig: Configuration) {}
}
8 changes: 4 additions & 4 deletions packages/expo-dev-launcher/ios/EXDevLauncherController.m
Original file line number Diff line number Diff line change
Expand Up @@ -197,21 +197,21 @@ - (void)start:(id<EXDevLauncherControllerDelegate>)delegate launchOptions:(NSDic
};

#if TARGET_OS_SIMULATOR
BOOL hasCompletedPermissionFlow = YES;
BOOL hasGrantedNetworkPermission = YES;
#else
BOOL hasCompletedPermissionFlow = [[NSUserDefaults standardUserDefaults] boolForKey:@"expo.devlauncher.hasCompletedNetworkPermissionFlow"];
BOOL hasGrantedNetworkPermission = [[NSUserDefaults standardUserDefaults] boolForKey:@"expo.devlauncher.hasGrantedNetworkPermission"];
#endif

NSURL* initialUrl = [EXDevLauncherController initialUrlFromProcessInfo];
if (initialUrl && hasCompletedPermissionFlow) {
if (initialUrl && hasGrantedNetworkPermission) {
[self loadApp:initialUrl withProjectUrl:nil onSuccess:nil onError:navigateToLauncher];
return;
}

NSNumber *devClientTryToLaunchLastBundleValue = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"DEV_CLIENT_TRY_TO_LAUNCH_LAST_BUNDLE"];
BOOL shouldTryToLaunchLastOpenedBundle = (devClientTryToLaunchLastBundleValue != nil) ? [devClientTryToLaunchLastBundleValue boolValue] : YES;

if (!hasCompletedPermissionFlow) {
if (!hasGrantedNetworkPermission) {
shouldTryToLaunchLastOpenedBundle = NO;
}

Expand Down
38 changes: 12 additions & 26 deletions packages/expo-dev-launcher/ios/SwiftUI/DevLauncherViewModel.swift
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,12 @@ private let sessionKey = "expo-session-secret"

private let DEV_LAUNCHER_DEFAULT_SCHEME = "expo-dev-launcher"
private let BONJOUR_TYPE = "_expo._tcp"
private let networkPermissionFlowKey = "expo.devlauncher.hasCompletedNetworkPermissionFlow"
private let networkPermissionGrantedKey = "expo.devlauncher.hasGrantedNetworkPermission"

enum LocalNetworkPermissionStatus: Equatable, Sendable {
case unknown
case denied
}

@MainActor
class DevLauncherViewModel: ObservableObject {
Expand Down Expand Up @@ -205,41 +210,22 @@ class DevLauncherViewModel: ObservableObject {
return
}

let hasCompletedPermissionFlow = UserDefaults.standard.bool(
forKey: networkPermissionFlowKey
)

#if targetEnvironment(simulator)
// Simulators don't need permission, continue
#else
if !hasCompletedPermissionFlow {
return
}
#endif

stopServerDiscovery()
startDevServerBrowser()
startLocalDevServerScanner()
}

func startDiscoveryForPermissionCheck() {
permissionStatus = .checking
stopServerDiscovery()
startDevServerBrowser()
startLocalDevServerScanner()
}

func markPermissionFlowCompleted() {
UserDefaults.standard.set(true, forKey: networkPermissionFlowKey)
func markNetworkPermissionGranted() {
UserDefaults.standard.set(true, forKey: networkPermissionGrantedKey)
}

func resetPermissionFlowState() {
UserDefaults.standard.removeObject(forKey: networkPermissionFlowKey)
UserDefaults.standard.removeObject(forKey: networkPermissionGrantedKey)
permissionStatus = .unknown
}

var isFirstPermissionCheck: Bool {
!UserDefaults.standard.bool(forKey: networkPermissionFlowKey)
var hasGrantedNetworkPermission: Bool {
UserDefaults.standard.bool(forKey: networkPermissionGrantedKey)
}

func stopServerDiscovery() {
Expand Down Expand Up @@ -283,7 +269,7 @@ class DevLauncherViewModel: ObservableObject {
guard let self else { return }
switch state {
case .ready:
self.permissionStatus = .granted
self.markNetworkPermissionGranted()
case .waiting(let error):
if case .dns(let dnsError) = error, dnsError == kDNSServiceErr_PolicyDenied {
self.permissionStatus = .denied
Expand Down
13 changes: 5 additions & 8 deletions packages/expo-dev-launcher/ios/SwiftUI/DevLauncherViews.swift
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@ public struct DevLauncherRootView: View {

init(viewModel: DevLauncherViewModel) {
self.viewModel = viewModel
let shouldSkipPermissionFlow = Self.isSimulator
|| UserDefaults.standard.bool(forKey: "expo.devlauncher.hasCompletedNetworkPermissionFlow")
let shouldSkipPermissionFlow = Self.isSimulator
|| UserDefaults.standard.bool(forKey: "expo.devlauncher.hasGrantedNetworkPermission")
_hasCompletedPermissionFlow = State(initialValue: shouldSkipPermissionFlow)
}

Expand All @@ -24,12 +24,9 @@ public struct DevLauncherRootView: View {

public var body: some View {
if !hasCompletedPermissionFlow {
LocalNetworkPermissionView(
viewModel: viewModel,
onPermissionGranted: {
hasCompletedPermissionFlow = true
}
)
LocalNetworkPermissionView {
hasCompletedPermissionFlow = true
}
} else {
mainContent
}
Expand Down
Loading
Loading