@jimmybjorklund/sharepoint-api 1.0.1

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.
package/LICENSE.md ADDED
@@ -0,0 +1,11 @@
1
+ The MIT License (MIT)
2
+ =====================
3
+
4
+ Copyright (c) 2024 sharepoint-client contributors
5
+ ----------------------------------------------
6
+
7
+ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
8
+
9
+ The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
10
+
11
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,129 @@
1
+ sharepoint-api
2
+ ====
3
+
4
+ [![NPM](https://nodei.co/npm/@jimmybjorklund/sharepoint-api.png)](https://nodei.co/npm/@jimmybjorklund/sharepoint-api/)
5
+
6
+ ## Introduction
7
+ This client makes it easier to upload/download and list files on your Microsoft SharePoint account.
8
+
9
+ It uses the Microsoft Graph api to handle the communication and you need to create an
10
+ client access token for this api for this library to work.
11
+
12
+ ## Installation
13
+
14
+ ```
15
+ $ npm install @jimmybjorklund/sharepoint-client
16
+ ```
17
+
18
+ ## Create access.
19
+
20
+ ### 1. First we need to create a app that is allowed to access the files.
21
+
22
+ Navigate to: https://entra.microsoft.com/
23
+
24
+ Once you have logged in navigate in the menu.
25
+
26
+ Application->App registrations.
27
+
28
+ On this page select
29
+
30
+ + New registration.
31
+
32
+ Give the integration app a good name and select single tenant and press Register.
33
+
34
+ You should now be presented with the Application overview, on this page search for
35
+ Application (client) ID <b>save this id for later as clientId.</b>
36
+
37
+ On this page you should also be able to find the Directory (tenant) ID, <b>save this as
38
+ tenantId for later.</b>
39
+
40
+
41
+ ### 2. Create a client secret this is done by navigating to Certificates & secrets under you app view.
42
+
43
+ On this page click
44
+
45
+ + New client secret
46
+
47
+ Enter a good description and max lifetime of you tokens and press Add.
48
+
49
+ In the list of secrets you should now see the Value of your secret key, <b>save this into
50
+ a variable called clientSecret.</b> NOTE: Do this directly as it will only be visible once.
51
+ If you fail to do this you can remove it an recreated it to se a new value.
52
+
53
+ ### 3. Setup Api permissions by going to API permissions.
54
+
55
+ On this page click.
56
+
57
+ + Add a permission
58
+
59
+ You should select the api that say <b>Microsoft Graph.</b>
60
+ You will be presented with two options delegated access or application.
61
+ <b>Select application permissions.</b>
62
+
63
+ You need to select:
64
+
65
+ Directory.ReadWrite.All
66
+ Files.ReadWrite.All
67
+
68
+ ### Congratulations
69
+ You should now have a clientId and secret that will give you access.
70
+
71
+
72
+
73
+ ## Sample
74
+ This is a simple example of how to use the Microsoft Graph API to upload a file to a SharePoint site.
75
+
76
+ ```ts
77
+ //This is the name of the tenant in SharePoint, normally first part of the url.
78
+ //sample: myName.sharepoint.com
79
+ const tenantName: "myName";
80
+ // From App Overview page.
81
+ const tenantId: "00000000-0000-0000-0000-000000000000";
82
+
83
+ // This is the name of the site (group in teams) in SharePoint.
84
+ const siteName: "MyGroup";
85
+
86
+ // This is the id and secret of the app you created in Azure AD.
87
+ const clientId: "00000000-0000-0000-0000-000000000000";
88
+ const clientSecret: "0000000000000000000000000000000000000000";
89
+
90
+ const client = new SharepointApi({
91
+ tenantId,
92
+ tenantName,
93
+ siteName,
94
+ clientId,
95
+ clientSecret
96
+ });
97
+ // Get a Azure AD login token.
98
+ const token = await client.login();
99
+ if (token === undefined) {
100
+ console.log("Error getting token");
101
+ return;
102
+ }
103
+
104
+ // Fetch the site to get the siteId.
105
+ const site = await azure.getSite(token);
106
+ if (site === undefined) {
107
+ console.log("Error getting site");
108
+ return;
109
+ }
110
+ const siteId = client.getSiteId(site);
111
+ const driveName = "Dokument"; // Folder name in SharePoint.
112
+
113
+ // Get the driver to find the correct driverId.
114
+ const driver = await client.getDrive(token, siteId, driveName);
115
+ if (driver === undefined) {
116
+ console.log("Error getting drive");
117
+ return;
118
+ }
119
+
120
+ const path = "/TestUploadFiles";
121
+ const fileName = "test.txt";
122
+ // Upload files.
123
+ const res = await client.upload(token, driver.id, path, fileName, "text/plain");
124
+ console.log("Upload response", res);
125
+ ```
126
+
127
+ ## LICENSE
128
+
129
+ MIT, see LICENSE.md file.
package/dist/index.js ADDED
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SharepointApi = void 0;
4
+ const sharepoint_api_1 = require("./sharepoint-api");
5
+ Object.defineProperty(exports, "SharepointApi", { enumerable: true, get: function () { return sharepoint_api_1.SharepointApi; } });
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,qDAAiD;AACxC,8FADA,8BAAa,OACA"}
@@ -0,0 +1,195 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SharepointApi = void 0;
4
+ const axios_1 = require("axios");
5
+ const qs = require("qs");
6
+ class SharepointApi {
7
+ tenantId;
8
+ tenantName;
9
+ siteName;
10
+ clientId;
11
+ clientSecret;
12
+ constructor(config) {
13
+ this.tenantId = config.tenantId;
14
+ this.tenantName = config.tenantName;
15
+ this.siteName = config.siteName;
16
+ this.clientId = config.clientId;
17
+ this.clientSecret = config.clientSecret;
18
+ }
19
+ /**
20
+ * Get a token from Azure AD.
21
+ * @returns The token or undefined if an error occurred.
22
+ */
23
+ login = async () => {
24
+ const tokenEndpoint = `https://login.microsoftonline.com/${this.tenantId}/oauth2/v2.0/token`;
25
+ const options = {
26
+ headers: {
27
+ "Content-Type": `application/x-www-form-urlencoded`,
28
+ },
29
+ };
30
+ const data = qs.stringify({
31
+ grant_type: "client_credentials",
32
+ client_id: this.clientId,
33
+ client_secret: this.clientSecret,
34
+ scope: "https://graph.microsoft.com/.default",
35
+ });
36
+ const tokenResponse = await axios_1.default
37
+ .post(tokenEndpoint, data, options)
38
+ .then((response) => {
39
+ if (response.status !== 200) {
40
+ console.log("Error getting token", response);
41
+ return undefined;
42
+ }
43
+ return response.data;
44
+ })
45
+ .catch((error) => {
46
+ console.log("Error getting token", error);
47
+ return undefined;
48
+ });
49
+ return tokenResponse;
50
+ };
51
+ /**
52
+ * Get a specific site from SharePoint.
53
+ * @param token - The token from the login method.
54
+ * @returns The site or undefined if an error occurred.
55
+ */
56
+ getSite = async (token) => {
57
+ const url = `https://graph.microsoft.com/v1.0/sites/${this.tenantName}.sharepoint.com:/sites/${this.siteName}`;
58
+ const options = {
59
+ headers: {
60
+ Authorization: `Bearer ${token.access_token}`,
61
+ },
62
+ };
63
+ return axios_1.default
64
+ .get(url, options)
65
+ .then((response) => {
66
+ return response.data;
67
+ })
68
+ .catch((error) => {
69
+ console.log("Error getting site", error);
70
+ });
71
+ };
72
+ /**
73
+ * Get all drives in a site.
74
+ * @param token - The token from the login method.
75
+ * @param siteId - The id of the site.
76
+ * @returns The drives or undefined if an error occurred.
77
+ */
78
+ getDrives = async (token, siteId) => {
79
+ const url = `https://graph.microsoft.com/v1.0/sites/${siteId}/Drives`;
80
+ const options = {
81
+ headers: {
82
+ Authorization: `Bearer ${token.access_token}`,
83
+ },
84
+ };
85
+ return axios_1.default
86
+ .get(url, options)
87
+ .then((response) => {
88
+ return response.data?.value;
89
+ })
90
+ .catch((error) => {
91
+ console.log("Error getting drives", error);
92
+ });
93
+ };
94
+ /**
95
+ * Get a specific drive from a site.
96
+ * @param token - The token from the login method.
97
+ * @param siteId - The id of the site.
98
+ * @param driveName - The name of the drive to get.
99
+ * @returns The drive or undefined if an error occurred.
100
+ */
101
+ getDrive = async (token, siteId, driveName) => {
102
+ const drives = await this.getDrives(token, siteId);
103
+ if (drives === undefined) {
104
+ console.log("Error getting drives");
105
+ return undefined;
106
+ }
107
+ const driver = drives.find((drive) => {
108
+ return drive.name === driveName;
109
+ });
110
+ return driver;
111
+ };
112
+ /**
113
+ * Get items (files, directories etc) in a drive.
114
+ * @param token - The token from the login method.
115
+ * @param driverId - The id of the drive to get items from.
116
+ * @param path - The path to the items in from.
117
+ * @returns The items or undefined if an error occurred.
118
+ */
119
+ getItems = async (token, driverId, path) => {
120
+ const url = `https://graph.microsoft.com/v1.0/Drives/${driverId}/root:/${path}:/Children.`;
121
+ const options = {
122
+ headers: {
123
+ Authorization: `Bearer ${token.access_token}`,
124
+ },
125
+ };
126
+ return axios_1.default
127
+ .get(url, options)
128
+ .then((response) => {
129
+ return response.data?.value;
130
+ })
131
+ .catch((error) => {
132
+ console.log("Error getting items", error);
133
+ return undefined;
134
+ });
135
+ };
136
+ /**
137
+ * Download a file from a SharePoint site.
138
+ * @param token - The token from the login method.
139
+ * @param driverId - The id of the drive to download from.
140
+ * @param path - The path to the file in the drive.
141
+ * @returns The file content or undefined if an error occurred.
142
+ */
143
+ downloadItem = async (token, driverId, path) => {
144
+ const url = `https://graph.microsoft.com/v1.0/Drives/${driverId}/root:/${path}:/content`;
145
+ const options = {
146
+ headers: {
147
+ Authorization: `Bearer ${token.access_token}`,
148
+ },
149
+ };
150
+ return axios_1.default
151
+ .get(url, options)
152
+ .then((response) => {
153
+ return response.data;
154
+ })
155
+ .catch((error) => {
156
+ console.log("Error getting item", error);
157
+ return undefined;
158
+ });
159
+ };
160
+ /**
161
+ * Upload or update a file in a SharePoint site.
162
+ * @param token - The token from the login method.
163
+ * @param driverId - The id of the drive to upload to.
164
+ * @param path - The path to the file in the drive.
165
+ * @param fileName - The name of the target file.
166
+ * @param contentType - The content type of the file.
167
+ * @param data - The file content as a buffer.
168
+ * @returns The uploaded item or undefined if an error occurred.
169
+ */
170
+ upload = async (token, driverId, path, fileName, contentType, data) => {
171
+ const url = `https://graph.microsoft.com/v1.0//drives/${driverId}/root:${path}/${fileName}:/content`;
172
+ const options = {
173
+ headers: {
174
+ "Content-Type": contentType,
175
+ Authorization: `Bearer ${token.access_token}`,
176
+ },
177
+ };
178
+ //const binaryContent = new Blob(["Hello, World!"], { type: contentType });
179
+ return axios_1.default
180
+ .put(url, data, options)
181
+ .then((response) => {
182
+ console.log("Upload response", response.status, response.statusText);
183
+ return response.data;
184
+ })
185
+ .catch((error) => {
186
+ console.log("Error uploading", error.response);
187
+ return undefined;
188
+ });
189
+ };
190
+ getSiteId = (site) => {
191
+ return site.id.split(",")[1];
192
+ };
193
+ }
194
+ exports.SharepointApi = SharepointApi;
195
+ //# sourceMappingURL=sharepoint-api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sharepoint-api.js","sourceRoot":"","sources":["../src/sharepoint-api.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,42 @@
1
+ {
2
+ "name": "@jimmybjorklund/sharepoint-api",
3
+ "version": "1.0.1",
4
+ "description": "Lets you easily access and update files on sharepoint",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.js",
7
+ "prepublish": "npm run build",
8
+ "scripts": {
9
+ "build": "tsc -b",
10
+ "start": "ts-node tests/index.ts",
11
+ "prettier": "prettier --write src/"
12
+ },
13
+ "author": "Jimmy Björklund",
14
+ "license": "MIT",
15
+ "dependencies": {
16
+ "axios": "^1.6.7",
17
+ "qs": "^6.11.2"
18
+ },
19
+ "devDependencies": {
20
+ "@types/node": "^20.11.16",
21
+ "@types/qs": "^6.9.11",
22
+ "prettier": "^3.2.5",
23
+ "ts-node": "^10.9.1",
24
+ "typescript": "^4.9.4"
25
+ },
26
+ "repository": {
27
+ "type": "git",
28
+ "url": "git+https://github.com/JimmyBjorklund/sharepoint-api.git"
29
+ },
30
+ "engines": {
31
+ "node": ">=18"
32
+ },
33
+ "files": [
34
+ "dist"
35
+ ],
36
+ "keywords": [
37
+ "sharepoint",
38
+ "sharepoint-api",
39
+ "azure",
40
+ "office365"
41
+ ]
42
+ }