@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 @@
1
+ {"version":3,"sources":["../../bin/sp-generate-types.ts","../../src/cli/generate-types.ts","../../src/cli/config-loader.ts","../../src/cli/cache-manager.ts","../../src/cli/interactive-prompt.ts","../../src/cli/list-resolver.ts","../../src/cli/templates.ts","../../src/cli/type-generator.ts","../../src/client/errors.ts","../../src/client/utils.ts","../../src/client/sp-client.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { Command } from 'commander';\nimport { generateTypes } from '../src/cli/generate-types.js';\nimport type { ListSelectionStrategy } from '../src/cli/config-loader.js';\n\nconst program = new Command();\n\nprogram\n .name('sp-generate-types')\n .description('Generate TypeScript interfaces from SharePoint content types')\n .version('0.1.0')\n .requiredOption('-c, --config <path>', 'Path to sharepoint.config.ts or .json file')\n .option('--non-interactive', 'Run in non-interactive mode (for CI/CD)', false)\n .option(\n '-s, --strategy <strategy>',\n 'List selection strategy when multiple lists found (interactive|first|error|all)',\n )\n .option('--clear-cache', 'Clear the resolution cache and exit', false)\n .option('--update-cache', 'Force update the cache', false)\n .action(async (opts) => {\n try {\n await generateTypes({\n configPath: opts.config,\n nonInteractive: opts.nonInteractive,\n strategy: opts.strategy as ListSelectionStrategy | undefined,\n clearCache: opts.clearCache,\n updateCache: opts.updateCache,\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.error(`\\nError: ${message}\\n`);\n process.exit(1);\n }\n });\n\nprogram.parse();\n","import { writeFileSync, mkdirSync } from 'fs';\nimport { dirname, resolve } from 'path';\nimport { ConfidentialClientApplication } from '@azure/msal-node';\nimport { loadConfig, type SpKitConfig, type ListSelectionStrategy } from './config-loader.js';\nimport { CacheManager } from './cache-manager.js';\nimport { resolveContentType, type ResolvedContentType } from './list-resolver.js';\nimport { generateTypeScript } from './type-generator.js';\nimport { createSpClient } from '../client/sp-client.js';\n\nexport interface GenerateTypesOptions {\n configPath: string;\n nonInteractive?: boolean;\n strategy?: ListSelectionStrategy;\n clearCache?: boolean;\n updateCache?: boolean;\n}\n\nexport async function generateTypes(options: GenerateTypesOptions): Promise<void> {\n const { configPath, nonInteractive = false, strategy, clearCache = false } = options;\n\n console.log('\\nSharePoint Kit - Type Generator\\n');\n\n const config = await loadConfig(configPath);\n const outputDir = config.options?.outputDir ?? './generated';\n const outputFile = config.options?.outputFile ?? 'sp-types.ts';\n const cacheManager = new CacheManager(outputDir);\n\n if (clearCache) {\n cacheManager.clear();\n console.log('Cache cleared.\\n');\n return;\n }\n\n const globalStrategy = strategy ?? config.defaultStrategy ?? 'interactive';\n\n console.log(`Site: ${config.siteId}`);\n console.log(`Strategy: ${globalStrategy}`);\n console.log(`Output: ${outputDir}/${outputFile}\\n`);\n\n const getAccessToken = await createTokenProvider(config);\n\n const client = createSpClient({\n siteId: config.siteId,\n getAccessToken,\n });\n\n console.log('Scanning SharePoint site...\\n');\n\n const allResolved: ResolvedContentType[] = [];\n\n for (const ctConfig of config.contentTypes) {\n console.log(`Processing: \"${ctConfig.contentTypeName}\" -> ${ctConfig.outputType}`);\n\n try {\n const resolved = await resolveContentType(\n ctConfig,\n config.siteId,\n client,\n cacheManager,\n globalStrategy,\n nonInteractive,\n );\n allResolved.push(...resolved);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.error(` Error: ${message}`);\n\n if (nonInteractive) {\n throw error;\n }\n }\n }\n\n if (allResolved.length === 0) {\n console.log('\\nNo content types resolved. Nothing to generate.\\n');\n return;\n }\n\n console.log(`\\nGenerating TypeScript interfaces...\\n`);\n\n const tsContent = await generateTypeScript(\n allResolved,\n client,\n { fieldNameMapping: config.options?.fieldNameMapping },\n );\n\n const outputPath = resolve(process.cwd(), outputDir, outputFile);\n mkdirSync(dirname(outputPath), { recursive: true });\n writeFileSync(outputPath, tsContent, 'utf-8');\n\n console.log(`\\nDone! Generated ${allResolved.length} interface(s).`);\n console.log(`Output: ${outputPath}\\n`);\n}\n\nasync function createTokenProvider(config: SpKitConfig): Promise<() => Promise<string>> {\n if (!config.tenantId || !config.clientId) {\n throw new Error(\n 'tenantId and clientId are required in config for authentication. ' +\n 'You can set them via environment variables: SHAREPOINT_TENANT_ID, SHAREPOINT_CLIENT_ID',\n );\n }\n\n const clientSecret = config.clientSecret ?? process.env.SHAREPOINT_CLIENT_SECRET;\n\n if (!clientSecret) {\n throw new Error(\n 'clientSecret is required for authentication. ' +\n 'Set it in config or via SHAREPOINT_CLIENT_SECRET environment variable',\n );\n }\n\n const msalConfig = {\n auth: {\n clientId: config.clientId,\n authority: `https://login.microsoftonline.com/${config.tenantId}`,\n clientSecret,\n },\n };\n\n const cca = new ConfidentialClientApplication(msalConfig);\n\n return async () => {\n const result = await cca.acquireTokenByClientCredential({\n scopes: ['https://graph.microsoft.com/.default'],\n });\n\n if (!result?.accessToken) {\n throw new Error('Failed to acquire access token');\n }\n\n return result.accessToken;\n };\n}\n","import { readFileSync, existsSync } from 'fs';\nimport { resolve, extname } from 'path';\n\nexport type ListSelectionStrategy = 'interactive' | 'first' | 'error' | 'all';\n\n/** Microsoft login (MSAL) config for browser/SPA. Use for \"Sign in with Microsoft\". */\nexport interface SpLoginConfig {\n tenantId: string;\n clientId: string;\n redirectUri: string;\n scopes?: string[];\n}\n\nexport interface ContentTypeConfig {\n listId?: string;\n listName?: string;\n contentTypeName: string;\n outputType: string;\n strategy?: ListSelectionStrategy;\n}\n\nexport interface SpKitConfig {\n siteId: string;\n tenantId?: string;\n clientId?: string;\n clientSecret?: string;\n /** Microsoft login config for browser (SPA). Optional; when set, enables \"Sign in with Microsoft\". */\n login?: SpLoginConfig;\n defaultStrategy?: ListSelectionStrategy;\n contentTypes: ContentTypeConfig[];\n options?: {\n outputDir?: string;\n outputFile?: string;\n fieldNameMapping?: Record<string, string>;\n };\n}\n\nexport async function loadConfig(configPath: string): Promise<SpKitConfig> {\n const absolutePath = resolve(process.cwd(), configPath);\n\n if (!existsSync(absolutePath)) {\n throw new Error(`Config file not found: ${absolutePath}`);\n }\n\n const ext = extname(absolutePath);\n let config: SpKitConfig;\n\n if (ext === '.json') {\n const content = readFileSync(absolutePath, 'utf-8');\n config = JSON.parse(content) as SpKitConfig;\n } else if (ext === '.ts' || ext === '.js' || ext === '.mjs') {\n const module = await import(absolutePath);\n config = module.default ?? module;\n } else {\n throw new Error(`Unsupported config file format: ${ext}. Use .json, .ts, .js, or .mjs`);\n }\n\n validateConfig(config);\n return config;\n}\n\nfunction validateConfig(config: unknown): asserts config is SpKitConfig {\n if (!config || typeof config !== 'object') {\n throw new Error('Config must be an object');\n }\n\n const c = config as Record<string, unknown>;\n\n if (!c.siteId || typeof c.siteId !== 'string') {\n throw new Error('Config must have a \"siteId\" string property');\n }\n\n if (!Array.isArray(c.contentTypes) || c.contentTypes.length === 0) {\n throw new Error('Config must have a non-empty \"contentTypes\" array');\n }\n\n for (const [index, ct] of (c.contentTypes as unknown[]).entries()) {\n if (!ct || typeof ct !== 'object') {\n throw new Error(`contentTypes[${index}] must be an object`);\n }\n\n const ctObj = ct as Record<string, unknown>;\n\n if (!ctObj.contentTypeName || typeof ctObj.contentTypeName !== 'string') {\n throw new Error(`contentTypes[${index}] must have a \"contentTypeName\" string property`);\n }\n\n if (!ctObj.outputType || typeof ctObj.outputType !== 'string') {\n throw new Error(`contentTypes[${index}] must have an \"outputType\" string property`);\n }\n\n if (ctObj.listId !== undefined && typeof ctObj.listId !== 'string') {\n throw new Error(`contentTypes[${index}].listId must be a string`);\n }\n\n if (ctObj.listName !== undefined && typeof ctObj.listName !== 'string') {\n throw new Error(`contentTypes[${index}].listName must be a string`);\n }\n\n const validStrategies: ListSelectionStrategy[] = ['interactive', 'first', 'error', 'all'];\n if (ctObj.strategy !== undefined && !validStrategies.includes(ctObj.strategy as ListSelectionStrategy)) {\n throw new Error(`contentTypes[${index}].strategy must be one of: ${validStrategies.join(', ')}`);\n }\n }\n\n if (c.defaultStrategy !== undefined) {\n const validStrategies: ListSelectionStrategy[] = ['interactive', 'first', 'error', 'all'];\n if (!validStrategies.includes(c.defaultStrategy as ListSelectionStrategy)) {\n throw new Error(`defaultStrategy must be one of: ${validStrategies.join(', ')}`);\n }\n }\n}\n","import { readFileSync, writeFileSync, existsSync } from 'fs';\nimport { join } from 'path';\n\nexport interface CacheResolution {\n listId: string;\n listName: string;\n resolvedAt: string;\n}\n\nexport interface CacheData {\n siteId: string;\n lastUpdated: string;\n lists: Array<{\n id: string;\n displayName: string;\n name: string;\n contentTypes: string[];\n }>;\n resolutions: Record<string, CacheResolution>;\n}\n\nconst CACHE_FILE = '.sharepoint-cache.json';\n\nexport class CacheManager {\n private cachePath: string;\n\n constructor(outputDir: string = './') {\n this.cachePath = join(outputDir, CACHE_FILE);\n }\n\n load(): CacheData | null {\n if (!existsSync(this.cachePath)) {\n return null;\n }\n\n try {\n const content = readFileSync(this.cachePath, 'utf-8');\n const data = JSON.parse(content);\n if (!data || typeof data !== 'object') return null;\n return data as CacheData;\n } catch {\n return null;\n }\n }\n\n save(data: CacheData): void {\n writeFileSync(this.cachePath, JSON.stringify(data, null, 2), 'utf-8');\n }\n\n getResolution(contentTypeName: string): CacheResolution | null {\n const cache = this.load();\n if (!cache) return null;\n return cache.resolutions[contentTypeName] ?? null;\n }\n\n saveResolution(\n siteId: string,\n contentTypeName: string,\n listId: string,\n listName: string,\n ): void {\n const cache = this.load() ?? {\n siteId,\n lastUpdated: new Date().toISOString(),\n lists: [],\n resolutions: {},\n };\n\n cache.lastUpdated = new Date().toISOString();\n cache.siteId = siteId;\n cache.resolutions[contentTypeName] = {\n listId,\n listName,\n resolvedAt: new Date().toISOString(),\n };\n\n this.save(cache);\n }\n\n saveLists(\n siteId: string,\n lists: Array<{ id: string; displayName: string; name: string; contentTypes: string[] }>,\n ): void {\n const cache = this.load() ?? {\n siteId,\n lastUpdated: new Date().toISOString(),\n lists: [],\n resolutions: {},\n };\n\n cache.siteId = siteId;\n cache.lastUpdated = new Date().toISOString();\n cache.lists = lists;\n\n this.save(cache);\n }\n\n clear(): void {\n if (existsSync(this.cachePath)) {\n writeFileSync(this.cachePath, '{}', 'utf-8');\n console.log('Cache cleared.');\n }\n }\n\n getCachePath(): string {\n return this.cachePath;\n }\n}\n","import prompts from 'prompts';\nimport type { ListSelectionStrategy } from './config-loader.js';\n\nexport interface ListInfo {\n id: string;\n displayName: string;\n name: string;\n}\n\nexport interface ListSelection {\n listId: string;\n listName: string;\n}\n\nexport async function promptListSelection(\n contentTypeName: string,\n lists: ListInfo[],\n strategy: ListSelectionStrategy = 'interactive',\n): Promise<ListSelection[]> {\n if (strategy === 'first') {\n console.log(` Using first match: \"${lists[0].displayName}\" (${lists[0].id})`);\n return [{ listId: lists[0].id, listName: lists[0].displayName }];\n }\n\n if (strategy === 'error') {\n throw new Error(\n `Content type \"${contentTypeName}\" found in ${lists.length} lists. ` +\n `Please specify listId or listName in config, or use --strategy=all`,\n );\n }\n\n if (strategy === 'all') {\n console.log(` Generating types for ALL ${lists.length} lists`);\n return lists.map((list) => ({\n listId: list.id,\n listName: list.displayName,\n }));\n }\n\n console.log(`\\n Content type \"${contentTypeName}\" found in ${lists.length} lists:\\n`);\n\n const choices = [\n ...lists.map((list, index) => ({\n title: `${index + 1}. ${list.displayName} (${list.id})`,\n value: list.id,\n description: `List ID: ${list.id}`,\n })),\n {\n title: `Generate types for ALL ${lists.length} lists`,\n value: '__all__',\n description: lists.map((l) => l.displayName).join(', '),\n },\n {\n title: 'Skip this content type',\n value: '__skip__',\n description: 'Do not generate types for this content type',\n },\n ];\n\n const response = await prompts({\n type: 'select',\n name: 'selection',\n message: `Which list(s) should be used for \"${contentTypeName}\"?`,\n choices,\n initial: 0,\n });\n\n if (!response.selection || response.selection === '__skip__') {\n console.log(` Skipped \"${contentTypeName}\"\\n`);\n return [];\n }\n\n if (response.selection === '__all__') {\n console.log(` Generating types for all lists\\n`);\n return lists.map((list) => ({\n listId: list.id,\n listName: list.displayName,\n }));\n }\n\n const selectedList = lists.find((l) => l.id === response.selection);\n if (!selectedList) {\n throw new Error('Invalid selection');\n }\n\n console.log(` Selected: ${selectedList.displayName}\\n`);\n return [{ listId: response.selection, listName: selectedList.displayName }];\n}\n","import type { ContentTypeConfig, ListSelectionStrategy } from './config-loader.js';\nimport type { CacheManager } from './cache-manager.js';\nimport { promptListSelection, type ListInfo } from './interactive-prompt.js';\n\nexport interface ResolvedContentType {\n contentTypeName: string;\n outputType: string;\n listId: string;\n listName: string;\n}\n\ninterface GraphClient {\n getLists(): Promise<Array<{ id: string; displayName: string; name: string }>>;\n getList(options: { listId: string }): Promise<{ id: string; displayName: string; name: string }>;\n getListContentTypes(options: { listId: string }): Promise<Array<{ id: string; name: string }>>;\n}\n\nexport async function resolveContentType(\n config: ContentTypeConfig,\n siteId: string,\n graphClient: GraphClient,\n cacheManager: CacheManager,\n globalStrategy: ListSelectionStrategy,\n nonInteractive: boolean,\n): Promise<ResolvedContentType[]> {\n const strategy = config.strategy ?? globalStrategy;\n\n if (config.listId) {\n const list = await graphClient.getList({ listId: config.listId });\n console.log(` Found list \"${list.displayName}\" (${list.id})`);\n return [{\n contentTypeName: config.contentTypeName,\n outputType: config.outputType,\n listId: config.listId,\n listName: list.displayName,\n }];\n }\n\n const cached = cacheManager.getResolution(config.contentTypeName);\n if (cached) {\n console.log(` Using cached resolution for \"${config.contentTypeName}\": ${cached.listName}`);\n return [{\n contentTypeName: config.contentTypeName,\n outputType: config.outputType,\n listId: cached.listId,\n listName: cached.listName,\n }];\n }\n\n const lists = await graphClient.getLists();\n\n if (config.listName) {\n const list = lists.find(\n (l) => l.displayName === config.listName || l.name === config.listName,\n );\n\n if (!list) {\n throw new Error(`List \"${config.listName}\" not found in site \"${siteId}\"`);\n }\n\n console.log(` Found list \"${list.displayName}\" (${list.id})`);\n cacheManager.saveResolution(siteId, config.contentTypeName, list.id, list.displayName);\n\n return [{\n contentTypeName: config.contentTypeName,\n outputType: config.outputType,\n listId: list.id,\n listName: list.displayName,\n }];\n }\n\n console.log(` Scanning lists for content type \"${config.contentTypeName}\"...`);\n const matchingLists: ListInfo[] = [];\n\n for (const list of lists) {\n try {\n const contentTypes = await graphClient.getListContentTypes({ listId: list.id });\n if (contentTypes.some((ct) => ct.name === config.contentTypeName)) {\n matchingLists.push({\n id: list.id,\n displayName: list.displayName,\n name: list.name,\n });\n }\n } catch {\n // Skip lists with access errors\n }\n }\n\n if (matchingLists.length === 0) {\n throw new Error(\n `Content type \"${config.contentTypeName}\" not found in any list of site \"${siteId}\"`,\n );\n }\n\n if (matchingLists.length === 1) {\n const list = matchingLists[0];\n console.log(` Found content type \"${config.contentTypeName}\" in list \"${list.displayName}\"`);\n cacheManager.saveResolution(siteId, config.contentTypeName, list.id, list.displayName);\n\n return [{\n contentTypeName: config.contentTypeName,\n outputType: config.outputType,\n listId: list.id,\n listName: list.displayName,\n }];\n }\n\n const effectiveStrategy = nonInteractive && strategy === 'interactive' ? 'first' : strategy;\n\n const selectedLists = await promptListSelection(\n config.contentTypeName,\n matchingLists,\n effectiveStrategy,\n );\n\n if (selectedLists.length === 0) {\n return [];\n }\n\n if (selectedLists.length === 1) {\n cacheManager.saveResolution(\n siteId,\n config.contentTypeName,\n selectedLists[0].listId,\n selectedLists[0].listName,\n );\n }\n\n if (selectedLists.length > 1) {\n return selectedLists.map((list) => ({\n contentTypeName: config.contentTypeName,\n outputType: `${config.outputType}_${list.listName.replace(/\\s+/g, '')}`,\n listId: list.listId,\n listName: list.listName,\n }));\n }\n\n return selectedLists.map((list) => ({\n contentTypeName: config.contentTypeName,\n outputType: config.outputType,\n listId: list.listId,\n listName: list.listName,\n }));\n}\n","export function generateFileHeader(): string {\n return [\n '// Auto-generated by @mustafaaksoy41/sharepoint-kit CLI',\n '// Do not edit manually. Run: npx sp-generate-types --config sharepoint.config.ts',\n '',\n ].join('\\n');\n}\n\nexport function generateInterface(\n name: string,\n fields: Array<{ name: string; tsType: string; required: boolean; description?: string }>,\n): string {\n const lines: string[] = [];\n lines.push(`export interface ${name} {`);\n\n for (const field of fields) {\n if (field.description) {\n lines.push(` /** ${field.description} */`);\n }\n const optional = field.required ? '' : '?';\n lines.push(` ${field.name}${optional}: ${field.tsType};`);\n }\n\n lines.push('}');\n return lines.join('\\n');\n}\n\nexport function mapSharePointTypeToTs(spType: string): string {\n switch (spType) {\n case 'Text':\n case 'Note':\n case 'Choice':\n return 'string';\n case 'MultiChoice':\n return 'string[]';\n case 'Number':\n case 'Currency':\n return 'number';\n case 'Boolean':\n return 'boolean';\n case 'DateTime':\n return 'string';\n case 'Lookup':\n return '{ id: number; value: string }';\n case 'User':\n return '{ id: number; email: string; displayName: string }';\n case 'URL':\n return '{ url: string; description: string }';\n case 'Taxonomy':\n return '{ termGuid: string; label: string }';\n case 'Calculated':\n return 'string | number';\n default:\n return 'unknown';\n }\n}\n\nexport function sanitizeInterfaceName(name: string): string {\n return name\n .replace(/[^a-zA-Z0-9_]/g, '')\n .replace(/^(\\d)/, '_$1');\n}\n","import type { SpColumn } from '../client/types.js';\nimport { generateFileHeader, generateInterface, mapSharePointTypeToTs, sanitizeInterfaceName } from './templates.js';\n\ninterface GraphClient {\n getColumns(options: { contentTypeId: string }): Promise<SpColumn[]>;\n getListColumns(options: { listId: string }): Promise<SpColumn[]>;\n getContentTypes(options?: { listId?: string }): Promise<Array<{ id: string; name: string }>>;\n getListContentTypes(options: { listId: string }): Promise<Array<{ id: string; name: string }>>;\n}\n\nexport interface TypeGenerationInput {\n contentTypeName: string;\n outputType: string;\n listId: string;\n listName: string;\n}\n\nexport interface TypeGenerationOptions {\n fieldNameMapping?: Record<string, string>;\n}\n\nexport async function generateTypeScript(\n inputs: TypeGenerationInput[],\n graphClient: GraphClient,\n options: TypeGenerationOptions = {},\n): Promise<string> {\n const { fieldNameMapping = {} } = options;\n const interfaces: string[] = [generateFileHeader()];\n\n for (const input of inputs) {\n console.log(` Generating interface \"${input.outputType}\" from list \"${input.listName}\"...`);\n\n const contentTypes = await graphClient.getListContentTypes({ listId: input.listId });\n const contentType = contentTypes.find((ct) => ct.name === input.contentTypeName);\n\n let columns: SpColumn[];\n\n if (contentType) {\n columns = await graphClient.getColumns({ contentTypeId: contentType.id });\n } else {\n console.log(` Content type not found by ID, falling back to list columns`);\n columns = await graphClient.getListColumns({ listId: input.listId });\n }\n\n const writableColumns = columns.filter((col) => !col.readOnly && !isSystemColumn(col.name));\n\n const fields = writableColumns.map((col) => {\n const mappedName = fieldNameMapping[col.name] ?? col.name;\n const tsType = mapSharePointTypeToTs(col.type);\n\n return {\n name: mappedName,\n tsType,\n required: col.required,\n description: col.displayName !== col.name ? col.displayName : undefined,\n };\n });\n\n const interfaceName = sanitizeInterfaceName(input.outputType);\n interfaces.push(generateInterface(interfaceName, fields));\n }\n\n return interfaces.join('\\n\\n') + '\\n';\n}\n\nfunction isSystemColumn(name: string): boolean {\n const systemColumns = new Set([\n 'ContentType',\n 'Modified',\n 'Created',\n 'Author',\n 'Editor',\n '_ModerationComments',\n '_ModerationStatus',\n 'FileSystemObjectType',\n 'ServerRedirectedEmbedUri',\n 'ServerRedirectedEmbedUrl',\n 'ID',\n 'ContentTypeId',\n 'Attachments',\n 'GUID',\n 'OData__UIVersionString',\n 'ComplianceAssetId',\n ]);\n\n return systemColumns.has(name);\n}\n","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"],"mappings":"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","names":["writeFileSync","resolve","readFileSync","existsSync","resolve","resolve","writeFileSync"]}
@@ -0,0 +1,142 @@
1
+ 'use strict';
2
+
3
+ var chunkV6K5IFVV_cjs = require('./chunk-V6K5IFVV.cjs');
4
+ var react = require('react');
5
+ var jsxRuntime = require('react/jsx-runtime');
6
+ var useSWR = require('swr');
7
+
8
+ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
9
+
10
+ var useSWR__default = /*#__PURE__*/_interopDefault(useSWR);
11
+
12
+ var SpContext = react.createContext(null);
13
+ function SpProvider({
14
+ siteId,
15
+ getAccessToken,
16
+ children,
17
+ baseUrl,
18
+ retryOptions
19
+ }) {
20
+ const config = react.useMemo(() => {
21
+ return {
22
+ siteId,
23
+ baseUrl,
24
+ retryOptions,
25
+ getAccessToken
26
+ };
27
+ }, [siteId, baseUrl, retryOptions, getAccessToken]);
28
+ const value = react.useMemo(() => {
29
+ const client = chunkV6K5IFVV_cjs.createSpClient(config);
30
+ return { client, config };
31
+ }, [config]);
32
+ return /* @__PURE__ */ jsxRuntime.jsx(SpContext.Provider, { value, children });
33
+ }
34
+ function useSpContext() {
35
+ const context = react.useContext(SpContext);
36
+ if (!context) {
37
+ throw new Error("useSpContext must be used within a <SpProvider>");
38
+ }
39
+ return context;
40
+ }
41
+ function useSpList(options) {
42
+ const { client } = useSpContext();
43
+ const { enabled = true, refreshInterval, ...listOptions } = options;
44
+ const key = enabled ? ["sp-list", listOptions.listId, listOptions.contentTypeName, listOptions.filter] : null;
45
+ const { data, error, isLoading, mutate } = useSWR__default.default(
46
+ key,
47
+ () => client.getListItems(listOptions),
48
+ { refreshInterval }
49
+ );
50
+ return {
51
+ data,
52
+ isLoading,
53
+ error,
54
+ refetch: mutate
55
+ };
56
+ }
57
+ function useSpCreate(options) {
58
+ const { client } = useSpContext();
59
+ const [state, setState] = react.useState({
60
+ data: void 0,
61
+ error: void 0,
62
+ isLoading: false
63
+ });
64
+ const mutate = react.useCallback(
65
+ async (createOptions) => {
66
+ setState((prev) => ({ ...prev, isLoading: true, error: void 0 }));
67
+ try {
68
+ const result = await client.createItem({
69
+ listId: options.listId,
70
+ ...createOptions
71
+ });
72
+ setState({ data: result, error: void 0, isLoading: false });
73
+ return result;
74
+ } catch (error) {
75
+ setState({ data: void 0, error, isLoading: false });
76
+ throw error;
77
+ }
78
+ },
79
+ [client, options.listId]
80
+ );
81
+ return { ...state, mutate };
82
+ }
83
+ function useSpUpdate(options) {
84
+ const { client } = useSpContext();
85
+ const [state, setState] = react.useState({
86
+ data: void 0,
87
+ error: void 0,
88
+ isLoading: false
89
+ });
90
+ const mutate = react.useCallback(
91
+ async (updateOptions) => {
92
+ setState((prev) => ({ ...prev, isLoading: true, error: void 0 }));
93
+ try {
94
+ const result = await client.updateItem({
95
+ listId: options.listId,
96
+ ...updateOptions
97
+ });
98
+ setState({ data: result, error: void 0, isLoading: false });
99
+ return result;
100
+ } catch (error) {
101
+ setState({ data: void 0, error, isLoading: false });
102
+ throw error;
103
+ }
104
+ },
105
+ [client, options.listId]
106
+ );
107
+ return { ...state, mutate };
108
+ }
109
+ function useSpDelete(options) {
110
+ const { client } = useSpContext();
111
+ const [state, setState] = react.useState({
112
+ data: void 0,
113
+ error: void 0,
114
+ isLoading: false
115
+ });
116
+ const mutate = react.useCallback(
117
+ async (deleteOptions) => {
118
+ setState((prev) => ({ ...prev, isLoading: true, error: void 0 }));
119
+ try {
120
+ await client.deleteItem({
121
+ listId: options.listId,
122
+ ...deleteOptions
123
+ });
124
+ setState({ data: void 0, error: void 0, isLoading: false });
125
+ } catch (error) {
126
+ setState({ data: void 0, error, isLoading: false });
127
+ throw error;
128
+ }
129
+ },
130
+ [client, options.listId]
131
+ );
132
+ return { ...state, mutate };
133
+ }
134
+
135
+ exports.SpProvider = SpProvider;
136
+ exports.useSpContext = useSpContext;
137
+ exports.useSpCreate = useSpCreate;
138
+ exports.useSpDelete = useSpDelete;
139
+ exports.useSpList = useSpList;
140
+ exports.useSpUpdate = useSpUpdate;
141
+ //# sourceMappingURL=chunk-2FU6XS6S.cjs.map
142
+ //# sourceMappingURL=chunk-2FU6XS6S.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/sp-provider.tsx","../src/hooks/use-sp-list.ts","../src/hooks/use-sp-mutation.ts"],"names":["createContext","useMemo","createSpClient","jsx","useContext","useSWR","useState","useCallback"],"mappings":"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","file":"chunk-2FU6XS6S.cjs","sourcesContent":["import React, { createContext, useContext, useMemo } from 'react';\nimport { createSpClient } from '../client/sp-client.js';\nimport type { SpClientConfig } from '../client/types.js';\n\ntype SpClientInstance = ReturnType<typeof createSpClient>;\n\ninterface SpContextValue {\n client: SpClientInstance;\n config: SpClientConfig;\n}\n\nconst SpContext = createContext<SpContextValue | null>(null);\n\nexport interface SpProviderProps {\n siteId: string;\n getAccessToken: () => Promise<string>;\n children: React.ReactNode;\n baseUrl?: string;\n retryOptions?: SpClientConfig['retryOptions'];\n}\n\nexport function SpProvider({\n siteId,\n getAccessToken,\n children,\n baseUrl,\n retryOptions,\n}: SpProviderProps) {\n const config = useMemo<SpClientConfig>(() => {\n return {\n siteId,\n baseUrl,\n retryOptions,\n getAccessToken,\n };\n }, [siteId, baseUrl, retryOptions, getAccessToken]);\n\n const value = useMemo(() => {\n const client = createSpClient(config);\n return { client, config };\n }, [config]);\n\n return <SpContext.Provider value={value}>{children}</SpContext.Provider>;\n}\n\nexport function useSpContext(): SpContextValue {\n const context = useContext(SpContext);\n if (!context) {\n throw new Error('useSpContext must be used within a <SpProvider>');\n }\n return context;\n}\n","import useSWR from 'swr';\nimport type { SpListItem, GetListItemsOptions } from '../client/types.js';\nimport { useSpContext } from '../components/sp-provider.js';\n\nexport interface UseSpListOptions extends GetListItemsOptions {\n enabled?: boolean;\n refreshInterval?: number;\n}\n\nexport interface UseSpListReturn<T extends Record<string, unknown>> {\n data: SpListItem<T>[] | undefined;\n isLoading: boolean;\n error: Error | undefined;\n refetch: () => Promise<SpListItem<T>[] | undefined>;\n}\n\nexport function useSpList<T extends Record<string, unknown> = Record<string, unknown>>(\n options: UseSpListOptions,\n): UseSpListReturn<T> {\n const { client } = useSpContext();\n const { enabled = true, refreshInterval, ...listOptions } = options;\n\n const key = enabled ? ['sp-list', listOptions.listId, listOptions.contentTypeName, listOptions.filter] : null;\n\n const { data, error, isLoading, mutate } = useSWR(\n key,\n () => client.getListItems<T>(listOptions),\n { refreshInterval },\n );\n\n return {\n data,\n isLoading,\n error,\n refetch: mutate,\n };\n}\n","import { useState, useCallback } from 'react';\nimport type { SpListItem, CreateItemOptions, UpdateItemOptions, DeleteItemOptions } from '../client/types.js';\nimport { useSpContext } from '../components/sp-provider.js';\n\ninterface MutationState<T> {\n data: T | undefined;\n error: Error | undefined;\n isLoading: boolean;\n}\n\nexport function useSpCreate<T extends Record<string, unknown> = Record<string, unknown>>(\n options: { listId: string },\n) {\n const { client } = useSpContext();\n const [state, setState] = useState<MutationState<SpListItem<T>>>({\n data: undefined,\n error: undefined,\n isLoading: false,\n });\n\n const mutate = useCallback(\n async (createOptions: Omit<CreateItemOptions<T>, 'listId'>) => {\n setState((prev) => ({ ...prev, isLoading: true, error: undefined }));\n try {\n const result = await client.createItem<T>({\n listId: options.listId,\n ...createOptions,\n });\n setState({ data: result, error: undefined, isLoading: false });\n return result;\n } catch (error) {\n setState({ data: undefined, error: error as Error, isLoading: false });\n throw error;\n }\n },\n [client, options.listId],\n );\n\n return { ...state, mutate };\n}\n\nexport function useSpUpdate<T extends Record<string, unknown> = Record<string, unknown>>(\n options: { listId: string },\n) {\n const { client } = useSpContext();\n const [state, setState] = useState<MutationState<SpListItem<T>>>({\n data: undefined,\n error: undefined,\n isLoading: false,\n });\n\n const mutate = useCallback(\n async (updateOptions: Omit<UpdateItemOptions<T>, 'listId'>) => {\n setState((prev) => ({ ...prev, isLoading: true, error: undefined }));\n try {\n const result = await client.updateItem<T>({\n listId: options.listId,\n ...updateOptions,\n });\n setState({ data: result, error: undefined, isLoading: false });\n return result;\n } catch (error) {\n setState({ data: undefined, error: error as Error, isLoading: false });\n throw error;\n }\n },\n [client, options.listId],\n );\n\n return { ...state, mutate };\n}\n\nexport function useSpDelete(options: { listId: string }) {\n const { client } = useSpContext();\n const [state, setState] = useState<MutationState<void>>({\n data: undefined,\n error: undefined,\n isLoading: false,\n });\n\n const mutate = useCallback(\n async (deleteOptions: Omit<DeleteItemOptions, 'listId'>) => {\n setState((prev) => ({ ...prev, isLoading: true, error: undefined }));\n try {\n await client.deleteItem({\n listId: options.listId,\n ...deleteOptions,\n });\n setState({ data: undefined, error: undefined, isLoading: false });\n } catch (error) {\n setState({ data: undefined, error: error as Error, isLoading: false });\n throw error;\n }\n },\n [client, options.listId],\n );\n\n return { ...state, mutate };\n}\n"]}
@@ -0,0 +1,131 @@
1
+ import { createSpClient } from './chunk-VOGWZXJY.js';
2
+ import { createContext, useMemo, useContext, useState, useCallback } from 'react';
3
+ import { jsx } from 'react/jsx-runtime';
4
+ import useSWR from 'swr';
5
+
6
+ var SpContext = createContext(null);
7
+ function SpProvider({
8
+ siteId,
9
+ getAccessToken,
10
+ children,
11
+ baseUrl,
12
+ retryOptions
13
+ }) {
14
+ const config = useMemo(() => {
15
+ return {
16
+ siteId,
17
+ baseUrl,
18
+ retryOptions,
19
+ getAccessToken
20
+ };
21
+ }, [siteId, baseUrl, retryOptions, getAccessToken]);
22
+ const value = useMemo(() => {
23
+ const client = createSpClient(config);
24
+ return { client, config };
25
+ }, [config]);
26
+ return /* @__PURE__ */ jsx(SpContext.Provider, { value, children });
27
+ }
28
+ function useSpContext() {
29
+ const context = useContext(SpContext);
30
+ if (!context) {
31
+ throw new Error("useSpContext must be used within a <SpProvider>");
32
+ }
33
+ return context;
34
+ }
35
+ function useSpList(options) {
36
+ const { client } = useSpContext();
37
+ const { enabled = true, refreshInterval, ...listOptions } = options;
38
+ const key = enabled ? ["sp-list", listOptions.listId, listOptions.contentTypeName, listOptions.filter] : null;
39
+ const { data, error, isLoading, mutate } = useSWR(
40
+ key,
41
+ () => client.getListItems(listOptions),
42
+ { refreshInterval }
43
+ );
44
+ return {
45
+ data,
46
+ isLoading,
47
+ error,
48
+ refetch: mutate
49
+ };
50
+ }
51
+ function useSpCreate(options) {
52
+ const { client } = useSpContext();
53
+ const [state, setState] = useState({
54
+ data: void 0,
55
+ error: void 0,
56
+ isLoading: false
57
+ });
58
+ const mutate = useCallback(
59
+ async (createOptions) => {
60
+ setState((prev) => ({ ...prev, isLoading: true, error: void 0 }));
61
+ try {
62
+ const result = await client.createItem({
63
+ listId: options.listId,
64
+ ...createOptions
65
+ });
66
+ setState({ data: result, error: void 0, isLoading: false });
67
+ return result;
68
+ } catch (error) {
69
+ setState({ data: void 0, error, isLoading: false });
70
+ throw error;
71
+ }
72
+ },
73
+ [client, options.listId]
74
+ );
75
+ return { ...state, mutate };
76
+ }
77
+ function useSpUpdate(options) {
78
+ const { client } = useSpContext();
79
+ const [state, setState] = useState({
80
+ data: void 0,
81
+ error: void 0,
82
+ isLoading: false
83
+ });
84
+ const mutate = useCallback(
85
+ async (updateOptions) => {
86
+ setState((prev) => ({ ...prev, isLoading: true, error: void 0 }));
87
+ try {
88
+ const result = await client.updateItem({
89
+ listId: options.listId,
90
+ ...updateOptions
91
+ });
92
+ setState({ data: result, error: void 0, isLoading: false });
93
+ return result;
94
+ } catch (error) {
95
+ setState({ data: void 0, error, isLoading: false });
96
+ throw error;
97
+ }
98
+ },
99
+ [client, options.listId]
100
+ );
101
+ return { ...state, mutate };
102
+ }
103
+ function useSpDelete(options) {
104
+ const { client } = useSpContext();
105
+ const [state, setState] = useState({
106
+ data: void 0,
107
+ error: void 0,
108
+ isLoading: false
109
+ });
110
+ const mutate = useCallback(
111
+ async (deleteOptions) => {
112
+ setState((prev) => ({ ...prev, isLoading: true, error: void 0 }));
113
+ try {
114
+ await client.deleteItem({
115
+ listId: options.listId,
116
+ ...deleteOptions
117
+ });
118
+ setState({ data: void 0, error: void 0, isLoading: false });
119
+ } catch (error) {
120
+ setState({ data: void 0, error, isLoading: false });
121
+ throw error;
122
+ }
123
+ },
124
+ [client, options.listId]
125
+ );
126
+ return { ...state, mutate };
127
+ }
128
+
129
+ export { SpProvider, useSpContext, useSpCreate, useSpDelete, useSpList, useSpUpdate };
130
+ //# sourceMappingURL=chunk-MLY32NZB.js.map
131
+ //# sourceMappingURL=chunk-MLY32NZB.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/sp-provider.tsx","../src/hooks/use-sp-list.ts","../src/hooks/use-sp-mutation.ts"],"names":[],"mappings":"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","file":"chunk-MLY32NZB.js","sourcesContent":["import React, { createContext, useContext, useMemo } from 'react';\nimport { createSpClient } from '../client/sp-client.js';\nimport type { SpClientConfig } from '../client/types.js';\n\ntype SpClientInstance = ReturnType<typeof createSpClient>;\n\ninterface SpContextValue {\n client: SpClientInstance;\n config: SpClientConfig;\n}\n\nconst SpContext = createContext<SpContextValue | null>(null);\n\nexport interface SpProviderProps {\n siteId: string;\n getAccessToken: () => Promise<string>;\n children: React.ReactNode;\n baseUrl?: string;\n retryOptions?: SpClientConfig['retryOptions'];\n}\n\nexport function SpProvider({\n siteId,\n getAccessToken,\n children,\n baseUrl,\n retryOptions,\n}: SpProviderProps) {\n const config = useMemo<SpClientConfig>(() => {\n return {\n siteId,\n baseUrl,\n retryOptions,\n getAccessToken,\n };\n }, [siteId, baseUrl, retryOptions, getAccessToken]);\n\n const value = useMemo(() => {\n const client = createSpClient(config);\n return { client, config };\n }, [config]);\n\n return <SpContext.Provider value={value}>{children}</SpContext.Provider>;\n}\n\nexport function useSpContext(): SpContextValue {\n const context = useContext(SpContext);\n if (!context) {\n throw new Error('useSpContext must be used within a <SpProvider>');\n }\n return context;\n}\n","import useSWR from 'swr';\nimport type { SpListItem, GetListItemsOptions } from '../client/types.js';\nimport { useSpContext } from '../components/sp-provider.js';\n\nexport interface UseSpListOptions extends GetListItemsOptions {\n enabled?: boolean;\n refreshInterval?: number;\n}\n\nexport interface UseSpListReturn<T extends Record<string, unknown>> {\n data: SpListItem<T>[] | undefined;\n isLoading: boolean;\n error: Error | undefined;\n refetch: () => Promise<SpListItem<T>[] | undefined>;\n}\n\nexport function useSpList<T extends Record<string, unknown> = Record<string, unknown>>(\n options: UseSpListOptions,\n): UseSpListReturn<T> {\n const { client } = useSpContext();\n const { enabled = true, refreshInterval, ...listOptions } = options;\n\n const key = enabled ? ['sp-list', listOptions.listId, listOptions.contentTypeName, listOptions.filter] : null;\n\n const { data, error, isLoading, mutate } = useSWR(\n key,\n () => client.getListItems<T>(listOptions),\n { refreshInterval },\n );\n\n return {\n data,\n isLoading,\n error,\n refetch: mutate,\n };\n}\n","import { useState, useCallback } from 'react';\nimport type { SpListItem, CreateItemOptions, UpdateItemOptions, DeleteItemOptions } from '../client/types.js';\nimport { useSpContext } from '../components/sp-provider.js';\n\ninterface MutationState<T> {\n data: T | undefined;\n error: Error | undefined;\n isLoading: boolean;\n}\n\nexport function useSpCreate<T extends Record<string, unknown> = Record<string, unknown>>(\n options: { listId: string },\n) {\n const { client } = useSpContext();\n const [state, setState] = useState<MutationState<SpListItem<T>>>({\n data: undefined,\n error: undefined,\n isLoading: false,\n });\n\n const mutate = useCallback(\n async (createOptions: Omit<CreateItemOptions<T>, 'listId'>) => {\n setState((prev) => ({ ...prev, isLoading: true, error: undefined }));\n try {\n const result = await client.createItem<T>({\n listId: options.listId,\n ...createOptions,\n });\n setState({ data: result, error: undefined, isLoading: false });\n return result;\n } catch (error) {\n setState({ data: undefined, error: error as Error, isLoading: false });\n throw error;\n }\n },\n [client, options.listId],\n );\n\n return { ...state, mutate };\n}\n\nexport function useSpUpdate<T extends Record<string, unknown> = Record<string, unknown>>(\n options: { listId: string },\n) {\n const { client } = useSpContext();\n const [state, setState] = useState<MutationState<SpListItem<T>>>({\n data: undefined,\n error: undefined,\n isLoading: false,\n });\n\n const mutate = useCallback(\n async (updateOptions: Omit<UpdateItemOptions<T>, 'listId'>) => {\n setState((prev) => ({ ...prev, isLoading: true, error: undefined }));\n try {\n const result = await client.updateItem<T>({\n listId: options.listId,\n ...updateOptions,\n });\n setState({ data: result, error: undefined, isLoading: false });\n return result;\n } catch (error) {\n setState({ data: undefined, error: error as Error, isLoading: false });\n throw error;\n }\n },\n [client, options.listId],\n );\n\n return { ...state, mutate };\n}\n\nexport function useSpDelete(options: { listId: string }) {\n const { client } = useSpContext();\n const [state, setState] = useState<MutationState<void>>({\n data: undefined,\n error: undefined,\n isLoading: false,\n });\n\n const mutate = useCallback(\n async (deleteOptions: Omit<DeleteItemOptions, 'listId'>) => {\n setState((prev) => ({ ...prev, isLoading: true, error: undefined }));\n try {\n await client.deleteItem({\n listId: options.listId,\n ...deleteOptions,\n });\n setState({ data: undefined, error: undefined, isLoading: false });\n } catch (error) {\n setState({ data: undefined, error: error as Error, isLoading: false });\n throw error;\n }\n },\n [client, options.listId],\n );\n\n return { ...state, mutate };\n}\n"]}