@taruvi/refine-providers 1.2.9 → 1.3.0
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 +13 -3
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +7 -1
- package/dist/index.d.ts +7 -1
- package/dist/index.js +13 -3
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -11,7 +11,7 @@ var DataLoader__default = /*#__PURE__*/_interopDefault(DataLoader);
|
|
|
11
11
|
|
|
12
12
|
// package.json
|
|
13
13
|
var package_default = {
|
|
14
|
-
version: "1.
|
|
14
|
+
version: "1.3.0"};
|
|
15
15
|
|
|
16
16
|
// src/utils.ts
|
|
17
17
|
var REFINE_OPERATOR_MAP = {
|
|
@@ -231,6 +231,10 @@ function applyPopulate(query, meta) {
|
|
|
231
231
|
const populateArray = Array.isArray(meta.populate) ? meta.populate : meta.populate.split(",").map((s) => s.trim());
|
|
232
232
|
return query.populate(populateArray);
|
|
233
233
|
}
|
|
234
|
+
function applyAllowedActions(query, meta) {
|
|
235
|
+
if (!meta?.allowedActions?.length) return query;
|
|
236
|
+
return query.allowedActions(meta.allowedActions);
|
|
237
|
+
}
|
|
234
238
|
function isGraphQuery(meta) {
|
|
235
239
|
return !!(meta?.format || meta?.graph_types || meta?.include || meta?.depth);
|
|
236
240
|
}
|
|
@@ -255,7 +259,9 @@ function dataProvider(client) {
|
|
|
255
259
|
const taruviMeta = meta;
|
|
256
260
|
const tableName = getTableName(resource, taruviMeta);
|
|
257
261
|
if (isGraphQuery(taruviMeta)) {
|
|
258
|
-
|
|
262
|
+
let graphQuery = buildGraphQuery(client, tableName, taruviMeta);
|
|
263
|
+
graphQuery = applyAllowedActions(graphQuery, taruviMeta);
|
|
264
|
+
const response2 = await graphQuery.execute();
|
|
259
265
|
const data = Array.isArray(response2) ? response2 : response2?.data ?? [];
|
|
260
266
|
const total = response2?.total ?? data.length;
|
|
261
267
|
return { data, total };
|
|
@@ -266,6 +272,7 @@ function dataProvider(client) {
|
|
|
266
272
|
query = applyPagination(query, pagination);
|
|
267
273
|
query = applyPopulate(query, taruviMeta);
|
|
268
274
|
query = applyAggregations(query, taruviMeta);
|
|
275
|
+
query = applyAllowedActions(query, taruviMeta);
|
|
269
276
|
const response = await query.execute();
|
|
270
277
|
return { data: response.data, total: response.total };
|
|
271
278
|
},
|
|
@@ -960,13 +967,16 @@ function authProvider(client) {
|
|
|
960
967
|
},
|
|
961
968
|
onError: async (error) => {
|
|
962
969
|
const status = error?.statusCode || error?.status || error?.response?.status;
|
|
963
|
-
if (status === 401
|
|
970
|
+
if (status === 401) {
|
|
964
971
|
return {
|
|
965
972
|
logout: true,
|
|
966
973
|
redirectTo: "/login",
|
|
967
974
|
error
|
|
968
975
|
};
|
|
969
976
|
}
|
|
977
|
+
if (status === 403) {
|
|
978
|
+
return { error };
|
|
979
|
+
}
|
|
970
980
|
return { error };
|
|
971
981
|
},
|
|
972
982
|
register: async (params = {}) => {
|
package/dist/index.cjs.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":["Database","response","Storage","Functions","Analytics","App","Secrets","User","Auth","_cachedUser","Policy","DataLoader"],"mappings":"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","file":"index.cjs","sourcesContent":["{\n \"name\": \"@taruvi/refine-providers\",\n \"version\": \"1.2.8\",\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\": \"file:../taruvi-sdk\",\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// Shared user cache — populated by getIdentity(), reused by getPermissions()\n// and accessControlProvider. Prevents multiple /users/me calls per page load.\n// ============================================================================\n\nexport let _cachedUser: Record<string, any> | null = null;\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 _cachedUser = null;\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 // Trust token locally — server-side validation happens\n // via onError when actual API calls fail with 401/403\n return { authenticated: true };\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 _cachedUser = null;\n return null;\n }\n\n const user = (response as any).data ?? response;\n _cachedUser = user;\n return user;\n },\n\n getPermissions: async () => {\n // Reuse cached user from getIdentity() to avoid a separate /users/me call.\n const user = _cachedUser;\n\n if (!user) {\n return null;\n }\n\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 { Auth, Client, Policy } from \"@taruvi/sdk\";\nimport DataLoader from \"dataloader\";\nimport { _cachedUser } from \"./authProvider\";\n\n/**\n * Permission check request for DataLoader batching\n */\ninterface PermissionCheck {\n resource: string;\n action: string;\n params?: Record<string, unknown>;\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 // Reuse cached user from authProvider.getIdentity() — no extra /users/me call\n let currentUser = _cachedUser;\n\n if (!currentUser) {\n try {\n const response = await auth.getCurrentUser();\n currentUser = response ? ((response as any).data ?? response) : null;\n } catch {\n currentUser = null;\n }\n }\n\n if (!currentUser) {\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 resource: 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 resource: 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 const uniqueEntries = Array.from(uniqueResources.values());\n\n // Build batch payload for Cerbos\n const batchPayload = uniqueEntries.map((entry) => ({\n resource: entry.resource,\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.resource}:${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 return permissionLoader.load({\n resource,\n action,\n params,\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","_cachedUser","Policy","DataLoader"],"mappings":"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","file":"index.cjs","sourcesContent":["{\n \"name\": \"@taruvi/refine-providers\",\n \"version\": \"1.3.0\",\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 * Applies allowed_actions query param for per-row permission hints.\n */\nfunction applyAllowedActions<T>(query: Database<T>, meta?: TaruviMeta): Database<T> {\n if (!meta?.allowedActions?.length) return query;\n return query.allowedActions(meta.allowedActions);\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 let graphQuery = buildGraphQuery<TData>(client, tableName, taruviMeta);\n graphQuery = applyAllowedActions(graphQuery, taruviMeta);\n const response = await graphQuery.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 query = applyAllowedActions(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// Shared user cache — populated by getIdentity(), reused by getPermissions()\n// and accessControlProvider. Prevents multiple /users/me calls per page load.\n// ============================================================================\n\nexport let _cachedUser: Record<string, any> | null = null;\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 _cachedUser = null;\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 // Trust token locally — server-side validation happens\n // via onError when actual API calls fail with 401/403\n return { authenticated: true };\n },\n\n onError: async (error) => {\n const status = error?.statusCode || error?.status || error?.response?.status;\n\n // 401 means session is invalid — tokens already cleared by SDK interceptor\n if (status === 401) {\n return {\n logout: true,\n redirectTo: \"/login\",\n error,\n };\n }\n\n // 403 means authenticated but forbidden — don't logout, just report the error\n if (status === 403) {\n return { error };\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 _cachedUser = null;\n return null;\n }\n\n const user = (response as any).data ?? response;\n _cachedUser = user;\n return user;\n },\n\n getPermissions: async () => {\n // Reuse cached user from getIdentity() to avoid a separate /users/me call.\n const user = _cachedUser;\n\n if (!user) {\n return null;\n }\n\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 { Auth, Client, Policy } from \"@taruvi/sdk\";\nimport DataLoader from \"dataloader\";\nimport { _cachedUser } from \"./authProvider\";\n\n/**\n * Permission check request for DataLoader batching\n */\ninterface PermissionCheck {\n resource: string;\n action: string;\n params?: Record<string, unknown>;\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 // Reuse cached user from authProvider.getIdentity() — no extra /users/me call\n let currentUser = _cachedUser;\n\n if (!currentUser) {\n try {\n const response = await auth.getCurrentUser();\n currentUser = response ? ((response as any).data ?? response) : null;\n } catch {\n currentUser = null;\n }\n }\n\n if (!currentUser) {\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 resource: 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 resource: 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 const uniqueEntries = Array.from(uniqueResources.values());\n\n // Build batch payload for Cerbos\n const batchPayload = uniqueEntries.map((entry) => ({\n resource: entry.resource,\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.resource}:${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 return permissionLoader.load({\n resource,\n action,\n params,\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.d.cts
CHANGED
|
@@ -170,6 +170,10 @@ declare function accessControlProvider(client: Client, options?: {
|
|
|
170
170
|
* - variance(field) - Statistical variance
|
|
171
171
|
*/
|
|
172
172
|
type AggregateExpression = string;
|
|
173
|
+
/**
|
|
174
|
+
* Actions that can be requested for per-row permission hints via `allowed_actions`.
|
|
175
|
+
*/
|
|
176
|
+
type AllowedAction = "update" | "delete";
|
|
173
177
|
/**
|
|
174
178
|
* Extended meta options for Taruvi-specific features.
|
|
175
179
|
*/
|
|
@@ -204,6 +208,8 @@ interface TaruviMeta extends MetaQuery {
|
|
|
204
208
|
upsert?: boolean;
|
|
205
209
|
/** Delete records by filter instead of by IDs */
|
|
206
210
|
deleteByFilter?: boolean;
|
|
211
|
+
/** Request per-row permission hints. Valid actions: "update", "delete". */
|
|
212
|
+
allowedActions?: AllowedAction[];
|
|
207
213
|
/** Return file metadata instead of downloading (storage provider only) */
|
|
208
214
|
metadata?: boolean;
|
|
209
215
|
}
|
|
@@ -264,4 +270,4 @@ declare function buildQueryString(params?: Record<string, unknown>): string;
|
|
|
264
270
|
*/
|
|
265
271
|
declare function handleError(error: unknown): never;
|
|
266
272
|
|
|
267
|
-
export { type AnalyticsMeta, type AppCustomMeta, type FunctionMeta, type LoginParams, type LogoutParams, REFINE_OPERATOR_MAP, type RegisterParams, type StorageDownloadResponse, type StorageUploadVariables, type TaruviListResponse, type TaruviMeta, _cachedUser, accessControlProvider, analyticsDataProvider, appDataProvider, authProvider, buildQueryString, buildRefineQueryParams, convertRefineFilters, convertRefinePagination, convertRefineSorters, dataProvider, functionsDataProvider, handleError, storageDataProvider, userDataProvider };
|
|
273
|
+
export { type AllowedAction, type AnalyticsMeta, type AppCustomMeta, type FunctionMeta, type LoginParams, type LogoutParams, REFINE_OPERATOR_MAP, type RegisterParams, type StorageDownloadResponse, type StorageUploadVariables, type TaruviListResponse, type TaruviMeta, _cachedUser, accessControlProvider, analyticsDataProvider, appDataProvider, authProvider, buildQueryString, buildRefineQueryParams, convertRefineFilters, convertRefinePagination, convertRefineSorters, dataProvider, functionsDataProvider, handleError, storageDataProvider, userDataProvider };
|
package/dist/index.d.ts
CHANGED
|
@@ -170,6 +170,10 @@ declare function accessControlProvider(client: Client, options?: {
|
|
|
170
170
|
* - variance(field) - Statistical variance
|
|
171
171
|
*/
|
|
172
172
|
type AggregateExpression = string;
|
|
173
|
+
/**
|
|
174
|
+
* Actions that can be requested for per-row permission hints via `allowed_actions`.
|
|
175
|
+
*/
|
|
176
|
+
type AllowedAction = "update" | "delete";
|
|
173
177
|
/**
|
|
174
178
|
* Extended meta options for Taruvi-specific features.
|
|
175
179
|
*/
|
|
@@ -204,6 +208,8 @@ interface TaruviMeta extends MetaQuery {
|
|
|
204
208
|
upsert?: boolean;
|
|
205
209
|
/** Delete records by filter instead of by IDs */
|
|
206
210
|
deleteByFilter?: boolean;
|
|
211
|
+
/** Request per-row permission hints. Valid actions: "update", "delete". */
|
|
212
|
+
allowedActions?: AllowedAction[];
|
|
207
213
|
/** Return file metadata instead of downloading (storage provider only) */
|
|
208
214
|
metadata?: boolean;
|
|
209
215
|
}
|
|
@@ -264,4 +270,4 @@ declare function buildQueryString(params?: Record<string, unknown>): string;
|
|
|
264
270
|
*/
|
|
265
271
|
declare function handleError(error: unknown): never;
|
|
266
272
|
|
|
267
|
-
export { type AnalyticsMeta, type AppCustomMeta, type FunctionMeta, type LoginParams, type LogoutParams, REFINE_OPERATOR_MAP, type RegisterParams, type StorageDownloadResponse, type StorageUploadVariables, type TaruviListResponse, type TaruviMeta, _cachedUser, accessControlProvider, analyticsDataProvider, appDataProvider, authProvider, buildQueryString, buildRefineQueryParams, convertRefineFilters, convertRefinePagination, convertRefineSorters, dataProvider, functionsDataProvider, handleError, storageDataProvider, userDataProvider };
|
|
273
|
+
export { type AllowedAction, type AnalyticsMeta, type AppCustomMeta, type FunctionMeta, type LoginParams, type LogoutParams, REFINE_OPERATOR_MAP, type RegisterParams, type StorageDownloadResponse, type StorageUploadVariables, type TaruviListResponse, type TaruviMeta, _cachedUser, accessControlProvider, analyticsDataProvider, appDataProvider, authProvider, buildQueryString, buildRefineQueryParams, convertRefineFilters, convertRefinePagination, convertRefineSorters, dataProvider, functionsDataProvider, handleError, storageDataProvider, userDataProvider };
|
package/dist/index.js
CHANGED
|
@@ -5,7 +5,7 @@ import DataLoader from 'dataloader';
|
|
|
5
5
|
|
|
6
6
|
// package.json
|
|
7
7
|
var package_default = {
|
|
8
|
-
version: "1.
|
|
8
|
+
version: "1.3.0"};
|
|
9
9
|
|
|
10
10
|
// src/utils.ts
|
|
11
11
|
var REFINE_OPERATOR_MAP = {
|
|
@@ -225,6 +225,10 @@ function applyPopulate(query, meta) {
|
|
|
225
225
|
const populateArray = Array.isArray(meta.populate) ? meta.populate : meta.populate.split(",").map((s) => s.trim());
|
|
226
226
|
return query.populate(populateArray);
|
|
227
227
|
}
|
|
228
|
+
function applyAllowedActions(query, meta) {
|
|
229
|
+
if (!meta?.allowedActions?.length) return query;
|
|
230
|
+
return query.allowedActions(meta.allowedActions);
|
|
231
|
+
}
|
|
228
232
|
function isGraphQuery(meta) {
|
|
229
233
|
return !!(meta?.format || meta?.graph_types || meta?.include || meta?.depth);
|
|
230
234
|
}
|
|
@@ -249,7 +253,9 @@ function dataProvider(client) {
|
|
|
249
253
|
const taruviMeta = meta;
|
|
250
254
|
const tableName = getTableName(resource, taruviMeta);
|
|
251
255
|
if (isGraphQuery(taruviMeta)) {
|
|
252
|
-
|
|
256
|
+
let graphQuery = buildGraphQuery(client, tableName, taruviMeta);
|
|
257
|
+
graphQuery = applyAllowedActions(graphQuery, taruviMeta);
|
|
258
|
+
const response2 = await graphQuery.execute();
|
|
253
259
|
const data = Array.isArray(response2) ? response2 : response2?.data ?? [];
|
|
254
260
|
const total = response2?.total ?? data.length;
|
|
255
261
|
return { data, total };
|
|
@@ -260,6 +266,7 @@ function dataProvider(client) {
|
|
|
260
266
|
query = applyPagination(query, pagination);
|
|
261
267
|
query = applyPopulate(query, taruviMeta);
|
|
262
268
|
query = applyAggregations(query, taruviMeta);
|
|
269
|
+
query = applyAllowedActions(query, taruviMeta);
|
|
263
270
|
const response = await query.execute();
|
|
264
271
|
return { data: response.data, total: response.total };
|
|
265
272
|
},
|
|
@@ -954,13 +961,16 @@ function authProvider(client) {
|
|
|
954
961
|
},
|
|
955
962
|
onError: async (error) => {
|
|
956
963
|
const status = error?.statusCode || error?.status || error?.response?.status;
|
|
957
|
-
if (status === 401
|
|
964
|
+
if (status === 401) {
|
|
958
965
|
return {
|
|
959
966
|
logout: true,
|
|
960
967
|
redirectTo: "/login",
|
|
961
968
|
error
|
|
962
969
|
};
|
|
963
970
|
}
|
|
971
|
+
if (status === 403) {
|
|
972
|
+
return { error };
|
|
973
|
+
}
|
|
964
974
|
return { error };
|
|
965
975
|
},
|
|
966
976
|
register: async (params = {}) => {
|
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":";;;;;;AAAA,IAAA,eAAA,GAAA;AAAA,EAEE,OAAA,EAAW,OAmEb,CAAA;;;AC9DO,IAAM,mBAAA,GAA8C;AAAA;AAAA,EAEzD,EAAA,EAAI,EAAA;AAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA;AAAA,EAGJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,GAAA,EAAK,KAAA;AAAA,EACL,GAAA,EAAK,KAAA;AAAA;AAAA,EAGL,QAAA,EAAU,UAAA;AAAA,EACV,SAAA,EAAW,WAAA;AAAA,EACX,UAAA,EAAY,YAAA;AAAA,EACZ,WAAA,EAAa,aAAA;AAAA,EACb,QAAA,EAAU,UAAA;AAAA,EACV,SAAA,EAAW,WAAA;AAAA;AAAA,EAGX,SAAA,EAAW,WAAA;AAAA,EACX,UAAA,EAAY,YAAA;AAAA,EACZ,WAAA,EAAa,aAAA;AAAA,EACb,YAAA,EAAc,cAAA;AAAA,EACd,SAAA,EAAW,WAAA;AAAA,EACX,UAAA,EAAY,YAAA;AAAA;AAAA,EAGZ,EAAA,EAAI,IAAA;AAAA,EACJ,GAAA,EAAK,KAAA;AAAA;AAAA,EAGL,IAAA,EAAM,MAAA;AAAA,EACN,KAAA,EAAO,OAAA;AAAA;AAAA,EAGP,OAAA,EAAS,SAAA;AAAA,EACT,QAAA,EAAU;AACZ;AAMO,SAAS,qBACd,OAAA,EACwB;AACxB,EAAA,IAAI,CAAC,OAAA,IAAW,OAAA,CAAQ,MAAA,KAAW,CAAA,SAAU,EAAC;AAE9C,EAAA,MAAM,SAAiC,EAAC;AAExC,EAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAE5B,IAAA,IACE,cAAc,MAAA,KACb,MAAA,CAAO,aAAa,KAAA,IAAS,MAAA,CAAO,aAAa,IAAA,CAAA,EAClD;AAIA,MAAA,IAAI,OAAO,KAAA,IAAS,KAAA,CAAM,OAAA,CAAQ,MAAA,CAAO,KAAK,CAAA,EAAG;AAC/C,QAAA,MAAM,MAAA,GAAS,oBAAA,CAAqB,MAAA,CAAO,KAAqB,CAAA;AAChE,QAAA,MAAA,CAAO,MAAA,CAAO,QAAQ,MAAM,CAAA;AAAA,MAC9B;AACA,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,OAAA,IAAW,MAAA,IAAU,MAAA,CAAO,KAAA,IAAS,OAAO,QAAA,EAAU;AACxD,MAAA,MAAM,EAAE,KAAA,EAAO,QAAA,EAAU,KAAA,EAAM,GAAI,MAAA;AAGnC,MAAA,IAAI,KAAA,KAAU,MAAA,IAAc,KAAA,KAAU,IAAA,IAAQ,aAAa,MAAA,EAAS;AAClE,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,MAAA,GAAS,oBAAoB,QAAQ,CAAA;AAE3C,MAAA,IAAI,WAAW,MAAA,EAAW;AACxB,QAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,yBAAA,EAA4B,QAAQ,CAAA,CAAE,CAAA;AACnD,QAAA;AAAA,MACF;AAGA,MAAA,MAAM,QAAA,GAAW,SAAS,CAAA,EAAG,KAAK,KAAK,MAAM,CAAA,CAAA,GAAK,OAAO,KAAK,CAAA;AAG9D,MAAA,IAAI,QAAA,KAAa,IAAA,IAAQ,QAAA,KAAa,KAAA,EAAO;AAE3C,QAAA,MAAA,CAAO,QAAQ,CAAA,GAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,GAAI,KAAA,CAAM,IAAA,CAAK,GAAG,CAAA,GAAI,MAAA,CAAO,KAAK,CAAA;AAAA,MAC1E,CAAA,MAAA,IAAW,QAAA,KAAa,SAAA,IAAa,QAAA,KAAa,UAAA,EAAY;AAE5D,QAAA,MAAA,CAAO,QAAQ,CAAA,GAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,GAAI,KAAA,CAAM,IAAA,CAAK,GAAG,CAAA,GAAI,MAAA,CAAO,KAAK,CAAA;AAAA,MAC1E,CAAA,MAAA,IAAW,QAAA,KAAa,MAAA,IAAU,QAAA,KAAa,OAAA,EAAS;AAEtD,QAAA,MAAA,CAAO,QAAQ,CAAA,GAAI,MAAA;AAAA,MACrB,CAAA,MAAO;AACL,QAAA,MAAA,CAAO,QAAQ,CAAA,GAAI,MAAA,CAAO,KAAK,CAAA;AAAA,MACjC;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AAMO,SAAS,qBAAqB,OAAA,EAA0C;AAC7E,EAAA,IAAI,CAAC,OAAA,IAAW,OAAA,CAAQ,MAAA,KAAW,GAAG,OAAO,MAAA;AAE7C,EAAA,OAAO,OAAA,CACJ,GAAA,CAAI,CAAC,IAAA,KAAU,KAAK,KAAA,KAAU,MAAA,GAAS,CAAA,CAAA,EAAI,IAAA,CAAK,KAAK,CAAA,CAAA,GAAK,IAAA,CAAK,KAAM,CAAA,CACrE,KAAK,GAAG,CAAA;AACb;AAKO,SAAS,wBACd,UAAA,EACuC;AACvC,EAAA,IAAI,CAAC,UAAA,EAAY,OAAO,EAAC;AAEzB,EAAA,MAAM,EAAE,WAAA,EAAa,QAAA,EAAU,IAAA,EAAK,GAAI,UAAA;AAGxC,EAAA,IAAI,IAAA,KAAS,KAAA,EAAO,OAAO,EAAC;AAE5B,EAAA,OAAO;AAAA,IACL,MAAM,WAAA,IAAe,CAAA;AAAA;AAAA,IACrB,SAAA,EAAW;AAAA,GACb;AACF;AAKO,SAAS,uBAAuB,OAAA,EAKX;AAC1B,EAAA,MAAM,EAAE,OAAA,EAAS,OAAA,EAAS,UAAA,EAAY,MAAK,GAAI,OAAA;AAE/C,EAAA,MAAM,MAAA,GAAkC;AAAA,IACtC,GAAG,qBAAqB,OAAO,CAAA;AAAA,IAC/B,GAAG,wBAAwB,UAAU;AAAA,GACvC;AAEA,EAAA,MAAM,QAAA,GAAW,qBAAqB,OAAO,CAAA;AAC7C,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,MAAA,CAAO,QAAA,GAAW,QAAA;AAAA,EACpB;AAGA,EAAA,IAAI,MAAM,QAAA,EAAU;AAClB,IAAA,MAAA,CAAO,QAAA,GAAW,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,QAAQ,CAAA,GACzC,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,GAAG,CAAA,GACtB,IAAA,CAAK,QAAA;AAAA,EACX;AAEA,EAAA,OAAO,MAAA;AACT;AAKO,SAAS,iBAAiB,MAAA,EAA0C;AACzE,EAAA,IAAI,CAAC,UAAU,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,CAAE,MAAA,KAAW,GAAG,OAAO,EAAA;AAExD,EAAA,MAAM,YAAA,GAAe,IAAI,eAAA,EAAgB;AAEzC,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,EAAG;AACjD,IAAA,IAAI,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,IAAA,EAAM;AACzC,MAAA,YAAA,CAAa,MAAA,CAAO,GAAA,EAAK,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,IACxC;AAAA,EACF;AAEA,EAAA,MAAM,WAAA,GAAc,aAAa,QAAA,EAAS;AAC1C,EAAA,OAAO,WAAA,GAAc,CAAA,CAAA,EAAI,WAAW,CAAA,CAAA,GAAK,EAAA;AAC3C;AA6BO,SAAS,aAAa,MAAA,EAA2C;AACtE,EAAA,IAAI,CAAC,MAAA,IAAU,MAAA,CAAO,MAAA,KAAW,GAAG,OAAO,MAAA;AAE3C,EAAA,MAAM,SAAmB,EAAC;AAE1B,EAAA,KAAA,MAAW,UAAU,MAAA,EAAQ;AAE3B,IAAA,IAAI,OAAA,IAAW,MAAA,IAAU,MAAA,CAAO,KAAA,IAAS,OAAO,QAAA,EAAU;AACxD,MAAA,MAAM,EAAE,KAAA,EAAO,QAAA,EAAU,KAAA,EAAM,GAAI,MAAA;AAGnC,MAAA,IAAI,KAAA,KAAU,MAAA,IAAc,KAAA,KAAU,IAAA,IAAQ,aAAa,MAAA,EAAS;AAClE,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,MAAA,GAAS,oBAAoB,QAAQ,CAAA;AAE3C,MAAA,IAAI,WAAW,MAAA,EAAW;AACxB,QAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,mCAAA,EAAsC,QAAQ,CAAA,CAAE,CAAA;AAC7D,QAAA;AAAA,MACF;AAGA,MAAA,MAAM,QAAA,GAAW,SAAS,CAAA,EAAG,KAAK,KAAK,MAAM,CAAA,CAAA,GAAK,OAAO,KAAK,CAAA;AAG9D,MAAA,IAAI,UAAA;AACJ,MAAA,IAAI,QAAA,KAAa,IAAA,IAAQ,QAAA,KAAa,KAAA,EAAO;AAC3C,QAAA,UAAA,GAAa,KAAA,CAAM,QAAQ,KAAK,CAAA,GAAI,MAAM,IAAA,CAAK,GAAG,CAAA,GAAI,MAAA,CAAO,KAAK,CAAA;AAAA,MACpE,CAAA,MAAA,IAAW,QAAA,KAAa,SAAA,IAAa,QAAA,KAAa,UAAA,EAAY;AAC5D,QAAA,UAAA,GAAa,KAAA,CAAM,QAAQ,KAAK,CAAA,GAAI,MAAM,IAAA,CAAK,GAAG,CAAA,GAAI,MAAA,CAAO,KAAK,CAAA;AAAA,MACpE,CAAA,MAAA,IAAW,QAAA,KAAa,MAAA,IAAU,QAAA,KAAa,OAAA,EAAS;AACtD,QAAA,UAAA,GAAa,MAAA;AAAA,MACf,CAAA,MAAO;AACL,QAAA,UAAA,GAAa,OAAO,KAAK,CAAA;AAAA,MAC3B;AAEA,MAAA,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,UAAU,CAAA,CAAE,CAAA;AAAA,IACzC;AAAA,EACF;AAEA,EAAA,OAAO,OAAO,MAAA,GAAS,CAAA,GAAI,MAAA,CAAO,IAAA,CAAK,GAAG,CAAA,GAAI,MAAA;AAChD;AAKO,SAAS,YAAY,KAAA,EAAuB;AACjD,EAAA,IAAI,iBAAiB,KAAA,EAAO;AAC1B,IAAA,MAAM,KAAA;AAAA,EACR;AACA,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,KAAU,IAAA,IAAQ,aAAa,KAAA,EAAO;AACrE,IAAA,MAAM,IAAI,KAAA,CAAM,MAAA,CAAQ,KAAA,CAA+B,OAAO,CAAC,CAAA;AAAA,EACjE;AACA,EAAA,MAAM,IAAI,MAAM,wBAAwB,CAAA;AAC1C;;;ACjPA,SAAS,iBAAA,CAAqB,OAAoB,IAAA,EAAgC;AAChF,EAAA,IAAI,CAAC,MAAM,OAAO,KAAA;AAElB,EAAA,IAAI,MAAA,GAAS,KAAA;AAEb,EAAA,IAAI,IAAA,CAAK,WAAW,MAAA,EAAQ;AAC1B,IAAA,MAAA,GAAS,MAAA,CAAO,SAAA,CAAU,GAAG,IAAA,CAAK,SAAS,CAAA;AAAA,EAC7C;AAEA,EAAA,IAAI,IAAA,CAAK,SAAS,MAAA,EAAQ;AACxB,IAAA,MAAA,GAAS,MAAA,CAAO,OAAA,CAAQ,GAAG,IAAA,CAAK,OAAO,CAAA;AAAA,EACzC;AAEA,EAAA,MAAM,SAAA,GAAY,YAAA,CAAa,IAAA,CAAK,MAAM,CAAA;AAC1C,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,MAAA,GAAS,MAAA,CAAO,OAAO,SAAS,CAAA;AAAA,EAClC;AAEA,EAAA,OAAO,MAAA;AACT;AAKA,SAAS,YAAA,CACP,OACA,OAAA,EACa;AACb,EAAA,IAAI,CAAC,OAAA,IAAW,OAAA,CAAQ,MAAA,KAAW,GAAG,OAAO,KAAA;AAE7C,EAAA,IAAI,MAAA,GAAS,KAAA;AAEb,EAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,IAAA,IAAI,cAAc,MAAA,KAAW,MAAA,CAAO,aAAa,KAAA,IAAS,MAAA,CAAO,aAAa,IAAA,CAAA,EAAO;AACnF,MAAA,IAAI,OAAO,KAAA,IAAS,KAAA,CAAM,OAAA,CAAQ,MAAA,CAAO,KAAK,CAAA,EAAG;AAC/C,QAAA,MAAA,GAAS,YAAA,CAAa,MAAA,EAAQ,MAAA,CAAO,KAAqB,CAAA;AAAA,MAC5D;AACA,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,OAAA,IAAW,MAAA,IAAU,MAAA,CAAO,KAAA,IAAS,OAAO,QAAA,EAAU;AACxD,MAAA,MAAM,EAAE,KAAA,EAAO,QAAA,EAAU,KAAA,EAAM,GAAI,MAAA;AAEnC,MAAA,IAAI,KAAA,KAAU,MAAA,IAAc,KAAA,KAAU,IAAA,IAAQ,aAAa,MAAA,EAAS;AAEpE,MAAA,MAAM,MAAA,GAAS,oBAAoB,QAAQ,CAAA;AAC3C,MAAA,IAAI,WAAW,MAAA,EAAW;AACxB,QAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,yBAAA,EAA4B,QAAQ,CAAA,CAAE,CAAA;AACnD,QAAA;AAAA,MACF;AAGA,MAAA,MAAM,QAAA,GAAW,SAAS,CAAA,EAAG,KAAK,KAAK,MAAM,CAAA,CAAA,GAAK,OAAO,KAAK,CAAA;AAE9D,MAAA,IAAI,UAAA;AACJ,MAAA,IAAI,aAAa,IAAA,IAAQ,QAAA,KAAa,SAAS,QAAA,KAAa,SAAA,IAAa,aAAa,UAAA,EAAY;AAChG,QAAA,UAAA,GAAa,KAAA,CAAM,QAAQ,KAAK,CAAA,GAAI,MAAM,IAAA,CAAK,GAAG,CAAA,GAAI,MAAA,CAAO,KAAK,CAAA;AAAA,MACpE,CAAA,MAAA,IAAW,QAAA,KAAa,MAAA,IAAU,QAAA,KAAa,OAAA,EAAS;AACtD,QAAA,UAAA,GAAa,MAAA;AAAA,MACf,CAAA,MAAO;AACL,QAAA,UAAA,GAAa,OAAO,KAAK,CAAA;AAAA,MAC3B;AAGA,MAAA,MAAA,GAAS,MAAA,CAAO,MAAA,CAAO,QAAA,EAAU,IAAA,EAAM,UAAU,CAAA;AAAA,IACnD;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AAKA,SAAS,YAAA,CACP,OACA,OAAA,EACa;AACb,EAAA,IAAI,CAAC,OAAA,IAAW,OAAA,CAAQ,MAAA,KAAW,GAAG,OAAO,KAAA;AAE7C,EAAA,IAAI,MAAA,GAAS,KAAA;AACb,EAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,IAAA,MAAA,GAAS,MAAA,CAAO,KAAK,MAAA,CAAO,KAAA,EAAO,OAAO,KAAA,KAAU,MAAA,GAAS,SAAS,KAAK,CAAA;AAAA,EAC7E;AACA,EAAA,OAAO,MAAA;AACT;AAKA,SAAS,eAAA,CACP,OACA,UAAA,EACa;AACb,EAAA,IAAI,CAAC,UAAA,IAAc,UAAA,CAAW,IAAA,KAAS,OAAO,OAAO,KAAA;AAErD,EAAA,IAAI,MAAA,GAAS,KAAA;AACb,EAAA,IAAI,WAAW,WAAA,EAAa,MAAA,GAAS,MAAA,CAAO,IAAA,CAAK,WAAW,WAAW,CAAA;AACvE,EAAA,IAAI,WAAW,QAAA,EAAU,MAAA,GAAS,MAAA,CAAO,QAAA,CAAS,WAAW,QAAQ,CAAA;AACrE,EAAA,OAAO,MAAA;AACT;AAKA,SAAS,aAAA,CACP,OACA,IAAA,EACa;AACb,EAAA,IAAI,CAAC,IAAA,EAAM,QAAA,EAAU,OAAO,KAAA;AAE5B,EAAA,MAAM,gBAAgB,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,QAAQ,IAC7C,IAAA,CAAK,QAAA,GACL,IAAA,CAAK,QAAA,CAAS,MAAM,GAAG,CAAA,CAAE,IAAI,CAAA,CAAA,KAAK,CAAA,CAAE,MAAM,CAAA;AAE9C,EAAA,OAAO,KAAA,CAAM,SAAS,aAAa,CAAA;AACrC;AAKA,SAAS,aAAa,IAAA,EAA4B;AAChD,EAAA,OAAO,CAAC,EAAE,IAAA,EAAM,MAAA,IAAU,MAAM,WAAA,IAAe,IAAA,EAAM,WAAW,IAAA,EAAM,KAAA,CAAA;AACxE;AAKA,SAAS,eAAA,CAAmB,MAAA,EAAgB,SAAA,EAAmB,IAAA,EAAmB,QAAA,EAAgC;AAChH,EAAA,IAAI,QAAQ,IAAI,QAAA,CAAS,MAAM,CAAA,CAAE,KAAQ,SAAS,CAAA;AAElD,EAAA,IAAI,QAAA,EAAU,KAAA,GAAQ,KAAA,CAAM,GAAA,CAAI,QAAQ,CAAA;AACxC,EAAA,IAAI,MAAM,MAAA,EAAQ,KAAA,GAAQ,KAAA,CAAM,MAAA,CAAO,KAAK,MAAM,CAAA;AAClD,EAAA,IAAI,MAAM,OAAA,EAAS,KAAA,GAAQ,KAAA,CAAM,OAAA,CAAQ,KAAK,OAAO,CAAA;AACrD,EAAA,IAAI,MAAM,KAAA,EAAO,KAAA,GAAQ,KAAA,CAAM,KAAA,CAAM,KAAK,KAAK,CAAA;AAC/C,EAAA,IAAI,MAAM,WAAA,EAAa,KAAA,GAAQ,KAAA,CAAM,KAAA,CAAM,KAAK,WAAW,CAAA;AAE3D,EAAA,OAAO,KAAA;AACT;AAKO,SAAS,aAAa,MAAA,EAA8B;AACzD,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,wBAAA,EAA2B,eAAA,CAAI,OAAO,CAAA,YAAA,CAAc,CAAA;AAChE,EAAA,MAAM,MAAA,GAAS,OAAO,SAAA,EAAU;AAChC,EAAA,MAAM,aAAa,CAAA,EAAG,MAAA,CAAO,MAAM,CAAA,UAAA,EAAa,OAAO,OAAO,CAAA,CAAA;AAE9D,EAAA,MAAM,WAAA,GAAc,CAAC,IAAA,KAAsB,IAAA,EAAM,YAAA,IAAgB,IAAA;AACjE,EAAA,MAAM,YAAA,GAAe,CAAC,QAAA,EAAkB,IAAA,KAAsB,MAAM,SAAA,IAAa,QAAA;AAEjF,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,OACP,MAAA,KACoC;AACpC,MAAA,MAAM,EAAE,QAAA,EAAU,UAAA,EAAY,OAAA,EAAS,OAAA,EAAS,MAAK,GAAI,MAAA;AACzD,MAAA,MAAM,UAAA,GAAa,IAAA;AACnB,MAAA,MAAM,SAAA,GAAY,YAAA,CAAa,QAAA,EAAU,UAAU,CAAA;AAEnD,MAAA,IAAI,YAAA,CAAa,UAAU,CAAA,EAAG;AAC5B,QAAA,MAAMA,YAAW,MAAM,eAAA,CAAuB,QAAQ,SAAA,EAAW,UAAU,EAAE,OAAA,EAAQ;AACrF,QAAA,MAAM,IAAA,GAAO,MAAM,OAAA,CAAQA,SAAQ,IAAIA,SAAAA,GAAYA,SAAAA,EAAkB,QAAQ,EAAC;AAC9E,QAAA,MAAM,KAAA,GAASA,SAAAA,EAAkB,KAAA,IAAS,IAAA,CAAK,MAAA;AAC/C,QAAA,OAAO,EAAE,MAAuB,KAAA,EAAM;AAAA,MACxC;AAEA,MAAA,IAAI,QAAQ,IAAI,QAAA,CAAS,MAAM,CAAA,CAAE,KAAK,SAAS,CAAA;AAC/C,MAAA,KAAA,GAAQ,YAAA,CAAa,OAAO,OAAO,CAAA;AACnC,MAAA,KAAA,GAAQ,YAAA,CAAa,OAAO,OAAO,CAAA;AACnC,MAAA,KAAA,GAAQ,eAAA,CAAgB,OAAO,UAAU,CAAA;AACzC,MAAA,KAAA,GAAQ,aAAA,CAAc,OAAO,UAAU,CAAA;AACvC,MAAA,KAAA,GAAQ,iBAAA,CAAkB,OAAO,UAAU,CAAA;AAE3C,MAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,OAAA,EAAQ;AACrC,MAAA,OAAO,EAAE,IAAA,EAAM,QAAA,CAAS,IAAA,EAAM,KAAA,EAAO,SAAS,KAAA,EAAM;AAAA,IACtD,CAAA;AAAA,IAEA,MAAA,EAAQ,OACN,MAAA,KACmC;AACnC,MAAA,MAAM,EAAE,QAAA,EAAU,EAAA,EAAI,IAAA,EAAK,GAAI,MAAA;AAC/B,MAAA,MAAM,UAAA,GAAa,IAAA;AACnB,MAAA,MAAM,SAAA,GAAY,YAAA,CAAa,QAAA,EAAU,UAAU,CAAA;AAEnD,MAAA,IAAI,YAAA,CAAa,UAAU,CAAA,EAAG;AAC5B,QAAA,MAAMA,SAAAA,GAAW,MAAM,eAAA,CAAuB,MAAA,EAAQ,SAAA,EAAW,YAAY,MAAA,CAAO,EAAE,CAAC,CAAA,CAAE,OAAA,EAAQ;AACjG,QAAA,MAAM,IAAA,GAAO,KAAA,CAAM,OAAA,CAAQA,SAAQ,CAAA,GAAIA,SAAAA,CAAS,CAAC,CAAA,GAAaA,SAAAA,EAAU,IAAA,GAAO,CAAC,CAAA,IAAKA,SAAAA;AACrF,QAAA,OAAO,EAAE,IAAA,EAAK;AAAA,MAChB;AAEA,MAAA,IAAI,KAAA,GAAQ,IAAI,QAAA,CAAS,MAAM,CAAA,CAAE,IAAA,CAAK,SAAS,CAAA,CAAE,GAAA,CAAI,MAAA,CAAO,EAAE,CAAC,CAAA;AAC/D,MAAA,KAAA,GAAQ,aAAA,CAAc,OAAO,UAAU,CAAA;AACvC,MAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,OAAA,EAAQ;AACrC,MAAA,OAAO,EAAE,IAAA,EAAM,QAAA,CAAS,IAAA,EAAK;AAAA,IAC/B,CAAA;AAAA,IAEA,OAAA,EAAS,OACP,MAAA,KACoC;AACpC,MAAA,MAAM,EAAE,QAAA,EAAU,GAAA,EAAK,IAAA,EAAK,GAAI,MAAA;AAChC,MAAA,MAAM,UAAA,GAAa,IAAA;AACnB,MAAA,MAAM,SAAA,GAAY,YAAA,CAAa,QAAA,EAAU,UAAU,CAAA;AAEnD,MAAA,IAAI,YAAA,CAAa,UAAU,CAAA,EAAG;AAC5B,QAAA,MAAM,IAAA,GAAO,MAAM,OAAA,CAAQ,GAAA;AAAA,UACzB,GAAA,CAAI,GAAA,CAAI,OAAM,EAAA,KAAM;AAClB,YAAA,MAAMA,SAAAA,GAAW,MAAM,eAAA,CAAuB,MAAA,EAAQ,SAAA,EAAW,YAAY,MAAA,CAAO,EAAE,CAAC,CAAA,CAAE,OAAA,EAAQ;AACjG,YAAA,OAAO,KAAA,CAAM,OAAA,CAAQA,SAAQ,CAAA,GAAIA,SAAAA,CAAS,CAAC,CAAA,GAAaA,SAAAA,EAAU,IAAA,GAAO,CAAC,CAAA,IAAKA,SAAAA;AAAA,UACjF,CAAC;AAAA,SACH;AACA,QAAA,OAAO,EAAE,IAAA,EAAK;AAAA,MAChB;AAEA,MAAA,MAAM,QAAA,GAAW,YAAY,UAAU,CAAA;AACvC,MAAA,IAAI,QAAQ,IAAI,QAAA,CAAS,MAAM,CAAA,CAAE,KAAK,SAAS,CAAA;AAC/C,MAAA,KAAA,GAAQ,MAAM,MAAA,CAAO,QAAA,EAAU,MAAM,GAAA,CAAI,GAAA,CAAI,MAAM,CAAC,CAAA;AACpD,MAAA,KAAA,GAAQ,aAAA,CAAc,OAAO,UAAU,CAAA;AACvC,MAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,OAAA,EAAQ;AACrC,MAAA,OAAO,EAAE,IAAA,EAAM,QAAA,CAAS,IAAA,EAAK;AAAA,IAC/B,CAAA;AAAA,IAEA,MAAA,EAAQ,OACN,MAAA,KACmC;AACnC,MAAA,MAAM,EAAE,QAAA,EAAU,SAAA,EAAW,IAAA,EAAK,GAAI,MAAA;AACtC,MAAA,MAAM,UAAA,GAAa,IAAA;AACnB,MAAA,MAAM,SAAA,GAAY,YAAA,CAAa,QAAA,EAAU,UAAU,CAAA;AAEnD,MAAA,IAAI,YAAA,CAAa,UAAU,CAAA,EAAG;AAC5B,QAAA,MAAMA,SAAAA,GAAW,MAAM,IAAI,QAAA,CAAS,MAAM,CAAA,CACvC,IAAA,CAAK,SAAS,CAAA,CACd,KAAA,EAAM,CACN,MAAA,CAAO,SAA0B,EACjC,OAAA,EAAQ;AACX,QAAA,OAAO,EAAE,IAAA,EAAMA,SAAAA,CAAS,IAAA,EAAK;AAAA,MAC/B;AAEA,MAAA,MAAM,KAAK,IAAI,QAAA,CAAS,MAAM,CAAA,CAAE,KAAK,SAAS,CAAA;AAC9C,MAAA,MAAM,KAAA,GAAQ,YAAY,MAAA,GACtB,EAAA,CAAG,OAAO,SAAmB,CAAA,GAC7B,EAAA,CAAG,MAAA,CAAO,SAAmB,CAAA;AACjC,MAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,OAAA,EAAQ;AACrC,MAAA,OAAO,EAAE,IAAA,EAAM,QAAA,CAAS,IAAA,EAAK;AAAA,IAC/B,CAAA;AAAA,IAEA,UAAA,EAAY,OACV,MAAA,KACuC;AACvC,MAAA,MAAM,EAAE,QAAA,EAAU,SAAA,EAAW,IAAA,EAAK,GAAI,MAAA;AACtC,MAAA,MAAM,UAAA,GAAa,IAAA;AACnB,MAAA,MAAM,SAAA,GAAY,YAAA,CAAa,QAAA,EAAU,UAAU,CAAA;AAEnD,MAAA,MAAM,IAAA,GAAO,MAAM,OAAA,CAAQ,GAAA;AAAA,QACzB,SAAA,CAAU,GAAA,CAAI,OAAO,IAAA,KAAS;AAC5B,UAAA,MAAM,QAAA,GAAW,MAAM,IAAI,QAAA,CAAS,MAAM,CAAA,CACvC,IAAA,CAAK,SAAS,CAAA,CACd,MAAA,CAAO,IAAc,CAAA,CACrB,OAAA,EAAQ;AACX,UAAA,OAAO,QAAA,CAAS,IAAA;AAAA,QAClB,CAAC;AAAA,OACH;AAEA,MAAA,OAAO,EAAE,IAAA,EAAK;AAAA,IAChB,CAAA;AAAA,IAEA,MAAA,EAAQ,OACN,MAAA,KACmC;AACnC,MAAA,MAAM,EAAE,QAAA,EAAU,EAAA,EAAI,SAAA,EAAW,MAAK,GAAI,MAAA;AAC1C,MAAA,MAAM,UAAA,GAAa,IAAA;AACnB,MAAA,MAAM,SAAA,GAAY,YAAA,CAAa,QAAA,EAAU,UAAU,CAAA;AAEnD,MAAA,IAAI,YAAA,CAAa,UAAU,CAAA,EAAG;AAC5B,QAAA,MAAMA,YAAW,MAAM,IAAI,SAAS,MAAM,CAAA,CACvC,KAAK,SAAS,CAAA,CACd,OAAM,CACN,GAAA,CAAI,OAAO,EAAE,CAAC,EACd,MAAA,CAAO,SAAwB,EAC/B,OAAA,EAAQ;AACX,QAAA,OAAO,EAAE,IAAA,EAAMA,SAAAA,CAAS,IAAA,EAAK;AAAA,MAC/B;AAEA,MAAA,MAAM,WAAW,MAAM,IAAI,QAAA,CAAS,MAAM,EACvC,IAAA,CAAK,SAAS,CAAA,CACd,GAAA,CAAI,OAAO,EAAE,CAAC,EACd,MAAA,CAAO,SAAmB,EAC1B,OAAA,EAAQ;AACX,MAAA,OAAO,EAAE,IAAA,EAAM,QAAA,CAAS,IAAA,EAAK;AAAA,IAC/B,CAAA;AAAA,IAEA,UAAA,EAAY,OACV,MAAA,KACuC;AACvC,MAAA,MAAM,EAAE,QAAA,EAAU,GAAA,EAAK,SAAA,EAAW,MAAK,GAAI,MAAA;AAC3C,MAAA,MAAM,UAAA,GAAa,IAAA;AACnB,MAAA,MAAM,SAAA,GAAY,YAAA,CAAa,QAAA,EAAU,UAAU,CAAA;AACnD,MAAA,MAAM,QAAA,GAAW,YAAY,UAAU,CAAA;AAEvC,MAAA,MAAM,IAAA,GAAO,GAAA,CAAI,GAAA,CAAI,CAAA,EAAA,MAAO,EAAE,CAAC,QAAQ,GAAG,EAAA,EAAI,GAAI,SAAA,EAAqB,CAAE,CAAA;AACzE,MAAA,MAAM,QAAA,GAAW,MAAM,IAAI,QAAA,CAAS,MAAM,CAAA,CACvC,IAAA,CAAK,SAAS,CAAA,CACd,UAAA,CAAW,IAAI,CAAA,CACf,OAAA,EAAQ;AACX,MAAA,OAAO,EAAE,IAAA,EAAM,QAAA,CAAS,IAAA,EAAK;AAAA,IAC/B,CAAA;AAAA,IAEA,SAAA,EAAW,OACT,MAAA,KACsC;AACtC,MAAA,MAAM,EAAE,QAAA,EAAU,EAAA,EAAI,IAAA,EAAK,GAAI,MAAA;AAC/B,MAAA,MAAM,UAAA,GAAa,IAAA;AACnB,MAAA,MAAM,SAAA,GAAY,YAAA,CAAa,QAAA,EAAU,UAAU,CAAA;AAEnD,MAAA,IAAI,YAAA,CAAa,UAAU,CAAA,EAAG;AAC5B,QAAA,MAAM,WAAW,MAAM,IAAI,SAAS,MAAM,CAAA,CACvC,KAAK,SAAS,CAAA,CACd,KAAA,EAAM,CACN,OAAO,CAAC,MAAA,CAAO,EAAE,CAAC,CAAC,EACnB,OAAA,EAAQ;AACX,QAAA,OAAO,EAAE,IAAA,EAAM,QAAA,CAAS,IAAA,EAAK;AAAA,MAC/B;AAEA,MAAA,MAAM,IAAI,QAAA,CAAS,MAAM,CAAA,CACtB,IAAA,CAAK,SAAS,CAAA,CACd,MAAA,CAAO,MAAA,CAAO,EAAE,CAAC,CAAA,CACjB,OAAA,EAAQ;AACX,MAAA,OAAO,EAAE,IAAA,EAAM,EAAE,EAAA,EAAG,EAAsB;AAAA,IAC5C,CAAA;AAAA,IAEA,UAAA,EAAY,OACV,MAAA,KACuC;AACvC,MAAA,MAAM,EAAE,QAAA,EAAU,GAAA,EAAK,IAAA,EAAK,GAAI,MAAA;AAChC,MAAA,MAAM,UAAA,GAAa,IAAA;AACnB,MAAA,MAAM,SAAA,GAAY,YAAA,CAAa,QAAA,EAAU,UAAU,CAAA;AAEnD,MAAA,IAAI,YAAA,CAAa,UAAU,CAAA,EAAG;AAC5B,QAAA,MAAM,WAAW,MAAM,IAAI,QAAA,CAAS,MAAM,EACvC,IAAA,CAAK,SAAS,CAAA,CACd,KAAA,GACA,MAAA,CAAO,GAAA,CAAI,IAAI,MAAM,CAAC,EACtB,OAAA,EAAQ;AACX,QAAA,OAAO,EAAE,IAAA,EAAM,CAAC,QAAA,CAAS,IAAI,CAAA,EAAE;AAAA,MACjC;AAEA,MAAA,IAAI,UAAA,EAAY,cAAA,IAAkB,UAAA,EAAY,OAAA,EAAS;AACrD,QAAA,IAAI,QAAQ,IAAI,QAAA,CAAS,MAAM,CAAA,CAAE,KAAK,SAAS,CAAA;AAC/C,QAAA,KAAA,GAAQ,YAAA,CAAa,KAAA,EAAO,UAAA,CAAW,OAAuB,CAAA;AAC9D,QAAA,MAAM,KAAA,CAAM,cAAA,EAAe,CAAE,OAAA,EAAQ;AACrC,QAAA,OAAO,EAAE,MAAM,GAAA,CAAI,GAAA,CAAI,SAAO,EAAE,EAAA,GAAyB,CAAA,EAAE;AAAA,MAC7D;AAEA,MAAA,MAAM,IAAI,QAAA,CAAS,MAAM,CAAA,CACtB,IAAA,CAAK,SAAS,CAAA,CACd,UAAA,CAAW,GAAA,CAAI,GAAA,CAAI,MAAM,CAAC,EAC1B,OAAA,EAAQ;AACX,MAAA,OAAO,EAAE,MAAM,GAAA,CAAI,GAAA,CAAI,SAAO,EAAE,EAAA,GAAyB,CAAA,EAAE;AAAA,IAC7D,CAAA;AAAA,IAEA,MAAA,EAAQ,OACN,MAAA,KACmC;AACnC,MAAA,MAAM,EAAE,GAAA,EAAK,MAAA,EAAQ,OAAA,EAAS,OAAM,GAAI,MAAA;AACxC,MAAA,IAAI,QAAA,GAAW,CAAA,SAAA,EAAY,MAAA,CAAO,OAAO,eAAe,GAAG,CAAA,CAAA;AAE3D,MAAA,IAAI,IAAA;AACJ,MAAA,QAAQ,MAAA,CAAO,aAAY;AAAG,QAC5B,KAAK,KAAA,EAAO;AACV,UAAA,IAAI,SAAS,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA,CAAE,SAAS,CAAA,EAAG;AAC1C,YAAA,MAAM,WAAA,GAAc,IAAI,eAAA,CAAgB,KAA+B,EAAE,QAAA,EAAS;AAClF,YAAA,QAAA,GAAW,CAAA,EAAG,QAAQ,CAAA,EAAG,QAAA,CAAS,QAAA,CAAS,GAAG,CAAA,GAAI,GAAA,GAAM,GAAG,CAAA,EAAG,WAAW,CAAA,CAAA;AAAA,UAC3E;AACA,UAAA,IAAA,GAAO,MAAM,MAAA,CAAO,UAAA,CAAW,GAAA,CAAI,QAAQ,CAAA;AAC3C,UAAA;AAAA,QACF;AAAA,QACA,KAAK,MAAA;AACH,UAAA,IAAA,GAAO,MAAM,MAAA,CAAO,UAAA,CAAW,IAAA,CAAK,UAAU,OAAO,CAAA;AACrD,UAAA;AAAA,QACF,KAAK,KAAA;AACH,UAAA,IAAA,GAAO,MAAM,MAAA,CAAO,UAAA,CAAW,GAAA,CAAI,UAAU,OAAO,CAAA;AACpD,UAAA;AAAA,QACF,KAAK,OAAA;AACH,UAAA,IAAA,GAAO,MAAM,MAAA,CAAO,UAAA,CAAW,KAAA,CAAM,UAAU,OAAO,CAAA;AACtD,UAAA;AAAA,QACF,KAAK,QAAA;AACH,UAAA,IAAA,GAAO,MAAM,MAAA,CAAO,UAAA,CAAW,MAAA,CAAO,QAAQ,CAAA;AAC9C,UAAA;AAAA,QACF;AACE,UAAA,MAAM,IAAI,KAAA,CAAM,CAAA,yBAAA,EAA4B,MAAM,CAAA,CAAE,CAAA;AAAA;AAGxD,MAAA,OAAO,EAAE,IAAA,EAAK;AAAA,IAChB,CAAA;AAAA,IAEA,WAAW,MAAM;AAAA,GACnB;AACF;ACzYO,SAAS,oBAAoB,MAAA,EAA8B;AAChE,EAAA,MAAM,MAAA,GAAS,OAAO,SAAA,EAAU;AAChC,EAAA,MAAM,aAAa,CAAA,EAAG,MAAA,CAAO,MAAM,CAAA,UAAA,EAAa,OAAO,OAAO,CAAA,CAAA;AAE9D,EAAA,MAAM,aAAA,GAAgB,CAAC,QAAA,EAAkB,IAAA,KAAsB,MAAM,UAAA,IAAc,QAAA;AAEnF,EAAA,MAAM,YAAA,GAAe,CAAC,MAAA,KAKA;AACpB,IAAA,MAAM,OAAA,GAA0B;AAAA,MAC9B,GAAG,oBAAA,CAAqB,MAAA,CAAO,OAAO,CAAA;AAAA,MACtC,GAAG,uBAAA,CAAwB,MAAA,CAAO,UAAU;AAAA,KAC9C;AAEA,IAAA,MAAM,QAAA,GAAW,oBAAA,CAAqB,MAAA,CAAO,OAAO,CAAA;AACpD,IAAA,IAAI,QAAA,UAAkB,QAAA,GAAW,QAAA;AAEjC,IAAA,OAAO,OAAA;AAAA,EACT,CAAA;AAEA,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,OACP,MAAA,KACoC;AACpC,MAAA,MAAM,EAAE,QAAA,EAAU,UAAA,EAAY,OAAA,EAAS,OAAA,EAAS,MAAK,GAAI,MAAA;AACzD,MAAA,MAAM,UAAA,GAAa,IAAA;AACnB,MAAA,MAAM,MAAA,GAAS,aAAA,CAAc,QAAA,EAAU,UAAU,CAAA;AACjD,MAAA,MAAM,cAAA,GAAiB,aAAa,EAAE,OAAA,EAAS,SAAS,UAA6B,CAAC,CAAA;AAEtF,MAAA,MAAM,QAAA,GAAW,MAAM,IAAI,OAAA,CAAQ,MAAM,CAAA,CACtC,IAAA,CAAK,MAAM,CAAA,CACX,MAAA,CAAO,cAAc,CAAA,CACrB,OAAA,EAAQ;AAEX,MAAA,OAAO,EAAE,IAAA,EAAM,QAAA,CAAS,IAAA,EAAM,KAAA,EAAO,SAAS,KAAA,EAAM;AAAA,IACtD,CAAA;AAAA,IAEA,MAAA,EAAQ,OACN,MAAA,KACmC;AACnC,MAAA,MAAM,EAAE,QAAA,EAAU,EAAA,EAAI,IAAA,EAAM,MAAK,GAAI,MAAA;AACrC,MAAA,MAAM,UAAA,GAAa,IAAA;AACnB,MAAA,MAAM,MAAA,GAAS,aAAA,CAAc,QAAA,EAAU,UAAU,CAAA;AAEjD,MAAA,IAAI,YAAY,QAAA,EAAU;AACxB,QAAA,MAAM,QAAA,GAAW,MAAM,IAAI,OAAA,CAAQ,MAAM,CAAA,CACtC,IAAA,CAAK,MAAM,CAAA,CACX,QAAA,CAAS,MAAA,CAAO,IAAI,CAAC,EACrB,OAAA,EAAQ;AACX,QAAA,OAAO,EAAE,IAAA,EAAM,QAAA,CAAS,IAAA,EAAK;AAAA,MAC/B;AAEA,MAAA,MAAM,IAAA,GAAO,MAAM,IAAI,OAAA,CAAQ,MAAM,CAAA,CAClC,IAAA,CAAK,MAAM,CAAA,CACX,QAAA,CAAS,MAAA,CAAO,IAAI,CAAC,EACrB,OAAA,EAAc;AACjB,MAAA,OAAO,EAAE,MAAM,IAAA,EAAyB;AAAA,IAC1C,CAAA;AAAA,IAEA,MAAA,EAAQ,OACN,MAAA,KACmC;AACnC,MAAA,MAAM,EAAE,QAAA,EAAU,SAAA,EAAW,IAAA,EAAK,GAAI,MAAA;AACtC,MAAA,MAAM,UAAA,GAAa,IAAA;AACnB,MAAA,MAAM,MAAA,GAAS,aAAA,CAAc,QAAA,EAAU,UAAU,CAAA;AACjD,MAAA,MAAM,EAAE,OAAO,KAAA,GAAQ,IAAI,SAAA,GAAY,IAAG,GAAI,SAAA;AAE9C,MAAA,MAAM,SAAA,GAAY,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,EAAM,MAAM,KAAA,CAAM,CAAC,CAAA,IAAK,IAAA,CAAK,IAAI,CAAA;AAC9D,MAAA,MAAM,aAAA,GAAgB,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,EAAG,MAAM,SAAA,CAAU,CAAC,CAAA,IAAK,EAAE,CAAA;AAE5D,MAAA,MAAM,WAAW,MAAM,IAAI,QAAQ,MAAM,CAAA,CACtC,KAAK,MAAM,CAAA,CACX,MAAA,CAAO,EAAE,OAAO,KAAA,EAAO,SAAA,EAAW,WAAW,aAAA,EAAe,EAC5D,OAAA,EAAQ;AAGX,MAAA,MAAM,aAAA,GAAgB,QAAA,CAAS,IAAA,EAAM,UAAA,GAAa,CAAC,CAAA,EAAG,MAAA;AACtD,MAAA,OAAO,EAAE,IAAA,EAAO,aAAA,IAAiB,QAAA,CAAS,IAAA,EAA0B;AAAA,IACtE,CAAA;AAAA,IAEA,MAAA,EAAQ,OACN,MAAA,KACmC;AACnC,MAAA,MAAM,EAAE,QAAA,EAAU,EAAA,EAAI,IAAA,EAAM,SAAA,EAAW,MAAK,GAAI,MAAA;AAChD,MAAA,MAAM,UAAA,GAAa,IAAA;AACnB,MAAA,MAAM,MAAA,GAAS,aAAA,CAAc,QAAA,EAAU,UAAU,CAAA;AAEjD,MAAA,MAAM,QAAA,GAAW,MAAM,IAAI,OAAA,CAAQ,MAAM,CAAA,CACtC,IAAA,CAAK,MAAM,CAAA,CACX,OAAO,MAAA,CAAO,IAAI,CAAA,EAAG,SAAmB,EACxC,OAAA,EAAQ;AAEX,MAAA,OAAO,EAAE,IAAA,EAAM,QAAA,CAAS,IAAA,EAAK;AAAA,IAC/B,CAAA;AAAA,IAEA,SAAA,EAAW,OACT,MAAA,KACsC;AACtC,MAAA,MAAM,EAAE,QAAA,EAAU,EAAA,EAAI,IAAA,EAAM,MAAK,GAAI,MAAA;AACrC,MAAA,MAAM,UAAA,GAAa,IAAA;AACnB,MAAA,MAAM,MAAA,GAAS,aAAA,CAAc,QAAA,EAAU,UAAU,CAAA;AAEjD,MAAA,MAAM,IAAI,OAAA,CAAQ,MAAM,CAAA,CACrB,KAAK,MAAM,CAAA,CACX,MAAA,CAAO,CAAC,MAAA,CAAO,IAAI,CAAC,CAAC,EACrB,OAAA,EAAQ;AAEX,MAAA,OAAO,EAAE,IAAA,EAAM,EAAE,EAAA,EAAI,MAAK,EAAsB;AAAA,IAClD,CAAA;AAAA,IAEA,WAAW,MAAM,UAAA;AAAA,IAEjB,OAAA,EAAS,aAAqF,EAAE,IAAA,EAAM,EAAC,EAAE,CAAA;AAAA,IAEzG,UAAA,EAAY,OACV,MAAA,KACmC;AACnC,MAAA,MAAM,EAAE,QAAA,EAAU,SAAA,EAAW,IAAA,EAAK,GAAI,MAAA;AACtC,MAAA,MAAM,UAAA,GAAa,IAAA;AACnB,MAAA,MAAM,MAAA,GAAS,aAAA,CAAc,QAAA,EAAU,UAAU,CAAA;AACjD,MAAA,MAAM,EAAE,OAAO,KAAA,GAAQ,IAAI,SAAA,GAAY,IAAG,GAAI,SAAA;AAE9C,MAAA,MAAM,SAAA,GAAY,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,EAAM,MAAM,KAAA,CAAM,CAAC,CAAA,IAAK,IAAA,CAAK,IAAI,CAAA;AAC9D,MAAA,MAAM,aAAA,GAAgB,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,EAAG,MAAM,SAAA,CAAU,CAAC,CAAA,IAAK,EAAE,CAAA;AAE5D,MAAA,MAAM,WAAW,MAAM,IAAI,QAAQ,MAAM,CAAA,CACtC,KAAK,MAAM,CAAA,CACX,MAAA,CAAO,EAAE,OAAO,KAAA,EAAO,SAAA,EAAW,WAAW,aAAA,EAAe,EAC5D,OAAA,EAAQ;AAGX,MAAA,MAAM,QAAA,GAAW,SAAS,IAAA,EAAM,UAAA,EAAY,IAAI,CAAA,CAAA,KAAK,CAAA,CAAE,MAAM,CAAA,IAAK,EAAC;AACnE,MAAA,OAAO,EAAE,MAAO,QAAA,CAAS,MAAA,GAAS,IAAI,QAAA,CAAS,CAAC,CAAA,GAAI,QAAA,CAAS,IAAA,EAA0B;AAAA,IACzF,CAAA;AAAA,IAEA,UAAA,EAAY,OACV,MAAA,KACuC;AACvC,MAAA,MAAM,EAAE,QAAA,EAAU,GAAA,EAAK,IAAA,EAAK,GAAI,MAAA;AAChC,MAAA,MAAM,UAAA,GAAa,IAAA;AACnB,MAAA,MAAM,MAAA,GAAS,aAAA,CAAc,QAAA,EAAU,UAAU,CAAA;AAEjD,MAAA,MAAM,IAAI,OAAA,CAAQ,MAAM,CAAA,CACrB,IAAA,CAAK,MAAM,CAAA,CACX,MAAA,CAAO,GAAA,CAAI,GAAA,CAAI,MAAM,CAAC,EACtB,OAAA,EAAQ;AAEX,MAAA,OAAO,EAAE,MAAM,GAAA,CAAI,GAAA,CAAI,SAAO,EAAE,EAAA,GAAyB,CAAA,EAAE;AAAA,IAC7D,CAAA;AAAA,IAEA,MAAA,EAAQ,OACN,MAAA,KACmC;AACnC,MAAA,MAAM,EAAE,GAAA,EAAK,MAAA,EAAQ,OAAA,EAAS,OAAM,GAAI,MAAA;AACxC,MAAA,IAAI,OAAA,GAAU,CAAA,SAAA,EAAY,MAAA,CAAO,OAAO,oBAAoB,GAAG,CAAA,CAAA;AAE/D,MAAA,IAAI,IAAA;AACJ,MAAA,QAAQ,MAAA,CAAO,aAAY;AAAG,QAC5B,KAAK,KAAA,EAAO;AACV,UAAA,IAAI,SAAS,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA,CAAE,SAAS,CAAA,EAAG;AAC1C,YAAA,MAAM,WAAA,GAAc,IAAI,eAAA,CAAgB,KAA+B,EAAE,QAAA,EAAS;AAClF,YAAA,OAAA,GAAU,CAAA,EAAG,OAAO,CAAA,EAAG,OAAA,CAAQ,QAAA,CAAS,GAAG,CAAA,GAAI,GAAA,GAAM,GAAG,CAAA,EAAG,WAAW,CAAA,CAAA;AAAA,UACxE;AACA,UAAA,IAAA,GAAO,MAAM,MAAA,CAAO,UAAA,CAAW,GAAA,CAAI,OAAO,CAAA;AAC1C,UAAA;AAAA,QACF;AAAA,QACA,KAAK,MAAA;AACH,UAAA,IAAA,GAAO,MAAM,MAAA,CAAO,UAAA,CAAW,IAAA,CAAK,SAAS,OAAO,CAAA;AACpD,UAAA;AAAA,QACF,KAAK,KAAA;AACH,UAAA,IAAA,GAAO,MAAM,MAAA,CAAO,UAAA,CAAW,GAAA,CAAI,SAAS,OAAO,CAAA;AACnD,UAAA;AAAA,QACF,KAAK,OAAA;AACH,UAAA,IAAA,GAAO,MAAM,MAAA,CAAO,UAAA,CAAW,KAAA,CAAM,SAAS,OAAO,CAAA;AACrD,UAAA;AAAA,QACF,KAAK,QAAA;AACH,UAAA,IAAA,GAAO,MAAM,MAAA,CAAO,UAAA,CAAW,MAAA,CAAO,OAAO,CAAA;AAC7C,UAAA;AAAA,QACF;AACE,UAAA,MAAM,IAAI,KAAA,CAAM,CAAA,yBAAA,EAA4B,MAAM,CAAA,CAAE,CAAA;AAAA;AAGxD,MAAA,OAAO,EAAE,IAAA,EAAK;AAAA,IAChB,CAAA;AAAA;AAAA,IAGA,UAAA,EAAY;AAAA,GACd;AACF;AClLO,SAAS,gBAAgB,MAAA,EAA8B;AAC5D,EAAA,MAAM,MAAA,GAAS,OAAO,SAAA,EAAU;AAChC,EAAA,MAAM,aAAa,CAAA,EAAG,MAAA,CAAO,MAAM,CAAA,UAAA,EAAa,OAAO,OAAO,CAAA,CAAA;AAC9D,EAAA,MAAM,SAAA,GAAY,IAAI,SAAA,CAAU,MAAM,CAAA;AACtC,EAAA,MAAM,SAAA,GAAY,IAAI,SAAA,CAAU,MAAM,CAAA;AAEtC,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,OACP,MAAA,KACoC;AACpC,MAAA,MAAM,EAAE,QAAA,EAAU,IAAA,EAAK,GAAI,MAAA;AAE3B,MAAA,IAAI,aAAa,OAAA,EAAS;AACxB,QAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,MAAM,CAAA;AAC1B,QAAA,MAAM,QAAA,GAAW,MAAM,GAAA,CAAI,KAAA,GAAQ,OAAA,EAAQ;AAE3C,QAAA,OAAO;AAAA,UACL,IAAA,EAAO,SAAS,IAAA,IAAQ,QAAA;AAAA,UACxB,KAAA,EAAO,QAAA,CAAS,KAAA,KAAU,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA,GAAI,QAAA,CAAS,MAAA,GAAS,QAAA,CAAS,IAAA,EAAM,MAAA,IAAU,CAAA;AAAA,SACjG;AAAA,MACF;AAEA,MAAA,IAAI,aAAa,SAAA,EAAW;AAC1B,QAAA,MAAM,OAAO,IAAA,EAAM,IAAA;AACnB,QAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,CAAK,MAAA,KAAW,CAAA,EAAG;AAC9B,UAAA,MAAM,IAAI,MAAM,2CAA2C,CAAA;AAAA,QAC7D;AACA,QAAA,MAAM,OAAA,GAAU,IAAI,OAAA,CAAQ,MAAM,CAAA;AAClC,QAAA,MAAM,QAAA,GAAW,MAAM,OAAA,CAAQ,IAAA,CAAK,IAAA,EAAM;AAAA,UACxC,KAAK,IAAA,EAAM,GAAA;AAAA,UACX,iBAAiB,IAAA,EAAM;AAAA,SACxB,CAAA;AACD,QAAA,MAAM,GAAA,GAAM,SAAS,IAAA,IAAQ,QAAA;AAC7B,QAAA,MAAM,OAAgB,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA,GACnC,GAAA,GACA,OAAO,OAAA,CAAQ,GAAG,EAAE,GAAA,CAAI,CAAC,CAAC,GAAA,EAAK,KAAK,OAAO,EAAE,GAAA,EAAK,OAAM,CAAsB,CAAA;AAClF,QAAA,OAAO,EAAE,IAAA,EAAM,KAAA,EAAO,IAAA,CAAK,MAAA,EAAO;AAAA,MACpC;AAEA,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,sBAAA,EAAyB,QAAQ,CAAA,qCAAA,CAAuC,CAAA;AAAA,IAC1F,CAAA;AAAA,IAEA,MAAA,EAAQ,OACN,MAAA,KACmC;AACnC,MAAA,MAAM,EAAE,QAAA,EAAU,EAAA,EAAI,IAAA,EAAK,GAAI,MAAA;AAE/B,MAAA,IAAI,aAAa,UAAA,EAAY;AAC3B,QAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,MAAM,CAAA;AAC1B,QAAA,MAAM,QAAA,GAAW,MAAM,GAAA,CAAI,QAAA,GAAW,OAAA,EAAQ;AAE9C,QAAA,OAAO;AAAA,UACL,MAAM,QAAA,CAAS;AAAA,SACjB;AAAA,MACF;AAEA,MAAA,IAAI,aAAa,SAAA,EAAW;AAC1B,QAAA,MAAM,OAAA,GAAU,IAAI,OAAA,CAAQ,MAAM,CAAA;AAClC,QAAA,MAAM,WAAW,MAAM,OAAA,CAAQ,GAAA,CAAI,MAAA,CAAO,EAAE,CAAA,EAAG;AAAA,UAC7C,KAAK,IAAA,EAAM,GAAA;AAAA,UACX,MAAM,IAAA,EAAM;AAAA,SACb,EAAE,OAAA,EAAQ;AACX,QAAA,OAAO,EAAE,IAAA,EAAO,QAAA,CAAS,IAAA,IAAQ,QAAA,EAAmB;AAAA,MACtD;AAEA,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,iCAAA,EAAoC,QAAQ,CAAA,wCAAA,CAA0C,CAAA;AAAA,IACxG,CAAA;AAAA,IAEA,MAAA,EAAQ,OACN,MAAA,KACmC;AACnC,MAAA,MAAM,EAAE,GAAA,EAAK,IAAA,EAAM,OAAA,EAAS,MAAK,GAAI,MAAA;AACrC,MAAA,MAAM,UAAA,GAAa,IAAA;AAEnB,MAAA,IAAI,UAAA,EAAY,SAAS,UAAA,EAAY;AACnC,QAAA,MAAM,QAAA,GAAW,MAAM,SAAA,CAAU,OAAA,CAAe,IAAA,EAAM;AAAA,UACpD,KAAA,EAAO,WAAW,KAAA,IAAS,KAAA;AAAA,UAC3B,MAAA,EAAS,WAAW;AAAC,SACtB,CAAA;AACD,QAAA,OAAO,EAAE,IAAA,EAAM,QAAA,CAAS,IAAA,EAAc;AAAA,MACxC;AAEA,MAAA,IAAI,UAAA,EAAY,SAAS,WAAA,EAAa;AACpC,QAAA,MAAM,QAAA,GAAW,MAAM,SAAA,CAAU,OAAA,CAAe,IAAA,EAAM;AAAA,UACpD,MAAA,EAAS,WAAW;AAAC,SACtB,CAAA;AACD,QAAA,OAAO,EAAE,IAAA,EAAM,QAAA,CAAS,IAAA,EAAc;AAAA,MACxC;AAEA,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF,CAAA;AAAA,IAEA,WAAW,MAAM,UAAA;AAAA,IAEjB,SAAS,YAAY;AAAE,MAAA,MAAM,IAAI,MAAM,4CAA4C,CAAA;AAAA,IAAG,CAAA;AAAA,IACtF,QAAQ,YAAY;AAAE,MAAA,MAAM,IAAI,MAAM,yEAAyE,CAAA;AAAA,IAAG,CAAA;AAAA,IAClH,YAAY,YAAY;AAAE,MAAA,MAAM,IAAI,MAAM,+CAA+C,CAAA;AAAA,IAAG,CAAA;AAAA,IAC5F,QAAQ,YAAY;AAAE,MAAA,MAAM,IAAI,MAAM,2CAA2C,CAAA;AAAA,IAAG,CAAA;AAAA,IACpF,YAAY,YAAY;AAAE,MAAA,MAAM,IAAI,MAAM,+CAA+C,CAAA;AAAA,IAAG,CAAA;AAAA,IAC5F,WAAW,YAAY;AAAE,MAAA,MAAM,IAAI,MAAM,8CAA8C,CAAA;AAAA,IAAG,CAAA;AAAA,IAC1F,YAAY,YAAY;AAAE,MAAA,MAAM,IAAI,MAAM,+CAA+C,CAAA;AAAA,IAAG;AAAA,GAC9F;AACF;AC5GA,SAAS,oBAAA,CACP,OAAA,EACA,OAAA,EACA,UAAA,EACiB;AACjB,EAAA,MAAM,SAA0B,EAAC;AAGjC,EAAA,IAAI,UAAA,IAAc,UAAA,CAAW,IAAA,KAAS,KAAA,EAAO;AAC3C,IAAA,IAAI,WAAW,WAAA,EAAa;AAC1B,MAAA,MAAA,CAAO,OAAO,UAAA,CAAW,WAAA;AAAA,IAC3B;AACA,IAAA,IAAI,WAAW,QAAA,EAAU;AACvB,MAAA,MAAA,CAAO,YAAY,UAAA,CAAW,QAAA;AAAA,IAChC;AAAA,EACF;AAGA,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,MAAA,IAAI,WAAW,MAAA,EAAQ;AACrB,QAAA,MAAM,QAAQ,MAAA,CAAO,KAAA;AACrB,QAAA,MAAM,QAAQ,MAAA,CAAO,KAAA;AAErB,QAAA,QAAQ,KAAA;AAAO,UACb,KAAK,QAAA;AACH,YAAA,MAAA,CAAO,MAAA,GAAS,OAAO,KAAK,CAAA;AAC5B,YAAA;AAAA,UACF,KAAK,WAAA;AACH,YAAA,MAAA,CAAO,SAAA,GAAY,QAAQ,KAAK,CAAA;AAChC,YAAA;AAAA,UACF,KAAK,UAAA;AACH,YAAA,MAAA,CAAO,QAAA,GAAW,QAAQ,KAAK,CAAA;AAC/B,YAAA;AAAA,UACF,KAAK,cAAA;AACH,YAAA,MAAA,CAAO,YAAA,GAAe,QAAQ,KAAK,CAAA;AACnC,YAAA;AAAA,UACF,KAAK,YAAA;AACH,YAAA,MAAA,CAAO,UAAA,GAAa,QAAQ,KAAK,CAAA;AACjC,YAAA;AAAA;AACJ,MACF;AAAA,IACF;AAAA,EACF;AAGA,EAAA,IAAI,OAAA,IAAW,OAAA,CAAQ,MAAA,GAAS,CAAA,EAAG;AACjC,IAAA,MAAM,MAAA,GAAS,QAAQ,CAAC,CAAA;AACxB,IAAA,MAAA,CAAO,QAAA,GAAW,OAAO,KAAA,KAAU,MAAA,GAAS,IAAI,MAAA,CAAO,KAAK,KAAK,MAAA,CAAO,KAAA;AAAA,EAC1E;AAEA,EAAA,OAAO,MAAA;AACT;AAyCO,SAAS,iBAAiB,MAAA,EAA8B;AAC7D,EAAA,MAAM,MAAA,GAAS,OAAO,SAAA,EAAU;AAChC,EAAA,MAAM,aAAa,CAAA,EAAG,MAAA,CAAO,MAAM,CAAA,UAAA,EAAa,OAAO,OAAO,CAAA,CAAA;AAE9D,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,OACP,MAAA,KACoC;AACpC,MAAA,MAAM,EAAE,QAAA,EAAU,UAAA,EAAY,OAAA,EAAS,OAAA,EAAS,MAAK,GAAI,MAAA;AAEzD,MAAA,IAAI,aAAa,OAAA,EAAS;AACxB,QAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,MAAM,CAAA;AAC5B,QAAA,MAAM,WAAA,GAAc,oBAAA,CAAqB,OAAA,EAAS,OAAA,EAAS,UAAU,CAAA;AACrE,QAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,WAA8C,CAAA;AAE/E,QAAA,OAAO;AAAA,UACL,IAAA,EAAO,SAAS,IAAA,IAAQ,QAAA;AAAA,UACxB,OAAO,QAAA,CAAS;AAAA,SAClB;AAAA,MACF;AAEA,MAAA,IAAI,aAAa,OAAA,EAAS;AAExB,QAAA,MAAM,WAAW,IAAA,EAAM,QAAA;AACvB,QAAA,IAAI,CAAC,QAAA,EAAU;AACb,UAAA,MAAM,IAAI,MAAM,uCAAuC,CAAA;AAAA,QACzD;AACA,QAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,MAAM,CAAA;AAC5B,QAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,OAAA,CAAQ,QAAQ,CAAA;AAC5C,QAAA,MAAM,QAAQ,QAAA,CAAS,IAAA,EAAM,KAAA,IAAS,QAAA,CAAS,SAAS,EAAC;AAEzD,QAAA,OAAO;AAAA,UACL,IAAA,EAAM,KAAA;AAAA,UACN,OAAO,KAAA,CAAM;AAAA,SACf;AAAA,MACF;AAEA,MAAA,IAAI,aAAa,MAAA,EAAQ;AACvB,QAAA,MAAM,WAAW,IAAA,EAAM,QAAA;AACvB,QAAA,IAAI,CAAC,QAAA,EAAU;AACb,UAAA,MAAM,IAAI,MAAM,sCAAsC,CAAA;AAAA,QACxD;AACA,QAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,MAAM,CAAA;AAC5B,QAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,WAAA,CAAY,QAAQ,CAAA;AAChD,QAAA,MAAM,IAAA,GAAO,SAAS,IAAA,IAAQ,QAAA;AAC9B,QAAA,OAAO;AAAA,UACL,IAAA,EAAM,IAAA;AAAA,UACN,OAAO,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,GAAI,KAAK,MAAA,GAAS;AAAA,SAC7C;AAAA,MACF;AAEA,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,mCAAA,EAAsC,QAAQ,CAAA,+BAAA,CAAiC,CAAA;AAAA,IACjG,CAAA;AAAA,IAEA,MAAA,EAAQ,OACN,MAAA,KACmC;AACnC,MAAA,MAAM,EAAE,QAAA,EAAU,EAAA,EAAG,GAAI,MAAA;AAEzB,MAAA,IAAI,aAAa,OAAA,EAAS;AACxB,QAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,MAAM,CAAA;AAG5B,QAAA,IAAI,MAAA,CAAO,EAAE,CAAA,KAAM,IAAA,EAAM;AACvB,UAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,MAAM,CAAA;AAC5B,UAAA,MAAMA,SAAAA,GAAW,MAAM,IAAA,CAAK,cAAA,EAAe;AAC3C,UAAA,MAAM,IAAA,GAAOA,SAAAA,GAAaA,SAAAA,CAAiB,IAAA,IAAQA,SAAAA,GAAY,IAAA;AAC/D,UAAA,OAAO,EAAE,IAAA,EAA+B;AAAA,QAC1C;AAEA,QAAA,MAAM,WAAW,MAAM,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,EAAE,CAAC,CAAA;AAE9C,QAAA,OAAO;AAAA,UACL,MAAM,QAAA,CAAS;AAAA,SACjB;AAAA,MACF;AAEA,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,kCAAA,EAAqC,QAAQ,CAAA,kBAAA,CAAoB,CAAA;AAAA,IACnF,CAAA;AAAA,IAEA,WAAW,MAAM,UAAA;AAAA,IAEjB,MAAA,EAAQ,OACN,MAAA,KACmC;AACnC,MAAA,MAAM,EAAE,QAAA,EAAU,SAAA,EAAU,GAAI,MAAA;AAEhC,MAAA,IAAI,aAAa,OAAA,EAAS;AACxB,QAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,MAAM,CAAA;AAC5B,QAAA,MAAM,QAAA,GAAW,SAAA;AACjB,QAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,UAAA,CAAW,QAAQ,CAAA;AAE/C,QAAA,OAAO;AAAA,UACL,MAAM,QAAA,CAAS;AAAA,SACjB;AAAA,MACF;AAEA,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,kCAAA,EAAqC,QAAQ,CAAA,4BAAA,CAA8B,CAAA;AAAA,IAC7F,CAAA;AAAA,IAEA,MAAA,EAAQ,OACN,MAAA,KACmC;AACnC,MAAA,MAAM,EAAE,QAAA,EAAU,EAAA,EAAI,SAAA,EAAU,GAAI,MAAA;AAEpC,MAAA,IAAI,aAAa,OAAA,EAAS;AACxB,QAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,MAAM,CAAA;AAC5B,QAAA,MAAM,QAAA,GAAW,OAAO,EAAE,CAAA;AAC1B,QAAA,MAAM,UAAA,GAAa,SAAA;AACnB,QAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,UAAA,CAAW,UAAU,UAAU,CAAA;AAE3D,QAAA,OAAO;AAAA,UACL,MAAM,QAAA,CAAS;AAAA,SACjB;AAAA,MACF;AAEA,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,kCAAA,EAAqC,QAAQ,CAAA,4BAAA,CAA8B,CAAA;AAAA,IAC7F,CAAA;AAAA,IAEA,SAAA,EAAW,OACT,MAAA,KACsC;AACtC,MAAA,MAAM,EAAE,QAAA,EAAU,EAAA,EAAG,GAAI,MAAA;AAEzB,MAAA,IAAI,aAAa,OAAA,EAAS;AACxB,QAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,MAAM,CAAA;AAC5B,QAAA,MAAM,QAAA,GAAW,OAAO,EAAE,CAAA;AAC1B,QAAA,MAAM,IAAA,CAAK,WAAW,QAAQ,CAAA;AAE9B,QAAA,OAAO;AAAA,UACL,MAAM;AAAC,SACT;AAAA,MACF;AAEA,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,kCAAA,EAAqC,QAAQ,CAAA,4BAAA,CAA8B,CAAA;AAAA,IAC7F,CAAA;AAAA;AAAA,IAGA,SAAS,YAAY;AAAE,MAAA,MAAM,IAAI,MAAM,6CAA6C,CAAA;AAAA,IAAG,CAAA;AAAA,IACvF,YAAY,YAAY;AAAE,MAAA,MAAM,IAAI,MAAM,gDAAgD,CAAA;AAAA,IAAG,CAAA;AAAA,IAC7F,YAAY,YAAY;AAAE,MAAA,MAAM,IAAI,MAAM,gDAAgD,CAAA;AAAA,IAAG,CAAA;AAAA,IAC7F,YAAY,YAAY;AAAE,MAAA,MAAM,IAAI,MAAM,gDAAgD,CAAA;AAAA,IAAG,CAAA;AAAA,IAC7F,QAAQ,YAAY;AAAE,MAAA,MAAM,IAAI,MAAM,4CAA4C,CAAA;AAAA,IAAG;AAAA,GACvF;AACF;ACzQO,SAAS,sBAAsB,MAAA,EAA8B;AAClE,EAAA,MAAM,MAAA,GAAS,OAAO,SAAA,EAAU;AAChC,EAAA,MAAM,aAAa,CAAA,EAAG,MAAA,CAAO,MAAM,CAAA,UAAA,EAAa,OAAO,OAAO,CAAA,CAAA;AAC9D,EAAA,MAAM,SAAA,GAAY,IAAIC,SAAAA,CAAU,MAAM,CAAA;AAEtC,EAAA,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAQL,QAAQ,OAA+D;AAAA,MACrE,QAAA;AAAA,MACA,SAAA;AAAA,MACA;AAAA,KACF,KAAgE;AAC9D,MAAA,MAAM,YAAA,GAAe,IAAA;AAErB,MAAA,MAAM,QAAA,GAAW,MAAM,SAAA,CAAU,OAAA,CAAe,QAAA,EAAU;AAAA,QACxD,KAAA,EAAO,cAAc,KAAA,IAAS,KAAA;AAAA,QAC9B,MAAA,EAAQ;AAAA,OACT,CAAA;AAED,MAAA,OAAO,EAAE,IAAA,EAAM,QAAA,CAAS,IAAA,EAAc;AAAA,IACxC,CAAA;AAAA,IAEA,WAAW,MAAM,UAAA;AAAA;AAAA,IAGjB,QAAQ,YAAY;AAClB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF,CAAA;AAAA;AAAA,IAGA,SAAS,YAAY;AACnB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF,CAAA;AAAA,IACA,QAAQ,YAAY;AAClB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF,CAAA;AAAA,IACA,SAAS,YAAY;AACnB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF,CAAA;AAAA,IACA,YAAY,YAAY;AACtB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF,CAAA;AAAA,IACA,QAAQ,YAAY;AAClB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF,CAAA;AAAA,IACA,YAAY,YAAY;AACtB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF,CAAA;AAAA,IACA,WAAW,YAAY;AACrB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF,CAAA;AAAA,IACA,YAAY,YAAY;AACtB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AAAA,GACF;AACF;AC/EO,SAAS,sBAAsB,MAAA,EAA8B;AAClE,EAAA,MAAM,MAAA,GAAS,OAAO,SAAA,EAAU;AAChC,EAAA,MAAM,aAAa,CAAA,EAAG,MAAA,CAAO,MAAM,CAAA,UAAA,EAAa,OAAO,OAAO,CAAA,CAAA;AAC9D,EAAA,MAAM,SAAA,GAAY,IAAIC,SAAAA,CAAU,MAAM,CAAA;AAEtC,EAAA,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOL,QAAQ,OAA+D;AAAA,MACrE,QAAA;AAAA,MACA;AAAA,KACF,KAAgE;AAC9D,MAAA,MAAM,QAAA,GAAW,MAAM,SAAA,CAAU,OAAA,CAAe,QAAA,EAAU;AAAA,QACxD,MAAA,EAAQ;AAAA,OACT,CAAA;AAED,MAAA,OAAO,EAAE,IAAA,EAAM,QAAA,CAAS,IAAA,EAAc;AAAA,IACxC,CAAA;AAAA,IAEA,WAAW,MAAM,UAAA;AAAA;AAAA,IAGjB,QAAQ,YAAY;AAClB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF,CAAA;AAAA;AAAA,IAGA,SAAS,YAAY;AACnB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF,CAAA;AAAA,IACA,QAAQ,YAAY;AAClB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF,CAAA;AAAA,IACA,SAAS,YAAY;AACnB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF,CAAA;AAAA,IACA,YAAY,YAAY;AACtB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF,CAAA;AAAA,IACA,QAAQ,YAAY;AAClB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF,CAAA;AAAA,IACA,YAAY,YAAY;AACtB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF,CAAA;AAAA,IACA,WAAW,YAAY;AACrB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF,CAAA;AAAA,IACA,YAAY,YAAY;AACtB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AAAA,GACF;AACF;ACtDO,IAAI,WAAA,GAA0C;AAY9C,SAAS,aAAa,MAAA,EAA8B;AACzD,EAAA,MAAM,IAAA,GAAO,IAAIC,IAAAA,CAAK,MAAM,CAAA;AAE5B,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,OAAO,MAAA,GAAsB,EAAC,KAAM;AACzC,MAAA,MAAM,EAAE,WAAA,EAAa,QAAA,GAAW,IAAA,EAAK,GAAI,MAAA;AAKzC,MAAA,IAAI,IAAA,CAAK,qBAAoB,EAAG;AAC9B,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,IAAA;AAAA,UACT,YAAY,WAAA,IAAe;AAAA,SAC7B;AAAA,MACF;AAEA,MAAA,IAAI,QAAA,EAAU;AAEZ,QAAA,IAAA,CAAK,MAAM,WAAW,CAAA;AAItB,QAAA,OAAO;AAAA,UACL,OAAA,EAAS;AAAA,SACX;AAAA,MACF;AAEA,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO;AAAA,UACL,IAAA,EAAM,YAAA;AAAA,UACN,OAAA,EAAS;AAAA;AACX,OACF;AAAA,IACF,CAAA;AAAA,IAEA,MAAA,EAAQ,OAAO,MAAA,GAAuB,EAAC,KAAM;AAC3C,MAAA,MAAM,EAAE,aAAY,GAAI,MAAA;AAExB,MAAA,WAAA,GAAc,IAAA;AACd,MAAA,MAAM,IAAA,CAAK,OAAO,WAAW,CAAA;AAE7B,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,IAAA;AAAA,QACT,YAAY,WAAA,IAAe;AAAA,OAC7B;AAAA,IACF,CAAA;AAAA,IAEA,OAAO,YAAY;AACjB,MAAA,IAAI,CAAC,IAAA,CAAK,mBAAA,EAAoB,EAAG;AAC/B,QAAA,OAAO,EAAE,aAAA,EAAe,KAAA,EAAO,UAAA,EAAY,QAAA,EAAS;AAAA,MACtD;AAGA,MAAA,OAAO,EAAE,eAAe,IAAA,EAAK;AAAA,IAC/B,CAAA;AAAA,IAEA,OAAA,EAAS,OAAO,KAAA,KAAU;AACxB,MAAA,MAAM,SAAS,KAAA,EAAO,UAAA,IAAc,KAAA,EAAO,MAAA,IAAU,OAAO,QAAA,EAAU,MAAA;AAGtE,MAAA,IAAI,MAAA,KAAW,GAAA,IAAO,MAAA,KAAW,GAAA,EAAK;AACpC,QAAA,OAAO;AAAA,UACL,MAAA,EAAQ,IAAA;AAAA,UACR,UAAA,EAAY,QAAA;AAAA,UACZ;AAAA,SACF;AAAA,MACF;AAEA,MAAA,OAAO,EAAE,KAAA,EAAM;AAAA,IACjB,CAAA;AAAA,IAEA,QAAA,EAAU,OAAO,MAAA,GAAyB,EAAC,KAAM;AAC/C,MAAA,MAAM,EAAE,aAAY,GAAI,MAAA;AAGxB,MAAA,IAAA,CAAK,OAAO,WAAW,CAAA;AAEvB,MAAA,OAAO;AAAA,QACL,OAAA,EAAS;AAAA,OACX;AAAA,IACF,CAAA;AAAA,IAEA,aAAa,YAAY;AACvB,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,cAAA,EAAe;AAE3C,MAAA,IAAI,CAAC,QAAA,EAAU;AACb,QAAA,WAAA,GAAc,IAAA;AACd,QAAA,OAAO,IAAA;AAAA,MACT;AAEA,MAAA,MAAM,IAAA,GAAQ,SAAiB,IAAA,IAAQ,QAAA;AACvC,MAAA,WAAA,GAAc,IAAA;AACd,MAAA,OAAO,IAAA;AAAA,IACT,CAAA;AAAA,IAEA,gBAAgB,YAAY;AAE1B,MAAA,MAAM,IAAA,GAAO,WAAA;AAEb,MAAA,IAAI,CAAC,IAAA,EAAM;AACT,QAAA,OAAO,IAAA;AAAA,MACT;AAEA,MAAA,OAAO;AAAA,QACL,KAAA,EAAO,IAAA,CAAK,KAAA,IAAS,EAAC;AAAA,QACtB,WAAA,EAAa,IAAA,CAAK,gBAAA,IAAoB,EAAC;AAAA,QACvC,MAAA,EAAQ,IAAA,CAAK,MAAA,IAAU,EAAC;AAAA,QACxB,QAAA,EAAU,KAAK,QAAA,IAAY,KAAA;AAAA,QAC3B,YAAA,EAAc,KAAK,YAAA,IAAgB;AAAA,OACrC;AAAA,IACF;AAAA,GACF;AACF;AChIO,SAAS,qBAAA,CACd,QACA,OAAA,EACuB;AACvB,EAAA,MAAM,MAAA,GAAS,IAAI,MAAA,CAAO,MAAM,CAAA;AAChC,EAAA,MAAM,IAAA,GAAO,IAAIA,IAAAA,CAAK,MAAM,CAAA;AAC5B,EAAA,MAAM,EAAE,YAAA,GAAe,EAAA,EAAG,GAAI,WAAW,EAAC;AAG1C,EAAA,MAAM,mBAAmB,IAAI,UAAA;AAAA,IAC3B,OAAO,MAAA,KAAW;AAEhB,MAAA,IAAI,WAAA,GAAc,WAAA;AAElB,MAAA,IAAI,CAAC,WAAA,EAAa;AAChB,QAAA,IAAI;AACF,UAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,cAAA,EAAe;AAC3C,UAAA,WAAA,GAAc,QAAA,GAAa,QAAA,CAAiB,IAAA,IAAQ,QAAA,GAAY,IAAA;AAAA,QAClE,CAAA,CAAA,MAAQ;AACN,UAAA,WAAA,GAAc,IAAA;AAAA,QAChB;AAAA,MACF;AAEA,MAAA,IAAI,CAAC,WAAA,EAAa;AAChB,QAAA,OAAO,MAAA,CAAO,IAAI,OAAO;AAAA,UACvB,GAAA,EAAK,KAAA;AAAA,UACL,MAAA,EAAQ;AAAA,SACV,CAAE,CAAA;AAAA,MACJ;AAGA,MAAA,MAAM,eAAA,uBAAsB,GAAA,EAKzB;AAEH,MAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,QAAA,MAAM,QAAA,GAAW,MAAM,MAAA,EAAQ,EAAA,GAAK,OAAO,KAAA,CAAM,MAAA,CAAO,EAAE,CAAA,GAAI,GAAA;AAC9D,QAAA,MAAM,GAAA,GAAM,CAAA,EAAG,KAAA,CAAM,QAAQ,IAAI,QAAQ,CAAA,CAAA;AAEzC,QAAA,IAAI,CAAC,eAAA,CAAgB,GAAA,CAAI,GAAG,CAAA,EAAG;AAC7B,UAAA,eAAA,CAAgB,IAAI,GAAA,EAAK;AAAA,YACvB,UAAU,KAAA,CAAM,QAAA;AAAA,YAChB,QAAA;AAAA,YACA,UAAA,EAAa,KAAA,CAAM,MAAA,IAAU,EAAC;AAAA,YAC9B,OAAA,sBAAa,GAAA;AAAI,WAClB,CAAA;AAAA,QACH;AACA,QAAA,eAAA,CAAgB,IAAI,GAAG,CAAA,CAAG,OAAA,CAAQ,GAAA,CAAI,MAAM,MAAM,CAAA;AAAA,MACpD;AAEA,MAAA,MAAM,aAAA,GAAgB,KAAA,CAAM,IAAA,CAAK,eAAA,CAAgB,QAAQ,CAAA;AAGzD,MAAA,MAAM,YAAA,GAAe,aAAA,CAAc,GAAA,CAAI,CAAC,KAAA,MAAW;AAAA,QACjD,UAAU,KAAA,CAAM,QAAA;AAAA,QAChB,UAAU,KAAA,CAAM,QAAA;AAAA,QAChB,YAAY,KAAA,CAAM,UAAA;AAAA,QAClB,OAAA,EAAS,KAAA,CAAM,IAAA,CAAK,KAAA,CAAM,OAAO;AAAA,OACnC,CAAE,CAAA;AAEF,MAAA,IAAI;AAEF,QAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,aAAA,CAAc,YAAY,CAAA;AAKtD,QAAA,MAAM,iBAAA,uBAAwB,GAAA,EAAoC;AAClE,QAAA,MAAA,EAAQ,OAAA,EAAS,OAAA,CAAQ,CAAC,CAAA,EAAG,KAAA,KAAU;AACrC,UAAA,MAAM,OAAA,GAAU,aAAa,KAAK,CAAA;AAClC,UAAA,MAAM,MAAM,CAAA,EAAG,OAAA,CAAQ,QAAQ,CAAA,CAAA,EAAI,QAAQ,QAAQ,CAAA,CAAA;AACnD,UAAA,iBAAA,CAAkB,GAAA,CAAI,GAAA,EAAK,CAAA,CAAE,OAAA,IAAW,EAAE,CAAA;AAAA,QAC5C,CAAC,CAAA;AAGD,QAAA,OAAO,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,KAAU;AAC3B,UAAA,MAAM,QAAA,GAAW,MAAM,MAAA,EAAQ,EAAA,GAAK,OAAO,KAAA,CAAM,MAAA,CAAO,EAAE,CAAA,GAAI,GAAA;AAC9D,UAAA,MAAM,GAAA,GAAM,CAAA,EAAG,KAAA,CAAM,QAAQ,IAAI,QAAQ,CAAA,CAAA;AACzC,UAAA,MAAM,OAAA,GAAU,iBAAA,CAAkB,GAAA,CAAI,GAAG,KAAK,EAAC;AAC/C,UAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,KAAA,CAAM,MAAM,CAAA,KAAM,cAAA;AAE1C,UAAA,OAAO;AAAA,YACL,GAAA,EAAK,OAAA;AAAA,YACL,MAAA,EAAQ,UAAU,KAAA,CAAA,GAAY;AAAA,WAChC;AAAA,QACF,CAAC,CAAA;AAAA,MACH,SAAS,KAAA,EAAO;AACd,QAAA,OAAA,CAAQ,KAAA,CAAM,kCAAkC,KAAK,CAAA;AACrD,QAAA,OAAO,MAAA,CAAO,IAAI,OAAO;AAAA,UACvB,GAAA,EAAK,KAAA;AAAA,UACL,MAAA,EAAQ,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU;AAAA,SACnD,CAAE,CAAA;AAAA,MACJ;AAAA,IACF,CAAA;AAAA,IACA;AAAA,MACE,eAAA,EAAiB,CAAC,QAAA,KAAa,UAAA,CAAW,UAAU,YAAY,CAAA;AAAA,MAChE,KAAA,EAAO;AAAA;AAAA;AACT,GACF;AAEA,EAAA,OAAO;AAAA,IACL,KAAK,OAAO,EAAE,QAAA,EAAU,MAAA,EAAQ,QAAO,KAAM;AAC3C,MAAA,IAAI,CAAC,QAAA,EAAU;AACb,QAAA,OAAO,EAAE,GAAA,EAAK,KAAA,EAAO,MAAA,EAAQ,wBAAA,EAAyB;AAAA,MACxD;AAEA,MAAA,OAAO,iBAAiB,IAAA,CAAK;AAAA,QAC3B,QAAA;AAAA,QACA,MAAA;AAAA,QACA;AAAA,OACD,CAAA;AAAA,IACH,CAAA;AAAA,IAEA,OAAA,EAAS;AAAA,MACP,OAAA,EAAS;AAAA,QACP,mBAAA,EAAqB,IAAA;AAAA,QACrB,kBAAA,EAAoB;AAAA,OACtB;AAAA,MACA,YAAA,EAAc;AAAA,QACZ,SAAA,EAAW,IAAI,EAAA,GAAK,GAAA;AAAA;AAAA,QACpB,MAAA,EAAQ,KAAK,EAAA,GAAK;AAAA;AAAA;AACpB;AACF,GACF;AACF","file":"index.js","sourcesContent":["{\n \"name\": \"@taruvi/refine-providers\",\n \"version\": \"1.2.8\",\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\": \"file:../taruvi-sdk\",\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// Shared user cache — populated by getIdentity(), reused by getPermissions()\n// and accessControlProvider. Prevents multiple /users/me calls per page load.\n// ============================================================================\n\nexport let _cachedUser: Record<string, any> | null = null;\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 _cachedUser = null;\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 // Trust token locally — server-side validation happens\n // via onError when actual API calls fail with 401/403\n return { authenticated: true };\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 _cachedUser = null;\n return null;\n }\n\n const user = (response as any).data ?? response;\n _cachedUser = user;\n return user;\n },\n\n getPermissions: async () => {\n // Reuse cached user from getIdentity() to avoid a separate /users/me call.\n const user = _cachedUser;\n\n if (!user) {\n return null;\n }\n\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 { Auth, Client, Policy } from \"@taruvi/sdk\";\nimport DataLoader from \"dataloader\";\nimport { _cachedUser } from \"./authProvider\";\n\n/**\n * Permission check request for DataLoader batching\n */\ninterface PermissionCheck {\n resource: string;\n action: string;\n params?: Record<string, unknown>;\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 // Reuse cached user from authProvider.getIdentity() — no extra /users/me call\n let currentUser = _cachedUser;\n\n if (!currentUser) {\n try {\n const response = await auth.getCurrentUser();\n currentUser = response ? ((response as any).data ?? response) : null;\n } catch {\n currentUser = null;\n }\n }\n\n if (!currentUser) {\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 resource: 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 resource: 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 const uniqueEntries = Array.from(uniqueResources.values());\n\n // Build batch payload for Cerbos\n const batchPayload = uniqueEntries.map((entry) => ({\n resource: entry.resource,\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.resource}:${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 return permissionLoader.load({\n resource,\n action,\n params,\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.3.0\",\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 * Applies allowed_actions query param for per-row permission hints.\n */\nfunction applyAllowedActions<T>(query: Database<T>, meta?: TaruviMeta): Database<T> {\n if (!meta?.allowedActions?.length) return query;\n return query.allowedActions(meta.allowedActions);\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 let graphQuery = buildGraphQuery<TData>(client, tableName, taruviMeta);\n graphQuery = applyAllowedActions(graphQuery, taruviMeta);\n const response = await graphQuery.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 query = applyAllowedActions(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// Shared user cache — populated by getIdentity(), reused by getPermissions()\n// and accessControlProvider. Prevents multiple /users/me calls per page load.\n// ============================================================================\n\nexport let _cachedUser: Record<string, any> | null = null;\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 _cachedUser = null;\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 // Trust token locally — server-side validation happens\n // via onError when actual API calls fail with 401/403\n return { authenticated: true };\n },\n\n onError: async (error) => {\n const status = error?.statusCode || error?.status || error?.response?.status;\n\n // 401 means session is invalid — tokens already cleared by SDK interceptor\n if (status === 401) {\n return {\n logout: true,\n redirectTo: \"/login\",\n error,\n };\n }\n\n // 403 means authenticated but forbidden — don't logout, just report the error\n if (status === 403) {\n return { error };\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 _cachedUser = null;\n return null;\n }\n\n const user = (response as any).data ?? response;\n _cachedUser = user;\n return user;\n },\n\n getPermissions: async () => {\n // Reuse cached user from getIdentity() to avoid a separate /users/me call.\n const user = _cachedUser;\n\n if (!user) {\n return null;\n }\n\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 { Auth, Client, Policy } from \"@taruvi/sdk\";\nimport DataLoader from \"dataloader\";\nimport { _cachedUser } from \"./authProvider\";\n\n/**\n * Permission check request for DataLoader batching\n */\ninterface PermissionCheck {\n resource: string;\n action: string;\n params?: Record<string, unknown>;\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 // Reuse cached user from authProvider.getIdentity() — no extra /users/me call\n let currentUser = _cachedUser;\n\n if (!currentUser) {\n try {\n const response = await auth.getCurrentUser();\n currentUser = response ? ((response as any).data ?? response) : null;\n } catch {\n currentUser = null;\n }\n }\n\n if (!currentUser) {\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 resource: 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 resource: 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 const uniqueEntries = Array.from(uniqueResources.values());\n\n // Build batch payload for Cerbos\n const batchPayload = uniqueEntries.map((entry) => ({\n resource: entry.resource,\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.resource}:${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 return permissionLoader.load({\n resource,\n action,\n params,\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"]}
|