@ankhorage/expo-runtime 3.0.3 → 3.0.5
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 +12 -0
- package/dist/expoRuntimePlanningMetadata.d.ts +5 -0
- package/dist/expoRuntimePlanningMetadata.d.ts.map +1 -1
- package/dist/expoRuntimePlanningMetadata.js +4 -0
- package/dist/expoRuntimePlanningMetadata.js.map +1 -1
- package/dist/platform.d.ts +1 -0
- package/dist/platform.d.ts.map +1 -1
- package/dist/platform.js +1 -0
- package/dist/platform.js.map +1 -1
- package/dist/resolveExpoRuntimePlan.d.ts.map +1 -1
- package/dist/resolveExpoRuntimePlan.js +5 -1
- package/dist/resolveExpoRuntimePlan.js.map +1 -1
- package/package.json +1 -1
- package/src/expoRuntimePlanningMetadata.ts +5 -0
- package/src/platform.test.ts +4 -0
- package/src/platform.ts +1 -0
- package/src/resolveExpoRuntimePlan.test.ts +6 -0
- package/src/resolveExpoRuntimePlan.ts +7 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,17 @@
|
|
|
1
1
|
# @ankhorage/expo-runtime
|
|
2
2
|
|
|
3
|
+
## 3.0.5
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- b69bb95: Include `expo-asset` as a direct generated-app dependency whenever Expo audio is planned.
|
|
8
|
+
|
|
9
|
+
## 3.0.4
|
|
10
|
+
|
|
11
|
+
### Patch Changes
|
|
12
|
+
|
|
13
|
+
- 744e3e9: Expose the Expo 57 crypto package in the canonical platform dependency projection.
|
|
14
|
+
|
|
3
15
|
## 3.0.3
|
|
4
16
|
|
|
5
17
|
### Patch Changes
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { AnkhorageCapabilityName, ScreenCapabilityRequirement, ScreenPermissionRequirement } from '@ankhorage/contracts';
|
|
2
2
|
import type { PermissionSupport } from '@ankhorage/permissions/expo/manifest';
|
|
3
|
+
import { EXPO_PLATFORM } from './platform';
|
|
3
4
|
export interface ExpoRuntimeConfigPlugin {
|
|
4
5
|
readonly name: string;
|
|
5
6
|
readonly options?: Readonly<Record<string, boolean | string>>;
|
|
@@ -32,6 +33,10 @@ export declare const GENERATED_RUNTIME_DEPENDENCY_VERSIONS: {
|
|
|
32
33
|
export declare const EXPO_RUNTIME_PROVIDER_PACKAGES: {
|
|
33
34
|
readonly permissions: "@ankhorage/permissions";
|
|
34
35
|
};
|
|
36
|
+
/** Native Expo packages whose peer modules must be direct generated-app dependencies. */
|
|
37
|
+
export declare const EXPO_RUNTIME_PACKAGE_PEERS: {
|
|
38
|
+
readonly [EXPO_PLATFORM.packages.audio.name]: readonly [string];
|
|
39
|
+
};
|
|
35
40
|
export declare const EXPO_CAPABILITY_RUNTIME_REGISTRY: {
|
|
36
41
|
readonly barcodeScanner: {
|
|
37
42
|
readonly impliedPermissions: readonly [{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"expoRuntimePlanningMetadata.d.ts","sourceRoot":"","sources":["../src/expoRuntimePlanningMetadata.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,uBAAuB,EACvB,2BAA2B,EAC3B,2BAA2B,EAC5B,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sCAAsC,CAAC;
|
|
1
|
+
{"version":3,"file":"expoRuntimePlanningMetadata.d.ts","sourceRoot":"","sources":["../src/expoRuntimePlanningMetadata.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,uBAAuB,EACvB,2BAA2B,EAC3B,2BAA2B,EAC5B,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sCAAsC,CAAC;AAE9E,OAAO,EAAE,aAAa,EAA4B,MAAM,YAAY,CAAC;AAErE,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC;CAC/D;AAED,MAAM,MAAM,qBAAqB,GAAG,aAAa,CAAC;AAClD,MAAM,MAAM,oBAAoB,GAAG,2BAA2B,CAAC;AAE/D,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,QAAQ,EAAE,OAAO,GAAG,SAAS,CAAC;IACvC,QAAQ,CAAC,eAAe,EAAE,YAAY,GAAG,YAAY,GAAG,SAAS,GAAG,YAAY,CAAC;IACjF,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,CAAC,EAAE,iBAAiB,CAAC;CACtC;AAED,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,CAAC,kBAAkB,CAAC,EAAE,SAAS,2BAA2B,EAAE,CAAC;IACrE,QAAQ,CAAC,gBAAgB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC9C,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,qBAAqB,EAAE,CAAC;IACtD,QAAQ,CAAC,eAAe,CAAC,EAAE,SAAS,oBAAoB,EAAE,CAAC;IAC3D,QAAQ,CAAC,kBAAkB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAChD,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,uBAAuB,EAAE,CAAC;CACvD;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAChD,QAAQ,CAAC,MAAM,CAAC,EAAE,uBAAuB,CAAC;CAC3C;AAcD,eAAO,MAAM,qCAAqC;;;CAGG,CAAC;AAEtD,eAAO,MAAM,8BAA8B;;CAEe,CAAC;AAE3D,yFAAyF;AACzF,eAAO,MAAM,0BAA0B;IACrC,SAAA,CAAC,aAAa,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,oBAAqC;CACV,CAAC;AAqEjE,eAAO,MAAM,gCAAgC;;;;;;;;;;;;;;;;;;CAoB5C,CAAC;AAEF,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,uBAAuB,EAAE,6BAA6B,CAAC,CAAC,CAAC,EAC3F,WAAW,EAAE,2BAA2B,GACvC,6BAA6B,GAAG,SAAS,CAE3C;AAED,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,MAAM,GAAG,uBAAuB,GAAG,SAAS,CAE9F;AAED,wBAAgB,2BAA2B,CAAC,UAAU,EAAE,MAAM,GAAG,qBAAqB,CAOrF;AAED,wBAAgB,+BAA+B,CAC7C,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,iBAAiB,GACzB,qBAAqB,CAQvB;AAED,wBAAgB,2BAA2B,CAAC,UAAU,EAAE,MAAM,GAAG,qBAAqB,CAOrF"}
|
|
@@ -14,6 +14,10 @@ export const GENERATED_RUNTIME_DEPENDENCY_VERSIONS = {
|
|
|
14
14
|
export const EXPO_RUNTIME_PROVIDER_PACKAGES = {
|
|
15
15
|
permissions: '@ankhorage/permissions',
|
|
16
16
|
};
|
|
17
|
+
/** Native Expo packages whose peer modules must be direct generated-app dependencies. */
|
|
18
|
+
export const EXPO_RUNTIME_PACKAGE_PEERS = {
|
|
19
|
+
[EXPO_PLATFORM.packages.audio.name]: [EXPO_PLATFORM.packages.asset.name],
|
|
20
|
+
};
|
|
17
21
|
const EXPO_RUNTIME_CONFIG_HINTS = {
|
|
18
22
|
cameraPermission: {
|
|
19
23
|
plugin: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"expoRuntimePlanningMetadata.js","sourceRoot":"","sources":["../src/expoRuntimePlanningMetadata.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n AnkhorageCapabilityName,\n ScreenCapabilityRequirement,\n ScreenPermissionRequirement,\n} from '@ankhorage/contracts';\nimport type { PermissionSupport } from '@ankhorage/permissions/expo/manifest';\n\nimport { EXPO_PLATFORM, type ExpoPlatformPackage } from './platform';\n\nexport interface ExpoRuntimeConfigPlugin {\n readonly name: string;\n readonly options?: Readonly<Record<string, boolean | string>>;\n}\n\nexport type ExpoRuntimeProviderId = 'permissions';\nexport type ExpoRuntimeAdapterId = 'ExpoBarcodeScannerAdapter';\n\nexport interface ExpoRuntimeDiagnostic {\n readonly severity: 'error' | 'warning';\n readonly requirementType: 'capability' | 'configHint' | 'package' | 'permission';\n readonly requirement: string;\n readonly message: string;\n readonly support?: PermissionSupport;\n}\n\nexport interface ExpoRuntimeCapabilityMetadata {\n readonly impliedPermissions?: readonly ScreenPermissionRequirement[];\n readonly requiredPackages?: readonly string[];\n readonly providers?: readonly ExpoRuntimeProviderId[];\n readonly runtimeAdapters?: readonly ExpoRuntimeAdapterId[];\n readonly androidPermissions?: readonly string[];\n readonly plugins?: readonly ExpoRuntimeConfigPlugin[];\n}\n\nexport interface ExpoRuntimeHintMetadata {\n readonly androidPermissions?: readonly string[];\n readonly plugin?: ExpoRuntimeConfigPlugin;\n}\n\nconst GENERATED_ANKHORAGE_DEPENDENCY_VERSIONS = {\n '@ankhorage/permissions': '^0.2.3',\n '@ankhorage/expo-runtime': '^3.0.0',\n} as const satisfies Record<string, string>;\n\nconst GENERATED_EXPO_DEPENDENCY_VERSIONS = Object.fromEntries(\n Object.values(EXPO_PLATFORM.packages).map((dependency: ExpoPlatformPackage) => [\n dependency.name,\n dependency.version,\n ]),\n) as Readonly<Record<string, string>>;\n\nexport const GENERATED_RUNTIME_DEPENDENCY_VERSIONS = {\n ...GENERATED_ANKHORAGE_DEPENDENCY_VERSIONS,\n ...GENERATED_EXPO_DEPENDENCY_VERSIONS,\n} as const satisfies Readonly<Record<string, string>>;\n\nexport const EXPO_RUNTIME_PROVIDER_PACKAGES = {\n permissions: '@ankhorage/permissions',\n} as const satisfies Record<ExpoRuntimeProviderId, string>;\n\nconst EXPO_RUNTIME_CONFIG_HINTS = {\n cameraPermission: {\n plugin: {\n name: EXPO_PLATFORM.packages.camera.name,\n options: {\n barcodeScannerEnabled: false,\n cameraPermission: 'Allow camera access.',\n microphonePermission: false,\n recordAudioAndroid: false,\n },\n },\n },\n microphonePermission: {\n plugin: {\n name: EXPO_PLATFORM.packages.audio.name,\n options: {\n enableBackgroundPlayback: false,\n enableBackgroundRecording: false,\n microphonePermission: 'Allow microphone access.',\n },\n },\n },\n recordAudioAndroid: {\n plugin: {\n name: EXPO_PLATFORM.packages.audio.name,\n options: {\n enableBackgroundPlayback: false,\n enableBackgroundRecording: false,\n recordAudioAndroid: true,\n },\n },\n },\n mediaLibraryPermission: {\n plugin: {\n name: EXPO_PLATFORM.packages.mediaLibrary.name,\n options: {\n photosPermission: 'Allow photo library access.',\n savePhotosPermission: 'Allow saving to the photo library.',\n },\n },\n },\n locationWhenInUsePermission: {\n plugin: {\n name: EXPO_PLATFORM.packages.location.name,\n options: {\n locationWhenInUsePermission: 'Allow location access while using the app.',\n },\n },\n },\n locationAlwaysAndWhenInUsePermission: {\n plugin: {\n name: EXPO_PLATFORM.packages.location.name,\n options: {\n locationAlwaysAndWhenInUsePermission: 'Allow location access.',\n isAndroidBackgroundLocationEnabled: true,\n isAndroidForegroundServiceEnabled: true,\n isIosBackgroundLocationEnabled: true,\n },\n },\n },\n notificationsPermission: {\n plugin: {\n name: EXPO_PLATFORM.packages.notifications.name,\n },\n },\n} as const satisfies Readonly<Record<string, ExpoRuntimeHintMetadata>>;\n\nexport const EXPO_CAPABILITY_RUNTIME_REGISTRY = {\n barcodeScanner: {\n impliedPermissions: [{ permission: 'camera' }],\n requiredPackages: [EXPO_PLATFORM.packages.camera.name],\n providers: ['permissions'],\n runtimeAdapters: ['ExpoBarcodeScannerAdapter'],\n plugins: [\n {\n name: EXPO_PLATFORM.packages.camera.name,\n options: {\n cameraPermission: 'Allow camera access to scan barcodes.',\n barcodeScannerEnabled: true,\n microphonePermission: false,\n recordAudioAndroid: false,\n },\n },\n ],\n },\n} as const satisfies Readonly<\n Partial<Record<AnkhorageCapabilityName, ExpoRuntimeCapabilityMetadata>>\n>;\n\nexport function findCapabilityMetadata(\n registry: Readonly<Partial<Record<AnkhorageCapabilityName, ExpoRuntimeCapabilityMetadata>>>,\n requirement: ScreenCapabilityRequirement,\n): ExpoRuntimeCapabilityMetadata | undefined {\n return Object.entries(registry).find(([name]) => name === requirement.capability)?.[1];\n}\n\nexport function findConfigHintMetadata(configHint: string): ExpoRuntimeHintMetadata | undefined {\n return Object.entries(EXPO_RUNTIME_CONFIG_HINTS).find(([name]) => name === configHint)?.[1];\n}\n\nexport function unknownPermissionDiagnostic(permission: string): ExpoRuntimeDiagnostic {\n return {\n severity: 'error',\n requirementType: 'permission',\n requirement: permission,\n message: `Unknown permission '${permission}' cannot be resolved for Expo runtime generation.`,\n };\n}\n\nexport function unsupportedPermissionDiagnostic(\n permission: string,\n support: PermissionSupport,\n): ExpoRuntimeDiagnostic {\n return {\n severity: support === 'limited' ? 'warning' : 'error',\n requirementType: 'permission',\n requirement: permission,\n message: `Expo runtime support for '${permission}' is '${support}'.`,\n support,\n };\n}\n\nexport function unknownCapabilityDiagnostic(capability: string): ExpoRuntimeDiagnostic {\n return {\n severity: 'warning',\n requirementType: 'capability',\n requirement: capability,\n message: `No Expo runtime metadata is registered for capability '${capability}'.`,\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"expoRuntimePlanningMetadata.js","sourceRoot":"","sources":["../src/expoRuntimePlanningMetadata.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n AnkhorageCapabilityName,\n ScreenCapabilityRequirement,\n ScreenPermissionRequirement,\n} from '@ankhorage/contracts';\nimport type { PermissionSupport } from '@ankhorage/permissions/expo/manifest';\n\nimport { EXPO_PLATFORM, type ExpoPlatformPackage } from './platform';\n\nexport interface ExpoRuntimeConfigPlugin {\n readonly name: string;\n readonly options?: Readonly<Record<string, boolean | string>>;\n}\n\nexport type ExpoRuntimeProviderId = 'permissions';\nexport type ExpoRuntimeAdapterId = 'ExpoBarcodeScannerAdapter';\n\nexport interface ExpoRuntimeDiagnostic {\n readonly severity: 'error' | 'warning';\n readonly requirementType: 'capability' | 'configHint' | 'package' | 'permission';\n readonly requirement: string;\n readonly message: string;\n readonly support?: PermissionSupport;\n}\n\nexport interface ExpoRuntimeCapabilityMetadata {\n readonly impliedPermissions?: readonly ScreenPermissionRequirement[];\n readonly requiredPackages?: readonly string[];\n readonly providers?: readonly ExpoRuntimeProviderId[];\n readonly runtimeAdapters?: readonly ExpoRuntimeAdapterId[];\n readonly androidPermissions?: readonly string[];\n readonly plugins?: readonly ExpoRuntimeConfigPlugin[];\n}\n\nexport interface ExpoRuntimeHintMetadata {\n readonly androidPermissions?: readonly string[];\n readonly plugin?: ExpoRuntimeConfigPlugin;\n}\n\nconst GENERATED_ANKHORAGE_DEPENDENCY_VERSIONS = {\n '@ankhorage/permissions': '^0.2.3',\n '@ankhorage/expo-runtime': '^3.0.0',\n} as const satisfies Record<string, string>;\n\nconst GENERATED_EXPO_DEPENDENCY_VERSIONS = Object.fromEntries(\n Object.values(EXPO_PLATFORM.packages).map((dependency: ExpoPlatformPackage) => [\n dependency.name,\n dependency.version,\n ]),\n) as Readonly<Record<string, string>>;\n\nexport const GENERATED_RUNTIME_DEPENDENCY_VERSIONS = {\n ...GENERATED_ANKHORAGE_DEPENDENCY_VERSIONS,\n ...GENERATED_EXPO_DEPENDENCY_VERSIONS,\n} as const satisfies Readonly<Record<string, string>>;\n\nexport const EXPO_RUNTIME_PROVIDER_PACKAGES = {\n permissions: '@ankhorage/permissions',\n} as const satisfies Record<ExpoRuntimeProviderId, string>;\n\n/** Native Expo packages whose peer modules must be direct generated-app dependencies. */\nexport const EXPO_RUNTIME_PACKAGE_PEERS = {\n [EXPO_PLATFORM.packages.audio.name]: [EXPO_PLATFORM.packages.asset.name],\n} as const satisfies Readonly<Record<string, readonly string[]>>;\n\nconst EXPO_RUNTIME_CONFIG_HINTS = {\n cameraPermission: {\n plugin: {\n name: EXPO_PLATFORM.packages.camera.name,\n options: {\n barcodeScannerEnabled: false,\n cameraPermission: 'Allow camera access.',\n microphonePermission: false,\n recordAudioAndroid: false,\n },\n },\n },\n microphonePermission: {\n plugin: {\n name: EXPO_PLATFORM.packages.audio.name,\n options: {\n enableBackgroundPlayback: false,\n enableBackgroundRecording: false,\n microphonePermission: 'Allow microphone access.',\n },\n },\n },\n recordAudioAndroid: {\n plugin: {\n name: EXPO_PLATFORM.packages.audio.name,\n options: {\n enableBackgroundPlayback: false,\n enableBackgroundRecording: false,\n recordAudioAndroid: true,\n },\n },\n },\n mediaLibraryPermission: {\n plugin: {\n name: EXPO_PLATFORM.packages.mediaLibrary.name,\n options: {\n photosPermission: 'Allow photo library access.',\n savePhotosPermission: 'Allow saving to the photo library.',\n },\n },\n },\n locationWhenInUsePermission: {\n plugin: {\n name: EXPO_PLATFORM.packages.location.name,\n options: {\n locationWhenInUsePermission: 'Allow location access while using the app.',\n },\n },\n },\n locationAlwaysAndWhenInUsePermission: {\n plugin: {\n name: EXPO_PLATFORM.packages.location.name,\n options: {\n locationAlwaysAndWhenInUsePermission: 'Allow location access.',\n isAndroidBackgroundLocationEnabled: true,\n isAndroidForegroundServiceEnabled: true,\n isIosBackgroundLocationEnabled: true,\n },\n },\n },\n notificationsPermission: {\n plugin: {\n name: EXPO_PLATFORM.packages.notifications.name,\n },\n },\n} as const satisfies Readonly<Record<string, ExpoRuntimeHintMetadata>>;\n\nexport const EXPO_CAPABILITY_RUNTIME_REGISTRY = {\n barcodeScanner: {\n impliedPermissions: [{ permission: 'camera' }],\n requiredPackages: [EXPO_PLATFORM.packages.camera.name],\n providers: ['permissions'],\n runtimeAdapters: ['ExpoBarcodeScannerAdapter'],\n plugins: [\n {\n name: EXPO_PLATFORM.packages.camera.name,\n options: {\n cameraPermission: 'Allow camera access to scan barcodes.',\n barcodeScannerEnabled: true,\n microphonePermission: false,\n recordAudioAndroid: false,\n },\n },\n ],\n },\n} as const satisfies Readonly<\n Partial<Record<AnkhorageCapabilityName, ExpoRuntimeCapabilityMetadata>>\n>;\n\nexport function findCapabilityMetadata(\n registry: Readonly<Partial<Record<AnkhorageCapabilityName, ExpoRuntimeCapabilityMetadata>>>,\n requirement: ScreenCapabilityRequirement,\n): ExpoRuntimeCapabilityMetadata | undefined {\n return Object.entries(registry).find(([name]) => name === requirement.capability)?.[1];\n}\n\nexport function findConfigHintMetadata(configHint: string): ExpoRuntimeHintMetadata | undefined {\n return Object.entries(EXPO_RUNTIME_CONFIG_HINTS).find(([name]) => name === configHint)?.[1];\n}\n\nexport function unknownPermissionDiagnostic(permission: string): ExpoRuntimeDiagnostic {\n return {\n severity: 'error',\n requirementType: 'permission',\n requirement: permission,\n message: `Unknown permission '${permission}' cannot be resolved for Expo runtime generation.`,\n };\n}\n\nexport function unsupportedPermissionDiagnostic(\n permission: string,\n support: PermissionSupport,\n): ExpoRuntimeDiagnostic {\n return {\n severity: support === 'limited' ? 'warning' : 'error',\n requirementType: 'permission',\n requirement: permission,\n message: `Expo runtime support for '${permission}' is '${support}'.`,\n support,\n };\n}\n\nexport function unknownCapabilityDiagnostic(capability: string): ExpoRuntimeDiagnostic {\n return {\n severity: 'warning',\n requirementType: 'capability',\n requirement: capability,\n message: `No Expo runtime metadata is registered for capability '${capability}'.`,\n };\n}\n"]}
|
package/dist/platform.d.ts
CHANGED
|
@@ -48,6 +48,7 @@ export declare const EXPO_PLATFORM: {
|
|
|
48
48
|
readonly authSession: ExpoPlatformPackage;
|
|
49
49
|
readonly camera: ExpoPlatformPackage;
|
|
50
50
|
readonly constants: ExpoPlatformPackage;
|
|
51
|
+
readonly crypto: ExpoPlatformPackage;
|
|
51
52
|
readonly devClient: ExpoPlatformPackage;
|
|
52
53
|
readonly documentPicker: ExpoPlatformPackage;
|
|
53
54
|
readonly fileSystem: ExpoPlatformPackage;
|
package/dist/platform.d.ts.map
CHANGED
|
@@ -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
|
|
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"}
|
package/dist/platform.js
CHANGED
|
@@ -47,6 +47,7 @@ export const EXPO_PLATFORM = {
|
|
|
47
47
|
authSession: definePackage('expo-auth-session', '~57.0.8'),
|
|
48
48
|
camera: definePackage('expo-camera', '~57.0.4'),
|
|
49
49
|
constants: definePackage('expo-constants', '~57.0.13'),
|
|
50
|
+
crypto: definePackage('expo-crypto', '~57.0.2'),
|
|
50
51
|
devClient: definePackage('expo-dev-client', '~57.0.14'),
|
|
51
52
|
documentPicker: definePackage('expo-document-picker', '~57.0.1'),
|
|
52
53
|
fileSystem: definePackage('expo-file-system', '~57.0.5'),
|
package/dist/platform.js.map
CHANGED
|
@@ -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,UAAU,CAAC;QACvC,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,SAAS,CAAC;QAC1D,MAAM,EAAE,aAAa,CAAC,aAAa,EAAE,SAAS,CAAC;QAC/C,SAAS,EAAE,aAAa,CAAC,gBAAgB,EAAE,UAAU,CAAC;QACtD,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.15'),\n react: definePackage('react', '19.2.3'),\n reactDom: definePackage('react-dom', '19.2.3'),\n reactNative: definePackage('react-native', '0.86.2'),\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.2'),\n },\n navigation: {\n expoRouter: definePackage('expo-router', '~57.0.15'),\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.12'),\n asset: definePackage('expo-asset', '~57.0.13'),\n audio: definePackage('expo-audio', '~57.0.4'),\n authSession: definePackage('expo-auth-session', '~57.0.8'),\n camera: definePackage('expo-camera', '~57.0.4'),\n constants: definePackage('expo-constants', '~57.0.13'),\n devClient: definePackage('expo-dev-client', '~57.0.14'),\n documentPicker: definePackage('expo-document-picker', '~57.0.1'),\n fileSystem: definePackage('expo-file-system', '~57.0.5'),\n font: definePackage('expo-font', '~57.0.1'),\n imagePicker: definePackage('expo-image-picker', '~57.0.12'),\n linearGradient: definePackage('expo-linear-gradient', '~57.0.1'),\n linking: definePackage('expo-linking', '~57.0.7'),\n localization: definePackage('expo-localization', '~57.0.1'),\n location: definePackage('expo-location', '~57.0.12'),\n mediaLibrary: definePackage('expo-media-library', '~57.0.4'),\n notifications: definePackage('expo-notifications', '~57.0.13'),\n secureStore: definePackage('expo-secure-store', '~57.0.1'),\n splashScreen: definePackage('expo-splash-screen', '~57.0.7'),\n statusBar: definePackage('expo-status-bar', '~57.0.1'),\n updates: definePackage('expo-updates', '~57.0.16'),\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":"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","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.15'),\n react: definePackage('react', '19.2.3'),\n reactDom: definePackage('react-dom', '19.2.3'),\n reactNative: definePackage('react-native', '0.86.2'),\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.2'),\n },\n navigation: {\n expoRouter: definePackage('expo-router', '~57.0.15'),\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.12'),\n asset: definePackage('expo-asset', '~57.0.13'),\n audio: definePackage('expo-audio', '~57.0.4'),\n authSession: definePackage('expo-auth-session', '~57.0.8'),\n camera: definePackage('expo-camera', '~57.0.4'),\n constants: definePackage('expo-constants', '~57.0.13'),\n crypto: definePackage('expo-crypto', '~57.0.2'),\n devClient: definePackage('expo-dev-client', '~57.0.14'),\n documentPicker: definePackage('expo-document-picker', '~57.0.1'),\n fileSystem: definePackage('expo-file-system', '~57.0.5'),\n font: definePackage('expo-font', '~57.0.1'),\n imagePicker: definePackage('expo-image-picker', '~57.0.12'),\n linearGradient: definePackage('expo-linear-gradient', '~57.0.1'),\n linking: definePackage('expo-linking', '~57.0.7'),\n localization: definePackage('expo-localization', '~57.0.1'),\n location: definePackage('expo-location', '~57.0.12'),\n mediaLibrary: definePackage('expo-media-library', '~57.0.4'),\n notifications: definePackage('expo-notifications', '~57.0.13'),\n secureStore: definePackage('expo-secure-store', '~57.0.1'),\n splashScreen: definePackage('expo-splash-screen', '~57.0.7'),\n statusBar: definePackage('expo-status-bar', '~57.0.1'),\n updates: definePackage('expo-updates', '~57.0.16'),\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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolveExpoRuntimePlan.d.ts","sourceRoot":"","sources":["../src/resolveExpoRuntimePlan.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,uBAAuB,EACvB,2BAA2B,EAC3B,2BAA2B,EAC5B,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAEzD,OAAO,EAEL,KAAK,sBAAsB,EAE5B,MAAM,sCAAsC,CAAC;AAE9C,OAAO,
|
|
1
|
+
{"version":3,"file":"resolveExpoRuntimePlan.d.ts","sourceRoot":"","sources":["../src/resolveExpoRuntimePlan.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,uBAAuB,EACvB,2BAA2B,EAC3B,2BAA2B,EAC5B,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAEzD,OAAO,EAEL,KAAK,sBAAsB,EAE5B,MAAM,sCAAsC,CAAC;AAE9C,OAAO,EAIL,KAAK,oBAAoB,EACzB,KAAK,6BAA6B,EAClC,KAAK,uBAAuB,EAC5B,KAAK,qBAAqB,EAC1B,KAAK,qBAAqB,EAO3B,MAAM,+BAA+B,CAAC;AAEvC,YAAY,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,CAAC;AAE5D,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,QAAQ,CAAC,EAAE;QAClB,QAAQ,CAAC,YAAY,CAAC,EAAE,SAAS,2BAA2B,EAAE,CAAC;QAC/D,QAAQ,CAAC,WAAW,CAAC,EAAE,SAAS,2BAA2B,EAAE,CAAC;KAC/D,CAAC;CACH;AAED,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,yBAAyB,CAAC,CAAC,CAAC;CACvE;AAED,UAAU,qBAAqB;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;CACrC;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,WAAW,EAAE,SAAS,2BAA2B,EAAE,CAAC;IAC7D,QAAQ,CAAC,YAAY,EAAE,SAAS,2BAA2B,EAAE,CAAC;IAC9D,QAAQ,CAAC,kBAAkB,EAAE,SAAS,2BAA2B,EAAE,CAAC;IACpE,QAAQ,CAAC,YAAY,EAAE,SAAS,qBAAqB,EAAE,CAAC;IACxD,QAAQ,CAAC,YAAY,EAAE;QACrB,QAAQ,CAAC,kBAAkB,EAAE,SAAS,MAAM,EAAE,CAAC;QAC/C,QAAQ,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;QACxC,QAAQ,CAAC,OAAO,EAAE,SAAS,uBAAuB,EAAE,CAAC;KACtD,CAAC;IACF,QAAQ,CAAC,SAAS,EAAE,SAAS,qBAAqB,EAAE,CAAC;IACrD,QAAQ,CAAC,eAAe,EAAE,SAAS,oBAAoB,EAAE,CAAC;IAC1D,QAAQ,CAAC,uBAAuB,EAAE,OAAO,CAAC;IAC1C,QAAQ,CAAC,wBAAwB,EAAE,OAAO,CAAC;IAC3C,QAAQ,CAAC,WAAW,EAAE,SAAS,qBAAqB,EAAE,CAAC;CACxD;AAED,UAAU,6BAA6B;IACrC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,QAAQ,CACpC,OAAO,CAAC,MAAM,CAAC,uBAAuB,EAAE,6BAA6B,CAAC,CAAC,CACxE,CAAC;IACF,QAAQ,CAAC,kBAAkB,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC/D,QAAQ,CAAC,iBAAiB,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,UAAU,EAAE,sBAAsB,CAAC,CAAC,CAAC;CACnF;AA0BD,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,2BAA2B,EACrC,OAAO,GAAE,6BAAkC,GAC1C,eAAe,CAejB"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { isPermission } from '@ankhorage/permissions';
|
|
2
2
|
import { EXPO_PERMISSION_SUPPORT, } from '@ankhorage/permissions/expo/manifest';
|
|
3
|
-
import { EXPO_CAPABILITY_RUNTIME_REGISTRY, EXPO_RUNTIME_PROVIDER_PACKAGES, findCapabilityMetadata, findConfigHintMetadata, GENERATED_RUNTIME_DEPENDENCY_VERSIONS, unknownCapabilityDiagnostic, unknownPermissionDiagnostic, unsupportedPermissionDiagnostic, } from './expoRuntimePlanningMetadata';
|
|
3
|
+
import { EXPO_CAPABILITY_RUNTIME_REGISTRY, EXPO_RUNTIME_PACKAGE_PEERS, EXPO_RUNTIME_PROVIDER_PACKAGES, findCapabilityMetadata, findConfigHintMetadata, GENERATED_RUNTIME_DEPENDENCY_VERSIONS, unknownCapabilityDiagnostic, unknownPermissionDiagnostic, unsupportedPermissionDiagnostic, } from './expoRuntimePlanningMetadata';
|
|
4
4
|
const EXPO_RUNTIME_PACKAGE_NAME = '@ankhorage/expo-runtime';
|
|
5
5
|
export function resolveExpoRuntimePlan(manifest, options = {}) {
|
|
6
6
|
const state = createPlanningState(manifest);
|
|
@@ -126,6 +126,10 @@ function addDependency(context, name, reason) {
|
|
|
126
126
|
version,
|
|
127
127
|
reasons: existing === undefined ? [reason] : Array.from(new Set([...existing.reasons, reason])),
|
|
128
128
|
});
|
|
129
|
+
const requiredPeers = Object.entries(EXPO_RUNTIME_PACKAGE_PEERS).find(([packageName]) => packageName === name)?.[1];
|
|
130
|
+
for (const peerName of requiredPeers ?? []) {
|
|
131
|
+
addDependency(context, peerName, `peer:${name}`);
|
|
132
|
+
}
|
|
129
133
|
}
|
|
130
134
|
function addProvider(context, provider, reason) {
|
|
131
135
|
context.state.providers.add(provider);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolveExpoRuntimePlan.js","sourceRoot":"","sources":["../src/resolveExpoRuntimePlan.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n AnkhorageCapabilityName,\n ScreenCapabilityRequirement,\n ScreenPermissionRequirement,\n} from '@ankhorage/contracts';\nimport type { Permission } from '@ankhorage/permissions';\nimport { isPermission } from '@ankhorage/permissions';\nimport {\n EXPO_PERMISSION_SUPPORT,\n type ExpoPermissionMetadata,\n type PermissionSupport,\n} from '@ankhorage/permissions/expo/manifest';\n\nimport {\n EXPO_CAPABILITY_RUNTIME_REGISTRY,\n EXPO_RUNTIME_PROVIDER_PACKAGES,\n type ExpoRuntimeAdapterId,\n type ExpoRuntimeCapabilityMetadata,\n type ExpoRuntimeConfigPlugin,\n type ExpoRuntimeDiagnostic,\n type ExpoRuntimeProviderId,\n findCapabilityMetadata,\n findConfigHintMetadata,\n GENERATED_RUNTIME_DEPENDENCY_VERSIONS,\n unknownCapabilityDiagnostic,\n unknownPermissionDiagnostic,\n unsupportedPermissionDiagnostic,\n} from './expoRuntimePlanningMetadata';\n\nexport type { ExpoRuntimeAdapterId, ExpoRuntimeProviderId };\n\nexport interface ExpoRuntimePlanningScreen {\n readonly requires?: {\n readonly capabilities?: readonly ScreenCapabilityRequirement[];\n readonly permissions?: readonly ScreenPermissionRequirement[];\n };\n}\n\nexport interface ExpoRuntimePlanningManifest {\n readonly screens: Readonly<Record<string, ExpoRuntimePlanningScreen>>;\n}\n\ninterface ExpoRuntimeDependency {\n readonly name: string;\n readonly version: string;\n readonly reasons: readonly string[];\n}\n\nexport interface ExpoRuntimePlan {\n readonly permissions: readonly ScreenPermissionRequirement[];\n readonly capabilities: readonly ScreenCapabilityRequirement[];\n readonly impliedPermissions: readonly ScreenPermissionRequirement[];\n readonly dependencies: readonly ExpoRuntimeDependency[];\n readonly nativeConfig: {\n readonly androidPermissions: readonly string[];\n readonly configHints: readonly string[];\n readonly plugins: readonly ExpoRuntimeConfigPlugin[];\n };\n readonly providers: readonly ExpoRuntimeProviderId[];\n readonly runtimeAdapters: readonly ExpoRuntimeAdapterId[];\n readonly usesExpoRuntimeRegistry: boolean;\n readonly needsPermissionsProvider: boolean;\n readonly diagnostics: readonly ExpoRuntimeDiagnostic[];\n}\n\ninterface ResolveExpoRuntimePlanOptions {\n readonly capabilityRegistry?: Readonly<\n Partial<Record<AnkhorageCapabilityName, ExpoRuntimeCapabilityMetadata>>\n >;\n readonly dependencyVersions?: Readonly<Record<string, string>>;\n readonly permissionSupport?: Readonly<Record<Permission, ExpoPermissionMetadata>>;\n}\n\ninterface PlanningState {\n readonly permissions: Map<string, ScreenPermissionRequirement>;\n readonly impliedPermissions: Map<string, ScreenPermissionRequirement>;\n readonly capabilities: Map<string, ScreenCapabilityRequirement>;\n readonly diagnostics: ExpoRuntimeDiagnostic[];\n readonly dependencies: Map<string, ExpoRuntimeDependency>;\n readonly pluginOptions: Map<string, Record<string, boolean | string>>;\n readonly configHints: Set<string>;\n readonly androidPermissions: Set<string>;\n readonly providers: Set<ExpoRuntimeProviderId>;\n readonly runtimeAdapters: Set<ExpoRuntimeAdapterId>;\n}\n\ninterface PlanningContext {\n readonly state: PlanningState;\n readonly capabilityRegistry: Readonly<\n Partial<Record<AnkhorageCapabilityName, ExpoRuntimeCapabilityMetadata>>\n >;\n readonly dependencyVersions: Readonly<Record<string, string>>;\n readonly permissionSupport: Readonly<Record<Permission, ExpoPermissionMetadata>>;\n}\n\nconst EXPO_RUNTIME_PACKAGE_NAME = '@ankhorage/expo-runtime';\n\nexport function resolveExpoRuntimePlan(\n manifest: ExpoRuntimePlanningManifest,\n options: ResolveExpoRuntimePlanOptions = {},\n): ExpoRuntimePlan {\n const state = createPlanningState(manifest);\n const context: PlanningContext = {\n state,\n capabilityRegistry: options.capabilityRegistry ?? EXPO_CAPABILITY_RUNTIME_REGISTRY,\n dependencyVersions: options.dependencyVersions ?? GENERATED_RUNTIME_DEPENDENCY_VERSIONS,\n permissionSupport: options.permissionSupport ?? EXPO_PERMISSION_SUPPORT,\n };\n addImpliedPermissions(context);\n planPermissions(context);\n planCapabilities(context);\n if (state.providers.size > 0 || state.runtimeAdapters.size > 0) {\n addDependency(context, EXPO_RUNTIME_PACKAGE_NAME, 'runtime:expo');\n }\n return buildPlan(state);\n}\n\nfunction createPlanningState(manifest: ExpoRuntimePlanningManifest): PlanningState {\n const permissions = new Map<string, ScreenPermissionRequirement>();\n const capabilities = new Map<string, ScreenCapabilityRequirement>();\n for (const screen of Object.values(manifest.screens)) {\n for (const requirement of screen.requires?.permissions ?? []) {\n permissions.set(requirement.permission, requirement);\n }\n for (const requirement of screen.requires?.capabilities ?? []) {\n capabilities.set(requirement.capability, requirement);\n }\n }\n return {\n permissions,\n capabilities,\n impliedPermissions: new Map(),\n diagnostics: [],\n dependencies: new Map(),\n pluginOptions: new Map(),\n configHints: new Set(),\n androidPermissions: new Set(),\n providers: new Set(),\n runtimeAdapters: new Set(),\n };\n}\n\nfunction addImpliedPermissions(context: PlanningContext): void {\n const { state } = context;\n for (const capability of state.capabilities.values()) {\n const metadata = findCapabilityMetadata(context.capabilityRegistry, capability);\n for (const permission of metadata?.impliedPermissions ?? []) {\n if (!state.permissions.has(permission.permission)) {\n state.permissions.set(permission.permission, permission);\n state.impliedPermissions.set(permission.permission, permission);\n }\n }\n }\n}\n\nfunction planPermissions(context: PlanningContext): void {\n for (const requirement of context.state.permissions.values()) {\n planPermission(context, requirement);\n }\n}\n\nfunction planPermission(context: PlanningContext, requirement: ScreenPermissionRequirement): void {\n if (!isPermission(requirement.permission)) {\n context.state.diagnostics.push(unknownPermissionDiagnostic(requirement.permission));\n return;\n }\n const metadata = findPermissionSupport(context.permissionSupport, requirement.permission);\n if (isUnsupported(metadata.support)) {\n context.state.diagnostics.push(\n unsupportedPermissionDiagnostic(requirement.permission, metadata.support),\n );\n return;\n }\n if (metadata.support === 'notRequired') {\n return;\n }\n const reason = `permission:${requirement.permission}`;\n addProvider(context, 'permissions', reason);\n metadata.requiredPackages.forEach((name) => addDependency(context, name, reason));\n metadata.configHints.forEach((hint) => applyConfigHint(context.state, hint));\n}\n\nfunction planCapabilities(context: PlanningContext): void {\n for (const requirement of context.state.capabilities.values()) {\n const metadata = findCapabilityMetadata(context.capabilityRegistry, requirement);\n if (metadata === undefined) {\n context.state.diagnostics.push(unknownCapabilityDiagnostic(requirement.capability));\n continue;\n }\n const reason = `capability:${requirement.capability}`;\n metadata.requiredPackages?.forEach((name) => addDependency(context, name, reason));\n metadata.providers?.forEach((provider) => addProvider(context, provider, reason));\n metadata.runtimeAdapters?.forEach((adapter) => context.state.runtimeAdapters.add(adapter));\n metadata.androidPermissions?.forEach((permission) =>\n context.state.androidPermissions.add(permission),\n );\n metadata.plugins?.forEach((plugin) => addPlugin(context.state, plugin));\n }\n}\n\nfunction applyConfigHint(state: PlanningState, configHint: string): void {\n state.configHints.add(configHint);\n const metadata = findConfigHintMetadata(configHint);\n if (metadata === undefined) {\n state.diagnostics.push({\n severity: 'warning',\n requirementType: 'configHint',\n requirement: configHint,\n message: `Config hint '${configHint}' is not translated into generated Expo config yet.`,\n });\n return;\n }\n metadata.androidPermissions?.forEach((permission) => state.androidPermissions.add(permission));\n if (metadata.plugin !== undefined) {\n addPlugin(state, metadata.plugin);\n }\n}\n\nfunction addDependency(context: PlanningContext, name: string, reason: string): void {\n const version = findDependencyVersion(context.dependencyVersions, name);\n if (version === undefined) {\n context.state.diagnostics.push({\n severity: 'warning',\n requirementType: 'package',\n requirement: name,\n message: `No generated-app dependency version is registered for '${name}'.`,\n });\n return;\n }\n const existing = context.state.dependencies.get(name);\n context.state.dependencies.set(name, {\n name,\n version,\n reasons: existing === undefined ? [reason] : Array.from(new Set([...existing.reasons, reason])),\n });\n}\n\nfunction addProvider(\n context: PlanningContext,\n provider: ExpoRuntimeProviderId,\n reason: string,\n): void {\n context.state.providers.add(provider);\n const packageName = Object.entries(EXPO_RUNTIME_PROVIDER_PACKAGES).find(\n ([name]) => name === String(provider),\n )?.[1];\n if (packageName === undefined) {\n throw new Error(`Runtime package metadata is missing for provider '${provider}'.`);\n }\n addDependency(context, packageName, reason);\n}\n\nfunction addPlugin(state: PlanningState, plugin: ExpoRuntimeConfigPlugin): void {\n const existingOptions = state.pluginOptions.get(plugin.name) ?? {};\n state.pluginOptions.set(plugin.name, { ...existingOptions, ...(plugin.options ?? {}) });\n}\n\nfunction buildPlan(state: PlanningState): ExpoRuntimePlan {\n const plugins = Array.from(state.pluginOptions, ([name, options]) => ({\n name,\n options: Object.keys(options).length > 0 ? options : undefined,\n })).sort((left, right) => left.name.localeCompare(right.name));\n return {\n permissions: Array.from(state.permissions.values()).sort(comparePermissions),\n capabilities: Array.from(state.capabilities.values()).sort(compareCapabilities),\n impliedPermissions: Array.from(state.impliedPermissions.values()).sort(comparePermissions),\n dependencies: Array.from(state.dependencies.values()).sort((left, right) =>\n left.name.localeCompare(right.name),\n ),\n nativeConfig: {\n androidPermissions: Array.from(state.androidPermissions).sort(),\n configHints: Array.from(state.configHints).sort(),\n plugins,\n },\n providers: Array.from(state.providers).sort(),\n runtimeAdapters: Array.from(state.runtimeAdapters).sort(),\n usesExpoRuntimeRegistry: state.runtimeAdapters.size > 0,\n needsPermissionsProvider: state.providers.has('permissions'),\n diagnostics: state.diagnostics,\n };\n}\n\nfunction findPermissionSupport(\n registry: Readonly<Record<Permission, ExpoPermissionMetadata>>,\n permission: Permission,\n): ExpoPermissionMetadata {\n const metadata = Object.entries(registry).find(([name]) => name === String(permission))?.[1];\n if (metadata === undefined) {\n throw new Error(`Permission metadata is missing for '${permission}'.`);\n }\n return metadata;\n}\n\nfunction findDependencyVersion(\n versions: Readonly<Record<string, string>>,\n name: string,\n): string | undefined {\n return Object.entries(versions).find(([candidate]) => candidate === name)?.[1];\n}\n\nfunction isUnsupported(support: PermissionSupport): boolean {\n return support === 'unsupported' || support === 'notImplemented' || support === 'limited';\n}\n\nfunction compareCapabilities(\n left: ScreenCapabilityRequirement,\n right: ScreenCapabilityRequirement,\n): number {\n return left.capability.localeCompare(right.capability);\n}\n\nfunction comparePermissions(\n left: ScreenPermissionRequirement,\n right: ScreenPermissionRequirement,\n): number {\n return left.permission.localeCompare(right.permission);\n}\n"]}
|
|
1
|
+
{"version":3,"file":"resolveExpoRuntimePlan.js","sourceRoot":"","sources":["../src/resolveExpoRuntimePlan.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n AnkhorageCapabilityName,\n ScreenCapabilityRequirement,\n ScreenPermissionRequirement,\n} from '@ankhorage/contracts';\nimport type { Permission } from '@ankhorage/permissions';\nimport { isPermission } from '@ankhorage/permissions';\nimport {\n EXPO_PERMISSION_SUPPORT,\n type ExpoPermissionMetadata,\n type PermissionSupport,\n} from '@ankhorage/permissions/expo/manifest';\n\nimport {\n EXPO_CAPABILITY_RUNTIME_REGISTRY,\n EXPO_RUNTIME_PACKAGE_PEERS,\n EXPO_RUNTIME_PROVIDER_PACKAGES,\n type ExpoRuntimeAdapterId,\n type ExpoRuntimeCapabilityMetadata,\n type ExpoRuntimeConfigPlugin,\n type ExpoRuntimeDiagnostic,\n type ExpoRuntimeProviderId,\n findCapabilityMetadata,\n findConfigHintMetadata,\n GENERATED_RUNTIME_DEPENDENCY_VERSIONS,\n unknownCapabilityDiagnostic,\n unknownPermissionDiagnostic,\n unsupportedPermissionDiagnostic,\n} from './expoRuntimePlanningMetadata';\n\nexport type { ExpoRuntimeAdapterId, ExpoRuntimeProviderId };\n\nexport interface ExpoRuntimePlanningScreen {\n readonly requires?: {\n readonly capabilities?: readonly ScreenCapabilityRequirement[];\n readonly permissions?: readonly ScreenPermissionRequirement[];\n };\n}\n\nexport interface ExpoRuntimePlanningManifest {\n readonly screens: Readonly<Record<string, ExpoRuntimePlanningScreen>>;\n}\n\ninterface ExpoRuntimeDependency {\n readonly name: string;\n readonly version: string;\n readonly reasons: readonly string[];\n}\n\nexport interface ExpoRuntimePlan {\n readonly permissions: readonly ScreenPermissionRequirement[];\n readonly capabilities: readonly ScreenCapabilityRequirement[];\n readonly impliedPermissions: readonly ScreenPermissionRequirement[];\n readonly dependencies: readonly ExpoRuntimeDependency[];\n readonly nativeConfig: {\n readonly androidPermissions: readonly string[];\n readonly configHints: readonly string[];\n readonly plugins: readonly ExpoRuntimeConfigPlugin[];\n };\n readonly providers: readonly ExpoRuntimeProviderId[];\n readonly runtimeAdapters: readonly ExpoRuntimeAdapterId[];\n readonly usesExpoRuntimeRegistry: boolean;\n readonly needsPermissionsProvider: boolean;\n readonly diagnostics: readonly ExpoRuntimeDiagnostic[];\n}\n\ninterface ResolveExpoRuntimePlanOptions {\n readonly capabilityRegistry?: Readonly<\n Partial<Record<AnkhorageCapabilityName, ExpoRuntimeCapabilityMetadata>>\n >;\n readonly dependencyVersions?: Readonly<Record<string, string>>;\n readonly permissionSupport?: Readonly<Record<Permission, ExpoPermissionMetadata>>;\n}\n\ninterface PlanningState {\n readonly permissions: Map<string, ScreenPermissionRequirement>;\n readonly impliedPermissions: Map<string, ScreenPermissionRequirement>;\n readonly capabilities: Map<string, ScreenCapabilityRequirement>;\n readonly diagnostics: ExpoRuntimeDiagnostic[];\n readonly dependencies: Map<string, ExpoRuntimeDependency>;\n readonly pluginOptions: Map<string, Record<string, boolean | string>>;\n readonly configHints: Set<string>;\n readonly androidPermissions: Set<string>;\n readonly providers: Set<ExpoRuntimeProviderId>;\n readonly runtimeAdapters: Set<ExpoRuntimeAdapterId>;\n}\n\ninterface PlanningContext {\n readonly state: PlanningState;\n readonly capabilityRegistry: Readonly<\n Partial<Record<AnkhorageCapabilityName, ExpoRuntimeCapabilityMetadata>>\n >;\n readonly dependencyVersions: Readonly<Record<string, string>>;\n readonly permissionSupport: Readonly<Record<Permission, ExpoPermissionMetadata>>;\n}\n\nconst EXPO_RUNTIME_PACKAGE_NAME = '@ankhorage/expo-runtime';\n\nexport function resolveExpoRuntimePlan(\n manifest: ExpoRuntimePlanningManifest,\n options: ResolveExpoRuntimePlanOptions = {},\n): ExpoRuntimePlan {\n const state = createPlanningState(manifest);\n const context: PlanningContext = {\n state,\n capabilityRegistry: options.capabilityRegistry ?? EXPO_CAPABILITY_RUNTIME_REGISTRY,\n dependencyVersions: options.dependencyVersions ?? GENERATED_RUNTIME_DEPENDENCY_VERSIONS,\n permissionSupport: options.permissionSupport ?? EXPO_PERMISSION_SUPPORT,\n };\n addImpliedPermissions(context);\n planPermissions(context);\n planCapabilities(context);\n if (state.providers.size > 0 || state.runtimeAdapters.size > 0) {\n addDependency(context, EXPO_RUNTIME_PACKAGE_NAME, 'runtime:expo');\n }\n return buildPlan(state);\n}\n\nfunction createPlanningState(manifest: ExpoRuntimePlanningManifest): PlanningState {\n const permissions = new Map<string, ScreenPermissionRequirement>();\n const capabilities = new Map<string, ScreenCapabilityRequirement>();\n for (const screen of Object.values(manifest.screens)) {\n for (const requirement of screen.requires?.permissions ?? []) {\n permissions.set(requirement.permission, requirement);\n }\n for (const requirement of screen.requires?.capabilities ?? []) {\n capabilities.set(requirement.capability, requirement);\n }\n }\n return {\n permissions,\n capabilities,\n impliedPermissions: new Map(),\n diagnostics: [],\n dependencies: new Map(),\n pluginOptions: new Map(),\n configHints: new Set(),\n androidPermissions: new Set(),\n providers: new Set(),\n runtimeAdapters: new Set(),\n };\n}\n\nfunction addImpliedPermissions(context: PlanningContext): void {\n const { state } = context;\n for (const capability of state.capabilities.values()) {\n const metadata = findCapabilityMetadata(context.capabilityRegistry, capability);\n for (const permission of metadata?.impliedPermissions ?? []) {\n if (!state.permissions.has(permission.permission)) {\n state.permissions.set(permission.permission, permission);\n state.impliedPermissions.set(permission.permission, permission);\n }\n }\n }\n}\n\nfunction planPermissions(context: PlanningContext): void {\n for (const requirement of context.state.permissions.values()) {\n planPermission(context, requirement);\n }\n}\n\nfunction planPermission(context: PlanningContext, requirement: ScreenPermissionRequirement): void {\n if (!isPermission(requirement.permission)) {\n context.state.diagnostics.push(unknownPermissionDiagnostic(requirement.permission));\n return;\n }\n const metadata = findPermissionSupport(context.permissionSupport, requirement.permission);\n if (isUnsupported(metadata.support)) {\n context.state.diagnostics.push(\n unsupportedPermissionDiagnostic(requirement.permission, metadata.support),\n );\n return;\n }\n if (metadata.support === 'notRequired') {\n return;\n }\n const reason = `permission:${requirement.permission}`;\n addProvider(context, 'permissions', reason);\n metadata.requiredPackages.forEach((name) => addDependency(context, name, reason));\n metadata.configHints.forEach((hint) => applyConfigHint(context.state, hint));\n}\n\nfunction planCapabilities(context: PlanningContext): void {\n for (const requirement of context.state.capabilities.values()) {\n const metadata = findCapabilityMetadata(context.capabilityRegistry, requirement);\n if (metadata === undefined) {\n context.state.diagnostics.push(unknownCapabilityDiagnostic(requirement.capability));\n continue;\n }\n const reason = `capability:${requirement.capability}`;\n metadata.requiredPackages?.forEach((name) => addDependency(context, name, reason));\n metadata.providers?.forEach((provider) => addProvider(context, provider, reason));\n metadata.runtimeAdapters?.forEach((adapter) => context.state.runtimeAdapters.add(adapter));\n metadata.androidPermissions?.forEach((permission) =>\n context.state.androidPermissions.add(permission),\n );\n metadata.plugins?.forEach((plugin) => addPlugin(context.state, plugin));\n }\n}\n\nfunction applyConfigHint(state: PlanningState, configHint: string): void {\n state.configHints.add(configHint);\n const metadata = findConfigHintMetadata(configHint);\n if (metadata === undefined) {\n state.diagnostics.push({\n severity: 'warning',\n requirementType: 'configHint',\n requirement: configHint,\n message: `Config hint '${configHint}' is not translated into generated Expo config yet.`,\n });\n return;\n }\n metadata.androidPermissions?.forEach((permission) => state.androidPermissions.add(permission));\n if (metadata.plugin !== undefined) {\n addPlugin(state, metadata.plugin);\n }\n}\n\nfunction addDependency(context: PlanningContext, name: string, reason: string): void {\n const version = findDependencyVersion(context.dependencyVersions, name);\n if (version === undefined) {\n context.state.diagnostics.push({\n severity: 'warning',\n requirementType: 'package',\n requirement: name,\n message: `No generated-app dependency version is registered for '${name}'.`,\n });\n return;\n }\n const existing = context.state.dependencies.get(name);\n context.state.dependencies.set(name, {\n name,\n version,\n reasons: existing === undefined ? [reason] : Array.from(new Set([...existing.reasons, reason])),\n });\n const requiredPeers = Object.entries(EXPO_RUNTIME_PACKAGE_PEERS).find(\n ([packageName]) => packageName === name,\n )?.[1];\n for (const peerName of requiredPeers ?? []) {\n addDependency(context, peerName, `peer:${name}`);\n }\n}\n\nfunction addProvider(\n context: PlanningContext,\n provider: ExpoRuntimeProviderId,\n reason: string,\n): void {\n context.state.providers.add(provider);\n const packageName = Object.entries(EXPO_RUNTIME_PROVIDER_PACKAGES).find(\n ([name]) => name === String(provider),\n )?.[1];\n if (packageName === undefined) {\n throw new Error(`Runtime package metadata is missing for provider '${provider}'.`);\n }\n addDependency(context, packageName, reason);\n}\n\nfunction addPlugin(state: PlanningState, plugin: ExpoRuntimeConfigPlugin): void {\n const existingOptions = state.pluginOptions.get(plugin.name) ?? {};\n state.pluginOptions.set(plugin.name, { ...existingOptions, ...(plugin.options ?? {}) });\n}\n\nfunction buildPlan(state: PlanningState): ExpoRuntimePlan {\n const plugins = Array.from(state.pluginOptions, ([name, options]) => ({\n name,\n options: Object.keys(options).length > 0 ? options : undefined,\n })).sort((left, right) => left.name.localeCompare(right.name));\n return {\n permissions: Array.from(state.permissions.values()).sort(comparePermissions),\n capabilities: Array.from(state.capabilities.values()).sort(compareCapabilities),\n impliedPermissions: Array.from(state.impliedPermissions.values()).sort(comparePermissions),\n dependencies: Array.from(state.dependencies.values()).sort((left, right) =>\n left.name.localeCompare(right.name),\n ),\n nativeConfig: {\n androidPermissions: Array.from(state.androidPermissions).sort(),\n configHints: Array.from(state.configHints).sort(),\n plugins,\n },\n providers: Array.from(state.providers).sort(),\n runtimeAdapters: Array.from(state.runtimeAdapters).sort(),\n usesExpoRuntimeRegistry: state.runtimeAdapters.size > 0,\n needsPermissionsProvider: state.providers.has('permissions'),\n diagnostics: state.diagnostics,\n };\n}\n\nfunction findPermissionSupport(\n registry: Readonly<Record<Permission, ExpoPermissionMetadata>>,\n permission: Permission,\n): ExpoPermissionMetadata {\n const metadata = Object.entries(registry).find(([name]) => name === String(permission))?.[1];\n if (metadata === undefined) {\n throw new Error(`Permission metadata is missing for '${permission}'.`);\n }\n return metadata;\n}\n\nfunction findDependencyVersion(\n versions: Readonly<Record<string, string>>,\n name: string,\n): string | undefined {\n return Object.entries(versions).find(([candidate]) => candidate === name)?.[1];\n}\n\nfunction isUnsupported(support: PermissionSupport): boolean {\n return support === 'unsupported' || support === 'notImplemented' || support === 'limited';\n}\n\nfunction compareCapabilities(\n left: ScreenCapabilityRequirement,\n right: ScreenCapabilityRequirement,\n): number {\n return left.capability.localeCompare(right.capability);\n}\n\nfunction comparePermissions(\n left: ScreenPermissionRequirement,\n right: ScreenPermissionRequirement,\n): number {\n return left.permission.localeCompare(right.permission);\n}\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.
|
|
4
|
+
"version": "3.0.5",
|
|
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": {
|
|
@@ -58,6 +58,11 @@ export const EXPO_RUNTIME_PROVIDER_PACKAGES = {
|
|
|
58
58
|
permissions: '@ankhorage/permissions',
|
|
59
59
|
} as const satisfies Record<ExpoRuntimeProviderId, string>;
|
|
60
60
|
|
|
61
|
+
/** Native Expo packages whose peer modules must be direct generated-app dependencies. */
|
|
62
|
+
export const EXPO_RUNTIME_PACKAGE_PEERS = {
|
|
63
|
+
[EXPO_PLATFORM.packages.audio.name]: [EXPO_PLATFORM.packages.asset.name],
|
|
64
|
+
} as const satisfies Readonly<Record<string, readonly string[]>>;
|
|
65
|
+
|
|
61
66
|
const EXPO_RUNTIME_CONFIG_HINTS = {
|
|
62
67
|
cameraPermission: {
|
|
63
68
|
plugin: {
|
package/src/platform.test.ts
CHANGED
|
@@ -28,6 +28,10 @@ describe('EXPO_PLATFORM', () => {
|
|
|
28
28
|
name: 'react-native',
|
|
29
29
|
version: '0.86.2',
|
|
30
30
|
});
|
|
31
|
+
expect(EXPO_PLATFORM.packages.crypto).toEqual({
|
|
32
|
+
name: 'expo-crypto',
|
|
33
|
+
version: '~57.0.2',
|
|
34
|
+
});
|
|
31
35
|
expect(EXPO_PLATFORM.tooling.node).toEqual({ lts: 24, version: '24.x' });
|
|
32
36
|
expect(EXPO_PLATFORM.animation.worklets.version).toBe('0.10.1');
|
|
33
37
|
});
|
package/src/platform.ts
CHANGED
|
@@ -53,6 +53,7 @@ export const EXPO_PLATFORM = {
|
|
|
53
53
|
authSession: definePackage('expo-auth-session', '~57.0.8'),
|
|
54
54
|
camera: definePackage('expo-camera', '~57.0.4'),
|
|
55
55
|
constants: definePackage('expo-constants', '~57.0.13'),
|
|
56
|
+
crypto: definePackage('expo-crypto', '~57.0.2'),
|
|
56
57
|
devClient: definePackage('expo-dev-client', '~57.0.14'),
|
|
57
58
|
documentPicker: definePackage('expo-document-picker', '~57.0.1'),
|
|
58
59
|
fileSystem: definePackage('expo-file-system', '~57.0.5'),
|
|
@@ -113,6 +113,11 @@ describe('resolveExpoRuntimePlan Expo 57 plugin coverage', () => {
|
|
|
113
113
|
},
|
|
114
114
|
},
|
|
115
115
|
]);
|
|
116
|
+
expect(plan.dependencies).toContainEqual({
|
|
117
|
+
name: EXPO_PLATFORM.packages.asset.name,
|
|
118
|
+
version: EXPO_PLATFORM.packages.asset.version,
|
|
119
|
+
reasons: [`peer:${EXPO_PLATFORM.packages.audio.name}`],
|
|
120
|
+
});
|
|
116
121
|
});
|
|
117
122
|
|
|
118
123
|
test('translates every supported permission into current Expo 57 packages and plugins', () => {
|
|
@@ -197,6 +202,7 @@ describe('resolveExpoRuntimePlan platform-neutral permissions', () => {
|
|
|
197
202
|
const SUPPORTED_PERMISSION_DEPENDENCIES = [
|
|
198
203
|
{ name: '@ankhorage/expo-runtime', version: '^3.0.0' },
|
|
199
204
|
{ name: '@ankhorage/permissions', version: '^0.2.3' },
|
|
205
|
+
{ name: 'expo-asset', version: EXPO_PLATFORM.packages.asset.version },
|
|
200
206
|
{ name: 'expo-audio', version: EXPO_PLATFORM.packages.audio.version },
|
|
201
207
|
{ name: 'expo-location', version: EXPO_PLATFORM.packages.location.version },
|
|
202
208
|
{ name: 'expo-media-library', version: EXPO_PLATFORM.packages.mediaLibrary.version },
|
|
@@ -13,6 +13,7 @@ import {
|
|
|
13
13
|
|
|
14
14
|
import {
|
|
15
15
|
EXPO_CAPABILITY_RUNTIME_REGISTRY,
|
|
16
|
+
EXPO_RUNTIME_PACKAGE_PEERS,
|
|
16
17
|
EXPO_RUNTIME_PROVIDER_PACKAGES,
|
|
17
18
|
type ExpoRuntimeAdapterId,
|
|
18
19
|
type ExpoRuntimeCapabilityMetadata,
|
|
@@ -233,6 +234,12 @@ function addDependency(context: PlanningContext, name: string, reason: string):
|
|
|
233
234
|
version,
|
|
234
235
|
reasons: existing === undefined ? [reason] : Array.from(new Set([...existing.reasons, reason])),
|
|
235
236
|
});
|
|
237
|
+
const requiredPeers = Object.entries(EXPO_RUNTIME_PACKAGE_PEERS).find(
|
|
238
|
+
([packageName]) => packageName === name,
|
|
239
|
+
)?.[1];
|
|
240
|
+
for (const peerName of requiredPeers ?? []) {
|
|
241
|
+
addDependency(context, peerName, `peer:${name}`);
|
|
242
|
+
}
|
|
236
243
|
}
|
|
237
244
|
|
|
238
245
|
function addProvider(
|