@ankhorage/permissions 0.1.1 → 0.2.1
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 +98 -22
- package/dist/ankh.provider.d.ts +40 -0
- package/dist/ankh.provider.d.ts.map +1 -0
- package/dist/ankh.provider.js +55 -0
- package/dist/ankh.provider.js.map +1 -0
- 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 +24 -2
- package/src/ankh.provider.ts +66 -0
- 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/provider.test.ts +13 -0
- 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.1
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- 15d1dae: Expose permission registry, check, request, and manifest commands through an Ankh provider manifest.
|
|
8
|
+
|
|
9
|
+
## 0.2.0
|
|
10
|
+
|
|
11
|
+
### Minor Changes
|
|
12
|
+
|
|
13
|
+
- 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.
|
|
14
|
+
|
|
3
15
|
## 0.1.1
|
|
4
16
|
|
|
5
17
|
### Patch Changes
|
package/README.md
CHANGED
|
@@ -3,9 +3,100 @@
|
|
|
3
3
|
|
|
4
4
|
# PERMISSIONS
|
|
5
5
|
|
|
6
|
-
         
|
|
7
7
|
|
|
8
|
-
Cross-platform permission registry and runtime helpers for
|
|
8
|
+
Cross-platform permission registry and runtime helpers for Expo, React Native, and React Native Web apps, with unified request/check APIs for camera, media, location, notifications, microphone, and other web/native capabilities.
|
|
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
|
+
```
|
|
9
100
|
|
|
10
101
|
## Generated documentation
|
|
11
102
|
|
|
@@ -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>
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
declare const provider: {
|
|
2
|
+
id: string;
|
|
3
|
+
category: string;
|
|
4
|
+
version: string;
|
|
5
|
+
capabilities: readonly ["permissions.inspect", "permissions.check", "permissions.request", "permissions.manifest"];
|
|
6
|
+
commands: readonly [{
|
|
7
|
+
readonly path: readonly ["list"];
|
|
8
|
+
readonly summary: "List known permission identifiers and registry metadata.";
|
|
9
|
+
readonly capability: "permissions.inspect";
|
|
10
|
+
readonly aliases: readonly ["registry"];
|
|
11
|
+
readonly examples: readonly ["ankh permissions list"];
|
|
12
|
+
}, {
|
|
13
|
+
readonly path: readonly ["check"];
|
|
14
|
+
readonly summary: "Check a permission state through a host-provided permission client.";
|
|
15
|
+
readonly capability: "permissions.check";
|
|
16
|
+
readonly examples: readonly ["ankh permissions check camera"];
|
|
17
|
+
}, {
|
|
18
|
+
readonly path: readonly ["request"];
|
|
19
|
+
readonly summary: "Request a permission through a host-provided permission client.";
|
|
20
|
+
readonly capability: "permissions.request";
|
|
21
|
+
readonly examples: readonly ["ankh permissions request camera"];
|
|
22
|
+
}, {
|
|
23
|
+
readonly path: readonly ["manifest"];
|
|
24
|
+
readonly summary: "Show native/web manifest metadata required by registered permissions.";
|
|
25
|
+
readonly capability: "permissions.manifest";
|
|
26
|
+
readonly examples: readonly ["ankh permissions manifest camera"];
|
|
27
|
+
}];
|
|
28
|
+
handlers: {
|
|
29
|
+
path: readonly ["list"] | readonly ["check"] | readonly ["request"] | readonly ["manifest"];
|
|
30
|
+
handler(request: {
|
|
31
|
+
readonly context: {
|
|
32
|
+
writeStdout(text: string): void;
|
|
33
|
+
};
|
|
34
|
+
}): {
|
|
35
|
+
exitCode: number;
|
|
36
|
+
};
|
|
37
|
+
}[];
|
|
38
|
+
};
|
|
39
|
+
export default provider;
|
|
40
|
+
//# sourceMappingURL=ankh.provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ankh.provider.d.ts","sourceRoot":"","sources":["../src/ankh.provider.ts"],"names":[],"mappings":"AAwDA,QAAA,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;yBAbK;YACf,QAAQ,CAAC,OAAO,EAAE;gBAChB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;aACjC,CAAC;SACH;;;;CAgBF,CAAC;AAEF,eAAe,QAAQ,CAAC"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { PERMISSIONS } from './registry/permissions';
|
|
2
|
+
const PERMISSIONS_PACKAGE_NAME = '@ankhorage/permissions';
|
|
3
|
+
const PERMISSIONS_PACKAGE_VERSION = '0.2.0';
|
|
4
|
+
const PERMISSIONS_COMMAND_CATEGORY = 'permissions';
|
|
5
|
+
const PERMISSIONS_CAPABILITIES = [
|
|
6
|
+
'permissions.inspect',
|
|
7
|
+
'permissions.check',
|
|
8
|
+
'permissions.request',
|
|
9
|
+
'permissions.manifest',
|
|
10
|
+
];
|
|
11
|
+
const commands = [
|
|
12
|
+
{
|
|
13
|
+
path: ['list'],
|
|
14
|
+
summary: 'List known permission identifiers and registry metadata.',
|
|
15
|
+
capability: 'permissions.inspect',
|
|
16
|
+
aliases: ['registry'],
|
|
17
|
+
examples: ['ankh permissions list'],
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
path: ['check'],
|
|
21
|
+
summary: 'Check a permission state through a host-provided permission client.',
|
|
22
|
+
capability: 'permissions.check',
|
|
23
|
+
examples: ['ankh permissions check camera'],
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
path: ['request'],
|
|
27
|
+
summary: 'Request a permission through a host-provided permission client.',
|
|
28
|
+
capability: 'permissions.request',
|
|
29
|
+
examples: ['ankh permissions request camera'],
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
path: ['manifest'],
|
|
33
|
+
summary: 'Show native/web manifest metadata required by registered permissions.',
|
|
34
|
+
capability: 'permissions.manifest',
|
|
35
|
+
examples: ['ankh permissions manifest camera'],
|
|
36
|
+
},
|
|
37
|
+
];
|
|
38
|
+
const handlers = commands.map((command) => ({
|
|
39
|
+
path: command.path,
|
|
40
|
+
handler(request) {
|
|
41
|
+
request.context.writeStdout(`${command.path.join(' ')} is provided by ${PERMISSIONS_PACKAGE_NAME}. ` +
|
|
42
|
+
`Known permissions: ${PERMISSIONS.join(', ')}.\n`);
|
|
43
|
+
return { exitCode: 0 };
|
|
44
|
+
},
|
|
45
|
+
}));
|
|
46
|
+
const provider = {
|
|
47
|
+
id: PERMISSIONS_PACKAGE_NAME,
|
|
48
|
+
category: PERMISSIONS_COMMAND_CATEGORY,
|
|
49
|
+
version: PERMISSIONS_PACKAGE_VERSION,
|
|
50
|
+
capabilities: PERMISSIONS_CAPABILITIES,
|
|
51
|
+
commands,
|
|
52
|
+
handlers,
|
|
53
|
+
};
|
|
54
|
+
export default provider;
|
|
55
|
+
//# sourceMappingURL=ankh.provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ankh.provider.js","sourceRoot":"","sources":["../src/ankh.provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAErD,MAAM,wBAAwB,GAAG,wBAAwB,CAAC;AAC1D,MAAM,2BAA2B,GAAG,OAAO,CAAC;AAC5C,MAAM,4BAA4B,GAAG,aAAa,CAAC;AAEnD,MAAM,wBAAwB,GAAG;IAC/B,qBAAqB;IACrB,mBAAmB;IACnB,qBAAqB;IACrB,sBAAsB;CACd,CAAC;AAEX,MAAM,QAAQ,GAAG;IACf;QACE,IAAI,EAAE,CAAC,MAAM,CAAC;QACd,OAAO,EAAE,0DAA0D;QACnE,UAAU,EAAE,qBAAqB;QACjC,OAAO,EAAE,CAAC,UAAU,CAAC;QACrB,QAAQ,EAAE,CAAC,uBAAuB,CAAC;KACpC;IACD;QACE,IAAI,EAAE,CAAC,OAAO,CAAC;QACf,OAAO,EAAE,qEAAqE;QAC9E,UAAU,EAAE,mBAAmB;QAC/B,QAAQ,EAAE,CAAC,+BAA+B,CAAC;KAC5C;IACD;QACE,IAAI,EAAE,CAAC,SAAS,CAAC;QACjB,OAAO,EAAE,iEAAiE;QAC1E,UAAU,EAAE,qBAAqB;QACjC,QAAQ,EAAE,CAAC,iCAAiC,CAAC;KAC9C;IACD;QACE,IAAI,EAAE,CAAC,UAAU,CAAC;QAClB,OAAO,EAAE,uEAAuE;QAChF,UAAU,EAAE,sBAAsB;QAClC,QAAQ,EAAE,CAAC,kCAAkC,CAAC;KAC/C;CACO,CAAC;AAEX,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IAC1C,IAAI,EAAE,OAAO,CAAC,IAAI;IAClB,OAAO,CAAC,OAIP;QACC,OAAO,CAAC,OAAO,CAAC,WAAW,CACzB,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,mBAAmB,wBAAwB,IAAI;YACtE,sBAAsB,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CACpD,CAAC;QACF,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;IACzB,CAAC;CACF,CAAC,CAAC,CAAC;AAEJ,MAAM,QAAQ,GAAG;IACf,EAAE,EAAE,wBAAwB;IAC5B,QAAQ,EAAE,4BAA4B;IACtC,OAAO,EAAE,2BAA2B;IACpC,YAAY,EAAE,wBAAwB;IACtC,QAAQ;IACR,QAAQ;CACT,CAAC;AAEF,eAAe,QAAQ,CAAC","sourcesContent":["import { PERMISSIONS } from './registry/permissions';\n\nconst PERMISSIONS_PACKAGE_NAME = '@ankhorage/permissions';\nconst PERMISSIONS_PACKAGE_VERSION = '0.2.0';\nconst PERMISSIONS_COMMAND_CATEGORY = 'permissions';\n\nconst PERMISSIONS_CAPABILITIES = [\n 'permissions.inspect',\n 'permissions.check',\n 'permissions.request',\n 'permissions.manifest',\n] as const;\n\nconst commands = [\n {\n path: ['list'],\n summary: 'List known permission identifiers and registry metadata.',\n capability: 'permissions.inspect',\n aliases: ['registry'],\n examples: ['ankh permissions list'],\n },\n {\n path: ['check'],\n summary: 'Check a permission state through a host-provided permission client.',\n capability: 'permissions.check',\n examples: ['ankh permissions check camera'],\n },\n {\n path: ['request'],\n summary: 'Request a permission through a host-provided permission client.',\n capability: 'permissions.request',\n examples: ['ankh permissions request camera'],\n },\n {\n path: ['manifest'],\n summary: 'Show native/web manifest metadata required by registered permissions.',\n capability: 'permissions.manifest',\n examples: ['ankh permissions manifest camera'],\n },\n] as const;\n\nconst handlers = commands.map((command) => ({\n path: command.path,\n handler(request: {\n readonly context: {\n writeStdout(text: string): void;\n };\n }) {\n request.context.writeStdout(\n `${command.path.join(' ')} is provided by ${PERMISSIONS_PACKAGE_NAME}. ` +\n `Known permissions: ${PERMISSIONS.join(', ')}.\\n`,\n );\n return { exitCode: 0 };\n },\n}));\n\nconst provider = {\n id: PERMISSIONS_PACKAGE_NAME,\n category: PERMISSIONS_COMMAND_CATEGORY,\n version: PERMISSIONS_PACKAGE_VERSION,\n capabilities: PERMISSIONS_CAPABILITIES,\n commands,\n handlers,\n};\n\nexport default provider;\n"]}
|
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"]}
|