@lindle/sharepoint_requests 0.1.19 → 0.1.20

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 (49) hide show
  1. package/dist/index.d.mts +469 -0
  2. package/dist/index.d.ts +460 -8
  3. package/dist/index.js +892 -5
  4. package/dist/index.js.map +1 -0
  5. package/dist/index.mjs +863 -0
  6. package/dist/index.mjs.map +1 -0
  7. package/package.json +5 -5
  8. package/src/root/index.ts +29 -9
  9. package/src/root/instance.ts +7 -0
  10. package/src/root/internal/context.ts +0 -1
  11. package/src/root/internal/digest.ts +16 -10
  12. package/src/root/internal/emailRequests.ts +2 -5
  13. package/src/root/internal/listRequests/createAttachment.ts +2 -2
  14. package/src/root/internal/listRequests/createListItem.ts +3 -18
  15. package/src/root/internal/listRequests/deleteFile.ts +1 -2
  16. package/src/root/internal/listRequests/deleteItem.ts +1 -1
  17. package/src/root/internal/listRequests/getListItems.ts +34 -7
  18. package/src/root/internal/listRequests/resolveMetadataType.ts +14 -0
  19. package/src/root/internal/listRequests/updateListItem.ts +3 -19
  20. package/src/root/internal/listRequests/uploadFile.ts +8 -13
  21. package/src/root/internal/userRequests.ts +52 -28
  22. package/src/types.ts +3 -2
  23. package/dist/root/index.d.ts +0 -163
  24. package/dist/root/instance.d.ts +0 -3
  25. package/dist/root/internal/context.d.ts +0 -11
  26. package/dist/root/internal/digest.d.ts +0 -2
  27. package/dist/root/internal/emailRequests.d.ts +0 -10
  28. package/dist/root/internal/listRequests/createAttachment.d.ts +0 -3
  29. package/dist/root/internal/listRequests/createListItem.d.ts +0 -3
  30. package/dist/root/internal/listRequests/deleteFile.d.ts +0 -3
  31. package/dist/root/internal/listRequests/deleteItem.d.ts +0 -3
  32. package/dist/root/internal/listRequests/getFiles.d.ts +0 -8
  33. package/dist/root/internal/listRequests/getListItems.d.ts +0 -8
  34. package/dist/root/internal/listRequests/getOnly.d.ts +0 -3
  35. package/dist/root/internal/listRequests/index.d.ts +0 -9
  36. package/dist/root/internal/listRequests/normalizePayload.d.ts +0 -4
  37. package/dist/root/internal/listRequests/updateListItem.d.ts +0 -3
  38. package/dist/root/internal/listRequests/uploadFile.d.ts +0 -6
  39. package/dist/root/internal/listRequests/utils.d.ts +0 -2
  40. package/dist/root/internal/odata.d.ts +0 -5
  41. package/dist/root/internal/sharepointUrl.d.ts +0 -2
  42. package/dist/root/internal/userRequests.d.ts +0 -15
  43. package/dist/sharepoint_requests.cjs.development.js +0 -1497
  44. package/dist/sharepoint_requests.cjs.development.js.map +0 -1
  45. package/dist/sharepoint_requests.cjs.production.min.js +0 -2
  46. package/dist/sharepoint_requests.cjs.production.min.js.map +0 -1
  47. package/dist/sharepoint_requests.esm.js +0 -1490
  48. package/dist/sharepoint_requests.esm.js.map +0 -1
  49. package/dist/types.d.ts +0 -260
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/root/instance.ts","../src/root/internal/digest.ts","../src/root/internal/emailRequests.ts","../src/root/internal/listRequests/normalizePayload.ts","../src/root/internal/listRequests/resolveMetadataType.ts","../src/root/internal/listRequests/createListItem.ts","../src/root/internal/sharepointUrl.ts","../src/root/internal/listRequests/utils.ts","../src/root/internal/listRequests/createAttachment.ts","../src/root/internal/listRequests/deleteItem.ts","../src/root/internal/listRequests/deleteFile.ts","../src/root/internal/odata.ts","../src/root/internal/listRequests/getFiles.ts","../src/root/internal/listRequests/getListItems.ts","../src/root/internal/listRequests/getOnly.ts","../src/root/internal/listRequests/updateListItem.ts","../src/root/internal/listRequests/uploadFile.ts","../src/root/internal/userRequests.ts","../src/root/index.ts","../src/index.ts"],"sourcesContent":["import axios, { AxiosHeaders, CreateAxiosDefaults as AxiosConfig } from 'axios';\n\nconst defaultConfig: AxiosConfig = {\n headers: {\n Accept: 'application/json; odata=verbose',\n 'Content-Type': 'application/json; odata=verbose',\n },\n timeout: 15000,\n withCredentials: true,\n paramsSerializer: {\n serialize: (params: Record<string, string | number | undefined>) =>\n Object.entries(params)\n .filter(([, v]) => v !== undefined && v !== null)\n .map(([k, v]) => `${k}=${String(v)}`)\n .join('&'),\n },\n};\n\nexport const instance = (baseURL: string, config?: AxiosConfig) => {\n const userHeaders =\n config?.headers instanceof AxiosHeaders\n ? config.headers.toJSON()\n : config?.headers ?? {};\n\n return axios.create({\n ...defaultConfig,\n ...config,\n baseURL,\n headers: {\n ...defaultConfig.headers,\n ...userHeaders,\n },\n });\n};\n\nexport default instance;\n","import { AxiosInstance } from 'axios';\n\ntype DigestEntry = { value: string; expiresAt: number };\nconst cache = new WeakMap<AxiosInstance, DigestEntry>();\n\nexport async function fetchDigest(instance: AxiosInstance): Promise<string> {\n const cached = cache.get(instance);\n if (cached && Date.now() < cached.expiresAt) {\n return cached.value;\n }\n\n try {\n const response = await instance.post('_api/contextinfo');\n const info = response.data?.d?.GetContextWebInformation;\n const formDigestValue = info?.FormDigestValue;\n\n if (!formDigestValue) {\n throw new Error('Invalid response structure: Missing FormDigestValue');\n }\n\n const ttl = (info?.FormDigestTimeoutSeconds ?? 1800) - 60;\n cache.set(instance, { value: formDigestValue, expiresAt: Date.now() + ttl * 1000 });\n\n return formDigestValue;\n } catch (error) {\n const cause = error instanceof Error ? error.message : 'Unknown contextinfo error';\n throw new Error(`Error retrieving Form Digest Value: ${cause}`);\n }\n}\n","import { AxiosResponse } from 'axios';\nimport { EmailProps } from '../../types';\nimport { fetchDigest } from './digest';\nimport { RequestContext } from './context';\n\ntype SendEmailResponse = AxiosResponse<{\n d: {\n SendEmail: null;\n };\n}>;\n\nexport async function sendEmail(\n context: RequestContext,\n { From, To, Subject, Body }: EmailProps\n): Promise<SendEmailResponse> {\n const response = await context.instance({\n url: '_api/SP.Utilities.Utility.SendEmail',\n method: 'POST',\n headers: {\n 'X-RequestDigest': await fetchDigest(context.instance),\n 'Content-Type': 'application/json;odata=verbose',\n },\n data: JSON.stringify({\n properties: {\n __metadata: {\n type: 'SP.Utilities.EmailProperties',\n },\n From,\n To: {\n results: Array.isArray(To) ? To : [To],\n },\n Body,\n Subject,\n },\n }),\n });\n\n return response;\n}\n","import { ListData } from '../../../types';\n\ntype AnyRecord = Record<string, unknown>;\n\nconst LOOKUP_ID_KEYS = [\n 'lookupId',\n 'LookupId',\n 'lookupID',\n 'LookupID',\n 'Id',\n 'ID',\n];\n\nfunction isPlainObject(value: unknown): value is AnyRecord {\n return !!value && typeof value === 'object' && !Array.isArray(value);\n}\n\nfunction extractLookupPrimitive(\n value: AnyRecord,\n allowGenericId: boolean\n): unknown | undefined {\n for (const key of LOOKUP_ID_KEYS) {\n if (!allowGenericId && (key === 'Id' || key === 'ID')) {\n continue;\n }\n if (value[key] !== undefined && value[key] !== null) {\n return value[key];\n }\n }\n return undefined;\n}\n\nfunction normalizeLookupValue(value: unknown): unknown {\n if (Array.isArray(value)) {\n return { results: value };\n }\n\n if (isPlainObject(value)) {\n if (Array.isArray(value.results)) {\n return { results: value.results };\n }\n\n const primitive = extractLookupPrimitive(value, true);\n if (primitive !== undefined) {\n return primitive;\n }\n }\n\n if (typeof value === 'string') {\n const trimmed = value.trim();\n if (!trimmed) {\n return value;\n }\n const numeric = Number(trimmed);\n return Number.isNaN(numeric) ? trimmed : numeric;\n }\n\n return value;\n}\n\nfunction resolveLookupField(key: string, value: unknown) {\n const lower = key.toLowerCase();\n const endsWithId = lower.endsWith('id');\n const endsWithRef = lower.endsWith('ref');\n const endsWithLookup = lower.endsWith('lookup');\n const hasLookupHint = endsWithId || endsWithRef || endsWithLookup;\n\n if (value === undefined) {\n return null;\n }\n\n if (Array.isArray(value)) {\n const targetKey = endsWithId ? key : `${key}Id`;\n return {\n key: targetKey,\n value: { results: value },\n };\n }\n\n if (isPlainObject(value)) {\n const primitive = extractLookupPrimitive(value, hasLookupHint);\n if (primitive !== undefined) {\n const targetKey = endsWithId ? key : `${key}Id`;\n return {\n key: targetKey,\n value: normalizeLookupValue(primitive),\n };\n }\n\n if (Array.isArray(value.results)) {\n const targetKey = endsWithId ? key : `${key}Id`;\n return {\n key: targetKey,\n value: { results: value.results },\n };\n }\n\n if (!hasLookupHint) {\n return null;\n }\n } else if (!hasLookupHint) {\n return null;\n }\n\n const targetKey = endsWithId ? key : `${key}Id`;\n\n if (value === null) {\n return {\n key: targetKey,\n value: null,\n };\n }\n\n if (typeof value === 'number') {\n return {\n key: targetKey,\n value,\n };\n }\n\n if (typeof value === 'string') {\n const trimmed = value.trim();\n if (!trimmed) {\n return {\n key: targetKey,\n value: '',\n };\n }\n const numeric = Number(trimmed);\n return {\n key: targetKey,\n value: Number.isNaN(numeric) ? trimmed : numeric,\n };\n }\n\n return null;\n}\n\nexport function normalizeListPayload<D = Record<string, unknown>>(\n data: ListData<D>\n): AnyRecord {\n const result: AnyRecord = {};\n\n if (!data) {\n return result;\n }\n\n for (const [key, value] of Object.entries(data as AnyRecord)) {\n if (key === '__metadata') {\n continue;\n }\n\n const lookupField = resolveLookupField(key, value);\n if (lookupField) {\n result[lookupField.key] = lookupField.value;\n continue;\n }\n\n if (value !== undefined) {\n result[key] = value;\n }\n }\n\n return result;\n}\n","import { SHAREPOINT_VER } from '../../../types';\nimport { RequestContext } from '../context';\n\nexport async function resolveMetadataType<V extends SHAREPOINT_VER>(\n context: RequestContext<V>\n): Promise<string> {\n if (context.resolveListItemEntityType) {\n return context.resolveListItemEntityType();\n }\n if (context.listItemEntityTypeFullName) {\n return context.listItemEntityTypeFullName;\n }\n return `SP.Data.${context.listName}ListItem`;\n}\n","import { ListData, SHAREPOINT_VER } from '../../../types';\nimport { fetchDigest } from '../digest';\nimport { RequestContext } from '../context';\nimport { normalizeListPayload } from './normalizePayload';\nimport { resolveMetadataType } from './resolveMetadataType';\n\nexport async function createListItem<\n D = Record<string, unknown>,\n V extends SHAREPOINT_VER = '2013'\n>(context: RequestContext<V>, listData: ListData<D>) {\n const normalizedData = normalizeListPayload(listData);\n let payload: Record<string, unknown> = normalizedData;\n\n if (context.sharepointVersion === '2013') {\n const metadataType = await resolveMetadataType(context);\n const userMetadata = (listData as { __metadata?: Record<string, unknown> })\n .__metadata;\n payload = {\n ...normalizedData,\n __metadata: {\n ...(userMetadata && typeof userMetadata === 'object' ? userMetadata : {}),\n type: metadataType,\n },\n };\n }\n\n const response = await context.instance({\n url: context.endpoint,\n method: 'POST',\n data: JSON.stringify(payload),\n headers: {\n 'X-RequestDigest': await fetchDigest(context.instance),\n },\n });\n\n return response;\n}\n","export function escapeODataStringLiteral(value: string) {\n return value.replace(/'/g, \"''\");\n}\n\nexport function buildListByTitleEndpoint(listName: string) {\n return `_api/web/lists/GetByTitle('${escapeODataStringLiteral(listName)}')`;\n}\n","export function buildLibraryPath(folderPath?: string | string[]) {\n if (!folderPath) {\n return '';\n }\n\n const segments = Array.isArray(folderPath)\n ? folderPath\n : folderPath.split('/').filter(Boolean);\n\n if (!segments.length) {\n return '';\n }\n\n const escapedSegments = segments.map(segment => {\n if (!segment.trim()) {\n throw new Error('Folder path segments cannot be empty.');\n }\n\n const sanitized = segment.replace(/'/g, \"''\");\n\n return `/Folders('${encodeURIComponent(sanitized)}')`;\n });\n\n return escapedSegments.join('');\n}\n\nexport function encodeFileName(fileName: string) {\n if (!fileName.trim()) {\n throw new Error('File name cannot be empty.');\n }\n\n return encodeURIComponent(fileName.replace(/'/g, \"''\"));\n}\n","import { CreateFileProps, SHAREPOINT_VER } from '../../../types';\nimport { fetchDigest } from '../digest';\nimport { RequestContext } from '../context';\nimport { buildListByTitleEndpoint } from '../sharepointUrl';\nimport { encodeFileName } from './utils';\n\nexport async function createAttachment<V extends SHAREPOINT_VER = '2013'>(\n context: RequestContext<V>,\n { file, itemId }: CreateFileProps\n) {\n if (context.sharepointVersion !== '2013') {\n throw new Error(\n 'createAttachment is only supported for SharePoint 2013 REST endpoints.'\n );\n }\n\n const encodedFileName = encodeFileName(file.name);\n const requestUrl = `${buildListByTitleEndpoint(\n context.listName\n )}/items(${itemId})/AttachmentFiles/add(FileName='${encodedFileName}')`;\n\n const response = await context.instance.post(requestUrl, file, {\n headers: {\n 'X-RequestDigest': await fetchDigest(context.instance),\n },\n });\n\n return response;\n}\n","import { SHAREPOINT_VER } from '../../../types';\nimport { RequestContext } from '../context';\nimport { fetchDigest } from '../digest';\nimport { buildListByTitleEndpoint } from '../sharepointUrl';\n\nexport async function deleteItem<V extends SHAREPOINT_VER = '2013'>(\n context: RequestContext<V>,\n id: number | string\n) {\n const requestDigest = await fetchDigest(context.instance);\n const url =\n context.sharepointVersion === '2013'\n ? `${buildListByTitleEndpoint(context.listName)}/items(${id})`\n : `${context.endpoint}(${id})`;\n\n const response = await context.instance.post(url, undefined, {\n headers: {\n 'X-RequestDigest': requestDigest,\n 'IF-MATCH': '*',\n 'X-HTTP-Method': 'DELETE',\n },\n });\n return response;\n}\n","import { SHAREPOINT_VER, DeleteFileProps } from '../../../types';\nimport { fetchDigest } from '../digest';\nimport { RequestContext } from '../context';\nimport { buildLibraryPath, encodeFileName } from './utils';\nimport { buildListByTitleEndpoint } from '../sharepointUrl';\n\nconst SUPPORTED_VERSION: SHAREPOINT_VER = '2013';\n\nexport async function deleteFile<V extends SHAREPOINT_VER = '2013'>(\n context: RequestContext<V>,\n { fileName, folderPath }: DeleteFileProps\n) {\n if (context.sharepointVersion !== SUPPORTED_VERSION) {\n throw new Error(\n 'deleteFile is only supported for SharePoint 2013 REST endpoints.'\n );\n }\n\n const encodedFileName = encodeFileName(fileName);\n let requestUrl = `${buildListByTitleEndpoint(context.listName)}/RootFolder`;\n requestUrl += buildLibraryPath(folderPath);\n requestUrl += `/Files('${encodedFileName}')`;\n\n const digest = await fetchDigest(context.instance);\n\n const response = await context.instance.post(requestUrl, undefined, {\n headers: {\n 'X-HTTP-Method': 'DELETE',\n 'IF-MATCH': '*',\n 'X-RequestDigest': digest,\n },\n });\n\n return response;\n}\n","import { Folder_Options, Options, SHAREPOINT_VER } from '../../types';\n\ntype QueryableOptions<T, V extends SHAREPOINT_VER = '2013'> =\n | Options<T, V>\n | Folder_Options<T>;\n\nexport function buildODataParams<T, V extends SHAREPOINT_VER = '2013'>(\n options: QueryableOptions<T, V> | undefined,\n orderBySeparator: ',' | ' ' = ','\n) {\n const { expand, orderBy, limit, filter, cols, skip } = options || {};\n\n const params: Record<string, string | number | undefined> = {\n $expand: Array.isArray(expand) ? expand.join(',') : expand,\n $top: limit,\n $skip: skip,\n $select: Array.isArray(cols) ? cols.join(',') : cols,\n $filter: filter,\n $orderby: Array.isArray(orderBy) ? orderBy.join(orderBySeparator) : orderBy,\n };\n\n return params;\n}\n\nexport function appendParamsToUrl(\n baseUrl: URL,\n params: Record<string, string | number | undefined | null>\n) {\n Object.entries(params).forEach(([key, value]) => {\n if (value !== undefined && value !== null) {\n baseUrl.searchParams.append(key, String(value));\n }\n });\n}\n","import { Folder_Options, SHAREPOINT_VER } from '../../../types';\nimport { appendParamsToUrl, buildODataParams } from '../odata';\nimport { RequestContext } from '../context';\n\nexport async function getFiles<T, V extends SHAREPOINT_VER = '2013'>(\n context: RequestContext<V>,\n options?: Folder_Options<T>\n) {\n const params = buildODataParams(options, ',');\n const url = new URL(context.endpoint, context.instance.defaults.baseURL);\n\n appendParamsToUrl(url, params);\n\n const response = await context.instance.request({\n url: context.endpoint,\n method: 'GET',\n params,\n });\n\n const data = response.data?.d?.results ?? response.data?.d ?? response.data;\n\n const meta = { url };\n\n return { data, meta };\n}\n","import { Options, SPItem, SHAREPOINT_VER } from '../../../types';\nimport { appendParamsToUrl, buildODataParams } from '../odata';\nimport { RequestContext } from '../context';\n\ntype ListItemShape<K, V extends SHAREPOINT_VER> = K & Partial<SPItem<V>>;\n\ntype SelectedColumns<\n K,\n V extends SHAREPOINT_VER,\n O extends Options<K, V> | undefined\n> = O extends { cols?: infer C }\n ? C extends readonly (infer Key)[]\n ? Extract<Key, keyof ListItemShape<K, V>>\n : Extract<C, keyof ListItemShape<K, V>>\n : never;\n\ntype ListItemResponseData<\n K,\n V extends SHAREPOINT_VER,\n O extends Options<K, V> | undefined\n> = [SelectedColumns<K, V, O>] extends [never]\n ? ListItemShape<K, V>\n : Pick<ListItemShape<K, V>, SelectedColumns<K, V, O>>;\n\nexport async function getListItems<\n K,\n V extends SHAREPOINT_VER = '2013',\n O extends Options<K, V> | undefined = Options<K, V> | undefined\n>(\n context: RequestContext<V>,\n options?: O\n): Promise<{\n data: ListItemResponseData<K, V, O> | ListItemResponseData<K, V, O>[] | undefined;\n meta: { url: URL };\n}> {\n const params = buildODataParams(options, ' ');\n\n const url = new URL(context.endpoint, context.instance.defaults.baseURL);\n appendParamsToUrl(url, params);\n\n const response = await context.instance.request({\n url: context.endpoint,\n method: 'GET',\n params,\n });\n\n const rawData =\n response.data?.d?.results ?? response.data?.d ?? response.data;\n const cols = options?.cols as Options<K, V>['cols'] | undefined;\n const keys = cols\n ? (Array.isArray(cols) ? cols : [cols]).filter(\n (key): key is Extract<keyof ListItemShape<K, V>, string> =>\n typeof key === 'string'\n )\n : undefined;\n\n const filterItem = (item: unknown) => {\n if (!keys || !item || typeof item !== 'object') {\n return item;\n }\n\n return keys.reduce<Record<string, unknown>>((acc, key) => {\n if (key in item) {\n acc[key] = (item as Record<string, unknown>)[key];\n }\n\n return acc;\n }, {});\n };\n\n const data = Array.isArray(rawData)\n ? rawData.map(filterItem)\n : filterItem(rawData);\n\n const meta = { url };\n\n return {\n data: data as\n | ListItemResponseData<K, V, O>\n | ListItemResponseData<K, V, O>[]\n | undefined,\n meta,\n };\n}\n","import { AxiosInstance } from 'axios';\nimport { Options, SHAREPOINT_VER } from '../../../types';\nimport { buildODataParams } from '../odata';\n\nexport async function getOnly<T, V extends SHAREPOINT_VER = '2013'>(\n instance: AxiosInstance,\n endpoint: string,\n options?: Options<T, V>\n) {\n const params = buildODataParams(options, ',');\n const { data } = await instance.get(endpoint, { params });\n if (!data) {\n return undefined;\n }\n\n if (data.d) {\n return data.d.results ? data.d.results : data.d;\n }\n\n return data;\n}\n","import { ListData, SHAREPOINT_VER } from '../../../types';\nimport { fetchDigest } from '../digest';\nimport { RequestContext } from '../context';\nimport { normalizeListPayload } from './normalizePayload';\nimport { buildListByTitleEndpoint } from '../sharepointUrl';\nimport { resolveMetadataType } from './resolveMetadataType';\n\nexport async function updateListItem<\n D = Record<string, unknown>,\n V extends SHAREPOINT_VER = '2013'\n>(\n context: RequestContext<V>,\n id: number | string,\n data: ListData<D>,\n digest?: string\n) {\n const formDigestValue = digest ?? (await fetchDigest(context.instance));\n\n const normalizedData = normalizeListPayload(data);\n let payload: Record<string, unknown> = normalizedData;\n\n if (context.sharepointVersion === '2013') {\n const metadataType = await resolveMetadataType(context);\n const userMetadata = (data as { __metadata?: Record<string, unknown> })\n .__metadata;\n payload = {\n ...normalizedData,\n __metadata: {\n ...(userMetadata && typeof userMetadata === 'object' ? userMetadata : {}),\n type: metadataType,\n },\n };\n }\n\n const url =\n context.sharepointVersion === '2013'\n ? `${buildListByTitleEndpoint(context.listName)}/items(${id})`\n : `${context.endpoint}(${id})`;\n\n const response = await context.instance({\n url,\n method: 'POST',\n data: JSON.stringify(payload),\n headers: {\n 'X-RequestDigest': formDigestValue,\n 'IF-MATCH': '*',\n 'X-HTTP-Method': 'MERGE',\n },\n });\n\n return response;\n}\n","import { AxiosResponse } from 'axios';\nimport { ItemID, SHAREPOINT_VER, UploadFileProps } from '../../../types';\nimport { fetchDigest } from '../digest';\nimport { RequestContext } from '../context';\nimport { buildLibraryPath, encodeFileName } from './utils';\nimport { buildListByTitleEndpoint } from '../sharepointUrl';\n\nconst SUPPORTED_VERSION: SHAREPOINT_VER = '2013';\n\nexport async function uploadFile<V extends SHAREPOINT_VER = '2013'>(\n context: RequestContext<V>,\n { file, folderPath, overwrite = true }: UploadFileProps\n): Promise<{ response: AxiosResponse; itemId?: ItemID }> {\n if (context.sharepointVersion !== SUPPORTED_VERSION) {\n throw new Error(\n 'uploadFile is only supported for SharePoint 2013 REST endpoints.'\n );\n }\n\n if (!file?.name) {\n throw new Error('A file with a valid name must be provided.');\n }\n\n let requestUrl = `${buildListByTitleEndpoint(context.listName)}/RootFolder`;\n requestUrl += buildLibraryPath(folderPath);\n\n const encodedFileName = encodeFileName(file.name);\n requestUrl += `/Files/add(url='${encodedFileName}',overwrite=${\n overwrite ? 'true' : 'false'\n })?$expand=ListItemAllFields&$select=ListItemAllFields/Id`;\n\n const digest = await fetchDigest(context.instance);\n\n const response = await context.instance.post(requestUrl, file, {\n headers: {\n 'Content-Type': file.type || 'application/octet-stream',\n 'X-RequestDigest': digest,\n },\n });\n\n const responseData = response.data?.d ?? response.data;\n const listItemFields = responseData?.ListItemAllFields;\n let itemId: ItemID | undefined =\n listItemFields?.Id ??\n listItemFields?.ID ??\n responseData?.Id ??\n responseData?.ID;\n\n if (typeof itemId === 'undefined' && listItemFields?.__deferred?.uri) {\n const listItemResponse = await context.instance.get(\n listItemFields.__deferred.uri\n );\n const deferredId =\n listItemResponse.data?.d?.Id ?? listItemResponse.data?.Id;\n if (typeof deferredId !== 'undefined') {\n itemId = deferredId;\n }\n }\n\n return { response, itemId };\n}\n","import { AxiosInstance } from 'axios';\nimport { PermissionLabel, PersonField, UserPermision, UserProfile } from '../../types';\nimport { RequestContext } from './context';\nimport { escapeODataStringLiteral } from './sharepointUrl';\n\ntype RoleDefinition = {\n Name: string;\n Description: string;\n Hidden: boolean;\n Id: number;\n Order: number;\n RoleTypeKind: number;\n BasePermissions: {\n High: string;\n Low: string;\n };\n};\n\nconst PERMISSION_PRIORITY: PermissionLabel[] = [\n 'Full Control',\n 'Edit',\n 'Contribute',\n 'Read',\n];\n\nexport async function typeAhead(\n instance: AxiosInstance,\n input: string,\n filter?: string\n): Promise<PersonField> {\n const requestUrl = `_api/SP.UI.ApplicationPages.ClientPeoplePickerWebServiceInterface.clientPeoplePickerSearchUser`;\n\n const data = {\n queryParams: {\n __metadata: {\n type: 'SP.UI.ApplicationPages.ClientPeoplePickerQueryParameters',\n },\n AllowEmailAddresses: true,\n AllowMultipleEntities: false,\n AllUrlZones: false,\n MaximumEntitySuggestions: 10,\n PrincipalSource: 15,\n PrincipalType: 1,\n QueryString: input,\n },\n };\n\n if (filter) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (data.queryParams as any).RequiredProperties = [filter];\n }\n\n const response = await instance.post(requestUrl, JSON.stringify(data), {\n headers: {\n Accept: 'application/json; odata=verbose',\n 'Content-Type': 'application/json;odata=verbose',\n },\n });\n\n const searchResults =\n response.data?.d?.ClientPeoplePickerSearchUser ??\n response.data?.ClientPeoplePickerSearchUser;\n\n if (typeof searchResults === 'string') {\n const parsed = JSON.parse(searchResults);\n if (Array.isArray(parsed) && parsed.length > 0) {\n return parsed[0] as PersonField;\n }\n throw new Error('People picker returned no results.');\n }\n\n if (Array.isArray(searchResults) && searchResults.length > 0) {\n return searchResults[0] as PersonField;\n }\n\n if (searchResults && typeof searchResults === 'object') {\n return searchResults as PersonField;\n }\n\n throw new Error('Invalid people picker response.');\n}\n\nexport async function currentUserProperties(\n instance: AxiosInstance\n): Promise<UserProfile> {\n const requestUrl = '_api/sp.userprofiles.peoplemanager/getmyproperties';\n const response = await instance.get(requestUrl);\n\n const profile = (response.data?.d ?? response.data) as UserProfile | undefined;\n if (!profile) {\n throw new Error('Unable to retrieve user profile.');\n }\n\n profile.UserProfileProperties?.results?.forEach(\n (prop: { Key: string; Value: string }) => {\n if (prop.Key === 'FirstName') profile.FirstName = prop.Value;\n else if (prop.Key === 'LastName') profile.LastName = prop.Value;\n else if (prop.Key === 'Country') profile.Country = prop.Value;\n else if (prop.Key === 'UserName') profile.UserName = prop.Value;\n }\n );\n\n return profile;\n}\n\nexport async function getSiteUser(\n instance: AxiosInstance,\n searchValue: string\n) {\n const safeSearchValue = escapeODataStringLiteral(searchValue);\n const response = await instance.get('_api/web/siteusers', {\n params: {\n $filter: `substringof('${safeSearchValue}', Title) or substringof('${safeSearchValue}', LoginName) or substringof('${safeSearchValue}', Email)`,\n $top: 50,\n $expand: 'Groups',\n },\n });\n return response.data.d;\n}\n\nasync function roleDefinitions(instance: AxiosInstance): Promise<RoleDefinition[]> {\n const response = await instance.get('_api/Web/RoleDefinitions');\n return response.data.d.results as RoleDefinition[];\n}\n\nasync function getEffectiveBasePermissions(\n instance: AxiosInstance\n): Promise<{ High: string; Low: string }> {\n const response = await instance.get('_api/Web/effectiveBasePermissions');\n return response.data.d.EffectiveBasePermissions;\n}\n\nexport async function currentUserPermissions(\n context: RequestContext\n): Promise<UserPermision> {\n const { High: userHigh, Low: userLow } = await getEffectiveBasePermissions(\n context.instance\n );\n const definitions = await roleDefinitions(context.instance);\n\n const userHighInt = parseInt(userHigh, 10);\n const userLowInt = parseInt(userLow, 10);\n\n const matching = definitions\n .filter((def): def is RoleDefinition =>\n PERMISSION_PRIORITY.includes(def.Name as PermissionLabel) &&\n (userHighInt & parseInt(def.BasePermissions.High, 10)) === parseInt(def.BasePermissions.High, 10) &&\n (userLowInt & parseInt(def.BasePermissions.Low, 10)) === parseInt(def.BasePermissions.Low, 10)\n )\n .sort(\n (a, b) =>\n PERMISSION_PRIORITY.indexOf(a.Name as PermissionLabel) -\n PERMISSION_PRIORITY.indexOf(b.Name as PermissionLabel)\n );\n\n const result = matching[0];\n\n if (!result) {\n throw new Error(\n `Unable to resolve current user permission. Effective: High=\"${userHigh}\", Low=\"${userLow}\"`\n );\n }\n\n return result as unknown as UserPermision;\n}\n","import { AxiosInstance, CreateAxiosDefaults as AxiosConfig } from 'axios';\nimport instance from './instance';\nimport {\n CreateFileProps,\n CurrentUser,\n DeleteFileProps,\n EmailProps,\n Field_Options,\n Folder_Options,\n ItemID,\n ListData,\n Options,\n PersonField,\n SHAREPOINT_VER,\n UploadFileProps,\n UserPermision,\n UserProfile,\n} from '../types';\nimport { RequestContext } from './internal/context';\nimport { sendEmail as sendEmailRequest } from './internal/emailRequests';\nimport { fetchDigest } from './internal/digest';\nimport {\n createAttachment,\n createListItem,\n deleteFile as deleteLibraryFile,\n deleteItem,\n getFiles,\n getListItems,\n getOnly,\n updateListItem,\n uploadFile,\n} from './internal/listRequests';\nimport {\n buildListByTitleEndpoint,\n escapeODataStringLiteral,\n} from './internal/sharepointUrl';\nimport {\n currentUserPermissions as resolveCurrentUserPermissions,\n currentUserProperties as loadCurrentUserProperties,\n getSiteUser as fetchSiteUser,\n typeAhead,\n} from './internal/userRequests';\n\ntype ListKey<T extends { LISTS: Record<string, unknown> }> = Extract<\n keyof T['LISTS'],\n string\n>;\n\n/**\n * @deprecated SP.Utilities.Utility.SendEmail was retired by Microsoft on 2025-10-31\n * and no longer sends emails. Migrate to Microsoft Graph API:\n * POST /v1.0/me/sendMail (delegated) or POST /v1.0/users/{id}/sendMail (app)\n * https://learn.microsoft.com/en-us/graph/api/user-sendmail\n */\ntype EmailApi = ((\n from: string,\n to: string[] | string,\n subject: string | undefined,\n body: string\n) => ReturnType<typeof sendEmailRequest>) & {\n send: (props: EmailProps) => ReturnType<typeof sendEmailRequest>;\n};\n\nclass HTTPSharePointRequests<\n T extends {\n LISTS: Record<string, unknown>;\n FOLDERS?: Record<string, unknown>;\n }\n> {\n private readonly baseURL: string;\n private readonly instance: AxiosInstance;\n private readonly listItemEntityTypeCache: Map<string, string>;\n /**\n * @deprecated SP.Utilities.Utility.SendEmail was retired by Microsoft on 2025-10-31.\n * Migrate to Microsoft Graph API POST /v1.0/me/sendMail\n * https://learn.microsoft.com/en-us/graph/api/user-sendmail\n */\n public readonly email: EmailApi;\n\n constructor(baseURL: string, config?: AxiosConfig) {\n this.baseURL = baseURL.endsWith('/') ? baseURL : `${baseURL}/`;\n this.instance = instance(this.baseURL, config);\n this.listItemEntityTypeCache = new Map<string, string>();\n const buildEmailContext = () =>\n this.createContext<'2013'>({\n endpoint: '_api/SP.Utilities.Utility.SendEmail',\n listName: '',\n sharepointVersion: '2013',\n });\n this.email = Object.assign(\n (\n from: string,\n to: string[] | string,\n subject: string | undefined,\n body: string\n ) =>\n sendEmailRequest(buildEmailContext(), {\n From: from,\n To: to,\n Subject: subject,\n Body: body,\n }),\n {\n send: (props: EmailProps) => sendEmailRequest(buildEmailContext(), props),\n }\n );\n }\n\n private createContext<V extends SHAREPOINT_VER = '2013'>({\n endpoint,\n listName,\n sharepointVersion,\n listItemEntityTypeFullName,\n resolveListItemEntityType,\n }: {\n endpoint: string;\n listName: string;\n sharepointVersion: V;\n listItemEntityTypeFullName?: string;\n resolveListItemEntityType?: () => Promise<string>;\n }): RequestContext<V> {\n return {\n instance: this.instance,\n endpoint,\n listName,\n sharepointVersion,\n listItemEntityTypeFullName,\n resolveListItemEntityType,\n };\n }\n\n private async resolveListItemEntityTypeFullName(\n listName: string\n ): Promise<string> {\n const cacheKey = listName;\n const cachedType = this.listItemEntityTypeCache.get(cacheKey);\n if (cachedType) {\n return cachedType;\n }\n\n const response = await this.instance.get(\n `${buildListByTitleEndpoint(listName)}?$select=ListItemEntityTypeFullName`\n );\n\n const entityType =\n response.data?.d?.ListItemEntityTypeFullName ??\n response.data?.ListItemEntityTypeFullName;\n\n if (!entityType || typeof entityType !== 'string') {\n throw new Error(\n `Unable to resolve ListItemEntityTypeFullName for list \"${listName}\".`\n );\n }\n\n this.listItemEntityTypeCache.set(cacheKey, entityType);\n return entityType;\n }\n\n private buildListScope<\n K extends ListKey<T>,\n V extends SHAREPOINT_VER = '2013'\n >(listName: K, version: V) {\n const listNameValue = String(listName);\n const endpoint =\n version === '2013'\n ? `${buildListByTitleEndpoint(listNameValue)}/items`\n : `_vti_bin/ListData.svc/${encodeURIComponent(listNameValue)}`;\n\n let scopedEntityType: string | undefined;\n const resolveListItemEntityType = async () => {\n if (scopedEntityType) {\n return scopedEntityType;\n }\n\n if (version !== '2013') {\n scopedEntityType = `SP.Data.${listNameValue}ListItem`;\n return scopedEntityType;\n }\n\n scopedEntityType = await this.resolveListItemEntityTypeFullName(\n listNameValue\n );\n return scopedEntityType;\n };\n\n const getContext = () =>\n this.createContext<V>({\n endpoint,\n listName: listNameValue,\n sharepointVersion: version,\n listItemEntityTypeFullName: scopedEntityType,\n resolveListItemEntityType,\n });\n\n const removeItem = (id: ItemID) => deleteItem(getContext(), id);\n const removeFile = (props: DeleteFileProps) =>\n deleteLibraryFile(getContext(), props);\n\n return {\n create: (data: ListData<T['LISTS'][K]>) =>\n createListItem<T['LISTS'][K], V>(getContext(), data),\n get: (options?: Options<T['LISTS'][K], V>) =>\n getListItems<T['LISTS'][K], V>(getContext(), options),\n update: (id: ItemID, data: ListData<T['LISTS'][K]>, digest?: string) =>\n updateListItem<T['LISTS'][K], V>(getContext(), id, data, digest),\n delete: removeItem,\n remove: removeItem,\n createFile: (props: CreateFileProps) =>\n createAttachment(getContext(), props),\n uploadFile: (props: UploadFileProps) => uploadFile(getContext(), props),\n deleteFile: removeFile,\n removeFile,\n fields: (options?: Field_Options<T['LISTS'][K], V>) => {\n const fieldsEndpoint = !options?.fieldName\n ? `${buildListByTitleEndpoint(listNameValue)}/fields`\n : `${buildListByTitleEndpoint(\n listNameValue\n )}/fields/getbytitle('${escapeODataStringLiteral(\n String(options.fieldName)\n )}')`;\n return {\n get: () =>\n getOnly<T['LISTS'][K], V>(this.instance, fieldsEndpoint, options),\n };\n },\n items: {\n create: (data: ListData<T['LISTS'][K]>) =>\n createListItem<T['LISTS'][K], V>(getContext(), data),\n get: (options?: Options<T['LISTS'][K], V>) =>\n getListItems<T['LISTS'][K], V>(getContext(), options),\n update: (id: ItemID, data: ListData<T['LISTS'][K]>, digest?: string) =>\n updateListItem<T['LISTS'][K], V>(getContext(), id, data, digest),\n delete: removeItem,\n remove: removeItem,\n },\n files: {\n attach: (props: CreateFileProps) =>\n createAttachment(getContext(), props),\n upload: (props: UploadFileProps) => uploadFile(getContext(), props),\n delete: removeFile,\n remove: removeFile,\n },\n };\n }\n\n /**\n * @deprecated Use `from(listName, '2010')` instead.\n */\n list<K extends ListKey<T>>(listName: K) {\n return this.from<K, '2010'>(listName, '2010');\n }\n\n public from<K extends ListKey<T>, V extends SHAREPOINT_VER = '2013'>(\n listName: K,\n sharepointVersion?: V\n ) {\n const version = (sharepointVersion ?? '2013') as V;\n return this.buildListScope<K, V>(listName, version);\n }\n\n public field<K extends ListKey<T>, V extends SHAREPOINT_VER = '2013'>(\n listName: K,\n fieldName?: Extract<keyof T['LISTS'][K], string>,\n sharepointVersion?: V\n ) {\n return this.from<K, V>(listName, sharepointVersion)\n .fields({\n fieldName,\n } as Field_Options<T['LISTS'][K], V>)\n .get();\n }\n\n public lists(options?: Options<Record<string, unknown>, '2013'>) {\n const context = this.createContext<'2013'>({\n endpoint: '_api/web/lists',\n listName: '',\n sharepointVersion: '2013',\n });\n\n return {\n get: () => getListItems<Record<string, unknown>, '2013'>(context, options),\n };\n }\n\n public getDigest() {\n return fetchDigest(this.instance);\n }\n\n public folders(options?: Folder_Options<Record<string, unknown>>) {\n const context = this.createContext<'2013'>({\n endpoint: '_api/web/folders',\n listName: '',\n sharepointVersion: '2013',\n });\n\n return {\n get: () => getFiles<Record<string, unknown>, '2013'>(context, options),\n };\n }\n\n public folder(folderName?: string | string[]) {\n const defaultPath = ['Shared Documents'];\n const segments = folderName\n ? Array.isArray(folderName)\n ? [...defaultPath, ...folderName]\n : [...defaultPath, ...folderName.split('/').filter(Boolean)]\n : defaultPath;\n\n const serverRelativePath = escapeODataStringLiteral(segments.join('/'));\n const baseEndpoint = `_api/web/GetFolderByServerRelativeUrl('${serverRelativePath}')`;\n\n return {\n get: (options?: Folder_Options<Record<string, unknown>>) => {\n const folderType = options?.type ?? 'Files';\n const endpoint = `${baseEndpoint}/${folderType}`;\n const context = this.createContext<'2013'>({\n endpoint,\n listName: '',\n sharepointVersion: '2013',\n });\n\n return getFiles<Record<string, unknown>, '2013'>(context, {\n ...options,\n type: folderType,\n });\n },\n };\n }\n\n public users(options?: Options<Record<string, unknown>, '2013'>) {\n const context = this.createContext<'2013'>({\n endpoint: '_api/web/SiteUserInfoList/items',\n listName: '',\n sharepointVersion: '2013',\n });\n\n return {\n get: () => getListItems<Record<string, unknown>, '2013'>(context, options),\n };\n }\n\n /**\n * @deprecated SP.Utilities.Utility.SendEmail was retired by Microsoft on 2025-10-31.\n * Migrate to Microsoft Graph API POST /v1.0/me/sendMail\n * https://learn.microsoft.com/en-us/graph/api/user-sendmail\n */\n public sendEmail(props: EmailProps) {\n const context = this.createContext<'2013'>({\n endpoint: '_api/SP.Utilities.Utility.SendEmail',\n listName: '',\n sharepointVersion: '2013',\n });\n return sendEmailRequest(context, props);\n }\n\n public readonly user = {\n properties: () => ({\n get: (): Promise<UserProfile> => loadCurrentUserProperties(this.instance),\n }),\n searchSiteUser: (searchValue: string) =>\n fetchSiteUser(this.instance, searchValue),\n searchUser: (input: string, filter?: string): Promise<PersonField> =>\n typeAhead(this.instance, input, filter),\n current: () => ({\n get: (): Promise<CurrentUser> =>\n getOnly(this.instance, '_api/web/currentUser'),\n }),\n currentPermission: () => ({\n get: (): Promise<UserPermision> =>\n resolveCurrentUserPermissions(\n this.createContext<'2013'>({\n endpoint: '_api/web/effectiveBasePermissions',\n listName: '',\n sharepointVersion: '2013',\n })\n ),\n }),\n };\n\n public getCurrentUser() {\n return this.user.current().get();\n }\n\n public currentUserProperties() {\n return this.user.properties().get();\n }\n\n public currentUserPermission() {\n return this.user.currentPermission().get();\n }\n}\n\nexport default HTTPSharePointRequests;\n","import SHAREPOINT_REQUESTS from './root';\n\nimport { CreateAxiosDefaults as AxiosConfig } from 'axios';\nimport { LookupField, ChoiceField, PersonField } from './types';\n\n// Load environment variables from .env file\n\nexport default function createBase<\n T extends { LISTS: Record<string, any>; FOLDERS?: Record<string, any> } = any\n>() {\n function create({\n baseURL,\n config,\n }: {\n baseURL: string;\n config?: AxiosConfig;\n }) {\n if (!baseURL) {\n throw new Error('A valid SharePoint URL must be provided.');\n }\n return new SHAREPOINT_REQUESTS<T>(baseURL, config);\n }\n\n return {\n /**\n * @deprecated Use `create` instead.\n */\n baseURL(url: string, config?: AxiosConfig) {\n return create({ baseURL: url, config });\n },\n create,\n };\n}\n\nexport { LookupField, ChoiceField, PersonField };\n"],"mappings":"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","names":["instance","targetKey","instance","SUPPORTED_VERSION","instance"]}
package/package.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "0.1.19",
2
+ "version": "0.1.20",
3
3
  "license": "MIT",
4
4
  "main": "dist/index.js",
5
5
  "typings": "dist/index.d.ts",
@@ -11,11 +11,10 @@
11
11
  "node": ">=10"
12
12
  },
13
13
  "scripts": {
14
- "start": "tsdx watch",
15
- "build": "tsdx build",
14
+ "start": "tsup --watch",
15
+ "build": "tsup",
16
16
  "test": "tsdx test",
17
17
  "lint": "tsdx lint",
18
- "prepare": "tsdx build",
19
18
  "size": "size-limit",
20
19
  "analyze": "size-limit --why"
21
20
  },
@@ -31,13 +30,14 @@
31
30
  },
32
31
  "name": "@lindle/sharepoint_requests",
33
32
  "author": "lion.oncemore@gmail.com",
34
- "module": "dist/sharepoint_requests.esm.js",
33
+ "module": "dist/index.mjs",
35
34
  "devDependencies": {
36
35
  "@size-limit/preset-small-lib": "^11.1.4",
37
36
  "husky": "^9.1.4",
38
37
  "size-limit": "^11.1.4",
39
38
  "tsdx": "^0.14.1",
40
39
  "tslib": "^2.8.0",
40
+ "tsup": "^8.5.1",
41
41
  "typescript": "^5.6.3"
42
42
  },
43
43
  "overrides": {
package/src/root/index.ts CHANGED
@@ -46,6 +46,12 @@ type ListKey<T extends { LISTS: Record<string, unknown> }> = Extract<
46
46
  string
47
47
  >;
48
48
 
49
+ /**
50
+ * @deprecated SP.Utilities.Utility.SendEmail was retired by Microsoft on 2025-10-31
51
+ * and no longer sends emails. Migrate to Microsoft Graph API:
52
+ * POST /v1.0/me/sendMail (delegated) or POST /v1.0/users/{id}/sendMail (app)
53
+ * https://learn.microsoft.com/en-us/graph/api/user-sendmail
54
+ */
49
55
  type EmailApi = ((
50
56
  from: string,
51
57
  to: string[] | string,
@@ -64,28 +70,38 @@ class HTTPSharePointRequests<
64
70
  private readonly baseURL: string;
65
71
  private readonly instance: AxiosInstance;
66
72
  private readonly listItemEntityTypeCache: Map<string, string>;
73
+ /**
74
+ * @deprecated SP.Utilities.Utility.SendEmail was retired by Microsoft on 2025-10-31.
75
+ * Migrate to Microsoft Graph API POST /v1.0/me/sendMail
76
+ * https://learn.microsoft.com/en-us/graph/api/user-sendmail
77
+ */
67
78
  public readonly email: EmailApi;
68
79
 
69
80
  constructor(baseURL: string, config?: AxiosConfig) {
70
81
  this.baseURL = baseURL.endsWith('/') ? baseURL : `${baseURL}/`;
71
82
  this.instance = instance(this.baseURL, config);
72
83
  this.listItemEntityTypeCache = new Map<string, string>();
84
+ const buildEmailContext = () =>
85
+ this.createContext<'2013'>({
86
+ endpoint: '_api/SP.Utilities.Utility.SendEmail',
87
+ listName: '',
88
+ sharepointVersion: '2013',
89
+ });
73
90
  this.email = Object.assign(
74
91
  (
75
92
  from: string,
76
93
  to: string[] | string,
77
94
  subject: string | undefined,
78
95
  body: string
79
- ) => {
80
- return this.sendEmail({
96
+ ) =>
97
+ sendEmailRequest(buildEmailContext(), {
81
98
  From: from,
82
99
  To: to,
83
100
  Subject: subject,
84
101
  Body: body,
85
- });
86
- },
102
+ }),
87
103
  {
88
- send: (props: EmailProps) => this.sendEmail(props),
104
+ send: (props: EmailProps) => sendEmailRequest(buildEmailContext(), props),
89
105
  }
90
106
  );
91
107
  }
@@ -105,7 +121,6 @@ class HTTPSharePointRequests<
105
121
  }): RequestContext<V> {
106
122
  return {
107
123
  instance: this.instance,
108
- baseURL: this.baseURL,
109
124
  endpoint,
110
125
  listName,
111
126
  sharepointVersion,
@@ -263,12 +278,12 @@ class HTTPSharePointRequests<
263
278
  });
264
279
 
265
280
  return {
266
- get: () => getListItems(context, options),
281
+ get: () => getListItems<Record<string, unknown>, '2013'>(context, options),
267
282
  };
268
283
  }
269
284
 
270
285
  public getDigest() {
271
- return fetchDigest(this.instance, this.baseURL);
286
+ return fetchDigest(this.instance);
272
287
  }
273
288
 
274
289
  public folders(options?: Folder_Options<Record<string, unknown>>) {
@@ -320,10 +335,15 @@ class HTTPSharePointRequests<
320
335
  });
321
336
 
322
337
  return {
323
- get: () => getListItems(context, options),
338
+ get: () => getListItems<Record<string, unknown>, '2013'>(context, options),
324
339
  };
325
340
  }
326
341
 
342
+ /**
343
+ * @deprecated SP.Utilities.Utility.SendEmail was retired by Microsoft on 2025-10-31.
344
+ * Migrate to Microsoft Graph API POST /v1.0/me/sendMail
345
+ * https://learn.microsoft.com/en-us/graph/api/user-sendmail
346
+ */
327
347
  public sendEmail(props: EmailProps) {
328
348
  const context = this.createContext<'2013'>({
329
349
  endpoint: '_api/SP.Utilities.Utility.SendEmail',
@@ -7,6 +7,13 @@ const defaultConfig: AxiosConfig = {
7
7
  },
8
8
  timeout: 15000,
9
9
  withCredentials: true,
10
+ paramsSerializer: {
11
+ serialize: (params: Record<string, string | number | undefined>) =>
12
+ Object.entries(params)
13
+ .filter(([, v]) => v !== undefined && v !== null)
14
+ .map(([k, v]) => `${k}=${String(v)}`)
15
+ .join('&'),
16
+ },
10
17
  };
11
18
 
12
19
  export const instance = (baseURL: string, config?: AxiosConfig) => {
@@ -3,7 +3,6 @@ import { SHAREPOINT_VER } from '../../types';
3
3
 
4
4
  export interface RequestContext<V extends SHAREPOINT_VER = '2013'> {
5
5
  instance: AxiosInstance;
6
- baseURL: string;
7
6
  endpoint: string;
8
7
  listName: string;
9
8
  sharepointVersion: V;
@@ -1,23 +1,29 @@
1
1
  import { AxiosInstance } from 'axios';
2
2
 
3
- export async function fetchDigest(
4
- instance: AxiosInstance,
5
- baseURL: string
6
- ): Promise<string> {
7
- try {
8
- const response = await instance.post(`${baseURL}_api/contextinfo`);
3
+ type DigestEntry = { value: string; expiresAt: number };
4
+ const cache = new WeakMap<AxiosInstance, DigestEntry>();
9
5
 
10
- const formDigestValue =
11
- response.data?.d?.GetContextWebInformation?.FormDigestValue;
6
+ export async function fetchDigest(instance: AxiosInstance): Promise<string> {
7
+ const cached = cache.get(instance);
8
+ if (cached && Date.now() < cached.expiresAt) {
9
+ return cached.value;
10
+ }
11
+
12
+ try {
13
+ const response = await instance.post('_api/contextinfo');
14
+ const info = response.data?.d?.GetContextWebInformation;
15
+ const formDigestValue = info?.FormDigestValue;
12
16
 
13
17
  if (!formDigestValue) {
14
18
  throw new Error('Invalid response structure: Missing FormDigestValue');
15
19
  }
16
20
 
21
+ const ttl = (info?.FormDigestTimeoutSeconds ?? 1800) - 60;
22
+ cache.set(instance, { value: formDigestValue, expiresAt: Date.now() + ttl * 1000 });
23
+
17
24
  return formDigestValue;
18
25
  } catch (error) {
19
- const cause =
20
- error instanceof Error ? error.message : 'Unknown contextinfo error';
26
+ const cause = error instanceof Error ? error.message : 'Unknown contextinfo error';
21
27
  throw new Error(`Error retrieving Form Digest Value: ${cause}`);
22
28
  }
23
29
  }
@@ -13,14 +13,11 @@ export async function sendEmail(
13
13
  context: RequestContext,
14
14
  { From, To, Subject, Body }: EmailProps
15
15
  ): Promise<SendEmailResponse> {
16
- const httpRequest = '_api/SP.Utilities.Utility.SendEmail';
17
-
18
16
  const response = await context.instance({
19
- url: httpRequest,
17
+ url: '_api/SP.Utilities.Utility.SendEmail',
20
18
  method: 'POST',
21
19
  headers: {
22
- 'X-RequestDigest': await fetchDigest(context.instance, context.baseURL),
23
- 'X-Http-Method': 'POST',
20
+ 'X-RequestDigest': await fetchDigest(context.instance),
24
21
  'Content-Type': 'application/json;odata=verbose',
25
22
  },
26
23
  data: JSON.stringify({
@@ -18,11 +18,11 @@ export async function createAttachment<V extends SHAREPOINT_VER = '2013'>(
18
18
  const requestUrl = `${buildListByTitleEndpoint(
19
19
  context.listName
20
20
  )}/items(${itemId})/AttachmentFiles/add(FileName='${encodedFileName}')`;
21
+
21
22
  const response = await context.instance.post(requestUrl, file, {
22
23
  headers: {
23
- 'X-RequestDigest': await fetchDigest(context.instance, context.baseURL),
24
+ 'X-RequestDigest': await fetchDigest(context.instance),
24
25
  },
25
- withCredentials: true,
26
26
  });
27
27
 
28
28
  return response;
@@ -2,20 +2,7 @@ import { ListData, SHAREPOINT_VER } from '../../../types';
2
2
  import { fetchDigest } from '../digest';
3
3
  import { RequestContext } from '../context';
4
4
  import { normalizeListPayload } from './normalizePayload';
5
-
6
- async function resolveMetadataType<V extends SHAREPOINT_VER>(
7
- context: RequestContext<V>
8
- ) {
9
- if (context.resolveListItemEntityType) {
10
- return context.resolveListItemEntityType();
11
- }
12
-
13
- if (context.listItemEntityTypeFullName) {
14
- return context.listItemEntityTypeFullName;
15
- }
16
-
17
- return `SP.Data.${context.listName}ListItem`;
18
- }
5
+ import { resolveMetadataType } from './resolveMetadataType';
19
6
 
20
7
  export async function createListItem<
21
8
  D = Record<string, unknown>,
@@ -31,9 +18,7 @@ export async function createListItem<
31
18
  payload = {
32
19
  ...normalizedData,
33
20
  __metadata: {
34
- ...(userMetadata && typeof userMetadata === 'object'
35
- ? userMetadata
36
- : {}),
21
+ ...(userMetadata && typeof userMetadata === 'object' ? userMetadata : {}),
37
22
  type: metadataType,
38
23
  },
39
24
  };
@@ -44,7 +29,7 @@ export async function createListItem<
44
29
  method: 'POST',
45
30
  data: JSON.stringify(payload),
46
31
  headers: {
47
- 'X-RequestDigest': await fetchDigest(context.instance, context.baseURL),
32
+ 'X-RequestDigest': await fetchDigest(context.instance),
48
33
  },
49
34
  });
50
35
 
@@ -21,7 +21,7 @@ export async function deleteFile<V extends SHAREPOINT_VER = '2013'>(
21
21
  requestUrl += buildLibraryPath(folderPath);
22
22
  requestUrl += `/Files('${encodedFileName}')`;
23
23
 
24
- const digest = await fetchDigest(context.instance, context.baseURL);
24
+ const digest = await fetchDigest(context.instance);
25
25
 
26
26
  const response = await context.instance.post(requestUrl, undefined, {
27
27
  headers: {
@@ -29,7 +29,6 @@ export async function deleteFile<V extends SHAREPOINT_VER = '2013'>(
29
29
  'IF-MATCH': '*',
30
30
  'X-RequestDigest': digest,
31
31
  },
32
- withCredentials: true,
33
32
  });
34
33
 
35
34
  return response;
@@ -7,7 +7,7 @@ export async function deleteItem<V extends SHAREPOINT_VER = '2013'>(
7
7
  context: RequestContext<V>,
8
8
  id: number | string
9
9
  ) {
10
- const requestDigest = await fetchDigest(context.instance, context.baseURL);
10
+ const requestDigest = await fetchDigest(context.instance);
11
11
  const url =
12
12
  context.sharepointVersion === '2013'
13
13
  ? `${buildListByTitleEndpoint(context.listName)}/items(${id})`
@@ -2,11 +2,35 @@ import { Options, SPItem, SHAREPOINT_VER } from '../../../types';
2
2
  import { appendParamsToUrl, buildODataParams } from '../odata';
3
3
  import { RequestContext } from '../context';
4
4
 
5
- export async function getListItems<K, V extends SHAREPOINT_VER = '2013'>(
5
+ type ListItemShape<K, V extends SHAREPOINT_VER> = K & Partial<SPItem<V>>;
6
+
7
+ type SelectedColumns<
8
+ K,
9
+ V extends SHAREPOINT_VER,
10
+ O extends Options<K, V> | undefined
11
+ > = O extends { cols?: infer C }
12
+ ? C extends readonly (infer Key)[]
13
+ ? Extract<Key, keyof ListItemShape<K, V>>
14
+ : Extract<C, keyof ListItemShape<K, V>>
15
+ : never;
16
+
17
+ type ListItemResponseData<
18
+ K,
19
+ V extends SHAREPOINT_VER,
20
+ O extends Options<K, V> | undefined
21
+ > = [SelectedColumns<K, V, O>] extends [never]
22
+ ? ListItemShape<K, V>
23
+ : Pick<ListItemShape<K, V>, SelectedColumns<K, V, O>>;
24
+
25
+ export async function getListItems<
26
+ K,
27
+ V extends SHAREPOINT_VER = '2013',
28
+ O extends Options<K, V> | undefined = Options<K, V> | undefined
29
+ >(
6
30
  context: RequestContext<V>,
7
- options?: Options<K, V>
31
+ options?: O
8
32
  ): Promise<{
9
- data: (K & Partial<SPItem<V>>) | (K & Partial<SPItem<V>>)[] | undefined;
33
+ data: ListItemResponseData<K, V, O> | ListItemResponseData<K, V, O>[] | undefined;
10
34
  meta: { url: URL };
11
35
  }> {
12
36
  const params = buildODataParams(options, ' ');
@@ -22,9 +46,12 @@ export async function getListItems<K, V extends SHAREPOINT_VER = '2013'>(
22
46
 
23
47
  const rawData =
24
48
  response.data?.d?.results ?? response.data?.d ?? response.data;
25
- const cols = options?.cols;
49
+ const cols = options?.cols as Options<K, V>['cols'] | undefined;
26
50
  const keys = cols
27
- ? (Array.isArray(cols) ? cols : [cols]).filter(Boolean)
51
+ ? (Array.isArray(cols) ? cols : [cols]).filter(
52
+ (key): key is Extract<keyof ListItemShape<K, V>, string> =>
53
+ typeof key === 'string'
54
+ )
28
55
  : undefined;
29
56
 
30
57
  const filterItem = (item: unknown) => {
@@ -49,8 +76,8 @@ export async function getListItems<K, V extends SHAREPOINT_VER = '2013'>(
49
76
 
50
77
  return {
51
78
  data: data as
52
- | (K & Partial<SPItem<V>>)
53
- | (K & Partial<SPItem<V>>)[]
79
+ | ListItemResponseData<K, V, O>
80
+ | ListItemResponseData<K, V, O>[]
54
81
  | undefined,
55
82
  meta,
56
83
  };
@@ -0,0 +1,14 @@
1
+ import { SHAREPOINT_VER } from '../../../types';
2
+ import { RequestContext } from '../context';
3
+
4
+ export async function resolveMetadataType<V extends SHAREPOINT_VER>(
5
+ context: RequestContext<V>
6
+ ): Promise<string> {
7
+ if (context.resolveListItemEntityType) {
8
+ return context.resolveListItemEntityType();
9
+ }
10
+ if (context.listItemEntityTypeFullName) {
11
+ return context.listItemEntityTypeFullName;
12
+ }
13
+ return `SP.Data.${context.listName}ListItem`;
14
+ }
@@ -3,20 +3,7 @@ import { fetchDigest } from '../digest';
3
3
  import { RequestContext } from '../context';
4
4
  import { normalizeListPayload } from './normalizePayload';
5
5
  import { buildListByTitleEndpoint } from '../sharepointUrl';
6
-
7
- async function resolveMetadataType<V extends SHAREPOINT_VER>(
8
- context: RequestContext<V>
9
- ) {
10
- if (context.resolveListItemEntityType) {
11
- return context.resolveListItemEntityType();
12
- }
13
-
14
- if (context.listItemEntityTypeFullName) {
15
- return context.listItemEntityTypeFullName;
16
- }
17
-
18
- return `SP.Data.${context.listName}ListItem`;
19
- }
6
+ import { resolveMetadataType } from './resolveMetadataType';
20
7
 
21
8
  export async function updateListItem<
22
9
  D = Record<string, unknown>,
@@ -27,8 +14,7 @@ export async function updateListItem<
27
14
  data: ListData<D>,
28
15
  digest?: string
29
16
  ) {
30
- const formDigestValue =
31
- digest || (await fetchDigest(context.instance, context.baseURL));
17
+ const formDigestValue = digest ?? (await fetchDigest(context.instance));
32
18
 
33
19
  const normalizedData = normalizeListPayload(data);
34
20
  let payload: Record<string, unknown> = normalizedData;
@@ -40,9 +26,7 @@ export async function updateListItem<
40
26
  payload = {
41
27
  ...normalizedData,
42
28
  __metadata: {
43
- ...(userMetadata && typeof userMetadata === 'object'
44
- ? userMetadata
45
- : {}),
29
+ ...(userMetadata && typeof userMetadata === 'object' ? userMetadata : {}),
46
30
  type: metadataType,
47
31
  },
48
32
  };
@@ -10,7 +10,7 @@ const SUPPORTED_VERSION: SHAREPOINT_VER = '2013';
10
10
  export async function uploadFile<V extends SHAREPOINT_VER = '2013'>(
11
11
  context: RequestContext<V>,
12
12
  { file, folderPath, overwrite = true }: UploadFileProps
13
- ): Promise<AxiosResponse & { itemId?: ItemID }> {
13
+ ): Promise<{ response: AxiosResponse; itemId?: ItemID }> {
14
14
  if (context.sharepointVersion !== SUPPORTED_VERSION) {
15
15
  throw new Error(
16
16
  'uploadFile is only supported for SharePoint 2013 REST endpoints.'
@@ -22,7 +22,6 @@ export async function uploadFile<V extends SHAREPOINT_VER = '2013'>(
22
22
  }
23
23
 
24
24
  let requestUrl = `${buildListByTitleEndpoint(context.listName)}/RootFolder`;
25
-
26
25
  requestUrl += buildLibraryPath(folderPath);
27
26
 
28
27
  const encodedFileName = encodeFileName(file.name);
@@ -30,37 +29,33 @@ export async function uploadFile<V extends SHAREPOINT_VER = '2013'>(
30
29
  overwrite ? 'true' : 'false'
31
30
  })?$expand=ListItemAllFields&$select=ListItemAllFields/Id`;
32
31
 
33
- const digest = await fetchDigest(context.instance, context.baseURL);
32
+ const digest = await fetchDigest(context.instance);
34
33
 
35
- const response = (await context.instance.post(requestUrl, file, {
34
+ const response = await context.instance.post(requestUrl, file, {
36
35
  headers: {
37
36
  'Content-Type': file.type || 'application/octet-stream',
38
37
  'X-RequestDigest': digest,
39
38
  },
40
- withCredentials: true,
41
- })) as AxiosResponse & { itemId?: ItemID };
39
+ });
42
40
 
43
41
  const responseData = response.data?.d ?? response.data;
44
42
  const listItemFields = responseData?.ListItemAllFields;
45
- const itemId =
43
+ let itemId: ItemID | undefined =
46
44
  listItemFields?.Id ??
47
45
  listItemFields?.ID ??
48
46
  responseData?.Id ??
49
47
  responseData?.ID;
50
48
 
51
- if (typeof itemId !== 'undefined') {
52
- response.itemId = itemId;
53
- } else if (listItemFields?.__deferred?.uri) {
49
+ if (typeof itemId === 'undefined' && listItemFields?.__deferred?.uri) {
54
50
  const listItemResponse = await context.instance.get(
55
51
  listItemFields.__deferred.uri
56
52
  );
57
53
  const deferredId =
58
54
  listItemResponse.data?.d?.Id ?? listItemResponse.data?.Id;
59
-
60
55
  if (typeof deferredId !== 'undefined') {
61
- response.itemId = deferredId;
56
+ itemId = deferredId;
62
57
  }
63
58
  }
64
59
 
65
- return response;
60
+ return { response, itemId };
66
61
  }