@cap-kit/people 8.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/CapKitPeople.podspec +20 -0
  2. package/LICENSE +21 -0
  3. package/Package.swift +28 -0
  4. package/README.md +1177 -0
  5. package/android/build.gradle +101 -0
  6. package/android/src/main/AndroidManifest.xml +4 -0
  7. package/android/src/main/java/io/capkit/people/PeopleImpl.kt +1003 -0
  8. package/android/src/main/java/io/capkit/people/PeopleObserver.kt +80 -0
  9. package/android/src/main/java/io/capkit/people/PeoplePlugin.kt +766 -0
  10. package/android/src/main/java/io/capkit/people/config/PeopleConfig.kt +44 -0
  11. package/android/src/main/java/io/capkit/people/error/PeopleError.kt +90 -0
  12. package/android/src/main/java/io/capkit/people/error/PeopleErrorMessages.kt +39 -0
  13. package/android/src/main/java/io/capkit/people/logger/PeopleLogger.kt +85 -0
  14. package/android/src/main/java/io/capkit/people/models/ContactModels.kt +64 -0
  15. package/android/src/main/java/io/capkit/people/utils/PeopleUtils.kt +133 -0
  16. package/android/src/main/res/.gitkeep +0 -0
  17. package/dist/docs.json +1449 -0
  18. package/dist/esm/definitions.d.ts +775 -0
  19. package/dist/esm/definitions.js +31 -0
  20. package/dist/esm/definitions.js.map +1 -0
  21. package/dist/esm/index.d.ts +15 -0
  22. package/dist/esm/index.js +18 -0
  23. package/dist/esm/index.js.map +1 -0
  24. package/dist/esm/web.d.ts +120 -0
  25. package/dist/esm/web.js +252 -0
  26. package/dist/esm/web.js.map +1 -0
  27. package/dist/plugin.cjs +300 -0
  28. package/dist/plugin.cjs.map +1 -0
  29. package/dist/plugin.js +303 -0
  30. package/dist/plugin.js.map +1 -0
  31. package/ios/Sources/PeoplePlugin/PeopleImpl.swift +463 -0
  32. package/ios/Sources/PeoplePlugin/PeoplePlugin.swift +627 -0
  33. package/ios/Sources/PeoplePlugin/PrivacyInfo.xcprivacy +13 -0
  34. package/ios/Sources/PeoplePlugin/Utils/PeopleUtils.swift +120 -0
  35. package/ios/Sources/PeoplePlugin/Version.swift +16 -0
  36. package/ios/Sources/PeoplePlugin/config/PeopleConfig.swift +56 -0
  37. package/ios/Sources/PeoplePlugin/error/PeopleError.swift +89 -0
  38. package/ios/Sources/PeoplePlugin/error/PeopleErrorMessages.swift +25 -0
  39. package/ios/Sources/PeoplePlugin/logger/PeopleLogging.swift +69 -0
  40. package/ios/Sources/PeoplePlugin/models/ContactModels.swift +68 -0
  41. package/ios/Tests/PeoplePluginTests/PeoplePluginTests.swift +10 -0
  42. package/package.json +119 -0
@@ -0,0 +1,31 @@
1
+ /// <reference types="@capacitor/cli" />
2
+ /**
3
+ * Standardized error codes used by the People plugin.
4
+ *
5
+ * These codes are returned when a Promise is rejected and can be caught
6
+ * via try/catch blocks.
7
+ *
8
+ * @since 8.0.0
9
+ */
10
+ export var PeopleErrorCode;
11
+ (function (PeopleErrorCode) {
12
+ /** The device does not have the requested hardware or the feature is not available on this platform. */
13
+ PeopleErrorCode["UNAVAILABLE"] = "UNAVAILABLE";
14
+ /** The user cancelled an interactive flow. */
15
+ PeopleErrorCode["CANCELLED"] = "CANCELLED";
16
+ /** The user denied the permission or the feature is disabled by the OS. */
17
+ PeopleErrorCode["PERMISSION_DENIED"] = "PERMISSION_DENIED";
18
+ /** The plugin failed to initialize or perform an operation. */
19
+ PeopleErrorCode["INIT_FAILED"] = "INIT_FAILED";
20
+ /** The input provided to the plugin method is invalid, missing, or malformed. */
21
+ PeopleErrorCode["INVALID_INPUT"] = "INVALID_INPUT";
22
+ /** The requested type is not valid or supported. */
23
+ PeopleErrorCode["UNKNOWN_TYPE"] = "UNKNOWN_TYPE";
24
+ /** The requested resource does not exist. */
25
+ PeopleErrorCode["NOT_FOUND"] = "NOT_FOUND";
26
+ /** The operation conflicts with the current state. */
27
+ PeopleErrorCode["CONFLICT"] = "CONFLICT";
28
+ /** The operation did not complete within the expected time. */
29
+ PeopleErrorCode["TIMEOUT"] = "TIMEOUT";
30
+ })(PeopleErrorCode || (PeopleErrorCode = {}));
31
+ //# sourceMappingURL=definitions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"definitions.js","sourceRoot":"","sources":["../../src/definitions.ts"],"names":[],"mappings":"AAAA,wCAAwC;AAuDxC;;;;;;;GAOG;AACH,MAAM,CAAN,IAAY,eAmBX;AAnBD,WAAY,eAAe;IACzB,wGAAwG;IACxG,8CAA2B,CAAA;IAC3B,8CAA8C;IAC9C,0CAAuB,CAAA;IACvB,2EAA2E;IAC3E,0DAAuC,CAAA;IACvC,+DAA+D;IAC/D,8CAA2B,CAAA;IAC3B,iFAAiF;IACjF,kDAA+B,CAAA;IAC/B,oDAAoD;IACpD,gDAA6B,CAAA;IAC7B,6CAA6C;IAC7C,0CAAuB,CAAA;IACvB,sDAAsD;IACtD,wCAAqB,CAAA;IACrB,+DAA+D;IAC/D,sCAAmB,CAAA;AACrB,CAAC,EAnBW,eAAe,KAAf,eAAe,QAmB1B"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * @file index.ts
3
+ * Main entry point for the People Capacitor Plugin.
4
+ * This file handles the registration of the plugin with the Capacitor core runtime
5
+ * and exports all necessary types for consumers.
6
+ */
7
+ import { PeoplePlugin } from './definitions';
8
+ /**
9
+ * The People plugin instance.
10
+ * It automatically lazy-loads the web implementation if running in a browser environment.
11
+ * Use this instance to access all people functionality.
12
+ */
13
+ declare const People: PeoplePlugin;
14
+ export * from './definitions';
15
+ export { People };
@@ -0,0 +1,18 @@
1
+ /**
2
+ * @file index.ts
3
+ * Main entry point for the People Capacitor Plugin.
4
+ * This file handles the registration of the plugin with the Capacitor core runtime
5
+ * and exports all necessary types for consumers.
6
+ */
7
+ import { registerPlugin } from '@capacitor/core';
8
+ /**
9
+ * The People plugin instance.
10
+ * It automatically lazy-loads the web implementation if running in a browser environment.
11
+ * Use this instance to access all people functionality.
12
+ */
13
+ const People = registerPlugin('People', {
14
+ web: () => import('./web').then((m) => new m.PeopleWeb()),
15
+ });
16
+ export * from './definitions';
17
+ export { People };
18
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAIjD;;;;GAIG;AACH,MAAM,MAAM,GAAG,cAAc,CAAe,QAAQ,EAAE;IACpD,GAAG,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,CAAC;CAC1D,CAAC,CAAC;AAEH,cAAc,eAAe,CAAC;AAC9B,OAAO,EAAE,MAAM,EAAE,CAAC"}
@@ -0,0 +1,120 @@
1
+ import { WebPlugin } from '@capacitor/core';
2
+ import { PeoplePlugin, PeoplePluginPermissions, PeopleCapabilities, GetContactsResult, UnifiedContact, PeopleProjection, PluginVersionResult, ListGroupsResult, CreateGroupOptions, CreateGroupResult, DeleteGroupOptions, AddPeopleToGroupOptions, RemovePeopleFromGroupOptions, CreateContactOptions, CreateContactResult, UpdateContactOptions, UpdateContactResult, DeleteContactOptions, MergeContactsOptions, MergeContactsResult } from './definitions';
3
+ /**
4
+ * Class representing the web implementation of the PeoplePlugin.
5
+ * This class extends the WebPlugin class and implements the PeoplePlugin interface.
6
+ * It provides a base implementation for web-based functionality of the plugin.
7
+ */
8
+ export declare class PeopleWeb extends WebPlugin implements PeoplePlugin {
9
+ constructor();
10
+ /**
11
+ * Retrieves the capabilities of the People plugin on the web platform.
12
+ *
13
+ * @returns A promise resolving to the PeopleCapabilities object.
14
+ */
15
+ getCapabilities(): Promise<PeopleCapabilities>;
16
+ /**
17
+ * Checks the permission status for the plugin.
18
+ *
19
+ * @returns A promise resolving to an object containing the permission states.
20
+ */
21
+ checkPermissions(): Promise<PeoplePluginPermissions>;
22
+ /**
23
+ * Requests the necessary permissions for the plugin.
24
+ *
25
+ * @returns A promise resolving to an object containing the updated permission states.
26
+ */
27
+ requestPermissions(): Promise<PeoplePluginPermissions>;
28
+ /**
29
+ * Launches the OS contact picker UI.
30
+ * On Web this uses the Contact Picker API if available.
31
+ * * Architectural rules:
32
+ * - Rejects with CANCELLED on user cancellation to match native behavior.
33
+ */
34
+ pickContact(options?: {
35
+ projection?: PeopleProjection[];
36
+ }): Promise<{
37
+ contact: UnifiedContact;
38
+ }>;
39
+ /**
40
+ * Retrieves contacts from the system directory.
41
+ * @param _options - Options for retrieving contacts.
42
+ *
43
+ * @returns A promise resolving to the contacts result.
44
+ */
45
+ getContacts(): Promise<GetContactsResult>;
46
+ /**
47
+ * Retrieves a single contact by ID.
48
+ * @param _options - Options containing the contact ID.
49
+ *
50
+ * @returns A promise resolving to the contact.
51
+ */
52
+ getContact(): Promise<{
53
+ contact: UnifiedContact;
54
+ }>;
55
+ /**
56
+ * Searches contacts in the system directory.
57
+ * @param _options - Options for searching contacts.
58
+ *
59
+ * @returns A promise resolving to the contacts result.
60
+ */
61
+ searchPeople(): Promise<GetContactsResult>;
62
+ /**
63
+ * Lists all available contact groups.
64
+ * @returns A promise that is rejected because this feature is not available on Web.
65
+ */
66
+ listGroups(): Promise<ListGroupsResult>;
67
+ /**
68
+ * Creates a new contact group.
69
+ * @returns A promise that is rejected because this feature is not available on Web.
70
+ */
71
+ createGroup(_options: CreateGroupOptions): Promise<CreateGroupResult>;
72
+ /**
73
+ * Deletes a contact group.
74
+ * @returns A promise that is rejected because this feature is not available on Web.
75
+ */
76
+ deleteGroup(_options: DeleteGroupOptions): Promise<void>;
77
+ /**
78
+ * Adds contacts to a group.
79
+ * @returns A promise that is rejected because this feature is not available on Web.
80
+ */
81
+ addPeopleToGroup(_options: AddPeopleToGroupOptions): Promise<void>;
82
+ /**
83
+ * Removes contacts from a group.
84
+ * @returns A promise that is rejected because this feature is not available on Web.
85
+ */
86
+ removePeopleFromGroup(_options: RemovePeopleFromGroupOptions): Promise<void>;
87
+ /**
88
+ * Creates a new contact.
89
+ * @returns A promise that is rejected because this feature is not available on Web.
90
+ */
91
+ createContact(_options: CreateContactOptions): Promise<CreateContactResult>;
92
+ /**
93
+ * Updates an existing contact.
94
+ * @returns A promise that is rejected because this feature is not available on Web.
95
+ */
96
+ updateContact(_options: UpdateContactOptions): Promise<UpdateContactResult>;
97
+ /**
98
+ * Deletes a contact.
99
+ * @returns A promise that is rejected because this feature is not available on Web.
100
+ */
101
+ deleteContact(_options: DeleteContactOptions): Promise<void>;
102
+ /**
103
+ * Merges two contacts.
104
+ * @returns A promise that is rejected because this feature is not available on Web.
105
+ */
106
+ mergeContacts(_options: MergeContactsOptions): Promise<MergeContactsResult>;
107
+ /**
108
+ * Returns the plugin version.
109
+ *
110
+ * On the Web, this value represents the JavaScript package version
111
+ * rather than a native implementation.
112
+ */
113
+ getPluginVersion(): Promise<PluginVersionResult>;
114
+ /**
115
+ * Cleanup all listeners
116
+ *
117
+ * @returns A promise that resolves when all listeners are removed.
118
+ */
119
+ removeAllListeners(): Promise<void>;
120
+ }
@@ -0,0 +1,252 @@
1
+ import { WebPlugin } from '@capacitor/core';
2
+ /**
3
+ * Class representing the web implementation of the PeoplePlugin.
4
+ * This class extends the WebPlugin class and implements the PeoplePlugin interface.
5
+ * It provides a base implementation for web-based functionality of the plugin.
6
+ */
7
+ export class PeopleWeb extends WebPlugin {
8
+ constructor() {
9
+ super();
10
+ }
11
+ // -----------------------------------------------------------------------------
12
+ // Capabilities
13
+ // -----------------------------------------------------------------------------
14
+ /**
15
+ * Retrieves the capabilities of the People plugin on the web platform.
16
+ *
17
+ * @returns A promise resolving to the PeopleCapabilities object.
18
+ */
19
+ async getCapabilities() {
20
+ return {
21
+ canRead: false, // Web cannot bulk read the address book
22
+ canWrite: false,
23
+ canObserve: false,
24
+ canManageGroups: false,
25
+ canPickContact: true, // Only the Zero-Permission picker is supported via Contact Picker API
26
+ };
27
+ }
28
+ // -----------------------------------------------------------------------------
29
+ // Permissions
30
+ // -----------------------------------------------------------------------------
31
+ /**
32
+ * Checks the permission status for the plugin.
33
+ *
34
+ * @returns A promise resolving to an object containing the permission states.
35
+ */
36
+ async checkPermissions() {
37
+ return { contacts: 'prompt' };
38
+ }
39
+ /**
40
+ * Requests the necessary permissions for the plugin.
41
+ *
42
+ * @returns A promise resolving to an object containing the updated permission states.
43
+ */
44
+ async requestPermissions() {
45
+ return { contacts: 'prompt' };
46
+ }
47
+ // -----------------------------------------------------------------------------
48
+ // Contact Picking
49
+ // -----------------------------------------------------------------------------
50
+ /**
51
+ * Launches the OS contact picker UI.
52
+ * On Web this uses the Contact Picker API if available.
53
+ * * Architectural rules:
54
+ * - Rejects with CANCELLED on user cancellation to match native behavior.
55
+ */
56
+ async pickContact(options) {
57
+ var _a, _b, _c, _d;
58
+ const contactsNavigator = navigator;
59
+ const props = (options === null || options === void 0 ? void 0 : options.projection) || ['name', 'phones', 'emails'];
60
+ const supportedProjection = new Set([
61
+ 'name',
62
+ 'organization',
63
+ 'birthday',
64
+ 'phones',
65
+ 'emails',
66
+ 'addresses',
67
+ 'urls',
68
+ 'note',
69
+ ]);
70
+ for (const field of props) {
71
+ if (!supportedProjection.has(field)) {
72
+ return Promise.reject({
73
+ message: `Unsupported projection field: ${field}`,
74
+ code: 'UNKNOWN_TYPE',
75
+ });
76
+ }
77
+ }
78
+ // Support for the modern Web Contact Picker API
79
+ if ((_a = contactsNavigator.contacts) === null || _a === void 0 ? void 0 : _a.select) {
80
+ try {
81
+ // Marshalling: Map plugin projections to Web API properties
82
+ const webProps = props.map((p) => {
83
+ if (p === 'phones')
84
+ return 'tel';
85
+ if (p === 'emails')
86
+ return 'email';
87
+ return p;
88
+ });
89
+ const contacts = await contactsNavigator.contacts.select(webProps, { multiple: false });
90
+ // Some browsers return an empty array instead of throwing on cancel; normalize to CANCELLED.
91
+ if (!contacts || contacts.length === 0) {
92
+ return Promise.reject({
93
+ message: 'User cancelled selection',
94
+ code: 'CANCELLED',
95
+ });
96
+ }
97
+ const raw = contacts[0];
98
+ return {
99
+ contact: {
100
+ id: 'web-ref',
101
+ name: { display: ((_b = raw.name) === null || _b === void 0 ? void 0 : _b[0]) || 'Unknown' },
102
+ phones: ((_c = raw.tel) === null || _c === void 0 ? void 0 : _c.map((t) => ({ number: t }))) || [],
103
+ emails: ((_d = raw.email) === null || _d === void 0 ? void 0 : _d.map((e) => ({ address: e }))) || [],
104
+ },
105
+ };
106
+ }
107
+ catch (e) {
108
+ const err = e;
109
+ // Map specific Web API cancellation to the standardized CANCELLED code
110
+ if (err.name === 'AbortError') {
111
+ return Promise.reject({
112
+ message: 'User cancelled selection',
113
+ code: 'CANCELLED',
114
+ });
115
+ }
116
+ throw this.unavailable(err.message || 'Web Contact Picker API failed');
117
+ }
118
+ }
119
+ throw this.unavailable('Native Contact Picker not available in this browser.');
120
+ }
121
+ // -----------------------------------------------------------------------------
122
+ // Directory Access (Not supported on Web)
123
+ // -----------------------------------------------------------------------------
124
+ /**
125
+ * Retrieves contacts from the system directory.
126
+ * @param _options - Options for retrieving contacts.
127
+ *
128
+ * @returns A promise resolving to the contacts result.
129
+ */
130
+ async getContacts() {
131
+ throw this.unimplemented('getContacts is not available on Web.');
132
+ }
133
+ /**
134
+ * Retrieves a single contact by ID.
135
+ * @param _options - Options containing the contact ID.
136
+ *
137
+ * @returns A promise resolving to the contact.
138
+ */
139
+ async getContact() {
140
+ throw this.unimplemented('getContact is not available on Web.');
141
+ }
142
+ /**
143
+ * Searches contacts in the system directory.
144
+ * @param _options - Options for searching contacts.
145
+ *
146
+ * @returns A promise resolving to the contacts result.
147
+ */
148
+ async searchPeople() {
149
+ throw this.unimplemented('searchPeople is not available on Web.');
150
+ }
151
+ // -----------------------------------------------------------------------------
152
+ // Group Management (Not supported on Web)
153
+ // -----------------------------------------------------------------------------
154
+ /**
155
+ * Lists all available contact groups.
156
+ * @returns A promise that is rejected because this feature is not available on Web.
157
+ */
158
+ async listGroups() {
159
+ throw this.unimplemented('listGroups is not available on Web.');
160
+ }
161
+ /**
162
+ * Creates a new contact group.
163
+ * @returns A promise that is rejected because this feature is not available on Web.
164
+ */
165
+ async createGroup(_options) {
166
+ void _options;
167
+ throw this.unimplemented('createGroup is not available on Web.');
168
+ }
169
+ /**
170
+ * Deletes a contact group.
171
+ * @returns A promise that is rejected because this feature is not available on Web.
172
+ */
173
+ async deleteGroup(_options) {
174
+ void _options;
175
+ throw this.unimplemented('deleteGroup is not available on Web.');
176
+ }
177
+ /**
178
+ * Adds contacts to a group.
179
+ * @returns A promise that is rejected because this feature is not available on Web.
180
+ */
181
+ async addPeopleToGroup(_options) {
182
+ void _options;
183
+ throw this.unimplemented('addPeopleToGroup is not available on Web.');
184
+ }
185
+ /**
186
+ * Removes contacts from a group.
187
+ * @returns A promise that is rejected because this feature is not available on Web.
188
+ */
189
+ async removePeopleFromGroup(_options) {
190
+ void _options;
191
+ throw this.unimplemented('removePeopleFromGroup is not available on Web.');
192
+ }
193
+ // -----------------------------------------------------------------------------
194
+ // CRUD (Not supported on Web)
195
+ // -----------------------------------------------------------------------------
196
+ /**
197
+ * Creates a new contact.
198
+ * @returns A promise that is rejected because this feature is not available on Web.
199
+ */
200
+ async createContact(_options) {
201
+ void _options;
202
+ throw this.unimplemented('createContact is not available on Web.');
203
+ }
204
+ /**
205
+ * Updates an existing contact.
206
+ * @returns A promise that is rejected because this feature is not available on Web.
207
+ */
208
+ async updateContact(_options) {
209
+ void _options;
210
+ throw this.unimplemented('updateContact is not available on Web.');
211
+ }
212
+ /**
213
+ * Deletes a contact.
214
+ * @returns A promise that is rejected because this feature is not available on Web.
215
+ */
216
+ async deleteContact(_options) {
217
+ void _options;
218
+ throw this.unimplemented('deleteContact is not available on Web.');
219
+ }
220
+ /**
221
+ * Merges two contacts.
222
+ * @returns A promise that is rejected because this feature is not available on Web.
223
+ */
224
+ async mergeContacts(_options) {
225
+ void _options;
226
+ throw this.unimplemented('mergeContacts is not available on Web.');
227
+ }
228
+ // -----------------------------------------------------------------------------
229
+ // Plugin Info
230
+ // -----------------------------------------------------------------------------
231
+ /**
232
+ * Returns the plugin version.
233
+ *
234
+ * On the Web, this value represents the JavaScript package version
235
+ * rather than a native implementation.
236
+ */
237
+ async getPluginVersion() {
238
+ return { version: 'web' };
239
+ }
240
+ // -----------------------------------------------------------------------------
241
+ // Listener Handling
242
+ // -----------------------------------------------------------------------------
243
+ /**
244
+ * Cleanup all listeners
245
+ *
246
+ * @returns A promise that resolves when all listeners are removed.
247
+ */
248
+ async removeAllListeners() {
249
+ super.removeAllListeners();
250
+ }
251
+ }
252
+ //# sourceMappingURL=web.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web.js","sourceRoot":"","sources":["../../src/web.ts"],"names":[],"mappings":"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"}