microsoft-graph 2.1.0 → 2.2.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.
Files changed (180) hide show
  1. package/.github/workflows/check.yml +23 -0
  2. package/.vscode/settings.json +7 -2
  3. package/biome.jsonc +16 -46
  4. package/dist/errors/EnvironmentVariableMissingError.d.ts.map +1 -1
  5. package/dist/errors/InvalidArgumentError.d.ts.map +1 -1
  6. package/dist/errors/NeverError.d.ts +4 -0
  7. package/dist/errors/NeverError.d.ts.map +1 -0
  8. package/dist/errors/NeverError.js +6 -0
  9. package/dist/errors/NotFoundError.d.ts +4 -0
  10. package/dist/errors/NotFoundError.d.ts.map +1 -0
  11. package/dist/errors/NotFoundError.js +6 -0
  12. package/dist/errors/RequestFailedError.d.ts +1 -2
  13. package/dist/errors/RequestFailedError.d.ts.map +1 -1
  14. package/dist/errors/RequestFailedError.js +5 -13
  15. package/dist/graphApi.d.ts +6 -5
  16. package/dist/graphApi.d.ts.map +1 -1
  17. package/dist/graphApi.js +118 -75
  18. package/dist/models/AccessToken.d.ts.map +1 -1
  19. package/dist/models/ClientId.d.ts.map +1 -1
  20. package/dist/models/ClientSecret.d.ts.map +1 -1
  21. package/dist/models/Context.d.ts.map +1 -1
  22. package/dist/models/ContextId.d.ts.map +1 -1
  23. package/dist/models/ContextRef.d.ts.map +1 -1
  24. package/dist/models/DriveId.d.ts.map +1 -1
  25. package/dist/models/DriveItemId.d.ts.map +1 -1
  26. package/dist/models/DriveItemPath.d.ts.map +1 -1
  27. package/dist/models/DriveItemRef.d.ts.map +1 -1
  28. package/dist/models/DriveRef.d.ts.map +1 -1
  29. package/dist/models/GraphOperation.d.ts.map +1 -1
  30. package/dist/models/GraphOperationDefinition.d.ts.map +1 -1
  31. package/dist/models/HostName.d.ts.map +1 -1
  32. package/dist/models/HttpProxy.d.ts.map +1 -1
  33. package/dist/models/Scope.d.ts.map +1 -1
  34. package/dist/models/SiteId.d.ts.map +1 -1
  35. package/dist/models/SiteName.d.ts.map +1 -1
  36. package/dist/models/SiteRef.d.ts.map +1 -1
  37. package/dist/models/TenantId.d.ts.map +1 -1
  38. package/dist/models/WorkbookNamedRangeRef.d.ts.map +1 -1
  39. package/dist/models/WorkbookRangeAddress.d.ts.map +1 -1
  40. package/dist/models/WorkbookRangeName.d.ts.map +1 -1
  41. package/dist/models/WorkbookRangeRef.d.ts.map +1 -1
  42. package/dist/models/WorkbookRef.d.ts.map +1 -1
  43. package/dist/models/WorkbookSessionId.d.ts.map +1 -1
  44. package/dist/models/WorkbookTableId.d.ts.map +1 -1
  45. package/dist/models/WorkbookTableRef.d.ts.map +1 -1
  46. package/dist/models/WorkbookWorksheetId.d.ts.map +1 -1
  47. package/dist/models/WorkbookWorksheetName.d.ts.map +1 -1
  48. package/dist/models/WorkbookWorksheetRef.d.ts.map +1 -1
  49. package/dist/operations/drive/createFolder.d.ts.map +1 -1
  50. package/dist/operations/drive/createFolder.js +3 -3
  51. package/dist/operations/drive/createFolder.test.js +2 -2
  52. package/dist/operations/drive/listDrives.d.ts.map +1 -1
  53. package/dist/operations/drive/listDrives.js +4 -4
  54. package/dist/operations/driveItem/deleteDriveItem.js +1 -1
  55. package/dist/operations/driveItem/deleteDriveItem.test.js +2 -2
  56. package/dist/operations/driveItem/getDriveItem.js +3 -3
  57. package/dist/operations/driveItem/getDriveItem.test.js +2 -2
  58. package/dist/operations/driveItem/getDriveItemByPath.js +3 -3
  59. package/dist/operations/driveItem/getDriveItemByPath.test.js +2 -2
  60. package/dist/operations/driveItem/getDriveItemContent.d.ts.map +1 -1
  61. package/dist/operations/driveItem/getDriveItemContent.js +3 -3
  62. package/dist/operations/driveItem/getDriveItemContent.test.js +1 -3
  63. package/dist/operations/driveItem/initiateCopyDriveItem.js +1 -1
  64. package/dist/operations/driveItem/initiateCopyDriveItem.test.js +2 -2
  65. package/dist/operations/driveItem/listDriveItems.d.ts.map +1 -1
  66. package/dist/operations/driveItem/listDriveItems.js +3 -3
  67. package/dist/operations/driveItem/listDriveItems.test.js +1 -1
  68. package/dist/operations/site/getSite.js +3 -3
  69. package/dist/operations/site/getSiteByName.js +2 -2
  70. package/dist/operations/site/listSites.js +3 -3
  71. package/dist/operations/site/listSites.test.js +1 -1
  72. package/dist/operations/site/searchSites.js +3 -3
  73. package/dist/operations/user/userSendMail.js +2 -3
  74. package/dist/operations/workbook/calculateWorkbook.d.ts.map +1 -1
  75. package/dist/operations/workbook/calculateWorkbook.js +2 -2
  76. package/dist/operations/workbook/calculateWorkbook.test.js +3 -3
  77. package/dist/operations/workbook/createWorkbook.js +3 -3
  78. package/dist/operations/workbook/deleteWorkbook.d.ts.map +1 -1
  79. package/dist/operations/workbookRange/clearWorkbookRange.d.ts.map +1 -1
  80. package/dist/operations/workbookRange/clearWorkbookRange.js +2 -2
  81. package/dist/operations/workbookRange/clearWorkbookRange.test.js +21 -9
  82. package/dist/operations/workbookRange/deleteWorkbookRange.d.ts.map +1 -1
  83. package/dist/operations/workbookRange/deleteWorkbookRange.js +2 -2
  84. package/dist/operations/workbookRange/deleteWorkbookRange.test.js +21 -9
  85. package/dist/operations/workbookRange/getWorkbookNamedRange.js +3 -3
  86. package/dist/operations/workbookRange/getWorkbookUsedRange.js +3 -3
  87. package/dist/operations/workbookRange/getWorkbookUsedRange.test.js +14 -8
  88. package/dist/operations/workbookRange/getWorkbookVisibleRange.d.ts.map +1 -1
  89. package/dist/operations/workbookRange/getWorkbookVisibleRange.js +4 -3
  90. package/dist/operations/workbookRange/getWorkbookVisibleRange.test.js +21 -15
  91. package/dist/operations/workbookRange/insertWorkbookCells.d.ts.map +1 -1
  92. package/dist/operations/workbookRange/insertWorkbookCells.js +4 -4
  93. package/dist/operations/workbookRange/insertWorkbookCells.test.js +3 -3
  94. package/dist/operations/workbookRange/updateWorkbookNamedRange.js +1 -1
  95. package/dist/operations/workbookRange/updateWorkbookRange.js +3 -3
  96. package/dist/operations/workbookRange/updateWorkbookRange.test.js +13 -7
  97. package/dist/operations/workbookSession/closeWorkbookSession.js +1 -1
  98. package/dist/operations/workbookSession/createWorkbookSession.js +5 -5
  99. package/dist/operations/workbookSession/refreshWorkbookSession.js +1 -1
  100. package/dist/operations/workbookTable/createWorkbookTable.js +4 -4
  101. package/dist/operations/workbookTable/createWorkbookTable.test.js +2 -2
  102. package/dist/operations/workbookTable/getWorkbookTable.js +3 -3
  103. package/dist/operations/workbookTable/getWorkbookTable.test.js +2 -2
  104. package/dist/operations/workbookTable/getWorkbookTableBodyRange.js +3 -3
  105. package/dist/operations/workbookTable/getWorkbookTableBodyRange.test.js +4 -4
  106. package/dist/operations/workbookTable/getWorkbookTableHeaderRange.js +3 -3
  107. package/dist/operations/workbookTable/getWorkbookTableHeaderRange.test.js +3 -3
  108. package/dist/operations/workbookTable/listWorkbookTableColumns.js +2 -2
  109. package/dist/operations/workbookTable/listWorkbookTableColumns.test.js +2 -2
  110. package/dist/operations/workbookTable/listWorkbookTableRows.js +2 -2
  111. package/dist/operations/workbookTable/listWorkbookTableRows.test.js +2 -2
  112. package/dist/operations/workbookTable/listWorkbookTables.js +3 -3
  113. package/dist/operations/workbookTable/listWorkbookTables.test.js +2 -2
  114. package/dist/operations/workbookWorksheet/createWorkbookWorksheet.js +4 -4
  115. package/dist/operations/workbookWorksheet/createWorkbookWorksheet.test.js +3 -3
  116. package/dist/operations/workbookWorksheet/deleteWorkbookWorksheet.d.ts.map +1 -1
  117. package/dist/operations/workbookWorksheet/deleteWorkbookWorksheet.js +1 -1
  118. package/dist/operations/workbookWorksheet/deleteWorkbookWorksheet.test.js +3 -3
  119. package/dist/operations/workbookWorksheet/getWorkbookWorksheetRange.js +3 -3
  120. package/dist/operations/workbookWorksheet/getWorkbookWorksheetRange.test.js +7 -4
  121. package/dist/operations/workbookWorksheet/listWorkbookWorksheets.js +3 -3
  122. package/dist/operations/workbookWorksheet/listWorkbookWorksheets.test.js +5 -5
  123. package/dist/operations/workbookWorksheet/updateWorkbookWorksheet.d.ts.map +1 -1
  124. package/dist/operations/workbookWorksheet/updateWorkbookWorksheet.js +3 -3
  125. package/dist/operations/workbookWorksheet/updateWorkbookWorksheet.test.js +4 -4
  126. package/dist/services/context.d.ts.map +1 -1
  127. package/dist/services/context.js +2 -2
  128. package/dist/services/drive.d.ts.map +1 -1
  129. package/dist/services/driveItem.d.ts.map +1 -1
  130. package/dist/services/driveItem.js +2 -6
  131. package/dist/services/httpStatus.d.ts +1 -0
  132. package/dist/services/httpStatus.d.ts.map +1 -1
  133. package/dist/services/httpStatus.js +3 -0
  134. package/dist/services/random.js +2 -2
  135. package/dist/services/sharepointUrl.test.js +6 -6
  136. package/dist/services/site.js +2 -2
  137. package/dist/services/sleep.js +1 -1
  138. package/dist/services/templatedPaths.d.ts.map +1 -1
  139. package/dist/services/workbookRange.d.ts.map +1 -1
  140. package/dist/services/workbookRange.js +1 -1
  141. package/dist/services/workbookTable.d.ts.map +1 -1
  142. package/dist/services/workbookTable.js +1 -1
  143. package/dist/services/workbookWorksheet.d.ts.map +1 -1
  144. package/dist/services/workbookWorksheet.js +1 -1
  145. package/dist/tasks/createWorkbookAndStartSession.d.ts +1 -0
  146. package/dist/tasks/createWorkbookAndStartSession.d.ts.map +1 -1
  147. package/dist/tasks/createWorkbookAndStartSession.js +2 -1
  148. package/dist/tasks/deleteDriveItemWithRetry.d.ts +1 -0
  149. package/dist/tasks/deleteDriveItemWithRetry.d.ts.map +1 -1
  150. package/dist/tasks/deleteDriveItemWithRetry.js +1 -0
  151. package/dist/tasks/downloadDriveItemContent.d.ts +1 -0
  152. package/dist/tasks/downloadDriveItemContent.d.ts.map +1 -1
  153. package/dist/tasks/downloadDriveItemContent.js +1 -0
  154. package/dist/tasks/getRangeLastUsedCell.d.ts +1 -0
  155. package/dist/tasks/getRangeLastUsedCell.d.ts.map +1 -1
  156. package/dist/tasks/getRangeLastUsedCell.js +2 -1
  157. package/dist/tasks/getRangeLastUsedCell.test.js +9 -9
  158. package/dist/tasks/getWorkbookTableVisibleBody.d.ts +1 -0
  159. package/dist/tasks/getWorkbookTableVisibleBody.d.ts.map +1 -1
  160. package/dist/tasks/getWorkbookTableVisibleBody.js +1 -17
  161. package/dist/tasks/getWorkbookTableVisibleBody.test.js +21 -21
  162. package/dist/tasks/getWorkbookWorksheetByName.d.ts +6 -0
  163. package/dist/tasks/getWorkbookWorksheetByName.d.ts.map +1 -0
  164. package/dist/tasks/getWorkbookWorksheetByName.js +12 -0
  165. package/dist/tasks/getWorkbookWorksheetRefByName.js +1 -1
  166. package/dist/tasks/safeDeleteWorkbook.d.ts +4 -0
  167. package/dist/tasks/safeDeleteWorkbook.d.ts.map +1 -0
  168. package/dist/tasks/safeDeleteWorkbook.js +9 -0
  169. package/dist/tasks/setColumnHidden.d.ts +1 -0
  170. package/dist/tasks/setColumnHidden.d.ts.map +1 -1
  171. package/dist/tasks/setColumnHidden.js +2 -2
  172. package/dist/tasks/setColumnHidden.test.js +5 -5
  173. package/dist/tasks/setRowHidden.d.ts +1 -0
  174. package/dist/tasks/setRowHidden.d.ts.map +1 -1
  175. package/dist/tasks/setRowHidden.js +2 -2
  176. package/dist/tasks/setRowHidden.test.js +5 -5
  177. package/docs/lockedWorkbook.md +2 -0
  178. package/docs/pivotTables.md +9 -0
  179. package/docs/requestRetrying.md +3 -0
  180. package/package.json +18 -1
@@ -1 +1 @@
1
- {"version":3,"file":"getRangeLastUsedCell.d.ts","sourceRoot":"","sources":["../../src/tasks/getRangeLastUsedCell.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAItE,wBAA8B,oBAAoB,CAAC,QAAQ,EAAE,gBAAgB,GAAG,OAAO,CAAC;IAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAAC,CA0ClM"}
1
+ {"version":3,"file":"getRangeLastUsedCell.d.ts","sourceRoot":"","sources":["../../src/tasks/getRangeLastUsedCell.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAItE,0EAA0E;AAC1E,wBAA8B,oBAAoB,CAAC,QAAQ,EAAE,gBAAgB,GAAG,OAAO,CAAC;IAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAAC,CAyClM"}
@@ -1,6 +1,7 @@
1
1
  import ProtocolError from "../errors/ProtocolError.js";
2
2
  import getWorkbookWorksheetRange from "../operations/workbookWorksheet/getWorkbookWorksheetRange.js";
3
3
  import { indexesToAddress as cellIndexesToAddress } from "../services/address.js";
4
+ /** Get the last used cell (ie, the most-lower-right) in a given range. */
4
5
  export default async function getRangeLastUsedCell(rangeRef) {
5
6
  // TODO: Consider adding chunking if the range is too large
6
7
  // TODO: Reduce cells returned by using "used range"?
@@ -29,7 +30,7 @@ export default async function getRangeLastUsedCell(rangeRef) {
29
30
  value: cell,
30
31
  address,
31
32
  rowIndex: rowIndex,
32
- columnIndex: columnIndex
33
+ columnIndex: columnIndex,
33
34
  };
34
35
  }
35
36
  }
@@ -11,7 +11,7 @@ import { createWorkbookWorksheetRef, defaultWorkbookWorksheetId } from "../servi
11
11
  import deleteDriveItemWithRetry from "./deleteDriveItemWithRetry.js";
12
12
  import getRangeLastUsedCell from "./getRangeLastUsedCell.js";
13
13
  describe("getRangeLastUsedCell", () => {
14
- it("should return the last used cell value", { timeout: 10000 }, async () => {
14
+ it("should return the last used cell value", async () => {
15
15
  const workbookName = generateTempFileName("xlsx");
16
16
  const workbookPath = driveItemPath(workbookName);
17
17
  const driveRef = getDefaultDriveRef();
@@ -22,8 +22,8 @@ describe("getRangeLastUsedCell", () => {
22
22
  await sequential(updateWorkbookRange(rangeRef, {
23
23
  values: [
24
24
  [1, 2],
25
- [3, 4]
26
- ]
25
+ [3, 4],
26
+ ],
27
27
  }), calculateWorkbook(workbook));
28
28
  const result = await getRangeLastUsedCell(rangeRef);
29
29
  if (result === null) {
@@ -38,7 +38,7 @@ describe("getRangeLastUsedCell", () => {
38
38
  await deleteDriveItemWithRetry(workbook);
39
39
  }
40
40
  });
41
- it("should return the last non-empty cell value when the last cell is empty", { timeout: 10000 }, async () => {
41
+ it("should return the last non-empty cell value when the last cell is empty", async () => {
42
42
  const workbookName = generateTempFileName("xlsx");
43
43
  const workbookPath = driveItemPath(workbookName);
44
44
  const driveRef = getDefaultDriveRef();
@@ -49,8 +49,8 @@ describe("getRangeLastUsedCell", () => {
49
49
  await sequential(updateWorkbookRange(rangeRef, {
50
50
  values: [
51
51
  [1, 2],
52
- [3, null]
53
- ]
52
+ [3, null],
53
+ ],
54
54
  }), calculateWorkbook(workbook));
55
55
  const result = await getRangeLastUsedCell(rangeRef);
56
56
  if (result === null) {
@@ -65,7 +65,7 @@ describe("getRangeLastUsedCell", () => {
65
65
  await deleteDriveItemWithRetry(workbook);
66
66
  }
67
67
  });
68
- it("should return null when no cells are used", { timeout: 10000 }, async () => {
68
+ it("should return null when no cells are used", async () => {
69
69
  const workbookName = generateTempFileName("xlsx");
70
70
  const workbookPath = driveItemPath(workbookName);
71
71
  const driveRef = getDefaultDriveRef();
@@ -76,8 +76,8 @@ describe("getRangeLastUsedCell", () => {
76
76
  await sequential(updateWorkbookRange(rangeRef, {
77
77
  values: [
78
78
  [null, null],
79
- [null, null]
80
- ]
79
+ [null, null],
80
+ ],
81
81
  }), calculateWorkbook(workbook));
82
82
  const result = await getRangeLastUsedCell(rangeRef);
83
83
  expect(result).toBeNull();
@@ -1,4 +1,5 @@
1
1
  import type { WorkbookRangeView } from "@microsoft/microsoft-graph-types";
2
2
  import type { WorkbookTableRef } from "../models/WorkbookTableRef.ts";
3
+ /** Get the visible cells of a workbook table. Ie any hidden cells are omitted. */
3
4
  export declare function getWorkbookTableVisibleBody(tableRef: WorkbookTableRef): Promise<WorkbookRangeView>;
4
5
  //# sourceMappingURL=getWorkbookTableVisibleBody.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"getWorkbookTableVisibleBody.d.ts","sourceRoot":"","sources":["../../src/tasks/getWorkbookTableVisibleBody.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AAC1E,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAItE,wBAAsB,2BAA2B,CAAC,QAAQ,EAAE,gBAAgB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CA2BxG"}
1
+ {"version":3,"file":"getWorkbookTableVisibleBody.d.ts","sourceRoot":"","sources":["../../src/tasks/getWorkbookTableVisibleBody.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AAC1E,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAItE,kFAAkF;AAClF,wBAAsB,2BAA2B,CAAC,QAAQ,EAAE,gBAAgB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAKxG"}
@@ -1,24 +1,8 @@
1
1
  import getWorkbookVisibleRange from "../operations/workbookRange/getWorkbookVisibleRange.js";
2
2
  import getWorkbookTableBodyRange from "../operations/workbookTable/getWorkbookTableBodyRange.js";
3
+ /** Get the visible cells of a workbook table. Ie any hidden cells are omitted. */
3
4
  export async function getWorkbookTableVisibleBody(tableRef) {
4
5
  const range = await getWorkbookTableBodyRange(tableRef);
5
6
  const visibleRange = await getWorkbookVisibleRange(range);
6
7
  return visibleRange;
7
- // TODO: Alternate approach. More performant, but doesn't handle hidden columns yet. Pondering!
8
- // const rows = await listWorkbookTableRows(tableRef);
9
- // const visibleRows: WorkbookTableRow[] = [];
10
- // for (const row of rows) {
11
- // const index = row.index;
12
- // if (index === undefined) {
13
- // throw new ProtocolError("Row index is undefined");
14
- // }
15
- // const rowRange = await getWorkbookWorksheetRange({
16
- // ...tableRef,
17
- // address: workbookRangeAddress(`${index + 1}:${index + 1}`)
18
- // });
19
- // if (!rowRange.rowHidden) {
20
- // visibleRows.push(row);
21
- // }
22
- // }
23
- // return visibleRows;
24
8
  }
@@ -3,98 +3,98 @@ import calculateWorkbook from "../operations/workbook/calculateWorkbook.js";
3
3
  import createWorkbook from "../operations/workbook/createWorkbook.js";
4
4
  import updateWorkbookRange from "../operations/workbookRange/updateWorkbookRange.js";
5
5
  import createWorkbookTable from "../operations/workbookTable/createWorkbookTable.js";
6
- import createWorkbookWorksheet from "../operations/workbookWorksheet/createWorkbookWorksheet.js";
7
6
  import { getDefaultDriveRef } from "../services/drive.js";
8
7
  import { driveItemPath } from "../services/driveItem.js";
9
8
  import { generateTempFileName } from "../services/temporaryFiles.js";
10
9
  import { createWorkbookRangeRef } from "../services/workbookRange.js";
10
+ import { createWorkbookWorksheetRef, defaultWorkbookWorksheetId } from "../services/workbookWorksheet.js";
11
11
  import deleteDriveItemWithRetry from "./deleteDriveItemWithRetry.js";
12
12
  import { getWorkbookTableVisibleBody } from "./getWorkbookTableVisibleBody.js";
13
13
  describe("getWorkbookTableVisibleBody", () => {
14
- it("can retrieve the visible body range of a table", { timeout: 10000 }, async () => {
14
+ it("can retrieve the visible body range of a table", async () => {
15
15
  const workbookName = generateTempFileName("xlsx");
16
16
  const workbookPath = driveItemPath(workbookName);
17
17
  const driveRef = getDefaultDriveRef();
18
18
  const workbook = await createWorkbook(driveRef, workbookPath);
19
19
  try {
20
- const worksheet = await createWorkbookWorksheet(workbook);
21
- const rangeRef = createWorkbookRangeRef(worksheet, "A1:D4");
20
+ const worksheetRef = createWorkbookWorksheetRef(workbook, defaultWorkbookWorksheetId);
21
+ const rangeRef = createWorkbookRangeRef(worksheetRef, "A1:D4");
22
22
  const table = await createWorkbookTable(rangeRef, true);
23
23
  await updateWorkbookRange(rangeRef, {
24
24
  values: [
25
25
  ["Header1", "Header2", "Header3", "Header4"],
26
26
  ["Value1", "Value2", "Value3", "Value4"],
27
27
  ["Value5", "Value6", "Value7", "Value8"],
28
- ["Value9", "Value10", "Value11", "Value12"]
29
- ]
28
+ ["Value9", "Value10", "Value11", "Value12"],
29
+ ],
30
30
  });
31
31
  await calculateWorkbook(workbook);
32
32
  const visibleBodyRange = await getWorkbookTableVisibleBody(table);
33
33
  expect(visibleBodyRange.values).toEqual([
34
34
  ["Value1", "Value2", "Value3", "Value4"],
35
35
  ["Value5", "Value6", "Value7", "Value8"],
36
- ["Value9", "Value10", "Value11", "Value12"]
36
+ ["Value9", "Value10", "Value11", "Value12"],
37
37
  ]);
38
38
  }
39
39
  finally {
40
40
  await deleteDriveItemWithRetry(workbook);
41
41
  }
42
42
  });
43
- it("omits hidden rows from the visible body range of a table", { timeout: 10000 }, async () => {
43
+ it("omits hidden rows from the visible body range of a table", async () => {
44
44
  const workbookName = generateTempFileName("xlsx");
45
45
  const workbookPath = driveItemPath(workbookName);
46
46
  const driveRef = getDefaultDriveRef();
47
47
  const workbook = await createWorkbook(driveRef, workbookPath);
48
48
  try {
49
- const worksheet = await createWorkbookWorksheet(workbook);
50
- const rangeRef = createWorkbookRangeRef(worksheet, "A1:D4");
49
+ const worksheetRef = createWorkbookWorksheetRef(workbook, defaultWorkbookWorksheetId);
50
+ const rangeRef = createWorkbookRangeRef(worksheetRef, "A1:D4");
51
51
  const table = await createWorkbookTable(rangeRef, true);
52
52
  await updateWorkbookRange(rangeRef, {
53
53
  values: [
54
54
  ["Header1", "Header2", "Header3", "Header4"],
55
55
  ["Value1", "Value2", "Value3", "Value4"],
56
56
  ["Value5", "Value6", "Value7", "Value8"],
57
- ["Value9", "Value10", "Value11", "Value12"]
58
- ]
57
+ ["Value9", "Value10", "Value11", "Value12"],
58
+ ],
59
59
  });
60
- const hiddenRange = createWorkbookRangeRef(worksheet, "2:2");
60
+ const hiddenRange = createWorkbookRangeRef(worksheetRef, "2:2");
61
61
  await updateWorkbookRange(hiddenRange, { rowHidden: true });
62
62
  await calculateWorkbook(workbook);
63
63
  const visibleBodyRange = await getWorkbookTableVisibleBody(table);
64
64
  expect(visibleBodyRange.values).toEqual([
65
65
  ["Value5", "Value6", "Value7", "Value8"],
66
- ["Value9", "Value10", "Value11", "Value12"]
66
+ ["Value9", "Value10", "Value11", "Value12"],
67
67
  ]);
68
68
  }
69
69
  finally {
70
70
  await deleteDriveItemWithRetry(workbook);
71
71
  }
72
72
  });
73
- it("omits hidden columns from the visible body range of a table", { timeout: 10000 }, async () => {
73
+ it("omits hidden columns from the visible body range of a table", async () => {
74
74
  const workbookName = generateTempFileName("xlsx");
75
75
  const workbookPath = driveItemPath(workbookName);
76
76
  const driveRef = getDefaultDriveRef();
77
77
  const workbook = await createWorkbook(driveRef, workbookPath);
78
78
  try {
79
- const worksheet = await createWorkbookWorksheet(workbook);
80
- const rangeRef = createWorkbookRangeRef(worksheet, "A1:D4");
79
+ const worksheetRef = createWorkbookWorksheetRef(workbook, defaultWorkbookWorksheetId);
80
+ const rangeRef = createWorkbookRangeRef(worksheetRef, "A1:D4");
81
81
  const table = await createWorkbookTable(rangeRef, true);
82
82
  await updateWorkbookRange(rangeRef, {
83
83
  values: [
84
84
  ["Header1", "Header2", "Header3", "Header4"],
85
85
  ["Value1", "Value2", "Value3", "Value4"],
86
86
  ["Value5", "Value6", "Value7", "Value8"],
87
- ["Value9", "Value10", "Value11", "Value12"]
88
- ]
87
+ ["Value9", "Value10", "Value11", "Value12"],
88
+ ],
89
89
  });
90
- const hiddenRange = createWorkbookRangeRef(worksheet, "B:B");
90
+ const hiddenRange = createWorkbookRangeRef(worksheetRef, "B:B");
91
91
  await updateWorkbookRange(hiddenRange, { columnHidden: true });
92
92
  await calculateWorkbook(workbook);
93
93
  const visibleBodyRange = await getWorkbookTableVisibleBody(table);
94
94
  expect(visibleBodyRange.values).toEqual([
95
95
  ["Value1", "Value3", "Value4"],
96
96
  ["Value5", "Value7", "Value8"],
97
- ["Value9", "Value11", "Value12"]
97
+ ["Value9", "Value11", "Value12"],
98
98
  ]);
99
99
  }
100
100
  finally {
@@ -0,0 +1,6 @@
1
+ import type { WorkbookWorksheet } from "@microsoft/microsoft-graph-types";
2
+ import type { WorkbookRef } from "../models/WorkbookRef.ts";
3
+ import type { WorkbookWorksheetRef } from "../models/WorkbookWorksheetRef.ts";
4
+ /** Get a worksheet by it's name. Throws error if not found. */
5
+ export default function getWorkbookWorksheetByName(workbookRef: WorkbookRef, name: string): Promise<WorkbookWorksheet & WorkbookWorksheetRef>;
6
+ //# sourceMappingURL=getWorkbookWorksheetByName.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getWorkbookWorksheetByName.d.ts","sourceRoot":"","sources":["../../src/tasks/getWorkbookWorksheetByName.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AAE1E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,mCAAmC,CAAC;AAG9E,+DAA+D;AAC/D,wBAA8B,0BAA0B,CAAC,WAAW,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,GAAG,oBAAoB,CAAC,CAUlJ"}
@@ -0,0 +1,12 @@
1
+ import NotFoundError from "../errors/NotFoundError.js";
2
+ import listWorkbookWorksheets from "../operations/workbookWorksheet/listWorkbookWorksheets.js";
3
+ /** Get a worksheet by it's name. Throws error if not found. */
4
+ export default async function getWorkbookWorksheetByName(workbookRef, name) {
5
+ // TODO: More performant to get it by a direct call without listing all workbooks?
6
+ const worksheets = await listWorkbookWorksheets(workbookRef);
7
+ const worksheet = worksheets.find((worksheetRef) => worksheetRef.name === name);
8
+ if (!worksheet) {
9
+ throw new NotFoundError(`Worksheet '${name}' not found.`);
10
+ }
11
+ return worksheet;
12
+ }
@@ -2,7 +2,7 @@ import listWorkbookWorksheets from "../operations/workbookWorksheet/listWorkbook
2
2
  export default async function getWorkbookWorksheetByName(workbookRef, name) {
3
3
  // TODO: Probably can get this from a direct API call without fetching all worksheets
4
4
  const worksheets = await listWorkbookWorksheets(workbookRef);
5
- const worksheet = worksheets.find(worksheetRef => worksheetRef.name === name);
5
+ const worksheet = worksheets.find((worksheetRef) => worksheetRef.name === name);
6
6
  if (!worksheet) {
7
7
  throw new Error(`Worksheet '${name}' not found.`); // TODO: Make NotFoundError
8
8
  }
@@ -0,0 +1,4 @@
1
+ import type { WorkbookRef } from "../models/WorkbookRef.ts";
2
+ /** Safely delete a workbook by first closing any open sessions and then delete with a back-off retry to allow for any outstanding locks to be closed. @see https://github.com/Future-Secure-AI/microsoft-graph/blob/main/docs/lockedWorkbook.md */
3
+ export default function safeDeleteWorkbook(workbookRef: WorkbookRef): Promise<void>;
4
+ //# sourceMappingURL=safeDeleteWorkbook.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"safeDeleteWorkbook.d.ts","sourceRoot":"","sources":["../../src/tasks/safeDeleteWorkbook.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAI5D,mPAAmP;AACnP,wBAA8B,kBAAkB,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAKxF"}
@@ -0,0 +1,9 @@
1
+ import closeWorkbookSession from "../operations/workbookSession/closeWorkbookSession.js";
2
+ import deleteDriveItemWithRetry from "./deleteDriveItemWithRetry.js";
3
+ /** Safely delete a workbook by first closing any open sessions and then delete with a back-off retry to allow for any outstanding locks to be closed. @see https://github.com/Future-Secure-AI/microsoft-graph/blob/main/docs/lockedWorkbook.md */
4
+ export default async function safeDeleteWorkbook(workbookRef) {
5
+ if (workbookRef.sessionId) {
6
+ await closeWorkbookSession(workbookRef);
7
+ }
8
+ await deleteDriveItemWithRetry(workbookRef);
9
+ }
@@ -1,3 +1,4 @@
1
1
  import type { WorkbookRangeRef } from "../models/WorkbookRangeRef.ts";
2
+ /** Hide or show one or more columns. */
2
3
  export default function setColumnHidden(rangeRef: WorkbookRangeRef, hidden: boolean): Promise<void>;
3
4
  //# sourceMappingURL=setColumnHidden.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"setColumnHidden.d.ts","sourceRoot":"","sources":["../../src/tasks/setColumnHidden.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAGtE,wBAA8B,eAAe,CAAC,QAAQ,EAAE,gBAAgB,EAAE,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAIxG"}
1
+ {"version":3,"file":"setColumnHidden.d.ts","sourceRoot":"","sources":["../../src/tasks/setColumnHidden.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAGtE,wCAAwC;AACxC,wBAA8B,eAAe,CAAC,QAAQ,EAAE,gBAAgB,EAAE,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAIxG"}
@@ -1,7 +1,7 @@
1
1
  import updateWorkbookRange from "../operations/workbookRange/updateWorkbookRange.js";
2
+ /** Hide or show one or more columns. */
2
3
  export default async function setColumnHidden(rangeRef, hidden) {
3
4
  await updateWorkbookRange(rangeRef, {
4
- columnHidden: hidden
5
+ columnHidden: hidden,
5
6
  });
6
7
  }
7
- ;
@@ -4,14 +4,14 @@ import createWorkbook from "../operations/workbook/createWorkbook.js";
4
4
  import getWorkbookVisibleRange from "../operations/workbookRange/getWorkbookVisibleRange.js";
5
5
  import updateWorkbookRange from "../operations/workbookRange/updateWorkbookRange.js";
6
6
  import { getDefaultDriveRef } from "../services/drive.js";
7
- import { driveItemPath, } from "../services/driveItem.js";
7
+ import { driveItemPath } from "../services/driveItem.js";
8
8
  import { generateTempFileName } from "../services/temporaryFiles.js";
9
9
  import { createWorkbookRangeRef } from "../services/workbookRange.js";
10
10
  import { createWorkbookWorksheetRef, defaultWorkbookWorksheetId } from "../services/workbookWorksheet.js";
11
11
  import deleteDriveItemWithRetry from "./deleteDriveItemWithRetry.js";
12
12
  import setColumnHidden from "./setColumnHidden.js";
13
13
  describe("setColumnHidden", () => {
14
- it("hides a column in an existing workbook", { timeout: 10000 }, async () => {
14
+ it("hides a column in an existing workbook", async () => {
15
15
  const workbookName = generateTempFileName("xlsx");
16
16
  const workbookPath = driveItemPath(workbookName);
17
17
  const driveRef = getDefaultDriveRef();
@@ -23,8 +23,8 @@ describe("setColumnHidden", () => {
23
23
  values: [
24
24
  [1, 2, 3],
25
25
  [4, 5, 6],
26
- [7, 8, 9]
27
- ]
26
+ [7, 8, 9],
27
+ ],
28
28
  });
29
29
  const hiddenRange = createWorkbookRangeRef(worksheetRef, "B:B");
30
30
  await setColumnHidden(hiddenRange, true);
@@ -33,7 +33,7 @@ describe("setColumnHidden", () => {
33
33
  expect(visibleView.values).toEqual([
34
34
  [1, 3],
35
35
  [4, 6],
36
- [7, 9]
36
+ [7, 9],
37
37
  ]);
38
38
  }
39
39
  finally {
@@ -1,3 +1,4 @@
1
1
  import type { WorkbookRangeRef } from "../models/WorkbookRangeRef.ts";
2
+ /** Hide or show one or more rows. */
2
3
  export default function setRowHidden(rangeRef: WorkbookRangeRef, hidden: boolean): Promise<void>;
3
4
  //# sourceMappingURL=setRowHidden.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"setRowHidden.d.ts","sourceRoot":"","sources":["../../src/tasks/setRowHidden.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAGtE,wBAA8B,YAAY,CAAC,QAAQ,EAAE,gBAAgB,EAAE,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAIrG"}
1
+ {"version":3,"file":"setRowHidden.d.ts","sourceRoot":"","sources":["../../src/tasks/setRowHidden.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAGtE,qCAAqC;AACrC,wBAA8B,YAAY,CAAC,QAAQ,EAAE,gBAAgB,EAAE,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAIrG"}
@@ -1,7 +1,7 @@
1
1
  import updateWorkbookRange from "../operations/workbookRange/updateWorkbookRange.js";
2
+ /** Hide or show one or more rows. */
2
3
  export default async function setRowHidden(rangeRef, hidden) {
3
4
  await updateWorkbookRange(rangeRef, {
4
- rowHidden: hidden
5
+ rowHidden: hidden,
5
6
  });
6
7
  }
7
- ;
@@ -4,14 +4,14 @@ import createWorkbook from "../operations/workbook/createWorkbook.js";
4
4
  import getWorkbookVisibleRange from "../operations/workbookRange/getWorkbookVisibleRange.js";
5
5
  import updateWorkbookRange from "../operations/workbookRange/updateWorkbookRange.js";
6
6
  import { getDefaultDriveRef } from "../services/drive.js";
7
- import { driveItemPath, } from "../services/driveItem.js";
7
+ import { driveItemPath } from "../services/driveItem.js";
8
8
  import { generateTempFileName } from "../services/temporaryFiles.js";
9
9
  import { createWorkbookRangeRef } from "../services/workbookRange.js";
10
10
  import { createWorkbookWorksheetRef, defaultWorkbookWorksheetId } from "../services/workbookWorksheet.js";
11
11
  import deleteDriveItemWithRetry from "./deleteDriveItemWithRetry.js";
12
12
  import setRowHidden from "./setRowHidden.js";
13
13
  describe("setRowHidden", () => {
14
- it("hides a row in an existing workbook", { timeout: 10000 }, async () => {
14
+ it("hides a row in an existing workbook", async () => {
15
15
  const workbookName = generateTempFileName("xlsx");
16
16
  const workbookPath = driveItemPath(workbookName);
17
17
  const driveRef = getDefaultDriveRef();
@@ -23,8 +23,8 @@ describe("setRowHidden", () => {
23
23
  values: [
24
24
  [1, 2, 3],
25
25
  [4, 5, 6],
26
- [7, 8, 9]
27
- ]
26
+ [7, 8, 9],
27
+ ],
28
28
  });
29
29
  const hiddenRange = createWorkbookRangeRef(worksheetRef, "2:2");
30
30
  await setRowHidden(hiddenRange, true);
@@ -32,7 +32,7 @@ describe("setRowHidden", () => {
32
32
  const visibleView = await getWorkbookVisibleRange(rangeRef);
33
33
  expect(visibleView.values).toEqual([
34
34
  [1, 2, 3],
35
- [7, 8, 9]
35
+ [7, 8, 9],
36
36
  ]);
37
37
  }
38
38
  finally {
@@ -0,0 +1,2 @@
1
+ # "The resource you are attempting to access is locked"
2
+ If you attempt to delete a workbook you may occasionally get this error. To mitigate this call [`safeDeleteWorkbook`](/src/tasks/safeDeleteWorkbook.ts) instead of `deleteDriveItem`. It will attempt to close any active session first, and then delete with a retry in case it takes some time for the lock to be removed.
@@ -0,0 +1,9 @@
1
+ # Pivot Tables
2
+
3
+ As of the time of writing, the Graph API does not support creating or modifying pivot tables. Consequently, this SDK does not include pivot table support. Additionally, most Excel manipulation libraries do not provide robust support for pivot tables. If you require pivot table functionality, your options are limited to the following:
4
+
5
+ * **Use a pre-designed template**: Create an Excel template with a pivot table, upload it to SharePoint (possibly using this SDK), and modify it using the Graph API.
6
+ * **Explore specialized Excel libraries**: Some commercial Excel libraries offer pivot table support, but they typically require a paid license.
7
+ * **Manually edit the workbook's XML**: This involves directly manipulating the XML structure of the workbook locally.
8
+
9
+ In summary: There are no straightforward solutions for working with pivot tables via the Graph API or this SDK. If possible, it is recommended to avoid relying on pivot tables.
@@ -0,0 +1,3 @@
1
+ # Request retrying
2
+
3
+ [GraphAPI has unmerciful throttling limits](https://learn.microsoft.com/en-us/graph/throttling). If the rate of requests exceed it's predefined limits it will reject requests with a HTTP 429. It appears there are general limits, and then more restrictive limits applied to workbook manipulation. To cater for these limits. This library supports retrying. If a request is throttled, and GraphAPI has provided a retry time, then the library will honour that request and retry automatically. Nothing needs to be done when consuming the library.
package/package.json CHANGED
@@ -1,11 +1,12 @@
1
1
  {
2
2
  "name": "microsoft-graph",
3
- "version": "2.1.0",
3
+ "version": "2.2.1",
4
4
  "description": "Microsoft GraphAPI SDK for NodeJS",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
7
7
  "scripts": {
8
8
  "check": "biome check",
9
+ "fix": "biome check --fix",
9
10
  "build": "npm run check && tsc && npx tsx update-exports.ts",
10
11
  "release": "npm run build && npm publish --access public",
11
12
  "test": "vitest --bail=3"
@@ -66,6 +67,14 @@
66
67
  "import": "./dist/errors/InvalidArgumentError.js",
67
68
  "types": "./dist/errors/InvalidArgumentError.d.ts"
68
69
  },
70
+ "./errors/NeverError": {
71
+ "import": "./dist/errors/NeverError.js",
72
+ "types": "./dist/errors/NeverError.d.ts"
73
+ },
74
+ "./errors/NotFoundError": {
75
+ "import": "./dist/errors/NotFoundError.js",
76
+ "types": "./dist/errors/NotFoundError.d.ts"
77
+ },
69
78
  "./errors/ProtocolError": {
70
79
  "import": "./dist/errors/ProtocolError.js",
71
80
  "types": "./dist/errors/ProtocolError.d.ts"
@@ -966,10 +975,18 @@
966
975
  "import": "./dist/tasks/getWorkbookTableVisibleBody.js",
967
976
  "types": "./dist/tasks/getWorkbookTableVisibleBody.d.ts"
968
977
  },
978
+ "./tasks/getWorkbookWorksheetByName": {
979
+ "import": "./dist/tasks/getWorkbookWorksheetByName.js",
980
+ "types": "./dist/tasks/getWorkbookWorksheetByName.d.ts"
981
+ },
969
982
  "./tasks/getWorkbookWorksheetRefByName": {
970
983
  "import": "./dist/tasks/getWorkbookWorksheetRefByName.js",
971
984
  "types": "./dist/tasks/getWorkbookWorksheetRefByName.d.ts"
972
985
  },
986
+ "./tasks/safeDeleteWorkbook": {
987
+ "import": "./dist/tasks/safeDeleteWorkbook.js",
988
+ "types": "./dist/tasks/safeDeleteWorkbook.d.ts"
989
+ },
973
990
  "./tasks/setColumnHidden": {
974
991
  "import": "./dist/tasks/setColumnHidden.js",
975
992
  "types": "./dist/tasks/setColumnHidden.d.ts"