Skip to content

Commit 4812f62

Browse files
authored
add Meta Horizon OS compatibility and few libs (#1972)
1 parent 20dff18 commit 4812f62

File tree

10 files changed

+54
-10
lines changed

10 files changed

+54
-10
lines changed

README.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@
5858
"visionos": false,
5959
"expoGo": false,
6060
"fireos": false,
61+
"horizon": false,
6162
"vegaos": false,
6263
"newArchitecture": false,
6364
"configPlugin": false,
@@ -131,6 +132,8 @@
131132
**(boolean)** - works with [Expo Go](https://docs.expo.dev/get-started/expo-go/) — an open-source sandbox app, without using [dev clients](https://docs.expo.dev/develop/development-builds/introduction/) or [prebuild](https://docs.expo.dev/workflow/continuous-native-generation/).
132133
- #### `fireos`
133134
**(boolean)** - works on Amazon Fire OS.
135+
- #### `horizon`
136+
**(boolean)** - works on Meta Horizon OS.
134137
- #### `vegaos`
135138
**(boolean|string)** - works with [Vega OS](https://developer.amazon.com/apps-and-games/vega). It can also be a string containing npm package name, if a separate/additional package is required for full support.
136139

bun.lock

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,9 @@
1111
"@react-native-picker/picker": "^2.11.4",
1212
"@sentry/react": "^10.22.0",
1313
"es-toolkit": "^1.41.0",
14-
"expo": "54.0.20",
14+
"expo": "54.0.21",
1515
"expo-font": "^14.0.9",
16-
"next": "^16.0.0",
16+
"next": "^16.0.1",
1717
"node-emoji": "^2.2.0",
1818
"react": "19.2.0",
1919
"react-content-loader": "^7.1.1",
@@ -27,7 +27,7 @@
2727
},
2828
"devDependencies": {
2929
"@expo/next-adapter": "^6.0.0",
30-
"@next/bundle-analyzer": "^16.0.0",
30+
"@next/bundle-analyzer": "^16.0.1",
3131
"@prettier/plugin-oxc": "^0.0.4",
3232
"@types/bun": "^1.3.1",
3333
"@types/react": "^19.2.2",
@@ -37,7 +37,7 @@
3737
"cheerio": "^1.1.2",
3838
"dotenv": "^17.2.3",
3939
"eslint": "^9.38.0",
40-
"eslint-config-next": "^16.0.0",
40+
"eslint-config-next": "^16.0.1",
4141
"eslint-config-universe": "^15.0.3",
4242
"lint-staged": "^16.2.6",
4343
"next-compose-plugins": "^2.2.1",
@@ -270,7 +270,7 @@
270270

271271
"@eslint/plugin-kit": ["@eslint/[email protected]", "", { "dependencies": { "@eslint/core": "^0.16.0", "levn": "^0.4.1" } }, "sha512-sB5uyeq+dwCWyPi31B2gQlVlo+j5brPlWx4yZBrEaRo/nhdDE8Xke1gsGgtiBdaBTxuTkceLVuVt/pclrasb0A=="],
272272

273-
"@expo/cli": ["@expo/[email protected]", "", { "dependencies": { "@0no-co/graphql.web": "^1.0.8", "@expo/code-signing-certificates": "^0.0.5", "@expo/config": "~12.0.10", "@expo/config-plugins": "~54.0.2", "@expo/devcert": "^1.1.2", "@expo/env": "~2.0.7", "@expo/image-utils": "^0.8.7", "@expo/json-file": "^10.0.7", "@expo/mcp-tunnel": "~0.0.7", "@expo/metro": "~54.1.0", "@expo/metro-config": "~54.0.7", "@expo/osascript": "^2.3.7", "@expo/package-manager": "^1.9.8", "@expo/plist": "^0.4.7", "@expo/prebuild-config": "^54.0.6", "@expo/schema-utils": "^0.1.7", "@expo/spawn-async": "^1.7.2", "@expo/ws-tunnel": "^1.0.1", "@expo/xcpretty": "^4.3.0", "@react-native/dev-middleware": "0.81.5", "@urql/core": "^5.0.6", "@urql/exchange-retry": "^1.3.0", "accepts": "^1.3.8", "arg": "^5.0.2", "better-opn": "~3.0.2", "bplist-creator": "0.1.0", "bplist-parser": "^0.3.1", "chalk": "^4.0.0", "ci-info": "^3.3.0", "compression": "^1.7.4", "connect": "^3.7.0", "debug": "^4.3.4", "env-editor": "^0.4.1", "expo-server": "^1.0.2", "freeport-async": "^2.0.0", "getenv": "^2.0.0", "glob": "^10.4.2", "lan-network": "^0.1.6", "minimatch": "^9.0.0", "node-forge": "^1.3.1", "npm-package-arg": "^11.0.0", "ora": "^3.4.0", "picomatch": "^3.0.1", "pretty-bytes": "^5.6.0", "pretty-format": "^29.7.0", "progress": "^2.0.3", "prompts": "^2.3.2", "qrcode-terminal": "0.11.0", "require-from-string": "^2.0.2", "requireg": "^0.2.2", "resolve": "^1.22.2", "resolve-from": "^5.0.0", "resolve.exports": "^2.0.3", "semver": "^7.6.0", "send": "^0.19.0", "slugify": "^1.3.4", "source-map-support": "~0.5.21", "stacktrace-parser": "^0.1.10", "structured-headers": "^0.4.1", "tar": "^7.4.3", "terminal-link": "^2.1.1", "undici": "^6.18.2", "wrap-ansi": "^7.0.0", "ws": "^8.12.1" }, "peerDependencies": { "expo": "*", "expo-router": "*", "react-native": "*" }, "optionalPeers": ["expo-router", "react-native"], "bin": { "expo-internal": "build/bin/cli" } }, "sha512-wUJVTByZzDN0q8UjXDlu6WD2BWoTJCKVVBGUBNmvViDX4FhnESwefmtXPoO54QUUKs6vY89WZryHllGArGfLLw=="],
273+
"@expo/cli": ["@expo/[email protected]", "", { "dependencies": { "@0no-co/graphql.web": "^1.0.8", "@expo/code-signing-certificates": "^0.0.5", "@expo/config": "~12.0.10", "@expo/config-plugins": "~54.0.2", "@expo/devcert": "^1.1.2", "@expo/env": "~2.0.7", "@expo/image-utils": "^0.8.7", "@expo/json-file": "^10.0.7", "@expo/mcp-tunnel": "~0.0.7", "@expo/metro": "~54.1.0", "@expo/metro-config": "~54.0.8", "@expo/osascript": "^2.3.7", "@expo/package-manager": "^1.9.8", "@expo/plist": "^0.4.7", "@expo/prebuild-config": "^54.0.6", "@expo/schema-utils": "^0.1.7", "@expo/spawn-async": "^1.7.2", "@expo/ws-tunnel": "^1.0.1", "@expo/xcpretty": "^4.3.0", "@react-native/dev-middleware": "0.81.5", "@urql/core": "^5.0.6", "@urql/exchange-retry": "^1.3.0", "accepts": "^1.3.8", "arg": "^5.0.2", "better-opn": "~3.0.2", "bplist-creator": "0.1.0", "bplist-parser": "^0.3.1", "chalk": "^4.0.0", "ci-info": "^3.3.0", "compression": "^1.7.4", "connect": "^3.7.0", "debug": "^4.3.4", "env-editor": "^0.4.1", "expo-server": "^1.0.3", "freeport-async": "^2.0.0", "getenv": "^2.0.0", "glob": "^10.4.2", "lan-network": "^0.1.6", "minimatch": "^9.0.0", "node-forge": "^1.3.1", "npm-package-arg": "^11.0.0", "ora": "^3.4.0", "picomatch": "^3.0.1", "pretty-bytes": "^5.6.0", "pretty-format": "^29.7.0", "progress": "^2.0.3", "prompts": "^2.3.2", "qrcode-terminal": "0.11.0", "require-from-string": "^2.0.2", "requireg": "^0.2.2", "resolve": "^1.22.2", "resolve-from": "^5.0.0", "resolve.exports": "^2.0.3", "semver": "^7.6.0", "send": "^0.19.0", "slugify": "^1.3.4", "source-map-support": "~0.5.21", "stacktrace-parser": "^0.1.10", "structured-headers": "^0.4.1", "tar": "^7.4.3", "terminal-link": "^2.1.1", "undici": "^6.18.2", "wrap-ansi": "^7.0.0", "ws": "^8.12.1" }, "peerDependencies": { "expo": "*", "expo-router": "*", "react-native": "*" }, "optionalPeers": ["expo-router", "react-native"], "bin": { "expo-internal": "build/bin/cli" } }, "sha512-M7QW/GHx1FJg+CGgChGKerYXmCGWDskJ8S6w+8m49IBZ41CMDeWRH5snQkFoGCttF8WnzhGiX+nu69AFnEuDHQ=="],
274274

275275
"@expo/code-signing-certificates": ["@expo/[email protected]", "", { "dependencies": { "node-forge": "^1.2.1", "nullthrows": "^1.1.1" } }, "sha512-BNhXkY1bblxKZpltzAx98G2Egj9g1Q+JRcvR7E99DOj862FTCX+ZPsAUtPTr7aHxwtrL7+fL3r0JSmM9kBm+Bw=="],
276276

@@ -300,7 +300,7 @@
300300

301301
"@expo/metro": ["@expo/[email protected]", "", { "dependencies": { "metro": "0.83.2", "metro-babel-transformer": "0.83.2", "metro-cache": "0.83.2", "metro-cache-key": "0.83.2", "metro-config": "0.83.2", "metro-core": "0.83.2", "metro-file-map": "0.83.2", "metro-resolver": "0.83.2", "metro-runtime": "0.83.2", "metro-source-map": "0.83.2", "metro-transform-plugins": "0.83.2", "metro-transform-worker": "0.83.2" } }, "sha512-MgdeRNT/LH0v1wcO0TZp9Qn8zEF0X2ACI0wliPtv5kXVbXWI+yK9GyrstwLAiTXlULKVIg3HVSCCvmLu0M3tnw=="],
302302

303-
"@expo/metro-config": ["@expo/[email protected].7", "", { "dependencies": { "@babel/code-frame": "^7.20.0", "@babel/core": "^7.20.0", "@babel/generator": "^7.20.5", "@expo/config": "~12.0.10", "@expo/env": "~2.0.7", "@expo/json-file": "~10.0.7", "@expo/metro": "~54.1.0", "@expo/spawn-async": "^1.7.2", "browserslist": "^4.25.0", "chalk": "^4.1.0", "debug": "^4.3.2", "dotenv": "~16.4.5", "dotenv-expand": "~11.0.6", "getenv": "^2.0.0", "glob": "^10.4.2", "hermes-parser": "^0.29.1", "jsc-safe-url": "^0.2.4", "lightningcss": "^1.30.1", "minimatch": "^9.0.0", "postcss": "~8.4.32", "resolve-from": "^5.0.0" }, "peerDependencies": { "expo": "*" }, "optionalPeers": ["expo"] }, "sha512-bXluEygLrd7cIh/erpjIIC2xDeanaebcwzF+DUMD5vAqHU3o0QXAF3jRV/LsjXZud9V5eRpyCRZ3tLQL0iv8WA=="],
303+
"@expo/metro-config": ["@expo/[email protected].8", "", { "dependencies": { "@babel/code-frame": "^7.20.0", "@babel/core": "^7.20.0", "@babel/generator": "^7.20.5", "@expo/config": "~12.0.10", "@expo/env": "~2.0.7", "@expo/json-file": "~10.0.7", "@expo/metro": "~54.1.0", "@expo/spawn-async": "^1.7.2", "browserslist": "^4.25.0", "chalk": "^4.1.0", "debug": "^4.3.2", "dotenv": "~16.4.5", "dotenv-expand": "~11.0.6", "getenv": "^2.0.0", "glob": "^10.4.2", "hermes-parser": "^0.29.1", "jsc-safe-url": "^0.2.4", "lightningcss": "^1.30.1", "minimatch": "^9.0.0", "postcss": "~8.4.32", "resolve-from": "^5.0.0" }, "peerDependencies": { "expo": "*" }, "optionalPeers": ["expo"] }, "sha512-rCkDQ8IT6sgcGNy48O2cTE4NlazCAgAIsD5qBsNPJLZSS0XbaILvAgGsFt/4nrx0GMGj6iQcOn5ifwV4NssTmw=="],
304304

305305
"@expo/next-adapter": ["@expo/[email protected]", "", { "peerDependencies": { "expo": ">=46", "react-native-web": "^0.18 || ^0.19", "webpack": "^4.46.0 || ^5.74.0" } }, "sha512-hFAcH6OLIOkLeD0oCoozqcTAxcPK1wYsZO40NSWA+Bi25hF9h/Az6SlLSNOtYv+tyCF5iAHT/rwWsDNlUyxDmg=="],
306306

@@ -1112,7 +1112,7 @@
11121112

11131113
"exec-async": ["[email protected]", "", {}, "sha512-87OpwcEiMia/DeiKFzaQNBNFeN3XkkpYIh9FyOqq5mS2oKv3CBE67PXoEKcr6nodWdXNogTiQ0jE2NGuoffXPw=="],
11141114

1115-
"expo": ["[email protected]", "", { "dependencies": { "@babel/runtime": "^7.20.0", "@expo/cli": "54.0.13", "@expo/config": "~12.0.10", "@expo/config-plugins": "~54.0.2", "@expo/devtools": "0.1.7", "@expo/fingerprint": "0.15.2", "@expo/metro": "~54.1.0", "@expo/metro-config": "54.0.7", "@expo/vector-icons": "^15.0.3", "@ungap/structured-clone": "^1.3.0", "babel-preset-expo": "~54.0.6", "expo-asset": "~12.0.9", "expo-constants": "~18.0.10", "expo-file-system": "~19.0.17", "expo-font": "~14.0.9", "expo-keep-awake": "~15.0.7", "expo-modules-autolinking": "3.0.19", "expo-modules-core": "3.0.22", "pretty-format": "^29.7.0", "react-refresh": "^0.14.2", "whatwg-url-without-unicode": "8.0.0-3" }, "peerDependencies": { "@expo/dom-webview": "*", "@expo/metro-runtime": "*", "react": "*", "react-native": "*", "react-native-webview": "*" }, "optionalPeers": ["@expo/dom-webview", "@expo/metro-runtime", "react-native-webview"], "bin": { "expo": "bin/cli", "fingerprint": "bin/fingerprint", "expo-modules-autolinking": "bin/autolinking" } }, "sha512-mWHky+H63W60P5Oo+VbtqzF2sLvdaoSSwG57H9rlq1DrgIla++QJZuwJkXXo55lYPymVmkVhwG6FjWYKKylwpw=="],
1115+
"expo": ["[email protected]", "", { "dependencies": { "@babel/runtime": "^7.20.0", "@expo/cli": "54.0.14", "@expo/config": "~12.0.10", "@expo/config-plugins": "~54.0.2", "@expo/devtools": "0.1.7", "@expo/fingerprint": "0.15.2", "@expo/metro": "~54.1.0", "@expo/metro-config": "54.0.8", "@expo/vector-icons": "^15.0.3", "@ungap/structured-clone": "^1.3.0", "babel-preset-expo": "~54.0.6", "expo-asset": "~12.0.9", "expo-constants": "~18.0.10", "expo-file-system": "~19.0.17", "expo-font": "~14.0.9", "expo-keep-awake": "~15.0.7", "expo-modules-autolinking": "3.0.19", "expo-modules-core": "3.0.23", "pretty-format": "^29.7.0", "react-refresh": "^0.14.2", "whatwg-url-without-unicode": "8.0.0-3" }, "peerDependencies": { "@expo/dom-webview": "*", "@expo/metro-runtime": "*", "react": "*", "react-native": "*", "react-native-webview": "*" }, "optionalPeers": ["@expo/dom-webview", "@expo/metro-runtime", "react-native-webview"], "bin": { "expo": "bin/cli", "fingerprint": "bin/fingerprint", "expo-modules-autolinking": "bin/autolinking" } }, "sha512-I3kzMNW/43a71pt6hT0Zebd2zAPIMMeucUDDEdfUKYrzzTRwISZfVAv0dp8GWKHHDjZsy+FjE4RQCMdyKmiDeQ=="],
11161116

11171117
"expo-asset": ["[email protected]", "", { "dependencies": { "@expo/image-utils": "^0.8.7", "expo-constants": "~18.0.9" }, "peerDependencies": { "expo": "*", "react": "*", "react-native": "*" } }, "sha512-vrdRoyhGhBmd0nJcssTSk1Ypx3Mbn/eXaaBCQVkL0MJ8IOZpAObAjfD5CTy8+8RofcHEQdh3wwZVCs7crvfOeg=="],
11181118

@@ -1126,11 +1126,11 @@
11261126

11271127
"expo-modules-autolinking": ["[email protected]", "", { "dependencies": { "@expo/spawn-async": "^1.7.2", "chalk": "^4.1.0", "commander": "^7.2.0", "glob": "^10.4.2", "require-from-string": "^2.0.2", "resolve-from": "^5.0.0" }, "bin": { "expo-modules-autolinking": "bin/expo-modules-autolinking.js" } }, "sha512-tSMYGnfZmAaN77X8iMLiaSgbCFnA7eh6s2ac09J2N2N0Rcf2RCE27jg0c0XenTMTWUcM4QvLhsNHof/WtlKqPw=="],
11281128

1129-
"expo-modules-core": ["[email protected].22", "", { "dependencies": { "invariant": "^2.2.4" }, "peerDependencies": { "react": "*", "react-native": "*" } }, "sha512-FqG5oelITFTLcIfGwoJP8Qsk65be/eiEjz354NdAurnhFARHAVYOOIsUehArvm75ISdZOIZEaTSjCudmkA3kKg=="],
1129+
"expo-modules-core": ["[email protected].23", "", { "dependencies": { "invariant": "^2.2.4" }, "peerDependencies": { "react": "*", "react-native": "*" } }, "sha512-NYHi5LK/cdIyOjK9ZQAgfDPCOqER26cIbU3gzsce7YdnsmlNFR0qMfWOj9zAmaFBviC2kCkCOmitwk4357Td3Q=="],
11301130

11311131
"expo-screen-orientation": ["[email protected]", "", { "peerDependencies": { "expo": "*", "react-native": "*" } }, "sha512-nYwadYtdU6mMDk0MCHMPPPQtBoeFYJ2FspLRW+J35CMLqzE4nbpwGeiImfXzkvD94fpOCfI4KgLj5vGauC3pfA=="],
11321132

1133-
"expo-server": ["[email protected].2", "", {}, "sha512-QlQLjFuwgCiBc+Qq0IyBBHiZK1RS0NJSsKVB5iECMJrR04q7PhkaF7dON0fhvo00COy4fT9rJ5brrJDpFro/gA=="],
1133+
"expo-server": ["[email protected].3", "", {}, "sha512-SOwdzM/BFAL+vTFlUDJG6ljhyk6TyTl+LRK3ubGmN+Pf18ENRqKj37U8krc5vH926sAsB3IFcE8kJEYf4dG7PA=="],
11341134

11351135
"exponential-backoff": ["[email protected]", "", {}, "sha512-8QxYTVXUkuy7fIIoitQkPwGonB8F3Zj8eEO8Sqg9Zv/bkI7RJAzowee4gr81Hak/dUTpA2Z7VfQgoijjPNlUZA=="],
11361136

components/CompatibilityTags.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ export function CompatibilityTags({ library }: Props) {
6464
/>
6565
) : null
6666
)}
67-
{(library.expoGo || library.fireos || library.vegaos) && (
67+
{(library.expoGo || library.fireos || library.vegaos || library.horizon) && (
6868
<Tooltip
6969
side="bottom"
7070
trigger={
@@ -77,6 +77,7 @@ export function CompatibilityTags({ library }: Props) {
7777
<ul style={styles.compatibilityList}>
7878
{library.expoGo && <li>Works with Expo Go</li>}
7979
{library.fireos && <li>Works with Fire OS</li>}
80+
{library.horizon && <li>Works with Meta Horizon OS</li>}
8081
{library.vegaos && typeof library.vegaos === 'boolean' && <li>Works with Vega OS</li>}
8182
{library.vegaos && typeof library.vegaos === 'string' && (
8283
<li>

components/Filters/helpers.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,10 @@ export const FILTER_COMPATIBILITY: FilterParamsType[] = [
8787
param: 'fireos',
8888
title: 'Works with Fire OS',
8989
},
90+
{
91+
param: 'horizon',
92+
title: 'Works with Meta Horizon OS',
93+
},
9094
{
9195
param: 'vegaos',
9296
title: 'Works with Vega OS',

pages/api/libraries/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ export default function handler(req: NextApiRequest, res: NextApiResponse) {
7373
macos: parsedQuery.macos,
7474
expoGo: parsedQuery.expoGo,
7575
fireos: parsedQuery.fireos,
76+
horizon: parsedQuery.horizon,
7677
tvos: parsedQuery.tvos,
7778
visionos: parsedQuery.visionos,
7879
vegaos: parsedQuery.vegaos,

react-native-libraries.json

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17949,5 +17949,24 @@
1794917949
"ios": true,
1795017950
"android": true,
1795117951
"newArchitecture": true
17952+
},
17953+
{
17954+
"githubUrl": "https://github.com/software-mansion-labs/expo-horizon/tree/main/expo-horizon-core",
17955+
"examples": ["https://github.com/software-mansion-labs/expo-horizon/tree/main/example"],
17956+
"android": true,
17957+
"horizon": true,
17958+
"newArchitecture": true
17959+
},
17960+
{
17961+
"githubUrl": "https://github.com/software-mansion-labs/expo-horizon/tree/main/expo-horizon-location",
17962+
"android": true,
17963+
"horizon": true,
17964+
"newArchitecture": true
17965+
},
17966+
{
17967+
"githubUrl": "https://github.com/software-mansion-labs/expo-horizon/tree/main/expo-horizon-notifications",
17968+
"android": true,
17969+
"horizon": true,
17970+
"newArchitecture": true
1795217971
}
1795317972
]

react-native-libraries.schema.json

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,15 @@
7676
true
7777
]
7878
},
79+
"horizon": {
80+
"$id": "#/items/properties/horizon",
81+
"type": "boolean",
82+
"title": "Package is compatible with Meta Horizon OS",
83+
"default": false,
84+
"examples": [
85+
true
86+
]
87+
},
7988
"vegaos": {
8089
"$id": "#/items/properties/vegaos",
8190
"type": [

types/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ export type Query = {
2626
tvos?: string;
2727
visionos?: string;
2828
vegaos?: string;
29+
horizon?: string;
2930
web?: string;
3031
windows?: string;
3132
order?: QueryOrder;
@@ -137,6 +138,7 @@ export type LibraryDataEntryType = {
137138
windows?: boolean;
138139
macos?: boolean;
139140
fireos?: boolean;
141+
horizon?: boolean;
140142
tvos?: boolean;
141143
visionos?: boolean;
142144
vegaos?: boolean | string;

util/Constants.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ export const VALID_ENTRY_KEYS = new Set([
99
'windows',
1010
'macos',
1111
'fireos',
12+
'horizon',
1213
'tvos',
1314
'visionos',
1415
'vegaos',

util/search.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,10 @@ export function handleFilterLibraries({
161161
return false;
162162
}
163163

164+
if (support.horizon && !library.horizon) {
165+
return false;
166+
}
167+
164168
if (support.expoGo && !library.expoGo) {
165169
return false;
166170
}

0 commit comments

Comments
 (0)