@ankhorage/permissions 0.1.0 → 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.
- package/CHANGELOG.md +12 -0
- package/README.md +97 -21
- package/dist/client/types.d.ts +2 -8
- package/dist/client/types.d.ts.map +1 -1
- package/dist/client/types.js.map +1 -1
- package/dist/expo/adapters/camera.d.ts +3 -0
- package/dist/expo/adapters/camera.d.ts.map +1 -0
- package/dist/expo/adapters/camera.js +30 -0
- package/dist/expo/adapters/camera.js.map +1 -0
- package/dist/expo/adapters/location.d.ts +3 -0
- package/dist/expo/adapters/location.d.ts.map +1 -0
- package/dist/expo/adapters/location.js +31 -0
- package/dist/expo/adapters/location.js.map +1 -0
- package/dist/expo/adapters/mediaLibrary.d.ts +3 -0
- package/dist/expo/adapters/mediaLibrary.d.ts.map +1 -0
- package/dist/expo/adapters/mediaLibrary.js +28 -0
- package/dist/expo/adapters/mediaLibrary.js.map +1 -0
- package/dist/expo/adapters/microphone.d.ts +3 -0
- package/dist/expo/adapters/microphone.d.ts.map +1 -0
- package/dist/expo/adapters/microphone.js +30 -0
- package/dist/expo/adapters/microphone.js.map +1 -0
- package/dist/expo/adapters/notifications.d.ts +3 -0
- package/dist/expo/adapters/notifications.d.ts.map +1 -0
- package/dist/expo/adapters/notifications.js +24 -0
- package/dist/expo/adapters/notifications.js.map +1 -0
- package/dist/expo/client.d.ts +9 -0
- package/dist/expo/client.d.ts.map +1 -0
- package/dist/expo/client.js +63 -0
- package/dist/expo/client.js.map +1 -0
- package/dist/expo/index.d.ts +3 -0
- package/dist/expo/index.d.ts.map +1 -0
- package/dist/expo/index.js +3 -0
- package/dist/expo/index.js.map +1 -0
- package/dist/expo/manifest.d.ts +9 -0
- package/dist/expo/manifest.d.ts.map +1 -0
- package/dist/expo/manifest.js +44 -0
- package/dist/expo/manifest.js.map +1 -0
- package/dist/expo/permissionResponse.d.ts +11 -0
- package/dist/expo/permissionResponse.d.ts.map +1 -0
- package/dist/expo/permissionResponse.js +47 -0
- package/dist/expo/permissionResponse.js.map +1 -0
- package/dist/manager/createPermissionManager.d.ts +4 -15
- package/dist/manager/createPermissionManager.d.ts.map +1 -1
- package/dist/manager/createPermissionManager.js +3 -14
- package/dist/manager/createPermissionManager.js.map +1 -1
- package/dist/react/index.d.ts +0 -14
- package/dist/react/index.d.ts.map +1 -1
- package/dist/react/index.js +0 -14
- package/dist/react/index.js.map +1 -1
- package/dist/testing/index.d.ts +0 -8
- package/dist/testing/index.d.ts.map +1 -1
- package/dist/testing/index.js +0 -8
- package/dist/testing/index.js.map +1 -1
- package/package.json +13 -1
- package/src/client/types.ts +2 -8
- package/src/expo/adapters/camera.ts +52 -0
- package/src/expo/adapters/location.ts +34 -0
- package/src/expo/adapters/mediaLibrary.ts +33 -0
- package/src/expo/adapters/microphone.ts +52 -0
- package/src/expo/adapters/notifications.ts +28 -0
- package/src/expo/client.test.ts +372 -0
- package/src/expo/client.ts +79 -0
- package/src/expo/index.ts +3 -0
- package/src/expo/manifest.test.ts +65 -0
- package/src/expo/manifest.ts +57 -0
- package/src/expo/modules.d.ts +53 -0
- package/src/expo/permissionResponse.ts +84 -0
- package/src/manager/createPermissionManager.ts +4 -15
- package/src/react/index.tsx +0 -14
- package/src/testing/index.ts +0 -8
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,17 @@
|
|
|
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
|
+
|
|
9
|
+
## 0.1.1
|
|
10
|
+
|
|
11
|
+
### Patch Changes
|
|
12
|
+
|
|
13
|
+
- a45a271: Release Trigger (release.yml Workflow)
|
|
14
|
+
|
|
3
15
|
## 0.1.0
|
|
4
16
|
|
|
5
17
|
### Minor Changes
|
package/README.md
CHANGED
|
@@ -3,10 +3,101 @@
|
|
|
3
3
|
|
|
4
4
|
# PERMISSIONS
|
|
5
5
|
|
|
6
|
-
         
|
|
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:
|
|
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
|
-
|
|
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
|
-
|
|
71
|
-
|
|
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:
|
|
153
|
+
Source: `src/manager/createPermissionManager.ts:21:1`
|
|
78
154
|
Related symbols: `PermissionClient`, `PermissionManager`
|
|
79
155
|
|
|
80
156
|
</details>
|
package/dist/client/types.d.ts
CHANGED
|
@@ -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
|
|
4
|
+
* Adapter-neutral contract for checking and requesting permissions.
|
|
5
5
|
*
|
|
6
|
-
*
|
|
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
|
|
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"}
|
package/dist/client/types.js.map
CHANGED
|
@@ -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
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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"}
|