microsoft-graph 1.0.0

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.
Files changed (151) hide show
  1. package/.editorconfig +18 -0
  2. package/.gitattributes +46 -0
  3. package/.vscode/extensions.json +3 -0
  4. package/.vscode/launch.json +15 -0
  5. package/.vscode/settings.json +15 -0
  6. package/CONTRIBUTING.md +2 -0
  7. package/LICENCE.md +360 -0
  8. package/README.md +52 -0
  9. package/biome.jsonc +83 -0
  10. package/dist/errors/BadTemplateError.js +6 -0
  11. package/dist/errors/EnvironmentVariableMissingError.js +6 -0
  12. package/dist/errors/InvalidArgumentError.js +21 -0
  13. package/dist/errors/ProtocolError.js +11 -0
  14. package/dist/errors/RequestFailedError.js +21 -0
  15. package/dist/graphApi.js +116 -0
  16. package/dist/index.js +2 -0
  17. package/dist/models/AccessToken.js +1 -0
  18. package/dist/models/DriveId.js +1 -0
  19. package/dist/models/DriveItemId.js +1 -0
  20. package/dist/models/DriveItemPath.js +1 -0
  21. package/dist/models/DriveItemRef.js +1 -0
  22. package/dist/models/DriveRef.js +1 -0
  23. package/dist/models/GraphOperation.js +1 -0
  24. package/dist/models/GraphOperationDefinition.js +1 -0
  25. package/dist/models/HostName.js +1 -0
  26. package/dist/models/Scope.js +1 -0
  27. package/dist/models/SiteId.js +1 -0
  28. package/dist/models/SiteName.js +1 -0
  29. package/dist/models/SiteRef.js +1 -0
  30. package/dist/models/WorkbookNamedRangeRef.js +1 -0
  31. package/dist/models/WorkbookRangeAddress.js +1 -0
  32. package/dist/models/WorkbookRangeName.js +1 -0
  33. package/dist/models/WorkbookRangeRef.js +1 -0
  34. package/dist/models/WorkbookRef.js +1 -0
  35. package/dist/models/WorkbookSessionId.js +1 -0
  36. package/dist/models/WorkbookTableId.js +1 -0
  37. package/dist/models/WorkbookTableRef.js +1 -0
  38. package/dist/models/WorkbookWorksheetId.js +1 -0
  39. package/dist/models/WorkbookWorksheetName.js +1 -0
  40. package/dist/models/WorkbookWorksheetRef.js +1 -0
  41. package/dist/operations/drive/createFolder.js +27 -0
  42. package/dist/operations/drive/createFolder.test.js +31 -0
  43. package/dist/operations/drive/listDrives.js +23 -0
  44. package/dist/operations/drive/listDrives.test.js +9 -0
  45. package/dist/operations/driveItem/copyDriveItem.js +21 -0
  46. package/dist/operations/driveItem/copyDriveItem.test.js +28 -0
  47. package/dist/operations/driveItem/deleteDriveItem.js +12 -0
  48. package/dist/operations/driveItem/deleteDriveItem.test.js +22 -0
  49. package/dist/operations/driveItem/getDriveItem.js +18 -0
  50. package/dist/operations/driveItem/getDriveItem.test.js +24 -0
  51. package/dist/operations/driveItem/getDriveItemByPath.js +20 -0
  52. package/dist/operations/driveItem/getDriveItemByPath.test.js +22 -0
  53. package/dist/operations/driveItem/getDriveItemContent.js +22 -0
  54. package/dist/operations/driveItem/getDriveItemContent.test.js +37 -0
  55. package/dist/operations/driveItem/listDriveItems.js +25 -0
  56. package/dist/operations/driveItem/listDriveItems.test.js +24 -0
  57. package/dist/operations/site/getSite.js +18 -0
  58. package/dist/operations/site/getSite.test.js +15 -0
  59. package/dist/operations/site/getSiteByName.js +20 -0
  60. package/dist/operations/site/getSiteByName.test.js +20 -0
  61. package/dist/operations/site/listSites.js +23 -0
  62. package/dist/operations/site/listSites.test.js +10 -0
  63. package/dist/operations/site/searchSites.js +23 -0
  64. package/dist/operations/site/searchSites.test.js +21 -0
  65. package/dist/operations/workbook/calculateWorkbook.js +20 -0
  66. package/dist/operations/workbook/calculateWorkbook.test.js +46 -0
  67. package/dist/operations/workbook/createWorkbook.js +26 -0
  68. package/dist/operations/workbook/createWorkbook.test.js +15 -0
  69. package/dist/operations/workbook/deleteWorkbook.js +5 -0
  70. package/dist/operations/workbookRange/clearWorkbookRange.js +17 -0
  71. package/dist/operations/workbookRange/clearWorkbookRange.test.js +56 -0
  72. package/dist/operations/workbookRange/deleteWorkbookRange.js +17 -0
  73. package/dist/operations/workbookRange/deleteWorkbookRange.test.js +56 -0
  74. package/dist/operations/workbookRange/getWorkbookNamedRange.js +20 -0
  75. package/dist/operations/workbookRange/getWorkbookUsedRange.js +22 -0
  76. package/dist/operations/workbookRange/getWorkbookUsedRange.test.js +54 -0
  77. package/dist/operations/workbookRange/getWorkbookVisibleRange.js +20 -0
  78. package/dist/operations/workbookRange/getWorkbookVisibleRange.test.js +109 -0
  79. package/dist/operations/workbookRange/insertWorkbookCells.js +25 -0
  80. package/dist/operations/workbookRange/insertWorkbookCells.test.js +41 -0
  81. package/dist/operations/workbookRange/updateWorkbookNamedRange.js +15 -0
  82. package/dist/operations/workbookRange/updateWorkbookRange.js +21 -0
  83. package/dist/operations/workbookRange/updateWorkbookRange.test.js +54 -0
  84. package/dist/operations/workbookSession/closeWorkbookSession.js +18 -0
  85. package/dist/operations/workbookSession/createWorkbookSession.js +22 -0
  86. package/dist/operations/workbookSession/refreshWorkbookSession.js +19 -0
  87. package/dist/operations/workbookTable/createWorkbookTable.js +26 -0
  88. package/dist/operations/workbookTable/createWorkbookTable.test.js +25 -0
  89. package/dist/operations/workbookTable/getWorkbookTable.js +20 -0
  90. package/dist/operations/workbookTable/getWorkbookTable.test.js +30 -0
  91. package/dist/operations/workbookTable/getWorkbookTableBodyRange.js +22 -0
  92. package/dist/operations/workbookTable/getWorkbookTableBodyRange.test.js +45 -0
  93. package/dist/operations/workbookTable/getWorkbookTableHeaderRange.js +22 -0
  94. package/dist/operations/workbookTable/getWorkbookTableHeaderRange.test.js +41 -0
  95. package/dist/operations/workbookTable/listWorkbookTableColumns.js +17 -0
  96. package/dist/operations/workbookTable/listWorkbookTableColumns.test.js +29 -0
  97. package/dist/operations/workbookTable/listWorkbookTableRows.js +17 -0
  98. package/dist/operations/workbookTable/listWorkbookTableRows.test.js +29 -0
  99. package/dist/operations/workbookTable/listWorkbookTables.js +25 -0
  100. package/dist/operations/workbookTable/listWorkbookTables.test.js +30 -0
  101. package/dist/operations/workbookWorksheet/createWorkbookWorksheet.js +25 -0
  102. package/dist/operations/workbookWorksheet/createWorkbookWorksheet.test.js +36 -0
  103. package/dist/operations/workbookWorksheet/deleteWorkbookWorksheet.js +14 -0
  104. package/dist/operations/workbookWorksheet/deleteWorkbookWorksheet.test.js +28 -0
  105. package/dist/operations/workbookWorksheet/getWorkbookWorksheetRange.js +20 -0
  106. package/dist/operations/workbookWorksheet/getWorkbookWorksheetRange.test.js +30 -0
  107. package/dist/operations/workbookWorksheet/listWorkbookWorksheets.js +28 -0
  108. package/dist/operations/workbookWorksheet/listWorkbookWorksheets.test.js +45 -0
  109. package/dist/operations/workbookWorksheet/updateWorkbookWorksheet.js +21 -0
  110. package/dist/operations/workbookWorksheet/updateWorkbookWorksheet.test.js +37 -0
  111. package/dist/services/accessToken.js +15 -0
  112. package/dist/services/address.js +3 -0
  113. package/dist/services/configuration.js +20 -0
  114. package/dist/services/drive.js +17 -0
  115. package/dist/services/driveItem.js +48 -0
  116. package/dist/services/driveItem.test.js +17 -0
  117. package/dist/services/httpAgent.js +9 -0
  118. package/dist/services/httpStatus.js +3 -0
  119. package/dist/services/operationId.js +6 -0
  120. package/dist/services/sharepointUrl.js +24 -0
  121. package/dist/services/sharepointUrl.test.js +32 -0
  122. package/dist/services/site.js +15 -0
  123. package/dist/services/sleep.js +3 -0
  124. package/dist/services/stringCaseConversion.js +5 -0
  125. package/dist/services/stringCaseConversion.test.js +16 -0
  126. package/dist/services/templatedPaths.js +20 -0
  127. package/dist/services/templatedPaths.test.js +49 -0
  128. package/dist/services/temporaryFiles.js +11 -0
  129. package/dist/services/workbookRange.js +10 -0
  130. package/dist/services/workbookRangeAddress.js +8 -0
  131. package/dist/services/workbookTable.js +13 -0
  132. package/dist/services/workbookWorksheet.js +13 -0
  133. package/dist/tasks/createWorkbookAndStartSession.js +10 -0
  134. package/dist/tasks/deleteDriveItemWithRetry.js +16 -0
  135. package/dist/tasks/downloadDriveItemContent.js +7 -0
  136. package/dist/tasks/endSessionAndDeleteWorkbook.js +6 -0
  137. package/dist/tasks/getRangeLastUsedCell.js +38 -0
  138. package/dist/tasks/getRangeLastUsedCell.test.js +89 -0
  139. package/dist/tasks/getWorkbookTableVisibleBody.js +24 -0
  140. package/dist/tasks/getWorkbookTableVisibleBody.test.js +104 -0
  141. package/dist/tasks/getWorkbookWorksheetRefByName.js +10 -0
  142. package/dist/tasks/setColumnHidden.js +7 -0
  143. package/dist/tasks/setColumnHidden.test.js +43 -0
  144. package/dist/tasks/setRowHidden.js +7 -0
  145. package/dist/tasks/setRowHidden.test.js +42 -0
  146. package/docs/approach.md +7 -0
  147. package/docs/calculateWorkbook.md +20 -0
  148. package/docs/concepts.md +4 -0
  149. package/docs/envs.md +11 -0
  150. package/docs/performance.md +24 -0
  151. package/package.json +426 -0
@@ -0,0 +1,41 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { getDefaultDriveRef } from "../../services/drive.js";
3
+ import { driveItemPath, } from "../../services/driveItem.js";
4
+ import { generateTempFileName } from "../../services/temporaryFiles.js";
5
+ import { workbookRangeRef } from "../../services/workbookRange.js";
6
+ import { defaultWorkbookWorksheetId, workbookWorksheetRef } from "../../services/workbookWorksheet.js";
7
+ import deleteDriveItemWithRetry from "../../tasks/deleteDriveItemWithRetry.js";
8
+ import calculateWorkbook from "../workbook/calculateWorkbook.js";
9
+ import createWorkbook from "../workbook/createWorkbook.js";
10
+ import getWorkbookUsedRange from "./getWorkbookUsedRange.js";
11
+ import insertWorkbookCells from "./insertWorkbookCells.js";
12
+ import updateWorkbookRange from "./updateWorkbookRange.js";
13
+ describe("insertWorkbookCells", () => {
14
+ it("can insert cells in an existing workbook using sequential", { timeout: 20000 }, async () => {
15
+ const address = "A1:B2";
16
+ const initialValues = [
17
+ [1, 2],
18
+ [3, 4]
19
+ ];
20
+ const finalValues = [
21
+ ["", 2],
22
+ [1, 4],
23
+ [3, ""]
24
+ ];
25
+ const workbookName = generateTempFileName("xlsx");
26
+ const workbookPath = driveItemPath(workbookName);
27
+ const workbook = await createWorkbook(getDefaultDriveRef(), workbookPath);
28
+ const worksheetRef = workbookWorksheetRef(workbook, defaultWorkbookWorksheetId);
29
+ const rangeRef = workbookRangeRef(worksheetRef, address);
30
+ try {
31
+ await updateWorkbookRange(rangeRef, { values: initialValues });
32
+ await insertWorkbookCells(worksheetRef, "A1", "Down");
33
+ await calculateWorkbook(workbook);
34
+ const insertedRange = await getWorkbookUsedRange(rangeRef);
35
+ expect(insertedRange.values).toEqual(finalValues);
36
+ }
37
+ finally {
38
+ await deleteDriveItemWithRetry(workbook);
39
+ }
40
+ });
41
+ });
@@ -0,0 +1,15 @@
1
+ import { operation } from "../../graphApi.js";
2
+ import { generatePath } from "../../services/templatedPaths.js";
3
+ /** Update range that has been defined using the "named range" functionality. Properties that aren't included in the request maintain their previous values or are recalculated based on changes to other property values. @see https://learn.microsoft.com/en-us/graph/api/range-update */
4
+ export default function updateWorkbookNamedRange(rangeRef, value) {
5
+ return operation({
6
+ method: "PATCH",
7
+ path: generatePath("/sites/{site-id}/drives/{drive-id}/items/{item-id}/workbook/names/{range-name}/range", rangeRef),
8
+ headers: {
9
+ "workbook-session-id": rangeRef.sessionId,
10
+ "content-type": "application/json",
11
+ },
12
+ body: value,
13
+ responseTransform: () => undefined
14
+ });
15
+ }
@@ -0,0 +1,21 @@
1
+ import { operation } from "../../graphApi.js";
2
+ import { generatePath } from "../../services/templatedPaths.js";
3
+ /** Update range, including values and formatting. Properties that aren't included in the request maintain their previous values or are recalculated based on changes to other property values. @see https://learn.microsoft.com/en-us/graph/api/range-update */
4
+ export default function updateWorkbookRange(rangeRef, update) {
5
+ return operation({
6
+ method: "PATCH",
7
+ path: generatePath(`/sites/{site-id}/drives/{drive-id}/items/{item-id}/workbook/worksheets/{worksheet-id}/range(address='${rangeRef.address}')`, rangeRef),
8
+ headers: {
9
+ "workbook-session-id": rangeRef.sessionId,
10
+ "content-type": "application/json",
11
+ },
12
+ body: update,
13
+ responseTransform: response => {
14
+ const range = response;
15
+ return {
16
+ ...range,
17
+ ...rangeRef
18
+ };
19
+ }
20
+ });
21
+ }
@@ -0,0 +1,54 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { sequential } from "../../graphApi.js";
3
+ import { getDefaultDriveRef } from "../../services/drive.js";
4
+ import { driveItemPath, } from "../../services/driveItem.js";
5
+ import { generateTempFileName } from "../../services/temporaryFiles.js";
6
+ import { workbookRangeRef } from "../../services/workbookRange.js";
7
+ import { defaultWorkbookWorksheetId, workbookWorksheetRef } from "../../services/workbookWorksheet.js";
8
+ import deleteDriveItemWithRetry from "../../tasks/deleteDriveItemWithRetry.js";
9
+ import calculateWorkbook from "../workbook/calculateWorkbook.js";
10
+ import createWorkbook from "../workbook/createWorkbook.js";
11
+ import getWorkbookWorksheetRange from "../workbookWorksheet/getWorkbookWorksheetRange.js";
12
+ import updateWorkbookRange from "./updateWorkbookRange.js";
13
+ describe("updateWorkbookRange", () => {
14
+ it("can update a range in an existing workbook", { timeout: 10000 }, async () => {
15
+ const address = "A1:B2";
16
+ const values = [[1, 2], [3, 4]];
17
+ const workbookName = generateTempFileName("xlsx");
18
+ const workbookPath = driveItemPath(workbookName);
19
+ const driveRef = getDefaultDriveRef();
20
+ const workbook = await createWorkbook(driveRef, workbookPath);
21
+ const worksheetRef = workbookWorksheetRef(workbook, defaultWorkbookWorksheetId);
22
+ const rangeRef = workbookRangeRef(worksheetRef, address);
23
+ try {
24
+ await updateWorkbookRange(rangeRef, {
25
+ values: values
26
+ });
27
+ await calculateWorkbook(workbook);
28
+ const updatedRange = await getWorkbookWorksheetRange(rangeRef);
29
+ expect(updatedRange.values).toEqual(values);
30
+ }
31
+ finally {
32
+ await deleteDriveItemWithRetry(workbook);
33
+ }
34
+ });
35
+ it("can update a range in an existing workbook sequential", { timeout: 10000 }, async () => {
36
+ const address = "A1:B2";
37
+ const values = [[1, 2], [3, 4]];
38
+ const workbookName = generateTempFileName("xlsx");
39
+ const workbookPath = driveItemPath(workbookName);
40
+ const driveRef = getDefaultDriveRef();
41
+ const workbook = await createWorkbook(driveRef, workbookPath);
42
+ const worksheetRef = workbookWorksheetRef(workbook, defaultWorkbookWorksheetId);
43
+ const rangeRef = workbookRangeRef(worksheetRef, address);
44
+ try {
45
+ const [_, __, updatedRange] = await sequential(updateWorkbookRange(rangeRef, {
46
+ values: values
47
+ }), calculateWorkbook(workbook), getWorkbookWorksheetRange(rangeRef));
48
+ expect(updatedRange.values).toEqual(values);
49
+ }
50
+ finally {
51
+ await deleteDriveItemWithRetry(workbook);
52
+ }
53
+ });
54
+ });
@@ -0,0 +1,18 @@
1
+ import InvalidArgumentError from "../../errors/InvalidArgumentError.js";
2
+ import { operation } from "../../graphApi.js";
3
+ import { generatePath } from "../../services/templatedPaths.js";
4
+ /** Close an existing workbook session. @see https://learn.microsoft.com/en-us/graph/api/workbook-closesession */
5
+ export default function closeWorkbookSession(workbookRef) {
6
+ if (!workbookRef.sessionId) {
7
+ throw new InvalidArgumentError("Workbook session ID is required to close a session.");
8
+ }
9
+ return operation({
10
+ method: "POST",
11
+ path: generatePath("/sites/{site-id}/drives/{drive-id}/items/{item-id}/workbook/closeSession", workbookRef),
12
+ headers: {
13
+ "workbook-session-id": workbookRef.sessionId,
14
+ },
15
+ body: null,
16
+ responseTransform: () => undefined
17
+ });
18
+ }
@@ -0,0 +1,22 @@
1
+ import { operation } from "../../graphApi.js";
2
+ import { generatePath } from "../../services/templatedPaths.js";
3
+ /** Create a new workbook session. Typically the persistent session expires after about 5 minutes of inactivity. Non persistent session expires after about 7 minutes of inactivity. Most performant with `persistChanges = true`. @see https://learn.microsoft.com/en-us/graph/api/workbook-createsession @see https://learn.microsoft.com/en-us/graph/api/resources/excel#usage */
4
+ export default function createWorkbookSession(itemRef, persistChanges = true) {
5
+ return operation({
6
+ method: "POST",
7
+ path: generatePath("/sites/{site-id}/drives/{drive-id}/items/{item-id}/workbook/createSession", itemRef),
8
+ headers: {
9
+ "content-type": "application/json",
10
+ },
11
+ body: {
12
+ persistChanges
13
+ },
14
+ responseTransform: response => {
15
+ const session = response;
16
+ return ({
17
+ ...itemRef,
18
+ sessionId: session.id,
19
+ });
20
+ }
21
+ });
22
+ }
@@ -0,0 +1,19 @@
1
+ import InvalidArgumentError from "../../errors/InvalidArgumentError.js";
2
+ import { operation } from "../../graphApi.js";
3
+ import { generatePath } from "../../services/templatedPaths.js";
4
+ /** Refresh a workbook session. @see https://learn.microsoft.com/en-us/graph/api/workbook-refreshsession */
5
+ export default function refreshWorkbookSession(workbookRef) {
6
+ if (!workbookRef.sessionId) {
7
+ throw new InvalidArgumentError("Workbook session ID is required to refresh a session.");
8
+ }
9
+ return operation({
10
+ method: "POST",
11
+ path: generatePath("/sites/{site-id}/drives/{drive-id}/items/{item-id}/workbook/refreshSession", workbookRef),
12
+ headers: {
13
+ "workbook-session-id": workbookRef.sessionId,
14
+ "content-type": "application/json",
15
+ },
16
+ body: null,
17
+ responseTransform: () => undefined
18
+ });
19
+ }
@@ -0,0 +1,26 @@
1
+ import { operation } from "../../graphApi.js";
2
+ import { generatePath } from "../../services/templatedPaths.js";
3
+ import { workbookTableRef } from "../../services/workbookTable.js";
4
+ /** Create a new table in a worksheet. @see https://learn.microsoft.com/en-us/graph/api/worksheet-post-tables */
5
+ export default function createWorkbookTable(rangeRef, hasHeaders) {
6
+ return operation({
7
+ method: "POST",
8
+ path: generatePath("/sites/{site-id}/drives/{drive-id}/items/{item-id}/workbook/worksheets/{worksheet-id}/tables/add", rangeRef),
9
+ headers: {
10
+ "workbook-session-id": rangeRef.sessionId,
11
+ "content-type": "application/json",
12
+ },
13
+ body: {
14
+ address: rangeRef.address,
15
+ hasHeaders
16
+ },
17
+ responseTransform: response => {
18
+ const table = response;
19
+ const tableRef = workbookTableRef(rangeRef, table.id);
20
+ return {
21
+ ...table,
22
+ ...tableRef
23
+ };
24
+ }
25
+ });
26
+ }
@@ -0,0 +1,25 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { getDefaultDriveRef } from "../../services/drive.js";
3
+ import { driveItemPath, } from "../../services/driveItem.js";
4
+ import { generateTempFileName } from "../../services/temporaryFiles.js";
5
+ import { workbookRangeRef } from "../../services/workbookRange.js";
6
+ import deleteDriveItemWithRetry from "../../tasks/deleteDriveItemWithRetry.js";
7
+ import createWorkbook from "../workbook/createWorkbook.js";
8
+ import createWorkbookWorksheet from "../workbookWorksheet/createWorkbookWorksheet.js";
9
+ import createWorkbookTable from "./createWorkbookTable.js";
10
+ describe("createWorkbookTable", () => {
11
+ it("can create a new table in an existing worksheet", { timeout: 10000 }, async () => {
12
+ const workbookName = generateTempFileName("xlsx");
13
+ const workbookPath = driveItemPath(workbookName);
14
+ const workbook = await createWorkbook(getDefaultDriveRef(), workbookPath);
15
+ try {
16
+ const worksheet = await createWorkbookWorksheet(workbook);
17
+ const rangeRef = workbookRangeRef(worksheet, "A1:D4");
18
+ const table = await createWorkbookTable(rangeRef, true);
19
+ expect(table.id).toBeTruthy();
20
+ }
21
+ finally {
22
+ await deleteDriveItemWithRetry(workbook);
23
+ }
24
+ });
25
+ });
@@ -0,0 +1,20 @@
1
+ import { operation } from "../../graphApi.js";
2
+ import { generatePath } from "../../services/templatedPaths.js";
3
+ /** Retrieve a table by its ID. @see https://learn.microsoft.com/en-us/graph/api/table-get */
4
+ export default function getWorkbookTable(tableRef) {
5
+ return operation({
6
+ method: "GET",
7
+ path: generatePath("/sites/{site-id}/drives/{drive-id}/items/{item-id}/workbook/worksheets/{worksheet-id}/tables/{table-id}", tableRef),
8
+ headers: {
9
+ "workbook-session-id": tableRef.sessionId,
10
+ },
11
+ body: null,
12
+ responseTransform: response => {
13
+ const table = response;
14
+ return {
15
+ ...table,
16
+ ...tableRef
17
+ };
18
+ }
19
+ });
20
+ }
@@ -0,0 +1,30 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { getDefaultDriveRef } from "../../services/drive.js";
3
+ import { driveItemPath, } from "../../services/driveItem.js";
4
+ import { generateTempFileName } from "../../services/temporaryFiles.js";
5
+ import { workbookRangeRef } from "../../services/workbookRange.js";
6
+ import deleteDriveItemWithRetry from "../../tasks/deleteDriveItemWithRetry.js";
7
+ import calculateWorkbook from "../workbook/calculateWorkbook.js";
8
+ import createWorkbook from "../workbook/createWorkbook.js";
9
+ import createWorkbookWorksheet from "../workbookWorksheet/createWorkbookWorksheet.js";
10
+ import createWorkbookTable from "./createWorkbookTable.js";
11
+ import getWorkbookTable from "./getWorkbookTable.js";
12
+ describe("getWorkbookTable", () => {
13
+ it("can retrieve a table by its ID", { timeout: 10000 }, async () => {
14
+ const workbookName = generateTempFileName("xlsx");
15
+ const workbookPath = driveItemPath(workbookName);
16
+ const driveRef = getDefaultDriveRef();
17
+ const workbook = await createWorkbook(driveRef, workbookPath);
18
+ try {
19
+ const worksheet = await createWorkbookWorksheet(workbook);
20
+ const rangeRef = workbookRangeRef(worksheet, "A1:D4");
21
+ const table = await createWorkbookTable(rangeRef, true);
22
+ await calculateWorkbook(workbook);
23
+ const retrievedTable = await getWorkbookTable(table);
24
+ expect(retrievedTable.tableId).toBe(table.tableId);
25
+ }
26
+ finally {
27
+ await deleteDriveItemWithRetry(workbook);
28
+ }
29
+ });
30
+ });
@@ -0,0 +1,22 @@
1
+ import { operation } from "../../graphApi.js";
2
+ import { generatePath } from "../../services/templatedPaths.js";
3
+ import { workbookRangeRef } from "../../services/workbookRange.js";
4
+ /** Retrieve the data body range of a table. @see https://learn.microsoft.com/en-us/graph/api/table-databodyrange */
5
+ export default function getWorkbookTableBodyRange(tableRef) {
6
+ return operation({
7
+ method: "GET",
8
+ path: generatePath("/sites/{site-id}/drives/{drive-id}/items/{item-id}/workbook/worksheets/{worksheet-id}/tables/{table-id}/dataBodyRange", tableRef),
9
+ headers: {
10
+ "workbook-session-id": tableRef.sessionId,
11
+ },
12
+ body: null,
13
+ responseTransform: response => {
14
+ const range = response;
15
+ const rangeRef = workbookRangeRef(tableRef, range.address);
16
+ return {
17
+ ...range,
18
+ ...rangeRef
19
+ };
20
+ }
21
+ });
22
+ }
@@ -0,0 +1,45 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { sequential } from "../../graphApi.js";
3
+ import { getDefaultDriveRef } from "../../services/drive.js";
4
+ import { driveItemPath } from "../../services/driveItem.js";
5
+ import { generateTempFileName } from "../../services/temporaryFiles.js";
6
+ import { workbookRangeRef } from "../../services/workbookRange.js";
7
+ import deleteDriveItemWithRetry from "../../tasks/deleteDriveItemWithRetry.js";
8
+ import calculateWorkbook from "../workbook/calculateWorkbook.js";
9
+ import createWorkbook from "../workbook/createWorkbook.js";
10
+ import updateWorkbookRange from "../workbookRange/updateWorkbookRange.js";
11
+ import createWorkbookWorksheet from "../workbookWorksheet/createWorkbookWorksheet.js";
12
+ import createWorkbookTable from "./createWorkbookTable.js";
13
+ import getWorkbookTableBodyRange from "./getWorkbookTableBodyRange.js";
14
+ describe("getWorkbookTableBodyRange", () => {
15
+ it("can retrieve the data body range of a table", { timeout: 10000 }, async () => {
16
+ const workbookName = generateTempFileName("xlsx");
17
+ const workbookPath = driveItemPath(workbookName);
18
+ const driveRef = getDefaultDriveRef();
19
+ const workbook = await createWorkbook(driveRef, workbookPath);
20
+ try {
21
+ const worksheet = await createWorkbookWorksheet(workbook);
22
+ const rangeRef = workbookRangeRef(worksheet, "A1:D4");
23
+ const table = await createWorkbookTable(rangeRef, true);
24
+ await updateWorkbookRange(rangeRef, {
25
+ values: [
26
+ ["Header1", "Header2", "Header3", "Header4"],
27
+ ["Value1", "Value2", "Value3", "Value4"],
28
+ ["Value5", "Value6", "Value7", "Value8"],
29
+ ["Value9", "Value10", "Value11", "Value12"]
30
+ ]
31
+ });
32
+ await calculateWorkbook(workbook);
33
+ const [_, dataBodyRange] = await sequential(calculateWorkbook(workbook), getWorkbookTableBodyRange(table));
34
+ expect(dataBodyRange.address).toBeTruthy();
35
+ expect(dataBodyRange.values).toEqual([
36
+ ["Value1", "Value2", "Value3", "Value4"],
37
+ ["Value5", "Value6", "Value7", "Value8"],
38
+ ["Value9", "Value10", "Value11", "Value12"]
39
+ ]);
40
+ }
41
+ finally {
42
+ await deleteDriveItemWithRetry(workbook);
43
+ }
44
+ });
45
+ });
@@ -0,0 +1,22 @@
1
+ import { operation } from "../../graphApi.js";
2
+ import { generatePath } from "../../services/templatedPaths.js";
3
+ import { workbookRangeRef } from "../../services/workbookRange.js";
4
+ /** Retrieve the header row range of a table. @see https://learn.microsoft.com/en-us/graph/api/table-headerrowrange */
5
+ export default function getWorkbookTableHeaderRange(tableRef) {
6
+ return operation({
7
+ method: "GET",
8
+ path: generatePath("/sites/{site-id}/drives/{drive-id}/items/{item-id}/workbook/worksheets/{worksheet-id}/tables/{table-id}/headerRowRange", tableRef),
9
+ headers: {
10
+ "workbook-session-id": tableRef.sessionId,
11
+ },
12
+ body: null,
13
+ responseTransform: response => {
14
+ const range = response;
15
+ const rangeRef = workbookRangeRef(tableRef, range.address);
16
+ return {
17
+ ...range,
18
+ ...rangeRef
19
+ };
20
+ }
21
+ });
22
+ }
@@ -0,0 +1,41 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { sequential } from "../../graphApi.js";
3
+ import { getDefaultDriveRef } from "../../services/drive.js";
4
+ import { driveItemPath } from "../../services/driveItem.js";
5
+ import { generateTempFileName } from "../../services/temporaryFiles.js";
6
+ import { workbookRangeRef } from "../../services/workbookRange.js";
7
+ import deleteDriveItemWithRetry from "../../tasks/deleteDriveItemWithRetry.js";
8
+ import calculateWorkbook from "../workbook/calculateWorkbook.js";
9
+ import createWorkbook from "../workbook/createWorkbook.js";
10
+ import updateWorkbookRange from "../workbookRange/updateWorkbookRange.js";
11
+ import createWorkbookWorksheet from "../workbookWorksheet/createWorkbookWorksheet.js";
12
+ import createWorkbookTable from "./createWorkbookTable.js";
13
+ import getWorkbookTableHeaderRange from "./getWorkbookTableHeaderRange.js";
14
+ describe("getWorkbookTableHeaderRange", () => {
15
+ it("can retrieve the header row range of a table", { timeout: 10000 }, async () => {
16
+ const workbookName = generateTempFileName("xlsx");
17
+ const workbookPath = driveItemPath(workbookName);
18
+ const driveRef = getDefaultDriveRef();
19
+ const workbook = await createWorkbook(driveRef, workbookPath);
20
+ try {
21
+ const worksheet = await createWorkbookWorksheet(workbook);
22
+ const rangeRef = workbookRangeRef(worksheet, "A1:D4");
23
+ const table = await createWorkbookTable(rangeRef, true);
24
+ await updateWorkbookRange(rangeRef, {
25
+ values: [
26
+ ["Header1", "Header2", "Header3", "Header4"],
27
+ ["Value1", "Value2", "Value3", "Value4"],
28
+ ["Value5", "Value6", "Value7", "Value8"],
29
+ ["Value9", "Value10", "Value11", "Value12"]
30
+ ]
31
+ });
32
+ await calculateWorkbook(workbook);
33
+ const [_, headerRange] = await sequential(calculateWorkbook(workbook), getWorkbookTableHeaderRange(table));
34
+ expect(headerRange.address).toBeTruthy();
35
+ expect(headerRange.values).toEqual([["Header1", "Header2", "Header3", "Header4"]]);
36
+ }
37
+ finally {
38
+ await deleteDriveItemWithRetry(workbook);
39
+ }
40
+ });
41
+ });
@@ -0,0 +1,17 @@
1
+ import { operation } from "../../graphApi.js";
2
+ import { generatePath } from "../../services/templatedPaths.js";
3
+ /** Retrieve a list of columns in a table. @see https://learn.microsoft.com/en-us/graph/api/tablecolumn-list */
4
+ export default function listWorkbookTableColumns(tableRef) {
5
+ return operation({
6
+ method: "GET",
7
+ path: generatePath("/sites/{site-id}/drives/{drive-id}/items/{item-id}/workbook/tables/{table-id}/columns", tableRef),
8
+ headers: {
9
+ "workbook-session-id": tableRef.sessionId,
10
+ },
11
+ body: null,
12
+ responseTransform: response => {
13
+ const list = response;
14
+ return list.value;
15
+ }
16
+ });
17
+ }
@@ -0,0 +1,29 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { getDefaultDriveRef } from "../../services/drive.js";
3
+ import { driveItemPath, } from "../../services/driveItem.js";
4
+ import { generateTempFileName } from "../../services/temporaryFiles.js";
5
+ import { workbookRangeRef } from "../../services/workbookRange.js";
6
+ import deleteDriveItemWithRetry from "../../tasks/deleteDriveItemWithRetry.js";
7
+ import calculateWorkbook from "../workbook/calculateWorkbook.js";
8
+ import createWorkbook from "../workbook/createWorkbook.js";
9
+ import createWorkbookWorksheet from "../workbookWorksheet/createWorkbookWorksheet.js";
10
+ import createWorkbookTable from "./createWorkbookTable.js";
11
+ import listWorkbookTableColumns from "./listWorkbookTableColumns.js";
12
+ describe("listWorkbookTableColumns", () => {
13
+ it("can list columns in an existing table", { timeout: 10000 }, async () => {
14
+ const workbookName = generateTempFileName("xlsx");
15
+ const workbookPath = driveItemPath(workbookName);
16
+ const workbook = await createWorkbook(getDefaultDriveRef(), workbookPath);
17
+ try {
18
+ const worksheet = await createWorkbookWorksheet(workbook);
19
+ const rangeRef = workbookRangeRef(worksheet, "A1:D4");
20
+ const table = await createWorkbookTable(rangeRef, true);
21
+ await calculateWorkbook(workbook);
22
+ const columns = await listWorkbookTableColumns(table);
23
+ expect(columns.length).toBeGreaterThan(0);
24
+ }
25
+ finally {
26
+ await deleteDriveItemWithRetry(workbook);
27
+ }
28
+ });
29
+ });
@@ -0,0 +1,17 @@
1
+ import { operation } from "../../graphApi.js";
2
+ import { generatePath } from "../../services/templatedPaths.js";
3
+ /** Retrieve a list of rows in a table. @see https://learn.microsoft.com/en-us/graph/api/tablerow-list */
4
+ export default function listWorkbookTableRows(tableRef) {
5
+ return operation({
6
+ method: "GET",
7
+ path: generatePath("/sites/{site-id}/drives/{drive-id}/items/{item-id}/workbook/tables/{table-id}/rows", tableRef),
8
+ headers: {
9
+ "workbook-session-id": tableRef.sessionId,
10
+ },
11
+ body: null,
12
+ responseTransform: response => {
13
+ const list = response;
14
+ return list.value;
15
+ }
16
+ });
17
+ }
@@ -0,0 +1,29 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { getDefaultDriveRef } from "../../services/drive.js";
3
+ import { driveItemPath, } from "../../services/driveItem.js";
4
+ import { generateTempFileName } from "../../services/temporaryFiles.js";
5
+ import { workbookRangeRef } from "../../services/workbookRange.js";
6
+ import deleteDriveItemWithRetry from "../../tasks/deleteDriveItemWithRetry.js";
7
+ import calculateWorkbook from "../workbook/calculateWorkbook.js";
8
+ import createWorkbook from "../workbook/createWorkbook.js";
9
+ import createWorkbookWorksheet from "../workbookWorksheet/createWorkbookWorksheet.js";
10
+ import createWorkbookTable from "./createWorkbookTable.js";
11
+ import listWorkbookTableRows from "./listWorkbookTableRows.js";
12
+ describe("listWorkbookTableRows", () => {
13
+ it("can list rows in an existing table", { timeout: 10000 }, async () => {
14
+ const workbookName = generateTempFileName("xlsx");
15
+ const workbookPath = driveItemPath(workbookName);
16
+ const workbook = await createWorkbook(getDefaultDriveRef(), workbookPath);
17
+ try {
18
+ const worksheet = await createWorkbookWorksheet(workbook);
19
+ const rangeRef = workbookRangeRef(worksheet, "A1:D4");
20
+ const table = await createWorkbookTable(rangeRef, true);
21
+ await calculateWorkbook(workbook);
22
+ const rows = await listWorkbookTableRows(table);
23
+ expect(rows.length).toBeGreaterThan(0);
24
+ }
25
+ finally {
26
+ await deleteDriveItemWithRetry(workbook);
27
+ }
28
+ });
29
+ });
@@ -0,0 +1,25 @@
1
+ import { operation } from "../../graphApi.js";
2
+ import { generatePath } from "../../services/templatedPaths.js";
3
+ import { workbookTableRef } from "../../services/workbookTable.js";
4
+ /** Retrieve a list of tables in a worksheet. @see https://learn.microsoft.com/en-us/graph/api/worksheet-list-tables */
5
+ export default function listWorkbookTables(worksheetRef) {
6
+ return operation({
7
+ method: "GET",
8
+ path: generatePath("/sites/{site-id}/drives/{drive-id}/items/{item-id}/workbook/worksheets/{worksheet-id}/tables", worksheetRef),
9
+ headers: {
10
+ "workbook-session-id": worksheetRef.sessionId,
11
+ },
12
+ body: null,
13
+ responseTransform: response => {
14
+ const list = response;
15
+ const tables = list.value.map(table => {
16
+ const tableRef = workbookTableRef(worksheetRef, table.id);
17
+ return {
18
+ ...table,
19
+ ...tableRef,
20
+ };
21
+ });
22
+ return tables;
23
+ }
24
+ });
25
+ }
@@ -0,0 +1,30 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { getDefaultDriveRef } from "../../services/drive.js";
3
+ import { driveItemPath, } from "../../services/driveItem.js";
4
+ import { generateTempFileName } from "../../services/temporaryFiles.js";
5
+ import { workbookRangeRef } from "../../services/workbookRange.js";
6
+ import deleteDriveItemWithRetry from "../../tasks/deleteDriveItemWithRetry.js";
7
+ import calculateWorkbook from "../workbook/calculateWorkbook.js";
8
+ import createWorkbook from "../workbook/createWorkbook.js";
9
+ import createWorkbookWorksheet from "../workbookWorksheet/createWorkbookWorksheet.js";
10
+ import createWorkbookTable from "./createWorkbookTable.js";
11
+ import listTables from "./listWorkbookTables.js";
12
+ describe("listWorkbookTables", () => {
13
+ it("can list tables in an existing worksheet", { timeout: 10000 }, async () => {
14
+ const workbookName = generateTempFileName("xlsx");
15
+ const workbookPath = driveItemPath(workbookName);
16
+ const driveRef = getDefaultDriveRef();
17
+ const workbook = await createWorkbook(driveRef, workbookPath);
18
+ try {
19
+ const worksheet = await createWorkbookWorksheet(workbook);
20
+ const rangeRef = workbookRangeRef(worksheet, "A1:D4");
21
+ await createWorkbookTable(rangeRef, true);
22
+ await calculateWorkbook(workbook);
23
+ const tables = await listTables(worksheet);
24
+ expect(tables.length).toBeGreaterThan(0);
25
+ }
26
+ finally {
27
+ await deleteDriveItemWithRetry(workbook);
28
+ }
29
+ });
30
+ });
@@ -0,0 +1,25 @@
1
+ import { operation } from "../../graphApi.js";
2
+ import { generatePath } from "../../services/templatedPaths.js";
3
+ import { workbookWorksheetRef } from "../../services/workbookWorksheet.js";
4
+ /** Create a new worksheet, optionally with a defined name. @see https://learn.microsoft.com/en-us/graph/api/worksheetcollection-add */
5
+ export default function createWorkbookWorksheet(workbookRef, name) {
6
+ return operation({
7
+ method: "POST",
8
+ path: generatePath("/sites/{site-id}/drives/{drive-id}/items/{item-id}/workbook/worksheets/add", workbookRef),
9
+ headers: {
10
+ "workbook-session-id": workbookRef.sessionId,
11
+ "content-type": "application/json",
12
+ },
13
+ body: {
14
+ name
15
+ },
16
+ responseTransform: response => {
17
+ const worksheet = response;
18
+ const worksheetRef = workbookWorksheetRef(workbookRef, worksheet.id);
19
+ return {
20
+ ...worksheet,
21
+ ...worksheetRef
22
+ };
23
+ }
24
+ });
25
+ }