@ankhorage/permissions 0.1.1 → 0.2.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.
Files changed (70) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/README.md +97 -21
  3. package/dist/client/types.d.ts +2 -8
  4. package/dist/client/types.d.ts.map +1 -1
  5. package/dist/client/types.js.map +1 -1
  6. package/dist/expo/adapters/camera.d.ts +3 -0
  7. package/dist/expo/adapters/camera.d.ts.map +1 -0
  8. package/dist/expo/adapters/camera.js +30 -0
  9. package/dist/expo/adapters/camera.js.map +1 -0
  10. package/dist/expo/adapters/location.d.ts +3 -0
  11. package/dist/expo/adapters/location.d.ts.map +1 -0
  12. package/dist/expo/adapters/location.js +31 -0
  13. package/dist/expo/adapters/location.js.map +1 -0
  14. package/dist/expo/adapters/mediaLibrary.d.ts +3 -0
  15. package/dist/expo/adapters/mediaLibrary.d.ts.map +1 -0
  16. package/dist/expo/adapters/mediaLibrary.js +28 -0
  17. package/dist/expo/adapters/mediaLibrary.js.map +1 -0
  18. package/dist/expo/adapters/microphone.d.ts +3 -0
  19. package/dist/expo/adapters/microphone.d.ts.map +1 -0
  20. package/dist/expo/adapters/microphone.js +30 -0
  21. package/dist/expo/adapters/microphone.js.map +1 -0
  22. package/dist/expo/adapters/notifications.d.ts +3 -0
  23. package/dist/expo/adapters/notifications.d.ts.map +1 -0
  24. package/dist/expo/adapters/notifications.js +24 -0
  25. package/dist/expo/adapters/notifications.js.map +1 -0
  26. package/dist/expo/client.d.ts +9 -0
  27. package/dist/expo/client.d.ts.map +1 -0
  28. package/dist/expo/client.js +63 -0
  29. package/dist/expo/client.js.map +1 -0
  30. package/dist/expo/index.d.ts +3 -0
  31. package/dist/expo/index.d.ts.map +1 -0
  32. package/dist/expo/index.js +3 -0
  33. package/dist/expo/index.js.map +1 -0
  34. package/dist/expo/manifest.d.ts +9 -0
  35. package/dist/expo/manifest.d.ts.map +1 -0
  36. package/dist/expo/manifest.js +44 -0
  37. package/dist/expo/manifest.js.map +1 -0
  38. package/dist/expo/permissionResponse.d.ts +11 -0
  39. package/dist/expo/permissionResponse.d.ts.map +1 -0
  40. package/dist/expo/permissionResponse.js +47 -0
  41. package/dist/expo/permissionResponse.js.map +1 -0
  42. package/dist/manager/createPermissionManager.d.ts +4 -15
  43. package/dist/manager/createPermissionManager.d.ts.map +1 -1
  44. package/dist/manager/createPermissionManager.js +3 -14
  45. package/dist/manager/createPermissionManager.js.map +1 -1
  46. package/dist/react/index.d.ts +0 -14
  47. package/dist/react/index.d.ts.map +1 -1
  48. package/dist/react/index.js +0 -14
  49. package/dist/react/index.js.map +1 -1
  50. package/dist/testing/index.d.ts +0 -8
  51. package/dist/testing/index.d.ts.map +1 -1
  52. package/dist/testing/index.js +0 -8
  53. package/dist/testing/index.js.map +1 -1
  54. package/package.json +13 -1
  55. package/src/client/types.ts +2 -8
  56. package/src/expo/adapters/camera.ts +52 -0
  57. package/src/expo/adapters/location.ts +34 -0
  58. package/src/expo/adapters/mediaLibrary.ts +33 -0
  59. package/src/expo/adapters/microphone.ts +52 -0
  60. package/src/expo/adapters/notifications.ts +28 -0
  61. package/src/expo/client.test.ts +372 -0
  62. package/src/expo/client.ts +79 -0
  63. package/src/expo/index.ts +3 -0
  64. package/src/expo/manifest.test.ts +65 -0
  65. package/src/expo/manifest.ts +57 -0
  66. package/src/expo/modules.d.ts +53 -0
  67. package/src/expo/permissionResponse.ts +84 -0
  68. package/src/manager/createPermissionManager.ts +4 -15
  69. package/src/react/index.tsx +0 -14
  70. package/src/testing/index.ts +0 -8
package/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # @ankhorage/permissions
2
2
 
3
+ ## 0.2.0
4
+
5
+ ### Minor Changes
6
+
7
+ - b3cce8a: Add an optional Expo permission client entrypoint and manifest metadata, correct the Expo camera/audio/media-library permission handling, and tighten the Expo adapter tooling so strict lint, typecheck, and package verification pass without requiring Expo packages in the core workspace.
8
+
3
9
  ## 0.1.1
4
10
 
5
11
  ### Patch Changes
package/README.md CHANGED
@@ -3,10 +3,101 @@
3
3
 
4
4
  # PERMISSIONS
5
5
 
6
- ![license: MIT](././paradox/badges/license.svg) ![npm: v0.0.0](././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: v0.1.1](././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
  Cross-platform permission registry and runtime helpers for TypeScript apps, with unified request/check APIs for camera, media, location, notifications, microphone, etc. and web/native capabilities.
9
9
 
10
+ ## Usage
11
+
12
+ ### Basic permissions runtime example.
13
+
14
+ Create a permission client, provide it at the app root, and use
15
+ `usePermission` to read, refresh, and request a normalized permission state.
16
+
17
+ Source: `examples/basic/App.tsx`
18
+
19
+ ```tsx
20
+ import {
21
+ createFakePermissionClient,
22
+ Permission,
23
+ PermissionsProvider,
24
+ usePermission,
25
+ } from '@ankhorage/permissions';
26
+
27
+ const permissionClient = createFakePermissionClient({
28
+ initialStates: [{ permission: Permission.Camera, status: 'denied' }],
29
+ requestStates: [{ permission: Permission.Camera, status: 'granted' }],
30
+ });
31
+
32
+ export default function BasicPermissionsExample() {
33
+ return (
34
+ <PermissionsProvider client={permissionClient}>
35
+ <CameraPermissionExample />
36
+ </PermissionsProvider>
37
+ );
38
+ }
39
+
40
+ function CameraPermissionExample() {
41
+ const camera = usePermission(Permission.Camera, { refreshOnMount: true });
42
+
43
+ return (
44
+ <>
45
+ <p>Camera permission: {camera.status}</p>
46
+ <button
47
+ type="button"
48
+ disabled={camera.granted}
49
+ onClick={() => {
50
+ void camera.request();
51
+ }}
52
+ >
53
+ Request camera permission
54
+ </button>
55
+ </>
56
+ );
57
+ }
58
+ ```
59
+
60
+ ### Expo permissions runtime example.
61
+
62
+ Create the Expo permission client from the optional Expo entrypoint, provide
63
+ it at the app root, and call `request()` only from an explicit user action.
64
+
65
+ Source: `examples/expo/App.tsx`
66
+
67
+ ```tsx
68
+ import { Permission, PermissionsProvider, usePermission } from '@ankhorage/permissions';
69
+ import { createPermissionClient } from '@ankhorage/permissions/expo';
70
+
71
+ const permissionClient = createPermissionClient();
72
+
73
+ export default function ExpoPermissionsExample() {
74
+ return (
75
+ <PermissionsProvider client={permissionClient}>
76
+ <CameraPermissionExample />
77
+ </PermissionsProvider>
78
+ );
79
+ }
80
+
81
+ function CameraPermissionExample() {
82
+ const camera = usePermission(Permission.Camera, { refreshOnMount: true });
83
+
84
+ return (
85
+ <>
86
+ <p>Camera permission: {camera.status}</p>
87
+ <button
88
+ type="button"
89
+ disabled={camera.granted}
90
+ onClick={() => {
91
+ void camera.request();
92
+ }}
93
+ >
94
+ Request camera permission
95
+ </button>
96
+ </>
97
+ );
98
+ }
99
+ ```
100
+
10
101
  ## Generated documentation
11
102
 
12
103
  - [Interactive documentation app](././paradox/index.html)
@@ -40,15 +131,8 @@ Creates a deterministic in-memory client for tests and examples.
40
131
  Fake clients make permission flows testable without native devices, browser
41
132
  prompts, simulators, or network access.
42
133
 
43
- ```ts
44
- const client = createFakePermissionClient({
45
- initialStates: [{ permission: Permission.Camera, status: 'denied' }],
46
- });
47
- await client.request(Permission.Camera);
48
- ```
49
-
50
134
  Module: `src/testing/index.ts`
51
- Source: `src/testing/index.ts:63:1`
135
+ Source: `src/testing/index.ts:55:1`
52
136
  Related symbols: `FakePermissionClient`, `FakePermissionClientOptions`
53
137
 
54
138
  </details>
@@ -60,21 +144,13 @@ Related symbols: `FakePermissionClient`, `FakePermissionClientOptions`
60
144
  createPermissionManager(client: PermissionClient) => PermissionManager
61
145
  ```
62
146
 
63
- Wraps a client with registry validation and normalized results.
64
-
65
- Runtime permissions and build-time native configuration are separate concerns.
66
- This manager checks or requests permissions through a client, but it does not
67
- generate iOS usage descriptions, Android manifest entries, or Expo config
68
- plugins.
147
+ Creates a permission manager from a runtime-specific client.
69
148
 
70
- ```ts
71
- const permissions = createPermissionManager(client);
72
- const camera = await permissions.getStatus(Permission.Camera);
73
- const requested = camera.granted ? camera : await permissions.request(Permission.Camera);
74
- ```
149
+ The manager validates permission names and normalizes client results.
150
+ Native app configuration remains a separate build-time concern.
75
151
 
76
152
  Module: `src/manager/createPermissionManager.ts`
77
- Source: `src/manager/createPermissionManager.ts:32:1`
153
+ Source: `src/manager/createPermissionManager.ts:21:1`
78
154
  Related symbols: `PermissionClient`, `PermissionManager`
79
155
 
80
156
  </details>
@@ -1,15 +1,9 @@
1
1
  import type { Permission } from '../registry/permissions';
2
2
  import type { PermissionState } from '../state/permissionState';
3
3
  /***
4
- * Adapter-neutral interface for runtime permission checks and requests.
4
+ * Adapter-neutral contract for checking and requesting permissions.
5
5
  *
6
- * @usage
7
- * ```ts
8
- * const state = await client.getStatus(Permission.Camera);
9
- * if (!state.granted) {
10
- * await client.request(Permission.Camera);
11
- * }
12
- * ```
6
+ * Implementations provide permission state and permission requests for a runtime environment.
13
7
  */
14
8
  export interface PermissionClient {
15
9
  getStatus(permission: Permission): Promise<PermissionState>;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/client/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAEhE;;;;;;;;;;GAUG;AACH,MAAM,WAAW,gBAAgB;IAC/B,SAAS,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;IAC5D,OAAO,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;IAC1D,YAAY,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAChC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/client/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAEhE;;;;GAIG;AACH,MAAM,WAAW,gBAAgB;IAC/B,SAAS,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;IAC5D,OAAO,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;IAC1D,YAAY,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAChC"}
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/client/types.ts"],"names":[],"mappings":"","sourcesContent":["import type { Permission } from '../registry/permissions';\nimport type { PermissionState } from '../state/permissionState';\n\n/***\n * Adapter-neutral interface for runtime permission checks and requests.\n *\n * @usage\n * ```ts\n * const state = await client.getStatus(Permission.Camera);\n * if (!state.granted) {\n * await client.request(Permission.Camera);\n * }\n * ```\n */\nexport interface PermissionClient {\n getStatus(permission: Permission): Promise<PermissionState>;\n request(permission: Permission): Promise<PermissionState>;\n openSettings?(): Promise<void>;\n}\n"]}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/client/types.ts"],"names":[],"mappings":"","sourcesContent":["import type { Permission } from '../registry/permissions';\nimport type { PermissionState } from '../state/permissionState';\n\n/***\n * Adapter-neutral contract for checking and requesting permissions.\n *\n * Implementations provide permission state and permission requests for a runtime environment.\n */\nexport interface PermissionClient {\n getStatus(permission: Permission): Promise<PermissionState>;\n request(permission: Permission): Promise<PermissionState>;\n openSettings?(): Promise<void>;\n}\n"]}
@@ -0,0 +1,3 @@
1
+ import type { ExpoPermissionAdapter } from '../client';
2
+ export declare const cameraAdapter: ExpoPermissionAdapter;
3
+ //# sourceMappingURL=camera.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"camera.d.ts","sourceRoot":"","sources":["../../../src/expo/adapters/camera.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAC;AAUvD,eAAO,MAAM,aAAa,EAAE,qBA0B3B,CAAC"}
@@ -0,0 +1,30 @@
1
+ import { createExpoPermissionState, createExpoUnavailableState, findExpoPermissionMethod, } from '../permissionResponse';
2
+ const CAMERA_PERMISSION_CONTAINER_NAMES = ['CameraNativeModule', 'Camera'];
3
+ export const cameraAdapter = {
4
+ async getStatus(permission) {
5
+ try {
6
+ const result = await resolveCameraPermissionMethod(await import('expo-camera'), 'getCameraPermissionsAsync')();
7
+ return createExpoPermissionState(permission, result);
8
+ }
9
+ catch (error) {
10
+ return createExpoUnavailableState(permission, error);
11
+ }
12
+ },
13
+ async request(permission) {
14
+ try {
15
+ const result = await resolveCameraPermissionMethod(await import('expo-camera'), 'requestCameraPermissionsAsync')();
16
+ return createExpoPermissionState(permission, result);
17
+ }
18
+ catch (error) {
19
+ return createExpoUnavailableState(permission, error);
20
+ }
21
+ },
22
+ };
23
+ function resolveCameraPermissionMethod(source, methodName) {
24
+ const method = findExpoPermissionMethod(source, methodName, CAMERA_PERMISSION_CONTAINER_NAMES);
25
+ if (method === undefined) {
26
+ throw new Error(`expo-camera does not export ${methodName}.`);
27
+ }
28
+ return method;
29
+ }
30
+ //# sourceMappingURL=camera.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"camera.js","sourceRoot":"","sources":["../../../src/expo/adapters/camera.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,yBAAyB,EACzB,0BAA0B,EAE1B,wBAAwB,GACzB,MAAM,uBAAuB,CAAC;AAE/B,MAAM,iCAAiC,GAAG,CAAC,oBAAoB,EAAE,QAAQ,CAAU,CAAC;AAEpF,MAAM,CAAC,MAAM,aAAa,GAA0B;IAClD,KAAK,CAAC,SAAS,CAAC,UAAsB;QACpC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,6BAA6B,CAChD,MAAM,MAAM,CAAC,aAAa,CAAC,EAC3B,2BAA2B,CAC5B,EAAE,CAAC;YAEJ,OAAO,yBAAyB,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QACvD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,0BAA0B,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;QACvD,CAAC;IACH,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,UAAsB;QAClC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,6BAA6B,CAChD,MAAM,MAAM,CAAC,aAAa,CAAC,EAC3B,+BAA+B,CAChC,EAAE,CAAC;YAEJ,OAAO,yBAAyB,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QACvD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,0BAA0B,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;QACvD,CAAC;IACH,CAAC;CACF,CAAC;AAEF,SAAS,6BAA6B,CACpC,MAAe,EACf,UAAyE;IAEzE,MAAM,MAAM,GAAG,wBAAwB,CAAC,MAAM,EAAE,UAAU,EAAE,iCAAiC,CAAC,CAAC;IAE/F,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CAAC,+BAA+B,UAAU,GAAG,CAAC,CAAC;IAChE,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC","sourcesContent":["import type { Permission } from '../../registry/permissions';\nimport type { PermissionState } from '../../state/permissionState';\nimport type { ExpoPermissionAdapter } from '../client';\nimport {\n createExpoPermissionState,\n createExpoUnavailableState,\n type ExpoPermissionMethod,\n findExpoPermissionMethod,\n} from '../permissionResponse';\n\nconst CAMERA_PERMISSION_CONTAINER_NAMES = ['CameraNativeModule', 'Camera'] as const;\n\nexport const cameraAdapter: ExpoPermissionAdapter = {\n async getStatus(permission: Permission): Promise<PermissionState> {\n try {\n const result = await resolveCameraPermissionMethod(\n await import('expo-camera'),\n 'getCameraPermissionsAsync',\n )();\n\n return createExpoPermissionState(permission, result);\n } catch (error) {\n return createExpoUnavailableState(permission, error);\n }\n },\n\n async request(permission: Permission): Promise<PermissionState> {\n try {\n const result = await resolveCameraPermissionMethod(\n await import('expo-camera'),\n 'requestCameraPermissionsAsync',\n )();\n\n return createExpoPermissionState(permission, result);\n } catch (error) {\n return createExpoUnavailableState(permission, error);\n }\n },\n};\n\nfunction resolveCameraPermissionMethod(\n source: unknown,\n methodName: 'getCameraPermissionsAsync' | 'requestCameraPermissionsAsync',\n): ExpoPermissionMethod {\n const method = findExpoPermissionMethod(source, methodName, CAMERA_PERMISSION_CONTAINER_NAMES);\n\n if (method === undefined) {\n throw new Error(`expo-camera does not export ${methodName}.`);\n }\n\n return method;\n}\n"]}
@@ -0,0 +1,3 @@
1
+ import type { ExpoPermissionAdapter } from '../client';
2
+ export declare const locationAdapter: ExpoPermissionAdapter;
3
+ //# sourceMappingURL=location.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"location.d.ts","sourceRoot":"","sources":["../../../src/expo/adapters/location.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAC;AAGvD,eAAO,MAAM,eAAe,EAAE,qBA4B7B,CAAC"}
@@ -0,0 +1,31 @@
1
+ import { Permission } from '../../registry/permissions';
2
+ import { createExpoPermissionState, createExpoUnavailableState } from '../permissionResponse';
3
+ export const locationAdapter = {
4
+ async getStatus(permission) {
5
+ try {
6
+ const mod = await import('expo-location');
7
+ const isBackground = permission === Permission.LocationBackground;
8
+ const result = isBackground
9
+ ? await mod.getBackgroundPermissionsAsync()
10
+ : await mod.getForegroundPermissionsAsync();
11
+ return createExpoPermissionState(permission, result);
12
+ }
13
+ catch (error) {
14
+ return createExpoUnavailableState(permission, error);
15
+ }
16
+ },
17
+ async request(permission) {
18
+ try {
19
+ const mod = await import('expo-location');
20
+ const isBackground = permission === Permission.LocationBackground;
21
+ const result = isBackground
22
+ ? await mod.requestBackgroundPermissionsAsync()
23
+ : await mod.requestForegroundPermissionsAsync();
24
+ return createExpoPermissionState(permission, result);
25
+ }
26
+ catch (error) {
27
+ return createExpoUnavailableState(permission, error);
28
+ }
29
+ },
30
+ };
31
+ //# sourceMappingURL=location.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"location.js","sourceRoot":"","sources":["../../../src/expo/adapters/location.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAGxD,OAAO,EAAE,yBAAyB,EAAE,0BAA0B,EAAE,MAAM,uBAAuB,CAAC;AAE9F,MAAM,CAAC,MAAM,eAAe,GAA0B;IACpD,KAAK,CAAC,SAAS,CAAC,UAAsB;QACpC,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,CAAC;YAC1C,MAAM,YAAY,GAAG,UAAU,KAAK,UAAU,CAAC,kBAAkB,CAAC;YAClE,MAAM,MAAM,GAAG,YAAY;gBACzB,CAAC,CAAC,MAAM,GAAG,CAAC,6BAA6B,EAAE;gBAC3C,CAAC,CAAC,MAAM,GAAG,CAAC,6BAA6B,EAAE,CAAC;YAE9C,OAAO,yBAAyB,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QACvD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,0BAA0B,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;QACvD,CAAC;IACH,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,UAAsB;QAClC,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,CAAC;YAC1C,MAAM,YAAY,GAAG,UAAU,KAAK,UAAU,CAAC,kBAAkB,CAAC;YAClE,MAAM,MAAM,GAAG,YAAY;gBACzB,CAAC,CAAC,MAAM,GAAG,CAAC,iCAAiC,EAAE;gBAC/C,CAAC,CAAC,MAAM,GAAG,CAAC,iCAAiC,EAAE,CAAC;YAElD,OAAO,yBAAyB,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QACvD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,0BAA0B,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;QACvD,CAAC;IACH,CAAC;CACF,CAAC","sourcesContent":["import { Permission } from '../../registry/permissions';\nimport type { PermissionState } from '../../state/permissionState';\nimport type { ExpoPermissionAdapter } from '../client';\nimport { createExpoPermissionState, createExpoUnavailableState } from '../permissionResponse';\n\nexport const locationAdapter: ExpoPermissionAdapter = {\n async getStatus(permission: Permission): Promise<PermissionState> {\n try {\n const mod = await import('expo-location');\n const isBackground = permission === Permission.LocationBackground;\n const result = isBackground\n ? await mod.getBackgroundPermissionsAsync()\n : await mod.getForegroundPermissionsAsync();\n\n return createExpoPermissionState(permission, result);\n } catch (error) {\n return createExpoUnavailableState(permission, error);\n }\n },\n\n async request(permission: Permission): Promise<PermissionState> {\n try {\n const mod = await import('expo-location');\n const isBackground = permission === Permission.LocationBackground;\n const result = isBackground\n ? await mod.requestBackgroundPermissionsAsync()\n : await mod.requestForegroundPermissionsAsync();\n\n return createExpoPermissionState(permission, result);\n } catch (error) {\n return createExpoUnavailableState(permission, error);\n }\n },\n};\n"]}
@@ -0,0 +1,3 @@
1
+ import type { ExpoPermissionAdapter } from '../client';
2
+ export declare const mediaLibraryAdapter: ExpoPermissionAdapter;
3
+ //# sourceMappingURL=mediaLibrary.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mediaLibrary.d.ts","sourceRoot":"","sources":["../../../src/expo/adapters/mediaLibrary.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAC;AAGvD,eAAO,MAAM,mBAAmB,EAAE,qBAsBjC,CAAC"}
@@ -0,0 +1,28 @@
1
+ import { Permission as KnownPermission } from '../../registry/permissions';
2
+ import { createExpoPermissionState, createExpoUnavailableState } from '../permissionResponse';
3
+ export const mediaLibraryAdapter = {
4
+ async getStatus(permission) {
5
+ try {
6
+ const mod = await import('expo-media-library');
7
+ const result = await mod.getPermissionsAsync(isWriteOnlyPermission(permission));
8
+ return createExpoPermissionState(permission, result);
9
+ }
10
+ catch (error) {
11
+ return createExpoUnavailableState(permission, error);
12
+ }
13
+ },
14
+ async request(permission) {
15
+ try {
16
+ const mod = await import('expo-media-library');
17
+ const result = await mod.requestPermissionsAsync(isWriteOnlyPermission(permission));
18
+ return createExpoPermissionState(permission, result);
19
+ }
20
+ catch (error) {
21
+ return createExpoUnavailableState(permission, error);
22
+ }
23
+ },
24
+ };
25
+ function isWriteOnlyPermission(permission) {
26
+ return permission === KnownPermission.MediaLibraryWrite;
27
+ }
28
+ //# sourceMappingURL=mediaLibrary.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mediaLibrary.js","sourceRoot":"","sources":["../../../src/expo/adapters/mediaLibrary.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,IAAI,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAG3E,OAAO,EAAE,yBAAyB,EAAE,0BAA0B,EAAE,MAAM,uBAAuB,CAAC;AAE9F,MAAM,CAAC,MAAM,mBAAmB,GAA0B;IACxD,KAAK,CAAC,SAAS,CAAC,UAAsB;QACpC,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;YAC/C,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,mBAAmB,CAAC,qBAAqB,CAAC,UAAU,CAAC,CAAC,CAAC;YAEhF,OAAO,yBAAyB,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QACvD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,0BAA0B,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;QACvD,CAAC;IACH,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,UAAsB;QAClC,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;YAC/C,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,uBAAuB,CAAC,qBAAqB,CAAC,UAAU,CAAC,CAAC,CAAC;YAEpF,OAAO,yBAAyB,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QACvD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,0BAA0B,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;QACvD,CAAC;IACH,CAAC;CACF,CAAC;AAEF,SAAS,qBAAqB,CAAC,UAAsB;IACnD,OAAO,UAAU,KAAK,eAAe,CAAC,iBAAiB,CAAC;AAC1D,CAAC","sourcesContent":["import type { Permission } from '../../registry/permissions';\nimport { Permission as KnownPermission } from '../../registry/permissions';\nimport type { PermissionState } from '../../state/permissionState';\nimport type { ExpoPermissionAdapter } from '../client';\nimport { createExpoPermissionState, createExpoUnavailableState } from '../permissionResponse';\n\nexport const mediaLibraryAdapter: ExpoPermissionAdapter = {\n async getStatus(permission: Permission): Promise<PermissionState> {\n try {\n const mod = await import('expo-media-library');\n const result = await mod.getPermissionsAsync(isWriteOnlyPermission(permission));\n\n return createExpoPermissionState(permission, result);\n } catch (error) {\n return createExpoUnavailableState(permission, error);\n }\n },\n\n async request(permission: Permission): Promise<PermissionState> {\n try {\n const mod = await import('expo-media-library');\n const result = await mod.requestPermissionsAsync(isWriteOnlyPermission(permission));\n\n return createExpoPermissionState(permission, result);\n } catch (error) {\n return createExpoUnavailableState(permission, error);\n }\n },\n};\n\nfunction isWriteOnlyPermission(permission: Permission): boolean {\n return permission === KnownPermission.MediaLibraryWrite;\n}\n"]}
@@ -0,0 +1,3 @@
1
+ import type { ExpoPermissionAdapter } from '../client';
2
+ export declare const microphoneAdapter: ExpoPermissionAdapter;
3
+ //# sourceMappingURL=microphone.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"microphone.d.ts","sourceRoot":"","sources":["../../../src/expo/adapters/microphone.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAC;AAUvD,eAAO,MAAM,iBAAiB,EAAE,qBA0B/B,CAAC"}
@@ -0,0 +1,30 @@
1
+ import { createExpoPermissionState, createExpoUnavailableState, findExpoPermissionMethod, } from '../permissionResponse';
2
+ const AUDIO_PERMISSION_CONTAINER_NAMES = ['AudioModule', 'Audio'];
3
+ export const microphoneAdapter = {
4
+ async getStatus(permission) {
5
+ try {
6
+ const result = await resolveAudioPermissionMethod(await import('expo-audio'), 'getRecordingPermissionsAsync')();
7
+ return createExpoPermissionState(permission, result);
8
+ }
9
+ catch (error) {
10
+ return createExpoUnavailableState(permission, error);
11
+ }
12
+ },
13
+ async request(permission) {
14
+ try {
15
+ const result = await resolveAudioPermissionMethod(await import('expo-audio'), 'requestRecordingPermissionsAsync')();
16
+ return createExpoPermissionState(permission, result);
17
+ }
18
+ catch (error) {
19
+ return createExpoUnavailableState(permission, error);
20
+ }
21
+ },
22
+ };
23
+ function resolveAudioPermissionMethod(source, methodName) {
24
+ const method = findExpoPermissionMethod(source, methodName, AUDIO_PERMISSION_CONTAINER_NAMES);
25
+ if (method === undefined) {
26
+ throw new Error(`expo-audio does not export ${methodName}.`);
27
+ }
28
+ return method;
29
+ }
30
+ //# sourceMappingURL=microphone.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"microphone.js","sourceRoot":"","sources":["../../../src/expo/adapters/microphone.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,yBAAyB,EACzB,0BAA0B,EAE1B,wBAAwB,GACzB,MAAM,uBAAuB,CAAC;AAE/B,MAAM,gCAAgC,GAAG,CAAC,aAAa,EAAE,OAAO,CAAU,CAAC;AAE3E,MAAM,CAAC,MAAM,iBAAiB,GAA0B;IACtD,KAAK,CAAC,SAAS,CAAC,UAAsB;QACpC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,4BAA4B,CAC/C,MAAM,MAAM,CAAC,YAAY,CAAC,EAC1B,8BAA8B,CAC/B,EAAE,CAAC;YAEJ,OAAO,yBAAyB,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QACvD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,0BAA0B,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;QACvD,CAAC;IACH,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,UAAsB;QAClC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,4BAA4B,CAC/C,MAAM,MAAM,CAAC,YAAY,CAAC,EAC1B,kCAAkC,CACnC,EAAE,CAAC;YAEJ,OAAO,yBAAyB,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QACvD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,0BAA0B,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;QACvD,CAAC;IACH,CAAC;CACF,CAAC;AAEF,SAAS,4BAA4B,CACnC,MAAe,EACf,UAA+E;IAE/E,MAAM,MAAM,GAAG,wBAAwB,CAAC,MAAM,EAAE,UAAU,EAAE,gCAAgC,CAAC,CAAC;IAE9F,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CAAC,8BAA8B,UAAU,GAAG,CAAC,CAAC;IAC/D,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC","sourcesContent":["import type { Permission } from '../../registry/permissions';\nimport type { PermissionState } from '../../state/permissionState';\nimport type { ExpoPermissionAdapter } from '../client';\nimport {\n createExpoPermissionState,\n createExpoUnavailableState,\n type ExpoPermissionMethod,\n findExpoPermissionMethod,\n} from '../permissionResponse';\n\nconst AUDIO_PERMISSION_CONTAINER_NAMES = ['AudioModule', 'Audio'] as const;\n\nexport const microphoneAdapter: ExpoPermissionAdapter = {\n async getStatus(permission: Permission): Promise<PermissionState> {\n try {\n const result = await resolveAudioPermissionMethod(\n await import('expo-audio'),\n 'getRecordingPermissionsAsync',\n )();\n\n return createExpoPermissionState(permission, result);\n } catch (error) {\n return createExpoUnavailableState(permission, error);\n }\n },\n\n async request(permission: Permission): Promise<PermissionState> {\n try {\n const result = await resolveAudioPermissionMethod(\n await import('expo-audio'),\n 'requestRecordingPermissionsAsync',\n )();\n\n return createExpoPermissionState(permission, result);\n } catch (error) {\n return createExpoUnavailableState(permission, error);\n }\n },\n};\n\nfunction resolveAudioPermissionMethod(\n source: unknown,\n methodName: 'getRecordingPermissionsAsync' | 'requestRecordingPermissionsAsync',\n): ExpoPermissionMethod {\n const method = findExpoPermissionMethod(source, methodName, AUDIO_PERMISSION_CONTAINER_NAMES);\n\n if (method === undefined) {\n throw new Error(`expo-audio does not export ${methodName}.`);\n }\n\n return method;\n}\n"]}
@@ -0,0 +1,3 @@
1
+ import type { ExpoPermissionAdapter } from '../client';
2
+ export declare const notificationsAdapter: ExpoPermissionAdapter;
3
+ //# sourceMappingURL=notifications.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notifications.d.ts","sourceRoot":"","sources":["../../../src/expo/adapters/notifications.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAC;AAGvD,eAAO,MAAM,oBAAoB,EAAE,qBAsBlC,CAAC"}
@@ -0,0 +1,24 @@
1
+ import { createExpoPermissionState, createExpoUnavailableState } from '../permissionResponse';
2
+ export const notificationsAdapter = {
3
+ async getStatus(permission) {
4
+ try {
5
+ const mod = await import('expo-notifications');
6
+ const result = await mod.getPermissionsAsync();
7
+ return createExpoPermissionState(permission, result);
8
+ }
9
+ catch (error) {
10
+ return createExpoUnavailableState(permission, error);
11
+ }
12
+ },
13
+ async request(permission) {
14
+ try {
15
+ const mod = await import('expo-notifications');
16
+ const result = await mod.requestPermissionsAsync();
17
+ return createExpoPermissionState(permission, result);
18
+ }
19
+ catch (error) {
20
+ return createExpoUnavailableState(permission, error);
21
+ }
22
+ },
23
+ };
24
+ //# sourceMappingURL=notifications.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notifications.js","sourceRoot":"","sources":["../../../src/expo/adapters/notifications.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,yBAAyB,EAAE,0BAA0B,EAAE,MAAM,uBAAuB,CAAC;AAE9F,MAAM,CAAC,MAAM,oBAAoB,GAA0B;IACzD,KAAK,CAAC,SAAS,CAAC,UAAsB;QACpC,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;YAC/C,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,mBAAmB,EAAE,CAAC;YAE/C,OAAO,yBAAyB,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QACvD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,0BAA0B,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;QACvD,CAAC;IACH,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,UAAsB;QAClC,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;YAC/C,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,uBAAuB,EAAE,CAAC;YAEnD,OAAO,yBAAyB,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QACvD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,0BAA0B,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;QACvD,CAAC;IACH,CAAC;CACF,CAAC","sourcesContent":["import type { Permission } from '../../registry/permissions';\nimport type { PermissionState } from '../../state/permissionState';\nimport type { ExpoPermissionAdapter } from '../client';\nimport { createExpoPermissionState, createExpoUnavailableState } from '../permissionResponse';\n\nexport const notificationsAdapter: ExpoPermissionAdapter = {\n async getStatus(permission: Permission): Promise<PermissionState> {\n try {\n const mod = await import('expo-notifications');\n const result = await mod.getPermissionsAsync();\n\n return createExpoPermissionState(permission, result);\n } catch (error) {\n return createExpoUnavailableState(permission, error);\n }\n },\n\n async request(permission: Permission): Promise<PermissionState> {\n try {\n const mod = await import('expo-notifications');\n const result = await mod.requestPermissionsAsync();\n\n return createExpoPermissionState(permission, result);\n } catch (error) {\n return createExpoUnavailableState(permission, error);\n }\n },\n};\n"]}
@@ -0,0 +1,9 @@
1
+ import type { PermissionClient } from '../client/types';
2
+ import { Permission } from '../registry/permissions';
3
+ import { type PermissionState } from '../state/permissionState';
4
+ export interface ExpoPermissionAdapter {
5
+ getStatus(permission: Permission): Promise<PermissionState>;
6
+ request(permission: Permission): Promise<PermissionState>;
7
+ }
8
+ export declare function createPermissionClient(): PermissionClient;
9
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/expo/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAyB,KAAK,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAQvF,MAAM,WAAW,qBAAqB;IACpC,SAAS,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;IAC5D,OAAO,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;CAC3D;AAYD,wBAAgB,sBAAsB,IAAI,gBAAgB,CAsCzD"}
@@ -0,0 +1,63 @@
1
+ import { Permission } from '../registry/permissions';
2
+ import { createPermissionState } from '../state/permissionState';
3
+ import { cameraAdapter } from './adapters/camera';
4
+ import { locationAdapter } from './adapters/location';
5
+ import { mediaLibraryAdapter } from './adapters/mediaLibrary';
6
+ import { microphoneAdapter } from './adapters/microphone';
7
+ import { notificationsAdapter } from './adapters/notifications';
8
+ import { EXPO_PERMISSION_SUPPORT } from './manifest';
9
+ const adapters = {
10
+ [Permission.Camera]: cameraAdapter,
11
+ [Permission.MediaLibrary]: mediaLibraryAdapter,
12
+ [Permission.MediaLibraryWrite]: mediaLibraryAdapter,
13
+ [Permission.Microphone]: microphoneAdapter,
14
+ [Permission.LocationForeground]: locationAdapter,
15
+ [Permission.LocationBackground]: locationAdapter,
16
+ [Permission.Notifications]: notificationsAdapter,
17
+ };
18
+ export function createPermissionClient() {
19
+ return {
20
+ async getStatus(permission) {
21
+ const metadata = EXPO_PERMISSION_SUPPORT[permission];
22
+ if (metadata.support === 'unsupported' || metadata.support === 'notImplemented') {
23
+ return createUnavailableSupportState(permission);
24
+ }
25
+ if (metadata.support === 'notRequired') {
26
+ return createNotRequiredState(permission);
27
+ }
28
+ const adapter = adapters[permission];
29
+ if (!adapter) {
30
+ throw new Error(`No adapter registered for permission: ${permission}`);
31
+ }
32
+ return adapter.getStatus(permission);
33
+ },
34
+ async request(permission) {
35
+ const metadata = EXPO_PERMISSION_SUPPORT[permission];
36
+ if (metadata.support === 'unsupported' || metadata.support === 'notImplemented') {
37
+ return createUnavailableSupportState(permission);
38
+ }
39
+ if (metadata.support === 'notRequired') {
40
+ return createNotRequiredState(permission);
41
+ }
42
+ const adapter = adapters[permission];
43
+ if (!adapter) {
44
+ throw new Error(`No adapter registered for permission: ${permission}`);
45
+ }
46
+ return adapter.request(permission);
47
+ },
48
+ };
49
+ }
50
+ function createUnavailableSupportState(permission) {
51
+ return createPermissionState({
52
+ permission,
53
+ status: 'unavailable',
54
+ reason: `Permission ${permission} is not implemented or supported on Expo.`,
55
+ });
56
+ }
57
+ function createNotRequiredState(permission) {
58
+ return createPermissionState({
59
+ permission,
60
+ status: 'granted',
61
+ });
62
+ }
63
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/expo/client.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,qBAAqB,EAAwB,MAAM,0BAA0B,CAAC;AACvF,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAOrD,MAAM,QAAQ,GAAuD;IACnE,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,aAAa;IAClC,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,mBAAmB;IAC9C,CAAC,UAAU,CAAC,iBAAiB,CAAC,EAAE,mBAAmB;IACnD,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,iBAAiB;IAC1C,CAAC,UAAU,CAAC,kBAAkB,CAAC,EAAE,eAAe;IAChD,CAAC,UAAU,CAAC,kBAAkB,CAAC,EAAE,eAAe;IAChD,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,oBAAoB;CACjD,CAAC;AAEF,MAAM,UAAU,sBAAsB;IACpC,OAAO;QACL,KAAK,CAAC,SAAS,CAAC,UAAsB;YACpC,MAAM,QAAQ,GAAG,uBAAuB,CAAC,UAAU,CAAC,CAAC;YACrD,IAAI,QAAQ,CAAC,OAAO,KAAK,aAAa,IAAI,QAAQ,CAAC,OAAO,KAAK,gBAAgB,EAAE,CAAC;gBAChF,OAAO,6BAA6B,CAAC,UAAU,CAAC,CAAC;YACnD,CAAC;YAED,IAAI,QAAQ,CAAC,OAAO,KAAK,aAAa,EAAE,CAAC;gBACvC,OAAO,sBAAsB,CAAC,UAAU,CAAC,CAAC;YAC5C,CAAC;YAED,MAAM,OAAO,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAC;YACrC,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,MAAM,IAAI,KAAK,CAAC,yCAAyC,UAAU,EAAE,CAAC,CAAC;YACzE,CAAC;YAED,OAAO,OAAO,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QACvC,CAAC;QAED,KAAK,CAAC,OAAO,CAAC,UAAsB;YAClC,MAAM,QAAQ,GAAG,uBAAuB,CAAC,UAAU,CAAC,CAAC;YACrD,IAAI,QAAQ,CAAC,OAAO,KAAK,aAAa,IAAI,QAAQ,CAAC,OAAO,KAAK,gBAAgB,EAAE,CAAC;gBAChF,OAAO,6BAA6B,CAAC,UAAU,CAAC,CAAC;YACnD,CAAC;YAED,IAAI,QAAQ,CAAC,OAAO,KAAK,aAAa,EAAE,CAAC;gBACvC,OAAO,sBAAsB,CAAC,UAAU,CAAC,CAAC;YAC5C,CAAC;YAED,MAAM,OAAO,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAC;YACrC,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,MAAM,IAAI,KAAK,CAAC,yCAAyC,UAAU,EAAE,CAAC,CAAC;YACzE,CAAC;YAED,OAAO,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QACrC,CAAC;KACF,CAAC;AACJ,CAAC;AAED,SAAS,6BAA6B,CAAC,UAAsB;IAC3D,OAAO,qBAAqB,CAAC;QAC3B,UAAU;QACV,MAAM,EAAE,aAAa;QACrB,MAAM,EAAE,cAAc,UAAU,2CAA2C;KAC5E,CAAC,CAAC;AACL,CAAC;AAED,SAAS,sBAAsB,CAAC,UAAsB;IACpD,OAAO,qBAAqB,CAAC;QAC3B,UAAU;QACV,MAAM,EAAE,SAAS;KAClB,CAAC,CAAC;AACL,CAAC","sourcesContent":["import type { PermissionClient } from '../client/types';\nimport { Permission } from '../registry/permissions';\nimport { createPermissionState, type PermissionState } from '../state/permissionState';\nimport { cameraAdapter } from './adapters/camera';\nimport { locationAdapter } from './adapters/location';\nimport { mediaLibraryAdapter } from './adapters/mediaLibrary';\nimport { microphoneAdapter } from './adapters/microphone';\nimport { notificationsAdapter } from './adapters/notifications';\nimport { EXPO_PERMISSION_SUPPORT } from './manifest';\n\nexport interface ExpoPermissionAdapter {\n getStatus(permission: Permission): Promise<PermissionState>;\n request(permission: Permission): Promise<PermissionState>;\n}\n\nconst adapters: Partial<Record<Permission, ExpoPermissionAdapter>> = {\n [Permission.Camera]: cameraAdapter,\n [Permission.MediaLibrary]: mediaLibraryAdapter,\n [Permission.MediaLibraryWrite]: mediaLibraryAdapter,\n [Permission.Microphone]: microphoneAdapter,\n [Permission.LocationForeground]: locationAdapter,\n [Permission.LocationBackground]: locationAdapter,\n [Permission.Notifications]: notificationsAdapter,\n};\n\nexport function createPermissionClient(): PermissionClient {\n return {\n async getStatus(permission: Permission): Promise<PermissionState> {\n const metadata = EXPO_PERMISSION_SUPPORT[permission];\n if (metadata.support === 'unsupported' || metadata.support === 'notImplemented') {\n return createUnavailableSupportState(permission);\n }\n\n if (metadata.support === 'notRequired') {\n return createNotRequiredState(permission);\n }\n\n const adapter = adapters[permission];\n if (!adapter) {\n throw new Error(`No adapter registered for permission: ${permission}`);\n }\n\n return adapter.getStatus(permission);\n },\n\n async request(permission: Permission): Promise<PermissionState> {\n const metadata = EXPO_PERMISSION_SUPPORT[permission];\n if (metadata.support === 'unsupported' || metadata.support === 'notImplemented') {\n return createUnavailableSupportState(permission);\n }\n\n if (metadata.support === 'notRequired') {\n return createNotRequiredState(permission);\n }\n\n const adapter = adapters[permission];\n if (!adapter) {\n throw new Error(`No adapter registered for permission: ${permission}`);\n }\n\n return adapter.request(permission);\n },\n };\n}\n\nfunction createUnavailableSupportState(permission: Permission): PermissionState {\n return createPermissionState({\n permission,\n status: 'unavailable',\n reason: `Permission ${permission} is not implemented or supported on Expo.`,\n });\n}\n\nfunction createNotRequiredState(permission: Permission): PermissionState {\n return createPermissionState({\n permission,\n status: 'granted',\n });\n}\n"]}
@@ -0,0 +1,3 @@
1
+ import { createPermissionClient } from './client';
2
+ export { createPermissionClient };
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/expo/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAC;AAElD,OAAO,EAAE,sBAAsB,EAAE,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { createPermissionClient } from './client';
2
+ export { createPermissionClient };
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/expo/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAC;AAElD,OAAO,EAAE,sBAAsB,EAAE,CAAC","sourcesContent":["import { createPermissionClient } from './client';\n\nexport { createPermissionClient };\n"]}
@@ -0,0 +1,9 @@
1
+ import { Permission } from '../registry/permissions';
2
+ export type PermissionSupport = 'supported' | 'notRequired' | 'limited' | 'notImplemented' | 'unsupported';
3
+ export interface ExpoPermissionMetadata {
4
+ readonly support: PermissionSupport;
5
+ readonly requiredPackages: readonly string[];
6
+ readonly configHints: readonly string[];
7
+ }
8
+ export declare const EXPO_PERMISSION_SUPPORT: Readonly<Record<Permission, ExpoPermissionMetadata>>;
9
+ //# sourceMappingURL=manifest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../../src/expo/manifest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAErD,MAAM,MAAM,iBAAiB,GACzB,WAAW,GACX,aAAa,GACb,SAAS,GACT,gBAAgB,GAChB,aAAa,CAAC;AAElB,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,OAAO,EAAE,iBAAiB,CAAC;IACpC,QAAQ,CAAC,gBAAgB,EAAE,SAAS,MAAM,EAAE,CAAC;IAC7C,QAAQ,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;CACzC;AAED,eAAO,MAAM,uBAAuB,EAAE,QAAQ,CAAC,MAAM,CAAC,UAAU,EAAE,sBAAsB,CAAC,CAyCxF,CAAC"}
@@ -0,0 +1,44 @@
1
+ import { Permission } from '../registry/permissions';
2
+ export const EXPO_PERMISSION_SUPPORT = {
3
+ [Permission.Camera]: {
4
+ support: 'supported',
5
+ requiredPackages: ['expo-camera'],
6
+ configHints: ['cameraPermission'],
7
+ },
8
+ [Permission.Microphone]: {
9
+ support: 'supported',
10
+ requiredPackages: ['expo-audio'],
11
+ configHints: ['microphonePermission', 'recordAudioAndroid'],
12
+ },
13
+ [Permission.MediaLibrary]: {
14
+ support: 'supported',
15
+ requiredPackages: ['expo-media-library'],
16
+ configHints: ['mediaLibraryPermission'],
17
+ },
18
+ [Permission.MediaLibraryWrite]: {
19
+ support: 'supported',
20
+ requiredPackages: ['expo-media-library'],
21
+ configHints: ['mediaLibraryPermission'],
22
+ },
23
+ [Permission.LocationForeground]: {
24
+ support: 'supported',
25
+ requiredPackages: ['expo-location'],
26
+ configHints: ['locationWhenInUsePermission'],
27
+ },
28
+ [Permission.LocationBackground]: {
29
+ support: 'supported',
30
+ requiredPackages: ['expo-location'],
31
+ configHints: ['locationAlwaysAndWhenInUsePermission'],
32
+ },
33
+ [Permission.Notifications]: {
34
+ support: 'supported',
35
+ requiredPackages: ['expo-notifications'],
36
+ configHints: ['notificationsPermission'],
37
+ },
38
+ [Permission.Clipboard]: {
39
+ support: 'notRequired',
40
+ requiredPackages: [],
41
+ configHints: [],
42
+ },
43
+ };
44
+ //# sourceMappingURL=manifest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../src/expo/manifest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAerD,MAAM,CAAC,MAAM,uBAAuB,GAAyD;IAC3F,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE;QACnB,OAAO,EAAE,WAAW;QACpB,gBAAgB,EAAE,CAAC,aAAa,CAAC;QACjC,WAAW,EAAE,CAAC,kBAAkB,CAAC;KAClC;IACD,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE;QACvB,OAAO,EAAE,WAAW;QACpB,gBAAgB,EAAE,CAAC,YAAY,CAAC;QAChC,WAAW,EAAE,CAAC,sBAAsB,EAAE,oBAAoB,CAAC;KAC5D;IACD,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE;QACzB,OAAO,EAAE,WAAW;QACpB,gBAAgB,EAAE,CAAC,oBAAoB,CAAC;QACxC,WAAW,EAAE,CAAC,wBAAwB,CAAC;KACxC;IACD,CAAC,UAAU,CAAC,iBAAiB,CAAC,EAAE;QAC9B,OAAO,EAAE,WAAW;QACpB,gBAAgB,EAAE,CAAC,oBAAoB,CAAC;QACxC,WAAW,EAAE,CAAC,wBAAwB,CAAC;KACxC;IACD,CAAC,UAAU,CAAC,kBAAkB,CAAC,EAAE;QAC/B,OAAO,EAAE,WAAW;QACpB,gBAAgB,EAAE,CAAC,eAAe,CAAC;QACnC,WAAW,EAAE,CAAC,6BAA6B,CAAC;KAC7C;IACD,CAAC,UAAU,CAAC,kBAAkB,CAAC,EAAE;QAC/B,OAAO,EAAE,WAAW;QACpB,gBAAgB,EAAE,CAAC,eAAe,CAAC;QACnC,WAAW,EAAE,CAAC,sCAAsC,CAAC;KACtD;IACD,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE;QAC1B,OAAO,EAAE,WAAW;QACpB,gBAAgB,EAAE,CAAC,oBAAoB,CAAC;QACxC,WAAW,EAAE,CAAC,yBAAyB,CAAC;KACzC;IACD,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE;QACtB,OAAO,EAAE,aAAa;QACtB,gBAAgB,EAAE,EAAE;QACpB,WAAW,EAAE,EAAE;KAChB;CACF,CAAC","sourcesContent":["import { Permission } from '../registry/permissions';\n\nexport type PermissionSupport =\n | 'supported'\n | 'notRequired'\n | 'limited'\n | 'notImplemented'\n | 'unsupported';\n\nexport interface ExpoPermissionMetadata {\n readonly support: PermissionSupport;\n readonly requiredPackages: readonly string[];\n readonly configHints: readonly string[];\n}\n\nexport const EXPO_PERMISSION_SUPPORT: Readonly<Record<Permission, ExpoPermissionMetadata>> = {\n [Permission.Camera]: {\n support: 'supported',\n requiredPackages: ['expo-camera'],\n configHints: ['cameraPermission'],\n },\n [Permission.Microphone]: {\n support: 'supported',\n requiredPackages: ['expo-audio'],\n configHints: ['microphonePermission', 'recordAudioAndroid'],\n },\n [Permission.MediaLibrary]: {\n support: 'supported',\n requiredPackages: ['expo-media-library'],\n configHints: ['mediaLibraryPermission'],\n },\n [Permission.MediaLibraryWrite]: {\n support: 'supported',\n requiredPackages: ['expo-media-library'],\n configHints: ['mediaLibraryPermission'],\n },\n [Permission.LocationForeground]: {\n support: 'supported',\n requiredPackages: ['expo-location'],\n configHints: ['locationWhenInUsePermission'],\n },\n [Permission.LocationBackground]: {\n support: 'supported',\n requiredPackages: ['expo-location'],\n configHints: ['locationAlwaysAndWhenInUsePermission'],\n },\n [Permission.Notifications]: {\n support: 'supported',\n requiredPackages: ['expo-notifications'],\n configHints: ['notificationsPermission'],\n },\n [Permission.Clipboard]: {\n support: 'notRequired',\n requiredPackages: [],\n configHints: [],\n },\n};\n"]}
@@ -0,0 +1,11 @@
1
+ import type { Permission } from '../registry/permissions';
2
+ import { type PermissionState } from '../state/permissionState';
3
+ export interface ExpoPermissionResponse {
4
+ readonly status: string;
5
+ readonly canAskAgain?: boolean;
6
+ }
7
+ export type ExpoPermissionMethod = () => Promise<ExpoPermissionResponse>;
8
+ export declare function createExpoPermissionState(permission: Permission, response: ExpoPermissionResponse): PermissionState;
9
+ export declare function createExpoUnavailableState(permission: Permission, error: unknown): PermissionState;
10
+ export declare function findExpoPermissionMethod(source: unknown, methodName: string, containerNames?: readonly string[]): ExpoPermissionMethod | undefined;
11
+ //# sourceMappingURL=permissionResponse.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"permissionResponse.d.ts","sourceRoot":"","sources":["../../src/expo/permissionResponse.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAGL,KAAK,eAAe,EACrB,MAAM,0BAA0B,CAAC;AAElC,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC;CAChC;AAED,MAAM,MAAM,oBAAoB,GAAG,MAAM,OAAO,CAAC,sBAAsB,CAAC,CAAC;AAEzE,wBAAgB,yBAAyB,CACvC,UAAU,EAAE,UAAU,EACtB,QAAQ,EAAE,sBAAsB,GAC/B,eAAe,CAQjB;AAED,wBAAgB,0BAA0B,CACxC,UAAU,EAAE,UAAU,EACtB,KAAK,EAAE,OAAO,GACb,eAAe,CAMjB;AAED,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,OAAO,EACf,UAAU,EAAE,MAAM,EAClB,cAAc,GAAE,SAAS,MAAM,EAAO,GACrC,oBAAoB,GAAG,SAAS,CAkBlC"}