@taruvi/refine-providers 1.0.4 → 1.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -404,6 +404,141 @@ function storageDataProvider(client) {
404
404
  updateMany: void 0
405
405
  };
406
406
  }
407
+ function functionsDataProvider(client) {
408
+ const config = client.getConfig();
409
+ const baseApiUrl = `${config.baseUrl}/api/apps/${config.appSlug}`;
410
+ const functions = new sdk.Functions(client);
411
+ return {
412
+ custom: async (params) => {
413
+ const { url: functionSlug, payload, meta } = params;
414
+ const functionMeta = meta;
415
+ const response = await functions.execute(functionSlug, {
416
+ async: functionMeta?.async ?? false,
417
+ params: payload
418
+ });
419
+ return { data: response.data };
420
+ },
421
+ getApiUrl: () => baseApiUrl,
422
+ // Edge functions don't support CRUD operations
423
+ getList: async () => {
424
+ throw new Error("getList is not supported for edge functions");
425
+ },
426
+ getOne: async () => {
427
+ throw new Error("getOne is not supported for edge functions");
428
+ },
429
+ getMany: async () => {
430
+ throw new Error("getMany is not supported for edge functions");
431
+ },
432
+ create: async () => {
433
+ throw new Error("create is not supported for edge functions");
434
+ },
435
+ createMany: async () => {
436
+ throw new Error("createMany is not supported for edge functions");
437
+ },
438
+ update: async () => {
439
+ throw new Error("update is not supported for edge functions");
440
+ },
441
+ updateMany: async () => {
442
+ throw new Error("updateMany is not supported for edge functions");
443
+ },
444
+ deleteOne: async () => {
445
+ throw new Error("deleteOne is not supported for edge functions");
446
+ },
447
+ deleteMany: async () => {
448
+ throw new Error("deleteMany is not supported for edge functions");
449
+ }
450
+ };
451
+ }
452
+ function appDataProvider(client) {
453
+ const config = client.getConfig();
454
+ const baseApiUrl = `${config.baseUrl}/api/apps/${config.appSlug}`;
455
+ return {
456
+ getList: async (params) => {
457
+ const { resource } = params;
458
+ if (resource === "roles") {
459
+ const app = new sdk.App(client);
460
+ const response = await app.roles().execute();
461
+ return {
462
+ data: response.data || response,
463
+ total: response.total ?? (Array.isArray(response) ? response.length : response.data?.length ?? 0)
464
+ };
465
+ }
466
+ throw new Error(`Unknown app resource: ${resource}. Supported resources: roles`);
467
+ },
468
+ getApiUrl: () => baseApiUrl,
469
+ // App resources are read-only
470
+ getOne: async () => {
471
+ throw new Error("getOne is not supported for app resources");
472
+ },
473
+ getMany: async () => {
474
+ throw new Error("getMany is not supported for app resources");
475
+ },
476
+ create: async () => {
477
+ throw new Error("create is not supported for app resources");
478
+ },
479
+ createMany: async () => {
480
+ throw new Error("createMany is not supported for app resources");
481
+ },
482
+ update: async () => {
483
+ throw new Error("update is not supported for app resources");
484
+ },
485
+ updateMany: async () => {
486
+ throw new Error("updateMany is not supported for app resources");
487
+ },
488
+ deleteOne: async () => {
489
+ throw new Error("deleteOne is not supported for app resources");
490
+ },
491
+ deleteMany: async () => {
492
+ throw new Error("deleteMany is not supported for app resources");
493
+ },
494
+ custom: async () => {
495
+ throw new Error("custom is not supported for app resources");
496
+ }
497
+ };
498
+ }
499
+ function analyticsDataProvider(client) {
500
+ const config = client.getConfig();
501
+ const baseApiUrl = `${config.baseUrl}/api/apps/${config.appSlug}`;
502
+ const analytics = new sdk.Analytics(client);
503
+ return {
504
+ custom: async (params) => {
505
+ const { url: querySlug, payload } = params;
506
+ const response = await analytics.execute(querySlug, {
507
+ params: payload
508
+ });
509
+ return { data: response.data };
510
+ },
511
+ getApiUrl: () => baseApiUrl,
512
+ // Analytics queries don't support standard CRUD operations
513
+ getList: async () => {
514
+ throw new Error("getList is not supported for analytics. Use custom() to execute queries");
515
+ },
516
+ getOne: async () => {
517
+ throw new Error("getOne is not supported for analytics. Use custom() to execute queries");
518
+ },
519
+ getMany: async () => {
520
+ throw new Error("getMany is not supported for analytics. Use custom() to execute queries");
521
+ },
522
+ create: async () => {
523
+ throw new Error("create is not supported for analytics. Use custom() to execute queries");
524
+ },
525
+ createMany: async () => {
526
+ throw new Error("createMany is not supported for analytics. Use custom() to execute queries");
527
+ },
528
+ update: async () => {
529
+ throw new Error("update is not supported for analytics. Use custom() to execute queries");
530
+ },
531
+ updateMany: async () => {
532
+ throw new Error("updateMany is not supported for analytics. Use custom() to execute queries");
533
+ },
534
+ deleteOne: async () => {
535
+ throw new Error("deleteOne is not supported for analytics. Use custom() to execute queries");
536
+ },
537
+ deleteMany: async () => {
538
+ throw new Error("deleteMany is not supported for analytics. Use custom() to execute queries");
539
+ }
540
+ };
541
+ }
407
542
  function authProvider(client) {
408
543
  const auth = new sdk.Auth(client);
409
544
  return {
@@ -541,28 +676,20 @@ function accessControlProvider(client) {
541
676
  };
542
677
  }
543
678
  try {
544
- const principal = {
545
- id: String(user.user_id),
546
- roles: user.roles || [],
547
- attr: {
548
- username: user.username,
549
- email: user.email,
550
- is_staff: user.is_staff || false,
551
- is_superuser: user.is_superuser || false,
552
- groups: user.groups || []
553
- }
554
- };
679
+ const entityType = params?.resource?.meta?.entityType;
555
680
  const resources = [
556
681
  {
682
+ entityType,
557
683
  tableName: resource,
558
684
  recordId: params?.id ? String(params.id) : "*",
559
685
  attributes: params || {},
560
686
  actions: [action]
561
687
  }
562
688
  ];
563
- const result = await policy.checkResource(resources, principal);
689
+ const result = await policy.checkResource(resources);
564
690
  if (result && typeof result === "object") {
565
- const allowed = result.results?.[0]?.actions?.[action]?.effect === "EFFECT_ALLOW" || result.allowed === true;
691
+ const actionResult = result.results?.[0]?.actions?.[action];
692
+ const allowed = actionResult === "EFFECT_ALLOW" || result.allowed === true;
566
693
  return {
567
694
  can: allowed,
568
695
  reason: result.reason || (allowed ? void 0 : "Permission denied by policy")
@@ -589,6 +716,14 @@ function accessControlProvider(client) {
589
716
  };
590
717
  }
591
718
 
719
+ Object.defineProperty(exports, "Analytics", {
720
+ enumerable: true,
721
+ get: function () { return sdk.Analytics; }
722
+ });
723
+ Object.defineProperty(exports, "App", {
724
+ enumerable: true,
725
+ get: function () { return sdk.App; }
726
+ });
592
727
  Object.defineProperty(exports, "Auth", {
593
728
  enumerable: true,
594
729
  get: function () { return sdk.Auth; }
@@ -597,12 +732,18 @@ Object.defineProperty(exports, "Client", {
597
732
  enumerable: true,
598
733
  get: function () { return sdk.Client; }
599
734
  });
735
+ Object.defineProperty(exports, "Functions", {
736
+ enumerable: true,
737
+ get: function () { return sdk.Functions; }
738
+ });
600
739
  Object.defineProperty(exports, "Policy", {
601
740
  enumerable: true,
602
741
  get: function () { return sdk.Policy; }
603
742
  });
604
743
  exports.REFINE_OPERATOR_MAP = REFINE_OPERATOR_MAP;
605
744
  exports.accessControlProvider = accessControlProvider;
745
+ exports.analyticsDataProvider = analyticsDataProvider;
746
+ exports.appDataProvider = appDataProvider;
606
747
  exports.authProvider = authProvider;
607
748
  exports.buildQueryString = buildQueryString;
608
749
  exports.buildRefineQueryParams = buildRefineQueryParams;
@@ -610,6 +751,7 @@ exports.convertRefineFilters = convertRefineFilters;
610
751
  exports.convertRefinePagination = convertRefinePagination;
611
752
  exports.convertRefineSorters = convertRefineSorters;
612
753
  exports.dataProvider = dataProvider;
754
+ exports.functionsDataProvider = functionsDataProvider;
613
755
  exports.handleError = handleError;
614
756
  exports.storageDataProvider = storageDataProvider;
615
757
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/utils.ts","../src/dataProvider.ts","../src/storageDataProvider.ts","../src/authProvider.ts"],"names":["Database","Storage","Auth","Policy"],"mappings":"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","file":"index.cjs","sourcesContent":["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} from \"@refinedev/core\";\nimport { Client, Database } from \"@taruvi/sdk\";\nimport type { DatabaseFilters } from \"@taruvi/sdk\";\nimport type { TaruviListResponse, TaruviMeta } from \"./types.js\";\nimport {\n convertRefineFilters,\n convertRefineSorters,\n convertRefinePagination,\n formatAggregates,\n formatGroupBy,\n formatHaving\n} from \"./utils.js\";\n\n/**\n * Creates a Refine DataProvider for Taruvi database operations.\n */\nexport function dataProvider(client: Client): DataProvider {\n const config = client.getConfig();\n const baseApiUrl = `${config.baseUrl}/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 const buildFilters = (params: {\n filters?: GetListParams[\"filters\"];\n sorters?: GetListParams[\"sorters\"];\n pagination?: GetListParams[\"pagination\"];\n meta?: TaruviMeta;\n }): DatabaseFilters => {\n const filters: DatabaseFilters = {\n ...convertRefineFilters(params.filters),\n ...convertRefinePagination(params.pagination),\n };\n\n const ordering = convertRefineSorters(params.sorters);\n if (ordering) filters.ordering = ordering;\n\n if (params.meta?.select) {\n (filters as Record<string, unknown>).fields = Array.isArray(params.meta.select)\n ? params.meta.select.join(\",\")\n : params.meta.select;\n }\n\n if (params.meta?.populate) {\n (filters as Record<string, unknown>).populate = Array.isArray(params.meta.populate)\n ? params.meta.populate.join(\",\")\n : params.meta.populate;\n }\n\n // Add aggregation parameters\n const aggregateParam = formatAggregates(params.meta?.aggregate);\n if (aggregateParam) {\n (filters as Record<string, unknown>)._aggregate = aggregateParam;\n }\n\n const groupByParam = formatGroupBy(params.meta?.groupBy);\n if (groupByParam) {\n (filters as Record<string, unknown>)._group_by = groupByParam;\n }\n\n const havingParam = formatHaving(params.meta?.having);\n if (havingParam) {\n (filters as Record<string, unknown>)._having = havingParam;\n }\n\n return filters;\n };\n\n return {\n getList: async <TData extends BaseRecord = BaseRecord>(\n params: GetListParams\n ): Promise<GetListResponse<TData>> => {\n console.log(\"DataProvider getList called with params:\", params)\n const { resource, pagination, filters, sorters, meta } = params;\n const taruviMeta = meta as TaruviMeta | undefined;\n const tableName = getTableName(resource, taruviMeta);\n const dbFilters = buildFilters({ filters, sorters, pagination, meta: taruviMeta });\n\n const response = await new Database(client, {})\n .from(tableName)\n .filter(dbFilters)\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, meta } = params;\n const taruviMeta = meta as TaruviMeta | undefined;\n const tableName = getTableName(resource, taruviMeta);\n const dbFilters = buildFilters({ meta: taruviMeta });\n\n const { data } = await new Database(client, {})\n .from(tableName)\n .filter(dbFilters)\n .get(String(id))\n .execute() as TData;\n\n return { 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 const idColumn = getIdColumn(taruviMeta);\n\n const dbFilters = buildFilters({\n filters: [{ field: idColumn, operator: \"in\", value: ids }],\n meta: taruviMeta,\n });\n\n const response = await new Database(client, {})\n .from(tableName)\n .filter(dbFilters)\n .execute() as TaruviListResponse<TData>;\n\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 // POST /api/apps/{appSlug}/datatables/{tableName}/data/\n const data = await new Database(client, {})\n .from(tableName)\n .create(variables as object)\n .execute() as TData;\n\n return { 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 // SDK doesn't have batch create - create records individually\n const data = await Promise.all(\n variables.map(async (vars) => {\n return new Database(client, {})\n .from(tableName)\n .create(vars as object)\n .execute() as Promise<TData>;\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 // SDK update() uses POST - chain with get(id) to update specific record\n // POST /api/apps/{appSlug}/datatables/{tableName}/data/{recordId}/\n const data = await new Database(client, {})\n .from(tableName)\n .get(String(id))\n .update(variables as object)\n .execute() as TData;\n\n return { 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\n // SDK doesn't have batch update - update records individually\n const data = await Promise.all(\n ids.map(async (id) => {\n return new Database(client, {})\n .from(tableName)\n .get(String(id))\n .update(variables as object)\n .execute() as Promise<TData>;\n })\n );\n\n return { 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 const data = await new Database(client, {})\n .from(tableName)\n .delete(String(id))\n .execute() as TData;\n\n return { data };\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 const data = await Promise.all(\n ids.map(async (id) => {\n return new Database(client, {})\n .from(tableName)\n .delete(String(id))\n .execute() as Promise<TData>;\n })\n );\n\n return { data };\n },\n\n custom: async <TData extends BaseRecord = BaseRecord>(\n params: CustomParams\n ): Promise<CustomResponse<TData>> => {\n const { url, method, payload } = params;\n\n // Use the client's httpClient for custom API calls\n const fullUrl = url.startsWith('http') ? url : `${baseApiUrl}${url}`;\n\n let data: TData;\n switch (method.toLowerCase()) {\n case 'get':\n data = await client.httpClient.get(fullUrl) as TData;\n break;\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 '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 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 } 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.baseUrl}/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, {} as any)\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 // Return the direct URL - browser will handle authentication via headers\n const url = `${baseApiUrl}/storage/buckets/${bucket}/objects/${String(path)}`;\n const data = url as unknown as TData;\n\n return { 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 bucket = getBucketName(resource, taruviMeta);\n const { files, paths = [], metadatas = [] } = variables as unknown as StorageUploadVariables;\n\n // Use default filenames if paths not provided\n const filePaths = files.map((file, i) => paths[i] || file.name);\n const fileMetadatas = files.map((_, i) => metadatas[i] || {});\n\n const data = await new Storage(client, {} as any)\n .from(bucket)\n .upload({ files, paths: filePaths, metadatas: fileMetadatas })\n .execute() as TData;\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: path, variables, meta } = params;\n const taruviMeta = meta as TaruviMeta | undefined;\n const bucket = getBucketName(resource, taruviMeta);\n\n const data = await new Storage(client, {} as any)\n .from(bucket)\n .update(String(path), variables as object)\n .execute() as TData;\n\n return { 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 // SDK delete() now accepts array, handles both single and batch\n const data = await new Storage(client, {} as any)\n .from(bucket)\n .delete([String(path)])\n .execute() as TData;\n\n return { data };\n },\n\n getApiUrl: () => baseApiUrl,\n\n // Not applicable for storage - return empty array\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 // SDK upload() handles batch upload\n const filePaths = files.map((file, i) => paths[i] || file.name);\n const fileMetadatas = files.map((_, i) => metadatas[i] || {});\n\n const data = await new Storage(client, {} as any)\n .from(bucket)\n .upload({ files, paths: filePaths, metadatas: fileMetadatas })\n .execute() as TData;\n\n return { data };\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 // SDK delete() handles batch delete\n const data = await new Storage(client, {} as any)\n .from(bucket)\n .delete(ids.map(String))\n .execute() as TData;\n\n return { data: [data] };\n },\n\n custom: async <TData extends BaseRecord = BaseRecord>(\n params: CustomParams\n ): Promise<CustomResponse<TData>> => {\n const { url, method, payload } = params;\n\n const fullUrl = url.startsWith('http') ? url : `${baseApiUrl}${url}`;\n\n let data: TData;\n switch (method.toLowerCase()) {\n case 'get':\n data = await client.httpClient.get(fullUrl) as TData;\n break;\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 '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 { AuthProvider, AccessControlProvider } from \"@refinedev/core\";\nimport { Client, Auth, Policy } from \"@taruvi/sdk\";\n\n/**\n * User identity returned from JWT token\n */\nexport interface TaruviUser {\n user_id: number;\n username: string;\n email?: string;\n exp?: number;\n iat?: number;\n jti?: string;\n token_type?: string;\n [key: string]: unknown;\n}\n\n/**\n * Login params - supports both redirect flow and credentials flow\n */\nexport interface LoginParams {\n /** For redirect-based login - URL to redirect after successful login */\n callbackUrl?: string;\n /** For credentials-based login (if supported) */\n username?: string;\n password?: string;\n /** Whether to use redirect flow (default: true) */\n redirect?: boolean;\n}\n\n/**\n * Logout params\n */\nexport interface LogoutParams {\n /** URL to redirect after logout */\n callbackUrl?: string;\n}\n\n/**\n * Register/Signup params\n */\nexport interface RegisterParams {\n /** URL to redirect after successful signup */\n callbackUrl?: string;\n}\n\n/**\n * Creates a Refine AuthProvider for Taruvi authentication.\n *\n * Supports redirect-based authentication flow (Web UI Flow):\n * 1. User calls login() → Redirects to backend /accounts/login/\n * 2. User authenticates on backend\n * 3. Backend redirects back with tokens in URL hash\n * 4. Client extracts and stores tokens automatically\n */\nexport function authProvider(client: Client): AuthProvider {\n const auth = new Auth(client);\n\n return {\n login: async (params: LoginParams = {}) => {\n const { callbackUrl, redirect = true } = params;\n\n // Check if already authenticated first (prevents infinite redirect loop)\n\n // TODO: check if this is necessary\n if (auth.isUserAuthenticated()) {\n return {\n success: true,\n redirectTo: callbackUrl || \"/\",\n };\n }\n\n if (redirect) {\n // Redirect-based login flow\n auth.login(callbackUrl);\n\n // Return success since we're redirecting\n // The actual auth state will be checked after redirect\n return {\n success: true,\n };\n }\n\n return {\n success: false,\n error: {\n name: \"LoginError\",\n message: \"Login failed. Please try again.\",\n },\n };\n },\n\n logout: async (params: LogoutParams = {}) => {\n const { callbackUrl } = params;\n\n auth.logout(callbackUrl);\n\n return {\n success: true,\n redirectTo: callbackUrl || \"/login\",\n };\n },\n\n check: async () => {\n // Check if user is authenticated\n if (auth.isUserAuthenticated()) {\n // Check if token is expired\n if (auth.isTokenExpired()) {\n // Try to refresh the token\n const refreshed = await auth.refreshAccessToken();\n\n if (refreshed) {\n return {\n authenticated: true,\n };\n }\n\n // Token refresh failed\n return {\n authenticated: false,\n logout: true,\n redirectTo: \"/login\",\n error: {\n name: \"SessionExpired\",\n message: \"Your session has expired. Please log in again.\",\n },\n };\n }\n\n return {\n authenticated: true,\n };\n }\n\n return {\n authenticated: false,\n redirectTo: \"/login\",\n };\n },\n\n //TODO need to check if max retries logic is needed\n onError: async (error) => {\n const status = error?.statusCode || error?.status || error?.response?.status;\n\n // Handle 401 Unauthorized\n if (status === 401) {\n // Try to refresh token first\n if (auth.isUserAuthenticated()) {\n const refreshed = await auth.refreshAccessToken();\n\n if (refreshed) {\n // Token refreshed, retry the request\n return {\n error,\n };\n }\n }\n\n return {\n logout: true,\n redirectTo: \"/login\",\n error,\n };\n }\n\n // Handle 403 Forbidden\n if (status === 403) {\n return {\n error,\n // Don't logout for 403, user is authenticated but not authorized\n };\n }\n\n return {\n error,\n };\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 (): Promise<TaruviUser | null> => {\n const user = auth.getCurrentUser();\n\n if (!user) {\n return null;\n }\n\n return user as TaruviUser;\n },\n\n getPermissions: async () => {\n const user = auth.getCurrentUser();\n\n if (!user) {\n return null;\n }\n\n // Return any permissions from the JWT token\n // Typically stored in claims like 'permissions', 'roles', 'groups', etc.\n return {\n roles: user.roles || [],\n permissions: 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\n/**\n * Creates a Refine AccessControlProvider using Cerbos via the Policy client.\n *\n * This provides resource-based authorization checks using Cerbos policies.\n * Use this with Refine's `useCan` hook or `<CanAccess>` component.\n *\n * @example\n * ```tsx\n * import { Refine } from \"@refinedev/core\";\n * import { Client } from \"@taruvi/sdk\";\n * import { authProvider, accessControlProvider } from \"@taruvi-io/refine\";\n *\n * const client = new Client({ appSlug: \"my-app\", baseUrl: \"...\" });\n *\n * <Refine\n * authProvider={authProvider(client)}\n * accessControlProvider={accessControlProvider(client)}\n * // ...\n * />\n * ```\n */\nexport function accessControlProvider(client: Client): AccessControlProvider {\n const policy = new Policy(client);\n const auth = new Auth(client);\n\n return {\n can: async ({ resource, action, params }) => {\n const user = auth.getCurrentUser();\n\n if (!user) {\n return {\n can: false,\n reason: \"User not authenticated\",\n };\n }\n\n if (!resource) {\n return {\n can: false,\n reason: \"Resource not specified\",\n };\n }\n\n try {\n // Build principal from current user\n const principal = {\n id: String(user.user_id),\n roles: user.roles || [],\n attr: {\n username: user.username,\n email: user.email,\n is_staff: user.is_staff || false,\n is_superuser: user.is_superuser || false,\n groups: user.groups || [],\n },\n };\n\n // Build resource for Cerbos check\n const resources = [\n {\n tableName: resource,\n recordId: params?.id ? String(params.id) : \"*\",\n attributes: (params || {}) as Record<string, unknown>,\n actions: [action],\n },\n ];\n\n const result = await policy.checkResource(resources, principal) as {\n results?: Array<{ actions?: Record<string, { effect?: string }> }>;\n allowed?: boolean;\n reason?: string;\n };\n\n // Parse the Cerbos response\n // The response structure depends on your Cerbos setup\n if (result && typeof result === \"object\") {\n const allowed = result.results?.[0]?.actions?.[action]?.effect === \"EFFECT_ALLOW\"\n || result.allowed === true;\n\n return {\n can: allowed,\n reason: result.reason || (allowed ? undefined : \"Permission denied by policy\"),\n };\n }\n\n return {\n can: false,\n reason: \"Invalid policy response\",\n };\n } catch (error) {\n console.error(\"Cerbos permission check failed:\", error);\n return {\n can: false,\n reason: error instanceof Error ? error.message : \"Permission check failed\",\n };\n }\n },\n\n options: {\n buttons: {\n enableAccessControl: true,\n hideIfUnauthorized: false,\n },\n },\n };\n}\n"]}
1
+ {"version":3,"sources":["../src/utils.ts","../src/dataProvider.ts","../src/storageDataProvider.ts","../src/functionsDataProvider.ts","../src/appDataProvider.ts","../src/analyticsDataProvider.ts","../src/authProvider.ts"],"names":["Database","Storage","Functions","App","Analytics","Auth","Policy"],"mappings":"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","file":"index.cjs","sourcesContent":["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} from \"@refinedev/core\";\nimport { Client, Database } from \"@taruvi/sdk\";\nimport type { DatabaseFilters } from \"@taruvi/sdk\";\nimport type { TaruviListResponse, TaruviMeta } from \"./types.js\";\nimport {\n convertRefineFilters,\n convertRefineSorters,\n convertRefinePagination,\n formatAggregates,\n formatGroupBy,\n formatHaving\n} from \"./utils.js\";\n\n/**\n * Creates a Refine DataProvider for Taruvi database operations.\n */\nexport function dataProvider(client: Client): DataProvider {\n const config = client.getConfig();\n const baseApiUrl = `${config.baseUrl}/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 const buildFilters = (params: {\n filters?: GetListParams[\"filters\"];\n sorters?: GetListParams[\"sorters\"];\n pagination?: GetListParams[\"pagination\"];\n meta?: TaruviMeta;\n }): DatabaseFilters => {\n const filters: DatabaseFilters = {\n ...convertRefineFilters(params.filters),\n ...convertRefinePagination(params.pagination),\n };\n\n const ordering = convertRefineSorters(params.sorters);\n if (ordering) filters.ordering = ordering;\n\n if (params.meta?.select) {\n (filters as Record<string, unknown>).fields = Array.isArray(params.meta.select)\n ? params.meta.select.join(\",\")\n : params.meta.select;\n }\n\n if (params.meta?.populate) {\n (filters as Record<string, unknown>).populate = Array.isArray(params.meta.populate)\n ? params.meta.populate.join(\",\")\n : params.meta.populate;\n }\n\n // Add aggregation parameters\n const aggregateParam = formatAggregates(params.meta?.aggregate);\n if (aggregateParam) {\n (filters as Record<string, unknown>)._aggregate = aggregateParam;\n }\n\n const groupByParam = formatGroupBy(params.meta?.groupBy);\n if (groupByParam) {\n (filters as Record<string, unknown>)._group_by = groupByParam;\n }\n\n const havingParam = formatHaving(params.meta?.having);\n if (havingParam) {\n (filters as Record<string, unknown>)._having = havingParam;\n }\n\n return filters;\n };\n\n return {\n getList: async <TData extends BaseRecord = BaseRecord>(\n params: GetListParams\n ): Promise<GetListResponse<TData>> => {\n console.log(\"DataProvider getList called with params:\", params)\n const { resource, pagination, filters, sorters, meta } = params;\n const taruviMeta = meta as TaruviMeta | undefined;\n const tableName = getTableName(resource, taruviMeta); \n const dbFilters = buildFilters({ filters, sorters, pagination, meta: taruviMeta });\n\n const response = await new Database(client, {})\n .from(tableName)\n .filter(dbFilters)\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, meta } = params;\n const taruviMeta = meta as TaruviMeta | undefined;\n const tableName = getTableName(resource, taruviMeta);\n const dbFilters = buildFilters({ meta: taruviMeta });\n\n const { data } = await new Database(client, {})\n .from(tableName)\n .filter(dbFilters)\n .get(String(id))\n .execute() as TData;\n\n return { 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 const idColumn = getIdColumn(taruviMeta);\n\n const dbFilters = buildFilters({\n filters: [{ field: idColumn, operator: \"in\", value: ids }],\n meta: taruviMeta,\n });\n\n const response = await new Database(client, {})\n .from(tableName)\n .filter(dbFilters)\n .execute() as TaruviListResponse<TData>;\n\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 // POST /api/apps/{appSlug}/datatables/{tableName}/data/\n const data = await new Database(client, {})\n .from(tableName)\n .create(variables as object)\n .execute() as TData;\n\n return { 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 // SDK doesn't have batch create - create records individually\n const data = await Promise.all(\n variables.map(async (vars) => {\n return new Database(client, {})\n .from(tableName)\n .create(vars as object)\n .execute() as Promise<TData>;\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 // SDK update() uses POST - chain with get(id) to update specific record\n // POST /api/apps/{appSlug}/datatables/{tableName}/data/{recordId}/\n const data = await new Database(client, {})\n .from(tableName)\n .get(String(id))\n .update(variables as object)\n .execute() as TData;\n\n return { 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\n // SDK doesn't have batch update - update records individually\n const data = await Promise.all(\n ids.map(async (id) => {\n return new Database(client, {})\n .from(tableName)\n .get(String(id))\n .update(variables as object)\n .execute() as Promise<TData>;\n })\n );\n\n return { 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 const data = await new Database(client, {})\n .from(tableName)\n .delete(String(id))\n .execute() as TData;\n\n return { data };\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 const data = await Promise.all(\n ids.map(async (id) => {\n return new Database(client, {})\n .from(tableName)\n .delete(String(id))\n .execute() as Promise<TData>;\n })\n );\n\n return { data };\n },\n\n custom: async <TData extends BaseRecord = BaseRecord>(\n params: CustomParams\n ): Promise<CustomResponse<TData>> => {\n const { url, method, payload } = params;\n\n // Use the client's httpClient for custom API calls\n const fullUrl = url.startsWith('http') ? url : `${baseApiUrl}${url}`;\n\n let data: TData;\n switch (method.toLowerCase()) {\n case 'get':\n data = await client.httpClient.get(fullUrl) as TData;\n break;\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 '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 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 } 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.baseUrl}/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, {} as any)\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 // Return the direct URL - browser will handle authentication via headers\n const url = `${baseApiUrl}/storage/buckets/${bucket}/objects/${String(path)}`;\n const data = url as unknown as TData;\n\n return { 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 bucket = getBucketName(resource, taruviMeta);\n const { files, paths = [], metadatas = [] } = variables as unknown as StorageUploadVariables;\n\n // Use default filenames if paths not provided\n const filePaths = files.map((file, i) => paths[i] || file.name);\n const fileMetadatas = files.map((_, i) => metadatas[i] || {});\n\n const data = await new Storage(client, {} as any)\n .from(bucket)\n .upload({ files, paths: filePaths, metadatas: fileMetadatas })\n .execute() as TData;\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: path, variables, meta } = params;\n const taruviMeta = meta as TaruviMeta | undefined;\n const bucket = getBucketName(resource, taruviMeta);\n\n const data = await new Storage(client, {} as any)\n .from(bucket)\n .update(String(path), variables as object)\n .execute() as TData;\n\n return { 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 // SDK delete() now accepts array, handles both single and batch\n const data = await new Storage(client, {} as any)\n .from(bucket)\n .delete([String(path)])\n .execute() as TData;\n\n return { data };\n },\n\n getApiUrl: () => baseApiUrl,\n\n // Not applicable for storage - return empty array\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 // SDK upload() handles batch upload\n const filePaths = files.map((file, i) => paths[i] || file.name);\n const fileMetadatas = files.map((_, i) => metadatas[i] || {});\n\n const data = await new Storage(client, {} as any)\n .from(bucket)\n .upload({ files, paths: filePaths, metadatas: fileMetadatas })\n .execute() as TData;\n\n return { data };\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 // SDK delete() handles batch delete\n const data = await new Storage(client, {} as any)\n .from(bucket)\n .delete(ids.map(String))\n .execute() as TData;\n\n return { data: [data] };\n },\n\n custom: async <TData extends BaseRecord = BaseRecord>(\n params: CustomParams\n ): Promise<CustomResponse<TData>> => {\n const { url, method, payload } = params;\n\n const fullUrl = url.startsWith('http') ? url : `${baseApiUrl}${url}`;\n\n let data: TData;\n switch (method.toLowerCase()) {\n case 'get':\n data = await client.httpClient.get(fullUrl) as TData;\n break;\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 '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 CustomParams,\n CustomResponse,\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/**\n * Creates a Refine DataProvider for Taruvi edge function execution.\n *\n * This provider is specialized for executing serverless functions.\n * Use the `custom` method to invoke functions by name.\n *\n * @example\n * ```typescript\n * const { data } = await dataProvider.custom({\n * url: \"my-function-slug\",\n * method: \"post\",\n * payload: { key: \"value\" },\n * meta: { async: false }\n * });\n * ```\n */\nexport function functionsDataProvider(client: Client): DataProvider {\n const config = client.getConfig();\n const baseApiUrl = `${config.baseUrl}/api/apps/${config.appSlug}`;\n const functions = new Functions(client);\n\n return {\n custom: async <TData extends BaseRecord = BaseRecord>(\n params: CustomParams\n ): Promise<CustomResponse<TData>> => {\n const { url: functionSlug, payload, meta } = params;\n const functionMeta = meta as FunctionMeta | undefined;\n\n const response = await functions.execute<TData>(functionSlug, {\n async: functionMeta?.async ?? false,\n params: payload 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 CRUD operations\n getList: async () => { throw new Error(\"getList is not supported for edge functions\"); },\n getOne: async () => { throw new Error(\"getOne is not supported for edge functions\"); },\n getMany: async () => { throw new Error(\"getMany is not supported for edge functions\"); },\n create: async () => { throw new Error(\"create is not supported for edge functions\"); },\n createMany: async () => { throw new Error(\"createMany is not supported for edge functions\"); },\n update: async () => { throw new Error(\"update is not supported for edge functions\"); },\n updateMany: async () => { throw new Error(\"updateMany is not supported for edge functions\"); },\n deleteOne: async () => { throw new Error(\"deleteOne is not supported for edge functions\"); },\n deleteMany: async () => { throw new Error(\"deleteMany is not supported for edge functions\"); },\n };\n}\n","import type {\n DataProvider,\n BaseRecord,\n GetListParams,\n GetListResponse,\n} from \"@refinedev/core\";\nimport { Client, App } from \"@taruvi/sdk\";\nimport type { RoleResponse } from \"@taruvi/sdk\";\n\n/**\n * Response type for roles list from the App service.\n */\ninterface RolesListResponse {\n data: RoleResponse[];\n total: number;\n}\n\n/**\n * Creates a Refine DataProvider for Taruvi App operations.\n *\n * This provider is specialized for fetching app-level data like roles.\n * Use `getList` with resource=\"roles\" to fetch app roles.\n *\n * @example\n * ```typescript\n * const { data } = useList({\n * dataProviderName: \"app\",\n * resource: \"roles\",\n * });\n * ```\n */\nexport function appDataProvider(client: Client): DataProvider {\n const config = client.getConfig();\n const baseApiUrl = `${config.baseUrl}/api/apps/${config.appSlug}`;\n\n return {\n getList: async <TData extends BaseRecord = BaseRecord>(\n params: GetListParams\n ): Promise<GetListResponse<TData>> => {\n const { resource } = 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 TData[],\n total: response.total ?? (Array.isArray(response) ? response.length : response.data?.length ?? 0),\n };\n }\n\n throw new Error(`Unknown app resource: ${resource}. Supported resources: roles`);\n },\n\n getApiUrl: () => baseApiUrl,\n\n // App resources are read-only\n getOne: async () => { throw new Error(\"getOne is not supported for app resources\"); },\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\"); },\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 custom: async () => { throw new Error(\"custom is not supported for app resources\"); },\n };\n}\n","import type {\n DataProvider,\n BaseRecord,\n CustomParams,\n CustomResponse,\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 /** Parameters to pass to the analytics query */\n params?: Record<string, unknown>;\n}\n\n/**\n * Creates a Refine DataProvider for Taruvi Analytics operations.\n *\n * This provider is specialized for executing analytics queries.\n * Use the `custom` method to invoke analytics queries by name.\n *\n * @example\n * ```typescript\n * const { data } = await dataProvider.custom({\n * url: \"monthly-sales-report\",\n * method: \"post\",\n * payload: { start_date: \"2024-01-01\", end_date: \"2024-12-31\" },\n * });\n * ```\n *\n * @example\n * ```typescript\n * // Using useCustom hook\n * const { data } = useCustom({\n * dataProviderName: \"analytics\",\n * url: \"dashboard-metrics\",\n * method: \"post\",\n * config: {\n * payload: { period: \"last_30_days\" },\n * },\n * });\n * ```\n */\nexport function analyticsDataProvider(client: Client): DataProvider {\n const config = client.getConfig();\n const baseApiUrl = `${config.baseUrl}/api/apps/${config.appSlug}`;\n const analytics = new Analytics(client);\n\n return {\n custom: async <TData extends BaseRecord = BaseRecord>(\n params: CustomParams\n ): Promise<CustomResponse<TData>> => {\n const { url: querySlug, payload } = params;\n\n const response = await analytics.execute<TData>(querySlug, {\n params: payload as Record<string, unknown>,\n });\n\n return { data: response.data as TData };\n },\n\n getApiUrl: () => baseApiUrl,\n\n // Analytics queries don't support standard CRUD operations\n getList: async () => { throw new Error(\"getList is not supported for analytics. Use custom() to execute queries\"); },\n getOne: async () => { throw new Error(\"getOne is not supported for analytics. Use custom() to execute queries\"); },\n getMany: async () => { throw new Error(\"getMany is not supported for analytics. Use custom() to execute queries\"); },\n create: async () => { throw new Error(\"create is not supported for analytics. Use custom() to execute queries\"); },\n createMany: async () => { throw new Error(\"createMany is not supported for analytics. Use custom() to execute queries\"); },\n update: async () => { throw new Error(\"update is not supported for analytics. Use custom() to execute queries\"); },\n updateMany: async () => { throw new Error(\"updateMany is not supported for analytics. Use custom() to execute queries\"); },\n deleteOne: async () => { throw new Error(\"deleteOne is not supported for analytics. Use custom() to execute queries\"); },\n deleteMany: async () => { throw new Error(\"deleteMany is not supported for analytics. Use custom() to execute queries\"); },\n };\n}\n","import type { AuthProvider, AccessControlProvider } from \"@refinedev/core\";\nimport { Client, Auth, Policy } from \"@taruvi/sdk\";\n\n/**\n * User identity returned from JWT token\n */\nexport interface TaruviUser {\n user_id: number;\n username: string;\n email?: string;\n exp?: number;\n iat?: number;\n jti?: string;\n token_type?: string;\n [key: string]: unknown;\n}\n\n/**\n * Login params - supports both redirect flow and credentials flow\n */\nexport interface LoginParams {\n /** For redirect-based login - URL to redirect after successful login */\n callbackUrl?: string;\n /** For credentials-based login (if supported) */\n username?: string;\n password?: string;\n /** Whether to use redirect flow (default: true) */\n redirect?: boolean;\n}\n\n/**\n * Logout params\n */\nexport interface LogoutParams {\n /** URL to redirect after logout */\n callbackUrl?: string;\n}\n\n/**\n * Register/Signup params\n */\nexport interface RegisterParams {\n /** URL to redirect after successful signup */\n callbackUrl?: string;\n}\n\n/**\n * Creates a Refine AuthProvider for Taruvi authentication.\n *\n * Supports redirect-based authentication flow (Web UI Flow):\n * 1. User calls login() → Redirects to backend /accounts/login/\n * 2. User authenticates on backend\n * 3. Backend redirects back with tokens in URL hash\n * 4. Client extracts and stores tokens automatically\n */\nexport function authProvider(client: Client): AuthProvider {\n const auth = new Auth(client);\n\n return {\n login: async (params: LoginParams = {}) => {\n const { callbackUrl, redirect = true } = params;\n\n // Check if already authenticated first (prevents infinite redirect loop)\n\n // TODO: check if this is necessary\n if (auth.isUserAuthenticated()) {\n return {\n success: true,\n redirectTo: callbackUrl || \"/\",\n };\n }\n\n if (redirect) {\n // Redirect-based login flow\n auth.login(callbackUrl);\n\n // Return success since we're redirecting\n // The actual auth state will be checked after redirect\n return {\n success: true,\n };\n }\n\n return {\n success: false,\n error: {\n name: \"LoginError\",\n message: \"Login failed. Please try again.\",\n },\n };\n },\n\n logout: async (params: LogoutParams = {}) => {\n const { callbackUrl } = params;\n\n auth.logout(callbackUrl);\n\n return {\n success: true,\n redirectTo: callbackUrl || \"/login\",\n };\n },\n\n check: async () => {\n // Check if user is authenticated\n if (auth.isUserAuthenticated()) {\n // Check if token is expired\n if (auth.isTokenExpired()) {\n // Try to refresh the token\n const refreshed = await auth.refreshAccessToken();\n\n if (refreshed) {\n return {\n authenticated: true,\n };\n }\n\n // Token refresh failed\n return {\n authenticated: false,\n logout: true,\n redirectTo: \"/login\",\n error: {\n name: \"SessionExpired\",\n message: \"Your session has expired. Please log in again.\",\n },\n };\n }\n\n return {\n authenticated: true,\n };\n }\n\n return {\n authenticated: false,\n redirectTo: \"/login\",\n };\n },\n\n //TODO need to check if max retries logic is needed\n onError: async (error) => {\n const status = error?.statusCode || error?.status || error?.response?.status;\n\n // Handle 401 Unauthorized\n if (status === 401) {\n // Try to refresh token first\n if (auth.isUserAuthenticated()) {\n const refreshed = await auth.refreshAccessToken();\n\n if (refreshed) {\n // Token refreshed, retry the request\n return {\n error,\n };\n }\n }\n\n return {\n logout: true,\n redirectTo: \"/login\",\n error,\n };\n }\n\n // Handle 403 Forbidden\n if (status === 403) {\n return {\n error,\n // Don't logout for 403, user is authenticated but not authorized\n };\n }\n\n return {\n error,\n };\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 (): Promise<TaruviUser | null> => {\n const user = auth.getCurrentUser();\n\n if (!user) {\n return null;\n }\n\n return user as TaruviUser;\n },\n\n getPermissions: async () => {\n const user = auth.getCurrentUser();\n\n if (!user) {\n return null;\n }\n\n // Return any permissions from the JWT token\n // Typically stored in claims like 'permissions', 'roles', 'groups', etc.\n return {\n roles: user.roles || [],\n permissions: 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\n/**\n * Creates a Refine AccessControlProvider using Cerbos via the Policy client.\n *\n * This provides resource-based authorization checks using Cerbos policies.\n * Use this with Refine's `useCan` hook or `<CanAccess>` component.\n *\n * @example\n * ```tsx\n * import { Refine } from \"@refinedev/core\";\n * import { Client } from \"@taruvi/sdk\";\n * import { authProvider, accessControlProvider } from \"@taruvi-io/refine\";\n *\n * const client = new Client({ appSlug: \"my-app\", baseUrl: \"...\" });\n *\n * <Refine\n * authProvider={authProvider(client)}\n * accessControlProvider={accessControlProvider(client)}\n * // ...\n * />\n * ```\n */\nexport function accessControlProvider(client: Client): AccessControlProvider {\n const policy = new Policy(client);\n const auth = new Auth(client);\n\n return {\n can: async ({ resource, action, params }) => {\n const user = auth.getCurrentUser();\n\n if (!user) {\n return {\n can: false,\n reason: \"User not authenticated\",\n };\n }\n\n if (!resource) {\n return {\n can: false,\n reason: \"Resource not specified\",\n };\n }\n\n try {\n // Get entityType from resource meta\n const entityType = params?.resource?.meta?.entityType as string;\n\n // Build resource for Cerbos check\n const resources = [\n {\n entityType,\n tableName: resource,\n recordId: params?.id ? String(params.id) : \"*\",\n attributes: (params || {}) as Record<string, unknown>,\n actions: [action],\n },\n ];\n\n const result = await policy.checkResource(resources) as {\n results?: Array<{ actions?: Record<string, string> }>;\n allowed?: boolean;\n reason?: string;\n };\n\n // Parse the Cerbos response\n if (result && typeof result === \"object\") {\n const actionResult = result.results?.[0]?.actions?.[action];\n const allowed = actionResult === \"EFFECT_ALLOW\" || result.allowed === true;\n\n return {\n can: allowed,\n reason: result.reason || (allowed ? undefined : \"Permission denied by policy\"),\n };\n }\n\n return {\n can: false,\n reason: \"Invalid policy response\",\n };\n } catch (error) {\n console.error(\"Cerbos permission check failed:\", error);\n return {\n can: false,\n reason: error instanceof Error ? error.message : \"Permission check failed\",\n };\n }\n },\n\n options: {\n buttons: {\n enableAccessControl: true,\n hideIfUnauthorized: false,\n },\n },\n };\n}\n"]}
package/dist/index.d.cts CHANGED
@@ -1,6 +1,6 @@
1
1
  import { DataProvider, AuthProvider, AccessControlProvider, MetaQuery, CrudFilter, CrudSort, Pagination } from '@refinedev/core';
2
2
  import { Client } from '@taruvi/sdk';
3
- export { Auth, Client, Policy, TaruviConfig } from '@taruvi/sdk';
3
+ export { Analytics, AnalyticsRequest, AnalyticsResponse, App, Auth, Client, Functions, Policy, RoleResponse, TaruviConfig } from '@taruvi/sdk';
4
4
 
5
5
  /**
6
6
  * Creates a Refine DataProvider for Taruvi database operations.
@@ -20,6 +20,84 @@ interface StorageUploadVariables {
20
20
  */
21
21
  declare function storageDataProvider(client: Client): DataProvider;
22
22
 
23
+ /**
24
+ * Extended meta options for function execution.
25
+ */
26
+ interface FunctionMeta {
27
+ /** Whether to execute the function asynchronously */
28
+ async?: boolean;
29
+ }
30
+ /**
31
+ * Creates a Refine DataProvider for Taruvi edge function execution.
32
+ *
33
+ * This provider is specialized for executing serverless functions.
34
+ * Use the `custom` method to invoke functions by name.
35
+ *
36
+ * @example
37
+ * ```typescript
38
+ * const { data } = await dataProvider.custom({
39
+ * url: "my-function-slug",
40
+ * method: "post",
41
+ * payload: { key: "value" },
42
+ * meta: { async: false }
43
+ * });
44
+ * ```
45
+ */
46
+ declare function functionsDataProvider(client: Client): DataProvider;
47
+
48
+ /**
49
+ * Creates a Refine DataProvider for Taruvi App operations.
50
+ *
51
+ * This provider is specialized for fetching app-level data like roles.
52
+ * Use `getList` with resource="roles" to fetch app roles.
53
+ *
54
+ * @example
55
+ * ```typescript
56
+ * const { data } = useList({
57
+ * dataProviderName: "app",
58
+ * resource: "roles",
59
+ * });
60
+ * ```
61
+ */
62
+ declare function appDataProvider(client: Client): DataProvider;
63
+
64
+ /**
65
+ * Extended meta options for analytics query execution.
66
+ */
67
+ interface AnalyticsMeta {
68
+ /** Parameters to pass to the analytics query */
69
+ params?: Record<string, unknown>;
70
+ }
71
+ /**
72
+ * Creates a Refine DataProvider for Taruvi Analytics operations.
73
+ *
74
+ * This provider is specialized for executing analytics queries.
75
+ * Use the `custom` method to invoke analytics queries by name.
76
+ *
77
+ * @example
78
+ * ```typescript
79
+ * const { data } = await dataProvider.custom({
80
+ * url: "monthly-sales-report",
81
+ * method: "post",
82
+ * payload: { start_date: "2024-01-01", end_date: "2024-12-31" },
83
+ * });
84
+ * ```
85
+ *
86
+ * @example
87
+ * ```typescript
88
+ * // Using useCustom hook
89
+ * const { data } = useCustom({
90
+ * dataProviderName: "analytics",
91
+ * url: "dashboard-metrics",
92
+ * method: "post",
93
+ * config: {
94
+ * payload: { period: "last_30_days" },
95
+ * },
96
+ * });
97
+ * ```
98
+ */
99
+ declare function analyticsDataProvider(client: Client): DataProvider;
100
+
23
101
  /**
24
102
  * User identity returned from JWT token
25
103
  */
@@ -187,4 +265,4 @@ declare function buildQueryString(params?: Record<string, unknown>): string;
187
265
  */
188
266
  declare function handleError(error: unknown): never;
189
267
 
190
- export { type LoginParams, type LogoutParams, REFINE_OPERATOR_MAP, type RegisterParams, type StorageUploadVariables, type TaruviListResponse, type TaruviMeta, type TaruviUser, accessControlProvider, authProvider, buildQueryString, buildRefineQueryParams, convertRefineFilters, convertRefinePagination, convertRefineSorters, dataProvider, handleError, storageDataProvider };
268
+ export { type AnalyticsMeta, type FunctionMeta, type LoginParams, type LogoutParams, REFINE_OPERATOR_MAP, type RegisterParams, type StorageUploadVariables, type TaruviListResponse, type TaruviMeta, type TaruviUser, accessControlProvider, analyticsDataProvider, appDataProvider, authProvider, buildQueryString, buildRefineQueryParams, convertRefineFilters, convertRefinePagination, convertRefineSorters, dataProvider, functionsDataProvider, handleError, storageDataProvider };
package/dist/index.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import { DataProvider, AuthProvider, AccessControlProvider, MetaQuery, CrudFilter, CrudSort, Pagination } from '@refinedev/core';
2
2
  import { Client } from '@taruvi/sdk';
3
- export { Auth, Client, Policy, TaruviConfig } from '@taruvi/sdk';
3
+ export { Analytics, AnalyticsRequest, AnalyticsResponse, App, Auth, Client, Functions, Policy, RoleResponse, TaruviConfig } from '@taruvi/sdk';
4
4
 
5
5
  /**
6
6
  * Creates a Refine DataProvider for Taruvi database operations.
@@ -20,6 +20,84 @@ interface StorageUploadVariables {
20
20
  */
21
21
  declare function storageDataProvider(client: Client): DataProvider;
22
22
 
23
+ /**
24
+ * Extended meta options for function execution.
25
+ */
26
+ interface FunctionMeta {
27
+ /** Whether to execute the function asynchronously */
28
+ async?: boolean;
29
+ }
30
+ /**
31
+ * Creates a Refine DataProvider for Taruvi edge function execution.
32
+ *
33
+ * This provider is specialized for executing serverless functions.
34
+ * Use the `custom` method to invoke functions by name.
35
+ *
36
+ * @example
37
+ * ```typescript
38
+ * const { data } = await dataProvider.custom({
39
+ * url: "my-function-slug",
40
+ * method: "post",
41
+ * payload: { key: "value" },
42
+ * meta: { async: false }
43
+ * });
44
+ * ```
45
+ */
46
+ declare function functionsDataProvider(client: Client): DataProvider;
47
+
48
+ /**
49
+ * Creates a Refine DataProvider for Taruvi App operations.
50
+ *
51
+ * This provider is specialized for fetching app-level data like roles.
52
+ * Use `getList` with resource="roles" to fetch app roles.
53
+ *
54
+ * @example
55
+ * ```typescript
56
+ * const { data } = useList({
57
+ * dataProviderName: "app",
58
+ * resource: "roles",
59
+ * });
60
+ * ```
61
+ */
62
+ declare function appDataProvider(client: Client): DataProvider;
63
+
64
+ /**
65
+ * Extended meta options for analytics query execution.
66
+ */
67
+ interface AnalyticsMeta {
68
+ /** Parameters to pass to the analytics query */
69
+ params?: Record<string, unknown>;
70
+ }
71
+ /**
72
+ * Creates a Refine DataProvider for Taruvi Analytics operations.
73
+ *
74
+ * This provider is specialized for executing analytics queries.
75
+ * Use the `custom` method to invoke analytics queries by name.
76
+ *
77
+ * @example
78
+ * ```typescript
79
+ * const { data } = await dataProvider.custom({
80
+ * url: "monthly-sales-report",
81
+ * method: "post",
82
+ * payload: { start_date: "2024-01-01", end_date: "2024-12-31" },
83
+ * });
84
+ * ```
85
+ *
86
+ * @example
87
+ * ```typescript
88
+ * // Using useCustom hook
89
+ * const { data } = useCustom({
90
+ * dataProviderName: "analytics",
91
+ * url: "dashboard-metrics",
92
+ * method: "post",
93
+ * config: {
94
+ * payload: { period: "last_30_days" },
95
+ * },
96
+ * });
97
+ * ```
98
+ */
99
+ declare function analyticsDataProvider(client: Client): DataProvider;
100
+
23
101
  /**
24
102
  * User identity returned from JWT token
25
103
  */
@@ -187,4 +265,4 @@ declare function buildQueryString(params?: Record<string, unknown>): string;
187
265
  */
188
266
  declare function handleError(error: unknown): never;
189
267
 
190
- export { type LoginParams, type LogoutParams, REFINE_OPERATOR_MAP, type RegisterParams, type StorageUploadVariables, type TaruviListResponse, type TaruviMeta, type TaruviUser, accessControlProvider, authProvider, buildQueryString, buildRefineQueryParams, convertRefineFilters, convertRefinePagination, convertRefineSorters, dataProvider, handleError, storageDataProvider };
268
+ export { type AnalyticsMeta, type FunctionMeta, type LoginParams, type LogoutParams, REFINE_OPERATOR_MAP, type RegisterParams, type StorageUploadVariables, type TaruviListResponse, type TaruviMeta, type TaruviUser, accessControlProvider, analyticsDataProvider, appDataProvider, authProvider, buildQueryString, buildRefineQueryParams, convertRefineFilters, convertRefinePagination, convertRefineSorters, dataProvider, functionsDataProvider, handleError, storageDataProvider };
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
- import { Database, Storage, Auth, Policy } from '@taruvi/sdk';
2
- export { Auth, Client, Policy } from '@taruvi/sdk';
1
+ import { Database, Storage, Functions, App, Analytics, Auth, Policy } from '@taruvi/sdk';
2
+ export { Analytics, App, Auth, Client, Functions, Policy } from '@taruvi/sdk';
3
3
 
4
4
  // src/dataProvider.ts
5
5
 
@@ -403,6 +403,141 @@ function storageDataProvider(client) {
403
403
  updateMany: void 0
404
404
  };
405
405
  }
406
+ function functionsDataProvider(client) {
407
+ const config = client.getConfig();
408
+ const baseApiUrl = `${config.baseUrl}/api/apps/${config.appSlug}`;
409
+ const functions = new Functions(client);
410
+ return {
411
+ custom: async (params) => {
412
+ const { url: functionSlug, payload, meta } = params;
413
+ const functionMeta = meta;
414
+ const response = await functions.execute(functionSlug, {
415
+ async: functionMeta?.async ?? false,
416
+ params: payload
417
+ });
418
+ return { data: response.data };
419
+ },
420
+ getApiUrl: () => baseApiUrl,
421
+ // Edge functions don't support CRUD operations
422
+ getList: async () => {
423
+ throw new Error("getList is not supported for edge functions");
424
+ },
425
+ getOne: async () => {
426
+ throw new Error("getOne is not supported for edge functions");
427
+ },
428
+ getMany: async () => {
429
+ throw new Error("getMany is not supported for edge functions");
430
+ },
431
+ create: async () => {
432
+ throw new Error("create is not supported for edge functions");
433
+ },
434
+ createMany: async () => {
435
+ throw new Error("createMany is not supported for edge functions");
436
+ },
437
+ update: async () => {
438
+ throw new Error("update is not supported for edge functions");
439
+ },
440
+ updateMany: async () => {
441
+ throw new Error("updateMany is not supported for edge functions");
442
+ },
443
+ deleteOne: async () => {
444
+ throw new Error("deleteOne is not supported for edge functions");
445
+ },
446
+ deleteMany: async () => {
447
+ throw new Error("deleteMany is not supported for edge functions");
448
+ }
449
+ };
450
+ }
451
+ function appDataProvider(client) {
452
+ const config = client.getConfig();
453
+ const baseApiUrl = `${config.baseUrl}/api/apps/${config.appSlug}`;
454
+ return {
455
+ getList: async (params) => {
456
+ const { resource } = params;
457
+ if (resource === "roles") {
458
+ const app = new App(client);
459
+ const response = await app.roles().execute();
460
+ return {
461
+ data: response.data || response,
462
+ total: response.total ?? (Array.isArray(response) ? response.length : response.data?.length ?? 0)
463
+ };
464
+ }
465
+ throw new Error(`Unknown app resource: ${resource}. Supported resources: roles`);
466
+ },
467
+ getApiUrl: () => baseApiUrl,
468
+ // App resources are read-only
469
+ getOne: async () => {
470
+ throw new Error("getOne is not supported for app resources");
471
+ },
472
+ getMany: async () => {
473
+ throw new Error("getMany is not supported for app resources");
474
+ },
475
+ create: async () => {
476
+ throw new Error("create is not supported for app resources");
477
+ },
478
+ createMany: async () => {
479
+ throw new Error("createMany is not supported for app resources");
480
+ },
481
+ update: async () => {
482
+ throw new Error("update is not supported for app resources");
483
+ },
484
+ updateMany: async () => {
485
+ throw new Error("updateMany is not supported for app resources");
486
+ },
487
+ deleteOne: async () => {
488
+ throw new Error("deleteOne is not supported for app resources");
489
+ },
490
+ deleteMany: async () => {
491
+ throw new Error("deleteMany is not supported for app resources");
492
+ },
493
+ custom: async () => {
494
+ throw new Error("custom is not supported for app resources");
495
+ }
496
+ };
497
+ }
498
+ function analyticsDataProvider(client) {
499
+ const config = client.getConfig();
500
+ const baseApiUrl = `${config.baseUrl}/api/apps/${config.appSlug}`;
501
+ const analytics = new Analytics(client);
502
+ return {
503
+ custom: async (params) => {
504
+ const { url: querySlug, payload } = params;
505
+ const response = await analytics.execute(querySlug, {
506
+ params: payload
507
+ });
508
+ return { data: response.data };
509
+ },
510
+ getApiUrl: () => baseApiUrl,
511
+ // Analytics queries don't support standard CRUD operations
512
+ getList: async () => {
513
+ throw new Error("getList is not supported for analytics. Use custom() to execute queries");
514
+ },
515
+ getOne: async () => {
516
+ throw new Error("getOne is not supported for analytics. Use custom() to execute queries");
517
+ },
518
+ getMany: async () => {
519
+ throw new Error("getMany is not supported for analytics. Use custom() to execute queries");
520
+ },
521
+ create: async () => {
522
+ throw new Error("create is not supported for analytics. Use custom() to execute queries");
523
+ },
524
+ createMany: async () => {
525
+ throw new Error("createMany is not supported for analytics. Use custom() to execute queries");
526
+ },
527
+ update: async () => {
528
+ throw new Error("update is not supported for analytics. Use custom() to execute queries");
529
+ },
530
+ updateMany: async () => {
531
+ throw new Error("updateMany is not supported for analytics. Use custom() to execute queries");
532
+ },
533
+ deleteOne: async () => {
534
+ throw new Error("deleteOne is not supported for analytics. Use custom() to execute queries");
535
+ },
536
+ deleteMany: async () => {
537
+ throw new Error("deleteMany is not supported for analytics. Use custom() to execute queries");
538
+ }
539
+ };
540
+ }
406
541
  function authProvider(client) {
407
542
  const auth = new Auth(client);
408
543
  return {
@@ -540,28 +675,20 @@ function accessControlProvider(client) {
540
675
  };
541
676
  }
542
677
  try {
543
- const principal = {
544
- id: String(user.user_id),
545
- roles: user.roles || [],
546
- attr: {
547
- username: user.username,
548
- email: user.email,
549
- is_staff: user.is_staff || false,
550
- is_superuser: user.is_superuser || false,
551
- groups: user.groups || []
552
- }
553
- };
678
+ const entityType = params?.resource?.meta?.entityType;
554
679
  const resources = [
555
680
  {
681
+ entityType,
556
682
  tableName: resource,
557
683
  recordId: params?.id ? String(params.id) : "*",
558
684
  attributes: params || {},
559
685
  actions: [action]
560
686
  }
561
687
  ];
562
- const result = await policy.checkResource(resources, principal);
688
+ const result = await policy.checkResource(resources);
563
689
  if (result && typeof result === "object") {
564
- const allowed = result.results?.[0]?.actions?.[action]?.effect === "EFFECT_ALLOW" || result.allowed === true;
690
+ const actionResult = result.results?.[0]?.actions?.[action];
691
+ const allowed = actionResult === "EFFECT_ALLOW" || result.allowed === true;
565
692
  return {
566
693
  can: allowed,
567
694
  reason: result.reason || (allowed ? void 0 : "Permission denied by policy")
@@ -588,6 +715,6 @@ function accessControlProvider(client) {
588
715
  };
589
716
  }
590
717
 
591
- export { REFINE_OPERATOR_MAP, accessControlProvider, authProvider, buildQueryString, buildRefineQueryParams, convertRefineFilters, convertRefinePagination, convertRefineSorters, dataProvider, handleError, storageDataProvider };
718
+ export { REFINE_OPERATOR_MAP, accessControlProvider, analyticsDataProvider, appDataProvider, authProvider, buildQueryString, buildRefineQueryParams, convertRefineFilters, convertRefinePagination, convertRefineSorters, dataProvider, functionsDataProvider, handleError, storageDataProvider };
592
719
  //# sourceMappingURL=index.js.map
593
720
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/utils.ts","../src/dataProvider.ts","../src/storageDataProvider.ts","../src/authProvider.ts"],"names":[],"mappings":";;;;;;AAOO,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;AAQO,SAAS,iBAAiB,UAAA,EAA2C;AAC1E,EAAA,IAAI,CAAC,UAAA,IAAc,UAAA,CAAW,MAAA,KAAW,GAAG,OAAO,MAAA;AACnD,EAAA,OAAO,UAAA,CAAW,KAAK,GAAG,CAAA;AAC5B;AAOO,SAAS,cAAc,OAAA,EAAwC;AACpE,EAAA,IAAI,CAAC,OAAA,IAAW,OAAA,CAAQ,MAAA,KAAW,GAAG,OAAO,MAAA;AAC7C,EAAA,OAAO,OAAA,CAAQ,KAAK,GAAG,CAAA;AACzB;AAQO,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;;;AC3OO,SAAS,aAAa,MAAA,EAA8B;AACzD,EAAA,MAAM,MAAA,GAAS,OAAO,SAAA,EAAU;AAChC,EAAA,MAAM,aAAa,CAAA,EAAG,MAAA,CAAO,OAAO,CAAA,UAAA,EAAa,OAAO,OAAO,CAAA,CAAA;AAE/D,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,MAAM,YAAA,GAAe,CAAC,MAAA,KAKC;AACrB,IAAA,MAAM,OAAA,GAA2B;AAAA,MAC/B,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,IAAI,MAAA,CAAO,MAAM,MAAA,EAAQ;AACvB,MAAC,OAAA,CAAoC,MAAA,GAAS,KAAA,CAAM,OAAA,CAAQ,OAAO,IAAA,CAAK,MAAM,CAAA,GAC1E,MAAA,CAAO,KAAK,MAAA,CAAO,IAAA,CAAK,GAAG,CAAA,GAC3B,OAAO,IAAA,CAAK,MAAA;AAAA,IAClB;AAEA,IAAA,IAAI,MAAA,CAAO,MAAM,QAAA,EAAU;AACzB,MAAC,OAAA,CAAoC,QAAA,GAAW,KAAA,CAAM,OAAA,CAAQ,OAAO,IAAA,CAAK,QAAQ,CAAA,GAC9E,MAAA,CAAO,KAAK,QAAA,CAAS,IAAA,CAAK,GAAG,CAAA,GAC7B,OAAO,IAAA,CAAK,QAAA;AAAA,IAClB;AAGA,IAAA,MAAM,cAAA,GAAiB,gBAAA,CAAiB,MAAA,CAAO,IAAA,EAAM,SAAS,CAAA;AAC9D,IAAA,IAAI,cAAA,EAAgB;AAClB,MAAC,QAAoC,UAAA,GAAa,cAAA;AAAA,IACpD;AAEA,IAAA,MAAM,YAAA,GAAe,aAAA,CAAc,MAAA,CAAO,IAAA,EAAM,OAAO,CAAA;AACvD,IAAA,IAAI,YAAA,EAAc;AAChB,MAAC,QAAoC,SAAA,GAAY,YAAA;AAAA,IACnD;AAEA,IAAA,MAAM,WAAA,GAAc,YAAA,CAAa,MAAA,CAAO,IAAA,EAAM,MAAM,CAAA;AACpD,IAAA,IAAI,WAAA,EAAa;AACf,MAAC,QAAoC,OAAA,GAAU,WAAA;AAAA,IACjD;AAEA,IAAA,OAAO,OAAA;AAAA,EACT,CAAA;AAEA,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,OACP,MAAA,KACoC;AACpC,MAAA,OAAA,CAAQ,GAAA,CAAI,4CAA4C,MAAM,CAAA;AAC9D,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;AACnD,MAAA,MAAM,SAAA,GAAY,aAAa,EAAE,OAAA,EAAS,SAAS,UAAA,EAAY,IAAA,EAAM,YAAY,CAAA;AAEjF,MAAA,MAAM,QAAA,GAAW,MAAM,IAAI,QAAA,CAAS,QAAQ,EAAE,CAAA,CAC3C,IAAA,CAAK,SAAS,CAAA,CACd,MAAA,CAAO,SAAS,EAChB,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,EAAK,GAAI,MAAA;AAC/B,MAAA,MAAM,UAAA,GAAa,IAAA;AACnB,MAAA,MAAM,SAAA,GAAY,YAAA,CAAa,QAAA,EAAU,UAAU,CAAA;AACnD,MAAA,MAAM,SAAA,GAAY,YAAA,CAAa,EAAE,IAAA,EAAM,YAAY,CAAA;AAEnD,MAAA,MAAM,EAAE,MAAK,GAAI,MAAM,IAAI,QAAA,CAAS,MAAA,EAAQ,EAAE,CAAA,CAC3C,KAAK,SAAS,CAAA,CACd,OAAO,SAAS,CAAA,CAChB,IAAI,MAAA,CAAO,EAAE,CAAC,CAAA,CACd,OAAA,EAAQ;AAEX,MAAA,OAAO,EAAE,IAAA,EAAK;AAAA,IAChB,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;AACnD,MAAA,MAAM,QAAA,GAAW,YAAY,UAAU,CAAA;AAEvC,MAAA,MAAM,YAAY,YAAA,CAAa;AAAA,QAC7B,OAAA,EAAS,CAAC,EAAE,KAAA,EAAO,UAAU,QAAA,EAAU,IAAA,EAAM,KAAA,EAAO,GAAA,EAAK,CAAA;AAAA,QACzD,IAAA,EAAM;AAAA,OACP,CAAA;AAED,MAAA,MAAM,QAAA,GAAW,MAAM,IAAI,QAAA,CAAS,QAAQ,EAAE,CAAA,CAC3C,IAAA,CAAK,SAAS,CAAA,CACd,MAAA,CAAO,SAAS,EAChB,OAAA,EAAQ;AAEX,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;AAGnD,MAAA,MAAM,IAAA,GAAO,MAAM,IAAI,QAAA,CAAS,QAAQ,EAAE,CAAA,CACvC,IAAA,CAAK,SAAS,CAAA,CACd,MAAA,CAAO,SAAmB,EAC1B,OAAA,EAAQ;AAEX,MAAA,OAAO,EAAE,IAAA,EAAK;AAAA,IAChB,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;AAGnD,MAAA,MAAM,IAAA,GAAO,MAAM,OAAA,CAAQ,GAAA;AAAA,QACzB,SAAA,CAAU,GAAA,CAAI,OAAO,IAAA,KAAS;AAC5B,UAAA,OAAO,IAAI,QAAA,CAAS,MAAA,EAAQ,EAAE,CAAA,CAC3B,IAAA,CAAK,SAAS,CAAA,CACd,MAAA,CAAO,IAAc,CAAA,CACrB,OAAA,EAAQ;AAAA,QACb,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;AAInD,MAAA,MAAM,OAAO,MAAM,IAAI,SAAS,MAAA,EAAQ,EAAE,CAAA,CACvC,IAAA,CAAK,SAAS,CAAA,CACd,GAAA,CAAI,OAAO,EAAE,CAAC,EACd,MAAA,CAAO,SAAmB,EAC1B,OAAA,EAAQ;AAEX,MAAA,OAAO,EAAE,IAAA,EAAK;AAAA,IAChB,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;AAGnD,MAAA,MAAM,IAAA,GAAO,MAAM,OAAA,CAAQ,GAAA;AAAA,QACzB,GAAA,CAAI,GAAA,CAAI,OAAO,EAAA,KAAO;AACpB,UAAA,OAAO,IAAI,QAAA,CAAS,MAAA,EAAQ,EAAE,EAC3B,IAAA,CAAK,SAAS,CAAA,CACd,GAAA,CAAI,OAAO,EAAE,CAAC,EACd,MAAA,CAAO,SAAmB,EAC1B,OAAA,EAAQ;AAAA,QACb,CAAC;AAAA,OACH;AAEA,MAAA,OAAO,EAAE,IAAA,EAAK;AAAA,IAChB,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,MAAM,OAAO,MAAM,IAAI,QAAA,CAAS,MAAA,EAAQ,EAAE,CAAA,CACvC,IAAA,CAAK,SAAS,EACd,MAAA,CAAO,MAAA,CAAO,EAAE,CAAC,EACjB,OAAA,EAAQ;AAEX,MAAA,OAAO,EAAE,IAAA,EAAK;AAAA,IAChB,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,MAAM,IAAA,GAAO,MAAM,OAAA,CAAQ,GAAA;AAAA,QACzB,GAAA,CAAI,GAAA,CAAI,OAAO,EAAA,KAAO;AACpB,UAAA,OAAO,IAAI,QAAA,CAAS,MAAA,EAAQ,EAAE,CAAA,CAC3B,IAAA,CAAK,SAAS,CAAA,CACd,MAAA,CAAO,MAAA,CAAO,EAAE,CAAC,EACjB,OAAA,EAAQ;AAAA,QACb,CAAC;AAAA,OACH;AAEA,MAAA,OAAO,EAAE,IAAA,EAAK;AAAA,IAChB,CAAA;AAAA,IAEA,MAAA,EAAQ,OACN,MAAA,KACmC;AACnC,MAAA,MAAM,EAAE,GAAA,EAAK,MAAA,EAAQ,OAAA,EAAQ,GAAI,MAAA;AAGjC,MAAA,MAAM,OAAA,GAAU,IAAI,UAAA,CAAW,MAAM,IAAI,GAAA,GAAM,CAAA,EAAG,UAAU,CAAA,EAAG,GAAG,CAAA,CAAA;AAElE,MAAA,IAAI,IAAA;AACJ,MAAA,QAAQ,MAAA,CAAO,aAAY;AAAG,QAC5B,KAAK,KAAA;AACH,UAAA,IAAA,GAAO,MAAM,MAAA,CAAO,UAAA,CAAW,GAAA,CAAI,OAAO,CAAA;AAC1C,UAAA;AAAA,QACF,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,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,IAEA,WAAW,MAAM;AAAA,GACnB;AACF;AC3PO,SAAS,oBAAoB,MAAA,EAA8B;AAChE,EAAA,MAAM,MAAA,GAAS,OAAO,SAAA,EAAU;AAChC,EAAA,MAAM,aAAa,CAAA,EAAG,MAAA,CAAO,OAAO,CAAA,UAAA,EAAa,OAAO,OAAO,CAAA,CAAA;AAE/D,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,QAAQ,EAAS,CAAA,CACjD,IAAA,CAAK,MAAM,CAAA,CACX,MAAA,CAAO,cAAc,EACrB,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;AAGjD,MAAA,MAAM,GAAA,GAAM,GAAG,UAAU,CAAA,iBAAA,EAAoB,MAAM,CAAA,SAAA,EAAY,MAAA,CAAO,IAAI,CAAC,CAAA,CAAA;AAC3E,MAAA,MAAM,IAAA,GAAO,GAAA;AAEb,MAAA,OAAO,EAAE,IAAA,EAAK;AAAA,IAChB,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;AAG9C,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,IAAA,GAAO,MAAM,IAAI,OAAA,CAAQ,QAAQ,EAAS,EAC7C,IAAA,CAAK,MAAM,EACX,MAAA,CAAO,EAAE,OAAO,KAAA,EAAO,SAAA,EAAW,WAAW,aAAA,EAAe,EAC5D,OAAA,EAAQ;AAEX,MAAA,OAAO,EAAE,IAAA,EAAK;AAAA,IAChB,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,OAAO,MAAM,IAAI,OAAA,CAAQ,MAAA,EAAQ,EAAS,CAAA,CAC7C,IAAA,CAAK,MAAM,EACX,MAAA,CAAO,MAAA,CAAO,IAAI,CAAA,EAAG,SAAmB,EACxC,OAAA,EAAQ;AAEX,MAAA,OAAO,EAAE,IAAA,EAAK;AAAA,IAChB,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;AAGjD,MAAA,MAAM,OAAO,MAAM,IAAI,QAAQ,MAAA,EAAQ,EAAS,CAAA,CAC7C,IAAA,CAAK,MAAM,CAAA,CACX,OAAO,CAAC,MAAA,CAAO,IAAI,CAAC,CAAC,EACrB,OAAA,EAAQ;AAEX,MAAA,OAAO,EAAE,IAAA,EAAK;AAAA,IAChB,CAAA;AAAA,IAEA,WAAW,MAAM,UAAA;AAAA;AAAA,IAGjB,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;AAG9C,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,IAAA,GAAO,MAAM,IAAI,OAAA,CAAQ,QAAQ,EAAS,EAC7C,IAAA,CAAK,MAAM,EACX,MAAA,CAAO,EAAE,OAAO,KAAA,EAAO,SAAA,EAAW,WAAW,aAAA,EAAe,EAC5D,OAAA,EAAQ;AAEX,MAAA,OAAO,EAAE,IAAA,EAAK;AAAA,IAChB,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;AAGjD,MAAA,MAAM,OAAO,MAAM,IAAI,OAAA,CAAQ,MAAA,EAAQ,EAAS,CAAA,CAC7C,IAAA,CAAK,MAAM,EACX,MAAA,CAAO,GAAA,CAAI,IAAI,MAAM,CAAC,EACtB,OAAA,EAAQ;AAEX,MAAA,OAAO,EAAE,IAAA,EAAM,CAAC,IAAI,CAAA,EAAE;AAAA,IACxB,CAAA;AAAA,IAEA,MAAA,EAAQ,OACN,MAAA,KACmC;AACnC,MAAA,MAAM,EAAE,GAAA,EAAK,MAAA,EAAQ,OAAA,EAAQ,GAAI,MAAA;AAEjC,MAAA,MAAM,OAAA,GAAU,IAAI,UAAA,CAAW,MAAM,IAAI,GAAA,GAAM,CAAA,EAAG,UAAU,CAAA,EAAG,GAAG,CAAA,CAAA;AAElE,MAAA,IAAI,IAAA;AACJ,MAAA,QAAQ,MAAA,CAAO,aAAY;AAAG,QAC5B,KAAK,KAAA;AACH,UAAA,IAAA,GAAO,MAAM,MAAA,CAAO,UAAA,CAAW,GAAA,CAAI,OAAO,CAAA;AAC1C,UAAA;AAAA,QACF,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,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;AC9JO,SAAS,aAAa,MAAA,EAA8B;AACzD,EAAA,MAAM,IAAA,GAAO,IAAI,IAAA,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,IAAA,CAAK,OAAO,WAAW,CAAA;AAEvB,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,IAAA;AAAA,QACT,YAAY,WAAA,IAAe;AAAA,OAC7B;AAAA,IACF,CAAA;AAAA,IAEA,OAAO,YAAY;AAEjB,MAAA,IAAI,IAAA,CAAK,qBAAoB,EAAG;AAE9B,QAAA,IAAI,IAAA,CAAK,gBAAe,EAAG;AAEzB,UAAA,MAAM,SAAA,GAAY,MAAM,IAAA,CAAK,kBAAA,EAAmB;AAEhD,UAAA,IAAI,SAAA,EAAW;AACb,YAAA,OAAO;AAAA,cACL,aAAA,EAAe;AAAA,aACjB;AAAA,UACF;AAGA,UAAA,OAAO;AAAA,YACL,aAAA,EAAe,KAAA;AAAA,YACf,MAAA,EAAQ,IAAA;AAAA,YACR,UAAA,EAAY,QAAA;AAAA,YACZ,KAAA,EAAO;AAAA,cACL,IAAA,EAAM,gBAAA;AAAA,cACN,OAAA,EAAS;AAAA;AACX,WACF;AAAA,QACF;AAEA,QAAA,OAAO;AAAA,UACL,aAAA,EAAe;AAAA,SACjB;AAAA,MACF;AAEA,MAAA,OAAO;AAAA,QACL,aAAA,EAAe,KAAA;AAAA,QACf,UAAA,EAAY;AAAA,OACd;AAAA,IACF,CAAA;AAAA;AAAA,IAGA,OAAA,EAAS,OAAO,KAAA,KAAU;AACxB,MAAA,MAAM,SAAS,KAAA,EAAO,UAAA,IAAc,KAAA,EAAO,MAAA,IAAU,OAAO,QAAA,EAAU,MAAA;AAGtE,MAAA,IAAI,WAAW,GAAA,EAAK;AAElB,QAAA,IAAI,IAAA,CAAK,qBAAoB,EAAG;AAC9B,UAAA,MAAM,SAAA,GAAY,MAAM,IAAA,CAAK,kBAAA,EAAmB;AAEhD,UAAA,IAAI,SAAA,EAAW;AAEb,YAAA,OAAO;AAAA,cACL;AAAA,aACF;AAAA,UACF;AAAA,QACF;AAEA,QAAA,OAAO;AAAA,UACL,MAAA,EAAQ,IAAA;AAAA,UACR,UAAA,EAAY,QAAA;AAAA,UACZ;AAAA,SACF;AAAA,MACF;AAGA,MAAA,IAAI,WAAW,GAAA,EAAK;AAClB,QAAA,OAAO;AAAA,UACL;AAAA;AAAA,SAEF;AAAA,MACF;AAEA,MAAA,OAAO;AAAA,QACL;AAAA,OACF;AAAA,IACF,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,YAAwC;AACnD,MAAA,MAAM,IAAA,GAAO,KAAK,cAAA,EAAe;AAEjC,MAAA,IAAI,CAAC,IAAA,EAAM;AACT,QAAA,OAAO,IAAA;AAAA,MACT;AAEA,MAAA,OAAO,IAAA;AAAA,IACT,CAAA;AAAA,IAEA,gBAAgB,YAAY;AAC1B,MAAA,MAAM,IAAA,GAAO,KAAK,cAAA,EAAe;AAEjC,MAAA,IAAI,CAAC,IAAA,EAAM;AACT,QAAA,OAAO,IAAA;AAAA,MACT;AAIA,MAAA,OAAO;AAAA,QACL,KAAA,EAAO,IAAA,CAAK,KAAA,IAAS,EAAC;AAAA,QACtB,WAAA,EAAa,IAAA,CAAK,WAAA,IAAe,EAAC;AAAA,QAClC,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;AAuBO,SAAS,sBAAsB,MAAA,EAAuC;AAC3E,EAAA,MAAM,MAAA,GAAS,IAAI,MAAA,CAAO,MAAM,CAAA;AAChC,EAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,MAAM,CAAA;AAE5B,EAAA,OAAO;AAAA,IACL,KAAK,OAAO,EAAE,QAAA,EAAU,MAAA,EAAQ,QAAO,KAAM;AAC3C,MAAA,MAAM,IAAA,GAAO,KAAK,cAAA,EAAe;AAEjC,MAAA,IAAI,CAAC,IAAA,EAAM;AACT,QAAA,OAAO;AAAA,UACL,GAAA,EAAK,KAAA;AAAA,UACL,MAAA,EAAQ;AAAA,SACV;AAAA,MACF;AAEA,MAAA,IAAI,CAAC,QAAA,EAAU;AACb,QAAA,OAAO;AAAA,UACL,GAAA,EAAK,KAAA;AAAA,UACL,MAAA,EAAQ;AAAA,SACV;AAAA,MACF;AAEA,MAAA,IAAI;AAEF,QAAA,MAAM,SAAA,GAAY;AAAA,UAChB,EAAA,EAAI,MAAA,CAAO,IAAA,CAAK,OAAO,CAAA;AAAA,UACvB,KAAA,EAAO,IAAA,CAAK,KAAA,IAAS,EAAC;AAAA,UACtB,IAAA,EAAM;AAAA,YACJ,UAAU,IAAA,CAAK,QAAA;AAAA,YACf,OAAO,IAAA,CAAK,KAAA;AAAA,YACZ,QAAA,EAAU,KAAK,QAAA,IAAY,KAAA;AAAA,YAC3B,YAAA,EAAc,KAAK,YAAA,IAAgB,KAAA;AAAA,YACnC,MAAA,EAAQ,IAAA,CAAK,MAAA,IAAU;AAAC;AAC1B,SACF;AAGA,QAAA,MAAM,SAAA,GAAY;AAAA,UAChB;AAAA,YACE,SAAA,EAAW,QAAA;AAAA,YACX,UAAU,MAAA,EAAQ,EAAA,GAAK,MAAA,CAAO,MAAA,CAAO,EAAE,CAAA,GAAI,GAAA;AAAA,YAC3C,UAAA,EAAa,UAAU,EAAC;AAAA,YACxB,OAAA,EAAS,CAAC,MAAM;AAAA;AAClB,SACF;AAEA,QAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,aAAA,CAAc,WAAW,SAAS,CAAA;AAQ9D,QAAA,IAAI,MAAA,IAAU,OAAO,MAAA,KAAW,QAAA,EAAU;AACxC,UAAA,MAAM,OAAA,GAAU,MAAA,CAAO,OAAA,GAAU,CAAC,CAAA,EAAG,OAAA,GAAU,MAAM,CAAA,EAAG,MAAA,KAAW,cAAA,IAC9D,MAAA,CAAO,OAAA,KAAY,IAAA;AAExB,UAAA,OAAO;AAAA,YACL,GAAA,EAAK,OAAA;AAAA,YACL,MAAA,EAAQ,MAAA,CAAO,MAAA,KAAW,OAAA,GAAU,KAAA,CAAA,GAAY,6BAAA;AAAA,WAClD;AAAA,QACF;AAEA,QAAA,OAAO;AAAA,UACL,GAAA,EAAK,KAAA;AAAA,UACL,MAAA,EAAQ;AAAA,SACV;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,OAAA,CAAQ,KAAA,CAAM,mCAAmC,KAAK,CAAA;AACtD,QAAA,OAAO;AAAA,UACL,GAAA,EAAK,KAAA;AAAA,UACL,MAAA,EAAQ,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU;AAAA,SACnD;AAAA,MACF;AAAA,IACF,CAAA;AAAA,IAEA,OAAA,EAAS;AAAA,MACP,OAAA,EAAS;AAAA,QACP,mBAAA,EAAqB,IAAA;AAAA,QACrB,kBAAA,EAAoB;AAAA;AACtB;AACF,GACF;AACF","file":"index.js","sourcesContent":["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} from \"@refinedev/core\";\nimport { Client, Database } from \"@taruvi/sdk\";\nimport type { DatabaseFilters } from \"@taruvi/sdk\";\nimport type { TaruviListResponse, TaruviMeta } from \"./types.js\";\nimport {\n convertRefineFilters,\n convertRefineSorters,\n convertRefinePagination,\n formatAggregates,\n formatGroupBy,\n formatHaving\n} from \"./utils.js\";\n\n/**\n * Creates a Refine DataProvider for Taruvi database operations.\n */\nexport function dataProvider(client: Client): DataProvider {\n const config = client.getConfig();\n const baseApiUrl = `${config.baseUrl}/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 const buildFilters = (params: {\n filters?: GetListParams[\"filters\"];\n sorters?: GetListParams[\"sorters\"];\n pagination?: GetListParams[\"pagination\"];\n meta?: TaruviMeta;\n }): DatabaseFilters => {\n const filters: DatabaseFilters = {\n ...convertRefineFilters(params.filters),\n ...convertRefinePagination(params.pagination),\n };\n\n const ordering = convertRefineSorters(params.sorters);\n if (ordering) filters.ordering = ordering;\n\n if (params.meta?.select) {\n (filters as Record<string, unknown>).fields = Array.isArray(params.meta.select)\n ? params.meta.select.join(\",\")\n : params.meta.select;\n }\n\n if (params.meta?.populate) {\n (filters as Record<string, unknown>).populate = Array.isArray(params.meta.populate)\n ? params.meta.populate.join(\",\")\n : params.meta.populate;\n }\n\n // Add aggregation parameters\n const aggregateParam = formatAggregates(params.meta?.aggregate);\n if (aggregateParam) {\n (filters as Record<string, unknown>)._aggregate = aggregateParam;\n }\n\n const groupByParam = formatGroupBy(params.meta?.groupBy);\n if (groupByParam) {\n (filters as Record<string, unknown>)._group_by = groupByParam;\n }\n\n const havingParam = formatHaving(params.meta?.having);\n if (havingParam) {\n (filters as Record<string, unknown>)._having = havingParam;\n }\n\n return filters;\n };\n\n return {\n getList: async <TData extends BaseRecord = BaseRecord>(\n params: GetListParams\n ): Promise<GetListResponse<TData>> => {\n console.log(\"DataProvider getList called with params:\", params)\n const { resource, pagination, filters, sorters, meta } = params;\n const taruviMeta = meta as TaruviMeta | undefined;\n const tableName = getTableName(resource, taruviMeta);\n const dbFilters = buildFilters({ filters, sorters, pagination, meta: taruviMeta });\n\n const response = await new Database(client, {})\n .from(tableName)\n .filter(dbFilters)\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, meta } = params;\n const taruviMeta = meta as TaruviMeta | undefined;\n const tableName = getTableName(resource, taruviMeta);\n const dbFilters = buildFilters({ meta: taruviMeta });\n\n const { data } = await new Database(client, {})\n .from(tableName)\n .filter(dbFilters)\n .get(String(id))\n .execute() as TData;\n\n return { 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 const idColumn = getIdColumn(taruviMeta);\n\n const dbFilters = buildFilters({\n filters: [{ field: idColumn, operator: \"in\", value: ids }],\n meta: taruviMeta,\n });\n\n const response = await new Database(client, {})\n .from(tableName)\n .filter(dbFilters)\n .execute() as TaruviListResponse<TData>;\n\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 // POST /api/apps/{appSlug}/datatables/{tableName}/data/\n const data = await new Database(client, {})\n .from(tableName)\n .create(variables as object)\n .execute() as TData;\n\n return { 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 // SDK doesn't have batch create - create records individually\n const data = await Promise.all(\n variables.map(async (vars) => {\n return new Database(client, {})\n .from(tableName)\n .create(vars as object)\n .execute() as Promise<TData>;\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 // SDK update() uses POST - chain with get(id) to update specific record\n // POST /api/apps/{appSlug}/datatables/{tableName}/data/{recordId}/\n const data = await new Database(client, {})\n .from(tableName)\n .get(String(id))\n .update(variables as object)\n .execute() as TData;\n\n return { 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\n // SDK doesn't have batch update - update records individually\n const data = await Promise.all(\n ids.map(async (id) => {\n return new Database(client, {})\n .from(tableName)\n .get(String(id))\n .update(variables as object)\n .execute() as Promise<TData>;\n })\n );\n\n return { 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 const data = await new Database(client, {})\n .from(tableName)\n .delete(String(id))\n .execute() as TData;\n\n return { data };\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 const data = await Promise.all(\n ids.map(async (id) => {\n return new Database(client, {})\n .from(tableName)\n .delete(String(id))\n .execute() as Promise<TData>;\n })\n );\n\n return { data };\n },\n\n custom: async <TData extends BaseRecord = BaseRecord>(\n params: CustomParams\n ): Promise<CustomResponse<TData>> => {\n const { url, method, payload } = params;\n\n // Use the client's httpClient for custom API calls\n const fullUrl = url.startsWith('http') ? url : `${baseApiUrl}${url}`;\n\n let data: TData;\n switch (method.toLowerCase()) {\n case 'get':\n data = await client.httpClient.get(fullUrl) as TData;\n break;\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 '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 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 } 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.baseUrl}/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, {} as any)\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 // Return the direct URL - browser will handle authentication via headers\n const url = `${baseApiUrl}/storage/buckets/${bucket}/objects/${String(path)}`;\n const data = url as unknown as TData;\n\n return { 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 bucket = getBucketName(resource, taruviMeta);\n const { files, paths = [], metadatas = [] } = variables as unknown as StorageUploadVariables;\n\n // Use default filenames if paths not provided\n const filePaths = files.map((file, i) => paths[i] || file.name);\n const fileMetadatas = files.map((_, i) => metadatas[i] || {});\n\n const data = await new Storage(client, {} as any)\n .from(bucket)\n .upload({ files, paths: filePaths, metadatas: fileMetadatas })\n .execute() as TData;\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: path, variables, meta } = params;\n const taruviMeta = meta as TaruviMeta | undefined;\n const bucket = getBucketName(resource, taruviMeta);\n\n const data = await new Storage(client, {} as any)\n .from(bucket)\n .update(String(path), variables as object)\n .execute() as TData;\n\n return { 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 // SDK delete() now accepts array, handles both single and batch\n const data = await new Storage(client, {} as any)\n .from(bucket)\n .delete([String(path)])\n .execute() as TData;\n\n return { data };\n },\n\n getApiUrl: () => baseApiUrl,\n\n // Not applicable for storage - return empty array\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 // SDK upload() handles batch upload\n const filePaths = files.map((file, i) => paths[i] || file.name);\n const fileMetadatas = files.map((_, i) => metadatas[i] || {});\n\n const data = await new Storage(client, {} as any)\n .from(bucket)\n .upload({ files, paths: filePaths, metadatas: fileMetadatas })\n .execute() as TData;\n\n return { data };\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 // SDK delete() handles batch delete\n const data = await new Storage(client, {} as any)\n .from(bucket)\n .delete(ids.map(String))\n .execute() as TData;\n\n return { data: [data] };\n },\n\n custom: async <TData extends BaseRecord = BaseRecord>(\n params: CustomParams\n ): Promise<CustomResponse<TData>> => {\n const { url, method, payload } = params;\n\n const fullUrl = url.startsWith('http') ? url : `${baseApiUrl}${url}`;\n\n let data: TData;\n switch (method.toLowerCase()) {\n case 'get':\n data = await client.httpClient.get(fullUrl) as TData;\n break;\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 '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 { AuthProvider, AccessControlProvider } from \"@refinedev/core\";\nimport { Client, Auth, Policy } from \"@taruvi/sdk\";\n\n/**\n * User identity returned from JWT token\n */\nexport interface TaruviUser {\n user_id: number;\n username: string;\n email?: string;\n exp?: number;\n iat?: number;\n jti?: string;\n token_type?: string;\n [key: string]: unknown;\n}\n\n/**\n * Login params - supports both redirect flow and credentials flow\n */\nexport interface LoginParams {\n /** For redirect-based login - URL to redirect after successful login */\n callbackUrl?: string;\n /** For credentials-based login (if supported) */\n username?: string;\n password?: string;\n /** Whether to use redirect flow (default: true) */\n redirect?: boolean;\n}\n\n/**\n * Logout params\n */\nexport interface LogoutParams {\n /** URL to redirect after logout */\n callbackUrl?: string;\n}\n\n/**\n * Register/Signup params\n */\nexport interface RegisterParams {\n /** URL to redirect after successful signup */\n callbackUrl?: string;\n}\n\n/**\n * Creates a Refine AuthProvider for Taruvi authentication.\n *\n * Supports redirect-based authentication flow (Web UI Flow):\n * 1. User calls login() → Redirects to backend /accounts/login/\n * 2. User authenticates on backend\n * 3. Backend redirects back with tokens in URL hash\n * 4. Client extracts and stores tokens automatically\n */\nexport function authProvider(client: Client): AuthProvider {\n const auth = new Auth(client);\n\n return {\n login: async (params: LoginParams = {}) => {\n const { callbackUrl, redirect = true } = params;\n\n // Check if already authenticated first (prevents infinite redirect loop)\n\n // TODO: check if this is necessary\n if (auth.isUserAuthenticated()) {\n return {\n success: true,\n redirectTo: callbackUrl || \"/\",\n };\n }\n\n if (redirect) {\n // Redirect-based login flow\n auth.login(callbackUrl);\n\n // Return success since we're redirecting\n // The actual auth state will be checked after redirect\n return {\n success: true,\n };\n }\n\n return {\n success: false,\n error: {\n name: \"LoginError\",\n message: \"Login failed. Please try again.\",\n },\n };\n },\n\n logout: async (params: LogoutParams = {}) => {\n const { callbackUrl } = params;\n\n auth.logout(callbackUrl);\n\n return {\n success: true,\n redirectTo: callbackUrl || \"/login\",\n };\n },\n\n check: async () => {\n // Check if user is authenticated\n if (auth.isUserAuthenticated()) {\n // Check if token is expired\n if (auth.isTokenExpired()) {\n // Try to refresh the token\n const refreshed = await auth.refreshAccessToken();\n\n if (refreshed) {\n return {\n authenticated: true,\n };\n }\n\n // Token refresh failed\n return {\n authenticated: false,\n logout: true,\n redirectTo: \"/login\",\n error: {\n name: \"SessionExpired\",\n message: \"Your session has expired. Please log in again.\",\n },\n };\n }\n\n return {\n authenticated: true,\n };\n }\n\n return {\n authenticated: false,\n redirectTo: \"/login\",\n };\n },\n\n //TODO need to check if max retries logic is needed\n onError: async (error) => {\n const status = error?.statusCode || error?.status || error?.response?.status;\n\n // Handle 401 Unauthorized\n if (status === 401) {\n // Try to refresh token first\n if (auth.isUserAuthenticated()) {\n const refreshed = await auth.refreshAccessToken();\n\n if (refreshed) {\n // Token refreshed, retry the request\n return {\n error,\n };\n }\n }\n\n return {\n logout: true,\n redirectTo: \"/login\",\n error,\n };\n }\n\n // Handle 403 Forbidden\n if (status === 403) {\n return {\n error,\n // Don't logout for 403, user is authenticated but not authorized\n };\n }\n\n return {\n error,\n };\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 (): Promise<TaruviUser | null> => {\n const user = auth.getCurrentUser();\n\n if (!user) {\n return null;\n }\n\n return user as TaruviUser;\n },\n\n getPermissions: async () => {\n const user = auth.getCurrentUser();\n\n if (!user) {\n return null;\n }\n\n // Return any permissions from the JWT token\n // Typically stored in claims like 'permissions', 'roles', 'groups', etc.\n return {\n roles: user.roles || [],\n permissions: 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\n/**\n * Creates a Refine AccessControlProvider using Cerbos via the Policy client.\n *\n * This provides resource-based authorization checks using Cerbos policies.\n * Use this with Refine's `useCan` hook or `<CanAccess>` component.\n *\n * @example\n * ```tsx\n * import { Refine } from \"@refinedev/core\";\n * import { Client } from \"@taruvi/sdk\";\n * import { authProvider, accessControlProvider } from \"@taruvi-io/refine\";\n *\n * const client = new Client({ appSlug: \"my-app\", baseUrl: \"...\" });\n *\n * <Refine\n * authProvider={authProvider(client)}\n * accessControlProvider={accessControlProvider(client)}\n * // ...\n * />\n * ```\n */\nexport function accessControlProvider(client: Client): AccessControlProvider {\n const policy = new Policy(client);\n const auth = new Auth(client);\n\n return {\n can: async ({ resource, action, params }) => {\n const user = auth.getCurrentUser();\n\n if (!user) {\n return {\n can: false,\n reason: \"User not authenticated\",\n };\n }\n\n if (!resource) {\n return {\n can: false,\n reason: \"Resource not specified\",\n };\n }\n\n try {\n // Build principal from current user\n const principal = {\n id: String(user.user_id),\n roles: user.roles || [],\n attr: {\n username: user.username,\n email: user.email,\n is_staff: user.is_staff || false,\n is_superuser: user.is_superuser || false,\n groups: user.groups || [],\n },\n };\n\n // Build resource for Cerbos check\n const resources = [\n {\n tableName: resource,\n recordId: params?.id ? String(params.id) : \"*\",\n attributes: (params || {}) as Record<string, unknown>,\n actions: [action],\n },\n ];\n\n const result = await policy.checkResource(resources, principal) as {\n results?: Array<{ actions?: Record<string, { effect?: string }> }>;\n allowed?: boolean;\n reason?: string;\n };\n\n // Parse the Cerbos response\n // The response structure depends on your Cerbos setup\n if (result && typeof result === \"object\") {\n const allowed = result.results?.[0]?.actions?.[action]?.effect === \"EFFECT_ALLOW\"\n || result.allowed === true;\n\n return {\n can: allowed,\n reason: result.reason || (allowed ? undefined : \"Permission denied by policy\"),\n };\n }\n\n return {\n can: false,\n reason: \"Invalid policy response\",\n };\n } catch (error) {\n console.error(\"Cerbos permission check failed:\", error);\n return {\n can: false,\n reason: error instanceof Error ? error.message : \"Permission check failed\",\n };\n }\n },\n\n options: {\n buttons: {\n enableAccessControl: true,\n hideIfUnauthorized: false,\n },\n },\n };\n}\n"]}
1
+ {"version":3,"sources":["../src/utils.ts","../src/dataProvider.ts","../src/storageDataProvider.ts","../src/functionsDataProvider.ts","../src/appDataProvider.ts","../src/analyticsDataProvider.ts","../src/authProvider.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["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} from \"@refinedev/core\";\nimport { Client, Database } from \"@taruvi/sdk\";\nimport type { DatabaseFilters } from \"@taruvi/sdk\";\nimport type { TaruviListResponse, TaruviMeta } from \"./types.js\";\nimport {\n convertRefineFilters,\n convertRefineSorters,\n convertRefinePagination,\n formatAggregates,\n formatGroupBy,\n formatHaving\n} from \"./utils.js\";\n\n/**\n * Creates a Refine DataProvider for Taruvi database operations.\n */\nexport function dataProvider(client: Client): DataProvider {\n const config = client.getConfig();\n const baseApiUrl = `${config.baseUrl}/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 const buildFilters = (params: {\n filters?: GetListParams[\"filters\"];\n sorters?: GetListParams[\"sorters\"];\n pagination?: GetListParams[\"pagination\"];\n meta?: TaruviMeta;\n }): DatabaseFilters => {\n const filters: DatabaseFilters = {\n ...convertRefineFilters(params.filters),\n ...convertRefinePagination(params.pagination),\n };\n\n const ordering = convertRefineSorters(params.sorters);\n if (ordering) filters.ordering = ordering;\n\n if (params.meta?.select) {\n (filters as Record<string, unknown>).fields = Array.isArray(params.meta.select)\n ? params.meta.select.join(\",\")\n : params.meta.select;\n }\n\n if (params.meta?.populate) {\n (filters as Record<string, unknown>).populate = Array.isArray(params.meta.populate)\n ? params.meta.populate.join(\",\")\n : params.meta.populate;\n }\n\n // Add aggregation parameters\n const aggregateParam = formatAggregates(params.meta?.aggregate);\n if (aggregateParam) {\n (filters as Record<string, unknown>)._aggregate = aggregateParam;\n }\n\n const groupByParam = formatGroupBy(params.meta?.groupBy);\n if (groupByParam) {\n (filters as Record<string, unknown>)._group_by = groupByParam;\n }\n\n const havingParam = formatHaving(params.meta?.having);\n if (havingParam) {\n (filters as Record<string, unknown>)._having = havingParam;\n }\n\n return filters;\n };\n\n return {\n getList: async <TData extends BaseRecord = BaseRecord>(\n params: GetListParams\n ): Promise<GetListResponse<TData>> => {\n console.log(\"DataProvider getList called with params:\", params)\n const { resource, pagination, filters, sorters, meta } = params;\n const taruviMeta = meta as TaruviMeta | undefined;\n const tableName = getTableName(resource, taruviMeta); \n const dbFilters = buildFilters({ filters, sorters, pagination, meta: taruviMeta });\n\n const response = await new Database(client, {})\n .from(tableName)\n .filter(dbFilters)\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, meta } = params;\n const taruviMeta = meta as TaruviMeta | undefined;\n const tableName = getTableName(resource, taruviMeta);\n const dbFilters = buildFilters({ meta: taruviMeta });\n\n const { data } = await new Database(client, {})\n .from(tableName)\n .filter(dbFilters)\n .get(String(id))\n .execute() as TData;\n\n return { 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 const idColumn = getIdColumn(taruviMeta);\n\n const dbFilters = buildFilters({\n filters: [{ field: idColumn, operator: \"in\", value: ids }],\n meta: taruviMeta,\n });\n\n const response = await new Database(client, {})\n .from(tableName)\n .filter(dbFilters)\n .execute() as TaruviListResponse<TData>;\n\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 // POST /api/apps/{appSlug}/datatables/{tableName}/data/\n const data = await new Database(client, {})\n .from(tableName)\n .create(variables as object)\n .execute() as TData;\n\n return { 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 // SDK doesn't have batch create - create records individually\n const data = await Promise.all(\n variables.map(async (vars) => {\n return new Database(client, {})\n .from(tableName)\n .create(vars as object)\n .execute() as Promise<TData>;\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 // SDK update() uses POST - chain with get(id) to update specific record\n // POST /api/apps/{appSlug}/datatables/{tableName}/data/{recordId}/\n const data = await new Database(client, {})\n .from(tableName)\n .get(String(id))\n .update(variables as object)\n .execute() as TData;\n\n return { 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\n // SDK doesn't have batch update - update records individually\n const data = await Promise.all(\n ids.map(async (id) => {\n return new Database(client, {})\n .from(tableName)\n .get(String(id))\n .update(variables as object)\n .execute() as Promise<TData>;\n })\n );\n\n return { 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 const data = await new Database(client, {})\n .from(tableName)\n .delete(String(id))\n .execute() as TData;\n\n return { data };\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 const data = await Promise.all(\n ids.map(async (id) => {\n return new Database(client, {})\n .from(tableName)\n .delete(String(id))\n .execute() as Promise<TData>;\n })\n );\n\n return { data };\n },\n\n custom: async <TData extends BaseRecord = BaseRecord>(\n params: CustomParams\n ): Promise<CustomResponse<TData>> => {\n const { url, method, payload } = params;\n\n // Use the client's httpClient for custom API calls\n const fullUrl = url.startsWith('http') ? url : `${baseApiUrl}${url}`;\n\n let data: TData;\n switch (method.toLowerCase()) {\n case 'get':\n data = await client.httpClient.get(fullUrl) as TData;\n break;\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 '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 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 } 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.baseUrl}/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, {} as any)\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 // Return the direct URL - browser will handle authentication via headers\n const url = `${baseApiUrl}/storage/buckets/${bucket}/objects/${String(path)}`;\n const data = url as unknown as TData;\n\n return { 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 bucket = getBucketName(resource, taruviMeta);\n const { files, paths = [], metadatas = [] } = variables as unknown as StorageUploadVariables;\n\n // Use default filenames if paths not provided\n const filePaths = files.map((file, i) => paths[i] || file.name);\n const fileMetadatas = files.map((_, i) => metadatas[i] || {});\n\n const data = await new Storage(client, {} as any)\n .from(bucket)\n .upload({ files, paths: filePaths, metadatas: fileMetadatas })\n .execute() as TData;\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: path, variables, meta } = params;\n const taruviMeta = meta as TaruviMeta | undefined;\n const bucket = getBucketName(resource, taruviMeta);\n\n const data = await new Storage(client, {} as any)\n .from(bucket)\n .update(String(path), variables as object)\n .execute() as TData;\n\n return { 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 // SDK delete() now accepts array, handles both single and batch\n const data = await new Storage(client, {} as any)\n .from(bucket)\n .delete([String(path)])\n .execute() as TData;\n\n return { data };\n },\n\n getApiUrl: () => baseApiUrl,\n\n // Not applicable for storage - return empty array\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 // SDK upload() handles batch upload\n const filePaths = files.map((file, i) => paths[i] || file.name);\n const fileMetadatas = files.map((_, i) => metadatas[i] || {});\n\n const data = await new Storage(client, {} as any)\n .from(bucket)\n .upload({ files, paths: filePaths, metadatas: fileMetadatas })\n .execute() as TData;\n\n return { data };\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 // SDK delete() handles batch delete\n const data = await new Storage(client, {} as any)\n .from(bucket)\n .delete(ids.map(String))\n .execute() as TData;\n\n return { data: [data] };\n },\n\n custom: async <TData extends BaseRecord = BaseRecord>(\n params: CustomParams\n ): Promise<CustomResponse<TData>> => {\n const { url, method, payload } = params;\n\n const fullUrl = url.startsWith('http') ? url : `${baseApiUrl}${url}`;\n\n let data: TData;\n switch (method.toLowerCase()) {\n case 'get':\n data = await client.httpClient.get(fullUrl) as TData;\n break;\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 '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 CustomParams,\n CustomResponse,\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/**\n * Creates a Refine DataProvider for Taruvi edge function execution.\n *\n * This provider is specialized for executing serverless functions.\n * Use the `custom` method to invoke functions by name.\n *\n * @example\n * ```typescript\n * const { data } = await dataProvider.custom({\n * url: \"my-function-slug\",\n * method: \"post\",\n * payload: { key: \"value\" },\n * meta: { async: false }\n * });\n * ```\n */\nexport function functionsDataProvider(client: Client): DataProvider {\n const config = client.getConfig();\n const baseApiUrl = `${config.baseUrl}/api/apps/${config.appSlug}`;\n const functions = new Functions(client);\n\n return {\n custom: async <TData extends BaseRecord = BaseRecord>(\n params: CustomParams\n ): Promise<CustomResponse<TData>> => {\n const { url: functionSlug, payload, meta } = params;\n const functionMeta = meta as FunctionMeta | undefined;\n\n const response = await functions.execute<TData>(functionSlug, {\n async: functionMeta?.async ?? false,\n params: payload 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 CRUD operations\n getList: async () => { throw new Error(\"getList is not supported for edge functions\"); },\n getOne: async () => { throw new Error(\"getOne is not supported for edge functions\"); },\n getMany: async () => { throw new Error(\"getMany is not supported for edge functions\"); },\n create: async () => { throw new Error(\"create is not supported for edge functions\"); },\n createMany: async () => { throw new Error(\"createMany is not supported for edge functions\"); },\n update: async () => { throw new Error(\"update is not supported for edge functions\"); },\n updateMany: async () => { throw new Error(\"updateMany is not supported for edge functions\"); },\n deleteOne: async () => { throw new Error(\"deleteOne is not supported for edge functions\"); },\n deleteMany: async () => { throw new Error(\"deleteMany is not supported for edge functions\"); },\n };\n}\n","import type {\n DataProvider,\n BaseRecord,\n GetListParams,\n GetListResponse,\n} from \"@refinedev/core\";\nimport { Client, App } from \"@taruvi/sdk\";\nimport type { RoleResponse } from \"@taruvi/sdk\";\n\n/**\n * Response type for roles list from the App service.\n */\ninterface RolesListResponse {\n data: RoleResponse[];\n total: number;\n}\n\n/**\n * Creates a Refine DataProvider for Taruvi App operations.\n *\n * This provider is specialized for fetching app-level data like roles.\n * Use `getList` with resource=\"roles\" to fetch app roles.\n *\n * @example\n * ```typescript\n * const { data } = useList({\n * dataProviderName: \"app\",\n * resource: \"roles\",\n * });\n * ```\n */\nexport function appDataProvider(client: Client): DataProvider {\n const config = client.getConfig();\n const baseApiUrl = `${config.baseUrl}/api/apps/${config.appSlug}`;\n\n return {\n getList: async <TData extends BaseRecord = BaseRecord>(\n params: GetListParams\n ): Promise<GetListResponse<TData>> => {\n const { resource } = 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 TData[],\n total: response.total ?? (Array.isArray(response) ? response.length : response.data?.length ?? 0),\n };\n }\n\n throw new Error(`Unknown app resource: ${resource}. Supported resources: roles`);\n },\n\n getApiUrl: () => baseApiUrl,\n\n // App resources are read-only\n getOne: async () => { throw new Error(\"getOne is not supported for app resources\"); },\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\"); },\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 custom: async () => { throw new Error(\"custom is not supported for app resources\"); },\n };\n}\n","import type {\n DataProvider,\n BaseRecord,\n CustomParams,\n CustomResponse,\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 /** Parameters to pass to the analytics query */\n params?: Record<string, unknown>;\n}\n\n/**\n * Creates a Refine DataProvider for Taruvi Analytics operations.\n *\n * This provider is specialized for executing analytics queries.\n * Use the `custom` method to invoke analytics queries by name.\n *\n * @example\n * ```typescript\n * const { data } = await dataProvider.custom({\n * url: \"monthly-sales-report\",\n * method: \"post\",\n * payload: { start_date: \"2024-01-01\", end_date: \"2024-12-31\" },\n * });\n * ```\n *\n * @example\n * ```typescript\n * // Using useCustom hook\n * const { data } = useCustom({\n * dataProviderName: \"analytics\",\n * url: \"dashboard-metrics\",\n * method: \"post\",\n * config: {\n * payload: { period: \"last_30_days\" },\n * },\n * });\n * ```\n */\nexport function analyticsDataProvider(client: Client): DataProvider {\n const config = client.getConfig();\n const baseApiUrl = `${config.baseUrl}/api/apps/${config.appSlug}`;\n const analytics = new Analytics(client);\n\n return {\n custom: async <TData extends BaseRecord = BaseRecord>(\n params: CustomParams\n ): Promise<CustomResponse<TData>> => {\n const { url: querySlug, payload } = params;\n\n const response = await analytics.execute<TData>(querySlug, {\n params: payload as Record<string, unknown>,\n });\n\n return { data: response.data as TData };\n },\n\n getApiUrl: () => baseApiUrl,\n\n // Analytics queries don't support standard CRUD operations\n getList: async () => { throw new Error(\"getList is not supported for analytics. Use custom() to execute queries\"); },\n getOne: async () => { throw new Error(\"getOne is not supported for analytics. Use custom() to execute queries\"); },\n getMany: async () => { throw new Error(\"getMany is not supported for analytics. Use custom() to execute queries\"); },\n create: async () => { throw new Error(\"create is not supported for analytics. Use custom() to execute queries\"); },\n createMany: async () => { throw new Error(\"createMany is not supported for analytics. Use custom() to execute queries\"); },\n update: async () => { throw new Error(\"update is not supported for analytics. Use custom() to execute queries\"); },\n updateMany: async () => { throw new Error(\"updateMany is not supported for analytics. Use custom() to execute queries\"); },\n deleteOne: async () => { throw new Error(\"deleteOne is not supported for analytics. Use custom() to execute queries\"); },\n deleteMany: async () => { throw new Error(\"deleteMany is not supported for analytics. Use custom() to execute queries\"); },\n };\n}\n","import type { AuthProvider, AccessControlProvider } from \"@refinedev/core\";\nimport { Client, Auth, Policy } from \"@taruvi/sdk\";\n\n/**\n * User identity returned from JWT token\n */\nexport interface TaruviUser {\n user_id: number;\n username: string;\n email?: string;\n exp?: number;\n iat?: number;\n jti?: string;\n token_type?: string;\n [key: string]: unknown;\n}\n\n/**\n * Login params - supports both redirect flow and credentials flow\n */\nexport interface LoginParams {\n /** For redirect-based login - URL to redirect after successful login */\n callbackUrl?: string;\n /** For credentials-based login (if supported) */\n username?: string;\n password?: string;\n /** Whether to use redirect flow (default: true) */\n redirect?: boolean;\n}\n\n/**\n * Logout params\n */\nexport interface LogoutParams {\n /** URL to redirect after logout */\n callbackUrl?: string;\n}\n\n/**\n * Register/Signup params\n */\nexport interface RegisterParams {\n /** URL to redirect after successful signup */\n callbackUrl?: string;\n}\n\n/**\n * Creates a Refine AuthProvider for Taruvi authentication.\n *\n * Supports redirect-based authentication flow (Web UI Flow):\n * 1. User calls login() → Redirects to backend /accounts/login/\n * 2. User authenticates on backend\n * 3. Backend redirects back with tokens in URL hash\n * 4. Client extracts and stores tokens automatically\n */\nexport function authProvider(client: Client): AuthProvider {\n const auth = new Auth(client);\n\n return {\n login: async (params: LoginParams = {}) => {\n const { callbackUrl, redirect = true } = params;\n\n // Check if already authenticated first (prevents infinite redirect loop)\n\n // TODO: check if this is necessary\n if (auth.isUserAuthenticated()) {\n return {\n success: true,\n redirectTo: callbackUrl || \"/\",\n };\n }\n\n if (redirect) {\n // Redirect-based login flow\n auth.login(callbackUrl);\n\n // Return success since we're redirecting\n // The actual auth state will be checked after redirect\n return {\n success: true,\n };\n }\n\n return {\n success: false,\n error: {\n name: \"LoginError\",\n message: \"Login failed. Please try again.\",\n },\n };\n },\n\n logout: async (params: LogoutParams = {}) => {\n const { callbackUrl } = params;\n\n auth.logout(callbackUrl);\n\n return {\n success: true,\n redirectTo: callbackUrl || \"/login\",\n };\n },\n\n check: async () => {\n // Check if user is authenticated\n if (auth.isUserAuthenticated()) {\n // Check if token is expired\n if (auth.isTokenExpired()) {\n // Try to refresh the token\n const refreshed = await auth.refreshAccessToken();\n\n if (refreshed) {\n return {\n authenticated: true,\n };\n }\n\n // Token refresh failed\n return {\n authenticated: false,\n logout: true,\n redirectTo: \"/login\",\n error: {\n name: \"SessionExpired\",\n message: \"Your session has expired. Please log in again.\",\n },\n };\n }\n\n return {\n authenticated: true,\n };\n }\n\n return {\n authenticated: false,\n redirectTo: \"/login\",\n };\n },\n\n //TODO need to check if max retries logic is needed\n onError: async (error) => {\n const status = error?.statusCode || error?.status || error?.response?.status;\n\n // Handle 401 Unauthorized\n if (status === 401) {\n // Try to refresh token first\n if (auth.isUserAuthenticated()) {\n const refreshed = await auth.refreshAccessToken();\n\n if (refreshed) {\n // Token refreshed, retry the request\n return {\n error,\n };\n }\n }\n\n return {\n logout: true,\n redirectTo: \"/login\",\n error,\n };\n }\n\n // Handle 403 Forbidden\n if (status === 403) {\n return {\n error,\n // Don't logout for 403, user is authenticated but not authorized\n };\n }\n\n return {\n error,\n };\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 (): Promise<TaruviUser | null> => {\n const user = auth.getCurrentUser();\n\n if (!user) {\n return null;\n }\n\n return user as TaruviUser;\n },\n\n getPermissions: async () => {\n const user = auth.getCurrentUser();\n\n if (!user) {\n return null;\n }\n\n // Return any permissions from the JWT token\n // Typically stored in claims like 'permissions', 'roles', 'groups', etc.\n return {\n roles: user.roles || [],\n permissions: 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\n/**\n * Creates a Refine AccessControlProvider using Cerbos via the Policy client.\n *\n * This provides resource-based authorization checks using Cerbos policies.\n * Use this with Refine's `useCan` hook or `<CanAccess>` component.\n *\n * @example\n * ```tsx\n * import { Refine } from \"@refinedev/core\";\n * import { Client } from \"@taruvi/sdk\";\n * import { authProvider, accessControlProvider } from \"@taruvi-io/refine\";\n *\n * const client = new Client({ appSlug: \"my-app\", baseUrl: \"...\" });\n *\n * <Refine\n * authProvider={authProvider(client)}\n * accessControlProvider={accessControlProvider(client)}\n * // ...\n * />\n * ```\n */\nexport function accessControlProvider(client: Client): AccessControlProvider {\n const policy = new Policy(client);\n const auth = new Auth(client);\n\n return {\n can: async ({ resource, action, params }) => {\n const user = auth.getCurrentUser();\n\n if (!user) {\n return {\n can: false,\n reason: \"User not authenticated\",\n };\n }\n\n if (!resource) {\n return {\n can: false,\n reason: \"Resource not specified\",\n };\n }\n\n try {\n // Get entityType from resource meta\n const entityType = params?.resource?.meta?.entityType as string;\n\n // Build resource for Cerbos check\n const resources = [\n {\n entityType,\n tableName: resource,\n recordId: params?.id ? String(params.id) : \"*\",\n attributes: (params || {}) as Record<string, unknown>,\n actions: [action],\n },\n ];\n\n const result = await policy.checkResource(resources) as {\n results?: Array<{ actions?: Record<string, string> }>;\n allowed?: boolean;\n reason?: string;\n };\n\n // Parse the Cerbos response\n if (result && typeof result === \"object\") {\n const actionResult = result.results?.[0]?.actions?.[action];\n const allowed = actionResult === \"EFFECT_ALLOW\" || result.allowed === true;\n\n return {\n can: allowed,\n reason: result.reason || (allowed ? undefined : \"Permission denied by policy\"),\n };\n }\n\n return {\n can: false,\n reason: \"Invalid policy response\",\n };\n } catch (error) {\n console.error(\"Cerbos permission check failed:\", error);\n return {\n can: false,\n reason: error instanceof Error ? error.message : \"Permission check failed\",\n };\n }\n },\n\n options: {\n buttons: {\n enableAccessControl: true,\n hideIfUnauthorized: false,\n },\n },\n };\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@taruvi/refine-providers",
3
- "version": "1.0.4",
3
+ "version": "1.0.5",
4
4
  "description": "Refine.dev data provider for Taruvi Data Service",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",
@@ -29,8 +29,7 @@
29
29
  "clean": "rm -rf dist"
30
30
  },
31
31
  "peerDependencies": {
32
- "@refinedev/core": "^5.0.0",
33
- "@taruvi/sdk": ">=1.0.0 <2.0.0"
32
+ "@refinedev/core": "^5.0.0"
34
33
  },
35
34
  "peerDependenciesMeta": {
36
35
  "@refinedev/core": {
@@ -42,7 +41,6 @@
42
41
  },
43
42
  "devDependencies": {
44
43
  "@refinedev/core": "^5.0.0",
45
- "@taruvi/sdk": "^1.1.3",
46
44
  "@types/node": "^20.0.0",
47
45
  "tsup": "^8.0.0",
48
46
  "typescript": "^5.7.0"
@@ -65,5 +63,8 @@
65
63
  "homepage": "https://github.com/taruvi-io/sdk/tree/main/packages/refine#readme",
66
64
  "bugs": {
67
65
  "url": "https://github.com/taruvi-io/sdk/issues"
66
+ },
67
+ "dependencies": {
68
+ "@taruvi/sdk": "^1.1.6"
68
69
  }
69
70
  }