gdrivekit 1.0.3 → 1.0.4

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 (3) hide show
  1. package/README.md +29 -1
  2. package/dist/index.js +157 -223
  3. package/package.json +1 -1
package/README.md CHANGED
@@ -58,7 +58,8 @@ After that, you **don’t need to call it again** unless you delete your tokens
58
58
  Once tokens are generated, you can initialize the Google Drive service and perform file operations:
59
59
 
60
60
  ```ts
61
- import { operations, initDriveService } from "gdrivekit";
61
+ import { operations } from "gdrivekit";
62
+ import { initDriveService } from "./drivers/services";
62
63
 
63
64
  async function main() {
64
65
  initDriveService();
@@ -147,6 +148,14 @@ main();
147
148
 
148
149
  ---
149
150
 
151
+ ## Json Operation
152
+ | Method | Description |
153
+ | ----------------------- | ----------------------------------------- |
154
+ | `readJsonFileData()` | Read JSON file content |
155
+ | `addJsonKeyValue()` | Add a new key-value pair to a JSON file |
156
+ | `updateJsonFieldAndValues()` | Update an existing field in a JSON file |
157
+ | `deleteJsonFieldAndKeys()` | Delete a field from a JSON file |
158
+
150
159
  ### ⚡ Example: Upload a File
151
160
 
152
161
  ```ts
@@ -170,6 +179,25 @@ if (files?.data?.files?.length) {
170
179
 
171
180
  ---
172
181
 
182
+ ### ⚡ Example: Add a Key-Value Pair to a JSON File
183
+
184
+ ```ts
185
+ const fileId = "1234567890abcdef1234567890abcdef";
186
+ const addResult = await operations.addJsonKeyValue(
187
+ fileId,
188
+ "alive",
189
+ true
190
+ );
191
+
192
+ if (addResult.success) {
193
+ console.log("✅ Added new key-value pair successfully");
194
+ } else {
195
+ console.error("❌ Failed:", addResult.error);
196
+ }
197
+ ```
198
+
199
+ ---
200
+
173
201
  ### 🧑‍💻 Author
174
202
 
175
203
  **Vikash Khati**
package/dist/index.js CHANGED
@@ -778704,6 +778704,7 @@ var exports_operations = {};
778704
778704
  __export(exports_operations, {
778705
778705
  uploadMultipleFiles: () => uploadMultipleFiles,
778706
778706
  uploadFile: () => uploadFile,
778707
+ updateJsonFieldAndValues: () => updateJsonFieldAndValues,
778707
778708
  updateFile: () => updateFile,
778708
778709
  searchStarredFiles: () => searchStarredFiles,
778709
778710
  searchSharedFiles: () => searchSharedFiles,
@@ -778713,6 +778714,8 @@ __export(exports_operations, {
778713
778714
  searchByExactName: () => searchByExactName,
778714
778715
  searchByContent: () => searchByContent,
778715
778716
  renameFile: () => renameFile,
778717
+ readJsonFileData: () => readJsonFileData,
778718
+ readFileData: () => readFileData,
778716
778719
  moveFileByName: () => moveFileByName,
778717
778720
  moveFile: () => moveFile,
778718
778721
  listRecentFiles: () => listRecentFiles,
@@ -778729,224 +778732,16 @@ __export(exports_operations, {
778729
778732
  downloadMultipleFiles: () => downloadMultipleFiles,
778730
778733
  downloadFile: () => downloadFile,
778731
778734
  deleteMultipleFiles: () => deleteMultipleFiles,
778735
+ deleteJsonFieldAndKeys: () => deleteJsonFieldAndKeys,
778732
778736
  deleteFolder: () => deleteFolder,
778733
778737
  deleteFile: () => deleteFile,
778734
778738
  createFolder: () => createFolder,
778735
- copyFile: () => copyFile
778739
+ copyFile: () => copyFile,
778740
+ addJsonKeyValue: () => addJsonKeyValue
778736
778741
  });
778737
778742
 
778738
- // drivers/services.ts
778739
- import fs3 from "fs";
778740
-
778741
- // drivers/GoogleDriveService.ts
778742
- var import_googleapis = __toESM(require_src8(), 1);
778743
- import * as fs2 from "fs";
778744
- import * as path from "path";
778745
-
778746
- class GoogleDriveService {
778747
- oauth2Client;
778748
- drive;
778749
- constructor(credentials) {
778750
- const creds = credentials.web || credentials.installed || credentials;
778751
- const { client_id, client_secret } = creds;
778752
- const redirect_uri = "redirect_uris" in creds ? creds.redirect_uris[0] : credentials.redirect_uri;
778753
- this.oauth2Client = new import_googleapis.google.auth.OAuth2(client_id, client_secret, redirect_uri);
778754
- this.drive = import_googleapis.google.drive({ version: "v3", auth: this.oauth2Client });
778755
- }
778756
- setCredentials(tokens) {
778757
- this.oauth2Client.setCredentials(tokens);
778758
- this.oauth2Client.on("tokens", (newTokens) => {
778759
- if (newTokens.refresh_token) {
778760
- tokens.refresh_token = newTokens.refresh_token;
778761
- }
778762
- tokens.access_token = newTokens.access_token;
778763
- tokens.expiry_date = newTokens.expiry_date;
778764
- fs2.writeFileSync("./tokens.json", JSON.stringify(tokens, null, 2));
778765
- console.log("\uD83D\uDD04 Tokens refreshed and saved");
778766
- });
778767
- }
778768
- async listFiles(params = {}) {
778769
- try {
778770
- const response = await this.drive.files.list({
778771
- pageSize: params.pageSize || 10,
778772
- fields: "nextPageToken, files(id, name, mimeType, size, createdTime, modifiedTime)",
778773
- q: params.query || undefined,
778774
- orderBy: params.orderBy || "modifiedTime desc",
778775
- pageToken: params.pageToken || undefined
778776
- });
778777
- return {
778778
- success: true,
778779
- data: {
778780
- files: response.data.files,
778781
- nextPageToken: response.data.nextPageToken || undefined
778782
- }
778783
- };
778784
- } catch (error) {
778785
- return {
778786
- success: false,
778787
- error: error instanceof Error ? error.message : "Unknown error"
778788
- };
778789
- }
778790
- }
778791
- async getFileMetadata(fileId) {
778792
- try {
778793
- const response = await this.drive.files.get({
778794
- fileId,
778795
- fields: "id, name, mimeType, size, createdTime, modifiedTime, parents, webViewLink"
778796
- });
778797
- return {
778798
- success: true,
778799
- data: response.data
778800
- };
778801
- } catch (error) {
778802
- return {
778803
- success: false,
778804
- error: error instanceof Error ? error.message : "Unknown error"
778805
- };
778806
- }
778807
- }
778808
- async downloadFile(fileId, destPath) {
778809
- try {
778810
- const dest = fs2.createWriteStream(destPath);
778811
- const response = await this.drive.files.get({ fileId, alt: "media" }, { responseType: "stream" });
778812
- return new Promise((resolve, reject) => {
778813
- response.data.on("end", () => {
778814
- resolve({ success: true, data: { path: destPath } });
778815
- }).on("error", (err) => {
778816
- reject({ success: false, error: err.message });
778817
- }).pipe(dest);
778818
- });
778819
- } catch (error) {
778820
- return {
778821
- success: false,
778822
- error: error instanceof Error ? error.message : "Unknown error"
778823
- };
778824
- }
778825
- }
778826
- async uploadFile(filePath, metadata = {}) {
778827
- try {
778828
- const fileMetadata = {
778829
- name: metadata.name || path.basename(filePath),
778830
- parents: metadata.parents || []
778831
- };
778832
- const media = {
778833
- mimeType: metadata.mimeType,
778834
- body: fs2.createReadStream(filePath)
778835
- };
778836
- const response = await this.drive.files.create({
778837
- requestBody: fileMetadata,
778838
- media,
778839
- fields: "id, name, mimeType, size, webViewLink"
778840
- });
778841
- return {
778842
- success: true,
778843
- data: response.data
778844
- };
778845
- } catch (error) {
778846
- return {
778847
- success: false,
778848
- error: error instanceof Error ? error.message : "Unknown error"
778849
- };
778850
- }
778851
- }
778852
- async updateFileContent(fileId, filePath) {
778853
- try {
778854
- const media = {
778855
- body: fs2.createReadStream(filePath)
778856
- };
778857
- const response = await this.drive.files.update({
778858
- fileId,
778859
- media,
778860
- fields: "id, name, mimeType, modifiedTime"
778861
- });
778862
- return {
778863
- success: true,
778864
- data: response.data
778865
- };
778866
- } catch (error) {
778867
- return {
778868
- success: false,
778869
- error: error instanceof Error ? error.message : "Unknown error"
778870
- };
778871
- }
778872
- }
778873
- async updateFileMetadata(fileId, metadata) {
778874
- try {
778875
- const response = await this.drive.files.update({
778876
- fileId,
778877
- requestBody: metadata,
778878
- fields: "id, name, mimeType, modifiedTime"
778879
- });
778880
- return {
778881
- success: true,
778882
- data: response.data
778883
- };
778884
- } catch (error) {
778885
- return {
778886
- success: false,
778887
- error: error instanceof Error ? error.message : "Unknown error"
778888
- };
778889
- }
778890
- }
778891
- async deleteFile(fileId) {
778892
- try {
778893
- await this.drive.files.delete({
778894
- fileId
778895
- });
778896
- return {
778897
- success: true,
778898
- data: { message: "File deleted successfully" }
778899
- };
778900
- } catch (error) {
778901
- return {
778902
- success: false,
778903
- error: error instanceof Error ? error.message : "Unknown error"
778904
- };
778905
- }
778906
- }
778907
- async createFolder(folderName, parentFolderId) {
778908
- try {
778909
- const fileMetadata = {
778910
- name: folderName,
778911
- mimeType: "application/vnd.google-apps.folder"
778912
- };
778913
- if (parentFolderId) {
778914
- fileMetadata.parents = [parentFolderId];
778915
- }
778916
- const response = await this.drive.files.create({
778917
- requestBody: fileMetadata,
778918
- fields: "id, name, mimeType"
778919
- });
778920
- return {
778921
- success: true,
778922
- data: response.data
778923
- };
778924
- } catch (error) {
778925
- return {
778926
- success: false,
778927
- error: error instanceof Error ? error.message : "Unknown error"
778928
- };
778929
- }
778930
- }
778931
- async searchFiles(searchQuery, pageSize = 10) {
778932
- return this.listFiles({
778933
- query: searchQuery,
778934
- pageSize
778935
- });
778936
- }
778937
- }
778938
-
778939
778743
  // drivers/services.ts
778940
778744
  var driveService;
778941
- async function initDriveService(creds, tokens) {
778942
- if (!driveService) {
778943
- const credentials = creds ?? JSON.parse(fs3.readFileSync("./credentials.json", "utf-8"));
778944
- driveService = new GoogleDriveService(credentials);
778945
- const tokenData = tokens ?? JSON.parse(fs3.readFileSync("./tokens.json", "utf-8"));
778946
- driveService.setCredentials(tokenData);
778947
- }
778948
- return driveService;
778949
- }
778950
778745
 
778951
778746
  // types/index.ts
778952
778747
  var MIME_TYPES = {
@@ -778962,6 +778757,7 @@ var MIME_TYPES = {
778962
778757
  POWERPOINT: "application/vnd.openxmlformats-officedocument.presentationml.presentation",
778963
778758
  TEXT: "text/plain",
778964
778759
  CSV: "text/csv",
778760
+ JSON: "application/json",
778965
778761
  JPEG: "image/jpeg",
778966
778762
  PNG: "image/png",
778967
778763
  GIF: "image/gif",
@@ -778975,11 +778771,19 @@ var MIME_TYPES = {
778975
778771
  };
778976
778772
 
778977
778773
  // operations.ts
778774
+ async function readFileData(fileId) {
778775
+ const response = await driveService.readFileData(fileId);
778776
+ if (response.success && response.data) {
778777
+ return typeof response.data === "string" ? response.data : response.data.toString();
778778
+ }
778779
+ throw new Error(response.error || "Failed to read file data");
778780
+ }
778978
778781
  async function uploadFile(filePath, options) {
778979
778782
  return await driveService.uploadFile(filePath, {
778980
778783
  name: options?.fileName,
778981
778784
  parents: options?.folderId ? [options.folderId] : undefined,
778982
- description: options?.description
778785
+ description: options?.description,
778786
+ mimeType: options?.mimeType
778983
778787
  });
778984
778788
  }
778985
778789
  async function downloadFile(fileId, savePath) {
@@ -779002,7 +778806,9 @@ async function moveFile(fileId, newFolderId) {
779002
778806
  if (!file.success || !file.data) {
779003
778807
  return { success: false, error: "File not found" };
779004
778808
  }
779005
- return await driveService.updateFileMetadata(fileId, { parents: [newFolderId] });
778809
+ return await driveService.updateFileMetadata(fileId, {
778810
+ parents: [newFolderId]
778811
+ });
779006
778812
  }
779007
778813
  async function moveFileByName(fileName, folderName) {
779008
778814
  const fileResult = await getFileIdByName(fileName);
@@ -779018,6 +778824,130 @@ async function moveFileByName(fileName, folderName) {
779018
778824
  async function copyFile(fileId, newName) {
779019
778825
  return await driveService.copyFile(fileId, newName ? { name: newName } : undefined);
779020
778826
  }
778827
+ async function readJsonFileData(fileId) {
778828
+ const content = await readFileData(fileId);
778829
+ try {
778830
+ return { success: true, data: JSON.parse(content) };
778831
+ } catch (error) {
778832
+ return { success: false, error: "Failed to parse JSON file content" };
778833
+ }
778834
+ }
778835
+ async function addJsonKeyValue(fileId, key, value) {
778836
+ try {
778837
+ const readResponse = await driveService.readFileData(fileId, true);
778838
+ if (!readResponse.success || !readResponse.data) {
778839
+ throw new Error(readResponse.error || "Failed to read JSON file data");
778840
+ }
778841
+ let jsonData;
778842
+ try {
778843
+ jsonData = JSON.parse(readResponse.data);
778844
+ } catch {
778845
+ throw new Error("Invalid JSON format in file");
778846
+ }
778847
+ const parts = key.split(".");
778848
+ let current = jsonData;
778849
+ for (let i2 = 0;i2 < parts.length - 1; i2++) {
778850
+ const part = parts[i2];
778851
+ if (!current[part] || typeof current[part] !== "object") {
778852
+ current[part] = {};
778853
+ }
778854
+ current = current[part];
778855
+ }
778856
+ current[parts.at(-1)] = value;
778857
+ const updateResponse = await driveService.updateJsonContent(fileId, jsonData);
778858
+ if (!updateResponse.success) {
778859
+ throw new Error(updateResponse.error || "Failed to update file");
778860
+ }
778861
+ return { success: true, data: updateResponse.data };
778862
+ } catch (error) {
778863
+ console.error("❌ Error adding key-value pair:", error.message);
778864
+ return { success: false, error: error.message };
778865
+ }
778866
+ }
778867
+ async function deleteJsonFieldAndKeys(fileId, key) {
778868
+ try {
778869
+ const readResponse = await driveService.readFileData(fileId, true);
778870
+ if (!readResponse.success || !readResponse.data) {
778871
+ throw new Error(readResponse.error || "Failed to read JSON file data");
778872
+ }
778873
+ let jsonData;
778874
+ try {
778875
+ jsonData = JSON.parse(readResponse.data);
778876
+ } catch {
778877
+ throw new Error("Invalid JSON format in file");
778878
+ }
778879
+ const parts = key.split(".");
778880
+ let current = jsonData;
778881
+ for (let i2 = 0;i2 < parts.length - 1; i2++) {
778882
+ const part = parts[i2];
778883
+ if (!current[part] || typeof current[part] !== "object") {
778884
+ throw new Error(`Key path '${key}' does not exist in JSON`);
778885
+ }
778886
+ current = current[part];
778887
+ }
778888
+ const lastKey = parts.at(-1);
778889
+ if (!(lastKey in current)) {
778890
+ throw new Error(`Key '${lastKey}' does not exist`);
778891
+ }
778892
+ delete current[lastKey];
778893
+ const updateResponse = await driveService.updateJsonContent(fileId, jsonData);
778894
+ if (!updateResponse.success) {
778895
+ throw new Error(updateResponse.error || "Failed to update file");
778896
+ }
778897
+ return { success: true, data: updateResponse.data };
778898
+ } catch (error) {
778899
+ console.error("❌ Error deleting key-value pair:", error.message);
778900
+ return { success: false, error: error.message };
778901
+ }
778902
+ }
778903
+ async function updateJsonFieldAndValues(fileId, keyPath, newKey, newValue) {
778904
+ try {
778905
+ const readResponse = await driveService.readFileData(fileId, true);
778906
+ if (!readResponse.success || !readResponse.data) {
778907
+ throw new Error(readResponse.error || "Failed to read JSON file data");
778908
+ }
778909
+ let jsonData;
778910
+ try {
778911
+ jsonData = JSON.parse(readResponse.data);
778912
+ } catch {
778913
+ throw new Error("Invalid JSON format in file");
778914
+ }
778915
+ const parts = keyPath.split(".");
778916
+ let current = jsonData;
778917
+ for (let i2 = 0;i2 < parts.length - 1; i2++) {
778918
+ const part = parts[i2];
778919
+ if (!current[part] || typeof current[part] !== "object") {
778920
+ throw new Error(`Key path '${keyPath}' does not exist in JSON`);
778921
+ }
778922
+ current = current[part];
778923
+ }
778924
+ const oldKey = parts.at(-1);
778925
+ if (!(oldKey in current)) {
778926
+ throw new Error(`Key '${oldKey}' does not exist`);
778927
+ }
778928
+ const existingValue = current[oldKey];
778929
+ const finalValue = newValue !== undefined ? newValue : existingValue;
778930
+ const finalKey = newKey && newKey !== oldKey ? newKey : oldKey;
778931
+ const rebuilt = {};
778932
+ for (const k of Object.keys(current)) {
778933
+ if (k === oldKey) {
778934
+ rebuilt[finalKey] = finalValue;
778935
+ } else {
778936
+ rebuilt[k] = current[k];
778937
+ }
778938
+ }
778939
+ Object.keys(current).forEach((k) => delete current[k]);
778940
+ Object.assign(current, rebuilt);
778941
+ const updateResponse = await driveService.updateJsonContent(fileId, jsonData);
778942
+ if (!updateResponse.success) {
778943
+ throw new Error(updateResponse.error || "Failed to update file");
778944
+ }
778945
+ return { success: true, data: updateResponse.data };
778946
+ } catch (error) {
778947
+ console.error("❌ Error updating JSON key-value:", error.message);
778948
+ return { success: false, error: error.message };
778949
+ }
778950
+ }
779021
778951
  async function createFolder(folderName, parentFolderId) {
779022
778952
  return await driveService.createFolder(folderName, parentFolderId);
779023
778953
  }
@@ -779159,6 +779089,7 @@ async function getFileIdByName(fileName) {
779159
779089
  return { success: false, error: "File not found" };
779160
779090
  }
779161
779091
  var driveOperations = {
779092
+ readFileData,
779162
779093
  uploadFile,
779163
779094
  downloadFile,
779164
779095
  deleteFile,
@@ -779168,6 +779099,10 @@ var driveOperations = {
779168
779099
  moveFile,
779169
779100
  moveFileByName,
779170
779101
  copyFile,
779102
+ readJsonFileData,
779103
+ addJsonKeyValue,
779104
+ updateJsonFieldAndValues,
779105
+ deleteJsonFieldAndKeys,
779171
779106
  createFolder,
779172
779107
  deleteFolder,
779173
779108
  listAllFolders,
@@ -779192,8 +779127,8 @@ var driveOperations = {
779192
779127
  };
779193
779128
 
779194
779129
  // auth.ts
779195
- var import_googleapis2 = __toESM(require_src8(), 1);
779196
- import * as fs4 from "fs";
779130
+ var import_googleapis = __toESM(require_src8(), 1);
779131
+ import * as fs2 from "fs";
779197
779132
  import * as http3 from "http";
779198
779133
  import * as url from "url";
779199
779134
  var CREDENTIALS_PATH = "./credentials.json";
@@ -779205,7 +779140,7 @@ async function generateCredentialsAndTokens({
779205
779140
  redirecturis,
779206
779141
  javascript_origin
779207
779142
  }) {
779208
- if (!fs4.existsSync(CREDENTIALS_PATH)) {
779143
+ if (!fs2.existsSync(CREDENTIALS_PATH)) {
779209
779144
  const baseCredentials = {
779210
779145
  web: {
779211
779146
  client_id: clientid,
@@ -779218,17 +779153,17 @@ async function generateCredentialsAndTokens({
779218
779153
  javascript_origins: javascript_origin || ["http://localhost:3000"]
779219
779154
  }
779220
779155
  };
779221
- fs4.writeFileSync(CREDENTIALS_PATH, JSON.stringify(baseCredentials, null, 2));
779156
+ fs2.writeFileSync(CREDENTIALS_PATH, JSON.stringify(baseCredentials, null, 2));
779222
779157
  console.log("✅ Created credentials.json");
779223
779158
  }
779224
- const credentials = JSON.parse(fs4.readFileSync(CREDENTIALS_PATH, "utf-8"));
779159
+ const credentials = JSON.parse(fs2.readFileSync(CREDENTIALS_PATH, "utf-8"));
779225
779160
  const creds = credentials.web || credentials.installed || credentials;
779226
779161
  const client_id = creds.client_id;
779227
779162
  const client_secret = creds.client_secret;
779228
779163
  const redirect_uri = Array.isArray(creds.redirect_uris) ? creds.redirect_uris[0] : creds.redirect_uri;
779229
- const oauth2Client = new import_googleapis2.google.auth.OAuth2(client_id, client_secret, redirect_uri);
779230
- if (fs4.existsSync(TOKENS_PATH)) {
779231
- const tokens = JSON.parse(fs4.readFileSync(TOKENS_PATH, "utf-8"));
779164
+ const oauth2Client = new import_googleapis.google.auth.OAuth2(client_id, client_secret, redirect_uri);
779165
+ if (fs2.existsSync(TOKENS_PATH)) {
779166
+ const tokens = JSON.parse(fs2.readFileSync(TOKENS_PATH, "utf-8"));
779232
779167
  oauth2Client.setCredentials(tokens);
779233
779168
  console.log("✅ Using existing tokens from tokens.json");
779234
779169
  return oauth2Client;
@@ -779257,7 +779192,7 @@ async function generateCredentialsAndTokens({
779257
779192
  throw new Error("No authorization code received");
779258
779193
  const { tokens } = await oauth2Client.getToken(code);
779259
779194
  oauth2Client.setCredentials(tokens);
779260
- fs4.writeFileSync(TOKENS_PATH, JSON.stringify(tokens, null, 2));
779195
+ fs2.writeFileSync(TOKENS_PATH, JSON.stringify(tokens, null, 2));
779261
779196
  console.log("✅ Tokens saved to tokens.json");
779262
779197
  res.writeHead(200, { "Content-Type": "text/html" });
779263
779198
  res.end(`
@@ -779299,6 +779234,5 @@ async function generateCredentialsAndTokens({
779299
779234
  }
779300
779235
  export {
779301
779236
  exports_operations as operations,
779302
- initDriveService,
779303
779237
  generateCredentialsAndTokens
779304
779238
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gdrivekit",
3
- "version": "1.0.3",
3
+ "version": "1.0.4",
4
4
  "description": "A lightweight Google Drive toolkit for File Management. Handle Google Drive operations easily — upload, download, and other file operations in a few lines of code.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",