@mustafaaksoy41/sharepoint-kit 0.1.2

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 (42) hide show
  1. package/README.md +293 -0
  2. package/dist/bin/sp-generate-types.js +784 -0
  3. package/dist/bin/sp-generate-types.js.map +1 -0
  4. package/dist/chunk-2FU6XS6S.cjs +142 -0
  5. package/dist/chunk-2FU6XS6S.cjs.map +1 -0
  6. package/dist/chunk-MLY32NZB.js +131 -0
  7. package/dist/chunk-MLY32NZB.js.map +1 -0
  8. package/dist/chunk-V6K5IFVV.cjs +253 -0
  9. package/dist/chunk-V6K5IFVV.cjs.map +1 -0
  10. package/dist/chunk-VOGWZXJY.js +246 -0
  11. package/dist/chunk-VOGWZXJY.js.map +1 -0
  12. package/dist/cli/index.cjs +516 -0
  13. package/dist/cli/index.cjs.map +1 -0
  14. package/dist/cli/index.d.cts +117 -0
  15. package/dist/cli/index.d.ts +117 -0
  16. package/dist/cli/index.js +505 -0
  17. package/dist/cli/index.js.map +1 -0
  18. package/dist/components/index.cjs +509 -0
  19. package/dist/components/index.cjs.map +1 -0
  20. package/dist/components/index.d.cts +118 -0
  21. package/dist/components/index.d.ts +118 -0
  22. package/dist/components/index.js +494 -0
  23. package/dist/components/index.js.map +1 -0
  24. package/dist/config-loader-Nbidwviq.d.cts +33 -0
  25. package/dist/config-loader-Nbidwviq.d.ts +33 -0
  26. package/dist/hooks/index.cjs +45 -0
  27. package/dist/hooks/index.cjs.map +1 -0
  28. package/dist/hooks/index.d.cts +51 -0
  29. package/dist/hooks/index.d.ts +51 -0
  30. package/dist/hooks/index.js +24 -0
  31. package/dist/hooks/index.js.map +1 -0
  32. package/dist/index.cjs +32 -0
  33. package/dist/index.cjs.map +1 -0
  34. package/dist/index.d.cts +32 -0
  35. package/dist/index.d.ts +32 -0
  36. package/dist/index.js +3 -0
  37. package/dist/index.js.map +1 -0
  38. package/dist/sp-client-A9dM9oYp.d.ts +31 -0
  39. package/dist/sp-client-DTChApOB.d.cts +31 -0
  40. package/dist/types-Dk0jbejG.d.cts +108 -0
  41. package/dist/types-Dk0jbejG.d.ts +108 -0
  42. package/package.json +123 -0
@@ -0,0 +1,253 @@
1
+ 'use strict';
2
+
3
+ // src/client/errors.ts
4
+ var SpError = class extends Error {
5
+ constructor(message, status, code, requestId = "") {
6
+ super(message);
7
+ this.name = "SpError";
8
+ this.status = status;
9
+ this.code = code;
10
+ this.requestId = requestId;
11
+ }
12
+ toJSON() {
13
+ return {
14
+ name: this.name,
15
+ message: this.message,
16
+ status: this.status,
17
+ code: this.code,
18
+ requestId: this.requestId
19
+ };
20
+ }
21
+ };
22
+ var SpAuthError = class extends SpError {
23
+ constructor(message, status = 401, requestId = "") {
24
+ super(message, status, "AuthenticationError", requestId);
25
+ this.name = "SpAuthError";
26
+ }
27
+ };
28
+ var SpNotFoundError = class extends SpError {
29
+ constructor(message, requestId = "") {
30
+ super(message, 404, "ItemNotFound", requestId);
31
+ this.name = "SpNotFoundError";
32
+ }
33
+ };
34
+ var SpThrottleError = class extends SpError {
35
+ constructor(message, retryAfter = 0, requestId = "") {
36
+ super(message, 429, "TooManyRequests", requestId);
37
+ this.name = "SpThrottleError";
38
+ this.retryAfter = retryAfter;
39
+ }
40
+ };
41
+ var SpValidationError = class extends SpError {
42
+ constructor(message, fieldErrors = {}, requestId = "") {
43
+ super(message, 400, "ValidationError", requestId);
44
+ this.name = "SpValidationError";
45
+ this.fieldErrors = fieldErrors;
46
+ }
47
+ };
48
+ function parseGraphError(status, body, retryAfterHeader) {
49
+ const { error } = body;
50
+ const requestId = error.innerError?.["request-id"] ?? "";
51
+ const message = error.message || "Unknown SharePoint error";
52
+ const code = error.code || "UnknownError";
53
+ if (status === 401 || status === 403) {
54
+ return new SpAuthError(message, status, requestId);
55
+ }
56
+ if (status === 404) {
57
+ return new SpNotFoundError(message, requestId);
58
+ }
59
+ if (status === 429) {
60
+ const retryAfter = retryAfterHeader ? parseInt(retryAfterHeader, 10) : 0;
61
+ return new SpThrottleError(message, retryAfter, requestId);
62
+ }
63
+ if (status === 400) {
64
+ return new SpValidationError(message, {}, requestId);
65
+ }
66
+ return new SpError(message, status, code, requestId);
67
+ }
68
+
69
+ // src/client/utils.ts
70
+ var GRAPH_BASE = "https://graph.microsoft.com/v1.0";
71
+ function buildGraphUrl(siteId, ...segments) {
72
+ const path = segments.filter(Boolean).join("/");
73
+ return `${GRAPH_BASE}/sites/${siteId}/${path}`;
74
+ }
75
+ function buildFilterQuery(contentTypeName, additionalFilter) {
76
+ const parts = [];
77
+ if (contentTypeName) {
78
+ parts.push(`fields/ContentType/Name eq '${contentTypeName}'`);
79
+ }
80
+ if (additionalFilter) {
81
+ parts.push(additionalFilter);
82
+ }
83
+ return parts.join(" and ");
84
+ }
85
+ function sleep(ms) {
86
+ return new Promise((resolve) => setTimeout(resolve, ms));
87
+ }
88
+ function calculateBackoff(attempt, baseDelay = 1e3, maxDelay = 3e4) {
89
+ const delay = Math.min(baseDelay * Math.pow(2, attempt), maxDelay);
90
+ const jitter = delay * 0.1 * Math.random();
91
+ return delay + jitter;
92
+ }
93
+
94
+ // src/client/sp-client.ts
95
+ var DEFAULT_RETRY = {
96
+ maxRetries: 3,
97
+ baseDelay: 1e3,
98
+ maxDelay: 3e4
99
+ };
100
+ function createSpClient(config) {
101
+ const { siteId, getAccessToken } = config;
102
+ const retryOpts = { ...DEFAULT_RETRY, ...config.retryOptions };
103
+ async function request(url, options = {}) {
104
+ let lastError = null;
105
+ for (let attempt = 0; attempt <= retryOpts.maxRetries; attempt++) {
106
+ const token = await getAccessToken();
107
+ const response = await fetch(url, {
108
+ ...options,
109
+ headers: {
110
+ Authorization: `Bearer ${token}`,
111
+ "Content-Type": "application/json",
112
+ ...options.headers
113
+ }
114
+ });
115
+ if (response.ok) {
116
+ if (response.status === 204) {
117
+ return void 0;
118
+ }
119
+ return await response.json();
120
+ }
121
+ const body = await response.json().catch(() => ({
122
+ error: { code: "UnknownError", message: response.statusText }
123
+ }));
124
+ const error = parseGraphError(
125
+ response.status,
126
+ body,
127
+ response.headers.get("Retry-After")
128
+ );
129
+ if (error instanceof SpThrottleError && attempt < retryOpts.maxRetries) {
130
+ const waitTime = error.retryAfter ? error.retryAfter * 1e3 : calculateBackoff(attempt, retryOpts.baseDelay, retryOpts.maxDelay);
131
+ await sleep(waitTime);
132
+ lastError = error;
133
+ continue;
134
+ }
135
+ throw error;
136
+ }
137
+ throw lastError ?? new Error("Max retries exceeded");
138
+ }
139
+ return {
140
+ async getListItems(options) {
141
+ const { listId, contentTypeName, filter, select, expand, orderBy, top, skip } = options;
142
+ const params = new URLSearchParams();
143
+ const filterQuery = buildFilterQuery(contentTypeName, filter);
144
+ if (filterQuery) params.set("$filter", filterQuery);
145
+ if (select?.length) params.set("$select", select.join(","));
146
+ if (expand?.length) params.set("$expand", expand.join(","));
147
+ if (orderBy) params.set("$orderby", orderBy);
148
+ if (top) params.set("$top", String(top));
149
+ if (skip) params.set("$skip", String(skip));
150
+ const queryString = params.toString();
151
+ const url = buildGraphUrl(siteId, "lists", listId, "items") + (queryString ? `?expand=fields&${queryString}` : "?expand=fields");
152
+ const response = await request(url);
153
+ return response.value.map((item) => ({
154
+ id: item.id,
155
+ fields: item.fields,
156
+ contentType: item.fields.ContentType ? { id: "", name: item.fields.ContentType.Name } : void 0,
157
+ createdDateTime: item.createdDateTime,
158
+ lastModifiedDateTime: item.lastModifiedDateTime,
159
+ createdBy: item.createdBy,
160
+ lastModifiedBy: item.lastModifiedBy,
161
+ webUrl: item.webUrl
162
+ }));
163
+ },
164
+ async getItem(options) {
165
+ const { listId, itemId, select, expand } = options;
166
+ const params = new URLSearchParams();
167
+ if (select?.length) params.set("$select", select.join(","));
168
+ if (expand?.length) params.set("$expand", expand.join(","));
169
+ const queryString = params.toString();
170
+ const url = buildGraphUrl(siteId, "lists", listId, "items", itemId) + (queryString ? `?expand=fields&${queryString}` : "?expand=fields");
171
+ const item = await request(url);
172
+ return {
173
+ id: item.id,
174
+ fields: item.fields,
175
+ createdDateTime: item.createdDateTime,
176
+ lastModifiedDateTime: item.lastModifiedDateTime
177
+ };
178
+ },
179
+ async createItem(options) {
180
+ const { listId, fields, contentTypeId } = options;
181
+ const url = buildGraphUrl(siteId, "lists", listId, "items");
182
+ const body = { fields };
183
+ if (contentTypeId) {
184
+ body.fields["ContentType@odata.type"] = contentTypeId;
185
+ }
186
+ const item = await request(url, {
187
+ method: "POST",
188
+ body: JSON.stringify(body)
189
+ });
190
+ return { id: item.id, fields: item.fields };
191
+ },
192
+ async updateItem(options) {
193
+ const { listId, itemId, fields } = options;
194
+ const url = buildGraphUrl(siteId, "lists", listId, "items", itemId, "fields");
195
+ const updatedFields = await request(url, {
196
+ method: "PATCH",
197
+ body: JSON.stringify(fields)
198
+ });
199
+ return { id: itemId, fields: updatedFields };
200
+ },
201
+ async deleteItem(options) {
202
+ const { listId, itemId } = options;
203
+ const url = buildGraphUrl(siteId, "lists", listId, "items", itemId);
204
+ await request(url, { method: "DELETE" });
205
+ },
206
+ async getSites(options) {
207
+ const params = new URLSearchParams();
208
+ if (options?.search) params.set("search", options.search);
209
+ const queryString = params.toString();
210
+ const url = `https://graph.microsoft.com/v1.0/sites${queryString ? `?${queryString}` : ""}`;
211
+ const response = await request(url);
212
+ return response.value;
213
+ },
214
+ async getLists() {
215
+ const url = buildGraphUrl(siteId, "lists");
216
+ const response = await request(url);
217
+ return response.value;
218
+ },
219
+ async getList(options) {
220
+ const url = buildGraphUrl(siteId, "lists", options.listId);
221
+ return request(url);
222
+ },
223
+ async getContentTypes(options) {
224
+ const url = options?.listId ? buildGraphUrl(siteId, "lists", options.listId, "contentTypes") : buildGraphUrl(siteId, "contentTypes");
225
+ const response = await request(url);
226
+ return response.value;
227
+ },
228
+ async getListContentTypes(options) {
229
+ const url = buildGraphUrl(siteId, "lists", options.listId, "contentTypes");
230
+ const response = await request(url);
231
+ return response.value;
232
+ },
233
+ async getColumns(options) {
234
+ const url = buildGraphUrl(siteId, "contentTypes", options.contentTypeId, "columns");
235
+ const response = await request(url);
236
+ return response.value;
237
+ },
238
+ async getListColumns(options) {
239
+ const url = buildGraphUrl(siteId, "lists", options.listId, "columns");
240
+ const response = await request(url);
241
+ return response.value;
242
+ }
243
+ };
244
+ }
245
+
246
+ exports.SpAuthError = SpAuthError;
247
+ exports.SpError = SpError;
248
+ exports.SpNotFoundError = SpNotFoundError;
249
+ exports.SpThrottleError = SpThrottleError;
250
+ exports.SpValidationError = SpValidationError;
251
+ exports.createSpClient = createSpClient;
252
+ //# sourceMappingURL=chunk-V6K5IFVV.cjs.map
253
+ //# sourceMappingURL=chunk-V6K5IFVV.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/client/errors.ts","../src/client/utils.ts","../src/client/sp-client.ts"],"names":[],"mappings":"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","file":"chunk-V6K5IFVV.cjs","sourcesContent":["import type { GraphErrorResponse } from './types.js';\n\nexport class SpError extends Error {\n public readonly status: number;\n public readonly code: string;\n public readonly requestId: string;\n\n constructor(message: string, status: number, code: string, requestId: string = '') {\n super(message);\n this.name = 'SpError';\n this.status = status;\n this.code = code;\n this.requestId = requestId;\n }\n\n toJSON() {\n return {\n name: this.name,\n message: this.message,\n status: this.status,\n code: this.code,\n requestId: this.requestId,\n };\n }\n}\n\nexport class SpAuthError extends SpError {\n constructor(message: string, status: number = 401, requestId: string = '') {\n super(message, status, 'AuthenticationError', requestId);\n this.name = 'SpAuthError';\n }\n}\n\nexport class SpNotFoundError extends SpError {\n constructor(message: string, requestId: string = '') {\n super(message, 404, 'ItemNotFound', requestId);\n this.name = 'SpNotFoundError';\n }\n}\n\nexport class SpThrottleError extends SpError {\n public readonly retryAfter: number;\n\n constructor(message: string, retryAfter: number = 0, requestId: string = '') {\n super(message, 429, 'TooManyRequests', requestId);\n this.name = 'SpThrottleError';\n this.retryAfter = retryAfter;\n }\n}\n\nexport class SpValidationError extends SpError {\n public readonly fieldErrors: Record<string, string>;\n\n constructor(\n message: string,\n fieldErrors: Record<string, string> = {},\n requestId: string = '',\n ) {\n super(message, 400, 'ValidationError', requestId);\n this.name = 'SpValidationError';\n this.fieldErrors = fieldErrors;\n }\n}\n\nexport function parseGraphError(status: number, body: GraphErrorResponse, retryAfterHeader?: string | null): SpError {\n const { error } = body;\n const requestId = error.innerError?.['request-id'] ?? '';\n const message = error.message || 'Unknown SharePoint error';\n const code = error.code || 'UnknownError';\n\n if (status === 401 || status === 403) {\n return new SpAuthError(message, status, requestId);\n }\n\n if (status === 404) {\n return new SpNotFoundError(message, requestId);\n }\n\n if (status === 429) {\n const retryAfter = retryAfterHeader ? parseInt(retryAfterHeader, 10) : 0;\n return new SpThrottleError(message, retryAfter, requestId);\n }\n\n if (status === 400) {\n return new SpValidationError(message, {}, requestId);\n }\n\n return new SpError(message, status, code, requestId);\n}\n","const GRAPH_BASE = 'https://graph.microsoft.com/v1.0';\n\nexport function buildGraphUrl(siteId: string, ...segments: string[]): string {\n const path = segments.filter(Boolean).join('/');\n return `${GRAPH_BASE}/sites/${siteId}/${path}`;\n}\n\nexport function encodeFieldName(name: string): string {\n return name\n .replace(/ /g, '_x0020_')\n .replace(/ü/g, '_x00fc_')\n .replace(/ş/g, '_x015f_')\n .replace(/ı/g, '_x0131_')\n .replace(/ö/g, '_x00f6_')\n .replace(/ç/g, '_x00e7_')\n .replace(/ğ/g, '_x011f_')\n .replace(/Ü/g, '_x00dc_')\n .replace(/Ş/g, '_x015e_')\n .replace(/İ/g, '_x0130_')\n .replace(/Ö/g, '_x00d6_')\n .replace(/Ç/g, '_x00c7_')\n .replace(/Ğ/g, '_x011e_');\n}\n\nexport function decodeFieldName(encoded: string): string {\n return encoded\n .replace(/_x0020_/g, ' ')\n .replace(/_x00fc_/g, 'ü')\n .replace(/_x015f_/g, 'ş')\n .replace(/_x0131_/g, 'ı')\n .replace(/_x00f6_/g, 'ö')\n .replace(/_x00e7_/g, 'ç')\n .replace(/_x011f_/g, 'ğ')\n .replace(/_x00dc_/g, 'Ü')\n .replace(/_x015e_/g, 'Ş')\n .replace(/_x0130_/g, 'İ')\n .replace(/_x00d6_/g, 'Ö')\n .replace(/_x00c7_/g, 'Ç')\n .replace(/_x011e_/g, 'Ğ');\n}\n\nexport function buildFilterQuery(contentTypeName?: string, additionalFilter?: string): string {\n const parts: string[] = [];\n\n if (contentTypeName) {\n parts.push(`fields/ContentType/Name eq '${contentTypeName}'`);\n }\n\n if (additionalFilter) {\n parts.push(additionalFilter);\n }\n\n return parts.join(' and ');\n}\n\nexport function sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport function calculateBackoff(attempt: number, baseDelay: number = 1000, maxDelay: number = 30000): number {\n const delay = Math.min(baseDelay * Math.pow(2, attempt), maxDelay);\n const jitter = delay * 0.1 * Math.random();\n return delay + jitter;\n}\n","import type {\n SpClientConfig,\n SpListItem,\n SpList,\n SpSite,\n SpContentType,\n SpColumn,\n GetListItemsOptions,\n GetItemOptions,\n CreateItemOptions,\n UpdateItemOptions,\n DeleteItemOptions,\n GraphListResponse,\n GraphErrorResponse,\n RetryOptions,\n} from './types.js';\nimport { parseGraphError, SpThrottleError } from './errors.js';\nimport { buildGraphUrl, buildFilterQuery, sleep, calculateBackoff } from './utils.js';\n\nconst DEFAULT_RETRY: Required<RetryOptions> = {\n maxRetries: 3,\n baseDelay: 1000,\n maxDelay: 30000,\n};\n\ninterface SpClient {\n getListItems<T extends Record<string, unknown> = Record<string, unknown>>(\n options: GetListItemsOptions,\n ): Promise<SpListItem<T>[]>;\n\n getItem<T extends Record<string, unknown> = Record<string, unknown>>(\n options: GetItemOptions,\n ): Promise<SpListItem<T>>;\n\n createItem<T extends Record<string, unknown> = Record<string, unknown>>(\n options: CreateItemOptions<T>,\n ): Promise<SpListItem<T>>;\n\n updateItem<T extends Record<string, unknown> = Record<string, unknown>>(\n options: UpdateItemOptions<T>,\n ): Promise<SpListItem<T>>;\n\n deleteItem(options: DeleteItemOptions): Promise<void>;\n\n getSites(options?: { search?: string }): Promise<SpSite[]>;\n getLists(): Promise<SpList[]>;\n getList(options: { listId: string }): Promise<SpList>;\n getContentTypes(options?: { listId?: string }): Promise<SpContentType[]>;\n getListContentTypes(options: { listId: string }): Promise<SpContentType[]>;\n getColumns(options: { contentTypeId: string }): Promise<SpColumn[]>;\n getListColumns(options: { listId: string }): Promise<SpColumn[]>;\n}\n\nexport function createSpClient(config: SpClientConfig): SpClient {\n const { siteId, getAccessToken } = config;\n const retryOpts = { ...DEFAULT_RETRY, ...config.retryOptions };\n\n async function request<R>(url: string, options: RequestInit = {}): Promise<R> {\n let lastError: Error | null = null;\n\n for (let attempt = 0; attempt <= retryOpts.maxRetries; attempt++) {\n const token = await getAccessToken();\n\n const response = await fetch(url, {\n ...options,\n headers: {\n Authorization: `Bearer ${token}`,\n 'Content-Type': 'application/json',\n ...options.headers,\n },\n });\n\n if (response.ok) {\n if (response.status === 204) {\n return undefined as R;\n }\n return (await response.json()) as R;\n }\n\n const body = (await response.json().catch(() => ({\n error: { code: 'UnknownError', message: response.statusText },\n }))) as GraphErrorResponse;\n\n const error = parseGraphError(\n response.status,\n body,\n response.headers.get('Retry-After'),\n );\n\n if (error instanceof SpThrottleError && attempt < retryOpts.maxRetries) {\n const waitTime = error.retryAfter\n ? error.retryAfter * 1000\n : calculateBackoff(attempt, retryOpts.baseDelay, retryOpts.maxDelay);\n await sleep(waitTime);\n lastError = error;\n continue;\n }\n\n throw error;\n }\n\n throw lastError ?? new Error('Max retries exceeded');\n }\n\n return {\n async getListItems<T extends Record<string, unknown>>(\n options: GetListItemsOptions,\n ): Promise<SpListItem<T>[]> {\n const { listId, contentTypeName, filter, select, expand, orderBy, top, skip } = options;\n const params = new URLSearchParams();\n\n const filterQuery = buildFilterQuery(contentTypeName, filter);\n if (filterQuery) params.set('$filter', filterQuery);\n if (select?.length) params.set('$select', select.join(','));\n if (expand?.length) params.set('$expand', expand.join(','));\n if (orderBy) params.set('$orderby', orderBy);\n if (top) params.set('$top', String(top));\n if (skip) params.set('$skip', String(skip));\n\n const queryString = params.toString();\n const url = buildGraphUrl(siteId, 'lists', listId, 'items') +\n (queryString ? `?expand=fields&${queryString}` : '?expand=fields');\n\n const response = await request<GraphListResponse<T>>(url);\n\n return response.value.map((item) => ({\n id: item.id,\n fields: item.fields,\n contentType: item.fields.ContentType\n ? { id: '', name: item.fields.ContentType.Name }\n : undefined,\n createdDateTime: item.createdDateTime,\n lastModifiedDateTime: item.lastModifiedDateTime,\n createdBy: item.createdBy,\n lastModifiedBy: item.lastModifiedBy,\n webUrl: item.webUrl,\n }));\n },\n\n async getItem<T extends Record<string, unknown>>(\n options: GetItemOptions,\n ): Promise<SpListItem<T>> {\n const { listId, itemId, select, expand } = options;\n const params = new URLSearchParams();\n\n if (select?.length) params.set('$select', select.join(','));\n if (expand?.length) params.set('$expand', expand.join(','));\n\n const queryString = params.toString();\n const url = buildGraphUrl(siteId, 'lists', listId, 'items', itemId) +\n (queryString ? `?expand=fields&${queryString}` : '?expand=fields');\n\n const item = await request<{\n id: string;\n fields: T;\n createdDateTime?: string;\n lastModifiedDateTime?: string;\n }>(url);\n\n return {\n id: item.id,\n fields: item.fields,\n createdDateTime: item.createdDateTime,\n lastModifiedDateTime: item.lastModifiedDateTime,\n };\n },\n\n async createItem<T extends Record<string, unknown>>(\n options: CreateItemOptions<T>,\n ): Promise<SpListItem<T>> {\n const { listId, fields, contentTypeId } = options;\n const url = buildGraphUrl(siteId, 'lists', listId, 'items');\n\n const body: Record<string, unknown> = { fields };\n if (contentTypeId) {\n (body.fields as Record<string, unknown>)['ContentType@odata.type'] = contentTypeId;\n }\n\n const item = await request<{ id: string; fields: T }>(url, {\n method: 'POST',\n body: JSON.stringify(body),\n });\n\n return { id: item.id, fields: item.fields };\n },\n\n async updateItem<T extends Record<string, unknown>>(\n options: UpdateItemOptions<T>,\n ): Promise<SpListItem<T>> {\n const { listId, itemId, fields } = options;\n const url = buildGraphUrl(siteId, 'lists', listId, 'items', itemId, 'fields');\n\n const updatedFields = await request<T>(url, {\n method: 'PATCH',\n body: JSON.stringify(fields),\n });\n\n return { id: itemId, fields: updatedFields };\n },\n\n async deleteItem(options: DeleteItemOptions): Promise<void> {\n const { listId, itemId } = options;\n const url = buildGraphUrl(siteId, 'lists', listId, 'items', itemId);\n\n await request<void>(url, { method: 'DELETE' });\n },\n\n async getSites(options?: { search?: string }): Promise<SpSite[]> {\n const params = new URLSearchParams();\n if (options?.search) params.set('search', options.search);\n\n const queryString = params.toString();\n const url = `https://graph.microsoft.com/v1.0/sites${queryString ? `?${queryString}` : ''}`;\n\n const response = await request<{ value: SpSite[] }>(url);\n return response.value;\n },\n\n async getLists(): Promise<SpList[]> {\n const url = buildGraphUrl(siteId, 'lists');\n const response = await request<{ value: SpList[] }>(url);\n return response.value;\n },\n\n async getList(options: { listId: string }): Promise<SpList> {\n const url = buildGraphUrl(siteId, 'lists', options.listId);\n return request<SpList>(url);\n },\n\n async getContentTypes(options?: { listId?: string }): Promise<SpContentType[]> {\n const url = options?.listId\n ? buildGraphUrl(siteId, 'lists', options.listId, 'contentTypes')\n : buildGraphUrl(siteId, 'contentTypes');\n\n const response = await request<{ value: SpContentType[] }>(url);\n return response.value;\n },\n\n async getListContentTypes(options: { listId: string }): Promise<SpContentType[]> {\n const url = buildGraphUrl(siteId, 'lists', options.listId, 'contentTypes');\n const response = await request<{ value: SpContentType[] }>(url);\n return response.value;\n },\n\n async getColumns(options: { contentTypeId: string }): Promise<SpColumn[]> {\n const url = buildGraphUrl(siteId, 'contentTypes', options.contentTypeId, 'columns');\n const response = await request<{ value: SpColumn[] }>(url);\n return response.value;\n },\n\n async getListColumns(options: { listId: string }): Promise<SpColumn[]> {\n const url = buildGraphUrl(siteId, 'lists', options.listId, 'columns');\n const response = await request<{ value: SpColumn[] }>(url);\n return response.value;\n },\n };\n}\n"]}
@@ -0,0 +1,246 @@
1
+ // src/client/errors.ts
2
+ var SpError = class extends Error {
3
+ constructor(message, status, code, requestId = "") {
4
+ super(message);
5
+ this.name = "SpError";
6
+ this.status = status;
7
+ this.code = code;
8
+ this.requestId = requestId;
9
+ }
10
+ toJSON() {
11
+ return {
12
+ name: this.name,
13
+ message: this.message,
14
+ status: this.status,
15
+ code: this.code,
16
+ requestId: this.requestId
17
+ };
18
+ }
19
+ };
20
+ var SpAuthError = class extends SpError {
21
+ constructor(message, status = 401, requestId = "") {
22
+ super(message, status, "AuthenticationError", requestId);
23
+ this.name = "SpAuthError";
24
+ }
25
+ };
26
+ var SpNotFoundError = class extends SpError {
27
+ constructor(message, requestId = "") {
28
+ super(message, 404, "ItemNotFound", requestId);
29
+ this.name = "SpNotFoundError";
30
+ }
31
+ };
32
+ var SpThrottleError = class extends SpError {
33
+ constructor(message, retryAfter = 0, requestId = "") {
34
+ super(message, 429, "TooManyRequests", requestId);
35
+ this.name = "SpThrottleError";
36
+ this.retryAfter = retryAfter;
37
+ }
38
+ };
39
+ var SpValidationError = class extends SpError {
40
+ constructor(message, fieldErrors = {}, requestId = "") {
41
+ super(message, 400, "ValidationError", requestId);
42
+ this.name = "SpValidationError";
43
+ this.fieldErrors = fieldErrors;
44
+ }
45
+ };
46
+ function parseGraphError(status, body, retryAfterHeader) {
47
+ const { error } = body;
48
+ const requestId = error.innerError?.["request-id"] ?? "";
49
+ const message = error.message || "Unknown SharePoint error";
50
+ const code = error.code || "UnknownError";
51
+ if (status === 401 || status === 403) {
52
+ return new SpAuthError(message, status, requestId);
53
+ }
54
+ if (status === 404) {
55
+ return new SpNotFoundError(message, requestId);
56
+ }
57
+ if (status === 429) {
58
+ const retryAfter = retryAfterHeader ? parseInt(retryAfterHeader, 10) : 0;
59
+ return new SpThrottleError(message, retryAfter, requestId);
60
+ }
61
+ if (status === 400) {
62
+ return new SpValidationError(message, {}, requestId);
63
+ }
64
+ return new SpError(message, status, code, requestId);
65
+ }
66
+
67
+ // src/client/utils.ts
68
+ var GRAPH_BASE = "https://graph.microsoft.com/v1.0";
69
+ function buildGraphUrl(siteId, ...segments) {
70
+ const path = segments.filter(Boolean).join("/");
71
+ return `${GRAPH_BASE}/sites/${siteId}/${path}`;
72
+ }
73
+ function buildFilterQuery(contentTypeName, additionalFilter) {
74
+ const parts = [];
75
+ if (contentTypeName) {
76
+ parts.push(`fields/ContentType/Name eq '${contentTypeName}'`);
77
+ }
78
+ if (additionalFilter) {
79
+ parts.push(additionalFilter);
80
+ }
81
+ return parts.join(" and ");
82
+ }
83
+ function sleep(ms) {
84
+ return new Promise((resolve) => setTimeout(resolve, ms));
85
+ }
86
+ function calculateBackoff(attempt, baseDelay = 1e3, maxDelay = 3e4) {
87
+ const delay = Math.min(baseDelay * Math.pow(2, attempt), maxDelay);
88
+ const jitter = delay * 0.1 * Math.random();
89
+ return delay + jitter;
90
+ }
91
+
92
+ // src/client/sp-client.ts
93
+ var DEFAULT_RETRY = {
94
+ maxRetries: 3,
95
+ baseDelay: 1e3,
96
+ maxDelay: 3e4
97
+ };
98
+ function createSpClient(config) {
99
+ const { siteId, getAccessToken } = config;
100
+ const retryOpts = { ...DEFAULT_RETRY, ...config.retryOptions };
101
+ async function request(url, options = {}) {
102
+ let lastError = null;
103
+ for (let attempt = 0; attempt <= retryOpts.maxRetries; attempt++) {
104
+ const token = await getAccessToken();
105
+ const response = await fetch(url, {
106
+ ...options,
107
+ headers: {
108
+ Authorization: `Bearer ${token}`,
109
+ "Content-Type": "application/json",
110
+ ...options.headers
111
+ }
112
+ });
113
+ if (response.ok) {
114
+ if (response.status === 204) {
115
+ return void 0;
116
+ }
117
+ return await response.json();
118
+ }
119
+ const body = await response.json().catch(() => ({
120
+ error: { code: "UnknownError", message: response.statusText }
121
+ }));
122
+ const error = parseGraphError(
123
+ response.status,
124
+ body,
125
+ response.headers.get("Retry-After")
126
+ );
127
+ if (error instanceof SpThrottleError && attempt < retryOpts.maxRetries) {
128
+ const waitTime = error.retryAfter ? error.retryAfter * 1e3 : calculateBackoff(attempt, retryOpts.baseDelay, retryOpts.maxDelay);
129
+ await sleep(waitTime);
130
+ lastError = error;
131
+ continue;
132
+ }
133
+ throw error;
134
+ }
135
+ throw lastError ?? new Error("Max retries exceeded");
136
+ }
137
+ return {
138
+ async getListItems(options) {
139
+ const { listId, contentTypeName, filter, select, expand, orderBy, top, skip } = options;
140
+ const params = new URLSearchParams();
141
+ const filterQuery = buildFilterQuery(contentTypeName, filter);
142
+ if (filterQuery) params.set("$filter", filterQuery);
143
+ if (select?.length) params.set("$select", select.join(","));
144
+ if (expand?.length) params.set("$expand", expand.join(","));
145
+ if (orderBy) params.set("$orderby", orderBy);
146
+ if (top) params.set("$top", String(top));
147
+ if (skip) params.set("$skip", String(skip));
148
+ const queryString = params.toString();
149
+ const url = buildGraphUrl(siteId, "lists", listId, "items") + (queryString ? `?expand=fields&${queryString}` : "?expand=fields");
150
+ const response = await request(url);
151
+ return response.value.map((item) => ({
152
+ id: item.id,
153
+ fields: item.fields,
154
+ contentType: item.fields.ContentType ? { id: "", name: item.fields.ContentType.Name } : void 0,
155
+ createdDateTime: item.createdDateTime,
156
+ lastModifiedDateTime: item.lastModifiedDateTime,
157
+ createdBy: item.createdBy,
158
+ lastModifiedBy: item.lastModifiedBy,
159
+ webUrl: item.webUrl
160
+ }));
161
+ },
162
+ async getItem(options) {
163
+ const { listId, itemId, select, expand } = options;
164
+ const params = new URLSearchParams();
165
+ if (select?.length) params.set("$select", select.join(","));
166
+ if (expand?.length) params.set("$expand", expand.join(","));
167
+ const queryString = params.toString();
168
+ const url = buildGraphUrl(siteId, "lists", listId, "items", itemId) + (queryString ? `?expand=fields&${queryString}` : "?expand=fields");
169
+ const item = await request(url);
170
+ return {
171
+ id: item.id,
172
+ fields: item.fields,
173
+ createdDateTime: item.createdDateTime,
174
+ lastModifiedDateTime: item.lastModifiedDateTime
175
+ };
176
+ },
177
+ async createItem(options) {
178
+ const { listId, fields, contentTypeId } = options;
179
+ const url = buildGraphUrl(siteId, "lists", listId, "items");
180
+ const body = { fields };
181
+ if (contentTypeId) {
182
+ body.fields["ContentType@odata.type"] = contentTypeId;
183
+ }
184
+ const item = await request(url, {
185
+ method: "POST",
186
+ body: JSON.stringify(body)
187
+ });
188
+ return { id: item.id, fields: item.fields };
189
+ },
190
+ async updateItem(options) {
191
+ const { listId, itemId, fields } = options;
192
+ const url = buildGraphUrl(siteId, "lists", listId, "items", itemId, "fields");
193
+ const updatedFields = await request(url, {
194
+ method: "PATCH",
195
+ body: JSON.stringify(fields)
196
+ });
197
+ return { id: itemId, fields: updatedFields };
198
+ },
199
+ async deleteItem(options) {
200
+ const { listId, itemId } = options;
201
+ const url = buildGraphUrl(siteId, "lists", listId, "items", itemId);
202
+ await request(url, { method: "DELETE" });
203
+ },
204
+ async getSites(options) {
205
+ const params = new URLSearchParams();
206
+ if (options?.search) params.set("search", options.search);
207
+ const queryString = params.toString();
208
+ const url = `https://graph.microsoft.com/v1.0/sites${queryString ? `?${queryString}` : ""}`;
209
+ const response = await request(url);
210
+ return response.value;
211
+ },
212
+ async getLists() {
213
+ const url = buildGraphUrl(siteId, "lists");
214
+ const response = await request(url);
215
+ return response.value;
216
+ },
217
+ async getList(options) {
218
+ const url = buildGraphUrl(siteId, "lists", options.listId);
219
+ return request(url);
220
+ },
221
+ async getContentTypes(options) {
222
+ const url = options?.listId ? buildGraphUrl(siteId, "lists", options.listId, "contentTypes") : buildGraphUrl(siteId, "contentTypes");
223
+ const response = await request(url);
224
+ return response.value;
225
+ },
226
+ async getListContentTypes(options) {
227
+ const url = buildGraphUrl(siteId, "lists", options.listId, "contentTypes");
228
+ const response = await request(url);
229
+ return response.value;
230
+ },
231
+ async getColumns(options) {
232
+ const url = buildGraphUrl(siteId, "contentTypes", options.contentTypeId, "columns");
233
+ const response = await request(url);
234
+ return response.value;
235
+ },
236
+ async getListColumns(options) {
237
+ const url = buildGraphUrl(siteId, "lists", options.listId, "columns");
238
+ const response = await request(url);
239
+ return response.value;
240
+ }
241
+ };
242
+ }
243
+
244
+ export { SpAuthError, SpError, SpNotFoundError, SpThrottleError, SpValidationError, createSpClient };
245
+ //# sourceMappingURL=chunk-VOGWZXJY.js.map
246
+ //# sourceMappingURL=chunk-VOGWZXJY.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/client/errors.ts","../src/client/utils.ts","../src/client/sp-client.ts"],"names":[],"mappings":"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","file":"chunk-VOGWZXJY.js","sourcesContent":["import type { GraphErrorResponse } from './types.js';\n\nexport class SpError extends Error {\n public readonly status: number;\n public readonly code: string;\n public readonly requestId: string;\n\n constructor(message: string, status: number, code: string, requestId: string = '') {\n super(message);\n this.name = 'SpError';\n this.status = status;\n this.code = code;\n this.requestId = requestId;\n }\n\n toJSON() {\n return {\n name: this.name,\n message: this.message,\n status: this.status,\n code: this.code,\n requestId: this.requestId,\n };\n }\n}\n\nexport class SpAuthError extends SpError {\n constructor(message: string, status: number = 401, requestId: string = '') {\n super(message, status, 'AuthenticationError', requestId);\n this.name = 'SpAuthError';\n }\n}\n\nexport class SpNotFoundError extends SpError {\n constructor(message: string, requestId: string = '') {\n super(message, 404, 'ItemNotFound', requestId);\n this.name = 'SpNotFoundError';\n }\n}\n\nexport class SpThrottleError extends SpError {\n public readonly retryAfter: number;\n\n constructor(message: string, retryAfter: number = 0, requestId: string = '') {\n super(message, 429, 'TooManyRequests', requestId);\n this.name = 'SpThrottleError';\n this.retryAfter = retryAfter;\n }\n}\n\nexport class SpValidationError extends SpError {\n public readonly fieldErrors: Record<string, string>;\n\n constructor(\n message: string,\n fieldErrors: Record<string, string> = {},\n requestId: string = '',\n ) {\n super(message, 400, 'ValidationError', requestId);\n this.name = 'SpValidationError';\n this.fieldErrors = fieldErrors;\n }\n}\n\nexport function parseGraphError(status: number, body: GraphErrorResponse, retryAfterHeader?: string | null): SpError {\n const { error } = body;\n const requestId = error.innerError?.['request-id'] ?? '';\n const message = error.message || 'Unknown SharePoint error';\n const code = error.code || 'UnknownError';\n\n if (status === 401 || status === 403) {\n return new SpAuthError(message, status, requestId);\n }\n\n if (status === 404) {\n return new SpNotFoundError(message, requestId);\n }\n\n if (status === 429) {\n const retryAfter = retryAfterHeader ? parseInt(retryAfterHeader, 10) : 0;\n return new SpThrottleError(message, retryAfter, requestId);\n }\n\n if (status === 400) {\n return new SpValidationError(message, {}, requestId);\n }\n\n return new SpError(message, status, code, requestId);\n}\n","const GRAPH_BASE = 'https://graph.microsoft.com/v1.0';\n\nexport function buildGraphUrl(siteId: string, ...segments: string[]): string {\n const path = segments.filter(Boolean).join('/');\n return `${GRAPH_BASE}/sites/${siteId}/${path}`;\n}\n\nexport function encodeFieldName(name: string): string {\n return name\n .replace(/ /g, '_x0020_')\n .replace(/ü/g, '_x00fc_')\n .replace(/ş/g, '_x015f_')\n .replace(/ı/g, '_x0131_')\n .replace(/ö/g, '_x00f6_')\n .replace(/ç/g, '_x00e7_')\n .replace(/ğ/g, '_x011f_')\n .replace(/Ü/g, '_x00dc_')\n .replace(/Ş/g, '_x015e_')\n .replace(/İ/g, '_x0130_')\n .replace(/Ö/g, '_x00d6_')\n .replace(/Ç/g, '_x00c7_')\n .replace(/Ğ/g, '_x011e_');\n}\n\nexport function decodeFieldName(encoded: string): string {\n return encoded\n .replace(/_x0020_/g, ' ')\n .replace(/_x00fc_/g, 'ü')\n .replace(/_x015f_/g, 'ş')\n .replace(/_x0131_/g, 'ı')\n .replace(/_x00f6_/g, 'ö')\n .replace(/_x00e7_/g, 'ç')\n .replace(/_x011f_/g, 'ğ')\n .replace(/_x00dc_/g, 'Ü')\n .replace(/_x015e_/g, 'Ş')\n .replace(/_x0130_/g, 'İ')\n .replace(/_x00d6_/g, 'Ö')\n .replace(/_x00c7_/g, 'Ç')\n .replace(/_x011e_/g, 'Ğ');\n}\n\nexport function buildFilterQuery(contentTypeName?: string, additionalFilter?: string): string {\n const parts: string[] = [];\n\n if (contentTypeName) {\n parts.push(`fields/ContentType/Name eq '${contentTypeName}'`);\n }\n\n if (additionalFilter) {\n parts.push(additionalFilter);\n }\n\n return parts.join(' and ');\n}\n\nexport function sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport function calculateBackoff(attempt: number, baseDelay: number = 1000, maxDelay: number = 30000): number {\n const delay = Math.min(baseDelay * Math.pow(2, attempt), maxDelay);\n const jitter = delay * 0.1 * Math.random();\n return delay + jitter;\n}\n","import type {\n SpClientConfig,\n SpListItem,\n SpList,\n SpSite,\n SpContentType,\n SpColumn,\n GetListItemsOptions,\n GetItemOptions,\n CreateItemOptions,\n UpdateItemOptions,\n DeleteItemOptions,\n GraphListResponse,\n GraphErrorResponse,\n RetryOptions,\n} from './types.js';\nimport { parseGraphError, SpThrottleError } from './errors.js';\nimport { buildGraphUrl, buildFilterQuery, sleep, calculateBackoff } from './utils.js';\n\nconst DEFAULT_RETRY: Required<RetryOptions> = {\n maxRetries: 3,\n baseDelay: 1000,\n maxDelay: 30000,\n};\n\ninterface SpClient {\n getListItems<T extends Record<string, unknown> = Record<string, unknown>>(\n options: GetListItemsOptions,\n ): Promise<SpListItem<T>[]>;\n\n getItem<T extends Record<string, unknown> = Record<string, unknown>>(\n options: GetItemOptions,\n ): Promise<SpListItem<T>>;\n\n createItem<T extends Record<string, unknown> = Record<string, unknown>>(\n options: CreateItemOptions<T>,\n ): Promise<SpListItem<T>>;\n\n updateItem<T extends Record<string, unknown> = Record<string, unknown>>(\n options: UpdateItemOptions<T>,\n ): Promise<SpListItem<T>>;\n\n deleteItem(options: DeleteItemOptions): Promise<void>;\n\n getSites(options?: { search?: string }): Promise<SpSite[]>;\n getLists(): Promise<SpList[]>;\n getList(options: { listId: string }): Promise<SpList>;\n getContentTypes(options?: { listId?: string }): Promise<SpContentType[]>;\n getListContentTypes(options: { listId: string }): Promise<SpContentType[]>;\n getColumns(options: { contentTypeId: string }): Promise<SpColumn[]>;\n getListColumns(options: { listId: string }): Promise<SpColumn[]>;\n}\n\nexport function createSpClient(config: SpClientConfig): SpClient {\n const { siteId, getAccessToken } = config;\n const retryOpts = { ...DEFAULT_RETRY, ...config.retryOptions };\n\n async function request<R>(url: string, options: RequestInit = {}): Promise<R> {\n let lastError: Error | null = null;\n\n for (let attempt = 0; attempt <= retryOpts.maxRetries; attempt++) {\n const token = await getAccessToken();\n\n const response = await fetch(url, {\n ...options,\n headers: {\n Authorization: `Bearer ${token}`,\n 'Content-Type': 'application/json',\n ...options.headers,\n },\n });\n\n if (response.ok) {\n if (response.status === 204) {\n return undefined as R;\n }\n return (await response.json()) as R;\n }\n\n const body = (await response.json().catch(() => ({\n error: { code: 'UnknownError', message: response.statusText },\n }))) as GraphErrorResponse;\n\n const error = parseGraphError(\n response.status,\n body,\n response.headers.get('Retry-After'),\n );\n\n if (error instanceof SpThrottleError && attempt < retryOpts.maxRetries) {\n const waitTime = error.retryAfter\n ? error.retryAfter * 1000\n : calculateBackoff(attempt, retryOpts.baseDelay, retryOpts.maxDelay);\n await sleep(waitTime);\n lastError = error;\n continue;\n }\n\n throw error;\n }\n\n throw lastError ?? new Error('Max retries exceeded');\n }\n\n return {\n async getListItems<T extends Record<string, unknown>>(\n options: GetListItemsOptions,\n ): Promise<SpListItem<T>[]> {\n const { listId, contentTypeName, filter, select, expand, orderBy, top, skip } = options;\n const params = new URLSearchParams();\n\n const filterQuery = buildFilterQuery(contentTypeName, filter);\n if (filterQuery) params.set('$filter', filterQuery);\n if (select?.length) params.set('$select', select.join(','));\n if (expand?.length) params.set('$expand', expand.join(','));\n if (orderBy) params.set('$orderby', orderBy);\n if (top) params.set('$top', String(top));\n if (skip) params.set('$skip', String(skip));\n\n const queryString = params.toString();\n const url = buildGraphUrl(siteId, 'lists', listId, 'items') +\n (queryString ? `?expand=fields&${queryString}` : '?expand=fields');\n\n const response = await request<GraphListResponse<T>>(url);\n\n return response.value.map((item) => ({\n id: item.id,\n fields: item.fields,\n contentType: item.fields.ContentType\n ? { id: '', name: item.fields.ContentType.Name }\n : undefined,\n createdDateTime: item.createdDateTime,\n lastModifiedDateTime: item.lastModifiedDateTime,\n createdBy: item.createdBy,\n lastModifiedBy: item.lastModifiedBy,\n webUrl: item.webUrl,\n }));\n },\n\n async getItem<T extends Record<string, unknown>>(\n options: GetItemOptions,\n ): Promise<SpListItem<T>> {\n const { listId, itemId, select, expand } = options;\n const params = new URLSearchParams();\n\n if (select?.length) params.set('$select', select.join(','));\n if (expand?.length) params.set('$expand', expand.join(','));\n\n const queryString = params.toString();\n const url = buildGraphUrl(siteId, 'lists', listId, 'items', itemId) +\n (queryString ? `?expand=fields&${queryString}` : '?expand=fields');\n\n const item = await request<{\n id: string;\n fields: T;\n createdDateTime?: string;\n lastModifiedDateTime?: string;\n }>(url);\n\n return {\n id: item.id,\n fields: item.fields,\n createdDateTime: item.createdDateTime,\n lastModifiedDateTime: item.lastModifiedDateTime,\n };\n },\n\n async createItem<T extends Record<string, unknown>>(\n options: CreateItemOptions<T>,\n ): Promise<SpListItem<T>> {\n const { listId, fields, contentTypeId } = options;\n const url = buildGraphUrl(siteId, 'lists', listId, 'items');\n\n const body: Record<string, unknown> = { fields };\n if (contentTypeId) {\n (body.fields as Record<string, unknown>)['ContentType@odata.type'] = contentTypeId;\n }\n\n const item = await request<{ id: string; fields: T }>(url, {\n method: 'POST',\n body: JSON.stringify(body),\n });\n\n return { id: item.id, fields: item.fields };\n },\n\n async updateItem<T extends Record<string, unknown>>(\n options: UpdateItemOptions<T>,\n ): Promise<SpListItem<T>> {\n const { listId, itemId, fields } = options;\n const url = buildGraphUrl(siteId, 'lists', listId, 'items', itemId, 'fields');\n\n const updatedFields = await request<T>(url, {\n method: 'PATCH',\n body: JSON.stringify(fields),\n });\n\n return { id: itemId, fields: updatedFields };\n },\n\n async deleteItem(options: DeleteItemOptions): Promise<void> {\n const { listId, itemId } = options;\n const url = buildGraphUrl(siteId, 'lists', listId, 'items', itemId);\n\n await request<void>(url, { method: 'DELETE' });\n },\n\n async getSites(options?: { search?: string }): Promise<SpSite[]> {\n const params = new URLSearchParams();\n if (options?.search) params.set('search', options.search);\n\n const queryString = params.toString();\n const url = `https://graph.microsoft.com/v1.0/sites${queryString ? `?${queryString}` : ''}`;\n\n const response = await request<{ value: SpSite[] }>(url);\n return response.value;\n },\n\n async getLists(): Promise<SpList[]> {\n const url = buildGraphUrl(siteId, 'lists');\n const response = await request<{ value: SpList[] }>(url);\n return response.value;\n },\n\n async getList(options: { listId: string }): Promise<SpList> {\n const url = buildGraphUrl(siteId, 'lists', options.listId);\n return request<SpList>(url);\n },\n\n async getContentTypes(options?: { listId?: string }): Promise<SpContentType[]> {\n const url = options?.listId\n ? buildGraphUrl(siteId, 'lists', options.listId, 'contentTypes')\n : buildGraphUrl(siteId, 'contentTypes');\n\n const response = await request<{ value: SpContentType[] }>(url);\n return response.value;\n },\n\n async getListContentTypes(options: { listId: string }): Promise<SpContentType[]> {\n const url = buildGraphUrl(siteId, 'lists', options.listId, 'contentTypes');\n const response = await request<{ value: SpContentType[] }>(url);\n return response.value;\n },\n\n async getColumns(options: { contentTypeId: string }): Promise<SpColumn[]> {\n const url = buildGraphUrl(siteId, 'contentTypes', options.contentTypeId, 'columns');\n const response = await request<{ value: SpColumn[] }>(url);\n return response.value;\n },\n\n async getListColumns(options: { listId: string }): Promise<SpColumn[]> {\n const url = buildGraphUrl(siteId, 'lists', options.listId, 'columns');\n const response = await request<{ value: SpColumn[] }>(url);\n return response.value;\n },\n };\n}\n"]}