{"id":18883439,"url":"https://github.com/natelindev/tsdav","last_synced_at":"2025-05-15T01:06:07.183Z","repository":{"id":39895137,"uuid":"315277100","full_name":"natelindev/tsdav","owner":"natelindev","description":"WebDAV, CALDAV, and CARDDAV client for Nodejs and the Browser","archived":false,"fork":false,"pushed_at":"2025-05-12T18:52:04.000Z","size":2878,"stargazers_count":277,"open_issues_count":23,"forks_count":45,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-05-12T19:53:55.249Z","etag":null,"topics":["addressbook","browser","caldav","calendar","calendars","carddav","contact","contacts","dav","ical","nodejs","sync","typescript","vcard","webdav"],"latest_commit_sha":null,"homepage":"https://tsdav.vercel.app","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/natelindev.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","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":"2020-11-23T10:21:14.000Z","updated_at":"2025-04-27T10:43:29.000Z","dependencies_parsed_at":"2023-02-10T02:16:16.172Z","dependency_job_id":"e112cdc0-81d8-404b-b42c-21b32a404687","html_url":"https://github.com/natelindev/tsdav","commit_stats":{"total_commits":150,"total_committers":8,"mean_commits":18.75,"dds":"0.42000000000000004","last_synced_commit":"0526d4a3f3e17b07cc88f79e7f7bdc25e9c32a34"},"previous_names":[],"tags_count":27,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/natelindev%2Ftsdav","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/natelindev%2Ftsdav/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/natelindev%2Ftsdav/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/natelindev%2Ftsdav/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/natelindev","download_url":"https://codeload.github.com/natelindev/tsdav/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254254040,"owners_count":22039792,"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","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":["addressbook","browser","caldav","calendar","calendars","carddav","contact","contacts","dav","ical","nodejs","sync","typescript","vcard","webdav"],"created_at":"2024-11-08T07:02:06.886Z","updated_at":"2025-05-15T01:06:07.169Z","avatar_url":"https://github.com/natelindev.png","language":"TypeScript","readme":"\u003cp align=\"center\"\u003e\n  \u003cimg width=\"300\" height=\"200\" src=\"https://github.com/natelindev/tsdav/blob/master/docs/static/img/logo.svg\"\u003e\n\u003c/p\u003e\n\u003cp align=\"center\"\u003e\nwebdav request made easy\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://bundlephobia.com/result?p=tsdav\"\u003e\n    \u003cimg alt=\"Bundlephobia\" src=\"https://img.shields.io/bundlephobia/minzip/tsdav?style=for-the-badge\u0026labelColor=24292e\"\u003e\n  \u003c/a\u003e\n  \u003ca aria-label=\"Types\" href=\"https://www.npmjs.com/package/tsdav\"\u003e\n    \u003cimg alt=\"Types\" src=\"https://img.shields.io/npm/types/tsdav?style=for-the-badge\u0026labelColor=24292e\"\u003e\n  \u003c/a\u003e\n  \u003ca aria-label=\"NPM version\" href=\"https://www.npmjs.com/package/tsdav\"\u003e\n    \u003cimg alt=\"NPM Version\" src=\"https://img.shields.io/npm/v/tsdav?style=for-the-badge\u0026labelColor=24292e\"\u003e\n  \u003c/a\u003e\n  \u003ca aria-label=\"License\" href=\"https://github.com/natelindev/tsdav/blob/master/LICENSE\"\u003e\n    \u003cimg alt=\"MIT License\" src=\"https://img.shields.io/npm/l/tsdav?style=for-the-badge\u0026labelColor=24292e\"\u003e\n  \u003c/a\u003e\n\u003c/p\u003e\n\n### Features\n\n- Easy to use, well documented JSON based WEBDAV API\n- Works in both `Browsers` and `Node.js`\n- Supports Both `commonjs` and `esm`\n- OAuth2 \u0026 basic auth helpers built-in\n- Native typescript, fully linted and well tested\n- Supports WEBDAV, CALDAV, CARDDAV\n- Tested with multiple cloud providers\n\n### Install\n\n```bash\nnpm install tsdav\n```\n\nor\n\n```bash\nyarn add tsdav\n```\n\n### Quickstart\n\n##### Google CALDAV\n\n```ts\nimport { createDAVClient } from 'tsdav';\n\n(async () =\u003e {\n  const client = await createDAVClient({\n    serverUrl: 'https://apidata.googleusercontent.com/caldav/v2/',\n    credentials: {\n      tokenUrl: 'https://accounts.google.com/o/oauth2/token',\n      username: 'YOUR_EMAIL_ADDRESS',\n      refreshToken: 'YOUR_REFRESH_TOKEN_WITH_CALDAV_PERMISSION',\n      clientId: 'YOUR_CLIENT_ID',\n      clientSecret: 'YOUR_CLIENT_SECRET',\n    },\n    authMethod: 'Oauth',\n    defaultAccountType: 'caldav',\n  });\n\n  const calendars = await client.fetchCalendars();\n\n  const calendarObjects = await client.fetchCalendarObjects({\n    calendar: calendars[0],\n  });\n})();\n```\n\n##### Apple CARDDAV\n\n```ts\nimport { createDAVClient } from 'tsdav';\n\n(async () =\u003e {\n  const client = await createDAVClient({\n    serverUrl: 'https://contacts.icloud.com',\n    credentials: {\n      username: 'YOUR_APPLE_ID',\n      password: 'YOUR_APP_SPECIFIC_PASSWORD',\n    },\n    authMethod: 'Basic',\n    defaultAccountType: 'carddav',\n  });\n\n  const addressBooks = await client.fetchAddressBooks();\n\n  const vcards = await client.fetchVCards({\n    addressBook: addressBooks[0],\n  });\n})();\n```\n\nAfter `v1.1.0`, you have a new way of creating clients.\n\n##### Google CALDAV\n\n```ts\nimport { DAVClient } from 'tsdav';\n\nconst client = new DAVClient({\n  serverUrl: 'https://apidata.googleusercontent.com/caldav/v2/',\n  credentials: {\n    tokenUrl: 'https://accounts.google.com/o/oauth2/token',\n    username: 'YOUR_EMAIL_ADDRESS',\n    refreshToken: 'YOUR_REFRESH_TOKEN_WITH_CALDAV_PERMISSION',\n    clientId: 'YOUR_CLIENT_ID',\n    clientSecret: 'YOUR_CLIENT_SECRET',\n  },\n  authMethod: 'Oauth',\n  defaultAccountType: 'caldav',\n});\n\n(async () =\u003e {\n  await client.login();\n\n  const calendars = await client.fetchCalendars();\n\n  const calendarObjects = await client.fetchCalendarObjects({\n    calendar: calendars[0],\n  });\n})();\n```\n\n##### Apple CARDDAV\n\n```ts\nimport { DAVClient } from 'tsdav';\n\nconst client = new DAVClient({\n  serverUrl: 'https://contacts.icloud.com',\n  credentials: {\n    username: 'YOUR_APPLE_ID',\n    password: 'YOUR_APP_SPECIFIC_PASSWORD',\n  },\n  authMethod: 'Basic',\n  defaultAccountType: 'carddav',\n});\n\n(async () =\u003e {\n  await client.login();\n\n  const addressBooks = await client.fetchAddressBooks();\n\n  const vcards = await client.fetchVCards({\n    addressBook: addressBooks[0],\n  });\n})();\n```\n\n### Documentation\n\nCheck out the [Documentation](https://tsdav.vercel.app/)\n\n### License\n\n[MIT](https://github.com/natelindev/tsdav/blob/master/LICENSE)\n\n### Changelog\n\nrefers to [Changelog](./CHANGELOG.md)\n\n### Debugging\n\nthis package uses `debug` package,\nadd `tsdav:*` to `DEBUG` env variable to enable debug logs\n","funding_links":[],"categories":["TypeScript"],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnatelindev%2Ftsdav","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnatelindev%2Ftsdav","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnatelindev%2Ftsdav/lists"}