@keyneom/sync-kit 0.1.1 → 0.2.0-rc.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.
Files changed (100) hide show
  1. package/README.md +103 -8
  2. package/dist/auth/google-web/cache.d.ts +46 -0
  3. package/dist/auth/google-web/cache.d.ts.map +1 -0
  4. package/dist/auth/google-web/cache.js +111 -0
  5. package/dist/auth/google-web/cache.js.map +1 -0
  6. package/dist/auth/google-web/identity.d.ts +49 -0
  7. package/dist/auth/google-web/identity.d.ts.map +1 -0
  8. package/dist/auth/google-web/identity.js +102 -0
  9. package/dist/auth/google-web/identity.js.map +1 -0
  10. package/dist/auth/google-web/index.d.ts +1 -0
  11. package/dist/auth/google-web/index.d.ts.map +1 -1
  12. package/dist/auth/google-web/index.js +1 -0
  13. package/dist/auth/google-web/index.js.map +1 -1
  14. package/dist/core/errors.d.ts +1 -1
  15. package/dist/core/errors.d.ts.map +1 -1
  16. package/dist/core/errors.js +22 -1
  17. package/dist/core/errors.js.map +1 -1
  18. package/dist/crypto/canonical.d.ts +5 -0
  19. package/dist/crypto/canonical.d.ts.map +1 -1
  20. package/dist/crypto/canonical.js +8 -1
  21. package/dist/crypto/canonical.js.map +1 -1
  22. package/dist/crypto/envelope.d.ts.map +1 -1
  23. package/dist/crypto/envelope.js +1 -0
  24. package/dist/crypto/envelope.js.map +1 -1
  25. package/dist/index.d.ts +1 -0
  26. package/dist/index.d.ts.map +1 -1
  27. package/dist/index.js +1 -0
  28. package/dist/index.js.map +1 -1
  29. package/dist/keys/web-passkey/index.d.ts +8 -2
  30. package/dist/keys/web-passkey/index.d.ts.map +1 -1
  31. package/dist/keys/web-passkey/index.js +32 -10
  32. package/dist/keys/web-passkey/index.js.map +1 -1
  33. package/dist/sharing/account-binding.d.ts +57 -0
  34. package/dist/sharing/account-binding.d.ts.map +1 -0
  35. package/dist/sharing/account-binding.js +305 -0
  36. package/dist/sharing/account-binding.js.map +1 -0
  37. package/dist/sharing/change-detector.d.ts +40 -0
  38. package/dist/sharing/change-detector.d.ts.map +1 -0
  39. package/dist/sharing/change-detector.js +96 -0
  40. package/dist/sharing/change-detector.js.map +1 -0
  41. package/dist/sharing/checkpoint.d.ts +32 -0
  42. package/dist/sharing/checkpoint.d.ts.map +1 -0
  43. package/dist/sharing/checkpoint.js +2 -0
  44. package/dist/sharing/checkpoint.js.map +1 -0
  45. package/dist/sharing/controller.d.ts +169 -0
  46. package/dist/sharing/controller.d.ts.map +1 -0
  47. package/dist/sharing/controller.js +693 -0
  48. package/dist/sharing/controller.js.map +1 -0
  49. package/dist/sharing/index.d.ts +122 -0
  50. package/dist/sharing/index.d.ts.map +1 -0
  51. package/dist/sharing/index.js +362 -0
  52. package/dist/sharing/index.js.map +1 -0
  53. package/dist/sharing/join.d.ts +56 -0
  54. package/dist/sharing/join.d.ts.map +1 -0
  55. package/dist/sharing/join.js +153 -0
  56. package/dist/sharing/join.js.map +1 -0
  57. package/dist/sharing/lifecycle.d.ts +20 -0
  58. package/dist/sharing/lifecycle.d.ts.map +1 -0
  59. package/dist/sharing/lifecycle.js +55 -0
  60. package/dist/sharing/lifecycle.js.map +1 -0
  61. package/dist/sharing/registry-indexeddb.d.ts +21 -0
  62. package/dist/sharing/registry-indexeddb.d.ts.map +1 -0
  63. package/dist/sharing/registry-indexeddb.js +60 -0
  64. package/dist/sharing/registry-indexeddb.js.map +1 -0
  65. package/dist/sharing/transport.d.ts +75 -0
  66. package/dist/sharing/transport.d.ts.map +1 -0
  67. package/dist/sharing/transport.js +2 -0
  68. package/dist/sharing/transport.js.map +1 -0
  69. package/dist/sharing/web-crypto.d.ts +68 -0
  70. package/dist/sharing/web-crypto.d.ts.map +1 -0
  71. package/dist/sharing/web-crypto.js +645 -0
  72. package/dist/sharing/web-crypto.js.map +1 -0
  73. package/dist/sharing/web-passkey.d.ts +68 -0
  74. package/dist/sharing/web-passkey.d.ts.map +1 -0
  75. package/dist/sharing/web-passkey.js +303 -0
  76. package/dist/sharing/web-passkey.js.map +1 -0
  77. package/dist/snapshot/controller.d.ts.map +1 -1
  78. package/dist/snapshot/controller.js +4 -8
  79. package/dist/snapshot/controller.js.map +1 -1
  80. package/dist/stores/google-drive/app-folders.d.ts +19 -0
  81. package/dist/stores/google-drive/app-folders.d.ts.map +1 -0
  82. package/dist/stores/google-drive/app-folders.js +38 -0
  83. package/dist/stores/google-drive/app-folders.js.map +1 -0
  84. package/dist/stores/google-drive/folder-name.d.ts +16 -0
  85. package/dist/stores/google-drive/folder-name.d.ts.map +1 -0
  86. package/dist/stores/google-drive/folder-name.js +37 -0
  87. package/dist/stores/google-drive/folder-name.js.map +1 -0
  88. package/dist/stores/google-drive/index.d.ts +149 -1
  89. package/dist/stores/google-drive/index.d.ts.map +1 -1
  90. package/dist/stores/google-drive/index.js +399 -0
  91. package/dist/stores/google-drive/index.js.map +1 -1
  92. package/dist/stores/google-drive/picker.d.ts +89 -0
  93. package/dist/stores/google-drive/picker.d.ts.map +1 -0
  94. package/dist/stores/google-drive/picker.js +179 -0
  95. package/dist/stores/google-drive/picker.js.map +1 -0
  96. package/dist/stores/google-drive/sharing.d.ts +57 -0
  97. package/dist/stores/google-drive/sharing.d.ts.map +1 -0
  98. package/dist/stores/google-drive/sharing.js +325 -0
  99. package/dist/stores/google-drive/sharing.js.map +1 -0
  100. package/package.json +78 -10
@@ -0,0 +1,325 @@
1
+ import { SyncKitError } from "../../core/errors.js";
2
+ import { parseSharedBackupEnvelopeV1, parseSharingInvitationV1, parseSharingPublicKeyResponseV1, } from "../../sharing/index.js";
3
+ import { assertDriveFileProvenance, ensureGoogleDriveSyncKitFolder, GoogleDriveFileStore, SYNC_KIT_APP_ID_PROPERTY, SYNC_KIT_DATASET_ID_PROPERTY, SYNC_KIT_KIND_PROPERTY, SYNC_KIT_PROTOCOL_PROPERTY, } from "./index.js";
4
+ const SHARING_PROTOCOL = "sharing-v1";
5
+ /**
6
+ * Backendless Google Drive implementation of the shared-backup transport.
7
+ * Authorization, encryption, and permission changes all happen in the client.
8
+ */
9
+ export class GoogleDriveSharedBackupTransport {
10
+ options;
11
+ drive;
12
+ storagePromise = null;
13
+ constructor(options) {
14
+ this.options = options;
15
+ if (!options.appId.trim())
16
+ throw new TypeError("appId must not be empty.");
17
+ this.drive = options.drive ?? new GoogleDriveFileStore();
18
+ }
19
+ async ensureStorage() {
20
+ this.storagePromise ??= this.ensureStorageNow().catch((error) => {
21
+ this.storagePromise = null;
22
+ throw error;
23
+ });
24
+ return this.storagePromise;
25
+ }
26
+ async listDatasets() {
27
+ const authorization = await this.authorize();
28
+ const storage = await this.ensureStorage();
29
+ const files = await this.listAll(authorization, {
30
+ parentId: storage.appFolderId,
31
+ appProperties: this.properties("dataset"),
32
+ });
33
+ return files.map((file) => ({
34
+ datasetId: requiredProperty(file, SYNC_KIT_DATASET_ID_PROPERTY, "dataset"),
35
+ fileId: file.fileId,
36
+ name: file.name,
37
+ ...(file.capabilities?.canEdit === undefined
38
+ ? {}
39
+ : { canEdit: file.capabilities.canEdit }),
40
+ }));
41
+ }
42
+ async readDataset(fileId) {
43
+ const authorization = await this.authorize();
44
+ const metadata = await this.drive.get(fileId, authorization);
45
+ this.assertManagedFile(metadata, "dataset");
46
+ const datasetId = requiredProperty(metadata, SYNC_KIT_DATASET_ID_PROPERTY, "dataset");
47
+ const document = await this.drive.readTextVersioned(fileId, authorization);
48
+ const version = document.etag ?? metadata.etag;
49
+ if (!version) {
50
+ throw new SyncKitError("state", "Google Drive did not expose an ETag for the dataset; a safe conditional write is unavailable.");
51
+ }
52
+ const envelope = parseSharedBackupEnvelopeV1(document.content);
53
+ if (envelope.appId !== this.options.appId ||
54
+ envelope.backupId !== datasetId) {
55
+ throw new SyncKitError("compatibility", "The Drive dataset metadata does not match its encrypted envelope.");
56
+ }
57
+ return {
58
+ datasetId,
59
+ fileId,
60
+ name: metadata.name,
61
+ ...(metadata.capabilities?.canEdit === undefined
62
+ ? {}
63
+ : { canEdit: metadata.capabilities.canEdit }),
64
+ envelope,
65
+ version,
66
+ };
67
+ }
68
+ async createDataset(datasetId, envelope) {
69
+ requireNonEmpty(datasetId, "datasetId");
70
+ this.assertEnvelopeDataset(datasetId, envelope);
71
+ const authorization = await this.authorize();
72
+ const storage = await this.ensureStorage();
73
+ const fileId = await this.drive.create(`${datasetId}.sync-kit.json`, JSON.stringify(envelope), authorization, {
74
+ parentId: storage.appFolderId,
75
+ contentType: "application/json",
76
+ appProperties: {
77
+ ...this.properties("dataset"),
78
+ [SYNC_KIT_DATASET_ID_PROPERTY]: datasetId,
79
+ },
80
+ });
81
+ return this.readDataset(fileId);
82
+ }
83
+ async writeDataset(current, envelope) {
84
+ this.assertEnvelopeDataset(current.datasetId, envelope);
85
+ if (envelope.parentRevisionId !== current.envelope.revisionId) {
86
+ throw new SyncKitError("conflict", "The new dataset revision does not descend from the version being replaced.");
87
+ }
88
+ const authorization = await this.authorize();
89
+ const written = await this.drive.write(current.fileId, JSON.stringify(envelope), authorization, {
90
+ contentType: "application/json",
91
+ ifMatch: current.version,
92
+ });
93
+ if (!written.etag)
94
+ return this.readDataset(current.fileId);
95
+ return {
96
+ ...current,
97
+ envelope,
98
+ version: written.etag,
99
+ };
100
+ }
101
+ async grantExchangeAccess(emailAddress, options = {}) {
102
+ requireNonEmpty(emailAddress, "emailAddress");
103
+ const authorization = await this.authorize();
104
+ const storage = await this.ensureStorage();
105
+ const appPermissionId = await this.drive.share(storage.appFolderId, emailAddress, "reader", authorization, options);
106
+ const exchangePermissionId = await this.drive.share(storage.exchangesFolderId, emailAddress, "writer", authorization, { sendNotificationEmail: false });
107
+ if (exchangePermissionId !== appPermissionId) {
108
+ throw new SyncKitError("provider", "Google Drive returned inconsistent permission IDs for one account.");
109
+ }
110
+ return {
111
+ drivePermissionId: appPermissionId,
112
+ appFolderId: storage.appFolderId,
113
+ };
114
+ }
115
+ async createInvitation(invitation) {
116
+ if (invitation.appId !== this.options.appId) {
117
+ throw new SyncKitError("compatibility", "The invitation belongs to another application.");
118
+ }
119
+ const authorization = await this.authorize();
120
+ const storage = await this.ensureStorage();
121
+ if (invitation.appFolderId !== storage.appFolderId) {
122
+ throw new SyncKitError("compatibility", "The invitation references another app folder.");
123
+ }
124
+ return this.drive.create(`${invitation.exchangeId}-invitation.json`, JSON.stringify(invitation), authorization, {
125
+ parentId: storage.exchangesFolderId,
126
+ contentType: "application/json",
127
+ appProperties: {
128
+ ...this.properties("invitation"),
129
+ "sync-kit-exchange-id": invitation.exchangeId,
130
+ },
131
+ });
132
+ }
133
+ async createKeyResponse(response) {
134
+ if (response.appId !== this.options.appId) {
135
+ throw new SyncKitError("compatibility", "The key response belongs to another application.");
136
+ }
137
+ const authorization = await this.authorize();
138
+ const storage = await this.ensureStorage();
139
+ return this.drive.create(`${response.exchangeId}-${response.keyId}-response.json`, JSON.stringify(response), authorization, {
140
+ parentId: storage.exchangesFolderId,
141
+ contentType: "application/json",
142
+ appProperties: {
143
+ ...this.properties("key-response"),
144
+ "sync-kit-exchange-id": response.exchangeId,
145
+ "sync-kit-key-id": response.keyId,
146
+ },
147
+ });
148
+ }
149
+ async listExchanges(options = {}) {
150
+ const authorization = await this.authorize();
151
+ const storage = await this.ensureStorage();
152
+ const files = await this.listAll(authorization, {
153
+ parentId: storage.exchangesFolderId,
154
+ appProperties: {
155
+ [SYNC_KIT_APP_ID_PROPERTY]: this.options.appId,
156
+ [SYNC_KIT_PROTOCOL_PROPERTY]: SHARING_PROTOCOL,
157
+ ...(options.kind
158
+ ? { [SYNC_KIT_KIND_PROPERTY]: options.kind }
159
+ : {}),
160
+ ...(options.exchangeId
161
+ ? { "sync-kit-exchange-id": options.exchangeId }
162
+ : {}),
163
+ },
164
+ });
165
+ return files.map((file) => {
166
+ const kind = requiredProperty(file, SYNC_KIT_KIND_PROPERTY, "exchange");
167
+ if (kind !== "invitation" && kind !== "key-response") {
168
+ throw new SyncKitError("compatibility", "A managed exchange file has an unsupported kind.");
169
+ }
170
+ const keyId = file.appProperties?.["sync-kit-key-id"];
171
+ return {
172
+ fileId: file.fileId,
173
+ exchangeId: requiredProperty(file, "sync-kit-exchange-id", "exchange"),
174
+ kind,
175
+ ...(keyId ? { keyId } : {}),
176
+ ...(file.createdTime ? { createdTime: file.createdTime } : {}),
177
+ };
178
+ });
179
+ }
180
+ async readInvitation(fileId) {
181
+ const authorization = await this.authorize();
182
+ const metadata = await this.drive.get(fileId, authorization);
183
+ this.assertManagedFile(metadata, "invitation");
184
+ return parseSharingInvitationV1(await this.drive.readText(fileId, authorization));
185
+ }
186
+ async readKeyResponse(fileId, expectedDrivePermissionId) {
187
+ const authorization = await this.authorize();
188
+ const metadata = await this.drive.get(fileId, authorization);
189
+ this.assertManagedFile(metadata, "key-response");
190
+ assertDriveFileProvenance(metadata, {
191
+ permissionId: expectedDrivePermissionId,
192
+ });
193
+ const response = parseSharingPublicKeyResponseV1(await this.drive.readText(fileId, authorization));
194
+ return {
195
+ fileId,
196
+ response,
197
+ ownerPermissionId: expectedDrivePermissionId,
198
+ };
199
+ }
200
+ async deleteExchange(fileId) {
201
+ await this.drive.delete(fileId, await this.authorize());
202
+ }
203
+ async setDatasetPermission(fileId, emailAddress, role, options = {}) {
204
+ const driveRole = role === "viewer" ? "reader" : "writer";
205
+ if (options.existingDirectPermissionId) {
206
+ await this.drive.updatePermission(fileId, options.existingDirectPermissionId, driveRole, await this.authorize());
207
+ return {
208
+ permissionId: options.existingDirectPermissionId,
209
+ role: driveRole,
210
+ };
211
+ }
212
+ if (driveRole === "reader" && options.hasInheritedReadAccess) {
213
+ return { role: "reader" };
214
+ }
215
+ const permissionId = await this.drive.share(fileId, emailAddress, driveRole, await this.authorize(), { sendNotificationEmail: false });
216
+ return { permissionId, role: driveRole };
217
+ }
218
+ async removeDatasetPermission(fileId, permissionId) {
219
+ await this.drive.removePermission(fileId, permissionId, await this.authorize());
220
+ }
221
+ async listDatasetPermissions(fileId) {
222
+ const permissions = await this.drive.listPermissions(fileId, await this.authorize());
223
+ return permissions
224
+ .filter((permission) => permission.type === "user" &&
225
+ (permission.role === "reader" || permission.role === "writer"))
226
+ .map((permission) => ({
227
+ permissionId: permission.permissionId,
228
+ role: permission.role,
229
+ ...(permission.emailAddress
230
+ ? { emailAddress: permission.emailAddress }
231
+ : {}),
232
+ inherited: permission.inherited ?? false,
233
+ }));
234
+ }
235
+ async listDatasetHeads() {
236
+ const authorization = await this.authorize();
237
+ const storage = await this.ensureStorage();
238
+ const files = await this.listAll(authorization, {
239
+ parentId: storage.appFolderId,
240
+ appProperties: this.properties("dataset"),
241
+ });
242
+ return files.map((file) => ({
243
+ datasetId: requiredProperty(file, SYNC_KIT_DATASET_ID_PROPERTY, "dataset"),
244
+ fileId: file.fileId,
245
+ ...(file.modifiedTime ? { modifiedTime: file.modifiedTime } : {}),
246
+ ...(file.version ? { version: file.version } : {}),
247
+ ...(file.headRevisionId ? { headRevisionId: file.headRevisionId } : {}),
248
+ ...(file.etag ? { etag: file.etag } : {}),
249
+ }));
250
+ }
251
+ async ensureStorageNow() {
252
+ const authorization = await this.authorize();
253
+ const appFolderId = this.options.selectedAppFolderId ??
254
+ (await ensureGoogleDriveSyncKitFolder(authorization, {
255
+ appId: this.options.appId,
256
+ ...(this.options.folderName
257
+ ? { folderName: this.options.folderName }
258
+ : {}),
259
+ ...(this.options.parentFolderId
260
+ ? { parentFolderId: this.options.parentFolderId }
261
+ : {}),
262
+ drive: this.drive,
263
+ })).appFolderId;
264
+ const exchangeProperties = this.properties("exchange-folder");
265
+ const existing = await this.drive.list(authorization, {
266
+ parentId: appFolderId,
267
+ appProperties: exchangeProperties,
268
+ });
269
+ const exchangesFolderId = existing.files.find((file) => file.name === "exchanges")?.fileId ??
270
+ (await this.drive.createFolder("exchanges", authorization, {
271
+ parentId: appFolderId,
272
+ appProperties: exchangeProperties,
273
+ writersCanShare: false,
274
+ }));
275
+ return { appFolderId, exchangesFolderId };
276
+ }
277
+ async listAll(authorization, options) {
278
+ const files = [];
279
+ let pageToken;
280
+ do {
281
+ const page = await this.drive.list(authorization, {
282
+ ...options,
283
+ ...(pageToken ? { pageToken } : {}),
284
+ });
285
+ files.push(...page.files);
286
+ pageToken = page.nextPageToken;
287
+ } while (pageToken);
288
+ return files;
289
+ }
290
+ properties(kind) {
291
+ return {
292
+ [SYNC_KIT_APP_ID_PROPERTY]: this.options.appId,
293
+ [SYNC_KIT_PROTOCOL_PROPERTY]: SHARING_PROTOCOL,
294
+ [SYNC_KIT_KIND_PROPERTY]: kind,
295
+ };
296
+ }
297
+ assertManagedFile(file, kind) {
298
+ if (file.appProperties?.[SYNC_KIT_APP_ID_PROPERTY] !== this.options.appId ||
299
+ file.appProperties?.[SYNC_KIT_PROTOCOL_PROPERTY] !== SHARING_PROTOCOL ||
300
+ file.appProperties?.[SYNC_KIT_KIND_PROPERTY] !== kind) {
301
+ throw new SyncKitError("compatibility", `The selected Drive file is not a managed ${kind} for this application.`);
302
+ }
303
+ }
304
+ assertEnvelopeDataset(datasetId, envelope) {
305
+ if (envelope.appId !== this.options.appId ||
306
+ envelope.backupId !== datasetId) {
307
+ throw new SyncKitError("compatibility", "The shared-backup envelope belongs to another dataset.");
308
+ }
309
+ }
310
+ authorize() {
311
+ return this.options.authorizationProvider.authorize();
312
+ }
313
+ }
314
+ function requiredProperty(file, name, label) {
315
+ const value = file.appProperties?.[name];
316
+ if (!value) {
317
+ throw new SyncKitError("compatibility", `A managed ${label} file is missing ${name}.`);
318
+ }
319
+ return value;
320
+ }
321
+ function requireNonEmpty(value, name) {
322
+ if (!value.trim())
323
+ throw new TypeError(`${name} must not be empty.`);
324
+ }
325
+ //# sourceMappingURL=sharing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sharing.js","sourceRoot":"","sources":["../../../src/stores/google-drive/sharing.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,8 +1,14 @@
1
1
  {
2
2
  "name": "@keyneom/sync-kit",
3
- "version": "0.1.1",
3
+ "version": "0.2.0-rc.1",
4
4
  "private": false,
5
5
  "description": "Provider-neutral encrypted application-data synchronization with opt-in browser adapters.",
6
+ "keywords": [
7
+ "encrypted-sync",
8
+ "google-drive",
9
+ "passkeys",
10
+ "webcrypto"
11
+ ],
6
12
  "type": "module",
7
13
  "license": "MIT",
8
14
  "sideEffects": false,
@@ -14,43 +20,105 @@
14
20
  "exports": {
15
21
  ".": {
16
22
  "types": "./dist/index.d.ts",
17
- "import": "./dist/index.js"
23
+ "import": "./dist/index.js",
24
+ "default": "./dist/index.js"
18
25
  },
19
26
  "./core": {
20
27
  "types": "./dist/core/index.d.ts",
21
- "import": "./dist/core/index.js"
28
+ "import": "./dist/core/index.js",
29
+ "default": "./dist/core/index.js"
22
30
  },
23
31
  "./crypto": {
24
32
  "types": "./dist/crypto/index.d.ts",
25
- "import": "./dist/crypto/index.js"
33
+ "import": "./dist/crypto/index.js",
34
+ "default": "./dist/crypto/index.js"
26
35
  },
27
36
  "./snapshot": {
28
37
  "types": "./dist/snapshot/index.d.ts",
29
- "import": "./dist/snapshot/index.js"
38
+ "import": "./dist/snapshot/index.js",
39
+ "default": "./dist/snapshot/index.js"
30
40
  },
31
41
  "./snapshot/lifecycle": {
32
42
  "types": "./dist/snapshot/lifecycle.d.ts",
33
- "import": "./dist/snapshot/lifecycle.js"
43
+ "import": "./dist/snapshot/lifecycle.js",
44
+ "default": "./dist/snapshot/lifecycle.js"
45
+ },
46
+ "./sharing": {
47
+ "types": "./dist/sharing/index.d.ts",
48
+ "import": "./dist/sharing/index.js",
49
+ "default": "./dist/sharing/index.js"
50
+ },
51
+ "./sharing/web-crypto": {
52
+ "types": "./dist/sharing/web-crypto.d.ts",
53
+ "import": "./dist/sharing/web-crypto.js",
54
+ "default": "./dist/sharing/web-crypto.js"
55
+ },
56
+ "./sharing/controller": {
57
+ "types": "./dist/sharing/controller.d.ts",
58
+ "import": "./dist/sharing/controller.js",
59
+ "default": "./dist/sharing/controller.js"
60
+ },
61
+ "./sharing/web-passkey": {
62
+ "types": "./dist/sharing/web-passkey.d.ts",
63
+ "import": "./dist/sharing/web-passkey.js",
64
+ "default": "./dist/sharing/web-passkey.js"
65
+ },
66
+ "./sharing/account-binding": {
67
+ "types": "./dist/sharing/account-binding.d.ts",
68
+ "import": "./dist/sharing/account-binding.js",
69
+ "default": "./dist/sharing/account-binding.js"
70
+ },
71
+ "./sharing/lifecycle": {
72
+ "types": "./dist/sharing/lifecycle.d.ts",
73
+ "import": "./dist/sharing/lifecycle.js",
74
+ "default": "./dist/sharing/lifecycle.js"
34
75
  },
35
76
  "./keys/web-passkey": {
36
77
  "types": "./dist/keys/web-passkey/index.d.ts",
37
- "import": "./dist/keys/web-passkey/index.js"
78
+ "import": "./dist/keys/web-passkey/index.js",
79
+ "default": "./dist/keys/web-passkey/index.js"
38
80
  },
39
81
  "./auth/google-web": {
40
82
  "types": "./dist/auth/google-web/index.d.ts",
41
- "import": "./dist/auth/google-web/index.js"
83
+ "import": "./dist/auth/google-web/index.js",
84
+ "default": "./dist/auth/google-web/index.js"
85
+ },
86
+ "./auth/google-web/identity": {
87
+ "types": "./dist/auth/google-web/identity.d.ts",
88
+ "import": "./dist/auth/google-web/identity.js",
89
+ "default": "./dist/auth/google-web/identity.js"
90
+ },
91
+ "./auth/google-web/cache": {
92
+ "types": "./dist/auth/google-web/cache.d.ts",
93
+ "import": "./dist/auth/google-web/cache.js",
94
+ "default": "./dist/auth/google-web/cache.js"
42
95
  },
43
96
  "./stores/google-drive": {
44
97
  "types": "./dist/stores/google-drive/index.d.ts",
45
- "import": "./dist/stores/google-drive/index.js"
98
+ "import": "./dist/stores/google-drive/index.js",
99
+ "default": "./dist/stores/google-drive/index.js"
100
+ },
101
+ "./stores/google-drive/sharing": {
102
+ "types": "./dist/stores/google-drive/sharing.d.ts",
103
+ "import": "./dist/stores/google-drive/sharing.js",
104
+ "default": "./dist/stores/google-drive/sharing.js"
105
+ },
106
+ "./stores/google-drive/picker": {
107
+ "types": "./dist/stores/google-drive/picker.d.ts",
108
+ "import": "./dist/stores/google-drive/picker.js",
109
+ "default": "./dist/stores/google-drive/picker.js"
46
110
  }
47
111
  },
48
112
  "scripts": {
49
113
  "build": "tsc -p tsconfig.build.json",
50
- "check": "npm run fixtures:check && npm run lint && npm run typecheck && npm test && npm run build && npm run pack:check",
114
+ "check": "npm run fixtures:check && npm run native:check && npm run parity:check && npm run parity:sharing:check && npm run lint && npm run typecheck && npm test && npm run build && npm run pack:check",
51
115
  "fixtures": "node scripts/generate-v1-fixtures.mjs",
52
116
  "fixtures:check": "node scripts/check-v1-fixtures.mjs",
117
+ "native:check": "sh scripts/check-native-sharing-fixture.sh",
118
+ "parity:check": "sh scripts/check-js-kotlin-parity.sh",
119
+ "parity:sharing:check": "node scripts/check-sharing-checkpoint-parity.mjs",
53
120
  "lint": "eslint .",
121
+ "live:drive": "npm run build && node scripts/live-google-drive-sharing.mjs",
54
122
  "pack:check": "node scripts/check-package.mjs",
55
123
  "prepack": "npm run build",
56
124
  "test": "vitest run",