@taruvi/refine-providers 1.3.4-beta.1 → 1.3.4-beta.3

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/README.md CHANGED
@@ -115,23 +115,26 @@ List `getList` filters use an explicit **`TaruviListFilters`** shape:
115
115
 
116
116
  Legacy Refine **`CrudFilter[]`** is still accepted: all field leaves → flat array; a single root `and`/`or` object → logical object; mixed lists fall back to the JSON tree. Bracket keys from `convertRefineFilters` remain for helpers / Storage flatten mode.
117
117
 
118
- Full support for Refine filter operators:
118
+ Use **`TaruviCrudOperator`** / **`TaruviFieldFilter`** for type-safe filters (including PostgreSQL range/array ops and `search`). Pass them to Refine hooks with **`toRefineFilters()`** — Refine’s `CrudOperators` type is narrower than the runtime set.
119
119
 
120
120
  ```tsx
121
+ import { useList } from "@refinedev/core";
122
+ import { toRefineFilters } from "@taruvi/refine-providers";
123
+
121
124
  const { data } = useList({
122
125
  resource: "posts",
123
- filters: [
126
+ filters: toRefineFilters([
124
127
  { field: "status", operator: "eq", value: "published" },
125
128
  { field: "views", operator: "gte", value: 100 },
129
+ { field: "slot", operator: "roverlaps", value: "[2024-01-01,2024-12-31)" },
126
130
  { field: "title", operator: "containss", value: "refine" },
127
- { field: "category", operator: "in", value: ["tech", "news"] },
128
- ],
131
+ ]),
129
132
  });
130
133
  ```
131
134
 
132
135
  **Refine → backend operator mapping (important):**
133
136
 
134
- Wire suffixes match the platform (`contains` = case-insensitive, `containss` = case-sensitive). Refine aliases map to the same tokens, e.g. `icontains` → `contains`. See `REFINE_OPERATOR_MAP` in [`src/utils.ts`](src/utils.ts).
137
+ Wire suffixes match the platform (`contains` = case-insensitive, `containss` = case-sensitive). Refine aliases map to the same tokens, e.g. `icontains` → `contains`. See `REFINE_OPERATOR_MAP` in [`src/filterTypes.ts`](src/filterTypes.ts). Details: [docs/filters.md](docs/filters.md).
135
138
 
136
139
  **More operators:**
137
140
 
package/dist/index.cjs CHANGED
@@ -11,9 +11,9 @@ var DataLoader__default = /*#__PURE__*/_interopDefault(DataLoader);
11
11
 
12
12
  // package.json
13
13
  var package_default = {
14
- version: "1.3.4-beta.1"};
14
+ version: "1.3.4-beta.3"};
15
15
 
16
- // src/utils.ts
16
+ // src/filterTypes.ts
17
17
  var REFINE_OPERATOR_MAP = {
18
18
  // Equality
19
19
  eq: "",
@@ -76,6 +76,18 @@ var REFINE_OPERATOR_MAP = {
76
76
  ilike: "ilike",
77
77
  search: "search"
78
78
  };
79
+ function hasTaruviOperator(operator) {
80
+ return operator in REFINE_OPERATOR_MAP;
81
+ }
82
+ function taruviOperatorSuffix(operator) {
83
+ if (!hasTaruviOperator(operator)) return void 0;
84
+ return REFINE_OPERATOR_MAP[operator];
85
+ }
86
+ function toRefineFilters(filters) {
87
+ return filters;
88
+ }
89
+
90
+ // src/utils.ts
79
91
  var COMMA_VALUE_OPERATORS = /* @__PURE__ */ new Set([
80
92
  "in",
81
93
  "nin",
@@ -112,7 +124,7 @@ function isFlatFilterList(filters) {
112
124
  if (leaf.value === void 0 || leaf.value === null && leaf.operator !== "null") {
113
125
  return false;
114
126
  }
115
- if (REFINE_OPERATOR_MAP[leaf.operator] === void 0) {
127
+ if (!hasTaruviOperator(leaf.operator)) {
116
128
  return false;
117
129
  }
118
130
  return true;
@@ -149,7 +161,7 @@ function collectFlatLeaves(filters) {
149
161
  if (leaf.value === void 0 || leaf.value === null && leaf.operator !== "null") {
150
162
  continue;
151
163
  }
152
- if (REFINE_OPERATOR_MAP[leaf.operator] === void 0) {
164
+ if (!hasTaruviOperator(leaf.operator)) {
153
165
  console.warn(`Unknown Refine operator: ${leaf.operator}`);
154
166
  return false;
155
167
  }
@@ -165,7 +177,7 @@ function collectFlatLeaves(filters) {
165
177
  return leaves;
166
178
  }
167
179
  function refineOperatorToBackendKey(operator) {
168
- const suffix = REFINE_OPERATOR_MAP[operator];
180
+ const suffix = taruviOperatorSuffix(operator);
169
181
  if (suffix === void 0) return operator;
170
182
  return suffix === "" ? "eq" : suffix;
171
183
  }
@@ -182,7 +194,7 @@ function encodeLeafFlat(field, operator, value, params) {
182
194
  if (value === void 0 || value === null && operator !== "null") {
183
195
  return;
184
196
  }
185
- const suffix = REFINE_OPERATOR_MAP[operator];
197
+ const suffix = taruviOperatorSuffix(operator);
186
198
  if (suffix === void 0) {
187
199
  console.warn(`Unknown Refine operator: ${operator}`);
188
200
  return;
@@ -208,7 +220,7 @@ function encodeCrudFilterBracket(filter, path, out) {
208
220
  if (value === void 0 || value === null && operator !== "null") {
209
221
  return;
210
222
  }
211
- const suffix = REFINE_OPERATOR_MAP[operator];
223
+ const suffix = taruviOperatorSuffix(operator);
212
224
  if (suffix === void 0) {
213
225
  console.warn(`Unknown Refine operator: ${operator}`);
214
226
  return;
@@ -235,7 +247,7 @@ function crudFilterToBackendNodeOrNull(filter) {
235
247
  if (leaf.value === void 0 || leaf.value === null && leaf.operator !== "null") {
236
248
  return null;
237
249
  }
238
- if (REFINE_OPERATOR_MAP[leaf.operator] === void 0) {
250
+ if (!hasTaruviOperator(leaf.operator)) {
239
251
  console.warn(`Unknown Refine operator: ${leaf.operator}`);
240
252
  return null;
241
253
  }
@@ -373,7 +385,7 @@ function formatHaving(having) {
373
385
  if (value === void 0 || value === null && operator !== "null") {
374
386
  continue;
375
387
  }
376
- const suffix = REFINE_OPERATOR_MAP[operator];
388
+ const suffix = taruviOperatorSuffix(operator);
377
389
  if (suffix === void 0) {
378
390
  console.warn(`Unknown operator in having clause: ${operator}`);
379
391
  continue;
@@ -385,15 +397,6 @@ function formatHaving(having) {
385
397
  }
386
398
  return params.length > 0 ? params.join(",") : void 0;
387
399
  }
388
- function handleError(error) {
389
- if (error instanceof Error) {
390
- throw error;
391
- }
392
- if (typeof error === "object" && error !== null && "message" in error) {
393
- throw new Error(String(error.message));
394
- }
395
- throw new Error("Unknown error occurred");
396
- }
397
400
 
398
401
  // src/dataProvider.ts
399
402
  function applyAggregations(query, meta) {
@@ -464,8 +467,18 @@ function applyAllowedActions(query, meta) {
464
467
  if (!meta?.allowedActions?.length) return query;
465
468
  return query.allowedActions(meta.allowedActions);
466
469
  }
470
+ function applySearchAndFields(query, meta) {
471
+ if (!meta) return query;
472
+ let result = query;
473
+ const search = meta.search?.trim();
474
+ if (search) result = result.search(search);
475
+ const select = meta.select;
476
+ const fields = typeof select === "string" ? select.trim() : Array.isArray(select) ? select.map(String).join(",") : "";
477
+ if (fields) result = result.fields(fields);
478
+ return result;
479
+ }
467
480
  function isGraphQuery(meta) {
468
- return !!(meta?.format || meta?.graph_types || meta?.include || meta?.depth);
481
+ return !!(meta?.format || meta?.relationship_type || meta?.include || meta?.depth);
469
482
  }
470
483
  function buildGraphQuery(client, tableName, meta, recordId) {
471
484
  let query = new sdk.Database(client).from(tableName);
@@ -473,7 +486,7 @@ function buildGraphQuery(client, tableName, meta, recordId) {
473
486
  if (meta?.format) query = query.format(meta.format);
474
487
  if (meta?.include) query = query.include(meta.include);
475
488
  if (meta?.depth) query = query.depth(meta.depth);
476
- if (meta?.graph_types) query = query.types(meta.graph_types);
489
+ if (meta?.relationship_type) query = query.types(meta.relationship_type);
477
490
  return query;
478
491
  }
479
492
  function dataProvider(client) {
@@ -501,6 +514,7 @@ function dataProvider(client) {
501
514
  query = applyPagination(query, pagination);
502
515
  query = applyPopulate(query, taruviMeta);
503
516
  query = applyAggregations(query, taruviMeta);
517
+ query = applySearchAndFields(query, taruviMeta);
504
518
  query = applyAllowedActions(query, taruviMeta);
505
519
  const response = await query.execute();
506
520
  return { data: response.data, total: response.total };
@@ -704,7 +718,9 @@ function storageDataProvider(client) {
704
718
  return { data: { id: path } };
705
719
  },
706
720
  getApiUrl: () => baseApiUrl,
707
- getMany: async () => ({ data: [] }),
721
+ getMany: async () => {
722
+ throw new Error("getMany is not supported for storage resources");
723
+ },
708
724
  createMany: async (params) => {
709
725
  const { resource, variables, meta } = params;
710
726
  const taruviMeta = meta;
@@ -714,7 +730,7 @@ function storageDataProvider(client) {
714
730
  const fileMetadatas = files.map((_, i) => metadatas[i] || {});
715
731
  const response = await new sdk.Storage(client).from(bucket).upload({ files, paths: filePaths, metadatas: fileMetadatas }).execute();
716
732
  const uploaded = response.data?.successful?.map((s) => s.object) ?? [];
717
- return { data: uploaded.length > 0 ? uploaded[0] : response.data };
733
+ return { data: uploaded.length > 0 ? uploaded : [response.data] };
718
734
  },
719
735
  deleteMany: async (params) => {
720
736
  const { resource, ids, meta } = params;
@@ -1156,6 +1172,7 @@ function analyticsDataProvider(client) {
1156
1172
  }
1157
1173
  };
1158
1174
  }
1175
+ var isBrowser = typeof window !== "undefined";
1159
1176
  exports._cachedUser = null;
1160
1177
  function authProvider(client) {
1161
1178
  const auth = new sdk.Auth(client);
@@ -1225,11 +1242,15 @@ function authProvider(client) {
1225
1242
  return null;
1226
1243
  }
1227
1244
  const user = response.data ?? response;
1228
- exports._cachedUser = user;
1245
+ if (isBrowser) exports._cachedUser = user;
1229
1246
  return user;
1230
1247
  },
1231
1248
  getPermissions: async () => {
1232
- const user = exports._cachedUser;
1249
+ let user = isBrowser ? exports._cachedUser : null;
1250
+ if (!user) {
1251
+ const response = await auth.getCurrentUser();
1252
+ user = response ? response.data ?? response : null;
1253
+ }
1233
1254
  if (!user) {
1234
1255
  return null;
1235
1256
  }
@@ -1243,13 +1264,14 @@ function authProvider(client) {
1243
1264
  }
1244
1265
  };
1245
1266
  }
1267
+ var isBrowser2 = typeof window !== "undefined";
1246
1268
  function accessControlProvider(client, options) {
1247
1269
  const policy = new sdk.Policy(client);
1248
1270
  const auth = new sdk.Auth(client);
1249
1271
  const { batchDelayMs = 50 } = options ?? {};
1250
1272
  const permissionLoader = new DataLoader__default.default(
1251
1273
  async (checks) => {
1252
- let currentUser = exports._cachedUser;
1274
+ let currentUser = isBrowser2 ? exports._cachedUser : null;
1253
1275
  if (!currentUser) {
1254
1276
  try {
1255
1277
  const response = await auth.getCurrentUser();
@@ -1362,12 +1384,14 @@ exports.encodeCrudFilterBracket = encodeCrudFilterBracket;
1362
1384
  exports.encodeFlatFilterListToParams = encodeFlatFilterListToParams;
1363
1385
  exports.formatRefineLeafValue = formatRefineLeafValue;
1364
1386
  exports.functionsDataProvider = functionsDataProvider;
1365
- exports.handleError = handleError;
1387
+ exports.hasTaruviOperator = hasTaruviOperator;
1366
1388
  exports.isFlatFilterList = isFlatFilterList;
1367
1389
  exports.isLogicalCrudFilter = isLogicalCrudFilter;
1368
1390
  exports.normalizeTaruviListFilters = normalizeTaruviListFilters;
1369
1391
  exports.refineOperatorToBackendKey = refineOperatorToBackendKey;
1370
1392
  exports.storageDataProvider = storageDataProvider;
1393
+ exports.taruviOperatorSuffix = taruviOperatorSuffix;
1394
+ exports.toRefineFilters = toRefineFilters;
1371
1395
  exports.userDataProvider = userDataProvider;
1372
1396
  //# sourceMappingURL=index.cjs.map
1373
1397
  //# sourceMappingURL=index.cjs.map