{"id":30196338,"url":"https://github.com/kasnef/kas-on-cloud","last_synced_at":"2026-04-11T07:02:11.089Z","repository":{"id":306378484,"uuid":"1025976297","full_name":"kasnef/kas-on-cloud","owner":"kasnef","description":"Support uploads file to Microsoft sharepoint or Google drive","archived":false,"fork":false,"pushed_at":"2025-08-03T11:07:48.000Z","size":109,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"development","last_synced_at":"2025-08-03T12:17:04.420Z","etag":null,"topics":["drive","library","nodejs","npm","sharepoint","yarn"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/kasnef.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2025-07-25T05:45:32.000Z","updated_at":"2025-08-03T10:37:56.000Z","dependencies_parsed_at":"2025-08-03T12:11:11.691Z","dependency_job_id":null,"html_url":"https://github.com/kasnef/kas-on-cloud","commit_stats":null,"previous_names":["kasnef/kas-on-cloud"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/kasnef/kas-on-cloud","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kasnef%2Fkas-on-cloud","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kasnef%2Fkas-on-cloud/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kasnef%2Fkas-on-cloud/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kasnef%2Fkas-on-cloud/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/kasnef","download_url":"https://codeload.github.com/kasnef/kas-on-cloud/tar.gz/refs/heads/development","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kasnef%2Fkas-on-cloud/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":270183606,"owners_count":24541341,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-08-13T02:00:09.904Z","response_time":66,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["drive","library","nodejs","npm","sharepoint","yarn"],"created_at":"2025-08-13T05:18:04.372Z","updated_at":"2026-04-11T07:02:11.083Z","avatar_url":"https://github.com/kasnef.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003c!-- Title --\u003e\n\n# 📎 kas-on-cloud – Upload Files to SharePoint \u0026 Google Drive with Node.js\n\n\u003e If this was helpful, give it a star!⭐ Thanks so muchhh ❤️\n\n\u003c!-- Badges --\u003e\n\n![OneDrive](https://img.shields.io/badge/OneDrive-white?style=for-the-badge\u0026logo=Microsoft%20OneDrive\u0026logoColor=0078D4)\n![Google Drive](https://img.shields.io/badge/Google%20Drive-4285F4?style=for-the-badge\u0026logo=googledrive\u0026logoColor=white)\n![TypeScript](https://img.shields.io/badge/typescript-%23007ACC.svg?style=for-the-badge\u0026logo=typescript\u0026logoColor=white)\n![npm](https://img.shields.io/badge/npm-CB3837?style=for-the-badge\u0026logo=npm\u0026logoColor=white)\n![yarn](https://img.shields.io/badge/Yarn-2C8EBB?style=for-the-badge\u0026logo=yarn\u0026logoColor=white)\n\n\u003e ⚡ A lightweight and flexible **Node.js/TypeScript** library for uploading files to **Microsoft SharePoint Document Libraries** and **Google Drive**.\n\u003e 📤 Supports **single and multiple file uploads**, automatic caching, and easy integration with **Microsoft Graph API** and **Google Drive API**.\n\u003e 🚀 Ideal for developers building backend services, CLI tools, or automation systems that need reliable **cloud file storage upload** features.\n\n- [Microsoft Graph API – Docs](https://learn.microsoft.com/en-us/graph/api/resources/sharepoint?view=graph-rest-1.0)\n- [Google Drive API – Docs](https://developers.google.com/drive)\n\n---\n\n\u003c!-- Table of Contents --\u003e\n\n## 📚 Table of Contents\n\n- [👨‍💻 Author](#-author)\n- [🔧 Installation](#-installation)\n- [☁️ Upload to SharePoint](#️-upload-to-sharepoint)\n  - [🧾 Prerequisites](#-prerequisites)\n  - [📄 Upload a Single File](#-upload-a-single-file)\n  - [📁 Upload Multiple Files](#-upload-multiple-files)\n  - [🧹 Clear Cache](#-clear-cache)\n  - [ℹ️ Notes](#️-notes)\n- [📂 Upload to Google Drive](#-upload-to-google-drive)\n\u003c!--\n  - [🧾 Prerequisites](#-prerequisites-for-google-drive)\n  - [📄 Upload Usage](#-google-drive-upload-usage) --\u003e\n\n- [📜 License](#-license)\n\n---\n\n### 👨‍💻 Author\n\n**Kasnef** – Developer \u0026 Creator of [kas-on-cloud](https://www.npmjs.com/package/kas-on-cloud)\n\n[![GitHub](https://img.shields.io/badge/GitHub-100000?style=for-the-badge\u0026logo=github\u0026logoColor=white)](https://github.com/kasnef)\n[![LinkedIn](https://img.shields.io/badge/LinkedIn-0077B5?style=for-the-badge\u0026logo=linkedin\u0026logoColor=white)](https://linkedin.com/in/kasnef)\n[![Telegram](https://img.shields.io/badge/Telegram-2CA5E0?style=for-the-badge\u0026logo=telegram\u0026logoColor=white)](https://t.me/kasnef)\n\n\u003e Passionate about backend systems, cloud automation, and building developer tools ⚙️  \n\u003e _“Code smart, not hard.”_ 💡\n\n---\n\n## 🔧 Installation\n\n```bash\nnpm install kas-on-cloud\n# or\nyarn add kas-on-cloud\n```\n\n---\n\n## ⚙️ Setup Instructions for SharePoint \u0026 Google Drive\n\n### 🟦 SharePoint Integration Guide\n\n#### Coming soon!\n\n---\n\n## ☁️ Upload to SharePoint\n\n### 🧾 Prerequisites\n\nTo use SharePoint upload, you need:\n\n- A valid OAuth 2.0 Access Token\n- Your tenant name (e.g., `mytenant`)\n- Site name (e.g., `mySite`)\n- Files to upload as `Buffer`\n\n---\n\n### ⚙️ generateMicrosoftAccessToken()\n\n\u003e Generates a Microsoft access token for authenticating with the Microsoft Graph API. This function also handles token caching and renewal for optimal performance.\n\n```ts\ngenerateMicrosoftAccessToken(\n  config: MicrosoftConfig,\n  isShowLog = false\n): Promise\u003cMicrosoftAccessTokenResponse\u003e\n```\n\n#### Parameters\n\n- **config (MicrosoftConfig)**: An object containing the necessary authentication credentials.\n  - _tenantId (string)_: The ID of your Azure Active Directory tenant.\n  - _clientId (string)_: The client ID of your registered application in Azure AD.\n  - _clientSecret (string)_: The client secret for the application.\n  - _scope (string, optional)_: The requested permission scope. Defaults to https://graph.microsoft.com/.default.\n  - _grantType (string, optional)_: The grant type. Defaults to client_credentials.\n- **isShowLog (boolean, optional)**: Set to true to display detailed logs during execution. Defaults to `false`.\n\n#### ✅ Example\n\n```ts\nimport { generateMicrosoftAccessToken } from \"kas-on-cloud\";\n\nconst config = {\n  tenantId: \"your-tenant-id\",\n  clientId: \"your-client-id\",\n  clientSecret: \"your-client-secret\",\n  scope: \"https://graph.microsoft.com/.default\",\n};\n\nconst tokenResponse = await generateMicrosoftAccessToken(config, true);\nconst accessToken = tokenResponse.accessToken;\n```\n\n#### ↪️ Response\n\n```JSON\n{\n  \"accessToken\": \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...\",\n  \"expiresIn\": 3599,\n  \"extExpiresIn\": 3599\n}\n```\n\n---\n\n### ♻️ renewMicrosoftToken()\n\n\u003e Refreshes an expired Microsoft access token automatically using client credentials.\n\n```ts\nimport { renewMicrosoftToken } from \"kas-on-cloud\";\n\nconst config = {\n  tenantId: \"your-tenant-id\",\n  clientId: \"your-client-id\",\n  clientSecret: \"your-client-secret\",\n  scope: \"https://graph.microsoft.com/.default\",\n};\n\nrenewMicrosoftToken(\n  config: MicrosoftConfig,\n  isShowLog = false\n  ): Promise\u003cMicrosoftAccessTokenResponse\u003e\n```\n\n#### Parameters\n\n- `config` (MicrosoftConfig): Contains Azure AD credentials.\n- `tenantId` (string): Azure Active Directory tenant ID.\n- `clientId` (string): Registered app’s client ID.\n- `clientSecret` (string): App’s client secret.\n- `isShowLog` (boolean, optional): Enable logs for debugging.\n\n#### ✅ Example\n\n```ts\nimport { renewMicrosoftToken } from \"kas-on-cloud\";\n\nconst newToken = await renewMicrosoftToken({\n  tenantId: \"your-tenant-id\",\n  clientId: \"your-client-id\",\n  clientSecret: \"your-client-secret\",\n});\nconsole.log(newToken.accessToken);\n```\n\n#### ↪️ Response\n\n```ts\n{\n  \"accessToken\": \"eyJ0eXAiOiJKV1QiLCJhbGciOi...\",\n  \"expiresIn\": 3599,\n  \"extExpiresIn\": 3599\n}\n```\n\n---\n\n### 🧭 getSiteId()\n\n\u003e Fetches the unique identifier for a SharePoint site based on the tenant and site names.\n\n```ts\ngetSiteId(\n  tenantName: string,\n  siteName: string,\n  accessToken: string,\n  isShowLog = false\n): Promise\u003cstring\u003e\n```\n\n#### Parameters\n\n- `tenantName` (string): Your SharePoint tenant name (e.g., `mytenant`).\n- `siteName` (string): The name of the SharePoint site (e.g., `mySite`).\n- `accessToken` (string): A valid OAuth 2.0 access token.\n- `isShowLog` (boolean, optional): Set to `true` to enable logging. Defaults to `false`.\n\n#### ✅ Example\n\n```ts\nimport { getSiteId } from \"kas-on-cloud\";\n\nconst siteId = await getSiteId(\"mytenant\", \"mysite\", accessToken, true);\nconsole.log(`Site ID: ${siteId}`);\n```\n\n#### ↪️ Response\n\n```JSON\n\"mytenant.sharepoint.com,xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx,xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\"\n```\n\n---\n\n### 🧭 getDriveIdFromSite()\n\n\u003e Fetches the default Drive ID (document library) for a given SharePoint site using its siteId.\n\n```ts\ngetDriveIdFromSite(\n  siteId: string,\n  accessToken: string\n): Promise\u003cstring\u003e\n```\n\n#### Parameters\n\n- `siteId` (string): The unique identifier of your SharePoint site. You can obtain it using getSiteId() beforehand.\n- `accessToken` (string): A valid OAuth 2.0 access token with Microsoft Graph permissions (e.g., Files.Read, Sites.Read.All).\n\n#### ✅ Example\n\n```ts\nimport { getDriveIdFromSite } from \"kas-on-cloud\";\n\nconst driveId = await getDriveIdFromSite(siteId, accessToken);\nconsole.log(`Drive ID: ${driveId}`);\n```\n\n#### ↪️ Response\n\n```JSON\n\"b!4U8mx5a9hEya7v8g3s-BYJfC3s1MbRNNt5jZcVMBaE8RjhUe7X3ylRbXeA8S\"\n```\n\n---\n\n### 🧭 getAllDrivesFromSite()\n\n\u003e Retrieves a list of all document libraries (drives) associated with a SharePoint site.\n\n```ts\ngetAllDrivesFromSite(\n  siteId: string,\n  accessToken: string\n): Promise\u003c\n  {\n    id: string;\n    name: string;\n    webUrl: string;\n  }[]\n\u003e\n```\n\n#### Parameters\n\n- `siteId` (string): The unique identifier of your SharePoint site. You can obtain it using getSiteId() beforehand.\n- `accessToken` (string): A valid OAuth 2.0 access token with Microsoft Graph permissions (e.g., Files.Read, Sites.Read.All).\n\n#### ✅ Example\n\n```ts\nimport { getAllDrivesFromSite } from \"kas-on-cloud\";\n\nconst drives = await getAllDrivesFromSite(siteId, accessToken);\nconsole.log(\"Available drives:\", drives);\n```\n\n#### ↪️ Response\n\n```JSON\n[\n  {\n    \"id\": \"b!9A7VJ9spkUeE1h6aaYZb9aRAxG01GzxJm_3uZsA3Sd3zD5yFvPp2PCbU4u7Hg\",\n    \"name\": \"Documents\",\n    \"webUrl\": \"https://mytenant.sharepoint.com/sites/mysite/Shared%20Documents\"\n  },\n  {\n    \"id\": \"b!kU4tsP8ghEeE9u8Zb5X2WqUB2b4KxAqLp9uX2PzNqEbZyY7x2Y4rJzK5Zs4RA\",\n    \"name\": \"Site Assets\",\n    \"webUrl\": \"https://mytenant.sharepoint.com/sites/mysite/SiteAssets\"\n  }\n]\n```\n\n---\n\n### 🗂 getDocumentLibraryId()\n\n\u003e Fetches the ID of the default document library for a given SharePoint site.\n\n```ts\ngetDocumentLibraryId(\n  tenantName: string,\n  siteName: string,\n  accessToken: string,\n  isShowLog = false\n): Promise\u003cstring\u003e\n```\n\n#### Parameters\n\n- `tenantName (string)`: The SharePoint tenant name.\n- `siteName (string)`: The name of the SharePoint site.\n- `accessToken (string)`: A valid OAuth 2.0 access token.\n- `isShowLog (boolean, optional)`: Set to true to enable logging. Defaults to `false`.\n\n#### ✅ Example\n\n```ts\nimport { getDocumentLibraryId } from \"kas-on-cloud\";\n\nconst libraryId = await getDocumentLibraryId(\n  \"mytenant\",\n  \"mysite\",\n  accessToken,\n  true,\n);\nconsole.log(`Document Library ID: ${libraryId}`);\n```\n\n#### ↪️ Response\n\n\u003e The function returns a string containing the document library ID.\n\n```code\n\"b!xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\"\n```\n\n---\n\n### 🔎 getItemListFromSharepoint()\n\n\u003e Lists all items from the SharePoint root or a specific document library.\n\n```Ts\ngetItemListFromSharepoint({\n  siteId: string,\n  accessToken: string,\n  isShowLog?: boolean,\n  driveId?: string,\n  isShorten?: boolean,\n}): Promise\u003cany[]\u003e\n```\n\n#### Parameters\n\n- `siteId (string):` The ID of the SharePoint site.\n- `accessToken (string)`: A valid OAuth 2.0 access token.\n- `isShowLog (boolean, optional)`: Set to true to enable logging. Defaults to `false`.\n- `driveId (string, optional)`: The ID of a specific document library (drive). If not provided, it queries the default library.\n- `isShorten (boolean, optional)`: Coming soon - intended to shorten the result list.\n\n#### ✅ Example\n\n```Ts\nimport { getItemListFromSharepoint } from \"kas-on-cloud\";\n\nconst items = await getItemListFromSharepoint({\n  siteId: \"mytenant.sharepoint.com,xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx,xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\",\n  accessToken: accessToken,\n  isShowLog: true,\n});\n```\n\n#### ↪️ Response\n\n\u003e An array of objects representing the items in the library.\n\n```JSON\n[\n  {\n    \"createdDateTime\": \"2025-01-01T12:00:00Z\",\n    \"id\": \"01...\",\n    \"lastModifiedDateTime\": \"2025-01-01T12:00:00Z\",\n    \"name\": \"MyFile.txt\",\n    \"webUrl\": \"https://mytenant.sharepoint.com/sites/mySite/Shared%20Documents/MyFile.txt\",\n    \"size\": 1024,\n    \"file\": {\n      \"mimeType\": \"text/plain\"\n    }\n  }\n]\n```\n\n---\n\n### 🧭 getItemByPathFromSharepoint()\n\n\u003e Retrieves a file or folder from SharePoint using its path instead of an ID.\n\n```ts\nimport { getItemByPathFromSharepoint } from \"kas-on-cloud\";\n\ngetItemByPathFromSharepoint({\n  siteId: string,\n  path: string,\n  accessToken: string,\n  isShowLog?: boolean,\n}): Promise\u003cany\u003e\n```\n\n#### Parameters\n\n- `siteId` (string): The SharePoint site ID.\n- `path` (string): The full item path (e.g., /Shared Documents/MyFolder/file.txt).\n- `accessToken` (string): A valid OAuth 2.0 access token.\n- `isShowLog` (boolean, optional): Enable logs for debugging.\n\n#### ✅ Example\n\n```ts\nimport { getItemByPathFromSharepoint } from \"kas-on-cloud\";\n\nconst item = await getItemByPathFromSharepoint({\n  siteId: \"your-site-id\",\n  path: \"/Shared Documents/Reports/Report.xlsx\",\n  accessToken,\n  isShowLog: true,\n});\n```\n\n#### ↪️ Response\n\n```ts\n{\n  \"id\": \"01...\",\n  \"name\": \"Report.xlsx\",\n  \"size\": 54231,\n  \"webUrl\": \"https://tenant.sharepoint.com/sites/mysite/Shared%20Documents/Reports/Report.xlsx\"\n}\n```\n\n---\n\n### 📂 getFolderChildrenFromSharepoint()\n\n\u003e Fetches all files and subfolders inside a given SharePoint folder.\n\n```ts\nimport { getFolderChildrenFromSharepoint } from \"kas-on-cloud\";\n\ngetFolderChildrenFromSharepoint({\n  siteId: string,\n  folderPath: string,\n  accessToken: string,\n  isShowLog?: boolean,\n}): Promise\u003cany[]\u003e\n```\n\n#### Parameters\n\n- `siteId` (string): The SharePoint site ID.\n- `folderPath` (string): The full item path (e.g., /Shared Documents/MyFolder/file.txt).\n- `accessToken` (string): A valid OAuth 2.0 access token.\n- `isShowLog` (boolean, optional): Enable logs for debugging.\n\n#### ✅ Example\n\n```ts\nimport { getFolderChildrenFromSharepoint } from \"kas-on-cloud\";\n\nconst children = await getFolderChildrenFromSharepoint({\n  siteId: \"your-site-id\",\n  folderPath: \"/Shared Documents/Reports\",\n  accessToken,\n});\n```\n\n#### ↪️ Response\n\n```ts\n[\n  {\n    id: \"01...\",\n    name: \"Annual.pdf\",\n    size: 20014,\n    webUrl:\n      \"https://tenant.sharepoint.com/sites/mysite/Shared%20Documents/Reports/Annual.pdf\",\n  },\n  {\n    id: \"02...\",\n    name: \"Q1\",\n    folder: {},\n  },\n];\n```\n\n---\n\n### 🧾 getItemByIdFromSharepoint()\n\n\u003e Retrieves detailed information about a specific item (file or folder) in a SharePoint document library by its unique ID.\n\n```ts\ngetItemByIdFromSharepoint({\n  siteId: string,\n  accessToken: string,\n  itemId: string,\n  driveId?: string,\n  isShowLog?: boolean,\n}): Promise\u003cany\u003e\n```\n\n#### Parameters\n\n- **siteId (string)**: The unique identifier of the SharePoint site.\n- **accessToken (string)**: A valid Microsoft Graph API OAuth 2.0 access token.\n- **itemId (string)**: The unique ID of the item (file or folder) to retrieve.\n- **driveId (string, optional)**: The document library (drive) ID containing the item. If not provided, defaults to the root drive.\n- **isShowLog (boolean, optional)**: Set to `true` to log detailed information to the console. Defaults to `false`.\n\n#### ✅ Example\n\n```ts\nimport { getItemByIdFromSharepoint } from \"kas-on-cloud\";\n\nconst item = await getItemByIdFromSharepoint({\n  siteId: \"mytenant.sharepoint.com,xxxx-xxxx-xxxx,xxxx-xxxx-xxxx\",\n  accessToken: accessToken,\n  itemId: \"01ABCDEFG12345\",\n  isShowLog: true,\n});\n\nconsole.log(\"Item info:\", item);\n```\n\n#### ↪️ Response\n\n\u003e Returns an object containing metadata and file/folder details.\n\n```json\n{\n  \"id\": \"01ABCDEFG12345\",\n  \"name\": \"ProjectReport.pdf\",\n  \"size\": 1048576,\n  \"webUrl\": \"https://mytenant.sharepoint.com/sites/mySite/Shared%20Documents/ProjectReport.pdf\",\n  \"downloadUrl\": \"https://public.sharepoint.com/...\",\n  \"lastModifiedDateTime\": \"2025-10-01T12:00:00Z\",\n  \"createdDateTime\": \"2025-09-29T15:30:00Z\",\n  \"file\": {\n    \"mimeType\": \"application/pdf\"\n  },\n  \"folder\": null\n}\n```\n\n---\n\n### 🔍 searchItemInSharepoint()\n\n\u003e Searches for items in a SharePoint site based on name or keyword.\n\n```ts\nimport { searchItemInSharepoint } from \"kas-on-cloud\";\n\nsearchItemInSharepoint({\n  siteId: string,\n  query: string,\n  accessToken: string,\n  isShowLog?: boolean,\n}): Promise\u003cany[]\u003e\n```\n\n#### Parameters\n\n- `siteId` (string): The SharePoint site ID.\n- `query` (string): The search query or keyword.\n- `accessToken` (string): A valid OAuth 2.0 access token.\n- `isShowLog` (boolean, optional): Enable logs for debugging.\n\n#### ✅ Example\n\n```ts\nimport { searchItemInSharepoint } from \"kas-on-cloud\";\n\nconst results = await searchItemInSharepoint({\n  siteId: \"your-site-id\",\n  query: \"invoice\",\n  accessToken,\n  isShowLog: true,\n});\n```\n\n#### ↪️ Response\n\n```ts\n[\n  {\n    id: \"01...\",\n    name: \"invoice_Jan.pdf\",\n    path: \"/Shared Documents/Billing\",\n    webUrl:\n      \"https://tenant.sharepoint.com/sites/mysite/Shared%20Documents/Billing/invoice_Jan.pdf\",\n  },\n];\n```\n\n---\n\n### 📥 downloadItemFromSharepoint()\n\n\u003e Downloads a SharePoint file and returns it as a Buffer. This method supports backend proxying so that clients can download files without requiring direct SharePoint access.\n\n```ts\nimport { downloadItemFromSharepoint } from \"kas-on-cloud\";\n\ndownloadItemFromSharepoint({\n  siteId: string,\n  itemId: string,\n  accessToken: string,\n  isShowLog?: boolean,\n}): Promise\u003c{ fileName: string; buffer: Buffer }\u003e\n```\n\n#### Parameters\n\n- `siteId` (string): The SharePoint site ID.\n- `itemId` (string): The unique ID of the file to download.\n- `accessToken` (string): A valid OAuth 2.0 access token.\n- `isShowLog` (boolean, optional): Enable logs for debugging.\n\n#### ✅ Example\n\n```ts\nimport { downloadItemFromSharepoint } from \"kas-on-cloud\";\n\nconst file = await downloadItemFromSharepoint({\n  siteId: \"your-site-id\",\n  itemId: \"01ABCDEFG\",\n  accessToken,\n});\n\n// Example BE proxy:\nres.setHeader('Content-Type', file.contentType);\nres.setHeader('Content-Disposition', file.contentDisposition);\nfile.stream.pipe(res);\n```\n\n#### ↪️ Response\n\n```ts\n{\n  stream: Readable {\n    _readableState: {\n      objectMode: false,\n      highWaterMark: 16384,\n      buffer: BufferList { head: null, tail: null, length: 0 },\n      length: 0,\n      pipes: null,\n      flowing: true,\n      ended: false,\n      endEmitted: false\n    },\n    readable: true,\n    _events: [Object: null prototype] { end: [Function: onend] },\n    _eventsCount: 1\n  },\n\n  fileName: \"Report_Q3_2025.xlsx\",\n  contentType: \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\",\n  contentDisposition: 'attachment; filename=\"Report_Q3_2025.xlsx\"',\n}\n```\n\n---\n\n### 📄 uploadToSharePoint()\n\n\u003e Uploads a single file to a SharePoint document library, with an option to specify a target folder.\n\n```ts\nuploadToSharePoint(\n  accessToken: string,\n  tenantName: string,\n  siteName: string,\n  fileName: string,\n  fileContent: Buffer,\n  isShowLog = false,\n  folderPath = \"\"\n): Promise\u003cstring\u003e\n```\n\n#### Parameters\n\n- `accessToken (string)`: A valid OAuth 2.0 access token.\n- `tenantName (string)`: The SharePoint tenant name.\n- `siteName (string)`: The SharePoint site name.\n- `fileName (string)`: The name for the file on SharePoint.\n- `fileContent (Buffer)`: The file content as a Buffer.\n- `isShowLog (boolean, optional)`: Set to true to enable logging. Defaults to `false`.\n- `folderPath (string, optional)`: The destination folder path on SharePoint (e.g., MyFolder/SubFolder)\n\n#### ✅ Example\n\n```ts\nimport { uploadToSharePoint } from \"kas-on-cloud\";\n\nconst sharepointUrl = await uploadToSharePoint(\n  accessToken,\n  \"mytenant\",\n  \"mySite\",\n  \"myFile.txt\",\n  Buffer.from(\"Hello, SharePoint!\"),\n  true, // show log (default: false)\n  \"MyFolder\", // folder path on sharepoint (optional)\n);\nconsole.log(`File uploaded to: ${sharepointUrl}`);\n```\n\n#### ↪️ Response\n\n\u003e The function returns a string containing the web URL of the uploaded file.\n\n````STRING\n\"https://mytenant.sharepoint.com/sites/mySite/Shared%20Documents/MyFolder/myFile.txt\"```\n````\n\n---\n\n### 📤 multiUploadToSharepoint()\n\n\u003e Uploads multiple files to a SharePoint document library simultaneously.\n\n```ts\nmultiUploadToSharepoint(\n  accessToken: string,\n  tenantName: string,\n  siteName: string,\n  files: FileUploadItem[],\n  isShowLog = false,\n  folderPath = \"\"\n): Promise\u003cany[]\u003e\n```\n\n#### Parameters\n\n- `accessToken (string)`: A valid OAuth 2.0 access token.\n- `tenantName (string)`: The SharePoint tenant name.\n- `siteName (string)`: The SharePoint site name.\n- `files (FileUploadItem[])`: An array of file objects, where each object contains fileName and fileContent.\n- `fileName (string)`: The name of the file.\n- `fileContent (Buffer)`: The file content.\n- `isShowLog (boolean, optional)`: Set to true to enable logging. Defaults to `false`.\n- `folderPath (string, optional)`: The destination folder path for all files.\n\n#### ✅ Example\n\n```ts\nimport { multiUploadToSharepoint } from \"kas-on-cloud\";\n\nconst files = [\n  { fileName: \"file1.txt\", fileContent: Buffer.from(\"File 1 content\") },\n  { fileName: \"file2.txt\", fileContent: Buffer.from(\"File 2 content\") },\n];\n\nconst results = await multiUploadToSharepoint(\n  accessToken,\n  \"mytenant\",\n  \"mySite\",\n  files,\n  true, // show log (default: false)\n  \"MyFolder/SubFolder\", // folder path on sharepoint (optional)\n);\nconsole.log(\"Upload results:\", results);\n```\n\n#### ↪️ Response\n\n\u003e An array of objects containing the details of each uploaded file.\n\n```JSON\n[\n  {\n    \"id\": \"01...\",\n    \"name\": \"file1.txt\",\n    \"webUrl\": \"https://mytenant.sharepoint.com/sites/mySite/Shared%20Documents/MyFolder/SubFolder/file1.txt\",\n    \"size\": 14\n  },\n  {\n    \"id\": \"02...\",\n    \"name\": \"file2.txt\",\n    \"webUrl\": \"https://mytenant.sharepoint.com/sites/mySite/Shared%20Documents/MyFolder/SubFolder/file2.txt\",\n    \"size\": 14\n  }\n]\n```\n\n---\n\n### 🧹 Clear Cache\n\n\u003e Clears the cached site and document library IDs. Useful when you need to fetch fresh data.\n\n```ts\nclearCache(): void\n```\n\n#### ✅ Example\n\n```Ts\nimport { clearCache } from \"kas-on-cloud\";\n\nclearCache(); // Clears cached site and library IDs\n```\n\n---\n\n### 📄 Notes\n\n- Requires Microsoft Graph API permissions\n\n- Handles caching automatically for performance\n\n- Logs output with `[kas-on-cloud]` prefix for traceability\n\n## 📂 Upload to Google Drive\n\n\u003e 🚧 _This feature is coming soon. We're actively working on Google Drive support!_\n\n\u003c!-- ---\n### 🧾 Prerequisites for Google Drive\nPlanned requirements:\n\n- OAuth 2.0 access token from Google\n- Google Drive API enabled\n- Proper scopes for file upload (`https://www.googleapis.com/auth/drive.file`)\n\n---\n\n### 📄 Google Drive Upload Usage\n\n```ts\n// Will be available in future release\nimport { uploadToGoogleDrive } from \"kas-on-cloud\";\n\nawait uploadToGoogleDrive({\n  accessToken: \"your-google-access-token\",\n  fileName: \"hello.txt\",\n  fileContent: Buffer.from(\"Hello Google Drive!\"),\n  folderId: \"optional-folder-id\",\n});\n```\n\n📢 _Stay tuned for upcoming updates and enhancements!_\n\n--- --\u003e\n\n## 📜 License\n\n![MIT](https://img.shields.io/badge/MIT-green?style=for-the-badge)\n\nThis project is licensed under the [MIT License](LICENSE).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkasnef%2Fkas-on-cloud","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fkasnef%2Fkas-on-cloud","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkasnef%2Fkas-on-cloud/lists"}