OneDrive

OneDrive and SharePoint document libraries via Microsoft Graph. Path-addressable, no virtual-key bookkeeping.

Installation

@azure/identity and @microsoft/microsoft-graph-client are optional peer dependencies of files-sdk - install alongside the SDK so the adapter's imports resolve at runtime.

npm install files-sdk @azure/identity @microsoft/microsoft-graph-client

Usage

OneDrive and SharePoint document libraries via the official @microsoft/microsoft-graph-client SDK. Microsoft Graph is path-addressable (/drive/root:/folder/file.txt), so the adapter maps virtual keys onto real OneDrive paths - no virtual-key cache, no fsdkKey bookkeeping. Five auth shapes (app-only, OAuth refresh token, raw access token, pre-built Graph client, or env-var fallback) and four drive targets (/me/drive, driveId, siteId, userId) cover the personal-OneDrive, OneDrive-for-Business, and SharePoint-site-library cases.

import { Files } from "files-sdk";
import { onedrive } from "files-sdk/onedrive";

// App-only auth (client credentials) into a SharePoint site library.
// Cannot use /me/drive - pass driveId, siteId, or userId instead.
const files = new Files({
  adapter: onedrive({
    clientCredentials: {
      tenantId: process.env.ONEDRIVE_TENANT_ID!,
      clientId: process.env.ONEDRIVE_CLIENT_ID!,
      clientSecret: process.env.ONEDRIVE_CLIENT_SECRET!,
    },
    siteId: process.env.ONEDRIVE_SITE_ID!,
    rootFolderPath: "Uploads",
    // publicByDefault: true → upload() also creates an anonymous-view
    //                       sharing link and url() returns its webUrl.
  }),
});

Options

Prop

Type

Compatibility

MethodStatusNotes
upload⚠️Single-PUT simple upload up to OneDrive's 250 MB limit; larger bodies (or any multipart upload) automatically switch to a chunked Graph upload session. multipart.partSize tunes the chunk size (rounded to a 320 KiB multiple). User metadata and cacheControl throw - Graph drive items have no native arbitrary-metadata field; use raw to set Open Extensions if you need them.
download
delete
list⚠️Returns immediate-children files only at rootFolderPath - no recursion, and subfolders are filtered out. prefix is filename-prefix only (matched client-side within the page). Pagination uses Graph's @odata.nextLink as the opaque cursor.
search⚠️Built on listAll — inherits this adapter's list behavior above. Client-side key match (glob, regex, substring, exact).
head
exists
copy⚠️Async copy on Graph (POST /items/{id}/copy returns 202 + monitor URL). The adapter polls the monitor every 500 ms until status is completed/failed, capped by copyTimeoutMs (default 60_000). On timeout the call throws Provider; tune copyTimeoutMs for large files.
url⚠️Throws by default - Graph has no signed URL primitive. With publicByDefault: true at construction, upload() calls createLink (anonymous-view scope) and url() returns the share link's webUrl. The link is permanent (expiresIn ignored) and responseContentDisposition always throws - Graph has no Content-Disposition override. Anonymous links are blocked on tenants where admins disable them.
signedUploadUrl⚠️Initiates a Graph upload session via POST /createUploadSession and returns the session URL as a one-shot PUT (the session URL is pre-authenticated by Graph itself). maxSize and minSize throw because Graph does not enforce a server-side content-length-range policy on upload sessions; enforce size limits at your application gateway instead.

On this page