react-native-cloud-storage 1.2.3 → 1.3.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 (43) hide show
  1. package/README.md +66 -10
  2. package/ios/CloudStorage.m +1 -0
  3. package/ios/CloudStorage.swift +46 -0
  4. package/lib/commonjs/RNCloudStorage.js +10 -0
  5. package/lib/commonjs/RNCloudStorage.js.map +1 -1
  6. package/lib/commonjs/createRNCloudStorage.js.map +1 -1
  7. package/lib/commonjs/google-drive/client.js +172 -0
  8. package/lib/commonjs/google-drive/client.js.map +1 -0
  9. package/lib/commonjs/google-drive/index.js +72 -54
  10. package/lib/commonjs/google-drive/index.js.map +1 -1
  11. package/lib/commonjs/google-drive/types.js +15 -0
  12. package/lib/commonjs/google-drive/types.js.map +1 -1
  13. package/lib/commonjs/types/native.js +2 -0
  14. package/lib/commonjs/types/native.js.map +1 -1
  15. package/lib/module/RNCloudStorage.js +14 -4
  16. package/lib/module/RNCloudStorage.js.map +1 -1
  17. package/lib/module/createRNCloudStorage.js +2 -2
  18. package/lib/module/createRNCloudStorage.js.map +1 -1
  19. package/lib/module/google-drive/client.js +164 -0
  20. package/lib/module/google-drive/client.js.map +1 -0
  21. package/lib/module/google-drive/index.js +66 -49
  22. package/lib/module/google-drive/index.js.map +1 -1
  23. package/lib/module/google-drive/types.js +9 -1
  24. package/lib/module/google-drive/types.js.map +1 -1
  25. package/lib/module/types/native.js +2 -0
  26. package/lib/module/types/native.js.map +1 -1
  27. package/lib/typescript/RNCloudStorage.d.ts +12 -2
  28. package/lib/typescript/RNCloudStorage.d.ts.map +1 -1
  29. package/lib/typescript/google-drive/client.d.ts +33 -0
  30. package/lib/typescript/google-drive/client.d.ts.map +1 -0
  31. package/lib/typescript/google-drive/index.d.ts +7 -4
  32. package/lib/typescript/google-drive/index.d.ts.map +1 -1
  33. package/lib/typescript/google-drive/types.d.ts +10 -3
  34. package/lib/typescript/google-drive/types.d.ts.map +1 -1
  35. package/lib/typescript/types/native.d.ts +3 -0
  36. package/lib/typescript/types/native.d.ts.map +1 -1
  37. package/package.json +1 -4
  38. package/src/RNCloudStorage.ts +16 -5
  39. package/src/createRNCloudStorage.ts +2 -2
  40. package/src/google-drive/client.ts +180 -0
  41. package/src/google-drive/index.ts +97 -73
  42. package/src/google-drive/types.ts +12 -4
  43. package/src/types/native.ts +3 -0
@@ -1,6 +1,9 @@
1
1
  import type NativeRNCloudStorage from '../types/native';
2
2
  import { type NativeRNCloudCloudStorageFileStat, type NativeRNCloudCloudStorageScope } from '../types/native';
3
- export default class GoogleDriveApiClient implements NativeRNCloudStorage {
3
+ /**
4
+ * A proxy class that wraps the Google Drive API client implementation to match the native iOS interface.
5
+ */
6
+ export default class GoogleDrive implements NativeRNCloudStorage {
4
7
  private static drive;
5
8
  static throwOnFilesWithSameName: boolean;
6
9
  filesWithSameNameSubscribers: (({ path, fileIds }: {
@@ -8,8 +11,8 @@ export default class GoogleDriveApiClient implements NativeRNCloudStorage {
8
11
  fileIds: string[];
9
12
  }) => void)[];
10
13
  constructor();
11
- static set accessToken(accessToken: string | undefined);
12
- static get accessToken(): string | undefined;
14
+ static set accessToken(accessToken: string | null);
15
+ static get accessToken(): string | null;
13
16
  subscribeToFilesWithSameName(subscriber: ({ path, fileIds }: {
14
17
  path: string;
15
18
  fileIds: string[];
@@ -26,7 +29,6 @@ export default class GoogleDriveApiClient implements NativeRNCloudStorage {
26
29
  * @returns A promise that resolves to the ID of the root directory or null if it could not be found.
27
30
  */
28
31
  private getRootDirectoryId;
29
- private listInternalFiles;
30
32
  private checkIfMultipleFilesWithSameName;
31
33
  private getFileId;
32
34
  fileExists(path: string, scope: NativeRNCloudCloudStorageScope): Promise<boolean>;
@@ -37,6 +39,7 @@ export default class GoogleDriveApiClient implements NativeRNCloudStorage {
37
39
  readFile(path: string, scope: NativeRNCloudCloudStorageScope): Promise<string>;
38
40
  downloadFile(_path: string, _scope: NativeRNCloudCloudStorageScope): Promise<void>;
39
41
  deleteFile(path: string, scope: NativeRNCloudCloudStorageScope): Promise<void>;
42
+ deleteDirectory(path: string, recursive: boolean, scope: NativeRNCloudCloudStorageScope): Promise<void>;
40
43
  statFile(path: string, scope: NativeRNCloudCloudStorageScope): Promise<NativeRNCloudCloudStorageFileStat>;
41
44
  }
42
45
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/google-drive/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,oBAAoB,MAAM,iBAAiB,CAAC;AACxD,OAAO,EAEL,KAAK,iCAAiC,EACtC,KAAK,8BAA8B,EACpC,MAAM,iBAAiB,CAAC;AAKzB,MAAM,CAAC,OAAO,OAAO,oBAAqB,YAAW,oBAAoB;IACvE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAwB;IAC5C,OAAc,wBAAwB,UAAS;IACxC,4BAA4B,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,EAAE,CAAA;KAAE,KAAK,IAAI,CAAC,EAAE,CAAC;;IAwB1G,WAAkB,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,EAO5D;IAED,WAAkB,WAAW,IAAI,MAAM,GAAG,SAAS,CAElD;IAEM,4BAA4B,CAAC,UAAU,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,EAAE,CAAA;KAAE,KAAK,IAAI,GAAG;QACjH,MAAM,EAAE,MAAM,IAAI,CAAC;KACpB;IAUM,gBAAgB,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAA0D;IAEzG,OAAO,CAAC,gBAAgB;IASxB,OAAO,CAAC,wBAAwB;IAQhC,OAAO,CAAC,qBAAqB;IAiD7B;;;;OAIG;YACW,kBAAkB;YASlB,iBAAiB;IAS/B,OAAO,CAAC,gCAAgC;YAyB1B,SAAS;IAiDjB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,8BAA8B,GAAG,OAAO,CAAC,OAAO,CAAC;IAUjF,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,8BAA8B,GAAG,OAAO,CAAC,IAAI,CAAC;IAkC9F,UAAU,CACd,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,8BAA8B,EACrC,SAAS,EAAE,OAAO,GACjB,OAAO,CAAC,IAAI,CAAC;IA2CV,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,8BAA8B,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAajF,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,8BAA8B,GAAG,OAAO,CAAC,IAAI,CAAC;IA8BnF,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,8BAA8B,GAAG,OAAO,CAAC,MAAM,CAAC;IAM9E,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,8BAA8B,GAAG,OAAO,CAAC,IAAI,CAAC;IAKlF,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,8BAA8B,GAAG,OAAO,CAAC,IAAI,CAAC;IAK9E,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,8BAA8B,GAAG,OAAO,CAAC,iCAAiC,CAAC;CAgBhH"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/google-drive/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,oBAAoB,MAAM,iBAAiB,CAAC;AACxD,OAAO,EAEL,KAAK,iCAAiC,EACtC,KAAK,8BAA8B,EACpC,MAAM,iBAAiB,CAAC;AAMzB;;GAEG;AACH,MAAM,CAAC,OAAO,OAAO,WAAY,YAAW,oBAAoB;IAC9D,OAAO,CAAC,MAAM,CAAC,KAAK,CAAoD;IACxE,OAAc,wBAAwB,UAAS;IACxC,4BAA4B,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,EAAE,CAAA;KAAE,KAAK,IAAI,CAAC,EAAE,CAAC;;IAuB1G,WAAkB,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,EAOvD;IAED,WAAkB,WAAW,IAAI,MAAM,GAAG,IAAI,CAE7C;IAEM,4BAA4B,CAAC,UAAU,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,EAAE,CAAA;KAAE,KAAK,IAAI,GAAG;QACjH,MAAM,EAAE,MAAM,IAAI,CAAC;KACpB;IAUM,gBAAgB,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAsD;IAErG,OAAO,CAAC,gBAAgB;IASxB,OAAO,CAAC,wBAAwB;IAQhC,OAAO,CAAC,qBAAqB;IAiD7B;;;;OAIG;YACW,kBAAkB;IAShC,OAAO,CAAC,gCAAgC;YAyB1B,SAAS;IAmDjB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,8BAA8B,GAAG,OAAO,CAAC,OAAO,CAAC;IAUjF,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,8BAA8B,GAAG,OAAO,CAAC,IAAI,CAAC;IAwC9F,UAAU,CACd,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,8BAA8B,EACrC,SAAS,EAAE,OAAO,GACjB,OAAO,CAAC,IAAI,CAAC;IAmDV,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,8BAA8B,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAajF,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,8BAA8B,GAAG,OAAO,CAAC,IAAI,CAAC;IA4BnF,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,8BAA8B,GAAG,OAAO,CAAC,MAAM,CAAC;IAM9E,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,8BAA8B,GAAG,OAAO,CAAC,IAAI,CAAC;IAKlF,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,8BAA8B,GAAG,OAAO,CAAC,IAAI,CAAC;IAM9E,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,8BAA8B,GAAG,OAAO,CAAC,IAAI,CAAC;IAoBvG,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,8BAA8B,GAAG,OAAO,CAAC,iCAAiC,CAAC;CAYhH"}
@@ -1,12 +1,19 @@
1
+ export type GoogleDriveFileSpace = 'appDataFolder' | 'drive';
2
+ export declare enum MimeTypes {
3
+ BINARY = "application/octet-stream",
4
+ CSV = "text/csv",
5
+ FOLDER = "application/vnd.google-apps.folder",
6
+ JSON = "application/json",
7
+ PDF = "application/pdf",
8
+ TEXT = "text/plain"
9
+ }
1
10
  export interface GoogleDriveFile {
2
11
  id: string;
3
12
  kind: 'drive#file';
4
13
  mimeType: string;
5
14
  name: string;
6
15
  parents: string[];
7
- spaces: ('appDataFolder' | 'drive')[];
8
- }
9
- export interface GoogleDriveDetailedFile extends GoogleDriveFile {
16
+ spaces: GoogleDriveFileSpace[];
10
17
  createdTime: string;
11
18
  modifiedTime: string;
12
19
  size?: number;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/google-drive/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,YAAY,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,MAAM,EAAE,CAAC,eAAe,GAAG,OAAO,CAAC,EAAE,CAAC;CACvC;AAED,MAAM,WAAW,uBAAwB,SAAQ,eAAe;IAC9D,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,uCAAuC;IACtD,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,QAAQ,GAAG,WAAW,CAAC;IACpD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,yBAAyB,CAAC,EAAE,OAAO,CAAC;IACpC,yBAAyB,CAAC,EAAE,WAAW,CAAC;IAExC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,CAAC,CAAC,EAAE,MAAM,CAAC;IAEX,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED,MAAM,WAAW,gCAAgC;IAC/C,KAAK,EAAE,eAAe,EAAE,CAAC;IACzB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,IAAI,EAAE,gBAAgB,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,yCAAyC;IACxD,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED,MAAM,WAAW,sCAAsC;IACrD,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,yBAAyB,CAAC,EAAE,WAAW,CAAC;IACxC,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAED,MAAM,WAAW,qCAAqC;IACpD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,yCAAyC;IACxD,UAAU,EAAE,OAAO,GAAG,WAAW,GAAG,WAAW,CAAC;IAChD,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,yBAAyB,CAAC,EAAE,WAAW,CAAC;IACxC,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,yBAAyB,CAAC,EAAE,OAAO,CAAC;CACrC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/google-drive/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,oBAAoB,GAAG,eAAe,GAAG,OAAO,CAAC;AAE7D,oBAAY,SAAS;IACnB,MAAM,6BAA6B;IACnC,GAAG,aAAa;IAChB,MAAM,uCAAuC;IAC7C,IAAI,qBAAqB;IACzB,GAAG,oBAAoB;IACvB,IAAI,eAAe;CACpB;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,YAAY,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,MAAM,EAAE,oBAAoB,EAAE,CAAC;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,uCAAuC;IACtD,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,QAAQ,GAAG,WAAW,CAAC;IACpD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,yBAAyB,CAAC,EAAE,OAAO,CAAC;IACpC,yBAAyB,CAAC,EAAE,WAAW,CAAC;IAExC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,CAAC,CAAC,EAAE,MAAM,CAAC;IAEX,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED,MAAM,WAAW,gCAAgC;IAC/C,KAAK,EAAE,eAAe,EAAE,CAAC;IACzB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,IAAI,EAAE,gBAAgB,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,yCAAyC;IACxD,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED,MAAM,WAAW,sCAAsC;IACrD,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,yBAAyB,CAAC,EAAE,WAAW,CAAC;IACxC,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAED,MAAM,WAAW,qCAAqC;IACpD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,yCAAyC;IACxD,UAAU,EAAE,OAAO,GAAG,WAAW,GAAG,WAAW,CAAC;IAChD,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,yBAAyB,CAAC,EAAE,WAAW,CAAC;IACxC,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,yBAAyB,CAAC,EAAE,OAAO,CAAC;CACrC"}
@@ -8,8 +8,10 @@ export interface NativeRNCloudCloudStorageFileStat {
8
8
  }
9
9
  export declare enum CloudStorageErrorCode {
10
10
  FILE_NOT_FOUND = "ERR_FILE_NOT_FOUND",
11
+ PATH_IS_FILE = "ERR_PATH_IS_FILE",
11
12
  PATH_IS_DIRECTORY = "ERR_PATH_IS_DIRECTORY",
12
13
  DIRECTORY_NOT_FOUND = "ERR_DIRECTORY_NOT_FOUND",
14
+ DIRECTORY_NOT_EMPTY = "ERR_DIRECTORY_NOT_EMPTY",
13
15
  FILE_ALREADY_EXISTS = "ERR_FILE_EXISTS",
14
16
  MULTIPLE_FILES_SAME_NAME = "ERR_MULTIPLE_FILES_SAME_NAME",
15
17
  AUTHENTICATION_FAILED = "ERR_AUTHENTICATION_FAILED",
@@ -30,6 +32,7 @@ export default interface NativeRNCloudStorage {
30
32
  readFile: (path: string, scope: NativeRNCloudCloudStorageScope) => Promise<string>;
31
33
  downloadFile: (path: string, scope: NativeRNCloudCloudStorageScope) => Promise<void>;
32
34
  deleteFile: (path: string, scope: NativeRNCloudCloudStorageScope) => Promise<void>;
35
+ deleteDirectory: (path: string, recursively: boolean, scope: NativeRNCloudCloudStorageScope) => Promise<void>;
33
36
  statFile: (path: string, scope: NativeRNCloudCloudStorageScope) => Promise<NativeRNCloudCloudStorageFileStat>;
34
37
  isCloudAvailable: () => Promise<boolean>;
35
38
  }
@@ -1 +1 @@
1
- {"version":3,"file":"native.d.ts","sourceRoot":"","sources":["../../../src/types/native.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,8BAA8B,GAAG,WAAW,GAAG,UAAU,CAAC;AAEtE,MAAM,WAAW,iCAAiC;IAChD,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,OAAO,CAAC;IACrB,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,oBAAY,qBAAqB;IAC/B,cAAc,uBAAuB;IACrC,iBAAiB,0BAA0B;IAC3C,mBAAmB,4BAA4B;IAC/C,mBAAmB,oBAAoB;IACvC,wBAAwB,iCAAiC;IACzD,qBAAqB,8BAA8B;IACnD,WAAW,oBAAoB;IAC/B,UAAU,mBAAmB;IAC7B,YAAY,qBAAqB;IACjC,UAAU,mBAAmB;IAC7B,OAAO,gBAAgB;IACvB,qBAAqB,8BAA8B;IACnD,iCAAiC,0CAA0C;CAC5E;AAED,MAAM,CAAC,OAAO,WAAW,oBAAoB;IAC3C,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,8BAA8B,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACtF,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,8BAA8B,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACnG,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,8BAA8B,EAAE,SAAS,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACrH,eAAe,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,8BAA8B,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACxF,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,8BAA8B,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACtF,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,8BAA8B,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACnF,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,8BAA8B,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACrF,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,8BAA8B,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACnF,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,8BAA8B,KAAK,OAAO,CAAC,iCAAiC,CAAC,CAAC;IAC9G,gBAAgB,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;CAC1C"}
1
+ {"version":3,"file":"native.d.ts","sourceRoot":"","sources":["../../../src/types/native.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,8BAA8B,GAAG,WAAW,GAAG,UAAU,CAAC;AAEtE,MAAM,WAAW,iCAAiC;IAChD,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,OAAO,CAAC;IACrB,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,oBAAY,qBAAqB;IAC/B,cAAc,uBAAuB;IACrC,YAAY,qBAAqB;IACjC,iBAAiB,0BAA0B;IAC3C,mBAAmB,4BAA4B;IAC/C,mBAAmB,4BAA4B;IAC/C,mBAAmB,oBAAoB;IACvC,wBAAwB,iCAAiC;IACzD,qBAAqB,8BAA8B;IACnD,WAAW,oBAAoB;IAC/B,UAAU,mBAAmB;IAC7B,YAAY,qBAAqB;IACjC,UAAU,mBAAmB;IAC7B,OAAO,gBAAgB;IACvB,qBAAqB,8BAA8B;IACnD,iCAAiC,0CAA0C;CAC5E;AAED,MAAM,CAAC,OAAO,WAAW,oBAAoB;IAC3C,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,8BAA8B,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACtF,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,8BAA8B,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACnG,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,8BAA8B,EAAE,SAAS,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACrH,eAAe,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,8BAA8B,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACxF,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,8BAA8B,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACtF,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,8BAA8B,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACnF,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,8BAA8B,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACrF,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,8BAA8B,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACnF,eAAe,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,KAAK,EAAE,8BAA8B,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9G,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,8BAA8B,KAAK,OAAO,CAAC,iCAAiC,CAAC,CAAC;IAC9G,gBAAgB,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;CAC1C"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-native-cloud-storage",
3
- "version": "1.2.3",
3
+ "version": "1.3.0",
4
4
  "description": "Save to & read from iCloud and Google Drive using React Native",
5
5
  "main": "lib/commonjs/index",
6
6
  "module": "lib/module/index",
@@ -183,8 +183,5 @@
183
183
  }
184
184
  ]
185
185
  ]
186
- },
187
- "dependencies": {
188
- "react-native-google-drive-api-wrapper-js": "^1.2.3"
189
186
  }
190
187
  }
@@ -1,6 +1,6 @@
1
1
  import { Platform } from 'react-native';
2
2
  import createRNCloudStorage from './createRNCloudStorage';
3
- import GoogleDriveApiClient from './google-drive';
3
+ import GoogleDrive from './google-drive';
4
4
  import { CloudStorageScope, type CloudStorageFileStat } from './types/main';
5
5
  import { verifyLeadingSlash } from './utils/helpers';
6
6
 
@@ -10,15 +10,15 @@ let defaultScope = CloudStorageScope.AppData;
10
10
  const RNCloudStorage = {
11
11
  getDefaultScope: () => defaultScope,
12
12
  setDefaultScope: (scope: CloudStorageScope) => (defaultScope = scope),
13
- getGoogleDriveAccessToken: () => GoogleDriveApiClient.accessToken,
14
- setGoogleDriveAccessToken: (accessToken: string) => (GoogleDriveApiClient.accessToken = accessToken),
15
- setThrowOnFilesWithSameName: (enable: boolean) => (GoogleDriveApiClient.throwOnFilesWithSameName = enable),
13
+ getGoogleDriveAccessToken: () => GoogleDrive.accessToken,
14
+ setGoogleDriveAccessToken: (accessToken: string | null) => (GoogleDrive.accessToken = accessToken),
15
+ setThrowOnFilesWithSameName: (enable: boolean) => (GoogleDrive.throwOnFilesWithSameName = enable),
16
16
  /* eslint-disable @typescript-eslint/no-unused-vars */
17
17
  subscribeToFilesWithSameName:
18
18
  Platform.OS === 'ios'
19
19
  ? // @ts-expect-error - subscriber is undefined; just a mock
20
20
  (subscriber: ({ path, fileIds }: { path: string; fileIds: string[] }) => void) => ({ remove: () => {} })
21
- : (nativeInstance as GoogleDriveApiClient).subscribeToFilesWithSameName.bind(nativeInstance),
21
+ : (nativeInstance as GoogleDrive).subscribeToFilesWithSameName.bind(nativeInstance),
22
22
  /* eslint-enable @typescript-eslint/no-unused-vars */
23
23
 
24
24
  /**
@@ -112,6 +112,17 @@ const RNCloudStorage = {
112
112
  return nativeInstance.deleteFile(verifyLeadingSlash(path), scope ?? defaultScope);
113
113
  },
114
114
 
115
+ /**
116
+ * Deletes the directory at the given path.
117
+ * @param path The directory to delete.
118
+ * @param options Options for the delete operation. Defaults to { recursive: false }.
119
+ * @param scope The directory scope the path is in. Defaults to the set default scope.
120
+ * @returns A promise that resolves when the directory has been deleted.
121
+ */
122
+ rmdir: (path: string, options?: { recursive?: boolean }, scope?: CloudStorageScope): Promise<void> => {
123
+ return nativeInstance.deleteDirectory(verifyLeadingSlash(path), options?.recursive ?? false, scope ?? defaultScope);
124
+ },
125
+
115
126
  /**
116
127
  * Gets the size, creation time, and modification time of the file at the given path.
117
128
  * @param path The file to stat.
@@ -1,6 +1,6 @@
1
1
  import { NativeModules, Platform } from 'react-native';
2
2
  import type NativeRNCloudStorage from './types/native';
3
- import GoogleDriveApiClient from './google-drive';
3
+ import GoogleDrive from './google-drive';
4
4
  import { CloudStorageErrorCode } from './types/native';
5
5
  import CloudStorageError from './utils/CloudStorageError';
6
6
 
@@ -49,5 +49,5 @@ export default function createRNCloudStorage(): NativeRNCloudStorage {
49
49
  );
50
50
  }
51
51
 
52
- return new GoogleDriveApiClient();
52
+ return new GoogleDrive();
53
53
  }
@@ -0,0 +1,180 @@
1
+ import {
2
+ MimeTypes,
3
+ type GoogleDriveFile,
4
+ type GoogleDriveFileSpace,
5
+ type GoogleDriveListOperationQueryParameters,
6
+ type GoogleDriveListOperationResponse,
7
+ } from './types';
8
+
9
+ const BASE_URL = 'https://www.googleapis.com/drive/v3';
10
+ const BASE_UPLOAD_URL = 'https://www.googleapis.com/upload/drive/v3';
11
+ const MULTIPART_BOUNDARY = 'foo_bar_baz';
12
+
13
+ export class GoogleDriveHttpError extends Error {
14
+ public status: number;
15
+ public json: any;
16
+
17
+ constructor(message: string, status: number, json: any) {
18
+ super(message);
19
+ this.status = status;
20
+ this.json = json;
21
+ }
22
+ }
23
+
24
+ // TODO: fetch timeout
25
+ // TODO: properly handle errors
26
+ export default class GoogleDriveApiClient {
27
+ public accessToken: string;
28
+
29
+ constructor(accessToken: string = '') {
30
+ this.accessToken = accessToken;
31
+ }
32
+
33
+ private buildQueryString(query: object): string {
34
+ let res = Object.entries(query)
35
+ .filter(([, value]) => value !== undefined)
36
+ .map(([key, value]) => {
37
+ if (typeof value === 'boolean') return `${encodeURIComponent(key)}=${value ? 'true' : 'false'}`;
38
+ return `${encodeURIComponent(key)}=${encodeURIComponent(value!)}`;
39
+ })
40
+ .join('&');
41
+
42
+ if (res) {
43
+ res = `?${res}`;
44
+ }
45
+ return res;
46
+ }
47
+
48
+ private async request<T extends Record<string, any> | string | void = void>(
49
+ operation: `/${string}`,
50
+ { queryParameters, baseUrl, ...options }: RequestInit & { queryParameters?: object; baseUrl?: string } = {}
51
+ ): Promise<T> {
52
+ let path = `${baseUrl ?? BASE_URL}${operation}`;
53
+ if (queryParameters) {
54
+ path += this.buildQueryString(queryParameters);
55
+ }
56
+ const response = await fetch(path, {
57
+ ...options,
58
+ headers: {
59
+ ...options.headers,
60
+ Authorization: `Bearer ${this.accessToken}`,
61
+ },
62
+ });
63
+
64
+ if (!response.ok) {
65
+ let errorMessage: string;
66
+ let json: any = null;
67
+ try {
68
+ json = await response.json();
69
+ errorMessage = json.error?.message ?? `Request failed with status ${response.status}`;
70
+ } catch (e) {
71
+ errorMessage = `Request failed with status ${response.status}`;
72
+ }
73
+ throw new GoogleDriveHttpError(errorMessage, response.status, json);
74
+ }
75
+
76
+ if (response.status === 204) {
77
+ return undefined as unknown as T;
78
+ }
79
+ if (options?.headers && 'Accept' in options.headers && options.headers.Accept !== 'application/json') {
80
+ return response.text() as unknown as Promise<T>;
81
+ }
82
+ return response.json();
83
+ }
84
+
85
+ private buildMultiPartBody(metadata: object, media: { mimeType: string; body: string }): string {
86
+ const body: string[] = [];
87
+ body.push(`--${MULTIPART_BOUNDARY}\r\n`);
88
+ body.push(`Content-Type: ${MimeTypes.JSON}; charset=UTF-8\r\n\r\n`);
89
+ body.push(`${JSON.stringify(metadata)}\r\n`);
90
+ body.push(`--${MULTIPART_BOUNDARY}\r\n`);
91
+ body.push(`Content-Type: ${media.mimeType}\r\n\r\n`);
92
+ body.push(`${media.body}\r\n`);
93
+ body.push(`--${MULTIPART_BOUNDARY}--`);
94
+
95
+ return body.join('');
96
+ }
97
+
98
+ public async listFiles(space: GoogleDriveFileSpace): Promise<GoogleDriveFile[]> {
99
+ const files: GoogleDriveFile[] = [];
100
+ let pageToken: string | undefined;
101
+ const fields = ['id', 'kind', 'mimeType', 'name', 'parents', 'spaces', 'size', 'createdTime', 'modifiedTime'];
102
+ do {
103
+ const queryParameters: GoogleDriveListOperationQueryParameters = {
104
+ fields: `files(${fields.join(',')}),nextPageToken`,
105
+ spaces: space,
106
+ };
107
+ const response = await this.request<GoogleDriveListOperationResponse>(`/files`, {
108
+ queryParameters,
109
+ });
110
+
111
+ files.push(...response.files);
112
+ pageToken = response.nextPageToken ?? undefined;
113
+ } while (pageToken);
114
+
115
+ return files;
116
+ }
117
+
118
+ public async getFile(fileId: string): Promise<GoogleDriveFile> {
119
+ const queryParameters: GoogleDriveListOperationQueryParameters = {
120
+ fields: ['id', 'kind', 'mimeType', 'name', 'parents', 'spaces', 'size', 'createdTime', 'modifiedTime'].join(','),
121
+ };
122
+ return this.request<GoogleDriveFile>(`/files/${fileId}`, {
123
+ queryParameters,
124
+ });
125
+ }
126
+
127
+ public async getFileText(fileId: string): Promise<string> {
128
+ return this.request<string>(`/files/${fileId}`, {
129
+ queryParameters: { alt: 'media' },
130
+ headers: { Accept: 'text/plain' },
131
+ });
132
+ }
133
+
134
+ public async deleteFile(fileId: string): Promise<void> {
135
+ return this.request(`/files/${fileId}`, {
136
+ method: 'DELETE',
137
+ });
138
+ }
139
+
140
+ public async createFile(
141
+ metadata: { name: string; parents?: string[] },
142
+ media: { mimeType: string; body: string }
143
+ ): Promise<void> {
144
+ const multipartRequestBody = this.buildMultiPartBody(metadata, media);
145
+
146
+ await this.request(`/files`, {
147
+ queryParameters: { uploadType: 'multipart' },
148
+ method: 'POST',
149
+ headers: {
150
+ 'Content-Type': `multipart/related; boundary=${MULTIPART_BOUNDARY}`,
151
+ 'Content-Length': multipartRequestBody.length.toString(),
152
+ },
153
+ body: multipartRequestBody,
154
+ baseUrl: BASE_UPLOAD_URL,
155
+ });
156
+ }
157
+
158
+ public async createDirectory(metadata: { name: string; parents?: string[] }): Promise<void> {
159
+ await this.request(`/files`, {
160
+ method: 'POST',
161
+ headers: {
162
+ 'Content-Type': `application/json`,
163
+ },
164
+ body: JSON.stringify({ ...metadata, mimeType: MimeTypes.FOLDER }),
165
+ });
166
+ }
167
+
168
+ public async updateFile(fileId: string, media: { mimeType: string; body: string }): Promise<void> {
169
+ await this.request(`/files/${fileId}`, {
170
+ queryParameters: { uploadType: 'media' },
171
+ method: 'PATCH',
172
+ headers: {
173
+ 'Content-Type': media.mimeType,
174
+ 'Content-Length': media.body.length.toString(),
175
+ },
176
+ body: media.body,
177
+ baseUrl: BASE_UPLOAD_URL,
178
+ });
179
+ }
180
+ }