@ankhorage/expo-runtime 3.0.13 → 3.1.0

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.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # @ankhorage/expo-runtime
2
2
 
3
+ ## 3.1.0
4
+
5
+ ### Minor Changes
6
+
7
+ - 955498a: Expose the five canonical static icon provider packages through the Expo platform contract, including Material Design Icons.
8
+
3
9
  ## 3.0.13
4
10
 
5
11
  ### Patch Changes
package/README.md CHANGED
@@ -3,7 +3,7 @@
3
3
 
4
4
  # EXPO-RUNTIME
5
5
 
6
- ![license: MIT](././paradox/badges/license.svg) ![npm: v3.0.11](././paradox/badges/npm.svg) ![runtime: bun](././paradox/badges/runtime.svg) ![typescript: strict](././paradox/badges/typescript.svg) ![eslint: checked](././paradox/badges/eslint.svg) ![prettier: checked](././paradox/badges/prettier.svg) ![build: checked](././paradox/badges/build.svg) ![tests: checked](././paradox/badges/tests.svg) ![docs: paradox](././paradox/badges/docs.svg)
6
+ ![license: MIT](././paradox/badges/license.svg) ![npm: v3.0.12](././paradox/badges/npm.svg) ![runtime: bun](././paradox/badges/runtime.svg) ![typescript: strict](././paradox/badges/typescript.svg) ![eslint: checked](././paradox/badges/eslint.svg) ![prettier: checked](././paradox/badges/prettier.svg) ![build: checked](././paradox/badges/build.svg) ![tests: checked](././paradox/badges/tests.svg) ![docs: paradox](././paradox/badges/docs.svg)
7
7
 
8
8
  Declarative runtime integration for Expo apps: maps app capabilities to permissions, packages, config plugins, providers, and adapters
9
9
 
@@ -1 +1 @@
1
- {"version":3,"file":"ExpoZoraIconFontProvider.web.d.ts","sourceRoot":"","sources":["../src/ExpoZoraIconFontProvider.web.tsx"],"names":[],"mappings":"AASA,OAAO,KAAK,MAAM,OAAO,CAAC;AAa1B,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,CAAC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CACpC;AAED,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,6BAA6B,4BAY5E"}
1
+ {"version":3,"file":"ExpoZoraIconFontProvider.web.d.ts","sourceRoot":"","sources":["../src/ExpoZoraIconFontProvider.web.tsx"],"names":[],"mappings":"AAUA,OAAO,KAAK,MAAM,OAAO,CAAC;AAc1B,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,CAAC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CACpC;AAED,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,6BAA6B,4BAY5E"}
@@ -6,6 +6,7 @@ import fontAwesome6Brands from '@react-native-vector-icons/fontawesome6/fonts/Fo
6
6
  import fontAwesome6Regular from '@react-native-vector-icons/fontawesome6/fonts/FontAwesome6_Regular.ttf';
7
7
  import fontAwesome6Solid from '@react-native-vector-icons/fontawesome6/fonts/FontAwesome6_Solid.ttf';
8
8
  import ionicons from '@react-native-vector-icons/ionicons/fonts/Ionicons.ttf';
9
+ import materialDesignIcons from '@react-native-vector-icons/material-design-icons/fonts/MaterialDesignIcons.ttf';
9
10
  import { useFonts } from 'expo-font';
10
11
  import React from 'react';
11
12
  const ZORA_ICON_FONTS = {
@@ -17,6 +18,7 @@ const ZORA_ICON_FONTS = {
17
18
  'FontAwesome6Free-Regular': fontAwesome6Regular,
18
19
  'FontAwesome6Free-Solid': fontAwesome6Solid,
19
20
  Ionicons: ionicons,
21
+ MaterialDesignIcons: materialDesignIcons,
20
22
  };
21
23
  export function ExpoZoraIconFontProvider(props) {
22
24
  const [loaded, error] = useFonts(ZORA_ICON_FONTS);
@@ -1 +1 @@
1
- {"version":3,"file":"ExpoZoraIconFontProvider.web.js","sourceRoot":"","sources":["../src/ExpoZoraIconFontProvider.web.tsx"],"names":[],"mappings":"AAAA,OAAO,WAAW,MAAM,8DAA8D,CAAC;AACvF,OAAO,kBAAkB,MAAM,uEAAuE,CAAC;AACvG,OAAO,mBAAmB,MAAM,wEAAwE,CAAC;AACzG,OAAO,iBAAiB,MAAM,sEAAsE,CAAC;AACrG,OAAO,kBAAkB,MAAM,uEAAuE,CAAC;AACvG,OAAO,mBAAmB,MAAM,wEAAwE,CAAC;AACzG,OAAO,iBAAiB,MAAM,sEAAsE,CAAC;AACrG,OAAO,QAAQ,MAAM,wDAAwD,CAAC;AAC9E,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,eAAe,GAAG;IACtB,WAAW,EAAE,WAAW;IACxB,4BAA4B,EAAE,kBAAkB;IAChD,0BAA0B,EAAE,mBAAmB;IAC/C,wBAAwB,EAAE,iBAAiB;IAC3C,4BAA4B,EAAE,kBAAkB;IAChD,0BAA0B,EAAE,mBAAmB;IAC/C,wBAAwB,EAAE,iBAAiB;IAC3C,QAAQ,EAAE,QAAQ;CACV,CAAC;AAMX,MAAM,UAAU,wBAAwB,CAAC,KAAoC;IAC3E,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,GAAG,QAAQ,CAAC,eAAe,CAAC,CAAC;IAElD,IAAI,KAAK,EAAE,CAAC;QACV,MAAM,KAAK,CAAC;IACd,CAAC;IAED,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC;AAC/B,CAAC","sourcesContent":["import fontAwesome from '@react-native-vector-icons/fontawesome/fonts/FontAwesome.ttf';\nimport fontAwesome5Brands from '@react-native-vector-icons/fontawesome5/fonts/FontAwesome5_Brands.ttf';\nimport fontAwesome5Regular from '@react-native-vector-icons/fontawesome5/fonts/FontAwesome5_Regular.ttf';\nimport fontAwesome5Solid from '@react-native-vector-icons/fontawesome5/fonts/FontAwesome5_Solid.ttf';\nimport fontAwesome6Brands from '@react-native-vector-icons/fontawesome6/fonts/FontAwesome6_Brands.ttf';\nimport fontAwesome6Regular from '@react-native-vector-icons/fontawesome6/fonts/FontAwesome6_Regular.ttf';\nimport fontAwesome6Solid from '@react-native-vector-icons/fontawesome6/fonts/FontAwesome6_Solid.ttf';\nimport ionicons from '@react-native-vector-icons/ionicons/fonts/Ionicons.ttf';\nimport { useFonts } from 'expo-font';\nimport React from 'react';\n\nconst ZORA_ICON_FONTS = {\n FontAwesome: fontAwesome,\n 'FontAwesome5Brands-Regular': fontAwesome5Brands,\n 'FontAwesome5Free-Regular': fontAwesome5Regular,\n 'FontAwesome5Free-Solid': fontAwesome5Solid,\n 'FontAwesome6Brands-Regular': fontAwesome6Brands,\n 'FontAwesome6Free-Regular': fontAwesome6Regular,\n 'FontAwesome6Free-Solid': fontAwesome6Solid,\n Ionicons: ionicons,\n} as const;\n\nexport interface ExpoZoraIconFontProviderProps {\n readonly children: React.ReactNode;\n}\n\nexport function ExpoZoraIconFontProvider(props: ExpoZoraIconFontProviderProps) {\n const [loaded, error] = useFonts(ZORA_ICON_FONTS);\n\n if (error) {\n throw error;\n }\n\n if (!loaded) {\n return null;\n }\n\n return <>{props.children}</>;\n}\n"]}
1
+ {"version":3,"file":"ExpoZoraIconFontProvider.web.js","sourceRoot":"","sources":["../src/ExpoZoraIconFontProvider.web.tsx"],"names":[],"mappings":"AAAA,OAAO,WAAW,MAAM,8DAA8D,CAAC;AACvF,OAAO,kBAAkB,MAAM,uEAAuE,CAAC;AACvG,OAAO,mBAAmB,MAAM,wEAAwE,CAAC;AACzG,OAAO,iBAAiB,MAAM,sEAAsE,CAAC;AACrG,OAAO,kBAAkB,MAAM,uEAAuE,CAAC;AACvG,OAAO,mBAAmB,MAAM,wEAAwE,CAAC;AACzG,OAAO,iBAAiB,MAAM,sEAAsE,CAAC;AACrG,OAAO,QAAQ,MAAM,wDAAwD,CAAC;AAC9E,OAAO,mBAAmB,MAAM,gFAAgF,CAAC;AACjH,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,eAAe,GAAG;IACtB,WAAW,EAAE,WAAW;IACxB,4BAA4B,EAAE,kBAAkB;IAChD,0BAA0B,EAAE,mBAAmB;IAC/C,wBAAwB,EAAE,iBAAiB;IAC3C,4BAA4B,EAAE,kBAAkB;IAChD,0BAA0B,EAAE,mBAAmB;IAC/C,wBAAwB,EAAE,iBAAiB;IAC3C,QAAQ,EAAE,QAAQ;IAClB,mBAAmB,EAAE,mBAAmB;CAChC,CAAC;AAMX,MAAM,UAAU,wBAAwB,CAAC,KAAoC;IAC3E,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,GAAG,QAAQ,CAAC,eAAe,CAAC,CAAC;IAElD,IAAI,KAAK,EAAE,CAAC;QACV,MAAM,KAAK,CAAC;IACd,CAAC;IAED,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC;AAC/B,CAAC","sourcesContent":["import fontAwesome from '@react-native-vector-icons/fontawesome/fonts/FontAwesome.ttf';\nimport fontAwesome5Brands from '@react-native-vector-icons/fontawesome5/fonts/FontAwesome5_Brands.ttf';\nimport fontAwesome5Regular from '@react-native-vector-icons/fontawesome5/fonts/FontAwesome5_Regular.ttf';\nimport fontAwesome5Solid from '@react-native-vector-icons/fontawesome5/fonts/FontAwesome5_Solid.ttf';\nimport fontAwesome6Brands from '@react-native-vector-icons/fontawesome6/fonts/FontAwesome6_Brands.ttf';\nimport fontAwesome6Regular from '@react-native-vector-icons/fontawesome6/fonts/FontAwesome6_Regular.ttf';\nimport fontAwesome6Solid from '@react-native-vector-icons/fontawesome6/fonts/FontAwesome6_Solid.ttf';\nimport ionicons from '@react-native-vector-icons/ionicons/fonts/Ionicons.ttf';\nimport materialDesignIcons from '@react-native-vector-icons/material-design-icons/fonts/MaterialDesignIcons.ttf';\nimport { useFonts } from 'expo-font';\nimport React from 'react';\n\nconst ZORA_ICON_FONTS = {\n FontAwesome: fontAwesome,\n 'FontAwesome5Brands-Regular': fontAwesome5Brands,\n 'FontAwesome5Free-Regular': fontAwesome5Regular,\n 'FontAwesome5Free-Solid': fontAwesome5Solid,\n 'FontAwesome6Brands-Regular': fontAwesome6Brands,\n 'FontAwesome6Free-Regular': fontAwesome6Regular,\n 'FontAwesome6Free-Solid': fontAwesome6Solid,\n Ionicons: ionicons,\n MaterialDesignIcons: materialDesignIcons,\n} as const;\n\nexport interface ExpoZoraIconFontProviderProps {\n readonly children: React.ReactNode;\n}\n\nexport function ExpoZoraIconFontProvider(props: ExpoZoraIconFontProviderProps) {\n const [loaded, error] = useFonts(ZORA_ICON_FONTS);\n\n if (error) {\n throw error;\n }\n\n if (!loaded) {\n return null;\n }\n\n return <>{props.children}</>;\n}\n"]}
@@ -40,6 +40,13 @@ export declare const EXPO_PLATFORM: {
40
40
  };
41
41
  readonly ui: {
42
42
  readonly svg: ExpoPlatformPackage;
43
+ readonly iconProviders: {
44
+ readonly Ionicons: ExpoPlatformPackage;
45
+ readonly FontAwesome: ExpoPlatformPackage;
46
+ readonly FontAwesome5: ExpoPlatformPackage;
47
+ readonly FontAwesome6: ExpoPlatformPackage;
48
+ readonly MaterialDesignIcons: ExpoPlatformPackage;
49
+ };
43
50
  };
44
51
  readonly packages: {
45
52
  readonly metroRuntime: ExpoPlatformPackage;
@@ -1 +1 @@
1
- {"version":3,"file":"platform.d.ts","sourceRoot":"","sources":["../src/platform.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAMD;;;;;;GAMG;AACH,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsEhB,CAAC;AAEX,MAAM,MAAM,YAAY,GAAG,OAAO,aAAa,CAAC"}
1
+ {"version":3,"file":"platform.d.ts","sourceRoot":"","sources":["../src/platform.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAMD;;;;;;GAMG;AACH,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgFhB,CAAC;AAEX,MAAM,MAAM,YAAY,GAAG,OAAO,aAAa,CAAC"}
package/dist/platform.js CHANGED
@@ -39,6 +39,13 @@ export const EXPO_PLATFORM = {
39
39
  },
40
40
  ui: {
41
41
  svg: definePackage('react-native-svg', '15.15.4'),
42
+ iconProviders: {
43
+ Ionicons: definePackage('@react-native-vector-icons/ionicons', '^13.1.3'),
44
+ FontAwesome: definePackage('@react-native-vector-icons/fontawesome', '^13.1.3'),
45
+ FontAwesome5: definePackage('@react-native-vector-icons/fontawesome5', '^13.1.3'),
46
+ FontAwesome6: definePackage('@react-native-vector-icons/fontawesome6', '^13.1.3'),
47
+ MaterialDesignIcons: definePackage('@react-native-vector-icons/material-design-icons', '^13.1.3'),
48
+ },
42
49
  },
43
50
  packages: {
44
51
  metroRuntime: definePackage('@expo/metro-runtime', '~57.0.14'),
@@ -1 +1 @@
1
- {"version":3,"file":"platform.js","sourceRoot":"","sources":["../src/platform.ts"],"names":[],"mappings":"AAKA,SAAS,aAAa,CAAC,IAAY,EAAE,OAAe;IAClD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;AAC3B,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,GAAG,EAAE,EAAE;IACP,YAAY,EAAE,uBAAuB;IACrC,OAAO,EAAE;QACP,IAAI,EAAE,aAAa,CAAC,MAAM,EAAE,SAAS,CAAC;QACtC,KAAK,EAAE,aAAa,CAAC,OAAO,EAAE,QAAQ,CAAC;QACvC,QAAQ,EAAE,aAAa,CAAC,WAAW,EAAE,QAAQ,CAAC;QAC9C,WAAW,EAAE,aAAa,CAAC,cAAc,EAAE,QAAQ,CAAC;QACpD,cAAc,EAAE,aAAa,CAAC,kBAAkB,EAAE,SAAS,CAAC;KAC7D;IACD,OAAO,EAAE;QACP,IAAI,EAAE;YACJ,GAAG,EAAE,EAAE;YACP,OAAO,EAAE,MAAM;SAChB;QACD,SAAS,EAAE,aAAa,CAAC,aAAa,EAAE,UAAU,CAAC;QACnD,UAAU,EAAE,aAAa,CAAC,YAAY,EAAE,QAAQ,CAAC;QACjD,UAAU,EAAE,aAAa,CAAC,aAAa,EAAE,QAAQ,CAAC;KACnD;IACD,UAAU,EAAE;QACV,UAAU,EAAE,aAAa,CAAC,aAAa,EAAE,UAAU,CAAC;QACpD,OAAO,EAAE,aAAa,CAAC,sBAAsB,EAAE,SAAS,CAAC;QACzD,QAAQ,EAAE,aAAa,CAAC,gCAAgC,EAAE,QAAQ,CAAC;KACpE;IACD,SAAS,EAAE;QACT,UAAU,EAAE,aAAa,CAAC,yBAAyB,EAAE,OAAO,CAAC;QAC7D,QAAQ,EAAE,aAAa,CAAC,uBAAuB,EAAE,QAAQ,CAAC;QAC1D,cAAc,EAAE,aAAa,CAAC,8BAA8B,EAAE,SAAS,CAAC;KACzE;IACD,EAAE,EAAE;QACF,GAAG,EAAE,aAAa,CAAC,kBAAkB,EAAE,SAAS,CAAC;KAClD;IACD,QAAQ,EAAE;QACR,YAAY,EAAE,aAAa,CAAC,qBAAqB,EAAE,UAAU,CAAC;QAC9D,KAAK,EAAE,aAAa,CAAC,YAAY,EAAE,UAAU,CAAC;QAC9C,KAAK,EAAE,aAAa,CAAC,YAAY,EAAE,SAAS,CAAC;QAC7C,WAAW,EAAE,aAAa,CAAC,mBAAmB,EAAE,UAAU,CAAC;QAC3D,MAAM,EAAE,aAAa,CAAC,aAAa,EAAE,SAAS,CAAC;QAC/C,SAAS,EAAE,aAAa,CAAC,gBAAgB,EAAE,UAAU,CAAC;QACtD,MAAM,EAAE,aAAa,CAAC,aAAa,EAAE,SAAS,CAAC;QAC/C,SAAS,EAAE,aAAa,CAAC,iBAAiB,EAAE,UAAU,CAAC;QACvD,cAAc,EAAE,aAAa,CAAC,sBAAsB,EAAE,SAAS,CAAC;QAChE,UAAU,EAAE,aAAa,CAAC,kBAAkB,EAAE,SAAS,CAAC;QACxD,IAAI,EAAE,aAAa,CAAC,WAAW,EAAE,SAAS,CAAC;QAC3C,WAAW,EAAE,aAAa,CAAC,mBAAmB,EAAE,UAAU,CAAC;QAC3D,cAAc,EAAE,aAAa,CAAC,sBAAsB,EAAE,SAAS,CAAC;QAChE,OAAO,EAAE,aAAa,CAAC,cAAc,EAAE,SAAS,CAAC;QACjD,YAAY,EAAE,aAAa,CAAC,mBAAmB,EAAE,SAAS,CAAC;QAC3D,QAAQ,EAAE,aAAa,CAAC,eAAe,EAAE,UAAU,CAAC;QACpD,YAAY,EAAE,aAAa,CAAC,oBAAoB,EAAE,SAAS,CAAC;QAC5D,aAAa,EAAE,aAAa,CAAC,oBAAoB,EAAE,UAAU,CAAC;QAC9D,WAAW,EAAE,aAAa,CAAC,mBAAmB,EAAE,SAAS,CAAC;QAC1D,YAAY,EAAE,aAAa,CAAC,oBAAoB,EAAE,SAAS,CAAC;QAC5D,SAAS,EAAE,aAAa,CAAC,iBAAiB,EAAE,SAAS,CAAC;QACtD,OAAO,EAAE,aAAa,CAAC,cAAc,EAAE,UAAU,CAAC;QAClD,UAAU,EAAE,aAAa,CAAC,kBAAkB,EAAE,SAAS,CAAC;KACzD;IACD,SAAS,EAAE;QACT,OAAO,EAAE;YACP,cAAc,EAAE,CAAC;YACjB,eAAe,EAAE,EAAE;YACnB,UAAU,EAAE,EAAE;YACd,SAAS,EAAE,EAAE;YACb,UAAU,EAAE,IAAI;SACjB;QACD,GAAG,EAAE;YACH,cAAc,EAAE,MAAM;YACtB,mBAAmB,EAAE,MAAM;SAC5B;KACF;CACO,CAAC","sourcesContent":["export interface ExpoPlatformPackage {\n readonly name: string;\n readonly version: string;\n}\n\nfunction definePackage(name: string, version: string): ExpoPlatformPackage {\n return { name, version };\n}\n\n/**\n * The canonical Ankhorage projection of the supported Expo platform.\n *\n * Package versions come from Expo SDK 57's bundled native module map. Keep this\n * structure as the only hand-maintained Expo compatibility authority in this\n * repository; generated manifests and runtime planning derive from it.\n */\nexport const EXPO_PLATFORM = {\n sdk: 57,\n architecture: 'new-architecture-only',\n runtime: {\n expo: definePackage('expo', '57.0.18'),\n react: definePackage('react', '19.2.3'),\n reactDom: definePackage('react-dom', '19.2.3'),\n reactNative: definePackage('react-native', '0.86.3'),\n reactNativeWeb: definePackage('react-native-web', '~0.21.0'),\n },\n tooling: {\n node: {\n lts: 24,\n version: '24.x',\n },\n nodeTypes: definePackage('@types/node', '^24.13.3'),\n typescript: definePackage('typescript', '~6.0.3'),\n expoDoctor: definePackage('expo-doctor', '1.20.4'),\n },\n navigation: {\n expoRouter: definePackage('expo-router', '~57.0.17'),\n screens: definePackage('react-native-screens', '~4.26.0'),\n safeArea: definePackage('react-native-safe-area-context', '~5.7.0'),\n },\n animation: {\n reanimated: definePackage('react-native-reanimated', '4.5.1'),\n worklets: definePackage('react-native-worklets', '0.10.1'),\n gestureHandler: definePackage('react-native-gesture-handler', '~2.32.0'),\n },\n ui: {\n svg: definePackage('react-native-svg', '15.15.4'),\n },\n packages: {\n metroRuntime: definePackage('@expo/metro-runtime', '~57.0.14'),\n asset: definePackage('expo-asset', '~57.0.15'),\n audio: definePackage('expo-audio', '~57.0.4'),\n authSession: definePackage('expo-auth-session', '~57.0.10'),\n camera: definePackage('expo-camera', '~57.0.4'),\n constants: definePackage('expo-constants', '~57.0.16'),\n crypto: definePackage('expo-crypto', '~57.0.2'),\n devClient: definePackage('expo-dev-client', '~57.0.16'),\n documentPicker: definePackage('expo-document-picker', '~57.0.1'),\n fileSystem: definePackage('expo-file-system', '~57.0.6'),\n font: definePackage('expo-font', '~57.0.2'),\n imagePicker: definePackage('expo-image-picker', '~57.0.14'),\n linearGradient: definePackage('expo-linear-gradient', '~57.0.1'),\n linking: definePackage('expo-linking', '~57.0.8'),\n localization: definePackage('expo-localization', '~57.0.1'),\n location: definePackage('expo-location', '~57.0.14'),\n mediaLibrary: definePackage('expo-media-library', '~57.0.4'),\n notifications: definePackage('expo-notifications', '~57.0.15'),\n secureStore: definePackage('expo-secure-store', '~57.0.2'),\n splashScreen: definePackage('expo-splash-screen', '~57.0.8'),\n statusBar: definePackage('expo-status-bar', '~57.0.1'),\n updates: definePackage('expo-updates', '~57.0.19'),\n webBrowser: definePackage('expo-web-browser', '~57.0.2'),\n },\n platforms: {\n android: {\n minimumVersion: 7,\n minimumApiLevel: 24,\n compileSdk: 36,\n targetSdk: 36,\n edgeToEdge: true,\n },\n ios: {\n minimumVersion: '16.4',\n minimumXcodeVersion: '26.4',\n },\n },\n} as const;\n\nexport type ExpoPlatform = typeof EXPO_PLATFORM;\n"]}
1
+ {"version":3,"file":"platform.js","sourceRoot":"","sources":["../src/platform.ts"],"names":[],"mappings":"AAKA,SAAS,aAAa,CAAC,IAAY,EAAE,OAAe;IAClD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;AAC3B,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,GAAG,EAAE,EAAE;IACP,YAAY,EAAE,uBAAuB;IACrC,OAAO,EAAE;QACP,IAAI,EAAE,aAAa,CAAC,MAAM,EAAE,SAAS,CAAC;QACtC,KAAK,EAAE,aAAa,CAAC,OAAO,EAAE,QAAQ,CAAC;QACvC,QAAQ,EAAE,aAAa,CAAC,WAAW,EAAE,QAAQ,CAAC;QAC9C,WAAW,EAAE,aAAa,CAAC,cAAc,EAAE,QAAQ,CAAC;QACpD,cAAc,EAAE,aAAa,CAAC,kBAAkB,EAAE,SAAS,CAAC;KAC7D;IACD,OAAO,EAAE;QACP,IAAI,EAAE;YACJ,GAAG,EAAE,EAAE;YACP,OAAO,EAAE,MAAM;SAChB;QACD,SAAS,EAAE,aAAa,CAAC,aAAa,EAAE,UAAU,CAAC;QACnD,UAAU,EAAE,aAAa,CAAC,YAAY,EAAE,QAAQ,CAAC;QACjD,UAAU,EAAE,aAAa,CAAC,aAAa,EAAE,QAAQ,CAAC;KACnD;IACD,UAAU,EAAE;QACV,UAAU,EAAE,aAAa,CAAC,aAAa,EAAE,UAAU,CAAC;QACpD,OAAO,EAAE,aAAa,CAAC,sBAAsB,EAAE,SAAS,CAAC;QACzD,QAAQ,EAAE,aAAa,CAAC,gCAAgC,EAAE,QAAQ,CAAC;KACpE;IACD,SAAS,EAAE;QACT,UAAU,EAAE,aAAa,CAAC,yBAAyB,EAAE,OAAO,CAAC;QAC7D,QAAQ,EAAE,aAAa,CAAC,uBAAuB,EAAE,QAAQ,CAAC;QAC1D,cAAc,EAAE,aAAa,CAAC,8BAA8B,EAAE,SAAS,CAAC;KACzE;IACD,EAAE,EAAE;QACF,GAAG,EAAE,aAAa,CAAC,kBAAkB,EAAE,SAAS,CAAC;QACjD,aAAa,EAAE;YACb,QAAQ,EAAE,aAAa,CAAC,qCAAqC,EAAE,SAAS,CAAC;YACzE,WAAW,EAAE,aAAa,CAAC,wCAAwC,EAAE,SAAS,CAAC;YAC/E,YAAY,EAAE,aAAa,CAAC,yCAAyC,EAAE,SAAS,CAAC;YACjF,YAAY,EAAE,aAAa,CAAC,yCAAyC,EAAE,SAAS,CAAC;YACjF,mBAAmB,EAAE,aAAa,CAChC,kDAAkD,EAClD,SAAS,CACV;SACF;KACF;IACD,QAAQ,EAAE;QACR,YAAY,EAAE,aAAa,CAAC,qBAAqB,EAAE,UAAU,CAAC;QAC9D,KAAK,EAAE,aAAa,CAAC,YAAY,EAAE,UAAU,CAAC;QAC9C,KAAK,EAAE,aAAa,CAAC,YAAY,EAAE,SAAS,CAAC;QAC7C,WAAW,EAAE,aAAa,CAAC,mBAAmB,EAAE,UAAU,CAAC;QAC3D,MAAM,EAAE,aAAa,CAAC,aAAa,EAAE,SAAS,CAAC;QAC/C,SAAS,EAAE,aAAa,CAAC,gBAAgB,EAAE,UAAU,CAAC;QACtD,MAAM,EAAE,aAAa,CAAC,aAAa,EAAE,SAAS,CAAC;QAC/C,SAAS,EAAE,aAAa,CAAC,iBAAiB,EAAE,UAAU,CAAC;QACvD,cAAc,EAAE,aAAa,CAAC,sBAAsB,EAAE,SAAS,CAAC;QAChE,UAAU,EAAE,aAAa,CAAC,kBAAkB,EAAE,SAAS,CAAC;QACxD,IAAI,EAAE,aAAa,CAAC,WAAW,EAAE,SAAS,CAAC;QAC3C,WAAW,EAAE,aAAa,CAAC,mBAAmB,EAAE,UAAU,CAAC;QAC3D,cAAc,EAAE,aAAa,CAAC,sBAAsB,EAAE,SAAS,CAAC;QAChE,OAAO,EAAE,aAAa,CAAC,cAAc,EAAE,SAAS,CAAC;QACjD,YAAY,EAAE,aAAa,CAAC,mBAAmB,EAAE,SAAS,CAAC;QAC3D,QAAQ,EAAE,aAAa,CAAC,eAAe,EAAE,UAAU,CAAC;QACpD,YAAY,EAAE,aAAa,CAAC,oBAAoB,EAAE,SAAS,CAAC;QAC5D,aAAa,EAAE,aAAa,CAAC,oBAAoB,EAAE,UAAU,CAAC;QAC9D,WAAW,EAAE,aAAa,CAAC,mBAAmB,EAAE,SAAS,CAAC;QAC1D,YAAY,EAAE,aAAa,CAAC,oBAAoB,EAAE,SAAS,CAAC;QAC5D,SAAS,EAAE,aAAa,CAAC,iBAAiB,EAAE,SAAS,CAAC;QACtD,OAAO,EAAE,aAAa,CAAC,cAAc,EAAE,UAAU,CAAC;QAClD,UAAU,EAAE,aAAa,CAAC,kBAAkB,EAAE,SAAS,CAAC;KACzD;IACD,SAAS,EAAE;QACT,OAAO,EAAE;YACP,cAAc,EAAE,CAAC;YACjB,eAAe,EAAE,EAAE;YACnB,UAAU,EAAE,EAAE;YACd,SAAS,EAAE,EAAE;YACb,UAAU,EAAE,IAAI;SACjB;QACD,GAAG,EAAE;YACH,cAAc,EAAE,MAAM;YACtB,mBAAmB,EAAE,MAAM;SAC5B;KACF;CACO,CAAC","sourcesContent":["export interface ExpoPlatformPackage {\n readonly name: string;\n readonly version: string;\n}\n\nfunction definePackage(name: string, version: string): ExpoPlatformPackage {\n return { name, version };\n}\n\n/**\n * The canonical Ankhorage projection of the supported Expo platform.\n *\n * Package versions come from Expo SDK 57's bundled native module map. Keep this\n * structure as the only hand-maintained Expo compatibility authority in this\n * repository; generated manifests and runtime planning derive from it.\n */\nexport const EXPO_PLATFORM = {\n sdk: 57,\n architecture: 'new-architecture-only',\n runtime: {\n expo: definePackage('expo', '57.0.18'),\n react: definePackage('react', '19.2.3'),\n reactDom: definePackage('react-dom', '19.2.3'),\n reactNative: definePackage('react-native', '0.86.3'),\n reactNativeWeb: definePackage('react-native-web', '~0.21.0'),\n },\n tooling: {\n node: {\n lts: 24,\n version: '24.x',\n },\n nodeTypes: definePackage('@types/node', '^24.13.3'),\n typescript: definePackage('typescript', '~6.0.3'),\n expoDoctor: definePackage('expo-doctor', '1.20.4'),\n },\n navigation: {\n expoRouter: definePackage('expo-router', '~57.0.17'),\n screens: definePackage('react-native-screens', '~4.26.0'),\n safeArea: definePackage('react-native-safe-area-context', '~5.7.0'),\n },\n animation: {\n reanimated: definePackage('react-native-reanimated', '4.5.1'),\n worklets: definePackage('react-native-worklets', '0.10.1'),\n gestureHandler: definePackage('react-native-gesture-handler', '~2.32.0'),\n },\n ui: {\n svg: definePackage('react-native-svg', '15.15.4'),\n iconProviders: {\n Ionicons: definePackage('@react-native-vector-icons/ionicons', '^13.1.3'),\n FontAwesome: definePackage('@react-native-vector-icons/fontawesome', '^13.1.3'),\n FontAwesome5: definePackage('@react-native-vector-icons/fontawesome5', '^13.1.3'),\n FontAwesome6: definePackage('@react-native-vector-icons/fontawesome6', '^13.1.3'),\n MaterialDesignIcons: definePackage(\n '@react-native-vector-icons/material-design-icons',\n '^13.1.3',\n ),\n },\n },\n packages: {\n metroRuntime: definePackage('@expo/metro-runtime', '~57.0.14'),\n asset: definePackage('expo-asset', '~57.0.15'),\n audio: definePackage('expo-audio', '~57.0.4'),\n authSession: definePackage('expo-auth-session', '~57.0.10'),\n camera: definePackage('expo-camera', '~57.0.4'),\n constants: definePackage('expo-constants', '~57.0.16'),\n crypto: definePackage('expo-crypto', '~57.0.2'),\n devClient: definePackage('expo-dev-client', '~57.0.16'),\n documentPicker: definePackage('expo-document-picker', '~57.0.1'),\n fileSystem: definePackage('expo-file-system', '~57.0.6'),\n font: definePackage('expo-font', '~57.0.2'),\n imagePicker: definePackage('expo-image-picker', '~57.0.14'),\n linearGradient: definePackage('expo-linear-gradient', '~57.0.1'),\n linking: definePackage('expo-linking', '~57.0.8'),\n localization: definePackage('expo-localization', '~57.0.1'),\n location: definePackage('expo-location', '~57.0.14'),\n mediaLibrary: definePackage('expo-media-library', '~57.0.4'),\n notifications: definePackage('expo-notifications', '~57.0.15'),\n secureStore: definePackage('expo-secure-store', '~57.0.2'),\n splashScreen: definePackage('expo-splash-screen', '~57.0.8'),\n statusBar: definePackage('expo-status-bar', '~57.0.1'),\n updates: definePackage('expo-updates', '~57.0.19'),\n webBrowser: definePackage('expo-web-browser', '~57.0.2'),\n },\n platforms: {\n android: {\n minimumVersion: 7,\n minimumApiLevel: 24,\n compileSdk: 36,\n targetSdk: 36,\n edgeToEdge: true,\n },\n ios: {\n minimumVersion: '16.4',\n minimumXcodeVersion: '26.4',\n },\n },\n} as const;\n\nexport type ExpoPlatform = typeof EXPO_PLATFORM;\n"]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@ankhorage/expo-runtime",
3
3
  "type": "module",
4
- "version": "3.0.13",
4
+ "version": "3.1.0",
5
5
  "description": "Declarative runtime integration for Expo apps: maps app capabilities to permissions, packages, config plugins, providers, and adapters",
6
6
  "homepage": "https://github.com/ankhorage/expo-runtime#readme",
7
7
  "bugs": {
@@ -131,6 +131,7 @@
131
131
  "@react-native-vector-icons/fontawesome5": "^13.1.3",
132
132
  "@react-native-vector-icons/fontawesome6": "^13.1.3",
133
133
  "@react-native-vector-icons/ionicons": "^13.1.3",
134
+ "@react-native-vector-icons/material-design-icons": "^13.1.3",
134
135
  "expo": "57.0.18",
135
136
  "expo-camera": "~57.0.4",
136
137
  "expo-constants": "~57.0.16",
@@ -160,6 +161,9 @@
160
161
  "@react-native-vector-icons/ionicons": {
161
162
  "optional": true
162
163
  },
164
+ "@react-native-vector-icons/material-design-icons": {
165
+ "optional": true
166
+ },
163
167
  "expo": {
164
168
  "optional": true
165
169
  },
@@ -198,6 +202,7 @@
198
202
  "@react-native-vector-icons/fontawesome5": "^13.1.3",
199
203
  "@react-native-vector-icons/fontawesome6": "^13.1.3",
200
204
  "@react-native-vector-icons/ionicons": "^13.1.3",
205
+ "@react-native-vector-icons/material-design-icons": "^13.1.3",
201
206
  "@types/bun": "^1.4.0",
202
207
  "@types/node": "^24.13.3",
203
208
  "@types/pngjs": "^6.0.5",
@@ -31,6 +31,7 @@ describe('ExpoZoraIconFontProvider Web', () => {
31
31
  ['FontAwesome6Free-Regular', 'FontAwesome6_Regular.ttf'],
32
32
  ['FontAwesome6Free-Solid', 'FontAwesome6_Solid.ttf'],
33
33
  ['Ionicons', 'Ionicons.ttf'],
34
+ ['MaterialDesignIcons', 'MaterialDesignIcons.ttf'],
34
35
  ]);
35
36
  expect(React.isValidElement(element)).toBe(true);
36
37
  if (!React.isValidElement(element)) {
@@ -6,6 +6,7 @@ import fontAwesome6Brands from '@react-native-vector-icons/fontawesome6/fonts/Fo
6
6
  import fontAwesome6Regular from '@react-native-vector-icons/fontawesome6/fonts/FontAwesome6_Regular.ttf';
7
7
  import fontAwesome6Solid from '@react-native-vector-icons/fontawesome6/fonts/FontAwesome6_Solid.ttf';
8
8
  import ionicons from '@react-native-vector-icons/ionicons/fonts/Ionicons.ttf';
9
+ import materialDesignIcons from '@react-native-vector-icons/material-design-icons/fonts/MaterialDesignIcons.ttf';
9
10
  import { useFonts } from 'expo-font';
10
11
  import React from 'react';
11
12
 
@@ -18,6 +19,7 @@ const ZORA_ICON_FONTS = {
18
19
  'FontAwesome6Free-Regular': fontAwesome6Regular,
19
20
  'FontAwesome6Free-Solid': fontAwesome6Solid,
20
21
  Ionicons: ionicons,
22
+ MaterialDesignIcons: materialDesignIcons,
21
23
  } as const;
22
24
 
23
25
  export interface ExpoZoraIconFontProviderProps {
@@ -22,55 +22,33 @@ describe('EXPO_PLATFORM', () => {
22
22
  expect('tvos' in EXPO_PLATFORM.platforms).toBe(false);
23
23
  });
24
24
 
25
- test('keeps the Hermes fix, React Native and Node policy in one contract', () => {
26
- expect(EXPO_PLATFORM.runtime.expo).toEqual({ name: 'expo', version: '57.0.18' });
27
- expect(EXPO_PLATFORM.runtime.reactNative).toEqual({
28
- name: 'react-native',
29
- version: '0.86.3',
30
- });
31
- expect(EXPO_PLATFORM.packages.crypto).toEqual({
32
- name: 'expo-crypto',
33
- version: '~57.0.2',
34
- });
35
- expect(EXPO_PLATFORM.tooling.node).toEqual({ lts: 24, version: '24.x' });
36
- expect(EXPO_PLATFORM.tooling.expoDoctor.version).toBe('1.20.4');
37
- expect(EXPO_PLATFORM.animation.worklets.version).toBe('0.10.1');
25
+ test('keeps runtime and tooling package identities in one contract', () => {
26
+ expect(EXPO_PLATFORM.runtime.expo.name).toBe('expo');
27
+ expect(Number(EXPO_PLATFORM.runtime.expo.version.split('.')[0])).toBe(EXPO_PLATFORM.sdk);
28
+ expect(EXPO_PLATFORM.runtime.reactNative.name).toBe('react-native');
29
+ expect(EXPO_PLATFORM.packages.crypto.name).toBe('expo-crypto');
30
+ expect(EXPO_PLATFORM.tooling.node.lts).toBe(24);
31
+ expect(EXPO_PLATFORM.tooling.node.version).toBe(`${EXPO_PLATFORM.tooling.node.lts}.x`);
32
+ expect(EXPO_PLATFORM.tooling.expoDoctor.name).toBe('expo-doctor');
33
+ expect(EXPO_PLATFORM.animation.worklets.name).toBe('react-native-worklets');
38
34
  });
39
35
  });
40
36
 
41
- describe('EXPO_PLATFORM compatibility metadata', () => {
42
- test('projects the current Expo bundled native-module patch ranges', () => {
43
- expect(EXPO_PLATFORM.navigation.expoRouter.version).toBe('~57.0.17');
44
- expect({
45
- asset: EXPO_PLATFORM.packages.asset.version,
46
- authSession: EXPO_PLATFORM.packages.authSession.version,
47
- constants: EXPO_PLATFORM.packages.constants.version,
48
- devClient: EXPO_PLATFORM.packages.devClient.version,
49
- fileSystem: EXPO_PLATFORM.packages.fileSystem.version,
50
- font: EXPO_PLATFORM.packages.font.version,
51
- imagePicker: EXPO_PLATFORM.packages.imagePicker.version,
52
- linking: EXPO_PLATFORM.packages.linking.version,
53
- location: EXPO_PLATFORM.packages.location.version,
54
- metroRuntime: EXPO_PLATFORM.packages.metroRuntime.version,
55
- notifications: EXPO_PLATFORM.packages.notifications.version,
56
- secureStore: EXPO_PLATFORM.packages.secureStore.version,
57
- splashScreen: EXPO_PLATFORM.packages.splashScreen.version,
58
- updates: EXPO_PLATFORM.packages.updates.version,
59
- }).toEqual({
60
- asset: '~57.0.15',
61
- authSession: '~57.0.10',
62
- constants: '~57.0.16',
63
- devClient: '~57.0.16',
64
- fileSystem: '~57.0.6',
65
- font: '~57.0.2',
66
- imagePicker: '~57.0.14',
67
- linking: '~57.0.8',
68
- location: '~57.0.14',
69
- metroRuntime: '~57.0.14',
70
- notifications: '~57.0.15',
71
- secureStore: '~57.0.2',
72
- splashScreen: '~57.0.8',
73
- updates: '~57.0.19',
37
+ describe('EXPO_PLATFORM icon providers', () => {
38
+ test('owns the complete static provider package inventory', () => {
39
+ expect(
40
+ Object.fromEntries(
41
+ Object.entries(EXPO_PLATFORM.ui.iconProviders).map(([provider, dependency]) => [
42
+ provider,
43
+ dependency.name,
44
+ ]),
45
+ ),
46
+ ).toEqual({
47
+ Ionicons: '@react-native-vector-icons/ionicons',
48
+ FontAwesome: '@react-native-vector-icons/fontawesome',
49
+ FontAwesome5: '@react-native-vector-icons/fontawesome5',
50
+ FontAwesome6: '@react-native-vector-icons/fontawesome6',
51
+ MaterialDesignIcons: '@react-native-vector-icons/material-design-icons',
74
52
  });
75
53
  });
76
54
  });
package/src/platform.ts CHANGED
@@ -45,6 +45,16 @@ export const EXPO_PLATFORM = {
45
45
  },
46
46
  ui: {
47
47
  svg: definePackage('react-native-svg', '15.15.4'),
48
+ iconProviders: {
49
+ Ionicons: definePackage('@react-native-vector-icons/ionicons', '^13.1.3'),
50
+ FontAwesome: definePackage('@react-native-vector-icons/fontawesome', '^13.1.3'),
51
+ FontAwesome5: definePackage('@react-native-vector-icons/fontawesome5', '^13.1.3'),
52
+ FontAwesome6: definePackage('@react-native-vector-icons/fontawesome6', '^13.1.3'),
53
+ MaterialDesignIcons: definePackage(
54
+ '@react-native-vector-icons/material-design-icons',
55
+ '^13.1.3',
56
+ ),
57
+ },
48
58
  },
49
59
  packages: {
50
60
  metroRuntime: definePackage('@expo/metro-runtime', '~57.0.14'),
@@ -2,6 +2,7 @@ import { Permission } from '@ankhorage/permissions';
2
2
  import { EXPO_PERMISSION_SUPPORT } from '@ankhorage/permissions/expo/manifest';
3
3
  import { describe, expect, test } from 'bun:test';
4
4
 
5
+ import { GENERATED_RUNTIME_DEPENDENCY_VERSIONS } from './expoRuntimePlanningMetadata';
5
6
  import { EXPO_PLATFORM } from './platform';
6
7
  import { type ExpoRuntimePlanningManifest, resolveExpoRuntimePlan } from './resolveExpoRuntimePlan';
7
8
 
@@ -200,8 +201,14 @@ describe('resolveExpoRuntimePlan platform-neutral permissions', () => {
200
201
  });
201
202
 
202
203
  const SUPPORTED_PERMISSION_DEPENDENCIES = [
203
- { name: '@ankhorage/expo-runtime', version: '^3.0.0' },
204
- { name: '@ankhorage/permissions', version: '^0.2.3' },
204
+ {
205
+ name: '@ankhorage/expo-runtime',
206
+ version: GENERATED_RUNTIME_DEPENDENCY_VERSIONS['@ankhorage/expo-runtime'],
207
+ },
208
+ {
209
+ name: '@ankhorage/permissions',
210
+ version: GENERATED_RUNTIME_DEPENDENCY_VERSIONS['@ankhorage/permissions'],
211
+ },
205
212
  { name: 'expo-asset', version: EXPO_PLATFORM.packages.asset.version },
206
213
  { name: 'expo-audio', version: EXPO_PLATFORM.packages.audio.version },
207
214
  { name: 'expo-location', version: EXPO_PLATFORM.packages.location.version },