@taruvi/refine-providers 1.2.7 → 1.2.8

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.
package/dist/index.cjs CHANGED
@@ -951,13 +951,17 @@ function authProvider(client) {
951
951
  };
952
952
  },
953
953
  check: async () => {
954
- if (auth.isUserAuthenticated()) {
955
- return { authenticated: true };
954
+ if (!auth.isUserAuthenticated()) {
955
+ return { authenticated: false, redirectTo: "/login" };
956
956
  }
957
- return {
958
- authenticated: false,
959
- redirectTo: "/login"
960
- };
957
+ try {
958
+ const user = await auth.getCurrentUser();
959
+ if (user) {
960
+ return { authenticated: true };
961
+ }
962
+ } catch {
963
+ }
964
+ return { authenticated: false, redirectTo: "/login" };
961
965
  },
962
966
  onError: async (error) => {
963
967
  const status = error?.statusCode || error?.status || error?.response?.status;
@@ -1 +1 @@
1
- {"version":3,"sources":["../package.json","../src/utils.ts","../src/dataProvider.ts","../src/storageDataProvider.ts","../src/appDataProvider.ts","../src/userDataProvider.ts","../src/functionsDataProvider.ts","../src/analyticsDataProvider.ts","../src/authProvider.ts","../src/accessControlProvider.ts"],"names":["Database","response","Storage","Functions","Analytics","App","Secrets","User","Auth","Policy","DataLoader"],"mappings":"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","file":"index.cjs","sourcesContent":["{\n \"name\": \"@taruvi/refine-providers\",\n \"version\": \"1.2.7\",\n \"description\": \"Refine.dev data provider for Taruvi Data Service\",\n \"type\": \"module\",\n \"main\": \"./dist/index.cjs\",\n \"module\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\",\n \"exports\": {\n \".\": {\n \"import\": {\n \"types\": \"./dist/index.d.ts\",\n \"default\": \"./dist/index.js\"\n },\n \"require\": {\n \"types\": \"./dist/index.d.cts\",\n \"default\": \"./dist/index.cjs\"\n }\n }\n },\n \"files\": [\n \"dist\",\n \"README.md\"\n ],\n \"scripts\": {\n \"build\": \"tsup\",\n \"dev\": \"tsup --watch\",\n \"test\": \"vitest run\",\n \"typecheck\": \"tsc --noEmit\",\n \"clean\": \"rm -rf dist\"\n },\n \"peerDependencies\": {\n \"@refinedev/core\": \"^5.0.0\"\n },\n \"peerDependenciesMeta\": {\n \"@refinedev/core\": {\n \"optional\": false\n }\n },\n \"devDependencies\": {\n \"@refinedev/core\": \"^5.0.0\",\n \"@types/node\": \"^20.0.0\",\n \"tsup\": \"^8.0.0\",\n \"typescript\": \"^5.7.0\",\n \"vitest\": \"^4.0.18\"\n },\n \"keywords\": [\n \"refine\",\n \"refinedev\",\n \"data-provider\",\n \"taruvi\",\n \"react\",\n \"crud\"\n ],\n \"author\": \"EOX Vantage\",\n \"license\": \"MIT\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/taruvi-io/sdk.git\",\n \"directory\": \"packages/refine\"\n },\n \"homepage\": \"https://github.com/taruvi-io/sdk/tree/main/packages/refine#readme\",\n \"bugs\": {\n \"url\": \"https://github.com/taruvi-io/sdk/issues\"\n },\n \"dependencies\": {\n \"@taruvi/sdk\": \"latest\",\n \"dataloader\": \"^2.2.3\"\n }\n}\n","import type { CrudFilter, CrudSort, Pagination } from \"@refinedev/core\";\nimport type { TaruviMeta } from \"./types.js\";\n\n/**\n * Maps Refine operators to Taruvi DRF-style query parameter suffixes.\n * Example: { field: \"age\", operator: \"gte\", value: 18 } → \"age__gte=18\"\n */\nexport const REFINE_OPERATOR_MAP: Record<string, string> = {\n // Equality\n eq: \"\", // exact match (no suffix)\n ne: \"ne\",\n\n // Comparison\n lt: \"lt\",\n gt: \"gt\",\n lte: \"lte\",\n gte: \"gte\",\n\n // String operations (case-sensitive)\n contains: \"contains\",\n ncontains: \"ncontains\",\n startswith: \"startswith\",\n nstartswith: \"nstartswith\",\n endswith: \"endswith\",\n nendswith: \"nendswith\",\n\n // String operations (case-insensitive)\n containss: \"icontains\",\n ncontainss: \"nicontains\",\n startswiths: \"istartswith\",\n nstartswiths: \"nistartswith\",\n endswiths: \"iendswith\",\n nendswiths: \"niendswith\",\n\n // Array operations\n in: \"in\",\n nin: \"nin\",\n\n // Null checks\n null: \"null\",\n nnull: \"nnull\",\n\n // Range\n between: \"between\",\n nbetween: \"nbetween\",\n};\n\n/**\n * Converts Refine CrudFilter[] to Taruvi query parameters.\n * Handles both simple filters and logical operators (and/or).\n */\nexport function convertRefineFilters(\n filters?: CrudFilter[]\n): Record<string, string> {\n if (!filters || filters.length === 0) return {};\n\n const params: Record<string, string> = {};\n\n for (const filter of filters) {\n // Handle logical operators (and/or groups)\n if (\n \"operator\" in filter &&\n (filter.operator === \"and\" || filter.operator === \"or\")\n ) {\n // Recursively process nested filters\n // Note: Taruvi API treats multiple params as AND by default\n // OR logic would need special handling if supported by API\n if (filter.value && Array.isArray(filter.value)) {\n const nested = convertRefineFilters(filter.value as CrudFilter[]);\n Object.assign(params, nested);\n }\n continue;\n }\n\n // Handle conditional filters (field, operator, value)\n if (\"field\" in filter && filter.field && filter.operator) {\n const { field, operator, value } = filter;\n\n // Skip undefined/null values (except for null operator)\n if (value === undefined || (value === null && operator !== \"null\")) {\n continue;\n }\n\n const suffix = REFINE_OPERATOR_MAP[operator];\n\n if (suffix === undefined) {\n console.warn(`Unknown Refine operator: ${operator}`);\n continue;\n }\n\n // Build parameter key with double underscore for DRF style\n const paramKey = suffix ? `${field}__${suffix}` : String(field);\n\n // Format value based on operator\n if (operator === \"in\" || operator === \"nin\") {\n // Array values: join with comma\n params[paramKey] = Array.isArray(value) ? value.join(\",\") : String(value);\n } else if (operator === \"between\" || operator === \"nbetween\") {\n // Range values: expect [min, max] array\n params[paramKey] = Array.isArray(value) ? value.join(\",\") : String(value);\n } else if (operator === \"null\" || operator === \"nnull\") {\n // Boolean for null checks\n params[paramKey] = \"true\";\n } else {\n params[paramKey] = String(value);\n }\n }\n }\n\n return params;\n}\n\n/**\n * Converts Refine CrudSort[] to Taruvi ordering parameter.\n * Uses DRF convention: \"-field\" for DESC, \"field\" for ASC.\n */\nexport function convertRefineSorters(sorters?: CrudSort[]): string | undefined {\n if (!sorters || sorters.length === 0) return undefined;\n\n return sorters\n .map((sort) => (sort.order === \"desc\" ? `-${sort.field}` : sort.field))\n .join(\",\");\n}\n\n/**\n * Converts Refine Pagination to Taruvi page/page_size parameters.\n */\nexport function convertRefinePagination(\n pagination?: Pagination\n): { page?: number; page_size?: number } {\n if (!pagination) return {};\n\n const { currentPage, pageSize, mode } = pagination;\n\n // Handle \"off\" mode - no pagination\n if (mode === \"off\") return {};\n\n return {\n page: currentPage ?? 1, // Default to page 1 if currentPage is undefined\n page_size: pageSize,\n };\n}\n\n/**\n * Combines all Refine parameters into Taruvi query params.\n */\nexport function buildRefineQueryParams(options: {\n filters?: CrudFilter[];\n sorters?: CrudSort[];\n pagination?: Pagination;\n meta?: TaruviMeta;\n}): Record<string, unknown> {\n const { filters, sorters, pagination, meta } = options;\n\n const params: Record<string, unknown> = {\n ...convertRefineFilters(filters),\n ...convertRefinePagination(pagination),\n };\n\n const ordering = convertRefineSorters(sorters);\n if (ordering) {\n params.ordering = ordering;\n }\n\n // Handle populate from meta\n if (meta?.populate) {\n params.populate = Array.isArray(meta.populate)\n ? meta.populate.join(\",\")\n : meta.populate;\n }\n\n return params;\n}\n\n/**\n * Builds a query string from an object of parameters.\n */\nexport function buildQueryString(params?: Record<string, unknown>): string {\n if (!params || Object.keys(params).length === 0) return \"\";\n\n const searchParams = new URLSearchParams();\n\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined && value !== null) {\n searchParams.append(key, String(value));\n }\n }\n\n const queryString = searchParams.toString();\n return queryString ? `?${queryString}` : \"\";\n}\n\n\n/**\n * Converts aggregate expressions array to _aggregate query parameter.\n * @param aggregates - Array of aggregate expressions like [\"sum(total)\", \"count(*)\"]\n * @returns Comma-separated string or undefined\n */\nexport function formatAggregates(aggregates?: string[]): string | undefined {\n if (!aggregates || aggregates.length === 0) return undefined;\n return aggregates.join(\",\");\n}\n\n/**\n * Converts groupBy fields array to _group_by query parameter.\n * @param groupBy - Array of field names to group by\n * @returns Comma-separated string or undefined\n */\nexport function formatGroupBy(groupBy?: string[]): string | undefined {\n if (!groupBy || groupBy.length === 0) return undefined;\n return groupBy.join(\",\");\n}\n\n/**\n * Converts having filters to _having query parameter.\n * Uses same format as regular filters with DRF-style operators.\n * @param having - Array of CrudFilter for aggregate results\n * @returns Comma-separated filter string or undefined\n */\nexport function formatHaving(having?: CrudFilter[]): string | undefined {\n if (!having || having.length === 0) return undefined;\n\n const params: string[] = [];\n\n for (const filter of having) {\n // Handle conditional filters (field, operator, value)\n if (\"field\" in filter && filter.field && filter.operator) {\n const { field, operator, value } = filter;\n\n // Skip undefined/null values\n if (value === undefined || (value === null && operator !== \"null\")) {\n continue;\n }\n\n const suffix = REFINE_OPERATOR_MAP[operator];\n\n if (suffix === undefined) {\n console.warn(`Unknown operator in having clause: ${operator}`);\n continue;\n }\n\n // Build parameter with DRF-style operator\n const paramKey = suffix ? `${field}__${suffix}` : String(field);\n\n // Format value based on operator\n let paramValue: string;\n if (operator === \"in\" || operator === \"nin\") {\n paramValue = Array.isArray(value) ? value.join(\",\") : String(value);\n } else if (operator === \"between\" || operator === \"nbetween\") {\n paramValue = Array.isArray(value) ? value.join(\",\") : String(value);\n } else if (operator === \"null\" || operator === \"nnull\") {\n paramValue = \"true\";\n } else {\n paramValue = String(value);\n }\n\n params.push(`${paramKey}=${paramValue}`);\n }\n }\n\n return params.length > 0 ? params.join(\",\") : undefined;\n}\n\n/**\n * Handles and transforms Taruvi API errors.\n */\nexport function handleError(error: unknown): never {\n if (error instanceof Error) {\n throw error;\n }\n if (typeof error === \"object\" && error !== null && \"message\" in error) {\n throw new Error(String((error as { message: unknown }).message));\n }\n throw new Error(\"Unknown error occurred\");\n}\n","import type {\n DataProvider,\n BaseRecord,\n GetListParams,\n GetListResponse,\n GetOneParams,\n GetOneResponse,\n GetManyParams,\n GetManyResponse,\n CreateParams,\n CreateResponse,\n CreateManyParams,\n CreateManyResponse,\n UpdateParams,\n UpdateResponse,\n UpdateManyParams,\n UpdateManyResponse,\n DeleteOneParams,\n DeleteOneResponse,\n DeleteManyParams,\n DeleteManyResponse,\n CustomParams,\n CustomResponse,\n CrudFilter,\n CrudSort,\n Pagination,\n} from \"@refinedev/core\";\nimport { Client, Database } from \"@taruvi/sdk\";\nimport type { EdgeRequest } from \"@taruvi/sdk\";\nimport type { TaruviListResponse, TaruviMeta } from \"./types.js\";\nimport pkg from \"../package.json\" with { type: \"json\" };\nimport { REFINE_OPERATOR_MAP, formatHaving } from \"./utils.js\";\n\nfunction applyAggregations<T>(query: Database<T>, meta?: TaruviMeta): Database<T> {\n if (!meta) return query;\n\n let result = query;\n\n if (meta.aggregate?.length) {\n result = result.aggregate(...meta.aggregate);\n }\n\n if (meta.groupBy?.length) {\n result = result.groupBy(...meta.groupBy);\n }\n\n const havingStr = formatHaving(meta.having);\n if (havingStr) {\n result = result.having(havingStr);\n }\n\n return result;\n}\n\n/**\n * Applies Refine filters to a Database query using the shared operator map from utils.\n */\nfunction applyFilters<T>(\n query: Database<T>,\n filters?: CrudFilter[]\n): Database<T> {\n if (!filters || filters.length === 0) return query;\n\n let result = query;\n\n for (const filter of filters) {\n if (\"operator\" in filter && (filter.operator === \"and\" || filter.operator === \"or\")) {\n if (filter.value && Array.isArray(filter.value)) {\n result = applyFilters(result, filter.value as CrudFilter[]);\n }\n continue;\n }\n\n if (\"field\" in filter && filter.field && filter.operator) {\n const { field, operator, value } = filter;\n\n if (value === undefined || (value === null && operator !== \"null\")) continue;\n\n const suffix = REFINE_OPERATOR_MAP[operator];\n if (suffix === undefined) {\n console.warn(`Unknown Refine operator: ${operator}`);\n continue;\n }\n\n // Build the DRF-style param key directly\n const paramKey = suffix ? `${field}__${suffix}` : String(field);\n\n let paramValue: string;\n if (operator === \"in\" || operator === \"nin\" || operator === \"between\" || operator === \"nbetween\") {\n paramValue = Array.isArray(value) ? value.join(\",\") : String(value);\n } else if (operator === \"null\" || operator === \"nnull\") {\n paramValue = \"true\";\n } else {\n paramValue = String(value);\n }\n\n // Use \"eq\" operator so the SDK doesn't add another suffix\n result = result.filter(paramKey, \"eq\", paramValue);\n }\n }\n\n return result;\n}\n\n/**\n * Applies Refine sorters to a Database query.\n */\nfunction applySorters<T>(\n query: Database<T>,\n sorters?: CrudSort[]\n): Database<T> {\n if (!sorters || sorters.length === 0) return query;\n\n let result = query;\n for (const sorter of sorters) {\n result = result.sort(sorter.field, sorter.order === \"desc\" ? \"desc\" : \"asc\");\n }\n return result;\n}\n\n/**\n * Applies Refine pagination to a Database query.\n */\nfunction applyPagination<T>(\n query: Database<T>,\n pagination?: Pagination\n): Database<T> {\n if (!pagination || pagination.mode === \"off\") return query;\n\n let result = query;\n if (pagination.currentPage) result = result.page(pagination.currentPage);\n if (pagination.pageSize) result = result.pageSize(pagination.pageSize);\n return result;\n}\n\n/**\n * Applies populate fields to a Database query.\n */\nfunction applyPopulate<T>(\n query: Database<T>,\n meta?: TaruviMeta\n): Database<T> {\n if (!meta?.populate) return query;\n\n const populateArray = Array.isArray(meta.populate)\n ? meta.populate\n : meta.populate.split(\",\").map(s => s.trim());\n\n return query.populate(populateArray);\n}\n\n/**\n * Checks if the query should use Graph SDK based on meta params.\n */\nfunction isGraphQuery(meta?: TaruviMeta): boolean {\n return !!(meta?.format || meta?.graph_types || meta?.include || meta?.depth);\n}\n\n/**\n * Builds a Graph query with optional params from meta.\n */\nfunction buildGraphQuery<T>(client: Client, tableName: string, meta?: TaruviMeta, recordId?: string): Database<T> {\n let query = new Database(client).from<T>(tableName);\n\n if (recordId) query = query.get(recordId);\n if (meta?.format) query = query.format(meta.format);\n if (meta?.include) query = query.include(meta.include);\n if (meta?.depth) query = query.depth(meta.depth);\n if (meta?.graph_types) query = query.types(meta.graph_types);\n\n return query;\n}\n\n/**\n * Creates a Refine DataProvider for Taruvi database operations.\n */\nexport function dataProvider(client: Client): DataProvider {\n console.log(`Taruvi Refine Provider v${pkg.version} initialized`);\n const config = client.getConfig();\n const baseApiUrl = `${config.apiUrl}/api/apps/${config.appSlug}`;\n\n const getIdColumn = (meta?: TaruviMeta) => meta?.idColumnName ?? \"id\";\n const getTableName = (resource: string, meta?: TaruviMeta) => meta?.tableName ?? resource;\n\n return {\n getList: async <TData extends BaseRecord = BaseRecord>(\n params: GetListParams\n ): Promise<GetListResponse<TData>> => {\n const { resource, pagination, filters, sorters, meta } = params;\n const taruviMeta = meta as TaruviMeta | undefined;\n const tableName = getTableName(resource, taruviMeta);\n\n if (isGraphQuery(taruviMeta)) {\n const response = await buildGraphQuery<TData>(client, tableName, taruviMeta).execute();\n const data = Array.isArray(response) ? response : (response as any)?.data ?? [];\n const total = (response as any)?.total ?? data.length;\n return { data: data as TData[], total };\n }\n\n let query = new Database(client).from(tableName);\n query = applyFilters(query, filters);\n query = applySorters(query, sorters);\n query = applyPagination(query, pagination);\n query = applyPopulate(query, taruviMeta);\n query = applyAggregations(query, taruviMeta);\n\n const response = await query.execute() as unknown as TaruviListResponse<TData>;\n return { data: response.data, total: response.total };\n },\n\n getOne: async <TData extends BaseRecord = BaseRecord>(\n params: GetOneParams\n ): Promise<GetOneResponse<TData>> => {\n const { resource, id, meta } = params;\n const taruviMeta = meta as TaruviMeta | undefined;\n const tableName = getTableName(resource, taruviMeta);\n\n if (isGraphQuery(taruviMeta)) {\n const response = await buildGraphQuery<TData>(client, tableName, taruviMeta, String(id)).execute() as any;\n const data = Array.isArray(response) ? response[0] as TData : response?.data?.[0] ?? response as TData;\n return { data };\n }\n\n let query = new Database(client).from(tableName).get(String(id));\n query = applyPopulate(query, taruviMeta);\n const response = await query.execute() as { data: TData };\n return { data: response.data };\n },\n\n getMany: async <TData extends BaseRecord = BaseRecord>(\n params: GetManyParams\n ): Promise<GetManyResponse<TData>> => {\n const { resource, ids, meta } = params;\n const taruviMeta = meta as TaruviMeta | undefined;\n const tableName = getTableName(resource, taruviMeta);\n\n if (isGraphQuery(taruviMeta)) {\n const data = await Promise.all(\n ids.map(async id => {\n const response = await buildGraphQuery<TData>(client, tableName, taruviMeta, String(id)).execute() as any;\n return Array.isArray(response) ? response[0] as TData : response?.data?.[0] ?? response as TData;\n })\n );\n return { data };\n }\n\n const idColumn = getIdColumn(taruviMeta);\n let query = new Database(client).from(tableName);\n query = query.filter(idColumn, \"in\", ids.map(String));\n query = applyPopulate(query, taruviMeta);\n const response = await query.execute() as unknown as TaruviListResponse<TData>;\n return { data: response.data };\n },\n\n create: async <TData extends BaseRecord = BaseRecord, TVariables = {}>(\n params: CreateParams<TVariables>\n ): Promise<CreateResponse<TData>> => {\n const { resource, variables, meta } = params;\n const taruviMeta = meta as TaruviMeta | undefined;\n const tableName = getTableName(resource, taruviMeta);\n\n if (isGraphQuery(taruviMeta)) {\n const response = await new Database(client)\n .from(tableName)\n .edges()\n .create(variables as EdgeRequest[])\n .execute() as { data: TData };\n return { data: response.data };\n }\n\n const db = new Database(client).from(tableName);\n const query = taruviMeta?.upsert\n ? db.upsert(variables as object)\n : db.create(variables as object);\n const response = await query.execute() as { data: TData };\n return { data: response.data };\n },\n\n createMany: async <TData extends BaseRecord = BaseRecord, TVariables = {}>(\n params: CreateManyParams<TVariables>\n ): Promise<CreateManyResponse<TData>> => {\n const { resource, variables, meta } = params;\n const taruviMeta = meta as TaruviMeta | undefined;\n const tableName = getTableName(resource, taruviMeta);\n\n const data = await Promise.all(\n variables.map(async (vars) => {\n const response = await new Database(client)\n .from(tableName)\n .create(vars as object)\n .execute() as { data: TData };\n return response.data;\n })\n );\n\n return { data };\n },\n\n update: async <TData extends BaseRecord = BaseRecord, TVariables = {}>(\n params: UpdateParams<TVariables>\n ): Promise<UpdateResponse<TData>> => {\n const { resource, id, variables, meta } = params;\n const taruviMeta = meta as TaruviMeta | undefined;\n const tableName = getTableName(resource, taruviMeta);\n\n if (isGraphQuery(taruviMeta)) {\n const response = await new Database(client)\n .from(tableName)\n .edges()\n .get(String(id))\n .update(variables as EdgeRequest)\n .execute() as { data: TData };\n return { data: response.data };\n }\n\n const response = await new Database(client)\n .from(tableName)\n .get(String(id))\n .update(variables as object)\n .execute() as { data: TData };\n return { data: response.data };\n },\n\n updateMany: async <TData extends BaseRecord = BaseRecord, TVariables = {}>(\n params: UpdateManyParams<TVariables>\n ): Promise<UpdateManyResponse<TData>> => {\n const { resource, ids, variables, meta } = params;\n const taruviMeta = meta as TaruviMeta | undefined;\n const tableName = getTableName(resource, taruviMeta);\n const idColumn = getIdColumn(taruviMeta);\n\n const body = ids.map(id => ({ [idColumn]: id, ...(variables as object) }));\n const response = await new Database(client)\n .from(tableName)\n .bulkUpdate(body)\n .execute() as { data: TData[] };\n return { data: response.data };\n },\n\n deleteOne: async <TData extends BaseRecord = BaseRecord, TVariables = {}>(\n params: DeleteOneParams<TVariables>\n ): Promise<DeleteOneResponse<TData>> => {\n const { resource, id, meta } = params;\n const taruviMeta = meta as TaruviMeta | undefined;\n const tableName = getTableName(resource, taruviMeta);\n\n if (isGraphQuery(taruviMeta)) {\n const response = await new Database(client)\n .from(tableName)\n .edges()\n .delete([Number(id)])\n .execute() as { data: TData };\n return { data: response.data };\n }\n\n await new Database(client)\n .from(tableName)\n .delete(String(id))\n .execute();\n return { data: { id } as unknown as TData };\n },\n\n deleteMany: async <TData extends BaseRecord = BaseRecord, TVariables = {}>(\n params: DeleteManyParams<TVariables>\n ): Promise<DeleteManyResponse<TData>> => {\n const { resource, ids, meta } = params;\n const taruviMeta = meta as TaruviMeta | undefined;\n const tableName = getTableName(resource, taruviMeta);\n\n if (isGraphQuery(taruviMeta)) {\n const response = await new Database(client)\n .from(tableName)\n .edges()\n .delete(ids.map(Number))\n .execute() as { data: TData };\n return { data: [response.data] };\n }\n\n if (taruviMeta?.deleteByFilter && taruviMeta?.filters) {\n let query = new Database(client).from(tableName);\n query = applyFilters(query, taruviMeta.filters as CrudFilter[]);\n await query.deleteFiltered().execute();\n return { data: ids.map(id => ({ id } as unknown as TData)) };\n }\n\n await new Database(client)\n .from(tableName)\n .bulkDelete(ids.map(String))\n .execute();\n return { data: ids.map(id => ({ id } as unknown as TData)) };\n },\n\n custom: async <TData extends BaseRecord = BaseRecord>(\n params: CustomParams\n ): Promise<CustomResponse<TData>> => {\n const { url, method, payload, query } = params;\n let endpoint = `api/apps/${config.appSlug}/datatables/${url}`;\n\n let data: TData;\n switch (method.toLowerCase()) {\n case 'get': {\n if (query && Object.keys(query).length > 0) {\n const queryString = new URLSearchParams(query as Record<string, string>).toString();\n endpoint = `${endpoint}${endpoint.includes('?') ? '&' : '?'}${queryString}`;\n }\n data = await client.httpClient.get(endpoint) as TData;\n break;\n }\n case 'post':\n data = await client.httpClient.post(endpoint, payload) as TData;\n break;\n case 'put':\n data = await client.httpClient.put(endpoint, payload) as TData;\n break;\n case 'patch':\n data = await client.httpClient.patch(endpoint, payload) as TData;\n break;\n case 'delete':\n data = await client.httpClient.delete(endpoint) as TData;\n break;\n default:\n throw new Error(`Unsupported HTTP method: ${method}`);\n }\n\n return { data };\n },\n\n getApiUrl: () => baseApiUrl,\n };\n}\n","import type {\n DataProvider,\n BaseRecord,\n GetListParams,\n GetListResponse,\n GetOneParams,\n GetOneResponse,\n GetManyResponse,\n CreateParams,\n CreateResponse,\n UpdateParams,\n UpdateResponse,\n DeleteOneParams,\n DeleteOneResponse,\n DeleteManyParams,\n DeleteManyResponse,\n CustomParams,\n CustomResponse,\n} from \"@refinedev/core\";\nimport { Client, Storage } from \"@taruvi/sdk\";\nimport type { StorageFilters, StorageUploadBatchResponse } from \"@taruvi/sdk\";\nimport type { TaruviListResponse, TaruviMeta } from \"./types.js\";\nimport { convertRefineFilters, convertRefineSorters, convertRefinePagination } from \"./utils.js\";\n\n/**\n * Storage upload variables interface.\n */\nexport interface StorageUploadVariables {\n files: File[];\n paths?: string[];\n metadatas?: Record<string, unknown>[];\n}\n\n/**\n * Creates a Refine DataProvider for Taruvi file storage operations.\n */\nexport function storageDataProvider(client: Client): DataProvider {\n const config = client.getConfig();\n const baseApiUrl = `${config.apiUrl}/api/apps/${config.appSlug}`;\n\n const getBucketName = (resource: string, meta?: TaruviMeta) => meta?.bucketName ?? resource;\n\n const buildFilters = (params: {\n filters?: GetListParams[\"filters\"];\n sorters?: GetListParams[\"sorters\"];\n pagination?: GetListParams[\"pagination\"];\n meta?: TaruviMeta;\n }): StorageFilters => {\n const filters: StorageFilters = {\n ...convertRefineFilters(params.filters) as StorageFilters,\n ...convertRefinePagination(params.pagination),\n };\n\n const ordering = convertRefineSorters(params.sorters);\n if (ordering) filters.ordering = ordering;\n\n return filters;\n };\n\n return {\n getList: async <TData extends BaseRecord = BaseRecord>(\n params: GetListParams\n ): Promise<GetListResponse<TData>> => {\n const { resource, pagination, filters, sorters, meta } = params;\n const taruviMeta = meta as TaruviMeta | undefined;\n const bucket = getBucketName(resource, taruviMeta);\n const storageFilters = buildFilters({ filters, sorters, pagination, meta: taruviMeta });\n\n const response = await new Storage(client)\n .from(bucket)\n .filter(storageFilters)\n .execute() as TaruviListResponse<TData>;\n\n return { data: response.data, total: response.total };\n },\n\n getOne: async <TData extends BaseRecord = BaseRecord>(\n params: GetOneParams\n ): Promise<GetOneResponse<TData>> => {\n const { resource, id: path, meta } = params;\n const taruviMeta = meta as TaruviMeta | undefined;\n const bucket = getBucketName(resource, taruviMeta);\n\n if (taruviMeta?.metadata) {\n const response = await new Storage(client)\n .from(bucket)\n .metadata(String(path))\n .execute() as { data: TData };\n return { data: response.data };\n }\n\n const blob = await new Storage(client)\n .from(bucket)\n .download(String(path))\n .execute<Blob>();\n return { data: blob as unknown as TData };\n },\n\n create: async <TData extends BaseRecord = BaseRecord, TVariables = {}>(\n params: CreateParams<TVariables>\n ): Promise<CreateResponse<TData>> => {\n const { resource, variables, meta } = params;\n const taruviMeta = meta as TaruviMeta | undefined;\n const bucket = getBucketName(resource, taruviMeta);\n const { files, paths = [], metadatas = [] } = variables as unknown as StorageUploadVariables;\n\n const filePaths = files.map((file, i) => paths[i] || file.name);\n const fileMetadatas = files.map((_, i) => metadatas[i] || {});\n\n const response = await new Storage(client)\n .from(bucket)\n .upload({ files, paths: filePaths, metadatas: fileMetadatas })\n .execute() as StorageUploadBatchResponse;\n\n // Extract the first uploaded file object from the batch response\n const firstUploaded = response.data?.successful?.[0]?.object;\n return { data: (firstUploaded ?? response.data) as unknown as TData };\n },\n\n update: async <TData extends BaseRecord = BaseRecord, TVariables = {}>(\n params: UpdateParams<TVariables>\n ): Promise<UpdateResponse<TData>> => {\n const { resource, id: path, variables, meta } = params;\n const taruviMeta = meta as TaruviMeta | undefined;\n const bucket = getBucketName(resource, taruviMeta);\n\n const response = await new Storage(client)\n .from(bucket)\n .update(String(path), variables as object)\n .execute() as { data: TData };\n\n return { data: response.data };\n },\n\n deleteOne: async <TData extends BaseRecord = BaseRecord, TVariables = {}>(\n params: DeleteOneParams<TVariables>\n ): Promise<DeleteOneResponse<TData>> => {\n const { resource, id: path, meta } = params;\n const taruviMeta = meta as TaruviMeta | undefined;\n const bucket = getBucketName(resource, taruviMeta);\n\n await new Storage(client)\n .from(bucket)\n .delete([String(path)])\n .execute();\n\n return { data: { id: path } as unknown as TData };\n },\n\n getApiUrl: () => baseApiUrl,\n\n getMany: async <TData extends BaseRecord = BaseRecord>(): Promise<GetManyResponse<TData>> => ({ data: [] }),\n\n createMany: async <TData extends BaseRecord = BaseRecord, TVariables = {}>(\n params: CreateParams<TVariables>\n ): Promise<CreateResponse<TData>> => {\n const { resource, variables, meta } = params;\n const taruviMeta = meta as TaruviMeta | undefined;\n const bucket = getBucketName(resource, taruviMeta);\n const { files, paths = [], metadatas = [] } = variables as unknown as StorageUploadVariables;\n\n const filePaths = files.map((file, i) => paths[i] || file.name);\n const fileMetadatas = files.map((_, i) => metadatas[i] || {});\n\n const response = await new Storage(client)\n .from(bucket)\n .upload({ files, paths: filePaths, metadatas: fileMetadatas })\n .execute() as StorageUploadBatchResponse;\n\n // Extract all uploaded file objects from the batch response\n const uploaded = response.data?.successful?.map(s => s.object) ?? [];\n return { data: (uploaded.length > 0 ? uploaded[0] : response.data) as unknown as TData };\n },\n\n deleteMany: async <TData extends BaseRecord = BaseRecord, TVariables = {}>(\n params: DeleteManyParams<TVariables>\n ): Promise<DeleteManyResponse<TData>> => {\n const { resource, ids, meta } = params;\n const taruviMeta = meta as TaruviMeta | undefined;\n const bucket = getBucketName(resource, taruviMeta);\n\n await new Storage(client)\n .from(bucket)\n .delete(ids.map(String))\n .execute();\n\n return { data: ids.map(id => ({ id } as unknown as TData)) };\n },\n\n custom: async <TData extends BaseRecord = BaseRecord>(\n params: CustomParams\n ): Promise<CustomResponse<TData>> => {\n const { url, method, payload, query } = params;\n let fullUrl = `api/apps/${config.appSlug}/storage/buckets/${url}`;\n\n let data: TData;\n switch (method.toLowerCase()) {\n case 'get': {\n if (query && Object.keys(query).length > 0) {\n const queryString = new URLSearchParams(query as Record<string, string>).toString();\n fullUrl = `${fullUrl}${fullUrl.includes('?') ? '&' : '?'}${queryString}`;\n }\n data = await client.httpClient.get(fullUrl) as TData;\n break;\n }\n case 'post':\n data = await client.httpClient.post(fullUrl, payload) as TData;\n break;\n case 'put':\n data = await client.httpClient.put(fullUrl, payload) as TData;\n break;\n case 'patch':\n data = await client.httpClient.patch(fullUrl, payload) as TData;\n break;\n case 'delete':\n data = await client.httpClient.delete(fullUrl) as TData;\n break;\n default:\n throw new Error(`Unsupported HTTP method: ${method}`);\n }\n\n return { data };\n },\n\n // Not applicable for file storage - files are replaced, not updated\n updateMany: undefined,\n };\n}\n","import type {\n DataProvider,\n BaseRecord,\n GetListParams,\n GetListResponse,\n GetOneParams,\n GetOneResponse,\n CustomParams,\n CustomResponse,\n} from \"@refinedev/core\";\nimport { Client, App, Functions, Analytics, Secrets } from \"@taruvi/sdk\";\nimport type { RoleData } from \"@taruvi/sdk\";\n\n/**\n * Response type for roles list from the App service.\n */\ninterface RolesListResponse {\n data: RoleData[];\n total: number;\n}\n\n/**\n * Meta options for function execution via custom().\n */\nexport interface FunctionMeta {\n kind: \"function\";\n /** Whether to execute the function asynchronously */\n async?: boolean;\n}\n\n/**\n * Meta options for analytics query execution via custom().\n */\nexport interface AnalyticsMeta {\n kind: \"analytics\";\n}\n\nexport type AppCustomMeta = FunctionMeta | AnalyticsMeta;\n\n/**\n * Creates a Refine DataProvider for Taruvi App operations.\n *\n * Supported operations:\n * - getList(\"roles\"): Fetch app roles\n * - getList(\"secrets\"): Fetch secrets by keys (requires meta.keys)\n * - getOne(\"settings\"): Fetch app settings\n * - getOne(\"secrets\"): Fetch a single secret by key (id = secret key)\n * - custom(): Execute edge functions or analytics queries via meta.kind\n */\nexport function appDataProvider(client: Client): DataProvider {\n const config = client.getConfig();\n const baseApiUrl = `${config.apiUrl}/api/apps/${config.appSlug}`;\n const functions = new Functions(client);\n const analytics = new Analytics(client);\n\n return {\n getList: async <TData extends BaseRecord = BaseRecord>(\n params: GetListParams\n ): Promise<GetListResponse<TData>> => {\n const { resource, meta } = params;\n\n if (resource === \"roles\") {\n const app = new App(client);\n const response = await app.roles().execute() as RolesListResponse;\n\n return {\n data: (response.data || response) as unknown as TData[],\n total: response.total ?? (Array.isArray(response) ? response.length : response.data?.length ?? 0),\n };\n }\n\n if (resource === \"secrets\") {\n const keys = meta?.keys as string[] | undefined;\n if (!keys || keys.length === 0) {\n throw new Error('secrets resource requires meta.keys array');\n }\n const secrets = new Secrets(client);\n const response = await secrets.list(keys, {\n app: meta?.app as string | undefined,\n includeMetadata: meta?.includeMetadata as boolean | undefined,\n }) as any;\n const raw = response.data || response;\n const data: TData[] = Array.isArray(raw)\n ? raw\n : Object.entries(raw).map(([key, value]) => ({ key, value }) as unknown as TData);\n return { data, total: data.length };\n }\n\n throw new Error(`Unknown app resource: ${resource}. Supported resources: roles, secrets`);\n },\n\n getOne: async <TData extends BaseRecord = BaseRecord>(\n params: GetOneParams\n ): Promise<GetOneResponse<TData>> => {\n const { resource, id, meta } = params;\n\n if (resource === \"settings\") {\n const app = new App(client);\n const response = await app.settings().execute() as { data: TData };\n\n return {\n data: response.data,\n };\n }\n\n if (resource === \"secrets\") {\n const secrets = new Secrets(client);\n const response = await secrets.get(String(id), {\n app: meta?.app as string | undefined,\n tags: meta?.tags as string[] | undefined,\n }).execute() as any;\n return { data: (response.data ?? response) as TData };\n }\n\n throw new Error(`Unknown app resource for getOne: ${resource}. Supported resources: settings, secrets`);\n },\n\n custom: async <TData extends BaseRecord = BaseRecord>(\n params: CustomParams\n ): Promise<CustomResponse<TData>> => {\n const { url: slug, payload, meta } = params;\n const customMeta = meta as AppCustomMeta | undefined;\n\n if (customMeta?.kind === \"function\") {\n const response = await functions.execute<TData>(slug, {\n async: customMeta.async ?? false,\n params: (payload ?? {}) as Record<string, unknown>,\n });\n return { data: response.data as TData };\n }\n\n if (customMeta?.kind === \"analytics\") {\n const response = await analytics.execute<TData>(slug, {\n params: (payload ?? {}) as Record<string, unknown>,\n });\n return { data: response.data as TData };\n }\n\n throw new Error(\n 'Specify meta.kind as \"function\" or \"analytics\" for custom operations on the app provider.'\n );\n },\n\n getApiUrl: () => baseApiUrl,\n\n getMany: async () => { throw new Error(\"getMany is not supported for app resources\"); },\n create: async () => { throw new Error(\"create is not supported for app resources. Use useCustom with meta.kind\"); },\n createMany: async () => { throw new Error(\"createMany is not supported for app resources\"); },\n update: async () => { throw new Error(\"update is not supported for app resources\"); },\n updateMany: async () => { throw new Error(\"updateMany is not supported for app resources\"); },\n deleteOne: async () => { throw new Error(\"deleteOne is not supported for app resources\"); },\n deleteMany: async () => { throw new Error(\"deleteMany is not supported for app resources\"); },\n };\n}\n","import type {\n DataProvider,\n BaseRecord,\n GetListParams,\n GetListResponse,\n GetOneParams,\n GetOneResponse,\n CreateParams,\n CreateResponse,\n UpdateParams,\n UpdateResponse,\n DeleteOneParams,\n DeleteOneResponse,\n CrudFilter,\n CrudSort,\n Pagination,\n} from \"@refinedev/core\";\nimport { Client, User, Auth } from \"@taruvi/sdk\";\nimport type { UserData, UserCreateRequest, UserUpdateRequest } from \"@taruvi/sdk\";\n\n/**\n * Response type for users list from the User service.\n */\ninterface UsersListResponse {\n data: UserData[];\n total: number;\n}\n\n/**\n * Filter parameters for listing users.\n */\ninterface UserListFilters {\n search?: string;\n is_active?: boolean;\n is_staff?: boolean;\n is_superuser?: boolean;\n is_deleted?: boolean;\n ordering?: string;\n page?: number;\n page_size?: number;\n}\n\n/**\n * Builds UserListFilters from Refine's filters, sorters, and pagination.\n */\nfunction buildUserListFilters(\n filters?: CrudFilter[],\n sorters?: CrudSort[],\n pagination?: Pagination\n): UserListFilters {\n const result: UserListFilters = {};\n\n // Apply pagination\n if (pagination && pagination.mode !== \"off\") {\n if (pagination.currentPage) {\n result.page = pagination.currentPage;\n }\n if (pagination.pageSize) {\n result.page_size = pagination.pageSize;\n }\n }\n\n // Apply filters\n if (filters) {\n for (const filter of filters) {\n if (\"field\" in filter) {\n const field = filter.field as string;\n const value = filter.value;\n\n switch (field) {\n case \"search\":\n result.search = String(value);\n break;\n case \"is_active\":\n result.is_active = Boolean(value);\n break;\n case \"is_staff\":\n result.is_staff = Boolean(value);\n break;\n case \"is_superuser\":\n result.is_superuser = Boolean(value);\n break;\n case \"is_deleted\":\n result.is_deleted = Boolean(value);\n break;\n }\n }\n }\n }\n\n // Apply sorting (first sorter only, as API accepts single ordering)\n if (sorters && sorters.length > 0) {\n const sorter = sorters[0];\n result.ordering = sorter.order === \"desc\" ? `-${sorter.field}` : sorter.field;\n }\n\n return result;\n}\n\n/**\n * Creates a Refine DataProvider for Taruvi User operations.\n *\n * This provider is specialized for fetching user-level data.\n *\n * Supported resources:\n * - \"users\" (getList): Fetch list of users with filtering/pagination\n * - \"users\" (getOne): Fetch a specific user by username/id\n * - \"roles\" (getList): Fetch roles for a specific user (requires meta.username)\n *\n * @example\n * ```typescript\n * // Get list of users\n * const { data } = useList({\n * dataProviderName: \"user\",\n * resource: \"users\",\n * pagination: { currentPage: 1, pageSize: 10 },\n * filters: [\n * { field: \"is_active\", operator: \"eq\", value: true },\n * { field: \"search\", operator: \"eq\", value: \"john\" },\n * ],\n * sorters: [{ field: \"username\", order: \"asc\" }],\n * });\n *\n * // Get a specific user by username\n * const { data } = useOne({\n * dataProviderName: \"user\",\n * resource: \"users\",\n * id: \"john_doe\",\n * });\n *\n * // Get roles for a specific user\n * const { data } = useList({\n * dataProviderName: \"user\",\n * resource: \"roles\",\n * meta: { username: \"john_doe\" },\n * });\n * ```\n */\nexport function userDataProvider(client: Client): DataProvider {\n const config = client.getConfig();\n const baseApiUrl = `${config.apiUrl}/api/apps/${config.appSlug}`;\n\n return {\n getList: async <TData extends BaseRecord = BaseRecord>(\n params: GetListParams\n ): Promise<GetListResponse<TData>> => {\n const { resource, pagination, filters, sorters, meta } = params;\n\n if (resource === \"users\") {\n const user = new User(client);\n const userFilters = buildUserListFilters(filters, sorters, pagination);\n const response = await user.list(userFilters as Parameters<typeof user.list>[0]) as UsersListResponse;\n\n return {\n data: (response.data || response) as unknown as TData[],\n total: response.total,\n };\n }\n\n if (resource === \"roles\") {\n // Get roles for a specific user - requires meta.username\n const username = meta?.username as string;\n if (!username) {\n throw new Error(\"roles resource requires meta.username\");\n }\n const user = new User(client);\n const response = await user.getUser(username) as any;\n const roles = response.data?.roles || response.roles || [];\n\n return {\n data: roles as unknown as TData[],\n total: roles.length,\n };\n }\n\n if (resource === \"apps\") {\n const username = meta?.username as string;\n if (!username) {\n throw new Error(\"apps resource requires meta.username\");\n }\n const user = new User(client);\n const response = await user.getUserApps(username) as any;\n const apps = response.data || response;\n return {\n data: apps as TData[],\n total: Array.isArray(apps) ? apps.length : 0,\n };\n }\n\n throw new Error(`Unknown user resource for getList: ${resource}. Supported: users, roles, apps`);\n },\n\n getOne: async <TData extends BaseRecord = BaseRecord>(\n params: GetOneParams\n ): Promise<GetOneResponse<TData>> => {\n const { resource, id } = params;\n\n if (resource === \"users\") {\n const user = new User(client)\n\n // Support \"me\" as a special ID to get current user via Auth\n if (String(id) === \"me\") {\n const auth = new Auth(client);\n const response = await auth.getCurrentUser();\n const data = response ? ((response as any).data ?? response) : null;\n return { data: data as unknown as TData };\n }\n\n const response = await user.getUser(String(id));\n\n return {\n data: response.data as unknown as TData,\n };\n }\n\n throw new Error(`Unknown user resource for getOne: ${resource}. Supported: users`);\n },\n\n getApiUrl: () => baseApiUrl,\n\n create: async <TData extends BaseRecord = BaseRecord, TVariables = {}>(\n params: CreateParams<TVariables>\n ): Promise<CreateResponse<TData>> => {\n const { resource, variables } = params;\n\n if (resource === \"users\") {\n const user = new User(client);\n const userData = variables as unknown as UserCreateRequest;\n const response = await user.createUser(userData);\n\n return {\n data: response.data as unknown as TData,\n };\n }\n\n throw new Error(`Unknown user resource for create: ${resource}. Supported resources: users`);\n },\n\n update: async <TData extends BaseRecord = BaseRecord, TVariables = {}>(\n params: UpdateParams<TVariables>\n ): Promise<UpdateResponse<TData>> => {\n const { resource, id, variables } = params;\n\n if (resource === \"users\") {\n const user = new User(client);\n const username = String(id);\n const updateData = variables as unknown as UserUpdateRequest;\n const response = await user.updateUser(username, updateData);\n\n return {\n data: response.data as unknown as TData,\n };\n }\n\n throw new Error(`Unknown user resource for update: ${resource}. Supported resources: users`);\n },\n\n deleteOne: async <TData extends BaseRecord = BaseRecord, TVariables = {}>(\n params: DeleteOneParams<TVariables>\n ): Promise<DeleteOneResponse<TData>> => {\n const { resource, id } = params;\n\n if (resource === \"users\") {\n const user = new User(client);\n const username = String(id);\n await user.deleteUser(username);\n\n return {\n data: {} as TData,\n };\n }\n\n throw new Error(`Unknown user resource for delete: ${resource}. Supported resources: users`);\n },\n\n // User resources - other operations not supported\n getMany: async () => { throw new Error(\"getMany is not supported for user resources\"); },\n createMany: async () => { throw new Error(\"createMany is not supported for user resources\"); },\n updateMany: async () => { throw new Error(\"updateMany is not supported for user resources\"); },\n deleteMany: async () => { throw new Error(\"deleteMany is not supported for user resources\"); },\n custom: async () => { throw new Error(\"custom is not supported for user resources\"); },\n };\n}\n","import type {\n DataProvider,\n BaseRecord,\n CreateParams,\n CreateResponse,\n} from \"@refinedev/core\";\nimport { Client, Functions } from \"@taruvi/sdk\";\n\n/**\n * Extended meta options for function execution.\n */\nexport interface FunctionMeta {\n /** Whether to execute the function asynchronously */\n async?: boolean;\n}\n\n/** @deprecated Use `appDataProvider` with `useCustom` and `meta.kind: \"function\"` instead. */\nexport function functionsDataProvider(client: Client): DataProvider {\n const config = client.getConfig();\n const baseApiUrl = `${config.apiUrl}/api/apps/${config.appSlug}`;\n const functions = new Functions(client);\n\n return {\n /**\n * Execute an edge function.\n *\n * @param resource - The function slug to execute\n * @param variables - Parameters to pass to the function\n * @param meta.async - Whether to execute asynchronously (default: false)\n */\n create: async <TData extends BaseRecord = BaseRecord, TVariables = {}>({\n resource,\n variables,\n meta,\n }: CreateParams<TVariables>): Promise<CreateResponse<TData>> => {\n const functionMeta = meta as FunctionMeta | undefined;\n\n const response = await functions.execute<TData>(resource, {\n async: functionMeta?.async ?? false,\n params: variables as Record<string, unknown>,\n });\n\n return { data: response.data as TData };\n },\n\n getApiUrl: () => baseApiUrl,\n\n // Edge functions don't support custom method - use create() instead\n custom: async () => {\n throw new Error(\n \"custom is not supported for edge functions. Use useCreate to execute functions.\"\n );\n },\n\n // Edge functions don't support other CRUD operations\n getList: async () => {\n throw new Error(\n \"getList is not supported for edge functions. Use useCreate to execute functions.\"\n );\n },\n getOne: async () => {\n throw new Error(\n \"getOne is not supported for edge functions. Use useCreate to execute functions.\"\n );\n },\n getMany: async () => {\n throw new Error(\n \"getMany is not supported for edge functions. Use useCreate to execute functions.\"\n );\n },\n createMany: async () => {\n throw new Error(\n \"createMany is not supported for edge functions. Use useCreate to execute functions.\"\n );\n },\n update: async () => {\n throw new Error(\n \"update is not supported for edge functions. Use useCreate to execute functions.\"\n );\n },\n updateMany: async () => {\n throw new Error(\n \"updateMany is not supported for edge functions. Use useCreate to execute functions.\"\n );\n },\n deleteOne: async () => {\n throw new Error(\n \"deleteOne is not supported for edge functions. Use useCreate to execute functions.\"\n );\n },\n deleteMany: async () => {\n throw new Error(\n \"deleteMany is not supported for edge functions. Use useCreate to execute functions.\"\n );\n },\n };\n}","import type {\n DataProvider,\n BaseRecord,\n CreateParams,\n CreateResponse,\n} from \"@refinedev/core\";\nimport { Client, Analytics } from \"@taruvi/sdk\";\n\n/**\n * Extended meta options for analytics query execution.\n */\nexport interface AnalyticsMeta {\n /** Additional parameters to pass to the analytics query */\n params?: Record<string, unknown>;\n}\n\n/** @deprecated Use `appDataProvider` with `useCustom` and `meta.kind: \"analytics\"` instead. */\nexport function analyticsDataProvider(client: Client): DataProvider {\n const config = client.getConfig();\n const baseApiUrl = `${config.apiUrl}/api/apps/${config.appSlug}`;\n const analytics = new Analytics(client);\n\n return {\n /**\n * Execute an analytics query.\n *\n * @param resource - The query slug to execute\n * @param variables - Parameters to pass to the query\n */\n create: async <TData extends BaseRecord = BaseRecord, TVariables = {}>({\n resource,\n variables,\n }: CreateParams<TVariables>): Promise<CreateResponse<TData>> => {\n const response = await analytics.execute<TData>(resource, {\n params: variables as Record<string, unknown>,\n });\n\n return { data: response.data as TData };\n },\n\n getApiUrl: () => baseApiUrl,\n\n // Analytics don't support custom method - use create() instead\n custom: async () => {\n throw new Error(\n \"custom is not supported for analytics. Use useCreate to execute queries.\"\n );\n },\n\n // Analytics queries don't support other CRUD operations\n getList: async () => {\n throw new Error(\n \"getList is not supported for analytics. Use useCreate to execute queries.\"\n );\n },\n getOne: async () => {\n throw new Error(\n \"getOne is not supported for analytics. Use useCreate to execute queries.\"\n );\n },\n getMany: async () => {\n throw new Error(\n \"getMany is not supported for analytics. Use useCreate to execute queries.\"\n );\n },\n createMany: async () => {\n throw new Error(\n \"createMany is not supported for analytics. Use useCreate to execute queries.\"\n );\n },\n update: async () => {\n throw new Error(\n \"update is not supported for analytics. Use useCreate to execute queries.\"\n );\n },\n updateMany: async () => {\n throw new Error(\n \"updateMany is not supported for analytics. Use useCreate to execute queries.\"\n );\n },\n deleteOne: async () => {\n throw new Error(\n \"deleteOne is not supported for analytics. Use useCreate to execute queries.\"\n );\n },\n deleteMany: async () => {\n throw new Error(\n \"deleteMany is not supported for analytics. Use useCreate to execute queries.\"\n );\n },\n };\n}","import type { AuthProvider } from \"@refinedev/core\";\nimport { Client, Auth } from \"@taruvi/sdk\";\n\n/**\n * Login params - supports both redirect flow and credentials flow\n */\nexport interface LoginParams {\n /** For redirect-based login - URL to redirect after successful login */\n callbackUrl?: string;\n /** For credentials-based login (if supported) */\n username?: string;\n password?: string;\n /** Whether to use redirect flow (default: true) */\n redirect?: boolean;\n}\n\n/**\n * Logout params\n */\nexport interface LogoutParams {\n /** URL to redirect after logout */\n callbackUrl?: string;\n}\n\n/**\n * Register/Signup params\n */\nexport interface RegisterParams {\n /** URL to redirect after successful signup */\n callbackUrl?: string;\n}\n\n/**\n * Creates a Refine AuthProvider for Taruvi authentication.\n *\n * Supports redirect-based authentication flow (Web UI Flow):\n * 1. User calls login() → Redirects to backend /accounts/login/\n * 2. User authenticates on backend\n * 3. Backend redirects back with tokens in URL hash\n * 4. Client extracts and stores tokens automatically\n */\nexport function authProvider(client: Client): AuthProvider {\n const auth = new Auth(client);\n\n return {\n login: async (params: LoginParams = {}) => {\n const { callbackUrl, redirect = true } = params;\n\n // Check if already authenticated first (prevents infinite redirect loop)\n\n // TODO: check if this is necessary\n if (auth.isUserAuthenticated()) {\n return {\n success: true,\n redirectTo: callbackUrl || \"/\",\n };\n }\n\n if (redirect) {\n // Redirect-based login flow\n auth.login(callbackUrl);\n\n // Return success since we're redirecting\n // The actual auth state will be checked after redirect\n return {\n success: true,\n };\n }\n\n return {\n success: false,\n error: {\n name: \"LoginError\",\n message: \"Login failed. Please try again.\",\n },\n };\n },\n\n logout: async (params: LogoutParams = {}) => {\n const { callbackUrl } = params;\n\n await auth.logout(callbackUrl);\n\n return {\n success: true,\n redirectTo: callbackUrl || \"/login\",\n };\n },\n\n check: async () => {\n if (auth.isUserAuthenticated()) {\n return { authenticated: true };\n }\n\n return {\n authenticated: false,\n redirectTo: \"/login\",\n };\n },\n\n onError: async (error) => {\n const status = error?.statusCode || error?.status || error?.response?.status;\n\n // 401/403 means session is invalid — tokens already cleared by SDK interceptor\n if (status === 401 || status === 403) {\n return {\n logout: true,\n redirectTo: \"/login\",\n error,\n };\n }\n\n return { error };\n },\n\n register: async (params: RegisterParams = {}) => {\n const { callbackUrl } = params;\n\n // Redirect to signup page\n auth.signup(callbackUrl);\n\n return {\n success: true,\n };\n },\n\n getIdentity: async () => {\n const response = await auth.getCurrentUser();\n\n if (!response) {\n return null;\n }\n\n return (response as any).data ?? response;\n },\n\n getPermissions: async () => {\n const response = await auth.getCurrentUser();\n\n if (!response) {\n return null;\n }\n\n const user = (response as any).data ?? response;\n\n if (!user) {\n return null;\n }\n\n // Return permissions from the user data\n return {\n roles: user.roles || [],\n permissions: user.user_permissions || [],\n groups: user.groups || [],\n is_staff: user.is_staff || false,\n is_superuser: user.is_superuser || false,\n };\n },\n };\n}\n","import type { AccessControlProvider } from \"@refinedev/core\";\nimport { Client, Auth, Policy } from \"@taruvi/sdk\";\nimport DataLoader from \"dataloader\";\n\n/**\n * Permission check request for DataLoader batching\n */\ninterface PermissionCheck {\n resource: string;\n action: string;\n params?: Record<string, unknown>;\n entityType?: string;\n}\n\ninterface PermissionResult {\n can: boolean;\n reason?: string;\n}\n\n/**\n * Creates a Refine AccessControlProvider using Cerbos via the Policy client.\n *\n * Uses DataLoader for request batching (multiple useCan calls → single API request)\n * and Refine's built-in TanStack Query for caching.\n *\n * @example\n * ```tsx\n * <Refine\n * authProvider={authProvider(client)}\n * accessControlProvider={accessControlProvider(client)}\n * />\n *\n *\n * ```\n */\nexport function accessControlProvider(\n client: Client,\n options?: { batchDelayMs?: number }\n): AccessControlProvider {\n const policy = new Policy(client);\n const auth = new Auth(client);\n const { batchDelayMs = 50 } = options ?? {};\n\n // DataLoader for batching only - TanStack Query handles caching\n const permissionLoader = new DataLoader<PermissionCheck, PermissionResult>(\n async (checks) => {\n const response = await auth.getCurrentUser();\n const user = response ? ((response as any).data ?? response) : null;\n\n if (!user) {\n return checks.map(() => ({\n can: false,\n reason: \"User not authenticated\",\n }));\n }\n\n // Deduplicate and group by resource:recordId (needed because cache: false)\n const uniqueResources = new Map<string, {\n entityType?: string;\n tableName: string;\n recordId: string;\n attributes: Record<string, unknown>;\n actions: Set<string>;\n }>();\n\n for (const check of checks) {\n const recordId = check.params?.id ? String(check.params.id) : \"*\";\n const key = `${check.resource}:${recordId}`;\n\n if (!uniqueResources.has(key)) {\n uniqueResources.set(key, {\n entityType: check.entityType,\n tableName: check.resource,\n recordId,\n attributes: (check.params || {}) as Record<string, unknown>,\n actions: new Set(),\n });\n }\n uniqueResources.get(key)!.actions.add(check.action);\n }\n\n // Build batch payload for Cerbos\n const batchPayload = Array.from(uniqueResources.values()).map((entry) => ({\n entityType: entry.entityType ?? entry.tableName, // Default to tableName if entityType not specified\n tableName: entry.tableName,\n recordId: entry.recordId,\n attributes: entry.attributes,\n actions: Array.from(entry.actions),\n }));\n\n try {\n // Single SDK call for all permissions\n const result = await policy.checkResource(batchPayload) as {\n results?: Array<{ actions?: Record<string, string> }>;\n };\n\n // Build results lookup\n const resultsByResource = new Map<string, Record<string, string>>();\n result?.results?.forEach((r, index) => {\n const payload = batchPayload[index];\n const key = `${payload.tableName}:${payload.recordId}`;\n resultsByResource.set(key, r.actions || {});\n });\n\n // Map results back to original checks order (DataLoader requirement)\n return checks.map((check) => {\n const recordId = check.params?.id ? String(check.params.id) : \"*\";\n const key = `${check.resource}:${recordId}`;\n const actions = resultsByResource.get(key) || {};\n const allowed = actions[check.action] === \"EFFECT_ALLOW\";\n\n return {\n can: allowed,\n reason: allowed ? undefined : \"Permission denied by policy\",\n };\n });\n } catch (error) {\n console.error(\"Batch permission check failed:\", error);\n return checks.map(() => ({\n can: false,\n reason: error instanceof Error ? error.message : \"Permission check failed\",\n }));\n }\n },\n {\n batchScheduleFn: (callback) => setTimeout(callback, batchDelayMs),\n cache: false, // TanStack Query handles caching\n }\n );\n\n return {\n can: async ({ resource, action, params }) => {\n if (!resource) {\n return { can: false, reason: \"Resource not specified\" };\n }\n\n // Priority: params.entityType (override) > resource.meta.entityType > resource name\n const entityType = (params?.entityType as string | undefined)\n ?? (params?.resource?.meta?.entityType as string | undefined);\n\n return permissionLoader.load({\n resource,\n action,\n params,\n entityType,\n });\n },\n\n options: {\n buttons: {\n enableAccessControl: true,\n hideIfUnauthorized: true,\n },\n queryOptions: {\n staleTime: 5 * 60 * 1000, // 5 minutes\n gcTime: 10 * 60 * 1000, // 10 minutes\n },\n },\n };\n}\n"]}
1
+ {"version":3,"sources":["../package.json","../src/utils.ts","../src/dataProvider.ts","../src/storageDataProvider.ts","../src/appDataProvider.ts","../src/userDataProvider.ts","../src/functionsDataProvider.ts","../src/analyticsDataProvider.ts","../src/authProvider.ts","../src/accessControlProvider.ts"],"names":["Database","response","Storage","Functions","Analytics","App","Secrets","User","Auth","Policy","DataLoader"],"mappings":"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","file":"index.cjs","sourcesContent":["{\n \"name\": \"@taruvi/refine-providers\",\n \"version\": \"1.2.7\",\n \"description\": \"Refine.dev data provider for Taruvi Data Service\",\n \"type\": \"module\",\n \"main\": \"./dist/index.cjs\",\n \"module\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\",\n \"exports\": {\n \".\": {\n \"import\": {\n \"types\": \"./dist/index.d.ts\",\n \"default\": \"./dist/index.js\"\n },\n \"require\": {\n \"types\": \"./dist/index.d.cts\",\n \"default\": \"./dist/index.cjs\"\n }\n }\n },\n \"files\": [\n \"dist\",\n \"README.md\"\n ],\n \"scripts\": {\n \"build\": \"tsup\",\n \"dev\": \"tsup --watch\",\n \"test\": \"vitest run\",\n \"typecheck\": \"tsc --noEmit\",\n \"clean\": \"rm -rf dist\"\n },\n \"peerDependencies\": {\n \"@refinedev/core\": \"^5.0.0\"\n },\n \"peerDependenciesMeta\": {\n \"@refinedev/core\": {\n \"optional\": false\n }\n },\n \"devDependencies\": {\n \"@refinedev/core\": \"^5.0.0\",\n \"@types/node\": \"^20.0.0\",\n \"tsup\": \"^8.0.0\",\n \"typescript\": \"^5.7.0\",\n \"vitest\": \"^4.0.18\"\n },\n \"keywords\": [\n \"refine\",\n \"refinedev\",\n \"data-provider\",\n \"taruvi\",\n \"react\",\n \"crud\"\n ],\n \"author\": \"EOX Vantage\",\n \"license\": \"MIT\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/taruvi-io/sdk.git\",\n \"directory\": \"packages/refine\"\n },\n \"homepage\": \"https://github.com/taruvi-io/sdk/tree/main/packages/refine#readme\",\n \"bugs\": {\n \"url\": \"https://github.com/taruvi-io/sdk/issues\"\n },\n \"dependencies\": {\n \"@taruvi/sdk\": \"latest\",\n \"dataloader\": \"^2.2.3\"\n }\n}\n","import type { CrudFilter, CrudSort, Pagination } from \"@refinedev/core\";\nimport type { TaruviMeta } from \"./types.js\";\n\n/**\n * Maps Refine operators to Taruvi DRF-style query parameter suffixes.\n * Example: { field: \"age\", operator: \"gte\", value: 18 } → \"age__gte=18\"\n */\nexport const REFINE_OPERATOR_MAP: Record<string, string> = {\n // Equality\n eq: \"\", // exact match (no suffix)\n ne: \"ne\",\n\n // Comparison\n lt: \"lt\",\n gt: \"gt\",\n lte: \"lte\",\n gte: \"gte\",\n\n // String operations (case-sensitive)\n contains: \"contains\",\n ncontains: \"ncontains\",\n startswith: \"startswith\",\n nstartswith: \"nstartswith\",\n endswith: \"endswith\",\n nendswith: \"nendswith\",\n\n // String operations (case-insensitive)\n containss: \"icontains\",\n ncontainss: \"nicontains\",\n startswiths: \"istartswith\",\n nstartswiths: \"nistartswith\",\n endswiths: \"iendswith\",\n nendswiths: \"niendswith\",\n\n // Array operations\n in: \"in\",\n nin: \"nin\",\n\n // Null checks\n null: \"null\",\n nnull: \"nnull\",\n\n // Range\n between: \"between\",\n nbetween: \"nbetween\",\n};\n\n/**\n * Converts Refine CrudFilter[] to Taruvi query parameters.\n * Handles both simple filters and logical operators (and/or).\n */\nexport function convertRefineFilters(\n filters?: CrudFilter[]\n): Record<string, string> {\n if (!filters || filters.length === 0) return {};\n\n const params: Record<string, string> = {};\n\n for (const filter of filters) {\n // Handle logical operators (and/or groups)\n if (\n \"operator\" in filter &&\n (filter.operator === \"and\" || filter.operator === \"or\")\n ) {\n // Recursively process nested filters\n // Note: Taruvi API treats multiple params as AND by default\n // OR logic would need special handling if supported by API\n if (filter.value && Array.isArray(filter.value)) {\n const nested = convertRefineFilters(filter.value as CrudFilter[]);\n Object.assign(params, nested);\n }\n continue;\n }\n\n // Handle conditional filters (field, operator, value)\n if (\"field\" in filter && filter.field && filter.operator) {\n const { field, operator, value } = filter;\n\n // Skip undefined/null values (except for null operator)\n if (value === undefined || (value === null && operator !== \"null\")) {\n continue;\n }\n\n const suffix = REFINE_OPERATOR_MAP[operator];\n\n if (suffix === undefined) {\n console.warn(`Unknown Refine operator: ${operator}`);\n continue;\n }\n\n // Build parameter key with double underscore for DRF style\n const paramKey = suffix ? `${field}__${suffix}` : String(field);\n\n // Format value based on operator\n if (operator === \"in\" || operator === \"nin\") {\n // Array values: join with comma\n params[paramKey] = Array.isArray(value) ? value.join(\",\") : String(value);\n } else if (operator === \"between\" || operator === \"nbetween\") {\n // Range values: expect [min, max] array\n params[paramKey] = Array.isArray(value) ? value.join(\",\") : String(value);\n } else if (operator === \"null\" || operator === \"nnull\") {\n // Boolean for null checks\n params[paramKey] = \"true\";\n } else {\n params[paramKey] = String(value);\n }\n }\n }\n\n return params;\n}\n\n/**\n * Converts Refine CrudSort[] to Taruvi ordering parameter.\n * Uses DRF convention: \"-field\" for DESC, \"field\" for ASC.\n */\nexport function convertRefineSorters(sorters?: CrudSort[]): string | undefined {\n if (!sorters || sorters.length === 0) return undefined;\n\n return sorters\n .map((sort) => (sort.order === \"desc\" ? `-${sort.field}` : sort.field))\n .join(\",\");\n}\n\n/**\n * Converts Refine Pagination to Taruvi page/page_size parameters.\n */\nexport function convertRefinePagination(\n pagination?: Pagination\n): { page?: number; page_size?: number } {\n if (!pagination) return {};\n\n const { currentPage, pageSize, mode } = pagination;\n\n // Handle \"off\" mode - no pagination\n if (mode === \"off\") return {};\n\n return {\n page: currentPage ?? 1, // Default to page 1 if currentPage is undefined\n page_size: pageSize,\n };\n}\n\n/**\n * Combines all Refine parameters into Taruvi query params.\n */\nexport function buildRefineQueryParams(options: {\n filters?: CrudFilter[];\n sorters?: CrudSort[];\n pagination?: Pagination;\n meta?: TaruviMeta;\n}): Record<string, unknown> {\n const { filters, sorters, pagination, meta } = options;\n\n const params: Record<string, unknown> = {\n ...convertRefineFilters(filters),\n ...convertRefinePagination(pagination),\n };\n\n const ordering = convertRefineSorters(sorters);\n if (ordering) {\n params.ordering = ordering;\n }\n\n // Handle populate from meta\n if (meta?.populate) {\n params.populate = Array.isArray(meta.populate)\n ? meta.populate.join(\",\")\n : meta.populate;\n }\n\n return params;\n}\n\n/**\n * Builds a query string from an object of parameters.\n */\nexport function buildQueryString(params?: Record<string, unknown>): string {\n if (!params || Object.keys(params).length === 0) return \"\";\n\n const searchParams = new URLSearchParams();\n\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined && value !== null) {\n searchParams.append(key, String(value));\n }\n }\n\n const queryString = searchParams.toString();\n return queryString ? `?${queryString}` : \"\";\n}\n\n\n/**\n * Converts aggregate expressions array to _aggregate query parameter.\n * @param aggregates - Array of aggregate expressions like [\"sum(total)\", \"count(*)\"]\n * @returns Comma-separated string or undefined\n */\nexport function formatAggregates(aggregates?: string[]): string | undefined {\n if (!aggregates || aggregates.length === 0) return undefined;\n return aggregates.join(\",\");\n}\n\n/**\n * Converts groupBy fields array to _group_by query parameter.\n * @param groupBy - Array of field names to group by\n * @returns Comma-separated string or undefined\n */\nexport function formatGroupBy(groupBy?: string[]): string | undefined {\n if (!groupBy || groupBy.length === 0) return undefined;\n return groupBy.join(\",\");\n}\n\n/**\n * Converts having filters to _having query parameter.\n * Uses same format as regular filters with DRF-style operators.\n * @param having - Array of CrudFilter for aggregate results\n * @returns Comma-separated filter string or undefined\n */\nexport function formatHaving(having?: CrudFilter[]): string | undefined {\n if (!having || having.length === 0) return undefined;\n\n const params: string[] = [];\n\n for (const filter of having) {\n // Handle conditional filters (field, operator, value)\n if (\"field\" in filter && filter.field && filter.operator) {\n const { field, operator, value } = filter;\n\n // Skip undefined/null values\n if (value === undefined || (value === null && operator !== \"null\")) {\n continue;\n }\n\n const suffix = REFINE_OPERATOR_MAP[operator];\n\n if (suffix === undefined) {\n console.warn(`Unknown operator in having clause: ${operator}`);\n continue;\n }\n\n // Build parameter with DRF-style operator\n const paramKey = suffix ? `${field}__${suffix}` : String(field);\n\n // Format value based on operator\n let paramValue: string;\n if (operator === \"in\" || operator === \"nin\") {\n paramValue = Array.isArray(value) ? value.join(\",\") : String(value);\n } else if (operator === \"between\" || operator === \"nbetween\") {\n paramValue = Array.isArray(value) ? value.join(\",\") : String(value);\n } else if (operator === \"null\" || operator === \"nnull\") {\n paramValue = \"true\";\n } else {\n paramValue = String(value);\n }\n\n params.push(`${paramKey}=${paramValue}`);\n }\n }\n\n return params.length > 0 ? params.join(\",\") : undefined;\n}\n\n/**\n * Handles and transforms Taruvi API errors.\n */\nexport function handleError(error: unknown): never {\n if (error instanceof Error) {\n throw error;\n }\n if (typeof error === \"object\" && error !== null && \"message\" in error) {\n throw new Error(String((error as { message: unknown }).message));\n }\n throw new Error(\"Unknown error occurred\");\n}\n","import type {\n DataProvider,\n BaseRecord,\n GetListParams,\n GetListResponse,\n GetOneParams,\n GetOneResponse,\n GetManyParams,\n GetManyResponse,\n CreateParams,\n CreateResponse,\n CreateManyParams,\n CreateManyResponse,\n UpdateParams,\n UpdateResponse,\n UpdateManyParams,\n UpdateManyResponse,\n DeleteOneParams,\n DeleteOneResponse,\n DeleteManyParams,\n DeleteManyResponse,\n CustomParams,\n CustomResponse,\n CrudFilter,\n CrudSort,\n Pagination,\n} from \"@refinedev/core\";\nimport { Client, Database } from \"@taruvi/sdk\";\nimport type { EdgeRequest } from \"@taruvi/sdk\";\nimport type { TaruviListResponse, TaruviMeta } from \"./types.js\";\nimport pkg from \"../package.json\" with { type: \"json\" };\nimport { REFINE_OPERATOR_MAP, formatHaving } from \"./utils.js\";\n\nfunction applyAggregations<T>(query: Database<T>, meta?: TaruviMeta): Database<T> {\n if (!meta) return query;\n\n let result = query;\n\n if (meta.aggregate?.length) {\n result = result.aggregate(...meta.aggregate);\n }\n\n if (meta.groupBy?.length) {\n result = result.groupBy(...meta.groupBy);\n }\n\n const havingStr = formatHaving(meta.having);\n if (havingStr) {\n result = result.having(havingStr);\n }\n\n return result;\n}\n\n/**\n * Applies Refine filters to a Database query using the shared operator map from utils.\n */\nfunction applyFilters<T>(\n query: Database<T>,\n filters?: CrudFilter[]\n): Database<T> {\n if (!filters || filters.length === 0) return query;\n\n let result = query;\n\n for (const filter of filters) {\n if (\"operator\" in filter && (filter.operator === \"and\" || filter.operator === \"or\")) {\n if (filter.value && Array.isArray(filter.value)) {\n result = applyFilters(result, filter.value as CrudFilter[]);\n }\n continue;\n }\n\n if (\"field\" in filter && filter.field && filter.operator) {\n const { field, operator, value } = filter;\n\n if (value === undefined || (value === null && operator !== \"null\")) continue;\n\n const suffix = REFINE_OPERATOR_MAP[operator];\n if (suffix === undefined) {\n console.warn(`Unknown Refine operator: ${operator}`);\n continue;\n }\n\n // Build the DRF-style param key directly\n const paramKey = suffix ? `${field}__${suffix}` : String(field);\n\n let paramValue: string;\n if (operator === \"in\" || operator === \"nin\" || operator === \"between\" || operator === \"nbetween\") {\n paramValue = Array.isArray(value) ? value.join(\",\") : String(value);\n } else if (operator === \"null\" || operator === \"nnull\") {\n paramValue = \"true\";\n } else {\n paramValue = String(value);\n }\n\n // Use \"eq\" operator so the SDK doesn't add another suffix\n result = result.filter(paramKey, \"eq\", paramValue);\n }\n }\n\n return result;\n}\n\n/**\n * Applies Refine sorters to a Database query.\n */\nfunction applySorters<T>(\n query: Database<T>,\n sorters?: CrudSort[]\n): Database<T> {\n if (!sorters || sorters.length === 0) return query;\n\n let result = query;\n for (const sorter of sorters) {\n result = result.sort(sorter.field, sorter.order === \"desc\" ? \"desc\" : \"asc\");\n }\n return result;\n}\n\n/**\n * Applies Refine pagination to a Database query.\n */\nfunction applyPagination<T>(\n query: Database<T>,\n pagination?: Pagination\n): Database<T> {\n if (!pagination || pagination.mode === \"off\") return query;\n\n let result = query;\n if (pagination.currentPage) result = result.page(pagination.currentPage);\n if (pagination.pageSize) result = result.pageSize(pagination.pageSize);\n return result;\n}\n\n/**\n * Applies populate fields to a Database query.\n */\nfunction applyPopulate<T>(\n query: Database<T>,\n meta?: TaruviMeta\n): Database<T> {\n if (!meta?.populate) return query;\n\n const populateArray = Array.isArray(meta.populate)\n ? meta.populate\n : meta.populate.split(\",\").map(s => s.trim());\n\n return query.populate(populateArray);\n}\n\n/**\n * Checks if the query should use Graph SDK based on meta params.\n */\nfunction isGraphQuery(meta?: TaruviMeta): boolean {\n return !!(meta?.format || meta?.graph_types || meta?.include || meta?.depth);\n}\n\n/**\n * Builds a Graph query with optional params from meta.\n */\nfunction buildGraphQuery<T>(client: Client, tableName: string, meta?: TaruviMeta, recordId?: string): Database<T> {\n let query = new Database(client).from<T>(tableName);\n\n if (recordId) query = query.get(recordId);\n if (meta?.format) query = query.format(meta.format);\n if (meta?.include) query = query.include(meta.include);\n if (meta?.depth) query = query.depth(meta.depth);\n if (meta?.graph_types) query = query.types(meta.graph_types);\n\n return query;\n}\n\n/**\n * Creates a Refine DataProvider for Taruvi database operations.\n */\nexport function dataProvider(client: Client): DataProvider {\n console.log(`Taruvi Refine Provider v${pkg.version} initialized`);\n const config = client.getConfig();\n const baseApiUrl = `${config.apiUrl}/api/apps/${config.appSlug}`;\n\n const getIdColumn = (meta?: TaruviMeta) => meta?.idColumnName ?? \"id\";\n const getTableName = (resource: string, meta?: TaruviMeta) => meta?.tableName ?? resource;\n\n return {\n getList: async <TData extends BaseRecord = BaseRecord>(\n params: GetListParams\n ): Promise<GetListResponse<TData>> => {\n const { resource, pagination, filters, sorters, meta } = params;\n const taruviMeta = meta as TaruviMeta | undefined;\n const tableName = getTableName(resource, taruviMeta);\n\n if (isGraphQuery(taruviMeta)) {\n const response = await buildGraphQuery<TData>(client, tableName, taruviMeta).execute();\n const data = Array.isArray(response) ? response : (response as any)?.data ?? [];\n const total = (response as any)?.total ?? data.length;\n return { data: data as TData[], total };\n }\n\n let query = new Database(client).from(tableName);\n query = applyFilters(query, filters);\n query = applySorters(query, sorters);\n query = applyPagination(query, pagination);\n query = applyPopulate(query, taruviMeta);\n query = applyAggregations(query, taruviMeta);\n\n const response = await query.execute() as unknown as TaruviListResponse<TData>;\n return { data: response.data, total: response.total };\n },\n\n getOne: async <TData extends BaseRecord = BaseRecord>(\n params: GetOneParams\n ): Promise<GetOneResponse<TData>> => {\n const { resource, id, meta } = params;\n const taruviMeta = meta as TaruviMeta | undefined;\n const tableName = getTableName(resource, taruviMeta);\n\n if (isGraphQuery(taruviMeta)) {\n const response = await buildGraphQuery<TData>(client, tableName, taruviMeta, String(id)).execute() as any;\n const data = Array.isArray(response) ? response[0] as TData : response?.data?.[0] ?? response as TData;\n return { data };\n }\n\n let query = new Database(client).from(tableName).get(String(id));\n query = applyPopulate(query, taruviMeta);\n const response = await query.execute() as { data: TData };\n return { data: response.data };\n },\n\n getMany: async <TData extends BaseRecord = BaseRecord>(\n params: GetManyParams\n ): Promise<GetManyResponse<TData>> => {\n const { resource, ids, meta } = params;\n const taruviMeta = meta as TaruviMeta | undefined;\n const tableName = getTableName(resource, taruviMeta);\n\n if (isGraphQuery(taruviMeta)) {\n const data = await Promise.all(\n ids.map(async id => {\n const response = await buildGraphQuery<TData>(client, tableName, taruviMeta, String(id)).execute() as any;\n return Array.isArray(response) ? response[0] as TData : response?.data?.[0] ?? response as TData;\n })\n );\n return { data };\n }\n\n const idColumn = getIdColumn(taruviMeta);\n let query = new Database(client).from(tableName);\n query = query.filter(idColumn, \"in\", ids.map(String));\n query = applyPopulate(query, taruviMeta);\n const response = await query.execute() as unknown as TaruviListResponse<TData>;\n return { data: response.data };\n },\n\n create: async <TData extends BaseRecord = BaseRecord, TVariables = {}>(\n params: CreateParams<TVariables>\n ): Promise<CreateResponse<TData>> => {\n const { resource, variables, meta } = params;\n const taruviMeta = meta as TaruviMeta | undefined;\n const tableName = getTableName(resource, taruviMeta);\n\n if (isGraphQuery(taruviMeta)) {\n const response = await new Database(client)\n .from(tableName)\n .edges()\n .create(variables as EdgeRequest[])\n .execute() as { data: TData };\n return { data: response.data };\n }\n\n const db = new Database(client).from(tableName);\n const query = taruviMeta?.upsert\n ? db.upsert(variables as object)\n : db.create(variables as object);\n const response = await query.execute() as { data: TData };\n return { data: response.data };\n },\n\n createMany: async <TData extends BaseRecord = BaseRecord, TVariables = {}>(\n params: CreateManyParams<TVariables>\n ): Promise<CreateManyResponse<TData>> => {\n const { resource, variables, meta } = params;\n const taruviMeta = meta as TaruviMeta | undefined;\n const tableName = getTableName(resource, taruviMeta);\n\n const data = await Promise.all(\n variables.map(async (vars) => {\n const response = await new Database(client)\n .from(tableName)\n .create(vars as object)\n .execute() as { data: TData };\n return response.data;\n })\n );\n\n return { data };\n },\n\n update: async <TData extends BaseRecord = BaseRecord, TVariables = {}>(\n params: UpdateParams<TVariables>\n ): Promise<UpdateResponse<TData>> => {\n const { resource, id, variables, meta } = params;\n const taruviMeta = meta as TaruviMeta | undefined;\n const tableName = getTableName(resource, taruviMeta);\n\n if (isGraphQuery(taruviMeta)) {\n const response = await new Database(client)\n .from(tableName)\n .edges()\n .get(String(id))\n .update(variables as EdgeRequest)\n .execute() as { data: TData };\n return { data: response.data };\n }\n\n const response = await new Database(client)\n .from(tableName)\n .get(String(id))\n .update(variables as object)\n .execute() as { data: TData };\n return { data: response.data };\n },\n\n updateMany: async <TData extends BaseRecord = BaseRecord, TVariables = {}>(\n params: UpdateManyParams<TVariables>\n ): Promise<UpdateManyResponse<TData>> => {\n const { resource, ids, variables, meta } = params;\n const taruviMeta = meta as TaruviMeta | undefined;\n const tableName = getTableName(resource, taruviMeta);\n const idColumn = getIdColumn(taruviMeta);\n\n const body = ids.map(id => ({ [idColumn]: id, ...(variables as object) }));\n const response = await new Database(client)\n .from(tableName)\n .bulkUpdate(body)\n .execute() as { data: TData[] };\n return { data: response.data };\n },\n\n deleteOne: async <TData extends BaseRecord = BaseRecord, TVariables = {}>(\n params: DeleteOneParams<TVariables>\n ): Promise<DeleteOneResponse<TData>> => {\n const { resource, id, meta } = params;\n const taruviMeta = meta as TaruviMeta | undefined;\n const tableName = getTableName(resource, taruviMeta);\n\n if (isGraphQuery(taruviMeta)) {\n const response = await new Database(client)\n .from(tableName)\n .edges()\n .delete([Number(id)])\n .execute() as { data: TData };\n return { data: response.data };\n }\n\n await new Database(client)\n .from(tableName)\n .delete(String(id))\n .execute();\n return { data: { id } as unknown as TData };\n },\n\n deleteMany: async <TData extends BaseRecord = BaseRecord, TVariables = {}>(\n params: DeleteManyParams<TVariables>\n ): Promise<DeleteManyResponse<TData>> => {\n const { resource, ids, meta } = params;\n const taruviMeta = meta as TaruviMeta | undefined;\n const tableName = getTableName(resource, taruviMeta);\n\n if (isGraphQuery(taruviMeta)) {\n const response = await new Database(client)\n .from(tableName)\n .edges()\n .delete(ids.map(Number))\n .execute() as { data: TData };\n return { data: [response.data] };\n }\n\n if (taruviMeta?.deleteByFilter && taruviMeta?.filters) {\n let query = new Database(client).from(tableName);\n query = applyFilters(query, taruviMeta.filters as CrudFilter[]);\n await query.deleteFiltered().execute();\n return { data: ids.map(id => ({ id } as unknown as TData)) };\n }\n\n await new Database(client)\n .from(tableName)\n .bulkDelete(ids.map(String))\n .execute();\n return { data: ids.map(id => ({ id } as unknown as TData)) };\n },\n\n custom: async <TData extends BaseRecord = BaseRecord>(\n params: CustomParams\n ): Promise<CustomResponse<TData>> => {\n const { url, method, payload, query } = params;\n let endpoint = `api/apps/${config.appSlug}/datatables/${url}`;\n\n let data: TData;\n switch (method.toLowerCase()) {\n case 'get': {\n if (query && Object.keys(query).length > 0) {\n const queryString = new URLSearchParams(query as Record<string, string>).toString();\n endpoint = `${endpoint}${endpoint.includes('?') ? '&' : '?'}${queryString}`;\n }\n data = await client.httpClient.get(endpoint) as TData;\n break;\n }\n case 'post':\n data = await client.httpClient.post(endpoint, payload) as TData;\n break;\n case 'put':\n data = await client.httpClient.put(endpoint, payload) as TData;\n break;\n case 'patch':\n data = await client.httpClient.patch(endpoint, payload) as TData;\n break;\n case 'delete':\n data = await client.httpClient.delete(endpoint) as TData;\n break;\n default:\n throw new Error(`Unsupported HTTP method: ${method}`);\n }\n\n return { data };\n },\n\n getApiUrl: () => baseApiUrl,\n };\n}\n","import type {\n DataProvider,\n BaseRecord,\n GetListParams,\n GetListResponse,\n GetOneParams,\n GetOneResponse,\n GetManyResponse,\n CreateParams,\n CreateResponse,\n UpdateParams,\n UpdateResponse,\n DeleteOneParams,\n DeleteOneResponse,\n DeleteManyParams,\n DeleteManyResponse,\n CustomParams,\n CustomResponse,\n} from \"@refinedev/core\";\nimport { Client, Storage } from \"@taruvi/sdk\";\nimport type { StorageFilters, StorageUploadBatchResponse } from \"@taruvi/sdk\";\nimport type { TaruviListResponse, TaruviMeta } from \"./types.js\";\nimport { convertRefineFilters, convertRefineSorters, convertRefinePagination } from \"./utils.js\";\n\n/**\n * Storage upload variables interface.\n */\nexport interface StorageUploadVariables {\n files: File[];\n paths?: string[];\n metadatas?: Record<string, unknown>[];\n}\n\n/**\n * Creates a Refine DataProvider for Taruvi file storage operations.\n */\nexport function storageDataProvider(client: Client): DataProvider {\n const config = client.getConfig();\n const baseApiUrl = `${config.apiUrl}/api/apps/${config.appSlug}`;\n\n const getBucketName = (resource: string, meta?: TaruviMeta) => meta?.bucketName ?? resource;\n\n const buildFilters = (params: {\n filters?: GetListParams[\"filters\"];\n sorters?: GetListParams[\"sorters\"];\n pagination?: GetListParams[\"pagination\"];\n meta?: TaruviMeta;\n }): StorageFilters => {\n const filters: StorageFilters = {\n ...convertRefineFilters(params.filters) as StorageFilters,\n ...convertRefinePagination(params.pagination),\n };\n\n const ordering = convertRefineSorters(params.sorters);\n if (ordering) filters.ordering = ordering;\n\n return filters;\n };\n\n return {\n getList: async <TData extends BaseRecord = BaseRecord>(\n params: GetListParams\n ): Promise<GetListResponse<TData>> => {\n const { resource, pagination, filters, sorters, meta } = params;\n const taruviMeta = meta as TaruviMeta | undefined;\n const bucket = getBucketName(resource, taruviMeta);\n const storageFilters = buildFilters({ filters, sorters, pagination, meta: taruviMeta });\n\n const response = await new Storage(client)\n .from(bucket)\n .filter(storageFilters)\n .execute() as TaruviListResponse<TData>;\n\n return { data: response.data, total: response.total };\n },\n\n getOne: async <TData extends BaseRecord = BaseRecord>(\n params: GetOneParams\n ): Promise<GetOneResponse<TData>> => {\n const { resource, id: path, meta } = params;\n const taruviMeta = meta as TaruviMeta | undefined;\n const bucket = getBucketName(resource, taruviMeta);\n\n if (taruviMeta?.metadata) {\n const response = await new Storage(client)\n .from(bucket)\n .metadata(String(path))\n .execute() as { data: TData };\n return { data: response.data };\n }\n\n const blob = await new Storage(client)\n .from(bucket)\n .download(String(path))\n .execute<Blob>();\n return { data: blob as unknown as TData };\n },\n\n create: async <TData extends BaseRecord = BaseRecord, TVariables = {}>(\n params: CreateParams<TVariables>\n ): Promise<CreateResponse<TData>> => {\n const { resource, variables, meta } = params;\n const taruviMeta = meta as TaruviMeta | undefined;\n const bucket = getBucketName(resource, taruviMeta);\n const { files, paths = [], metadatas = [] } = variables as unknown as StorageUploadVariables;\n\n const filePaths = files.map((file, i) => paths[i] || file.name);\n const fileMetadatas = files.map((_, i) => metadatas[i] || {});\n\n const response = await new Storage(client)\n .from(bucket)\n .upload({ files, paths: filePaths, metadatas: fileMetadatas })\n .execute() as StorageUploadBatchResponse;\n\n // Extract the first uploaded file object from the batch response\n const firstUploaded = response.data?.successful?.[0]?.object;\n return { data: (firstUploaded ?? response.data) as unknown as TData };\n },\n\n update: async <TData extends BaseRecord = BaseRecord, TVariables = {}>(\n params: UpdateParams<TVariables>\n ): Promise<UpdateResponse<TData>> => {\n const { resource, id: path, variables, meta } = params;\n const taruviMeta = meta as TaruviMeta | undefined;\n const bucket = getBucketName(resource, taruviMeta);\n\n const response = await new Storage(client)\n .from(bucket)\n .update(String(path), variables as object)\n .execute() as { data: TData };\n\n return { data: response.data };\n },\n\n deleteOne: async <TData extends BaseRecord = BaseRecord, TVariables = {}>(\n params: DeleteOneParams<TVariables>\n ): Promise<DeleteOneResponse<TData>> => {\n const { resource, id: path, meta } = params;\n const taruviMeta = meta as TaruviMeta | undefined;\n const bucket = getBucketName(resource, taruviMeta);\n\n await new Storage(client)\n .from(bucket)\n .delete([String(path)])\n .execute();\n\n return { data: { id: path } as unknown as TData };\n },\n\n getApiUrl: () => baseApiUrl,\n\n getMany: async <TData extends BaseRecord = BaseRecord>(): Promise<GetManyResponse<TData>> => ({ data: [] }),\n\n createMany: async <TData extends BaseRecord = BaseRecord, TVariables = {}>(\n params: CreateParams<TVariables>\n ): Promise<CreateResponse<TData>> => {\n const { resource, variables, meta } = params;\n const taruviMeta = meta as TaruviMeta | undefined;\n const bucket = getBucketName(resource, taruviMeta);\n const { files, paths = [], metadatas = [] } = variables as unknown as StorageUploadVariables;\n\n const filePaths = files.map((file, i) => paths[i] || file.name);\n const fileMetadatas = files.map((_, i) => metadatas[i] || {});\n\n const response = await new Storage(client)\n .from(bucket)\n .upload({ files, paths: filePaths, metadatas: fileMetadatas })\n .execute() as StorageUploadBatchResponse;\n\n // Extract all uploaded file objects from the batch response\n const uploaded = response.data?.successful?.map(s => s.object) ?? [];\n return { data: (uploaded.length > 0 ? uploaded[0] : response.data) as unknown as TData };\n },\n\n deleteMany: async <TData extends BaseRecord = BaseRecord, TVariables = {}>(\n params: DeleteManyParams<TVariables>\n ): Promise<DeleteManyResponse<TData>> => {\n const { resource, ids, meta } = params;\n const taruviMeta = meta as TaruviMeta | undefined;\n const bucket = getBucketName(resource, taruviMeta);\n\n await new Storage(client)\n .from(bucket)\n .delete(ids.map(String))\n .execute();\n\n return { data: ids.map(id => ({ id } as unknown as TData)) };\n },\n\n custom: async <TData extends BaseRecord = BaseRecord>(\n params: CustomParams\n ): Promise<CustomResponse<TData>> => {\n const { url, method, payload, query } = params;\n let fullUrl = `api/apps/${config.appSlug}/storage/buckets/${url}`;\n\n let data: TData;\n switch (method.toLowerCase()) {\n case 'get': {\n if (query && Object.keys(query).length > 0) {\n const queryString = new URLSearchParams(query as Record<string, string>).toString();\n fullUrl = `${fullUrl}${fullUrl.includes('?') ? '&' : '?'}${queryString}`;\n }\n data = await client.httpClient.get(fullUrl) as TData;\n break;\n }\n case 'post':\n data = await client.httpClient.post(fullUrl, payload) as TData;\n break;\n case 'put':\n data = await client.httpClient.put(fullUrl, payload) as TData;\n break;\n case 'patch':\n data = await client.httpClient.patch(fullUrl, payload) as TData;\n break;\n case 'delete':\n data = await client.httpClient.delete(fullUrl) as TData;\n break;\n default:\n throw new Error(`Unsupported HTTP method: ${method}`);\n }\n\n return { data };\n },\n\n // Not applicable for file storage - files are replaced, not updated\n updateMany: undefined,\n };\n}\n","import type {\n DataProvider,\n BaseRecord,\n GetListParams,\n GetListResponse,\n GetOneParams,\n GetOneResponse,\n CustomParams,\n CustomResponse,\n} from \"@refinedev/core\";\nimport { Client, App, Functions, Analytics, Secrets } from \"@taruvi/sdk\";\nimport type { RoleData } from \"@taruvi/sdk\";\n\n/**\n * Response type for roles list from the App service.\n */\ninterface RolesListResponse {\n data: RoleData[];\n total: number;\n}\n\n/**\n * Meta options for function execution via custom().\n */\nexport interface FunctionMeta {\n kind: \"function\";\n /** Whether to execute the function asynchronously */\n async?: boolean;\n}\n\n/**\n * Meta options for analytics query execution via custom().\n */\nexport interface AnalyticsMeta {\n kind: \"analytics\";\n}\n\nexport type AppCustomMeta = FunctionMeta | AnalyticsMeta;\n\n/**\n * Creates a Refine DataProvider for Taruvi App operations.\n *\n * Supported operations:\n * - getList(\"roles\"): Fetch app roles\n * - getList(\"secrets\"): Fetch secrets by keys (requires meta.keys)\n * - getOne(\"settings\"): Fetch app settings\n * - getOne(\"secrets\"): Fetch a single secret by key (id = secret key)\n * - custom(): Execute edge functions or analytics queries via meta.kind\n */\nexport function appDataProvider(client: Client): DataProvider {\n const config = client.getConfig();\n const baseApiUrl = `${config.apiUrl}/api/apps/${config.appSlug}`;\n const functions = new Functions(client);\n const analytics = new Analytics(client);\n\n return {\n getList: async <TData extends BaseRecord = BaseRecord>(\n params: GetListParams\n ): Promise<GetListResponse<TData>> => {\n const { resource, meta } = params;\n\n if (resource === \"roles\") {\n const app = new App(client);\n const response = await app.roles().execute() as RolesListResponse;\n\n return {\n data: (response.data || response) as unknown as TData[],\n total: response.total ?? (Array.isArray(response) ? response.length : response.data?.length ?? 0),\n };\n }\n\n if (resource === \"secrets\") {\n const keys = meta?.keys as string[] | undefined;\n if (!keys || keys.length === 0) {\n throw new Error('secrets resource requires meta.keys array');\n }\n const secrets = new Secrets(client);\n const response = await secrets.list(keys, {\n app: meta?.app as string | undefined,\n includeMetadata: meta?.includeMetadata as boolean | undefined,\n }) as any;\n const raw = response.data || response;\n const data: TData[] = Array.isArray(raw)\n ? raw\n : Object.entries(raw).map(([key, value]) => ({ key, value }) as unknown as TData);\n return { data, total: data.length };\n }\n\n throw new Error(`Unknown app resource: ${resource}. Supported resources: roles, secrets`);\n },\n\n getOne: async <TData extends BaseRecord = BaseRecord>(\n params: GetOneParams\n ): Promise<GetOneResponse<TData>> => {\n const { resource, id, meta } = params;\n\n if (resource === \"settings\") {\n const app = new App(client);\n const response = await app.settings().execute() as { data: TData };\n\n return {\n data: response.data,\n };\n }\n\n if (resource === \"secrets\") {\n const secrets = new Secrets(client);\n const response = await secrets.get(String(id), {\n app: meta?.app as string | undefined,\n tags: meta?.tags as string[] | undefined,\n }).execute() as any;\n return { data: (response.data ?? response) as TData };\n }\n\n throw new Error(`Unknown app resource for getOne: ${resource}. Supported resources: settings, secrets`);\n },\n\n custom: async <TData extends BaseRecord = BaseRecord>(\n params: CustomParams\n ): Promise<CustomResponse<TData>> => {\n const { url: slug, payload, meta } = params;\n const customMeta = meta as AppCustomMeta | undefined;\n\n if (customMeta?.kind === \"function\") {\n const response = await functions.execute<TData>(slug, {\n async: customMeta.async ?? false,\n params: (payload ?? {}) as Record<string, unknown>,\n });\n return { data: response.data as TData };\n }\n\n if (customMeta?.kind === \"analytics\") {\n const response = await analytics.execute<TData>(slug, {\n params: (payload ?? {}) as Record<string, unknown>,\n });\n return { data: response.data as TData };\n }\n\n throw new Error(\n 'Specify meta.kind as \"function\" or \"analytics\" for custom operations on the app provider.'\n );\n },\n\n getApiUrl: () => baseApiUrl,\n\n getMany: async () => { throw new Error(\"getMany is not supported for app resources\"); },\n create: async () => { throw new Error(\"create is not supported for app resources. Use useCustom with meta.kind\"); },\n createMany: async () => { throw new Error(\"createMany is not supported for app resources\"); },\n update: async () => { throw new Error(\"update is not supported for app resources\"); },\n updateMany: async () => { throw new Error(\"updateMany is not supported for app resources\"); },\n deleteOne: async () => { throw new Error(\"deleteOne is not supported for app resources\"); },\n deleteMany: async () => { throw new Error(\"deleteMany is not supported for app resources\"); },\n };\n}\n","import type {\n DataProvider,\n BaseRecord,\n GetListParams,\n GetListResponse,\n GetOneParams,\n GetOneResponse,\n CreateParams,\n CreateResponse,\n UpdateParams,\n UpdateResponse,\n DeleteOneParams,\n DeleteOneResponse,\n CrudFilter,\n CrudSort,\n Pagination,\n} from \"@refinedev/core\";\nimport { Client, User, Auth } from \"@taruvi/sdk\";\nimport type { UserData, UserCreateRequest, UserUpdateRequest } from \"@taruvi/sdk\";\n\n/**\n * Response type for users list from the User service.\n */\ninterface UsersListResponse {\n data: UserData[];\n total: number;\n}\n\n/**\n * Filter parameters for listing users.\n */\ninterface UserListFilters {\n search?: string;\n is_active?: boolean;\n is_staff?: boolean;\n is_superuser?: boolean;\n is_deleted?: boolean;\n ordering?: string;\n page?: number;\n page_size?: number;\n}\n\n/**\n * Builds UserListFilters from Refine's filters, sorters, and pagination.\n */\nfunction buildUserListFilters(\n filters?: CrudFilter[],\n sorters?: CrudSort[],\n pagination?: Pagination\n): UserListFilters {\n const result: UserListFilters = {};\n\n // Apply pagination\n if (pagination && pagination.mode !== \"off\") {\n if (pagination.currentPage) {\n result.page = pagination.currentPage;\n }\n if (pagination.pageSize) {\n result.page_size = pagination.pageSize;\n }\n }\n\n // Apply filters\n if (filters) {\n for (const filter of filters) {\n if (\"field\" in filter) {\n const field = filter.field as string;\n const value = filter.value;\n\n switch (field) {\n case \"search\":\n result.search = String(value);\n break;\n case \"is_active\":\n result.is_active = Boolean(value);\n break;\n case \"is_staff\":\n result.is_staff = Boolean(value);\n break;\n case \"is_superuser\":\n result.is_superuser = Boolean(value);\n break;\n case \"is_deleted\":\n result.is_deleted = Boolean(value);\n break;\n }\n }\n }\n }\n\n // Apply sorting (first sorter only, as API accepts single ordering)\n if (sorters && sorters.length > 0) {\n const sorter = sorters[0];\n result.ordering = sorter.order === \"desc\" ? `-${sorter.field}` : sorter.field;\n }\n\n return result;\n}\n\n/**\n * Creates a Refine DataProvider for Taruvi User operations.\n *\n * This provider is specialized for fetching user-level data.\n *\n * Supported resources:\n * - \"users\" (getList): Fetch list of users with filtering/pagination\n * - \"users\" (getOne): Fetch a specific user by username/id\n * - \"roles\" (getList): Fetch roles for a specific user (requires meta.username)\n *\n * @example\n * ```typescript\n * // Get list of users\n * const { data } = useList({\n * dataProviderName: \"user\",\n * resource: \"users\",\n * pagination: { currentPage: 1, pageSize: 10 },\n * filters: [\n * { field: \"is_active\", operator: \"eq\", value: true },\n * { field: \"search\", operator: \"eq\", value: \"john\" },\n * ],\n * sorters: [{ field: \"username\", order: \"asc\" }],\n * });\n *\n * // Get a specific user by username\n * const { data } = useOne({\n * dataProviderName: \"user\",\n * resource: \"users\",\n * id: \"john_doe\",\n * });\n *\n * // Get roles for a specific user\n * const { data } = useList({\n * dataProviderName: \"user\",\n * resource: \"roles\",\n * meta: { username: \"john_doe\" },\n * });\n * ```\n */\nexport function userDataProvider(client: Client): DataProvider {\n const config = client.getConfig();\n const baseApiUrl = `${config.apiUrl}/api/apps/${config.appSlug}`;\n\n return {\n getList: async <TData extends BaseRecord = BaseRecord>(\n params: GetListParams\n ): Promise<GetListResponse<TData>> => {\n const { resource, pagination, filters, sorters, meta } = params;\n\n if (resource === \"users\") {\n const user = new User(client);\n const userFilters = buildUserListFilters(filters, sorters, pagination);\n const response = await user.list(userFilters as Parameters<typeof user.list>[0]) as UsersListResponse;\n\n return {\n data: (response.data || response) as unknown as TData[],\n total: response.total,\n };\n }\n\n if (resource === \"roles\") {\n // Get roles for a specific user - requires meta.username\n const username = meta?.username as string;\n if (!username) {\n throw new Error(\"roles resource requires meta.username\");\n }\n const user = new User(client);\n const response = await user.getUser(username) as any;\n const roles = response.data?.roles || response.roles || [];\n\n return {\n data: roles as unknown as TData[],\n total: roles.length,\n };\n }\n\n if (resource === \"apps\") {\n const username = meta?.username as string;\n if (!username) {\n throw new Error(\"apps resource requires meta.username\");\n }\n const user = new User(client);\n const response = await user.getUserApps(username) as any;\n const apps = response.data || response;\n return {\n data: apps as TData[],\n total: Array.isArray(apps) ? apps.length : 0,\n };\n }\n\n throw new Error(`Unknown user resource for getList: ${resource}. Supported: users, roles, apps`);\n },\n\n getOne: async <TData extends BaseRecord = BaseRecord>(\n params: GetOneParams\n ): Promise<GetOneResponse<TData>> => {\n const { resource, id } = params;\n\n if (resource === \"users\") {\n const user = new User(client)\n\n // Support \"me\" as a special ID to get current user via Auth\n if (String(id) === \"me\") {\n const auth = new Auth(client);\n const response = await auth.getCurrentUser();\n const data = response ? ((response as any).data ?? response) : null;\n return { data: data as unknown as TData };\n }\n\n const response = await user.getUser(String(id));\n\n return {\n data: response.data as unknown as TData,\n };\n }\n\n throw new Error(`Unknown user resource for getOne: ${resource}. Supported: users`);\n },\n\n getApiUrl: () => baseApiUrl,\n\n create: async <TData extends BaseRecord = BaseRecord, TVariables = {}>(\n params: CreateParams<TVariables>\n ): Promise<CreateResponse<TData>> => {\n const { resource, variables } = params;\n\n if (resource === \"users\") {\n const user = new User(client);\n const userData = variables as unknown as UserCreateRequest;\n const response = await user.createUser(userData);\n\n return {\n data: response.data as unknown as TData,\n };\n }\n\n throw new Error(`Unknown user resource for create: ${resource}. Supported resources: users`);\n },\n\n update: async <TData extends BaseRecord = BaseRecord, TVariables = {}>(\n params: UpdateParams<TVariables>\n ): Promise<UpdateResponse<TData>> => {\n const { resource, id, variables } = params;\n\n if (resource === \"users\") {\n const user = new User(client);\n const username = String(id);\n const updateData = variables as unknown as UserUpdateRequest;\n const response = await user.updateUser(username, updateData);\n\n return {\n data: response.data as unknown as TData,\n };\n }\n\n throw new Error(`Unknown user resource for update: ${resource}. Supported resources: users`);\n },\n\n deleteOne: async <TData extends BaseRecord = BaseRecord, TVariables = {}>(\n params: DeleteOneParams<TVariables>\n ): Promise<DeleteOneResponse<TData>> => {\n const { resource, id } = params;\n\n if (resource === \"users\") {\n const user = new User(client);\n const username = String(id);\n await user.deleteUser(username);\n\n return {\n data: {} as TData,\n };\n }\n\n throw new Error(`Unknown user resource for delete: ${resource}. Supported resources: users`);\n },\n\n // User resources - other operations not supported\n getMany: async () => { throw new Error(\"getMany is not supported for user resources\"); },\n createMany: async () => { throw new Error(\"createMany is not supported for user resources\"); },\n updateMany: async () => { throw new Error(\"updateMany is not supported for user resources\"); },\n deleteMany: async () => { throw new Error(\"deleteMany is not supported for user resources\"); },\n custom: async () => { throw new Error(\"custom is not supported for user resources\"); },\n };\n}\n","import type {\n DataProvider,\n BaseRecord,\n CreateParams,\n CreateResponse,\n} from \"@refinedev/core\";\nimport { Client, Functions } from \"@taruvi/sdk\";\n\n/**\n * Extended meta options for function execution.\n */\nexport interface FunctionMeta {\n /** Whether to execute the function asynchronously */\n async?: boolean;\n}\n\n/** @deprecated Use `appDataProvider` with `useCustom` and `meta.kind: \"function\"` instead. */\nexport function functionsDataProvider(client: Client): DataProvider {\n const config = client.getConfig();\n const baseApiUrl = `${config.apiUrl}/api/apps/${config.appSlug}`;\n const functions = new Functions(client);\n\n return {\n /**\n * Execute an edge function.\n *\n * @param resource - The function slug to execute\n * @param variables - Parameters to pass to the function\n * @param meta.async - Whether to execute asynchronously (default: false)\n */\n create: async <TData extends BaseRecord = BaseRecord, TVariables = {}>({\n resource,\n variables,\n meta,\n }: CreateParams<TVariables>): Promise<CreateResponse<TData>> => {\n const functionMeta = meta as FunctionMeta | undefined;\n\n const response = await functions.execute<TData>(resource, {\n async: functionMeta?.async ?? false,\n params: variables as Record<string, unknown>,\n });\n\n return { data: response.data as TData };\n },\n\n getApiUrl: () => baseApiUrl,\n\n // Edge functions don't support custom method - use create() instead\n custom: async () => {\n throw new Error(\n \"custom is not supported for edge functions. Use useCreate to execute functions.\"\n );\n },\n\n // Edge functions don't support other CRUD operations\n getList: async () => {\n throw new Error(\n \"getList is not supported for edge functions. Use useCreate to execute functions.\"\n );\n },\n getOne: async () => {\n throw new Error(\n \"getOne is not supported for edge functions. Use useCreate to execute functions.\"\n );\n },\n getMany: async () => {\n throw new Error(\n \"getMany is not supported for edge functions. Use useCreate to execute functions.\"\n );\n },\n createMany: async () => {\n throw new Error(\n \"createMany is not supported for edge functions. Use useCreate to execute functions.\"\n );\n },\n update: async () => {\n throw new Error(\n \"update is not supported for edge functions. Use useCreate to execute functions.\"\n );\n },\n updateMany: async () => {\n throw new Error(\n \"updateMany is not supported for edge functions. Use useCreate to execute functions.\"\n );\n },\n deleteOne: async () => {\n throw new Error(\n \"deleteOne is not supported for edge functions. Use useCreate to execute functions.\"\n );\n },\n deleteMany: async () => {\n throw new Error(\n \"deleteMany is not supported for edge functions. Use useCreate to execute functions.\"\n );\n },\n };\n}","import type {\n DataProvider,\n BaseRecord,\n CreateParams,\n CreateResponse,\n} from \"@refinedev/core\";\nimport { Client, Analytics } from \"@taruvi/sdk\";\n\n/**\n * Extended meta options for analytics query execution.\n */\nexport interface AnalyticsMeta {\n /** Additional parameters to pass to the analytics query */\n params?: Record<string, unknown>;\n}\n\n/** @deprecated Use `appDataProvider` with `useCustom` and `meta.kind: \"analytics\"` instead. */\nexport function analyticsDataProvider(client: Client): DataProvider {\n const config = client.getConfig();\n const baseApiUrl = `${config.apiUrl}/api/apps/${config.appSlug}`;\n const analytics = new Analytics(client);\n\n return {\n /**\n * Execute an analytics query.\n *\n * @param resource - The query slug to execute\n * @param variables - Parameters to pass to the query\n */\n create: async <TData extends BaseRecord = BaseRecord, TVariables = {}>({\n resource,\n variables,\n }: CreateParams<TVariables>): Promise<CreateResponse<TData>> => {\n const response = await analytics.execute<TData>(resource, {\n params: variables as Record<string, unknown>,\n });\n\n return { data: response.data as TData };\n },\n\n getApiUrl: () => baseApiUrl,\n\n // Analytics don't support custom method - use create() instead\n custom: async () => {\n throw new Error(\n \"custom is not supported for analytics. Use useCreate to execute queries.\"\n );\n },\n\n // Analytics queries don't support other CRUD operations\n getList: async () => {\n throw new Error(\n \"getList is not supported for analytics. Use useCreate to execute queries.\"\n );\n },\n getOne: async () => {\n throw new Error(\n \"getOne is not supported for analytics. Use useCreate to execute queries.\"\n );\n },\n getMany: async () => {\n throw new Error(\n \"getMany is not supported for analytics. Use useCreate to execute queries.\"\n );\n },\n createMany: async () => {\n throw new Error(\n \"createMany is not supported for analytics. Use useCreate to execute queries.\"\n );\n },\n update: async () => {\n throw new Error(\n \"update is not supported for analytics. Use useCreate to execute queries.\"\n );\n },\n updateMany: async () => {\n throw new Error(\n \"updateMany is not supported for analytics. Use useCreate to execute queries.\"\n );\n },\n deleteOne: async () => {\n throw new Error(\n \"deleteOne is not supported for analytics. Use useCreate to execute queries.\"\n );\n },\n deleteMany: async () => {\n throw new Error(\n \"deleteMany is not supported for analytics. Use useCreate to execute queries.\"\n );\n },\n };\n}","import type { AuthProvider } from \"@refinedev/core\";\nimport { Client, Auth } from \"@taruvi/sdk\";\n\n/**\n * Login params - supports both redirect flow and credentials flow\n */\nexport interface LoginParams {\n /** For redirect-based login - URL to redirect after successful login */\n callbackUrl?: string;\n /** For credentials-based login (if supported) */\n username?: string;\n password?: string;\n /** Whether to use redirect flow (default: true) */\n redirect?: boolean;\n}\n\n/**\n * Logout params\n */\nexport interface LogoutParams {\n /** URL to redirect after logout */\n callbackUrl?: string;\n}\n\n/**\n * Register/Signup params\n */\nexport interface RegisterParams {\n /** URL to redirect after successful signup */\n callbackUrl?: string;\n}\n\n/**\n * Creates a Refine AuthProvider for Taruvi authentication.\n *\n * Supports redirect-based authentication flow (Web UI Flow):\n * 1. User calls login() → Redirects to backend /accounts/login/\n * 2. User authenticates on backend\n * 3. Backend redirects back with tokens in URL hash\n * 4. Client extracts and stores tokens automatically\n */\nexport function authProvider(client: Client): AuthProvider {\n const auth = new Auth(client);\n\n return {\n login: async (params: LoginParams = {}) => {\n const { callbackUrl, redirect = true } = params;\n\n // Check if already authenticated first (prevents infinite redirect loop)\n\n // TODO: check if this is necessary\n if (auth.isUserAuthenticated()) {\n return {\n success: true,\n redirectTo: callbackUrl || \"/\",\n };\n }\n\n if (redirect) {\n // Redirect-based login flow\n auth.login(callbackUrl);\n\n // Return success since we're redirecting\n // The actual auth state will be checked after redirect\n return {\n success: true,\n };\n }\n\n return {\n success: false,\n error: {\n name: \"LoginError\",\n message: \"Login failed. Please try again.\",\n },\n };\n },\n\n logout: async (params: LogoutParams = {}) => {\n const { callbackUrl } = params;\n\n await auth.logout(callbackUrl);\n\n return {\n success: true,\n redirectTo: callbackUrl || \"/login\",\n };\n },\n\n check: async () => {\n if (!auth.isUserAuthenticated()) {\n return { authenticated: false, redirectTo: \"/login\" };\n }\n\n // Validate token against server — local token may be invalidated server-side\n try {\n const user = await auth.getCurrentUser();\n if (user) {\n return { authenticated: true };\n }\n } catch {\n // Token invalid — interceptor already cleared it\n }\n\n return { authenticated: false, redirectTo: \"/login\" };\n },\n\n onError: async (error) => {\n const status = error?.statusCode || error?.status || error?.response?.status;\n\n // 401/403 means session is invalid — tokens already cleared by SDK interceptor\n if (status === 401 || status === 403) {\n return {\n logout: true,\n redirectTo: \"/login\",\n error,\n };\n }\n\n return { error };\n },\n\n register: async (params: RegisterParams = {}) => {\n const { callbackUrl } = params;\n\n // Redirect to signup page\n auth.signup(callbackUrl);\n\n return {\n success: true,\n };\n },\n\n getIdentity: async () => {\n const response = await auth.getCurrentUser();\n\n if (!response) {\n return null;\n }\n\n return (response as any).data ?? response;\n },\n\n getPermissions: async () => {\n const response = await auth.getCurrentUser();\n\n if (!response) {\n return null;\n }\n\n const user = (response as any).data ?? response;\n\n if (!user) {\n return null;\n }\n\n // Return permissions from the user data\n return {\n roles: user.roles || [],\n permissions: user.user_permissions || [],\n groups: user.groups || [],\n is_staff: user.is_staff || false,\n is_superuser: user.is_superuser || false,\n };\n },\n };\n}\n","import type { AccessControlProvider } from \"@refinedev/core\";\nimport { Client, Auth, Policy } from \"@taruvi/sdk\";\nimport DataLoader from \"dataloader\";\n\n/**\n * Permission check request for DataLoader batching\n */\ninterface PermissionCheck {\n resource: string;\n action: string;\n params?: Record<string, unknown>;\n entityType?: string;\n}\n\ninterface PermissionResult {\n can: boolean;\n reason?: string;\n}\n\n/**\n * Creates a Refine AccessControlProvider using Cerbos via the Policy client.\n *\n * Uses DataLoader for request batching (multiple useCan calls → single API request)\n * and Refine's built-in TanStack Query for caching.\n *\n * @example\n * ```tsx\n * <Refine\n * authProvider={authProvider(client)}\n * accessControlProvider={accessControlProvider(client)}\n * />\n *\n *\n * ```\n */\nexport function accessControlProvider(\n client: Client,\n options?: { batchDelayMs?: number }\n): AccessControlProvider {\n const policy = new Policy(client);\n const auth = new Auth(client);\n const { batchDelayMs = 50 } = options ?? {};\n\n // DataLoader for batching only - TanStack Query handles caching\n const permissionLoader = new DataLoader<PermissionCheck, PermissionResult>(\n async (checks) => {\n const response = await auth.getCurrentUser();\n const user = response ? ((response as any).data ?? response) : null;\n\n if (!user) {\n return checks.map(() => ({\n can: false,\n reason: \"User not authenticated\",\n }));\n }\n\n // Deduplicate and group by resource:recordId (needed because cache: false)\n const uniqueResources = new Map<string, {\n entityType?: string;\n tableName: string;\n recordId: string;\n attributes: Record<string, unknown>;\n actions: Set<string>;\n }>();\n\n for (const check of checks) {\n const recordId = check.params?.id ? String(check.params.id) : \"*\";\n const key = `${check.resource}:${recordId}`;\n\n if (!uniqueResources.has(key)) {\n uniqueResources.set(key, {\n entityType: check.entityType,\n tableName: check.resource,\n recordId,\n attributes: (check.params || {}) as Record<string, unknown>,\n actions: new Set(),\n });\n }\n uniqueResources.get(key)!.actions.add(check.action);\n }\n\n // Build batch payload for Cerbos\n const batchPayload = Array.from(uniqueResources.values()).map((entry) => ({\n entityType: entry.entityType ?? entry.tableName, // Default to tableName if entityType not specified\n tableName: entry.tableName,\n recordId: entry.recordId,\n attributes: entry.attributes,\n actions: Array.from(entry.actions),\n }));\n\n try {\n // Single SDK call for all permissions\n const result = await policy.checkResource(batchPayload) as {\n results?: Array<{ actions?: Record<string, string> }>;\n };\n\n // Build results lookup\n const resultsByResource = new Map<string, Record<string, string>>();\n result?.results?.forEach((r, index) => {\n const payload = batchPayload[index];\n const key = `${payload.tableName}:${payload.recordId}`;\n resultsByResource.set(key, r.actions || {});\n });\n\n // Map results back to original checks order (DataLoader requirement)\n return checks.map((check) => {\n const recordId = check.params?.id ? String(check.params.id) : \"*\";\n const key = `${check.resource}:${recordId}`;\n const actions = resultsByResource.get(key) || {};\n const allowed = actions[check.action] === \"EFFECT_ALLOW\";\n\n return {\n can: allowed,\n reason: allowed ? undefined : \"Permission denied by policy\",\n };\n });\n } catch (error) {\n console.error(\"Batch permission check failed:\", error);\n return checks.map(() => ({\n can: false,\n reason: error instanceof Error ? error.message : \"Permission check failed\",\n }));\n }\n },\n {\n batchScheduleFn: (callback) => setTimeout(callback, batchDelayMs),\n cache: false, // TanStack Query handles caching\n }\n );\n\n return {\n can: async ({ resource, action, params }) => {\n if (!resource) {\n return { can: false, reason: \"Resource not specified\" };\n }\n\n // Priority: params.entityType (override) > resource.meta.entityType > resource name\n const entityType = (params?.entityType as string | undefined)\n ?? (params?.resource?.meta?.entityType as string | undefined);\n\n return permissionLoader.load({\n resource,\n action,\n params,\n entityType,\n });\n },\n\n options: {\n buttons: {\n enableAccessControl: true,\n hideIfUnauthorized: true,\n },\n queryOptions: {\n staleTime: 5 * 60 * 1000, // 5 minutes\n gcTime: 10 * 60 * 1000, // 10 minutes\n },\n },\n };\n}\n"]}
package/dist/index.js CHANGED
@@ -945,13 +945,17 @@ function authProvider(client) {
945
945
  };
946
946
  },
947
947
  check: async () => {
948
- if (auth.isUserAuthenticated()) {
949
- return { authenticated: true };
948
+ if (!auth.isUserAuthenticated()) {
949
+ return { authenticated: false, redirectTo: "/login" };
950
950
  }
951
- return {
952
- authenticated: false,
953
- redirectTo: "/login"
954
- };
951
+ try {
952
+ const user = await auth.getCurrentUser();
953
+ if (user) {
954
+ return { authenticated: true };
955
+ }
956
+ } catch {
957
+ }
958
+ return { authenticated: false, redirectTo: "/login" };
955
959
  },
956
960
  onError: async (error) => {
957
961
  const status = error?.statusCode || error?.status || error?.response?.status;
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../package.json","../src/utils.ts","../src/dataProvider.ts","../src/storageDataProvider.ts","../src/appDataProvider.ts","../src/userDataProvider.ts","../src/functionsDataProvider.ts","../src/analyticsDataProvider.ts","../src/authProvider.ts","../src/accessControlProvider.ts"],"names":["response","Functions","Analytics","Auth"],"mappings":"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","file":"index.js","sourcesContent":["{\n \"name\": \"@taruvi/refine-providers\",\n \"version\": \"1.2.7\",\n \"description\": \"Refine.dev data provider for Taruvi Data Service\",\n \"type\": \"module\",\n \"main\": \"./dist/index.cjs\",\n \"module\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\",\n \"exports\": {\n \".\": {\n \"import\": {\n \"types\": \"./dist/index.d.ts\",\n \"default\": \"./dist/index.js\"\n },\n \"require\": {\n \"types\": \"./dist/index.d.cts\",\n \"default\": \"./dist/index.cjs\"\n }\n }\n },\n \"files\": [\n \"dist\",\n \"README.md\"\n ],\n \"scripts\": {\n \"build\": \"tsup\",\n \"dev\": \"tsup --watch\",\n \"test\": \"vitest run\",\n \"typecheck\": \"tsc --noEmit\",\n \"clean\": \"rm -rf dist\"\n },\n \"peerDependencies\": {\n \"@refinedev/core\": \"^5.0.0\"\n },\n \"peerDependenciesMeta\": {\n \"@refinedev/core\": {\n \"optional\": false\n }\n },\n \"devDependencies\": {\n \"@refinedev/core\": \"^5.0.0\",\n \"@types/node\": \"^20.0.0\",\n \"tsup\": \"^8.0.0\",\n \"typescript\": \"^5.7.0\",\n \"vitest\": \"^4.0.18\"\n },\n \"keywords\": [\n \"refine\",\n \"refinedev\",\n \"data-provider\",\n \"taruvi\",\n \"react\",\n \"crud\"\n ],\n \"author\": \"EOX Vantage\",\n \"license\": \"MIT\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/taruvi-io/sdk.git\",\n \"directory\": \"packages/refine\"\n },\n \"homepage\": \"https://github.com/taruvi-io/sdk/tree/main/packages/refine#readme\",\n \"bugs\": {\n \"url\": \"https://github.com/taruvi-io/sdk/issues\"\n },\n \"dependencies\": {\n \"@taruvi/sdk\": \"latest\",\n \"dataloader\": \"^2.2.3\"\n }\n}\n","import type { CrudFilter, CrudSort, Pagination } from \"@refinedev/core\";\nimport type { TaruviMeta } from \"./types.js\";\n\n/**\n * Maps Refine operators to Taruvi DRF-style query parameter suffixes.\n * Example: { field: \"age\", operator: \"gte\", value: 18 } → \"age__gte=18\"\n */\nexport const REFINE_OPERATOR_MAP: Record<string, string> = {\n // Equality\n eq: \"\", // exact match (no suffix)\n ne: \"ne\",\n\n // Comparison\n lt: \"lt\",\n gt: \"gt\",\n lte: \"lte\",\n gte: \"gte\",\n\n // String operations (case-sensitive)\n contains: \"contains\",\n ncontains: \"ncontains\",\n startswith: \"startswith\",\n nstartswith: \"nstartswith\",\n endswith: \"endswith\",\n nendswith: \"nendswith\",\n\n // String operations (case-insensitive)\n containss: \"icontains\",\n ncontainss: \"nicontains\",\n startswiths: \"istartswith\",\n nstartswiths: \"nistartswith\",\n endswiths: \"iendswith\",\n nendswiths: \"niendswith\",\n\n // Array operations\n in: \"in\",\n nin: \"nin\",\n\n // Null checks\n null: \"null\",\n nnull: \"nnull\",\n\n // Range\n between: \"between\",\n nbetween: \"nbetween\",\n};\n\n/**\n * Converts Refine CrudFilter[] to Taruvi query parameters.\n * Handles both simple filters and logical operators (and/or).\n */\nexport function convertRefineFilters(\n filters?: CrudFilter[]\n): Record<string, string> {\n if (!filters || filters.length === 0) return {};\n\n const params: Record<string, string> = {};\n\n for (const filter of filters) {\n // Handle logical operators (and/or groups)\n if (\n \"operator\" in filter &&\n (filter.operator === \"and\" || filter.operator === \"or\")\n ) {\n // Recursively process nested filters\n // Note: Taruvi API treats multiple params as AND by default\n // OR logic would need special handling if supported by API\n if (filter.value && Array.isArray(filter.value)) {\n const nested = convertRefineFilters(filter.value as CrudFilter[]);\n Object.assign(params, nested);\n }\n continue;\n }\n\n // Handle conditional filters (field, operator, value)\n if (\"field\" in filter && filter.field && filter.operator) {\n const { field, operator, value } = filter;\n\n // Skip undefined/null values (except for null operator)\n if (value === undefined || (value === null && operator !== \"null\")) {\n continue;\n }\n\n const suffix = REFINE_OPERATOR_MAP[operator];\n\n if (suffix === undefined) {\n console.warn(`Unknown Refine operator: ${operator}`);\n continue;\n }\n\n // Build parameter key with double underscore for DRF style\n const paramKey = suffix ? `${field}__${suffix}` : String(field);\n\n // Format value based on operator\n if (operator === \"in\" || operator === \"nin\") {\n // Array values: join with comma\n params[paramKey] = Array.isArray(value) ? value.join(\",\") : String(value);\n } else if (operator === \"between\" || operator === \"nbetween\") {\n // Range values: expect [min, max] array\n params[paramKey] = Array.isArray(value) ? value.join(\",\") : String(value);\n } else if (operator === \"null\" || operator === \"nnull\") {\n // Boolean for null checks\n params[paramKey] = \"true\";\n } else {\n params[paramKey] = String(value);\n }\n }\n }\n\n return params;\n}\n\n/**\n * Converts Refine CrudSort[] to Taruvi ordering parameter.\n * Uses DRF convention: \"-field\" for DESC, \"field\" for ASC.\n */\nexport function convertRefineSorters(sorters?: CrudSort[]): string | undefined {\n if (!sorters || sorters.length === 0) return undefined;\n\n return sorters\n .map((sort) => (sort.order === \"desc\" ? `-${sort.field}` : sort.field))\n .join(\",\");\n}\n\n/**\n * Converts Refine Pagination to Taruvi page/page_size parameters.\n */\nexport function convertRefinePagination(\n pagination?: Pagination\n): { page?: number; page_size?: number } {\n if (!pagination) return {};\n\n const { currentPage, pageSize, mode } = pagination;\n\n // Handle \"off\" mode - no pagination\n if (mode === \"off\") return {};\n\n return {\n page: currentPage ?? 1, // Default to page 1 if currentPage is undefined\n page_size: pageSize,\n };\n}\n\n/**\n * Combines all Refine parameters into Taruvi query params.\n */\nexport function buildRefineQueryParams(options: {\n filters?: CrudFilter[];\n sorters?: CrudSort[];\n pagination?: Pagination;\n meta?: TaruviMeta;\n}): Record<string, unknown> {\n const { filters, sorters, pagination, meta } = options;\n\n const params: Record<string, unknown> = {\n ...convertRefineFilters(filters),\n ...convertRefinePagination(pagination),\n };\n\n const ordering = convertRefineSorters(sorters);\n if (ordering) {\n params.ordering = ordering;\n }\n\n // Handle populate from meta\n if (meta?.populate) {\n params.populate = Array.isArray(meta.populate)\n ? meta.populate.join(\",\")\n : meta.populate;\n }\n\n return params;\n}\n\n/**\n * Builds a query string from an object of parameters.\n */\nexport function buildQueryString(params?: Record<string, unknown>): string {\n if (!params || Object.keys(params).length === 0) return \"\";\n\n const searchParams = new URLSearchParams();\n\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined && value !== null) {\n searchParams.append(key, String(value));\n }\n }\n\n const queryString = searchParams.toString();\n return queryString ? `?${queryString}` : \"\";\n}\n\n\n/**\n * Converts aggregate expressions array to _aggregate query parameter.\n * @param aggregates - Array of aggregate expressions like [\"sum(total)\", \"count(*)\"]\n * @returns Comma-separated string or undefined\n */\nexport function formatAggregates(aggregates?: string[]): string | undefined {\n if (!aggregates || aggregates.length === 0) return undefined;\n return aggregates.join(\",\");\n}\n\n/**\n * Converts groupBy fields array to _group_by query parameter.\n * @param groupBy - Array of field names to group by\n * @returns Comma-separated string or undefined\n */\nexport function formatGroupBy(groupBy?: string[]): string | undefined {\n if (!groupBy || groupBy.length === 0) return undefined;\n return groupBy.join(\",\");\n}\n\n/**\n * Converts having filters to _having query parameter.\n * Uses same format as regular filters with DRF-style operators.\n * @param having - Array of CrudFilter for aggregate results\n * @returns Comma-separated filter string or undefined\n */\nexport function formatHaving(having?: CrudFilter[]): string | undefined {\n if (!having || having.length === 0) return undefined;\n\n const params: string[] = [];\n\n for (const filter of having) {\n // Handle conditional filters (field, operator, value)\n if (\"field\" in filter && filter.field && filter.operator) {\n const { field, operator, value } = filter;\n\n // Skip undefined/null values\n if (value === undefined || (value === null && operator !== \"null\")) {\n continue;\n }\n\n const suffix = REFINE_OPERATOR_MAP[operator];\n\n if (suffix === undefined) {\n console.warn(`Unknown operator in having clause: ${operator}`);\n continue;\n }\n\n // Build parameter with DRF-style operator\n const paramKey = suffix ? `${field}__${suffix}` : String(field);\n\n // Format value based on operator\n let paramValue: string;\n if (operator === \"in\" || operator === \"nin\") {\n paramValue = Array.isArray(value) ? value.join(\",\") : String(value);\n } else if (operator === \"between\" || operator === \"nbetween\") {\n paramValue = Array.isArray(value) ? value.join(\",\") : String(value);\n } else if (operator === \"null\" || operator === \"nnull\") {\n paramValue = \"true\";\n } else {\n paramValue = String(value);\n }\n\n params.push(`${paramKey}=${paramValue}`);\n }\n }\n\n return params.length > 0 ? params.join(\",\") : undefined;\n}\n\n/**\n * Handles and transforms Taruvi API errors.\n */\nexport function handleError(error: unknown): never {\n if (error instanceof Error) {\n throw error;\n }\n if (typeof error === \"object\" && error !== null && \"message\" in error) {\n throw new Error(String((error as { message: unknown }).message));\n }\n throw new Error(\"Unknown error occurred\");\n}\n","import type {\n DataProvider,\n BaseRecord,\n GetListParams,\n GetListResponse,\n GetOneParams,\n GetOneResponse,\n GetManyParams,\n GetManyResponse,\n CreateParams,\n CreateResponse,\n CreateManyParams,\n CreateManyResponse,\n UpdateParams,\n UpdateResponse,\n UpdateManyParams,\n UpdateManyResponse,\n DeleteOneParams,\n DeleteOneResponse,\n DeleteManyParams,\n DeleteManyResponse,\n CustomParams,\n CustomResponse,\n CrudFilter,\n CrudSort,\n Pagination,\n} from \"@refinedev/core\";\nimport { Client, Database } from \"@taruvi/sdk\";\nimport type { EdgeRequest } from \"@taruvi/sdk\";\nimport type { TaruviListResponse, TaruviMeta } from \"./types.js\";\nimport pkg from \"../package.json\" with { type: \"json\" };\nimport { REFINE_OPERATOR_MAP, formatHaving } from \"./utils.js\";\n\nfunction applyAggregations<T>(query: Database<T>, meta?: TaruviMeta): Database<T> {\n if (!meta) return query;\n\n let result = query;\n\n if (meta.aggregate?.length) {\n result = result.aggregate(...meta.aggregate);\n }\n\n if (meta.groupBy?.length) {\n result = result.groupBy(...meta.groupBy);\n }\n\n const havingStr = formatHaving(meta.having);\n if (havingStr) {\n result = result.having(havingStr);\n }\n\n return result;\n}\n\n/**\n * Applies Refine filters to a Database query using the shared operator map from utils.\n */\nfunction applyFilters<T>(\n query: Database<T>,\n filters?: CrudFilter[]\n): Database<T> {\n if (!filters || filters.length === 0) return query;\n\n let result = query;\n\n for (const filter of filters) {\n if (\"operator\" in filter && (filter.operator === \"and\" || filter.operator === \"or\")) {\n if (filter.value && Array.isArray(filter.value)) {\n result = applyFilters(result, filter.value as CrudFilter[]);\n }\n continue;\n }\n\n if (\"field\" in filter && filter.field && filter.operator) {\n const { field, operator, value } = filter;\n\n if (value === undefined || (value === null && operator !== \"null\")) continue;\n\n const suffix = REFINE_OPERATOR_MAP[operator];\n if (suffix === undefined) {\n console.warn(`Unknown Refine operator: ${operator}`);\n continue;\n }\n\n // Build the DRF-style param key directly\n const paramKey = suffix ? `${field}__${suffix}` : String(field);\n\n let paramValue: string;\n if (operator === \"in\" || operator === \"nin\" || operator === \"between\" || operator === \"nbetween\") {\n paramValue = Array.isArray(value) ? value.join(\",\") : String(value);\n } else if (operator === \"null\" || operator === \"nnull\") {\n paramValue = \"true\";\n } else {\n paramValue = String(value);\n }\n\n // Use \"eq\" operator so the SDK doesn't add another suffix\n result = result.filter(paramKey, \"eq\", paramValue);\n }\n }\n\n return result;\n}\n\n/**\n * Applies Refine sorters to a Database query.\n */\nfunction applySorters<T>(\n query: Database<T>,\n sorters?: CrudSort[]\n): Database<T> {\n if (!sorters || sorters.length === 0) return query;\n\n let result = query;\n for (const sorter of sorters) {\n result = result.sort(sorter.field, sorter.order === \"desc\" ? \"desc\" : \"asc\");\n }\n return result;\n}\n\n/**\n * Applies Refine pagination to a Database query.\n */\nfunction applyPagination<T>(\n query: Database<T>,\n pagination?: Pagination\n): Database<T> {\n if (!pagination || pagination.mode === \"off\") return query;\n\n let result = query;\n if (pagination.currentPage) result = result.page(pagination.currentPage);\n if (pagination.pageSize) result = result.pageSize(pagination.pageSize);\n return result;\n}\n\n/**\n * Applies populate fields to a Database query.\n */\nfunction applyPopulate<T>(\n query: Database<T>,\n meta?: TaruviMeta\n): Database<T> {\n if (!meta?.populate) return query;\n\n const populateArray = Array.isArray(meta.populate)\n ? meta.populate\n : meta.populate.split(\",\").map(s => s.trim());\n\n return query.populate(populateArray);\n}\n\n/**\n * Checks if the query should use Graph SDK based on meta params.\n */\nfunction isGraphQuery(meta?: TaruviMeta): boolean {\n return !!(meta?.format || meta?.graph_types || meta?.include || meta?.depth);\n}\n\n/**\n * Builds a Graph query with optional params from meta.\n */\nfunction buildGraphQuery<T>(client: Client, tableName: string, meta?: TaruviMeta, recordId?: string): Database<T> {\n let query = new Database(client).from<T>(tableName);\n\n if (recordId) query = query.get(recordId);\n if (meta?.format) query = query.format(meta.format);\n if (meta?.include) query = query.include(meta.include);\n if (meta?.depth) query = query.depth(meta.depth);\n if (meta?.graph_types) query = query.types(meta.graph_types);\n\n return query;\n}\n\n/**\n * Creates a Refine DataProvider for Taruvi database operations.\n */\nexport function dataProvider(client: Client): DataProvider {\n console.log(`Taruvi Refine Provider v${pkg.version} initialized`);\n const config = client.getConfig();\n const baseApiUrl = `${config.apiUrl}/api/apps/${config.appSlug}`;\n\n const getIdColumn = (meta?: TaruviMeta) => meta?.idColumnName ?? \"id\";\n const getTableName = (resource: string, meta?: TaruviMeta) => meta?.tableName ?? resource;\n\n return {\n getList: async <TData extends BaseRecord = BaseRecord>(\n params: GetListParams\n ): Promise<GetListResponse<TData>> => {\n const { resource, pagination, filters, sorters, meta } = params;\n const taruviMeta = meta as TaruviMeta | undefined;\n const tableName = getTableName(resource, taruviMeta);\n\n if (isGraphQuery(taruviMeta)) {\n const response = await buildGraphQuery<TData>(client, tableName, taruviMeta).execute();\n const data = Array.isArray(response) ? response : (response as any)?.data ?? [];\n const total = (response as any)?.total ?? data.length;\n return { data: data as TData[], total };\n }\n\n let query = new Database(client).from(tableName);\n query = applyFilters(query, filters);\n query = applySorters(query, sorters);\n query = applyPagination(query, pagination);\n query = applyPopulate(query, taruviMeta);\n query = applyAggregations(query, taruviMeta);\n\n const response = await query.execute() as unknown as TaruviListResponse<TData>;\n return { data: response.data, total: response.total };\n },\n\n getOne: async <TData extends BaseRecord = BaseRecord>(\n params: GetOneParams\n ): Promise<GetOneResponse<TData>> => {\n const { resource, id, meta } = params;\n const taruviMeta = meta as TaruviMeta | undefined;\n const tableName = getTableName(resource, taruviMeta);\n\n if (isGraphQuery(taruviMeta)) {\n const response = await buildGraphQuery<TData>(client, tableName, taruviMeta, String(id)).execute() as any;\n const data = Array.isArray(response) ? response[0] as TData : response?.data?.[0] ?? response as TData;\n return { data };\n }\n\n let query = new Database(client).from(tableName).get(String(id));\n query = applyPopulate(query, taruviMeta);\n const response = await query.execute() as { data: TData };\n return { data: response.data };\n },\n\n getMany: async <TData extends BaseRecord = BaseRecord>(\n params: GetManyParams\n ): Promise<GetManyResponse<TData>> => {\n const { resource, ids, meta } = params;\n const taruviMeta = meta as TaruviMeta | undefined;\n const tableName = getTableName(resource, taruviMeta);\n\n if (isGraphQuery(taruviMeta)) {\n const data = await Promise.all(\n ids.map(async id => {\n const response = await buildGraphQuery<TData>(client, tableName, taruviMeta, String(id)).execute() as any;\n return Array.isArray(response) ? response[0] as TData : response?.data?.[0] ?? response as TData;\n })\n );\n return { data };\n }\n\n const idColumn = getIdColumn(taruviMeta);\n let query = new Database(client).from(tableName);\n query = query.filter(idColumn, \"in\", ids.map(String));\n query = applyPopulate(query, taruviMeta);\n const response = await query.execute() as unknown as TaruviListResponse<TData>;\n return { data: response.data };\n },\n\n create: async <TData extends BaseRecord = BaseRecord, TVariables = {}>(\n params: CreateParams<TVariables>\n ): Promise<CreateResponse<TData>> => {\n const { resource, variables, meta } = params;\n const taruviMeta = meta as TaruviMeta | undefined;\n const tableName = getTableName(resource, taruviMeta);\n\n if (isGraphQuery(taruviMeta)) {\n const response = await new Database(client)\n .from(tableName)\n .edges()\n .create(variables as EdgeRequest[])\n .execute() as { data: TData };\n return { data: response.data };\n }\n\n const db = new Database(client).from(tableName);\n const query = taruviMeta?.upsert\n ? db.upsert(variables as object)\n : db.create(variables as object);\n const response = await query.execute() as { data: TData };\n return { data: response.data };\n },\n\n createMany: async <TData extends BaseRecord = BaseRecord, TVariables = {}>(\n params: CreateManyParams<TVariables>\n ): Promise<CreateManyResponse<TData>> => {\n const { resource, variables, meta } = params;\n const taruviMeta = meta as TaruviMeta | undefined;\n const tableName = getTableName(resource, taruviMeta);\n\n const data = await Promise.all(\n variables.map(async (vars) => {\n const response = await new Database(client)\n .from(tableName)\n .create(vars as object)\n .execute() as { data: TData };\n return response.data;\n })\n );\n\n return { data };\n },\n\n update: async <TData extends BaseRecord = BaseRecord, TVariables = {}>(\n params: UpdateParams<TVariables>\n ): Promise<UpdateResponse<TData>> => {\n const { resource, id, variables, meta } = params;\n const taruviMeta = meta as TaruviMeta | undefined;\n const tableName = getTableName(resource, taruviMeta);\n\n if (isGraphQuery(taruviMeta)) {\n const response = await new Database(client)\n .from(tableName)\n .edges()\n .get(String(id))\n .update(variables as EdgeRequest)\n .execute() as { data: TData };\n return { data: response.data };\n }\n\n const response = await new Database(client)\n .from(tableName)\n .get(String(id))\n .update(variables as object)\n .execute() as { data: TData };\n return { data: response.data };\n },\n\n updateMany: async <TData extends BaseRecord = BaseRecord, TVariables = {}>(\n params: UpdateManyParams<TVariables>\n ): Promise<UpdateManyResponse<TData>> => {\n const { resource, ids, variables, meta } = params;\n const taruviMeta = meta as TaruviMeta | undefined;\n const tableName = getTableName(resource, taruviMeta);\n const idColumn = getIdColumn(taruviMeta);\n\n const body = ids.map(id => ({ [idColumn]: id, ...(variables as object) }));\n const response = await new Database(client)\n .from(tableName)\n .bulkUpdate(body)\n .execute() as { data: TData[] };\n return { data: response.data };\n },\n\n deleteOne: async <TData extends BaseRecord = BaseRecord, TVariables = {}>(\n params: DeleteOneParams<TVariables>\n ): Promise<DeleteOneResponse<TData>> => {\n const { resource, id, meta } = params;\n const taruviMeta = meta as TaruviMeta | undefined;\n const tableName = getTableName(resource, taruviMeta);\n\n if (isGraphQuery(taruviMeta)) {\n const response = await new Database(client)\n .from(tableName)\n .edges()\n .delete([Number(id)])\n .execute() as { data: TData };\n return { data: response.data };\n }\n\n await new Database(client)\n .from(tableName)\n .delete(String(id))\n .execute();\n return { data: { id } as unknown as TData };\n },\n\n deleteMany: async <TData extends BaseRecord = BaseRecord, TVariables = {}>(\n params: DeleteManyParams<TVariables>\n ): Promise<DeleteManyResponse<TData>> => {\n const { resource, ids, meta } = params;\n const taruviMeta = meta as TaruviMeta | undefined;\n const tableName = getTableName(resource, taruviMeta);\n\n if (isGraphQuery(taruviMeta)) {\n const response = await new Database(client)\n .from(tableName)\n .edges()\n .delete(ids.map(Number))\n .execute() as { data: TData };\n return { data: [response.data] };\n }\n\n if (taruviMeta?.deleteByFilter && taruviMeta?.filters) {\n let query = new Database(client).from(tableName);\n query = applyFilters(query, taruviMeta.filters as CrudFilter[]);\n await query.deleteFiltered().execute();\n return { data: ids.map(id => ({ id } as unknown as TData)) };\n }\n\n await new Database(client)\n .from(tableName)\n .bulkDelete(ids.map(String))\n .execute();\n return { data: ids.map(id => ({ id } as unknown as TData)) };\n },\n\n custom: async <TData extends BaseRecord = BaseRecord>(\n params: CustomParams\n ): Promise<CustomResponse<TData>> => {\n const { url, method, payload, query } = params;\n let endpoint = `api/apps/${config.appSlug}/datatables/${url}`;\n\n let data: TData;\n switch (method.toLowerCase()) {\n case 'get': {\n if (query && Object.keys(query).length > 0) {\n const queryString = new URLSearchParams(query as Record<string, string>).toString();\n endpoint = `${endpoint}${endpoint.includes('?') ? '&' : '?'}${queryString}`;\n }\n data = await client.httpClient.get(endpoint) as TData;\n break;\n }\n case 'post':\n data = await client.httpClient.post(endpoint, payload) as TData;\n break;\n case 'put':\n data = await client.httpClient.put(endpoint, payload) as TData;\n break;\n case 'patch':\n data = await client.httpClient.patch(endpoint, payload) as TData;\n break;\n case 'delete':\n data = await client.httpClient.delete(endpoint) as TData;\n break;\n default:\n throw new Error(`Unsupported HTTP method: ${method}`);\n }\n\n return { data };\n },\n\n getApiUrl: () => baseApiUrl,\n };\n}\n","import type {\n DataProvider,\n BaseRecord,\n GetListParams,\n GetListResponse,\n GetOneParams,\n GetOneResponse,\n GetManyResponse,\n CreateParams,\n CreateResponse,\n UpdateParams,\n UpdateResponse,\n DeleteOneParams,\n DeleteOneResponse,\n DeleteManyParams,\n DeleteManyResponse,\n CustomParams,\n CustomResponse,\n} from \"@refinedev/core\";\nimport { Client, Storage } from \"@taruvi/sdk\";\nimport type { StorageFilters, StorageUploadBatchResponse } from \"@taruvi/sdk\";\nimport type { TaruviListResponse, TaruviMeta } from \"./types.js\";\nimport { convertRefineFilters, convertRefineSorters, convertRefinePagination } from \"./utils.js\";\n\n/**\n * Storage upload variables interface.\n */\nexport interface StorageUploadVariables {\n files: File[];\n paths?: string[];\n metadatas?: Record<string, unknown>[];\n}\n\n/**\n * Creates a Refine DataProvider for Taruvi file storage operations.\n */\nexport function storageDataProvider(client: Client): DataProvider {\n const config = client.getConfig();\n const baseApiUrl = `${config.apiUrl}/api/apps/${config.appSlug}`;\n\n const getBucketName = (resource: string, meta?: TaruviMeta) => meta?.bucketName ?? resource;\n\n const buildFilters = (params: {\n filters?: GetListParams[\"filters\"];\n sorters?: GetListParams[\"sorters\"];\n pagination?: GetListParams[\"pagination\"];\n meta?: TaruviMeta;\n }): StorageFilters => {\n const filters: StorageFilters = {\n ...convertRefineFilters(params.filters) as StorageFilters,\n ...convertRefinePagination(params.pagination),\n };\n\n const ordering = convertRefineSorters(params.sorters);\n if (ordering) filters.ordering = ordering;\n\n return filters;\n };\n\n return {\n getList: async <TData extends BaseRecord = BaseRecord>(\n params: GetListParams\n ): Promise<GetListResponse<TData>> => {\n const { resource, pagination, filters, sorters, meta } = params;\n const taruviMeta = meta as TaruviMeta | undefined;\n const bucket = getBucketName(resource, taruviMeta);\n const storageFilters = buildFilters({ filters, sorters, pagination, meta: taruviMeta });\n\n const response = await new Storage(client)\n .from(bucket)\n .filter(storageFilters)\n .execute() as TaruviListResponse<TData>;\n\n return { data: response.data, total: response.total };\n },\n\n getOne: async <TData extends BaseRecord = BaseRecord>(\n params: GetOneParams\n ): Promise<GetOneResponse<TData>> => {\n const { resource, id: path, meta } = params;\n const taruviMeta = meta as TaruviMeta | undefined;\n const bucket = getBucketName(resource, taruviMeta);\n\n if (taruviMeta?.metadata) {\n const response = await new Storage(client)\n .from(bucket)\n .metadata(String(path))\n .execute() as { data: TData };\n return { data: response.data };\n }\n\n const blob = await new Storage(client)\n .from(bucket)\n .download(String(path))\n .execute<Blob>();\n return { data: blob as unknown as TData };\n },\n\n create: async <TData extends BaseRecord = BaseRecord, TVariables = {}>(\n params: CreateParams<TVariables>\n ): Promise<CreateResponse<TData>> => {\n const { resource, variables, meta } = params;\n const taruviMeta = meta as TaruviMeta | undefined;\n const bucket = getBucketName(resource, taruviMeta);\n const { files, paths = [], metadatas = [] } = variables as unknown as StorageUploadVariables;\n\n const filePaths = files.map((file, i) => paths[i] || file.name);\n const fileMetadatas = files.map((_, i) => metadatas[i] || {});\n\n const response = await new Storage(client)\n .from(bucket)\n .upload({ files, paths: filePaths, metadatas: fileMetadatas })\n .execute() as StorageUploadBatchResponse;\n\n // Extract the first uploaded file object from the batch response\n const firstUploaded = response.data?.successful?.[0]?.object;\n return { data: (firstUploaded ?? response.data) as unknown as TData };\n },\n\n update: async <TData extends BaseRecord = BaseRecord, TVariables = {}>(\n params: UpdateParams<TVariables>\n ): Promise<UpdateResponse<TData>> => {\n const { resource, id: path, variables, meta } = params;\n const taruviMeta = meta as TaruviMeta | undefined;\n const bucket = getBucketName(resource, taruviMeta);\n\n const response = await new Storage(client)\n .from(bucket)\n .update(String(path), variables as object)\n .execute() as { data: TData };\n\n return { data: response.data };\n },\n\n deleteOne: async <TData extends BaseRecord = BaseRecord, TVariables = {}>(\n params: DeleteOneParams<TVariables>\n ): Promise<DeleteOneResponse<TData>> => {\n const { resource, id: path, meta } = params;\n const taruviMeta = meta as TaruviMeta | undefined;\n const bucket = getBucketName(resource, taruviMeta);\n\n await new Storage(client)\n .from(bucket)\n .delete([String(path)])\n .execute();\n\n return { data: { id: path } as unknown as TData };\n },\n\n getApiUrl: () => baseApiUrl,\n\n getMany: async <TData extends BaseRecord = BaseRecord>(): Promise<GetManyResponse<TData>> => ({ data: [] }),\n\n createMany: async <TData extends BaseRecord = BaseRecord, TVariables = {}>(\n params: CreateParams<TVariables>\n ): Promise<CreateResponse<TData>> => {\n const { resource, variables, meta } = params;\n const taruviMeta = meta as TaruviMeta | undefined;\n const bucket = getBucketName(resource, taruviMeta);\n const { files, paths = [], metadatas = [] } = variables as unknown as StorageUploadVariables;\n\n const filePaths = files.map((file, i) => paths[i] || file.name);\n const fileMetadatas = files.map((_, i) => metadatas[i] || {});\n\n const response = await new Storage(client)\n .from(bucket)\n .upload({ files, paths: filePaths, metadatas: fileMetadatas })\n .execute() as StorageUploadBatchResponse;\n\n // Extract all uploaded file objects from the batch response\n const uploaded = response.data?.successful?.map(s => s.object) ?? [];\n return { data: (uploaded.length > 0 ? uploaded[0] : response.data) as unknown as TData };\n },\n\n deleteMany: async <TData extends BaseRecord = BaseRecord, TVariables = {}>(\n params: DeleteManyParams<TVariables>\n ): Promise<DeleteManyResponse<TData>> => {\n const { resource, ids, meta } = params;\n const taruviMeta = meta as TaruviMeta | undefined;\n const bucket = getBucketName(resource, taruviMeta);\n\n await new Storage(client)\n .from(bucket)\n .delete(ids.map(String))\n .execute();\n\n return { data: ids.map(id => ({ id } as unknown as TData)) };\n },\n\n custom: async <TData extends BaseRecord = BaseRecord>(\n params: CustomParams\n ): Promise<CustomResponse<TData>> => {\n const { url, method, payload, query } = params;\n let fullUrl = `api/apps/${config.appSlug}/storage/buckets/${url}`;\n\n let data: TData;\n switch (method.toLowerCase()) {\n case 'get': {\n if (query && Object.keys(query).length > 0) {\n const queryString = new URLSearchParams(query as Record<string, string>).toString();\n fullUrl = `${fullUrl}${fullUrl.includes('?') ? '&' : '?'}${queryString}`;\n }\n data = await client.httpClient.get(fullUrl) as TData;\n break;\n }\n case 'post':\n data = await client.httpClient.post(fullUrl, payload) as TData;\n break;\n case 'put':\n data = await client.httpClient.put(fullUrl, payload) as TData;\n break;\n case 'patch':\n data = await client.httpClient.patch(fullUrl, payload) as TData;\n break;\n case 'delete':\n data = await client.httpClient.delete(fullUrl) as TData;\n break;\n default:\n throw new Error(`Unsupported HTTP method: ${method}`);\n }\n\n return { data };\n },\n\n // Not applicable for file storage - files are replaced, not updated\n updateMany: undefined,\n };\n}\n","import type {\n DataProvider,\n BaseRecord,\n GetListParams,\n GetListResponse,\n GetOneParams,\n GetOneResponse,\n CustomParams,\n CustomResponse,\n} from \"@refinedev/core\";\nimport { Client, App, Functions, Analytics, Secrets } from \"@taruvi/sdk\";\nimport type { RoleData } from \"@taruvi/sdk\";\n\n/**\n * Response type for roles list from the App service.\n */\ninterface RolesListResponse {\n data: RoleData[];\n total: number;\n}\n\n/**\n * Meta options for function execution via custom().\n */\nexport interface FunctionMeta {\n kind: \"function\";\n /** Whether to execute the function asynchronously */\n async?: boolean;\n}\n\n/**\n * Meta options for analytics query execution via custom().\n */\nexport interface AnalyticsMeta {\n kind: \"analytics\";\n}\n\nexport type AppCustomMeta = FunctionMeta | AnalyticsMeta;\n\n/**\n * Creates a Refine DataProvider for Taruvi App operations.\n *\n * Supported operations:\n * - getList(\"roles\"): Fetch app roles\n * - getList(\"secrets\"): Fetch secrets by keys (requires meta.keys)\n * - getOne(\"settings\"): Fetch app settings\n * - getOne(\"secrets\"): Fetch a single secret by key (id = secret key)\n * - custom(): Execute edge functions or analytics queries via meta.kind\n */\nexport function appDataProvider(client: Client): DataProvider {\n const config = client.getConfig();\n const baseApiUrl = `${config.apiUrl}/api/apps/${config.appSlug}`;\n const functions = new Functions(client);\n const analytics = new Analytics(client);\n\n return {\n getList: async <TData extends BaseRecord = BaseRecord>(\n params: GetListParams\n ): Promise<GetListResponse<TData>> => {\n const { resource, meta } = params;\n\n if (resource === \"roles\") {\n const app = new App(client);\n const response = await app.roles().execute() as RolesListResponse;\n\n return {\n data: (response.data || response) as unknown as TData[],\n total: response.total ?? (Array.isArray(response) ? response.length : response.data?.length ?? 0),\n };\n }\n\n if (resource === \"secrets\") {\n const keys = meta?.keys as string[] | undefined;\n if (!keys || keys.length === 0) {\n throw new Error('secrets resource requires meta.keys array');\n }\n const secrets = new Secrets(client);\n const response = await secrets.list(keys, {\n app: meta?.app as string | undefined,\n includeMetadata: meta?.includeMetadata as boolean | undefined,\n }) as any;\n const raw = response.data || response;\n const data: TData[] = Array.isArray(raw)\n ? raw\n : Object.entries(raw).map(([key, value]) => ({ key, value }) as unknown as TData);\n return { data, total: data.length };\n }\n\n throw new Error(`Unknown app resource: ${resource}. Supported resources: roles, secrets`);\n },\n\n getOne: async <TData extends BaseRecord = BaseRecord>(\n params: GetOneParams\n ): Promise<GetOneResponse<TData>> => {\n const { resource, id, meta } = params;\n\n if (resource === \"settings\") {\n const app = new App(client);\n const response = await app.settings().execute() as { data: TData };\n\n return {\n data: response.data,\n };\n }\n\n if (resource === \"secrets\") {\n const secrets = new Secrets(client);\n const response = await secrets.get(String(id), {\n app: meta?.app as string | undefined,\n tags: meta?.tags as string[] | undefined,\n }).execute() as any;\n return { data: (response.data ?? response) as TData };\n }\n\n throw new Error(`Unknown app resource for getOne: ${resource}. Supported resources: settings, secrets`);\n },\n\n custom: async <TData extends BaseRecord = BaseRecord>(\n params: CustomParams\n ): Promise<CustomResponse<TData>> => {\n const { url: slug, payload, meta } = params;\n const customMeta = meta as AppCustomMeta | undefined;\n\n if (customMeta?.kind === \"function\") {\n const response = await functions.execute<TData>(slug, {\n async: customMeta.async ?? false,\n params: (payload ?? {}) as Record<string, unknown>,\n });\n return { data: response.data as TData };\n }\n\n if (customMeta?.kind === \"analytics\") {\n const response = await analytics.execute<TData>(slug, {\n params: (payload ?? {}) as Record<string, unknown>,\n });\n return { data: response.data as TData };\n }\n\n throw new Error(\n 'Specify meta.kind as \"function\" or \"analytics\" for custom operations on the app provider.'\n );\n },\n\n getApiUrl: () => baseApiUrl,\n\n getMany: async () => { throw new Error(\"getMany is not supported for app resources\"); },\n create: async () => { throw new Error(\"create is not supported for app resources. Use useCustom with meta.kind\"); },\n createMany: async () => { throw new Error(\"createMany is not supported for app resources\"); },\n update: async () => { throw new Error(\"update is not supported for app resources\"); },\n updateMany: async () => { throw new Error(\"updateMany is not supported for app resources\"); },\n deleteOne: async () => { throw new Error(\"deleteOne is not supported for app resources\"); },\n deleteMany: async () => { throw new Error(\"deleteMany is not supported for app resources\"); },\n };\n}\n","import type {\n DataProvider,\n BaseRecord,\n GetListParams,\n GetListResponse,\n GetOneParams,\n GetOneResponse,\n CreateParams,\n CreateResponse,\n UpdateParams,\n UpdateResponse,\n DeleteOneParams,\n DeleteOneResponse,\n CrudFilter,\n CrudSort,\n Pagination,\n} from \"@refinedev/core\";\nimport { Client, User, Auth } from \"@taruvi/sdk\";\nimport type { UserData, UserCreateRequest, UserUpdateRequest } from \"@taruvi/sdk\";\n\n/**\n * Response type for users list from the User service.\n */\ninterface UsersListResponse {\n data: UserData[];\n total: number;\n}\n\n/**\n * Filter parameters for listing users.\n */\ninterface UserListFilters {\n search?: string;\n is_active?: boolean;\n is_staff?: boolean;\n is_superuser?: boolean;\n is_deleted?: boolean;\n ordering?: string;\n page?: number;\n page_size?: number;\n}\n\n/**\n * Builds UserListFilters from Refine's filters, sorters, and pagination.\n */\nfunction buildUserListFilters(\n filters?: CrudFilter[],\n sorters?: CrudSort[],\n pagination?: Pagination\n): UserListFilters {\n const result: UserListFilters = {};\n\n // Apply pagination\n if (pagination && pagination.mode !== \"off\") {\n if (pagination.currentPage) {\n result.page = pagination.currentPage;\n }\n if (pagination.pageSize) {\n result.page_size = pagination.pageSize;\n }\n }\n\n // Apply filters\n if (filters) {\n for (const filter of filters) {\n if (\"field\" in filter) {\n const field = filter.field as string;\n const value = filter.value;\n\n switch (field) {\n case \"search\":\n result.search = String(value);\n break;\n case \"is_active\":\n result.is_active = Boolean(value);\n break;\n case \"is_staff\":\n result.is_staff = Boolean(value);\n break;\n case \"is_superuser\":\n result.is_superuser = Boolean(value);\n break;\n case \"is_deleted\":\n result.is_deleted = Boolean(value);\n break;\n }\n }\n }\n }\n\n // Apply sorting (first sorter only, as API accepts single ordering)\n if (sorters && sorters.length > 0) {\n const sorter = sorters[0];\n result.ordering = sorter.order === \"desc\" ? `-${sorter.field}` : sorter.field;\n }\n\n return result;\n}\n\n/**\n * Creates a Refine DataProvider for Taruvi User operations.\n *\n * This provider is specialized for fetching user-level data.\n *\n * Supported resources:\n * - \"users\" (getList): Fetch list of users with filtering/pagination\n * - \"users\" (getOne): Fetch a specific user by username/id\n * - \"roles\" (getList): Fetch roles for a specific user (requires meta.username)\n *\n * @example\n * ```typescript\n * // Get list of users\n * const { data } = useList({\n * dataProviderName: \"user\",\n * resource: \"users\",\n * pagination: { currentPage: 1, pageSize: 10 },\n * filters: [\n * { field: \"is_active\", operator: \"eq\", value: true },\n * { field: \"search\", operator: \"eq\", value: \"john\" },\n * ],\n * sorters: [{ field: \"username\", order: \"asc\" }],\n * });\n *\n * // Get a specific user by username\n * const { data } = useOne({\n * dataProviderName: \"user\",\n * resource: \"users\",\n * id: \"john_doe\",\n * });\n *\n * // Get roles for a specific user\n * const { data } = useList({\n * dataProviderName: \"user\",\n * resource: \"roles\",\n * meta: { username: \"john_doe\" },\n * });\n * ```\n */\nexport function userDataProvider(client: Client): DataProvider {\n const config = client.getConfig();\n const baseApiUrl = `${config.apiUrl}/api/apps/${config.appSlug}`;\n\n return {\n getList: async <TData extends BaseRecord = BaseRecord>(\n params: GetListParams\n ): Promise<GetListResponse<TData>> => {\n const { resource, pagination, filters, sorters, meta } = params;\n\n if (resource === \"users\") {\n const user = new User(client);\n const userFilters = buildUserListFilters(filters, sorters, pagination);\n const response = await user.list(userFilters as Parameters<typeof user.list>[0]) as UsersListResponse;\n\n return {\n data: (response.data || response) as unknown as TData[],\n total: response.total,\n };\n }\n\n if (resource === \"roles\") {\n // Get roles for a specific user - requires meta.username\n const username = meta?.username as string;\n if (!username) {\n throw new Error(\"roles resource requires meta.username\");\n }\n const user = new User(client);\n const response = await user.getUser(username) as any;\n const roles = response.data?.roles || response.roles || [];\n\n return {\n data: roles as unknown as TData[],\n total: roles.length,\n };\n }\n\n if (resource === \"apps\") {\n const username = meta?.username as string;\n if (!username) {\n throw new Error(\"apps resource requires meta.username\");\n }\n const user = new User(client);\n const response = await user.getUserApps(username) as any;\n const apps = response.data || response;\n return {\n data: apps as TData[],\n total: Array.isArray(apps) ? apps.length : 0,\n };\n }\n\n throw new Error(`Unknown user resource for getList: ${resource}. Supported: users, roles, apps`);\n },\n\n getOne: async <TData extends BaseRecord = BaseRecord>(\n params: GetOneParams\n ): Promise<GetOneResponse<TData>> => {\n const { resource, id } = params;\n\n if (resource === \"users\") {\n const user = new User(client)\n\n // Support \"me\" as a special ID to get current user via Auth\n if (String(id) === \"me\") {\n const auth = new Auth(client);\n const response = await auth.getCurrentUser();\n const data = response ? ((response as any).data ?? response) : null;\n return { data: data as unknown as TData };\n }\n\n const response = await user.getUser(String(id));\n\n return {\n data: response.data as unknown as TData,\n };\n }\n\n throw new Error(`Unknown user resource for getOne: ${resource}. Supported: users`);\n },\n\n getApiUrl: () => baseApiUrl,\n\n create: async <TData extends BaseRecord = BaseRecord, TVariables = {}>(\n params: CreateParams<TVariables>\n ): Promise<CreateResponse<TData>> => {\n const { resource, variables } = params;\n\n if (resource === \"users\") {\n const user = new User(client);\n const userData = variables as unknown as UserCreateRequest;\n const response = await user.createUser(userData);\n\n return {\n data: response.data as unknown as TData,\n };\n }\n\n throw new Error(`Unknown user resource for create: ${resource}. Supported resources: users`);\n },\n\n update: async <TData extends BaseRecord = BaseRecord, TVariables = {}>(\n params: UpdateParams<TVariables>\n ): Promise<UpdateResponse<TData>> => {\n const { resource, id, variables } = params;\n\n if (resource === \"users\") {\n const user = new User(client);\n const username = String(id);\n const updateData = variables as unknown as UserUpdateRequest;\n const response = await user.updateUser(username, updateData);\n\n return {\n data: response.data as unknown as TData,\n };\n }\n\n throw new Error(`Unknown user resource for update: ${resource}. Supported resources: users`);\n },\n\n deleteOne: async <TData extends BaseRecord = BaseRecord, TVariables = {}>(\n params: DeleteOneParams<TVariables>\n ): Promise<DeleteOneResponse<TData>> => {\n const { resource, id } = params;\n\n if (resource === \"users\") {\n const user = new User(client);\n const username = String(id);\n await user.deleteUser(username);\n\n return {\n data: {} as TData,\n };\n }\n\n throw new Error(`Unknown user resource for delete: ${resource}. Supported resources: users`);\n },\n\n // User resources - other operations not supported\n getMany: async () => { throw new Error(\"getMany is not supported for user resources\"); },\n createMany: async () => { throw new Error(\"createMany is not supported for user resources\"); },\n updateMany: async () => { throw new Error(\"updateMany is not supported for user resources\"); },\n deleteMany: async () => { throw new Error(\"deleteMany is not supported for user resources\"); },\n custom: async () => { throw new Error(\"custom is not supported for user resources\"); },\n };\n}\n","import type {\n DataProvider,\n BaseRecord,\n CreateParams,\n CreateResponse,\n} from \"@refinedev/core\";\nimport { Client, Functions } from \"@taruvi/sdk\";\n\n/**\n * Extended meta options for function execution.\n */\nexport interface FunctionMeta {\n /** Whether to execute the function asynchronously */\n async?: boolean;\n}\n\n/** @deprecated Use `appDataProvider` with `useCustom` and `meta.kind: \"function\"` instead. */\nexport function functionsDataProvider(client: Client): DataProvider {\n const config = client.getConfig();\n const baseApiUrl = `${config.apiUrl}/api/apps/${config.appSlug}`;\n const functions = new Functions(client);\n\n return {\n /**\n * Execute an edge function.\n *\n * @param resource - The function slug to execute\n * @param variables - Parameters to pass to the function\n * @param meta.async - Whether to execute asynchronously (default: false)\n */\n create: async <TData extends BaseRecord = BaseRecord, TVariables = {}>({\n resource,\n variables,\n meta,\n }: CreateParams<TVariables>): Promise<CreateResponse<TData>> => {\n const functionMeta = meta as FunctionMeta | undefined;\n\n const response = await functions.execute<TData>(resource, {\n async: functionMeta?.async ?? false,\n params: variables as Record<string, unknown>,\n });\n\n return { data: response.data as TData };\n },\n\n getApiUrl: () => baseApiUrl,\n\n // Edge functions don't support custom method - use create() instead\n custom: async () => {\n throw new Error(\n \"custom is not supported for edge functions. Use useCreate to execute functions.\"\n );\n },\n\n // Edge functions don't support other CRUD operations\n getList: async () => {\n throw new Error(\n \"getList is not supported for edge functions. Use useCreate to execute functions.\"\n );\n },\n getOne: async () => {\n throw new Error(\n \"getOne is not supported for edge functions. Use useCreate to execute functions.\"\n );\n },\n getMany: async () => {\n throw new Error(\n \"getMany is not supported for edge functions. Use useCreate to execute functions.\"\n );\n },\n createMany: async () => {\n throw new Error(\n \"createMany is not supported for edge functions. Use useCreate to execute functions.\"\n );\n },\n update: async () => {\n throw new Error(\n \"update is not supported for edge functions. Use useCreate to execute functions.\"\n );\n },\n updateMany: async () => {\n throw new Error(\n \"updateMany is not supported for edge functions. Use useCreate to execute functions.\"\n );\n },\n deleteOne: async () => {\n throw new Error(\n \"deleteOne is not supported for edge functions. Use useCreate to execute functions.\"\n );\n },\n deleteMany: async () => {\n throw new Error(\n \"deleteMany is not supported for edge functions. Use useCreate to execute functions.\"\n );\n },\n };\n}","import type {\n DataProvider,\n BaseRecord,\n CreateParams,\n CreateResponse,\n} from \"@refinedev/core\";\nimport { Client, Analytics } from \"@taruvi/sdk\";\n\n/**\n * Extended meta options for analytics query execution.\n */\nexport interface AnalyticsMeta {\n /** Additional parameters to pass to the analytics query */\n params?: Record<string, unknown>;\n}\n\n/** @deprecated Use `appDataProvider` with `useCustom` and `meta.kind: \"analytics\"` instead. */\nexport function analyticsDataProvider(client: Client): DataProvider {\n const config = client.getConfig();\n const baseApiUrl = `${config.apiUrl}/api/apps/${config.appSlug}`;\n const analytics = new Analytics(client);\n\n return {\n /**\n * Execute an analytics query.\n *\n * @param resource - The query slug to execute\n * @param variables - Parameters to pass to the query\n */\n create: async <TData extends BaseRecord = BaseRecord, TVariables = {}>({\n resource,\n variables,\n }: CreateParams<TVariables>): Promise<CreateResponse<TData>> => {\n const response = await analytics.execute<TData>(resource, {\n params: variables as Record<string, unknown>,\n });\n\n return { data: response.data as TData };\n },\n\n getApiUrl: () => baseApiUrl,\n\n // Analytics don't support custom method - use create() instead\n custom: async () => {\n throw new Error(\n \"custom is not supported for analytics. Use useCreate to execute queries.\"\n );\n },\n\n // Analytics queries don't support other CRUD operations\n getList: async () => {\n throw new Error(\n \"getList is not supported for analytics. Use useCreate to execute queries.\"\n );\n },\n getOne: async () => {\n throw new Error(\n \"getOne is not supported for analytics. Use useCreate to execute queries.\"\n );\n },\n getMany: async () => {\n throw new Error(\n \"getMany is not supported for analytics. Use useCreate to execute queries.\"\n );\n },\n createMany: async () => {\n throw new Error(\n \"createMany is not supported for analytics. Use useCreate to execute queries.\"\n );\n },\n update: async () => {\n throw new Error(\n \"update is not supported for analytics. Use useCreate to execute queries.\"\n );\n },\n updateMany: async () => {\n throw new Error(\n \"updateMany is not supported for analytics. Use useCreate to execute queries.\"\n );\n },\n deleteOne: async () => {\n throw new Error(\n \"deleteOne is not supported for analytics. Use useCreate to execute queries.\"\n );\n },\n deleteMany: async () => {\n throw new Error(\n \"deleteMany is not supported for analytics. Use useCreate to execute queries.\"\n );\n },\n };\n}","import type { AuthProvider } from \"@refinedev/core\";\nimport { Client, Auth } from \"@taruvi/sdk\";\n\n/**\n * Login params - supports both redirect flow and credentials flow\n */\nexport interface LoginParams {\n /** For redirect-based login - URL to redirect after successful login */\n callbackUrl?: string;\n /** For credentials-based login (if supported) */\n username?: string;\n password?: string;\n /** Whether to use redirect flow (default: true) */\n redirect?: boolean;\n}\n\n/**\n * Logout params\n */\nexport interface LogoutParams {\n /** URL to redirect after logout */\n callbackUrl?: string;\n}\n\n/**\n * Register/Signup params\n */\nexport interface RegisterParams {\n /** URL to redirect after successful signup */\n callbackUrl?: string;\n}\n\n/**\n * Creates a Refine AuthProvider for Taruvi authentication.\n *\n * Supports redirect-based authentication flow (Web UI Flow):\n * 1. User calls login() → Redirects to backend /accounts/login/\n * 2. User authenticates on backend\n * 3. Backend redirects back with tokens in URL hash\n * 4. Client extracts and stores tokens automatically\n */\nexport function authProvider(client: Client): AuthProvider {\n const auth = new Auth(client);\n\n return {\n login: async (params: LoginParams = {}) => {\n const { callbackUrl, redirect = true } = params;\n\n // Check if already authenticated first (prevents infinite redirect loop)\n\n // TODO: check if this is necessary\n if (auth.isUserAuthenticated()) {\n return {\n success: true,\n redirectTo: callbackUrl || \"/\",\n };\n }\n\n if (redirect) {\n // Redirect-based login flow\n auth.login(callbackUrl);\n\n // Return success since we're redirecting\n // The actual auth state will be checked after redirect\n return {\n success: true,\n };\n }\n\n return {\n success: false,\n error: {\n name: \"LoginError\",\n message: \"Login failed. Please try again.\",\n },\n };\n },\n\n logout: async (params: LogoutParams = {}) => {\n const { callbackUrl } = params;\n\n await auth.logout(callbackUrl);\n\n return {\n success: true,\n redirectTo: callbackUrl || \"/login\",\n };\n },\n\n check: async () => {\n if (auth.isUserAuthenticated()) {\n return { authenticated: true };\n }\n\n return {\n authenticated: false,\n redirectTo: \"/login\",\n };\n },\n\n onError: async (error) => {\n const status = error?.statusCode || error?.status || error?.response?.status;\n\n // 401/403 means session is invalid — tokens already cleared by SDK interceptor\n if (status === 401 || status === 403) {\n return {\n logout: true,\n redirectTo: \"/login\",\n error,\n };\n }\n\n return { error };\n },\n\n register: async (params: RegisterParams = {}) => {\n const { callbackUrl } = params;\n\n // Redirect to signup page\n auth.signup(callbackUrl);\n\n return {\n success: true,\n };\n },\n\n getIdentity: async () => {\n const response = await auth.getCurrentUser();\n\n if (!response) {\n return null;\n }\n\n return (response as any).data ?? response;\n },\n\n getPermissions: async () => {\n const response = await auth.getCurrentUser();\n\n if (!response) {\n return null;\n }\n\n const user = (response as any).data ?? response;\n\n if (!user) {\n return null;\n }\n\n // Return permissions from the user data\n return {\n roles: user.roles || [],\n permissions: user.user_permissions || [],\n groups: user.groups || [],\n is_staff: user.is_staff || false,\n is_superuser: user.is_superuser || false,\n };\n },\n };\n}\n","import type { AccessControlProvider } from \"@refinedev/core\";\nimport { Client, Auth, Policy } from \"@taruvi/sdk\";\nimport DataLoader from \"dataloader\";\n\n/**\n * Permission check request for DataLoader batching\n */\ninterface PermissionCheck {\n resource: string;\n action: string;\n params?: Record<string, unknown>;\n entityType?: string;\n}\n\ninterface PermissionResult {\n can: boolean;\n reason?: string;\n}\n\n/**\n * Creates a Refine AccessControlProvider using Cerbos via the Policy client.\n *\n * Uses DataLoader for request batching (multiple useCan calls → single API request)\n * and Refine's built-in TanStack Query for caching.\n *\n * @example\n * ```tsx\n * <Refine\n * authProvider={authProvider(client)}\n * accessControlProvider={accessControlProvider(client)}\n * />\n *\n *\n * ```\n */\nexport function accessControlProvider(\n client: Client,\n options?: { batchDelayMs?: number }\n): AccessControlProvider {\n const policy = new Policy(client);\n const auth = new Auth(client);\n const { batchDelayMs = 50 } = options ?? {};\n\n // DataLoader for batching only - TanStack Query handles caching\n const permissionLoader = new DataLoader<PermissionCheck, PermissionResult>(\n async (checks) => {\n const response = await auth.getCurrentUser();\n const user = response ? ((response as any).data ?? response) : null;\n\n if (!user) {\n return checks.map(() => ({\n can: false,\n reason: \"User not authenticated\",\n }));\n }\n\n // Deduplicate and group by resource:recordId (needed because cache: false)\n const uniqueResources = new Map<string, {\n entityType?: string;\n tableName: string;\n recordId: string;\n attributes: Record<string, unknown>;\n actions: Set<string>;\n }>();\n\n for (const check of checks) {\n const recordId = check.params?.id ? String(check.params.id) : \"*\";\n const key = `${check.resource}:${recordId}`;\n\n if (!uniqueResources.has(key)) {\n uniqueResources.set(key, {\n entityType: check.entityType,\n tableName: check.resource,\n recordId,\n attributes: (check.params || {}) as Record<string, unknown>,\n actions: new Set(),\n });\n }\n uniqueResources.get(key)!.actions.add(check.action);\n }\n\n // Build batch payload for Cerbos\n const batchPayload = Array.from(uniqueResources.values()).map((entry) => ({\n entityType: entry.entityType ?? entry.tableName, // Default to tableName if entityType not specified\n tableName: entry.tableName,\n recordId: entry.recordId,\n attributes: entry.attributes,\n actions: Array.from(entry.actions),\n }));\n\n try {\n // Single SDK call for all permissions\n const result = await policy.checkResource(batchPayload) as {\n results?: Array<{ actions?: Record<string, string> }>;\n };\n\n // Build results lookup\n const resultsByResource = new Map<string, Record<string, string>>();\n result?.results?.forEach((r, index) => {\n const payload = batchPayload[index];\n const key = `${payload.tableName}:${payload.recordId}`;\n resultsByResource.set(key, r.actions || {});\n });\n\n // Map results back to original checks order (DataLoader requirement)\n return checks.map((check) => {\n const recordId = check.params?.id ? String(check.params.id) : \"*\";\n const key = `${check.resource}:${recordId}`;\n const actions = resultsByResource.get(key) || {};\n const allowed = actions[check.action] === \"EFFECT_ALLOW\";\n\n return {\n can: allowed,\n reason: allowed ? undefined : \"Permission denied by policy\",\n };\n });\n } catch (error) {\n console.error(\"Batch permission check failed:\", error);\n return checks.map(() => ({\n can: false,\n reason: error instanceof Error ? error.message : \"Permission check failed\",\n }));\n }\n },\n {\n batchScheduleFn: (callback) => setTimeout(callback, batchDelayMs),\n cache: false, // TanStack Query handles caching\n }\n );\n\n return {\n can: async ({ resource, action, params }) => {\n if (!resource) {\n return { can: false, reason: \"Resource not specified\" };\n }\n\n // Priority: params.entityType (override) > resource.meta.entityType > resource name\n const entityType = (params?.entityType as string | undefined)\n ?? (params?.resource?.meta?.entityType as string | undefined);\n\n return permissionLoader.load({\n resource,\n action,\n params,\n entityType,\n });\n },\n\n options: {\n buttons: {\n enableAccessControl: true,\n hideIfUnauthorized: true,\n },\n queryOptions: {\n staleTime: 5 * 60 * 1000, // 5 minutes\n gcTime: 10 * 60 * 1000, // 10 minutes\n },\n },\n };\n}\n"]}
1
+ {"version":3,"sources":["../package.json","../src/utils.ts","../src/dataProvider.ts","../src/storageDataProvider.ts","../src/appDataProvider.ts","../src/userDataProvider.ts","../src/functionsDataProvider.ts","../src/analyticsDataProvider.ts","../src/authProvider.ts","../src/accessControlProvider.ts"],"names":["response","Functions","Analytics","Auth"],"mappings":"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","file":"index.js","sourcesContent":["{\n \"name\": \"@taruvi/refine-providers\",\n \"version\": \"1.2.7\",\n \"description\": \"Refine.dev data provider for Taruvi Data Service\",\n \"type\": \"module\",\n \"main\": \"./dist/index.cjs\",\n \"module\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\",\n \"exports\": {\n \".\": {\n \"import\": {\n \"types\": \"./dist/index.d.ts\",\n \"default\": \"./dist/index.js\"\n },\n \"require\": {\n \"types\": \"./dist/index.d.cts\",\n \"default\": \"./dist/index.cjs\"\n }\n }\n },\n \"files\": [\n \"dist\",\n \"README.md\"\n ],\n \"scripts\": {\n \"build\": \"tsup\",\n \"dev\": \"tsup --watch\",\n \"test\": \"vitest run\",\n \"typecheck\": \"tsc --noEmit\",\n \"clean\": \"rm -rf dist\"\n },\n \"peerDependencies\": {\n \"@refinedev/core\": \"^5.0.0\"\n },\n \"peerDependenciesMeta\": {\n \"@refinedev/core\": {\n \"optional\": false\n }\n },\n \"devDependencies\": {\n \"@refinedev/core\": \"^5.0.0\",\n \"@types/node\": \"^20.0.0\",\n \"tsup\": \"^8.0.0\",\n \"typescript\": \"^5.7.0\",\n \"vitest\": \"^4.0.18\"\n },\n \"keywords\": [\n \"refine\",\n \"refinedev\",\n \"data-provider\",\n \"taruvi\",\n \"react\",\n \"crud\"\n ],\n \"author\": \"EOX Vantage\",\n \"license\": \"MIT\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/taruvi-io/sdk.git\",\n \"directory\": \"packages/refine\"\n },\n \"homepage\": \"https://github.com/taruvi-io/sdk/tree/main/packages/refine#readme\",\n \"bugs\": {\n \"url\": \"https://github.com/taruvi-io/sdk/issues\"\n },\n \"dependencies\": {\n \"@taruvi/sdk\": \"latest\",\n \"dataloader\": \"^2.2.3\"\n }\n}\n","import type { CrudFilter, CrudSort, Pagination } from \"@refinedev/core\";\nimport type { TaruviMeta } from \"./types.js\";\n\n/**\n * Maps Refine operators to Taruvi DRF-style query parameter suffixes.\n * Example: { field: \"age\", operator: \"gte\", value: 18 } → \"age__gte=18\"\n */\nexport const REFINE_OPERATOR_MAP: Record<string, string> = {\n // Equality\n eq: \"\", // exact match (no suffix)\n ne: \"ne\",\n\n // Comparison\n lt: \"lt\",\n gt: \"gt\",\n lte: \"lte\",\n gte: \"gte\",\n\n // String operations (case-sensitive)\n contains: \"contains\",\n ncontains: \"ncontains\",\n startswith: \"startswith\",\n nstartswith: \"nstartswith\",\n endswith: \"endswith\",\n nendswith: \"nendswith\",\n\n // String operations (case-insensitive)\n containss: \"icontains\",\n ncontainss: \"nicontains\",\n startswiths: \"istartswith\",\n nstartswiths: \"nistartswith\",\n endswiths: \"iendswith\",\n nendswiths: \"niendswith\",\n\n // Array operations\n in: \"in\",\n nin: \"nin\",\n\n // Null checks\n null: \"null\",\n nnull: \"nnull\",\n\n // Range\n between: \"between\",\n nbetween: \"nbetween\",\n};\n\n/**\n * Converts Refine CrudFilter[] to Taruvi query parameters.\n * Handles both simple filters and logical operators (and/or).\n */\nexport function convertRefineFilters(\n filters?: CrudFilter[]\n): Record<string, string> {\n if (!filters || filters.length === 0) return {};\n\n const params: Record<string, string> = {};\n\n for (const filter of filters) {\n // Handle logical operators (and/or groups)\n if (\n \"operator\" in filter &&\n (filter.operator === \"and\" || filter.operator === \"or\")\n ) {\n // Recursively process nested filters\n // Note: Taruvi API treats multiple params as AND by default\n // OR logic would need special handling if supported by API\n if (filter.value && Array.isArray(filter.value)) {\n const nested = convertRefineFilters(filter.value as CrudFilter[]);\n Object.assign(params, nested);\n }\n continue;\n }\n\n // Handle conditional filters (field, operator, value)\n if (\"field\" in filter && filter.field && filter.operator) {\n const { field, operator, value } = filter;\n\n // Skip undefined/null values (except for null operator)\n if (value === undefined || (value === null && operator !== \"null\")) {\n continue;\n }\n\n const suffix = REFINE_OPERATOR_MAP[operator];\n\n if (suffix === undefined) {\n console.warn(`Unknown Refine operator: ${operator}`);\n continue;\n }\n\n // Build parameter key with double underscore for DRF style\n const paramKey = suffix ? `${field}__${suffix}` : String(field);\n\n // Format value based on operator\n if (operator === \"in\" || operator === \"nin\") {\n // Array values: join with comma\n params[paramKey] = Array.isArray(value) ? value.join(\",\") : String(value);\n } else if (operator === \"between\" || operator === \"nbetween\") {\n // Range values: expect [min, max] array\n params[paramKey] = Array.isArray(value) ? value.join(\",\") : String(value);\n } else if (operator === \"null\" || operator === \"nnull\") {\n // Boolean for null checks\n params[paramKey] = \"true\";\n } else {\n params[paramKey] = String(value);\n }\n }\n }\n\n return params;\n}\n\n/**\n * Converts Refine CrudSort[] to Taruvi ordering parameter.\n * Uses DRF convention: \"-field\" for DESC, \"field\" for ASC.\n */\nexport function convertRefineSorters(sorters?: CrudSort[]): string | undefined {\n if (!sorters || sorters.length === 0) return undefined;\n\n return sorters\n .map((sort) => (sort.order === \"desc\" ? `-${sort.field}` : sort.field))\n .join(\",\");\n}\n\n/**\n * Converts Refine Pagination to Taruvi page/page_size parameters.\n */\nexport function convertRefinePagination(\n pagination?: Pagination\n): { page?: number; page_size?: number } {\n if (!pagination) return {};\n\n const { currentPage, pageSize, mode } = pagination;\n\n // Handle \"off\" mode - no pagination\n if (mode === \"off\") return {};\n\n return {\n page: currentPage ?? 1, // Default to page 1 if currentPage is undefined\n page_size: pageSize,\n };\n}\n\n/**\n * Combines all Refine parameters into Taruvi query params.\n */\nexport function buildRefineQueryParams(options: {\n filters?: CrudFilter[];\n sorters?: CrudSort[];\n pagination?: Pagination;\n meta?: TaruviMeta;\n}): Record<string, unknown> {\n const { filters, sorters, pagination, meta } = options;\n\n const params: Record<string, unknown> = {\n ...convertRefineFilters(filters),\n ...convertRefinePagination(pagination),\n };\n\n const ordering = convertRefineSorters(sorters);\n if (ordering) {\n params.ordering = ordering;\n }\n\n // Handle populate from meta\n if (meta?.populate) {\n params.populate = Array.isArray(meta.populate)\n ? meta.populate.join(\",\")\n : meta.populate;\n }\n\n return params;\n}\n\n/**\n * Builds a query string from an object of parameters.\n */\nexport function buildQueryString(params?: Record<string, unknown>): string {\n if (!params || Object.keys(params).length === 0) return \"\";\n\n const searchParams = new URLSearchParams();\n\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined && value !== null) {\n searchParams.append(key, String(value));\n }\n }\n\n const queryString = searchParams.toString();\n return queryString ? `?${queryString}` : \"\";\n}\n\n\n/**\n * Converts aggregate expressions array to _aggregate query parameter.\n * @param aggregates - Array of aggregate expressions like [\"sum(total)\", \"count(*)\"]\n * @returns Comma-separated string or undefined\n */\nexport function formatAggregates(aggregates?: string[]): string | undefined {\n if (!aggregates || aggregates.length === 0) return undefined;\n return aggregates.join(\",\");\n}\n\n/**\n * Converts groupBy fields array to _group_by query parameter.\n * @param groupBy - Array of field names to group by\n * @returns Comma-separated string or undefined\n */\nexport function formatGroupBy(groupBy?: string[]): string | undefined {\n if (!groupBy || groupBy.length === 0) return undefined;\n return groupBy.join(\",\");\n}\n\n/**\n * Converts having filters to _having query parameter.\n * Uses same format as regular filters with DRF-style operators.\n * @param having - Array of CrudFilter for aggregate results\n * @returns Comma-separated filter string or undefined\n */\nexport function formatHaving(having?: CrudFilter[]): string | undefined {\n if (!having || having.length === 0) return undefined;\n\n const params: string[] = [];\n\n for (const filter of having) {\n // Handle conditional filters (field, operator, value)\n if (\"field\" in filter && filter.field && filter.operator) {\n const { field, operator, value } = filter;\n\n // Skip undefined/null values\n if (value === undefined || (value === null && operator !== \"null\")) {\n continue;\n }\n\n const suffix = REFINE_OPERATOR_MAP[operator];\n\n if (suffix === undefined) {\n console.warn(`Unknown operator in having clause: ${operator}`);\n continue;\n }\n\n // Build parameter with DRF-style operator\n const paramKey = suffix ? `${field}__${suffix}` : String(field);\n\n // Format value based on operator\n let paramValue: string;\n if (operator === \"in\" || operator === \"nin\") {\n paramValue = Array.isArray(value) ? value.join(\",\") : String(value);\n } else if (operator === \"between\" || operator === \"nbetween\") {\n paramValue = Array.isArray(value) ? value.join(\",\") : String(value);\n } else if (operator === \"null\" || operator === \"nnull\") {\n paramValue = \"true\";\n } else {\n paramValue = String(value);\n }\n\n params.push(`${paramKey}=${paramValue}`);\n }\n }\n\n return params.length > 0 ? params.join(\",\") : undefined;\n}\n\n/**\n * Handles and transforms Taruvi API errors.\n */\nexport function handleError(error: unknown): never {\n if (error instanceof Error) {\n throw error;\n }\n if (typeof error === \"object\" && error !== null && \"message\" in error) {\n throw new Error(String((error as { message: unknown }).message));\n }\n throw new Error(\"Unknown error occurred\");\n}\n","import type {\n DataProvider,\n BaseRecord,\n GetListParams,\n GetListResponse,\n GetOneParams,\n GetOneResponse,\n GetManyParams,\n GetManyResponse,\n CreateParams,\n CreateResponse,\n CreateManyParams,\n CreateManyResponse,\n UpdateParams,\n UpdateResponse,\n UpdateManyParams,\n UpdateManyResponse,\n DeleteOneParams,\n DeleteOneResponse,\n DeleteManyParams,\n DeleteManyResponse,\n CustomParams,\n CustomResponse,\n CrudFilter,\n CrudSort,\n Pagination,\n} from \"@refinedev/core\";\nimport { Client, Database } from \"@taruvi/sdk\";\nimport type { EdgeRequest } from \"@taruvi/sdk\";\nimport type { TaruviListResponse, TaruviMeta } from \"./types.js\";\nimport pkg from \"../package.json\" with { type: \"json\" };\nimport { REFINE_OPERATOR_MAP, formatHaving } from \"./utils.js\";\n\nfunction applyAggregations<T>(query: Database<T>, meta?: TaruviMeta): Database<T> {\n if (!meta) return query;\n\n let result = query;\n\n if (meta.aggregate?.length) {\n result = result.aggregate(...meta.aggregate);\n }\n\n if (meta.groupBy?.length) {\n result = result.groupBy(...meta.groupBy);\n }\n\n const havingStr = formatHaving(meta.having);\n if (havingStr) {\n result = result.having(havingStr);\n }\n\n return result;\n}\n\n/**\n * Applies Refine filters to a Database query using the shared operator map from utils.\n */\nfunction applyFilters<T>(\n query: Database<T>,\n filters?: CrudFilter[]\n): Database<T> {\n if (!filters || filters.length === 0) return query;\n\n let result = query;\n\n for (const filter of filters) {\n if (\"operator\" in filter && (filter.operator === \"and\" || filter.operator === \"or\")) {\n if (filter.value && Array.isArray(filter.value)) {\n result = applyFilters(result, filter.value as CrudFilter[]);\n }\n continue;\n }\n\n if (\"field\" in filter && filter.field && filter.operator) {\n const { field, operator, value } = filter;\n\n if (value === undefined || (value === null && operator !== \"null\")) continue;\n\n const suffix = REFINE_OPERATOR_MAP[operator];\n if (suffix === undefined) {\n console.warn(`Unknown Refine operator: ${operator}`);\n continue;\n }\n\n // Build the DRF-style param key directly\n const paramKey = suffix ? `${field}__${suffix}` : String(field);\n\n let paramValue: string;\n if (operator === \"in\" || operator === \"nin\" || operator === \"between\" || operator === \"nbetween\") {\n paramValue = Array.isArray(value) ? value.join(\",\") : String(value);\n } else if (operator === \"null\" || operator === \"nnull\") {\n paramValue = \"true\";\n } else {\n paramValue = String(value);\n }\n\n // Use \"eq\" operator so the SDK doesn't add another suffix\n result = result.filter(paramKey, \"eq\", paramValue);\n }\n }\n\n return result;\n}\n\n/**\n * Applies Refine sorters to a Database query.\n */\nfunction applySorters<T>(\n query: Database<T>,\n sorters?: CrudSort[]\n): Database<T> {\n if (!sorters || sorters.length === 0) return query;\n\n let result = query;\n for (const sorter of sorters) {\n result = result.sort(sorter.field, sorter.order === \"desc\" ? \"desc\" : \"asc\");\n }\n return result;\n}\n\n/**\n * Applies Refine pagination to a Database query.\n */\nfunction applyPagination<T>(\n query: Database<T>,\n pagination?: Pagination\n): Database<T> {\n if (!pagination || pagination.mode === \"off\") return query;\n\n let result = query;\n if (pagination.currentPage) result = result.page(pagination.currentPage);\n if (pagination.pageSize) result = result.pageSize(pagination.pageSize);\n return result;\n}\n\n/**\n * Applies populate fields to a Database query.\n */\nfunction applyPopulate<T>(\n query: Database<T>,\n meta?: TaruviMeta\n): Database<T> {\n if (!meta?.populate) return query;\n\n const populateArray = Array.isArray(meta.populate)\n ? meta.populate\n : meta.populate.split(\",\").map(s => s.trim());\n\n return query.populate(populateArray);\n}\n\n/**\n * Checks if the query should use Graph SDK based on meta params.\n */\nfunction isGraphQuery(meta?: TaruviMeta): boolean {\n return !!(meta?.format || meta?.graph_types || meta?.include || meta?.depth);\n}\n\n/**\n * Builds a Graph query with optional params from meta.\n */\nfunction buildGraphQuery<T>(client: Client, tableName: string, meta?: TaruviMeta, recordId?: string): Database<T> {\n let query = new Database(client).from<T>(tableName);\n\n if (recordId) query = query.get(recordId);\n if (meta?.format) query = query.format(meta.format);\n if (meta?.include) query = query.include(meta.include);\n if (meta?.depth) query = query.depth(meta.depth);\n if (meta?.graph_types) query = query.types(meta.graph_types);\n\n return query;\n}\n\n/**\n * Creates a Refine DataProvider for Taruvi database operations.\n */\nexport function dataProvider(client: Client): DataProvider {\n console.log(`Taruvi Refine Provider v${pkg.version} initialized`);\n const config = client.getConfig();\n const baseApiUrl = `${config.apiUrl}/api/apps/${config.appSlug}`;\n\n const getIdColumn = (meta?: TaruviMeta) => meta?.idColumnName ?? \"id\";\n const getTableName = (resource: string, meta?: TaruviMeta) => meta?.tableName ?? resource;\n\n return {\n getList: async <TData extends BaseRecord = BaseRecord>(\n params: GetListParams\n ): Promise<GetListResponse<TData>> => {\n const { resource, pagination, filters, sorters, meta } = params;\n const taruviMeta = meta as TaruviMeta | undefined;\n const tableName = getTableName(resource, taruviMeta);\n\n if (isGraphQuery(taruviMeta)) {\n const response = await buildGraphQuery<TData>(client, tableName, taruviMeta).execute();\n const data = Array.isArray(response) ? response : (response as any)?.data ?? [];\n const total = (response as any)?.total ?? data.length;\n return { data: data as TData[], total };\n }\n\n let query = new Database(client).from(tableName);\n query = applyFilters(query, filters);\n query = applySorters(query, sorters);\n query = applyPagination(query, pagination);\n query = applyPopulate(query, taruviMeta);\n query = applyAggregations(query, taruviMeta);\n\n const response = await query.execute() as unknown as TaruviListResponse<TData>;\n return { data: response.data, total: response.total };\n },\n\n getOne: async <TData extends BaseRecord = BaseRecord>(\n params: GetOneParams\n ): Promise<GetOneResponse<TData>> => {\n const { resource, id, meta } = params;\n const taruviMeta = meta as TaruviMeta | undefined;\n const tableName = getTableName(resource, taruviMeta);\n\n if (isGraphQuery(taruviMeta)) {\n const response = await buildGraphQuery<TData>(client, tableName, taruviMeta, String(id)).execute() as any;\n const data = Array.isArray(response) ? response[0] as TData : response?.data?.[0] ?? response as TData;\n return { data };\n }\n\n let query = new Database(client).from(tableName).get(String(id));\n query = applyPopulate(query, taruviMeta);\n const response = await query.execute() as { data: TData };\n return { data: response.data };\n },\n\n getMany: async <TData extends BaseRecord = BaseRecord>(\n params: GetManyParams\n ): Promise<GetManyResponse<TData>> => {\n const { resource, ids, meta } = params;\n const taruviMeta = meta as TaruviMeta | undefined;\n const tableName = getTableName(resource, taruviMeta);\n\n if (isGraphQuery(taruviMeta)) {\n const data = await Promise.all(\n ids.map(async id => {\n const response = await buildGraphQuery<TData>(client, tableName, taruviMeta, String(id)).execute() as any;\n return Array.isArray(response) ? response[0] as TData : response?.data?.[0] ?? response as TData;\n })\n );\n return { data };\n }\n\n const idColumn = getIdColumn(taruviMeta);\n let query = new Database(client).from(tableName);\n query = query.filter(idColumn, \"in\", ids.map(String));\n query = applyPopulate(query, taruviMeta);\n const response = await query.execute() as unknown as TaruviListResponse<TData>;\n return { data: response.data };\n },\n\n create: async <TData extends BaseRecord = BaseRecord, TVariables = {}>(\n params: CreateParams<TVariables>\n ): Promise<CreateResponse<TData>> => {\n const { resource, variables, meta } = params;\n const taruviMeta = meta as TaruviMeta | undefined;\n const tableName = getTableName(resource, taruviMeta);\n\n if (isGraphQuery(taruviMeta)) {\n const response = await new Database(client)\n .from(tableName)\n .edges()\n .create(variables as EdgeRequest[])\n .execute() as { data: TData };\n return { data: response.data };\n }\n\n const db = new Database(client).from(tableName);\n const query = taruviMeta?.upsert\n ? db.upsert(variables as object)\n : db.create(variables as object);\n const response = await query.execute() as { data: TData };\n return { data: response.data };\n },\n\n createMany: async <TData extends BaseRecord = BaseRecord, TVariables = {}>(\n params: CreateManyParams<TVariables>\n ): Promise<CreateManyResponse<TData>> => {\n const { resource, variables, meta } = params;\n const taruviMeta = meta as TaruviMeta | undefined;\n const tableName = getTableName(resource, taruviMeta);\n\n const data = await Promise.all(\n variables.map(async (vars) => {\n const response = await new Database(client)\n .from(tableName)\n .create(vars as object)\n .execute() as { data: TData };\n return response.data;\n })\n );\n\n return { data };\n },\n\n update: async <TData extends BaseRecord = BaseRecord, TVariables = {}>(\n params: UpdateParams<TVariables>\n ): Promise<UpdateResponse<TData>> => {\n const { resource, id, variables, meta } = params;\n const taruviMeta = meta as TaruviMeta | undefined;\n const tableName = getTableName(resource, taruviMeta);\n\n if (isGraphQuery(taruviMeta)) {\n const response = await new Database(client)\n .from(tableName)\n .edges()\n .get(String(id))\n .update(variables as EdgeRequest)\n .execute() as { data: TData };\n return { data: response.data };\n }\n\n const response = await new Database(client)\n .from(tableName)\n .get(String(id))\n .update(variables as object)\n .execute() as { data: TData };\n return { data: response.data };\n },\n\n updateMany: async <TData extends BaseRecord = BaseRecord, TVariables = {}>(\n params: UpdateManyParams<TVariables>\n ): Promise<UpdateManyResponse<TData>> => {\n const { resource, ids, variables, meta } = params;\n const taruviMeta = meta as TaruviMeta | undefined;\n const tableName = getTableName(resource, taruviMeta);\n const idColumn = getIdColumn(taruviMeta);\n\n const body = ids.map(id => ({ [idColumn]: id, ...(variables as object) }));\n const response = await new Database(client)\n .from(tableName)\n .bulkUpdate(body)\n .execute() as { data: TData[] };\n return { data: response.data };\n },\n\n deleteOne: async <TData extends BaseRecord = BaseRecord, TVariables = {}>(\n params: DeleteOneParams<TVariables>\n ): Promise<DeleteOneResponse<TData>> => {\n const { resource, id, meta } = params;\n const taruviMeta = meta as TaruviMeta | undefined;\n const tableName = getTableName(resource, taruviMeta);\n\n if (isGraphQuery(taruviMeta)) {\n const response = await new Database(client)\n .from(tableName)\n .edges()\n .delete([Number(id)])\n .execute() as { data: TData };\n return { data: response.data };\n }\n\n await new Database(client)\n .from(tableName)\n .delete(String(id))\n .execute();\n return { data: { id } as unknown as TData };\n },\n\n deleteMany: async <TData extends BaseRecord = BaseRecord, TVariables = {}>(\n params: DeleteManyParams<TVariables>\n ): Promise<DeleteManyResponse<TData>> => {\n const { resource, ids, meta } = params;\n const taruviMeta = meta as TaruviMeta | undefined;\n const tableName = getTableName(resource, taruviMeta);\n\n if (isGraphQuery(taruviMeta)) {\n const response = await new Database(client)\n .from(tableName)\n .edges()\n .delete(ids.map(Number))\n .execute() as { data: TData };\n return { data: [response.data] };\n }\n\n if (taruviMeta?.deleteByFilter && taruviMeta?.filters) {\n let query = new Database(client).from(tableName);\n query = applyFilters(query, taruviMeta.filters as CrudFilter[]);\n await query.deleteFiltered().execute();\n return { data: ids.map(id => ({ id } as unknown as TData)) };\n }\n\n await new Database(client)\n .from(tableName)\n .bulkDelete(ids.map(String))\n .execute();\n return { data: ids.map(id => ({ id } as unknown as TData)) };\n },\n\n custom: async <TData extends BaseRecord = BaseRecord>(\n params: CustomParams\n ): Promise<CustomResponse<TData>> => {\n const { url, method, payload, query } = params;\n let endpoint = `api/apps/${config.appSlug}/datatables/${url}`;\n\n let data: TData;\n switch (method.toLowerCase()) {\n case 'get': {\n if (query && Object.keys(query).length > 0) {\n const queryString = new URLSearchParams(query as Record<string, string>).toString();\n endpoint = `${endpoint}${endpoint.includes('?') ? '&' : '?'}${queryString}`;\n }\n data = await client.httpClient.get(endpoint) as TData;\n break;\n }\n case 'post':\n data = await client.httpClient.post(endpoint, payload) as TData;\n break;\n case 'put':\n data = await client.httpClient.put(endpoint, payload) as TData;\n break;\n case 'patch':\n data = await client.httpClient.patch(endpoint, payload) as TData;\n break;\n case 'delete':\n data = await client.httpClient.delete(endpoint) as TData;\n break;\n default:\n throw new Error(`Unsupported HTTP method: ${method}`);\n }\n\n return { data };\n },\n\n getApiUrl: () => baseApiUrl,\n };\n}\n","import type {\n DataProvider,\n BaseRecord,\n GetListParams,\n GetListResponse,\n GetOneParams,\n GetOneResponse,\n GetManyResponse,\n CreateParams,\n CreateResponse,\n UpdateParams,\n UpdateResponse,\n DeleteOneParams,\n DeleteOneResponse,\n DeleteManyParams,\n DeleteManyResponse,\n CustomParams,\n CustomResponse,\n} from \"@refinedev/core\";\nimport { Client, Storage } from \"@taruvi/sdk\";\nimport type { StorageFilters, StorageUploadBatchResponse } from \"@taruvi/sdk\";\nimport type { TaruviListResponse, TaruviMeta } from \"./types.js\";\nimport { convertRefineFilters, convertRefineSorters, convertRefinePagination } from \"./utils.js\";\n\n/**\n * Storage upload variables interface.\n */\nexport interface StorageUploadVariables {\n files: File[];\n paths?: string[];\n metadatas?: Record<string, unknown>[];\n}\n\n/**\n * Creates a Refine DataProvider for Taruvi file storage operations.\n */\nexport function storageDataProvider(client: Client): DataProvider {\n const config = client.getConfig();\n const baseApiUrl = `${config.apiUrl}/api/apps/${config.appSlug}`;\n\n const getBucketName = (resource: string, meta?: TaruviMeta) => meta?.bucketName ?? resource;\n\n const buildFilters = (params: {\n filters?: GetListParams[\"filters\"];\n sorters?: GetListParams[\"sorters\"];\n pagination?: GetListParams[\"pagination\"];\n meta?: TaruviMeta;\n }): StorageFilters => {\n const filters: StorageFilters = {\n ...convertRefineFilters(params.filters) as StorageFilters,\n ...convertRefinePagination(params.pagination),\n };\n\n const ordering = convertRefineSorters(params.sorters);\n if (ordering) filters.ordering = ordering;\n\n return filters;\n };\n\n return {\n getList: async <TData extends BaseRecord = BaseRecord>(\n params: GetListParams\n ): Promise<GetListResponse<TData>> => {\n const { resource, pagination, filters, sorters, meta } = params;\n const taruviMeta = meta as TaruviMeta | undefined;\n const bucket = getBucketName(resource, taruviMeta);\n const storageFilters = buildFilters({ filters, sorters, pagination, meta: taruviMeta });\n\n const response = await new Storage(client)\n .from(bucket)\n .filter(storageFilters)\n .execute() as TaruviListResponse<TData>;\n\n return { data: response.data, total: response.total };\n },\n\n getOne: async <TData extends BaseRecord = BaseRecord>(\n params: GetOneParams\n ): Promise<GetOneResponse<TData>> => {\n const { resource, id: path, meta } = params;\n const taruviMeta = meta as TaruviMeta | undefined;\n const bucket = getBucketName(resource, taruviMeta);\n\n if (taruviMeta?.metadata) {\n const response = await new Storage(client)\n .from(bucket)\n .metadata(String(path))\n .execute() as { data: TData };\n return { data: response.data };\n }\n\n const blob = await new Storage(client)\n .from(bucket)\n .download(String(path))\n .execute<Blob>();\n return { data: blob as unknown as TData };\n },\n\n create: async <TData extends BaseRecord = BaseRecord, TVariables = {}>(\n params: CreateParams<TVariables>\n ): Promise<CreateResponse<TData>> => {\n const { resource, variables, meta } = params;\n const taruviMeta = meta as TaruviMeta | undefined;\n const bucket = getBucketName(resource, taruviMeta);\n const { files, paths = [], metadatas = [] } = variables as unknown as StorageUploadVariables;\n\n const filePaths = files.map((file, i) => paths[i] || file.name);\n const fileMetadatas = files.map((_, i) => metadatas[i] || {});\n\n const response = await new Storage(client)\n .from(bucket)\n .upload({ files, paths: filePaths, metadatas: fileMetadatas })\n .execute() as StorageUploadBatchResponse;\n\n // Extract the first uploaded file object from the batch response\n const firstUploaded = response.data?.successful?.[0]?.object;\n return { data: (firstUploaded ?? response.data) as unknown as TData };\n },\n\n update: async <TData extends BaseRecord = BaseRecord, TVariables = {}>(\n params: UpdateParams<TVariables>\n ): Promise<UpdateResponse<TData>> => {\n const { resource, id: path, variables, meta } = params;\n const taruviMeta = meta as TaruviMeta | undefined;\n const bucket = getBucketName(resource, taruviMeta);\n\n const response = await new Storage(client)\n .from(bucket)\n .update(String(path), variables as object)\n .execute() as { data: TData };\n\n return { data: response.data };\n },\n\n deleteOne: async <TData extends BaseRecord = BaseRecord, TVariables = {}>(\n params: DeleteOneParams<TVariables>\n ): Promise<DeleteOneResponse<TData>> => {\n const { resource, id: path, meta } = params;\n const taruviMeta = meta as TaruviMeta | undefined;\n const bucket = getBucketName(resource, taruviMeta);\n\n await new Storage(client)\n .from(bucket)\n .delete([String(path)])\n .execute();\n\n return { data: { id: path } as unknown as TData };\n },\n\n getApiUrl: () => baseApiUrl,\n\n getMany: async <TData extends BaseRecord = BaseRecord>(): Promise<GetManyResponse<TData>> => ({ data: [] }),\n\n createMany: async <TData extends BaseRecord = BaseRecord, TVariables = {}>(\n params: CreateParams<TVariables>\n ): Promise<CreateResponse<TData>> => {\n const { resource, variables, meta } = params;\n const taruviMeta = meta as TaruviMeta | undefined;\n const bucket = getBucketName(resource, taruviMeta);\n const { files, paths = [], metadatas = [] } = variables as unknown as StorageUploadVariables;\n\n const filePaths = files.map((file, i) => paths[i] || file.name);\n const fileMetadatas = files.map((_, i) => metadatas[i] || {});\n\n const response = await new Storage(client)\n .from(bucket)\n .upload({ files, paths: filePaths, metadatas: fileMetadatas })\n .execute() as StorageUploadBatchResponse;\n\n // Extract all uploaded file objects from the batch response\n const uploaded = response.data?.successful?.map(s => s.object) ?? [];\n return { data: (uploaded.length > 0 ? uploaded[0] : response.data) as unknown as TData };\n },\n\n deleteMany: async <TData extends BaseRecord = BaseRecord, TVariables = {}>(\n params: DeleteManyParams<TVariables>\n ): Promise<DeleteManyResponse<TData>> => {\n const { resource, ids, meta } = params;\n const taruviMeta = meta as TaruviMeta | undefined;\n const bucket = getBucketName(resource, taruviMeta);\n\n await new Storage(client)\n .from(bucket)\n .delete(ids.map(String))\n .execute();\n\n return { data: ids.map(id => ({ id } as unknown as TData)) };\n },\n\n custom: async <TData extends BaseRecord = BaseRecord>(\n params: CustomParams\n ): Promise<CustomResponse<TData>> => {\n const { url, method, payload, query } = params;\n let fullUrl = `api/apps/${config.appSlug}/storage/buckets/${url}`;\n\n let data: TData;\n switch (method.toLowerCase()) {\n case 'get': {\n if (query && Object.keys(query).length > 0) {\n const queryString = new URLSearchParams(query as Record<string, string>).toString();\n fullUrl = `${fullUrl}${fullUrl.includes('?') ? '&' : '?'}${queryString}`;\n }\n data = await client.httpClient.get(fullUrl) as TData;\n break;\n }\n case 'post':\n data = await client.httpClient.post(fullUrl, payload) as TData;\n break;\n case 'put':\n data = await client.httpClient.put(fullUrl, payload) as TData;\n break;\n case 'patch':\n data = await client.httpClient.patch(fullUrl, payload) as TData;\n break;\n case 'delete':\n data = await client.httpClient.delete(fullUrl) as TData;\n break;\n default:\n throw new Error(`Unsupported HTTP method: ${method}`);\n }\n\n return { data };\n },\n\n // Not applicable for file storage - files are replaced, not updated\n updateMany: undefined,\n };\n}\n","import type {\n DataProvider,\n BaseRecord,\n GetListParams,\n GetListResponse,\n GetOneParams,\n GetOneResponse,\n CustomParams,\n CustomResponse,\n} from \"@refinedev/core\";\nimport { Client, App, Functions, Analytics, Secrets } from \"@taruvi/sdk\";\nimport type { RoleData } from \"@taruvi/sdk\";\n\n/**\n * Response type for roles list from the App service.\n */\ninterface RolesListResponse {\n data: RoleData[];\n total: number;\n}\n\n/**\n * Meta options for function execution via custom().\n */\nexport interface FunctionMeta {\n kind: \"function\";\n /** Whether to execute the function asynchronously */\n async?: boolean;\n}\n\n/**\n * Meta options for analytics query execution via custom().\n */\nexport interface AnalyticsMeta {\n kind: \"analytics\";\n}\n\nexport type AppCustomMeta = FunctionMeta | AnalyticsMeta;\n\n/**\n * Creates a Refine DataProvider for Taruvi App operations.\n *\n * Supported operations:\n * - getList(\"roles\"): Fetch app roles\n * - getList(\"secrets\"): Fetch secrets by keys (requires meta.keys)\n * - getOne(\"settings\"): Fetch app settings\n * - getOne(\"secrets\"): Fetch a single secret by key (id = secret key)\n * - custom(): Execute edge functions or analytics queries via meta.kind\n */\nexport function appDataProvider(client: Client): DataProvider {\n const config = client.getConfig();\n const baseApiUrl = `${config.apiUrl}/api/apps/${config.appSlug}`;\n const functions = new Functions(client);\n const analytics = new Analytics(client);\n\n return {\n getList: async <TData extends BaseRecord = BaseRecord>(\n params: GetListParams\n ): Promise<GetListResponse<TData>> => {\n const { resource, meta } = params;\n\n if (resource === \"roles\") {\n const app = new App(client);\n const response = await app.roles().execute() as RolesListResponse;\n\n return {\n data: (response.data || response) as unknown as TData[],\n total: response.total ?? (Array.isArray(response) ? response.length : response.data?.length ?? 0),\n };\n }\n\n if (resource === \"secrets\") {\n const keys = meta?.keys as string[] | undefined;\n if (!keys || keys.length === 0) {\n throw new Error('secrets resource requires meta.keys array');\n }\n const secrets = new Secrets(client);\n const response = await secrets.list(keys, {\n app: meta?.app as string | undefined,\n includeMetadata: meta?.includeMetadata as boolean | undefined,\n }) as any;\n const raw = response.data || response;\n const data: TData[] = Array.isArray(raw)\n ? raw\n : Object.entries(raw).map(([key, value]) => ({ key, value }) as unknown as TData);\n return { data, total: data.length };\n }\n\n throw new Error(`Unknown app resource: ${resource}. Supported resources: roles, secrets`);\n },\n\n getOne: async <TData extends BaseRecord = BaseRecord>(\n params: GetOneParams\n ): Promise<GetOneResponse<TData>> => {\n const { resource, id, meta } = params;\n\n if (resource === \"settings\") {\n const app = new App(client);\n const response = await app.settings().execute() as { data: TData };\n\n return {\n data: response.data,\n };\n }\n\n if (resource === \"secrets\") {\n const secrets = new Secrets(client);\n const response = await secrets.get(String(id), {\n app: meta?.app as string | undefined,\n tags: meta?.tags as string[] | undefined,\n }).execute() as any;\n return { data: (response.data ?? response) as TData };\n }\n\n throw new Error(`Unknown app resource for getOne: ${resource}. Supported resources: settings, secrets`);\n },\n\n custom: async <TData extends BaseRecord = BaseRecord>(\n params: CustomParams\n ): Promise<CustomResponse<TData>> => {\n const { url: slug, payload, meta } = params;\n const customMeta = meta as AppCustomMeta | undefined;\n\n if (customMeta?.kind === \"function\") {\n const response = await functions.execute<TData>(slug, {\n async: customMeta.async ?? false,\n params: (payload ?? {}) as Record<string, unknown>,\n });\n return { data: response.data as TData };\n }\n\n if (customMeta?.kind === \"analytics\") {\n const response = await analytics.execute<TData>(slug, {\n params: (payload ?? {}) as Record<string, unknown>,\n });\n return { data: response.data as TData };\n }\n\n throw new Error(\n 'Specify meta.kind as \"function\" or \"analytics\" for custom operations on the app provider.'\n );\n },\n\n getApiUrl: () => baseApiUrl,\n\n getMany: async () => { throw new Error(\"getMany is not supported for app resources\"); },\n create: async () => { throw new Error(\"create is not supported for app resources. Use useCustom with meta.kind\"); },\n createMany: async () => { throw new Error(\"createMany is not supported for app resources\"); },\n update: async () => { throw new Error(\"update is not supported for app resources\"); },\n updateMany: async () => { throw new Error(\"updateMany is not supported for app resources\"); },\n deleteOne: async () => { throw new Error(\"deleteOne is not supported for app resources\"); },\n deleteMany: async () => { throw new Error(\"deleteMany is not supported for app resources\"); },\n };\n}\n","import type {\n DataProvider,\n BaseRecord,\n GetListParams,\n GetListResponse,\n GetOneParams,\n GetOneResponse,\n CreateParams,\n CreateResponse,\n UpdateParams,\n UpdateResponse,\n DeleteOneParams,\n DeleteOneResponse,\n CrudFilter,\n CrudSort,\n Pagination,\n} from \"@refinedev/core\";\nimport { Client, User, Auth } from \"@taruvi/sdk\";\nimport type { UserData, UserCreateRequest, UserUpdateRequest } from \"@taruvi/sdk\";\n\n/**\n * Response type for users list from the User service.\n */\ninterface UsersListResponse {\n data: UserData[];\n total: number;\n}\n\n/**\n * Filter parameters for listing users.\n */\ninterface UserListFilters {\n search?: string;\n is_active?: boolean;\n is_staff?: boolean;\n is_superuser?: boolean;\n is_deleted?: boolean;\n ordering?: string;\n page?: number;\n page_size?: number;\n}\n\n/**\n * Builds UserListFilters from Refine's filters, sorters, and pagination.\n */\nfunction buildUserListFilters(\n filters?: CrudFilter[],\n sorters?: CrudSort[],\n pagination?: Pagination\n): UserListFilters {\n const result: UserListFilters = {};\n\n // Apply pagination\n if (pagination && pagination.mode !== \"off\") {\n if (pagination.currentPage) {\n result.page = pagination.currentPage;\n }\n if (pagination.pageSize) {\n result.page_size = pagination.pageSize;\n }\n }\n\n // Apply filters\n if (filters) {\n for (const filter of filters) {\n if (\"field\" in filter) {\n const field = filter.field as string;\n const value = filter.value;\n\n switch (field) {\n case \"search\":\n result.search = String(value);\n break;\n case \"is_active\":\n result.is_active = Boolean(value);\n break;\n case \"is_staff\":\n result.is_staff = Boolean(value);\n break;\n case \"is_superuser\":\n result.is_superuser = Boolean(value);\n break;\n case \"is_deleted\":\n result.is_deleted = Boolean(value);\n break;\n }\n }\n }\n }\n\n // Apply sorting (first sorter only, as API accepts single ordering)\n if (sorters && sorters.length > 0) {\n const sorter = sorters[0];\n result.ordering = sorter.order === \"desc\" ? `-${sorter.field}` : sorter.field;\n }\n\n return result;\n}\n\n/**\n * Creates a Refine DataProvider for Taruvi User operations.\n *\n * This provider is specialized for fetching user-level data.\n *\n * Supported resources:\n * - \"users\" (getList): Fetch list of users with filtering/pagination\n * - \"users\" (getOne): Fetch a specific user by username/id\n * - \"roles\" (getList): Fetch roles for a specific user (requires meta.username)\n *\n * @example\n * ```typescript\n * // Get list of users\n * const { data } = useList({\n * dataProviderName: \"user\",\n * resource: \"users\",\n * pagination: { currentPage: 1, pageSize: 10 },\n * filters: [\n * { field: \"is_active\", operator: \"eq\", value: true },\n * { field: \"search\", operator: \"eq\", value: \"john\" },\n * ],\n * sorters: [{ field: \"username\", order: \"asc\" }],\n * });\n *\n * // Get a specific user by username\n * const { data } = useOne({\n * dataProviderName: \"user\",\n * resource: \"users\",\n * id: \"john_doe\",\n * });\n *\n * // Get roles for a specific user\n * const { data } = useList({\n * dataProviderName: \"user\",\n * resource: \"roles\",\n * meta: { username: \"john_doe\" },\n * });\n * ```\n */\nexport function userDataProvider(client: Client): DataProvider {\n const config = client.getConfig();\n const baseApiUrl = `${config.apiUrl}/api/apps/${config.appSlug}`;\n\n return {\n getList: async <TData extends BaseRecord = BaseRecord>(\n params: GetListParams\n ): Promise<GetListResponse<TData>> => {\n const { resource, pagination, filters, sorters, meta } = params;\n\n if (resource === \"users\") {\n const user = new User(client);\n const userFilters = buildUserListFilters(filters, sorters, pagination);\n const response = await user.list(userFilters as Parameters<typeof user.list>[0]) as UsersListResponse;\n\n return {\n data: (response.data || response) as unknown as TData[],\n total: response.total,\n };\n }\n\n if (resource === \"roles\") {\n // Get roles for a specific user - requires meta.username\n const username = meta?.username as string;\n if (!username) {\n throw new Error(\"roles resource requires meta.username\");\n }\n const user = new User(client);\n const response = await user.getUser(username) as any;\n const roles = response.data?.roles || response.roles || [];\n\n return {\n data: roles as unknown as TData[],\n total: roles.length,\n };\n }\n\n if (resource === \"apps\") {\n const username = meta?.username as string;\n if (!username) {\n throw new Error(\"apps resource requires meta.username\");\n }\n const user = new User(client);\n const response = await user.getUserApps(username) as any;\n const apps = response.data || response;\n return {\n data: apps as TData[],\n total: Array.isArray(apps) ? apps.length : 0,\n };\n }\n\n throw new Error(`Unknown user resource for getList: ${resource}. Supported: users, roles, apps`);\n },\n\n getOne: async <TData extends BaseRecord = BaseRecord>(\n params: GetOneParams\n ): Promise<GetOneResponse<TData>> => {\n const { resource, id } = params;\n\n if (resource === \"users\") {\n const user = new User(client)\n\n // Support \"me\" as a special ID to get current user via Auth\n if (String(id) === \"me\") {\n const auth = new Auth(client);\n const response = await auth.getCurrentUser();\n const data = response ? ((response as any).data ?? response) : null;\n return { data: data as unknown as TData };\n }\n\n const response = await user.getUser(String(id));\n\n return {\n data: response.data as unknown as TData,\n };\n }\n\n throw new Error(`Unknown user resource for getOne: ${resource}. Supported: users`);\n },\n\n getApiUrl: () => baseApiUrl,\n\n create: async <TData extends BaseRecord = BaseRecord, TVariables = {}>(\n params: CreateParams<TVariables>\n ): Promise<CreateResponse<TData>> => {\n const { resource, variables } = params;\n\n if (resource === \"users\") {\n const user = new User(client);\n const userData = variables as unknown as UserCreateRequest;\n const response = await user.createUser(userData);\n\n return {\n data: response.data as unknown as TData,\n };\n }\n\n throw new Error(`Unknown user resource for create: ${resource}. Supported resources: users`);\n },\n\n update: async <TData extends BaseRecord = BaseRecord, TVariables = {}>(\n params: UpdateParams<TVariables>\n ): Promise<UpdateResponse<TData>> => {\n const { resource, id, variables } = params;\n\n if (resource === \"users\") {\n const user = new User(client);\n const username = String(id);\n const updateData = variables as unknown as UserUpdateRequest;\n const response = await user.updateUser(username, updateData);\n\n return {\n data: response.data as unknown as TData,\n };\n }\n\n throw new Error(`Unknown user resource for update: ${resource}. Supported resources: users`);\n },\n\n deleteOne: async <TData extends BaseRecord = BaseRecord, TVariables = {}>(\n params: DeleteOneParams<TVariables>\n ): Promise<DeleteOneResponse<TData>> => {\n const { resource, id } = params;\n\n if (resource === \"users\") {\n const user = new User(client);\n const username = String(id);\n await user.deleteUser(username);\n\n return {\n data: {} as TData,\n };\n }\n\n throw new Error(`Unknown user resource for delete: ${resource}. Supported resources: users`);\n },\n\n // User resources - other operations not supported\n getMany: async () => { throw new Error(\"getMany is not supported for user resources\"); },\n createMany: async () => { throw new Error(\"createMany is not supported for user resources\"); },\n updateMany: async () => { throw new Error(\"updateMany is not supported for user resources\"); },\n deleteMany: async () => { throw new Error(\"deleteMany is not supported for user resources\"); },\n custom: async () => { throw new Error(\"custom is not supported for user resources\"); },\n };\n}\n","import type {\n DataProvider,\n BaseRecord,\n CreateParams,\n CreateResponse,\n} from \"@refinedev/core\";\nimport { Client, Functions } from \"@taruvi/sdk\";\n\n/**\n * Extended meta options for function execution.\n */\nexport interface FunctionMeta {\n /** Whether to execute the function asynchronously */\n async?: boolean;\n}\n\n/** @deprecated Use `appDataProvider` with `useCustom` and `meta.kind: \"function\"` instead. */\nexport function functionsDataProvider(client: Client): DataProvider {\n const config = client.getConfig();\n const baseApiUrl = `${config.apiUrl}/api/apps/${config.appSlug}`;\n const functions = new Functions(client);\n\n return {\n /**\n * Execute an edge function.\n *\n * @param resource - The function slug to execute\n * @param variables - Parameters to pass to the function\n * @param meta.async - Whether to execute asynchronously (default: false)\n */\n create: async <TData extends BaseRecord = BaseRecord, TVariables = {}>({\n resource,\n variables,\n meta,\n }: CreateParams<TVariables>): Promise<CreateResponse<TData>> => {\n const functionMeta = meta as FunctionMeta | undefined;\n\n const response = await functions.execute<TData>(resource, {\n async: functionMeta?.async ?? false,\n params: variables as Record<string, unknown>,\n });\n\n return { data: response.data as TData };\n },\n\n getApiUrl: () => baseApiUrl,\n\n // Edge functions don't support custom method - use create() instead\n custom: async () => {\n throw new Error(\n \"custom is not supported for edge functions. Use useCreate to execute functions.\"\n );\n },\n\n // Edge functions don't support other CRUD operations\n getList: async () => {\n throw new Error(\n \"getList is not supported for edge functions. Use useCreate to execute functions.\"\n );\n },\n getOne: async () => {\n throw new Error(\n \"getOne is not supported for edge functions. Use useCreate to execute functions.\"\n );\n },\n getMany: async () => {\n throw new Error(\n \"getMany is not supported for edge functions. Use useCreate to execute functions.\"\n );\n },\n createMany: async () => {\n throw new Error(\n \"createMany is not supported for edge functions. Use useCreate to execute functions.\"\n );\n },\n update: async () => {\n throw new Error(\n \"update is not supported for edge functions. Use useCreate to execute functions.\"\n );\n },\n updateMany: async () => {\n throw new Error(\n \"updateMany is not supported for edge functions. Use useCreate to execute functions.\"\n );\n },\n deleteOne: async () => {\n throw new Error(\n \"deleteOne is not supported for edge functions. Use useCreate to execute functions.\"\n );\n },\n deleteMany: async () => {\n throw new Error(\n \"deleteMany is not supported for edge functions. Use useCreate to execute functions.\"\n );\n },\n };\n}","import type {\n DataProvider,\n BaseRecord,\n CreateParams,\n CreateResponse,\n} from \"@refinedev/core\";\nimport { Client, Analytics } from \"@taruvi/sdk\";\n\n/**\n * Extended meta options for analytics query execution.\n */\nexport interface AnalyticsMeta {\n /** Additional parameters to pass to the analytics query */\n params?: Record<string, unknown>;\n}\n\n/** @deprecated Use `appDataProvider` with `useCustom` and `meta.kind: \"analytics\"` instead. */\nexport function analyticsDataProvider(client: Client): DataProvider {\n const config = client.getConfig();\n const baseApiUrl = `${config.apiUrl}/api/apps/${config.appSlug}`;\n const analytics = new Analytics(client);\n\n return {\n /**\n * Execute an analytics query.\n *\n * @param resource - The query slug to execute\n * @param variables - Parameters to pass to the query\n */\n create: async <TData extends BaseRecord = BaseRecord, TVariables = {}>({\n resource,\n variables,\n }: CreateParams<TVariables>): Promise<CreateResponse<TData>> => {\n const response = await analytics.execute<TData>(resource, {\n params: variables as Record<string, unknown>,\n });\n\n return { data: response.data as TData };\n },\n\n getApiUrl: () => baseApiUrl,\n\n // Analytics don't support custom method - use create() instead\n custom: async () => {\n throw new Error(\n \"custom is not supported for analytics. Use useCreate to execute queries.\"\n );\n },\n\n // Analytics queries don't support other CRUD operations\n getList: async () => {\n throw new Error(\n \"getList is not supported for analytics. Use useCreate to execute queries.\"\n );\n },\n getOne: async () => {\n throw new Error(\n \"getOne is not supported for analytics. Use useCreate to execute queries.\"\n );\n },\n getMany: async () => {\n throw new Error(\n \"getMany is not supported for analytics. Use useCreate to execute queries.\"\n );\n },\n createMany: async () => {\n throw new Error(\n \"createMany is not supported for analytics. Use useCreate to execute queries.\"\n );\n },\n update: async () => {\n throw new Error(\n \"update is not supported for analytics. Use useCreate to execute queries.\"\n );\n },\n updateMany: async () => {\n throw new Error(\n \"updateMany is not supported for analytics. Use useCreate to execute queries.\"\n );\n },\n deleteOne: async () => {\n throw new Error(\n \"deleteOne is not supported for analytics. Use useCreate to execute queries.\"\n );\n },\n deleteMany: async () => {\n throw new Error(\n \"deleteMany is not supported for analytics. Use useCreate to execute queries.\"\n );\n },\n };\n}","import type { AuthProvider } from \"@refinedev/core\";\nimport { Client, Auth } from \"@taruvi/sdk\";\n\n/**\n * Login params - supports both redirect flow and credentials flow\n */\nexport interface LoginParams {\n /** For redirect-based login - URL to redirect after successful login */\n callbackUrl?: string;\n /** For credentials-based login (if supported) */\n username?: string;\n password?: string;\n /** Whether to use redirect flow (default: true) */\n redirect?: boolean;\n}\n\n/**\n * Logout params\n */\nexport interface LogoutParams {\n /** URL to redirect after logout */\n callbackUrl?: string;\n}\n\n/**\n * Register/Signup params\n */\nexport interface RegisterParams {\n /** URL to redirect after successful signup */\n callbackUrl?: string;\n}\n\n/**\n * Creates a Refine AuthProvider for Taruvi authentication.\n *\n * Supports redirect-based authentication flow (Web UI Flow):\n * 1. User calls login() → Redirects to backend /accounts/login/\n * 2. User authenticates on backend\n * 3. Backend redirects back with tokens in URL hash\n * 4. Client extracts and stores tokens automatically\n */\nexport function authProvider(client: Client): AuthProvider {\n const auth = new Auth(client);\n\n return {\n login: async (params: LoginParams = {}) => {\n const { callbackUrl, redirect = true } = params;\n\n // Check if already authenticated first (prevents infinite redirect loop)\n\n // TODO: check if this is necessary\n if (auth.isUserAuthenticated()) {\n return {\n success: true,\n redirectTo: callbackUrl || \"/\",\n };\n }\n\n if (redirect) {\n // Redirect-based login flow\n auth.login(callbackUrl);\n\n // Return success since we're redirecting\n // The actual auth state will be checked after redirect\n return {\n success: true,\n };\n }\n\n return {\n success: false,\n error: {\n name: \"LoginError\",\n message: \"Login failed. Please try again.\",\n },\n };\n },\n\n logout: async (params: LogoutParams = {}) => {\n const { callbackUrl } = params;\n\n await auth.logout(callbackUrl);\n\n return {\n success: true,\n redirectTo: callbackUrl || \"/login\",\n };\n },\n\n check: async () => {\n if (!auth.isUserAuthenticated()) {\n return { authenticated: false, redirectTo: \"/login\" };\n }\n\n // Validate token against server — local token may be invalidated server-side\n try {\n const user = await auth.getCurrentUser();\n if (user) {\n return { authenticated: true };\n }\n } catch {\n // Token invalid — interceptor already cleared it\n }\n\n return { authenticated: false, redirectTo: \"/login\" };\n },\n\n onError: async (error) => {\n const status = error?.statusCode || error?.status || error?.response?.status;\n\n // 401/403 means session is invalid — tokens already cleared by SDK interceptor\n if (status === 401 || status === 403) {\n return {\n logout: true,\n redirectTo: \"/login\",\n error,\n };\n }\n\n return { error };\n },\n\n register: async (params: RegisterParams = {}) => {\n const { callbackUrl } = params;\n\n // Redirect to signup page\n auth.signup(callbackUrl);\n\n return {\n success: true,\n };\n },\n\n getIdentity: async () => {\n const response = await auth.getCurrentUser();\n\n if (!response) {\n return null;\n }\n\n return (response as any).data ?? response;\n },\n\n getPermissions: async () => {\n const response = await auth.getCurrentUser();\n\n if (!response) {\n return null;\n }\n\n const user = (response as any).data ?? response;\n\n if (!user) {\n return null;\n }\n\n // Return permissions from the user data\n return {\n roles: user.roles || [],\n permissions: user.user_permissions || [],\n groups: user.groups || [],\n is_staff: user.is_staff || false,\n is_superuser: user.is_superuser || false,\n };\n },\n };\n}\n","import type { AccessControlProvider } from \"@refinedev/core\";\nimport { Client, Auth, Policy } from \"@taruvi/sdk\";\nimport DataLoader from \"dataloader\";\n\n/**\n * Permission check request for DataLoader batching\n */\ninterface PermissionCheck {\n resource: string;\n action: string;\n params?: Record<string, unknown>;\n entityType?: string;\n}\n\ninterface PermissionResult {\n can: boolean;\n reason?: string;\n}\n\n/**\n * Creates a Refine AccessControlProvider using Cerbos via the Policy client.\n *\n * Uses DataLoader for request batching (multiple useCan calls → single API request)\n * and Refine's built-in TanStack Query for caching.\n *\n * @example\n * ```tsx\n * <Refine\n * authProvider={authProvider(client)}\n * accessControlProvider={accessControlProvider(client)}\n * />\n *\n *\n * ```\n */\nexport function accessControlProvider(\n client: Client,\n options?: { batchDelayMs?: number }\n): AccessControlProvider {\n const policy = new Policy(client);\n const auth = new Auth(client);\n const { batchDelayMs = 50 } = options ?? {};\n\n // DataLoader for batching only - TanStack Query handles caching\n const permissionLoader = new DataLoader<PermissionCheck, PermissionResult>(\n async (checks) => {\n const response = await auth.getCurrentUser();\n const user = response ? ((response as any).data ?? response) : null;\n\n if (!user) {\n return checks.map(() => ({\n can: false,\n reason: \"User not authenticated\",\n }));\n }\n\n // Deduplicate and group by resource:recordId (needed because cache: false)\n const uniqueResources = new Map<string, {\n entityType?: string;\n tableName: string;\n recordId: string;\n attributes: Record<string, unknown>;\n actions: Set<string>;\n }>();\n\n for (const check of checks) {\n const recordId = check.params?.id ? String(check.params.id) : \"*\";\n const key = `${check.resource}:${recordId}`;\n\n if (!uniqueResources.has(key)) {\n uniqueResources.set(key, {\n entityType: check.entityType,\n tableName: check.resource,\n recordId,\n attributes: (check.params || {}) as Record<string, unknown>,\n actions: new Set(),\n });\n }\n uniqueResources.get(key)!.actions.add(check.action);\n }\n\n // Build batch payload for Cerbos\n const batchPayload = Array.from(uniqueResources.values()).map((entry) => ({\n entityType: entry.entityType ?? entry.tableName, // Default to tableName if entityType not specified\n tableName: entry.tableName,\n recordId: entry.recordId,\n attributes: entry.attributes,\n actions: Array.from(entry.actions),\n }));\n\n try {\n // Single SDK call for all permissions\n const result = await policy.checkResource(batchPayload) as {\n results?: Array<{ actions?: Record<string, string> }>;\n };\n\n // Build results lookup\n const resultsByResource = new Map<string, Record<string, string>>();\n result?.results?.forEach((r, index) => {\n const payload = batchPayload[index];\n const key = `${payload.tableName}:${payload.recordId}`;\n resultsByResource.set(key, r.actions || {});\n });\n\n // Map results back to original checks order (DataLoader requirement)\n return checks.map((check) => {\n const recordId = check.params?.id ? String(check.params.id) : \"*\";\n const key = `${check.resource}:${recordId}`;\n const actions = resultsByResource.get(key) || {};\n const allowed = actions[check.action] === \"EFFECT_ALLOW\";\n\n return {\n can: allowed,\n reason: allowed ? undefined : \"Permission denied by policy\",\n };\n });\n } catch (error) {\n console.error(\"Batch permission check failed:\", error);\n return checks.map(() => ({\n can: false,\n reason: error instanceof Error ? error.message : \"Permission check failed\",\n }));\n }\n },\n {\n batchScheduleFn: (callback) => setTimeout(callback, batchDelayMs),\n cache: false, // TanStack Query handles caching\n }\n );\n\n return {\n can: async ({ resource, action, params }) => {\n if (!resource) {\n return { can: false, reason: \"Resource not specified\" };\n }\n\n // Priority: params.entityType (override) > resource.meta.entityType > resource name\n const entityType = (params?.entityType as string | undefined)\n ?? (params?.resource?.meta?.entityType as string | undefined);\n\n return permissionLoader.load({\n resource,\n action,\n params,\n entityType,\n });\n },\n\n options: {\n buttons: {\n enableAccessControl: true,\n hideIfUnauthorized: true,\n },\n queryOptions: {\n staleTime: 5 * 60 * 1000, // 5 minutes\n gcTime: 10 * 60 * 1000, // 10 minutes\n },\n },\n };\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@taruvi/refine-providers",
3
- "version": "1.2.7",
3
+ "version": "1.2.8",
4
4
  "description": "Refine.dev data provider for Taruvi Data Service",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",