ForwardWidgets
Widgets for Douban and Trakt watchlists plus personalized recommendations, live TV streaming including PlutoTV, Yatu ra…
WebDAV, CALDAV, and CARDDAV client for js runtimes and the Browser
webdav request made easy
Browsers, Node.js (>= 18), Bun, Deno, and Cloudflare Workerscommonjs and esmnpm install tsdav
or
yarn add tsdav
tsdav works in Node.js (>= 18), browsers, Bun, Deno, and Cloudflare Workers.
See the runtime-specific usage docs for Bun, Deno, Cloudflare Workers, browser CORS notes, and custom fetch transports.
import { createDAVClient } from 'tsdav';
(async () => {
const client = await createDAVClient({
serverUrl: 'https://apidata.googleusercontent.com/caldav/v2/',
credentials: {
tokenUrl: 'https://accounts.google.com/o/oauth2/token',
username: 'YOUR_EMAIL_ADDRESS',
refreshToken: 'YOUR_REFRESH_TOKEN_WITH_CALDAV_PERMISSION',
clientId: 'YOUR_CLIENT_ID',
clientSecret: 'YOUR_CLIENT_SECRET',
},
authMethod: 'Oauth',
defaultAccountType: 'caldav',
});
const calendars = await client.fetchCalendars();
const calendarObjects = await client.fetchCalendarObjects({
calendar: calendars[0],
});
})();
import { createDAVClient } from 'tsdav';
(async () => {
const client = await createDAVClient({
serverUrl: 'https://contacts.icloud.com',
credentials: {
username: 'YOUR_APPLE_ID',
password: 'YOUR_APP_SPECIFIC_PASSWORD',
},
authMethod: 'Basic',
defaultAccountType: 'carddav',
});
const addressBooks = await client.fetchAddressBooks();
const vcards = await client.fetchVCards({
addressBook: addressBooks[0],
});
})();
After v1.1.0, you have a new way of creating clients.
import { DAVClient } from 'tsdav';
const client = new DAVClient({
serverUrl: 'https://apidata.googleusercontent.com/caldav/v2/',
credentials: {
tokenUrl: 'https://accounts.google.com/o/oauth2/token',
username: 'YOUR_EMAIL_ADDRESS',
refreshToken: 'YOUR_REFRESH_TOKEN_WITH_CALDAV_PERMISSION',
clientId: 'YOUR_CLIENT_ID',
clientSecret: 'YOUR_CLIENT_SECRET',
},
authMethod: 'Oauth',
defaultAccountType: 'caldav',
});
(async () => {
await client.login();
const calendars = await client.fetchCalendars();
const calendarObjects = await client.fetchCalendarObjects({
calendar: calendars[0],
});
})();
import { DAVClient } from 'tsdav';
const client = new DAVClient({
serverUrl: 'https://contacts.icloud.com',
credentials: {
username: 'YOUR_APPLE_ID',
password: 'YOUR_APP_SPECIFIC_PASSWORD',
},
authMethod: 'Basic',
defaultAccountType: 'carddav',
});
(async () => {
await client.login();
const addressBooks = await client.fetchAddressBooks();
const vcards = await client.fetchVCards({
addressBook: addressBooks[0],
});
})();
Check out the Documentation
refers to Changelog
this package uses debug package,
add tsdav:* to DEBUG env variable to enable debug logs
Yes, if your Nextcloud instance is configured to support it (e.g., via the user_oidc app), you can use authMethod: 'Bearer':
const client = new DAVClient({
serverUrl: 'https://<your-nextcloud-host>/remote.php/dav',
credentials: {
accessToken: 'YOUR_OIDC_ACCESS_TOKEN',
},
authMethod: 'Bearer',
defaultAccountType: 'caldav',
});
Note: Some Nextcloud configurations may still require Basic auth (username + app password) for DAV endpoints if OIDC is not fully integrated with the DAV subsystem.
more like this
Widgets for Douban and Trakt watchlists plus personalized recommendations, live TV streaming including PlutoTV, Yatu ra…
A lightweight, simplified, RedNotebook-inspired journal/diary app. Built with Electron. Makes dated text files.
A web-component to add code editors to your web page powered via Ace Editor
View and plan your life in an online calendar by visually by seeing it from days to decades
search projects, people, and tags