@wgalleti/primevue-components 0.15.0 → 0.17.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. package/dist/WKanbanBoard.vue_vue_type_script_setup_true_lang-DWs-ZSNZ.cjs +28 -0
  2. package/dist/WKanbanBoard.vue_vue_type_script_setup_true_lang-DWs-ZSNZ.cjs.map +1 -0
  3. package/dist/WKanbanBoard.vue_vue_type_script_setup_true_lang-DvyxNL4O.js +6544 -0
  4. package/dist/WKanbanBoard.vue_vue_type_script_setup_true_lang-DvyxNL4O.js.map +1 -0
  5. package/dist/components/index.d.ts +3 -0
  6. package/dist/components/ui/WDialog.vue.d.ts +15 -0
  7. package/dist/components/ui/WMapSelect.vue.d.ts +7 -1
  8. package/dist/components/ui/WTabNav.vue.d.ts +56 -0
  9. package/dist/components/ui/WTabPane.d.ts +53 -0
  10. package/dist/components/ui/WTabViewport.vue.d.ts +14 -0
  11. package/dist/components.cjs +1 -1
  12. package/dist/components.js +28 -25
  13. package/dist/composables/index.d.ts +1 -0
  14. package/dist/composables/useRouteTabs.d.ts +2 -0
  15. package/dist/composables.cjs +1 -1
  16. package/dist/composables.cjs.map +1 -1
  17. package/dist/composables.js +11 -10
  18. package/dist/index.cjs +1 -1
  19. package/dist/index.cjs.map +1 -1
  20. package/dist/index.d.ts +4 -4
  21. package/dist/index.js +127 -120
  22. package/dist/index.js.map +1 -1
  23. package/dist/labels-B28P8JNB.js +19 -0
  24. package/dist/labels-B28P8JNB.js.map +1 -0
  25. package/dist/labels-pNskxXcl.cjs +2 -0
  26. package/dist/labels-pNskxXcl.cjs.map +1 -0
  27. package/dist/plugin-CIBvOgwG.js +14 -0
  28. package/dist/plugin-CIBvOgwG.js.map +1 -0
  29. package/dist/plugin-D2IZHyBm.cjs +2 -0
  30. package/dist/plugin-D2IZHyBm.cjs.map +1 -0
  31. package/dist/primevue-components.css +1 -1
  32. package/dist/types/index.d.ts +3 -1
  33. package/dist/types/mapSelect.d.ts +10 -0
  34. package/dist/types/routeTabs.d.ts +129 -0
  35. package/dist/types.cjs +1 -1
  36. package/dist/types.cjs.map +1 -1
  37. package/dist/types.js +8 -20
  38. package/dist/types.js.map +1 -1
  39. package/dist/useFormKeyboardNav-BgBAe0C7.cjs +3 -0
  40. package/dist/useFormKeyboardNav-BgBAe0C7.cjs.map +1 -0
  41. package/dist/{useFormKeyboardNav-D4Irq5RE.js → useFormKeyboardNav-BrKZrHq9.js} +180 -178
  42. package/dist/useFormKeyboardNav-BrKZrHq9.js.map +1 -0
  43. package/dist/useRouteTabs-CSo1j_ji.js +762 -0
  44. package/dist/useRouteTabs-CSo1j_ji.js.map +1 -0
  45. package/dist/useRouteTabs-VGx93R83.cjs +2 -0
  46. package/dist/useRouteTabs-VGx93R83.cjs.map +1 -0
  47. package/package.json +1 -1
  48. package/skill/references/components.md +28 -0
  49. package/dist/WKanbanBoard.vue_vue_type_script_setup_true_lang-Cx3AJma_.js +0 -6296
  50. package/dist/WKanbanBoard.vue_vue_type_script_setup_true_lang-Cx3AJma_.js.map +0 -1
  51. package/dist/WKanbanBoard.vue_vue_type_script_setup_true_lang-DX-6iLgb.cjs +0 -36
  52. package/dist/WKanbanBoard.vue_vue_type_script_setup_true_lang-DX-6iLgb.cjs.map +0 -1
  53. package/dist/plugin-BKa0eSEM.js +0 -7
  54. package/dist/plugin-BKa0eSEM.js.map +0 -1
  55. package/dist/plugin-D1YvyKXX.cjs +0 -2
  56. package/dist/plugin-D1YvyKXX.cjs.map +0 -1
  57. package/dist/useApi-BM5JpPDe.js +0 -539
  58. package/dist/useApi-BM5JpPDe.js.map +0 -1
  59. package/dist/useApi-CPt3Tj4n.cjs +0 -2
  60. package/dist/useApi-CPt3Tj4n.cjs.map +0 -1
  61. package/dist/useFormKeyboardNav-D4Irq5RE.js.map +0 -1
  62. package/dist/useFormKeyboardNav-D4Ow3k4Y.cjs +0 -3
  63. package/dist/useFormKeyboardNav-D4Ow3k4Y.cjs.map +0 -1
package/dist/index.js CHANGED
@@ -1,23 +1,24 @@
1
- import { b as y, W as _, a as w } from "./plugin-BKa0eSEM.js";
2
- import { f as C, d as S, c as b, a as A, w as P, E as v, F } from "./WKanbanBoard.vue_vue_type_script_setup_true_lang-Cx3AJma_.js";
3
- import { _ as B, b as O, e as V, g as H, h as N, i as q, j, k as U, l as G, m as J, n as X, W as Q, o as Z, p as ee, q as ae, r as te, s as re, t as se, u as ne, v as oe, x as ie, y as ce, z as de, A as le, B as ue, C as fe, D as me, G as pe, H as ge, I as We, J as ye, K as _e, L as we, M as Ce } from "./WKanbanBoard.vue_vue_type_script_setup_true_lang-Cx3AJma_.js";
4
- import { u as be, a as Ae, b as Pe } from "./useApi-BM5JpPDe.js";
5
- import { e as Fe, u as De, a as xe, b as Ee, c as Te, f as he } from "./useFormKeyboardNav-D4Irq5RE.js";
6
- import { DEFAULT_CRUD_LABELS as Re } from "./types.js";
7
- function D(e, a, t) {
8
- const r = e;
9
- return Array.isArray(r.results) ? {
10
- data: r.results,
11
- page: r.page ?? a,
12
- page_size: r.page_size ?? t,
13
- rows: r.count ?? 0,
14
- extras: r.extras ?? {}
15
- } : Array.isArray(r.data) ? {
16
- data: r.data,
17
- page: r.page ?? a,
18
- page_size: r.page_size ?? t,
19
- rows: r.rows ?? 0,
20
- extras: r.extras ?? {}
1
+ import { W as _, b as y, a as w } from "./plugin-CIBvOgwG.js";
2
+ import { c as O, u as B } from "./plugin-CIBvOgwG.js";
3
+ import { f as b, d as S, c as A, a as C, x as P, H as v, I as D } from "./WKanbanBoard.vue_vue_type_script_setup_true_lang-DvyxNL4O.js";
4
+ import { _ as N, b as V, e as q, g as j, h as U, i as G, j as J, k as X, l as Q, m as Z, n as ee, o as ae, W as te, p as se, q as re, r as ne, s as oe, t as ie, u as ce, v as ue, w as le, y as de, z as fe, A as me, B as pe, C as ge, D as We, E as _e, F as ye, G as we, J as be, K as Se, L as Ae, M as Ce, N as Pe, O as ve, P as De } from "./WKanbanBoard.vue_vue_type_script_setup_true_lang-DvyxNL4O.js";
5
+ import { u as Te, a as xe, b as Ee, c as he } from "./useRouteTabs-CSo1j_ji.js";
6
+ import { e as $e, u as ze, a as Le, b as Me, c as Ye, f as Ie } from "./useFormKeyboardNav-BrKZrHq9.js";
7
+ import { D as ke } from "./labels-B28P8JNB.js";
8
+ function F(e, a, t) {
9
+ const s = e;
10
+ return Array.isArray(s.results) ? {
11
+ data: s.results,
12
+ page: s.page ?? a,
13
+ page_size: s.page_size ?? t,
14
+ rows: s.count ?? 0,
15
+ extras: s.extras ?? {}
16
+ } : Array.isArray(s.data) ? {
17
+ data: s.data,
18
+ page: s.page ?? a,
19
+ page_size: s.page_size ?? t,
20
+ rows: s.rows ?? 0,
21
+ extras: s.extras ?? {}
21
22
  } : {
22
23
  data: Array.isArray(e) ? e : [],
23
24
  page: a,
@@ -26,37 +27,37 @@ function D(e, a, t) {
26
27
  extras: {}
27
28
  };
28
29
  }
29
- function x(e) {
30
+ function T(e) {
30
31
  return {
31
32
  async list(a, t = {}) {
32
- const r = await e.get(a, { params: t });
33
- return D(
34
- r.data,
33
+ const s = await e.get(a, { params: t });
34
+ return F(
35
+ s.data,
35
36
  Number(t.page ?? 1),
36
37
  Number(t.page_size ?? 20)
37
38
  );
38
39
  },
39
- async get(a, t, r) {
40
- return { data: (await e.get(`${a}${t}/`, r)).data };
40
+ async get(a, t, s) {
41
+ return { data: (await e.get(`${a}${t}/`, s)).data };
41
42
  },
42
- async create(a, t, r) {
43
- return { data: (await e.post(a, t, r)).data };
43
+ async create(a, t, s) {
44
+ return { data: (await e.post(a, t, s)).data };
44
45
  },
45
- async update(a, t, r, s) {
46
- return { data: (await e.patch(`${a}${t}/`, r, s)).data };
46
+ async update(a, t, s, r) {
47
+ return { data: (await e.patch(`${a}${t}/`, s, r)).data };
47
48
  },
48
49
  async delete(a, t) {
49
50
  await e.delete(`${a}${t}/`);
50
51
  }
51
52
  };
52
53
  }
53
- const I = {
54
+ const Y = {
54
55
  install(e, a) {
55
56
  if (!(a != null && a.axios) && !(a != null && a.dataProvider))
56
57
  throw new Error(
57
58
  '[wPrimeVueComponents] Informe "axios" ou "dataProvider" ao registrar o WPrimeVuePlugin.'
58
59
  );
59
- const t = a.dataProvider ?? x(a.axios), r = {
60
+ const t = a.dataProvider ?? T(a.axios), s = {
60
61
  axios: a.axios,
61
62
  dataProvider: t,
62
63
  defaultPageSize: a.defaultPageSize ?? 20,
@@ -65,13 +66,13 @@ const I = {
65
66
  locale: a.locale ?? "pt-BR",
66
67
  currency: a.currency ?? "BRL"
67
68
  };
68
- a.axios && e.provide(y, a.axios), e.provide(_, t), e.provide(w, r), a.registerComponents !== !1 && (e.component("WCrudView", C), e.component("WCrudFormDialog", S), e.component("WCrudColumnRenderer", b), e.component("WAutoCompleteFK", A), e.component("WMoneyInput", P), e.component("WTransferList", v), e.component("WTreeSelect", F));
69
+ a.axios && e.provide(_, a.axios), e.provide(y, t), e.provide(w, s), a.registerComponents !== !1 && (e.component("WCrudView", b), e.component("WCrudFormDialog", S), e.component("WCrudColumnRenderer", A), e.component("WAutoCompleteFK", C), e.component("WMoneyInput", P), e.component("WTransferList", v), e.component("WTreeSelect", D));
69
70
  }
70
71
  };
71
- function E(e) {
72
+ function x(e) {
72
73
  return e.split("?")[0].replace(/^\/+|\/+$/g, "").replace(/^api\/v\d+\//, "");
73
74
  }
74
- function T(e) {
75
+ function E(e) {
75
76
  return typeof e == "string" ? { table: e } : e;
76
77
  }
77
78
  function W(e, a = 400) {
@@ -104,27 +105,27 @@ function f(e) {
104
105
  };
105
106
  }
106
107
  function m(e, a) {
107
- var s, n;
108
- const t = E(e), r = (s = a.resources) == null ? void 0 : s[t];
109
- if (r)
110
- return T(r);
108
+ var r, n;
109
+ const t = x(e), s = (r = a.resources) == null ? void 0 : r[t];
110
+ if (s)
111
+ return E(s);
111
112
  if ((n = a.allowedTables) != null && n.includes(t))
112
113
  return { table: t };
113
114
  throw W(`Recurso Supabase nao registrado para o endpoint "${e}".`, 404);
114
115
  }
115
116
  function h(e, a, t) {
116
- const r = /* @__PURE__ */ new Set(["page", "page_size", "search", "ordering"]), s = { ...t.defaultFilters, ...a };
117
- for (const [n, o] of Object.entries(s))
118
- r.has(n) || o === null || o === void 0 || o === "" || (e = e.eq(n, o));
117
+ const s = /* @__PURE__ */ new Set(["page", "page_size", "search", "ordering"]), r = { ...t.defaultFilters, ...a };
118
+ for (const [n, o] of Object.entries(r))
119
+ s.has(n) || o === null || o === void 0 || o === "" || (e = e.eq(n, o));
119
120
  return e;
120
121
  }
121
- function $(e, a, t) {
122
+ function R(e, a, t) {
122
123
  if (typeof a != "string" || !a.trim() || !(t != null && t.length))
123
124
  return e;
124
- const r = a.trim().replace(/,/g, "\\,"), s = t.map((n) => `${n}.ilike.%${r}%`).join(",");
125
- return e.or(s);
125
+ const s = a.trim().replace(/,/g, "\\,"), r = t.map((n) => `${n}.ilike.%${s}%`).join(",");
126
+ return e.or(r);
126
127
  }
127
- function R(e, a) {
128
+ function $(e, a) {
128
129
  const t = typeof e == "string" && e ? e : a;
129
130
  return t ? {
130
131
  field: t.startsWith("-") ? t.slice(1) : t,
@@ -133,104 +134,110 @@ function R(e, a) {
133
134
  }
134
135
  function z(e, a) {
135
136
  return e ? a.mapListItem ? e.map((t) => {
136
- var r;
137
- return (r = a.mapListItem) == null ? void 0 : r.call(a, t);
137
+ var s;
138
+ return (s = a.mapListItem) == null ? void 0 : s.call(a, t);
138
139
  }) : e : [];
139
140
  }
140
- function Y(e) {
141
+ function I(e) {
141
142
  const a = e.defaultSelect ?? "*";
142
143
  return {
143
- async list(t, r = {}) {
144
+ async list(t, s = {}) {
144
145
  var p;
145
- const s = m(t, e), n = Math.max(Number(r.page ?? 1), 1), o = Math.max(Number(r.page_size ?? 20), 1), i = (n - 1) * o, d = i + o - 1;
146
- let c = e.client.from(s.table).select(s.select ?? a, { count: "exact" });
147
- c = h(c, r, s), c = $(c, r.search, s.searchFields);
148
- const l = R(r.ordering, s.defaultOrdering);
146
+ const r = m(t, e), n = Math.max(Number(s.page ?? 1), 1), o = Math.max(Number(s.page_size ?? 20), 1), i = (n - 1) * o, u = i + o - 1;
147
+ let c = e.client.from(r.table).select(r.select ?? a, { count: "exact" });
148
+ c = h(c, s, r), c = R(c, s.search, r.searchFields);
149
+ const l = $(s.ordering, r.defaultOrdering);
149
150
  l && (c = c.order(l.field, { ascending: l.ascending }));
150
- const u = await c.range(i, d);
151
- return u.error && f(u.error), {
152
- data: z(u.data, s),
151
+ const d = await c.range(i, u);
152
+ return d.error && f(d.error), {
153
+ data: z(d.data, r),
153
154
  page: n,
154
155
  page_size: o,
155
- rows: u.count ?? ((p = u.data) == null ? void 0 : p.length) ?? 0,
156
+ rows: d.count ?? ((p = d.data) == null ? void 0 : p.length) ?? 0,
156
157
  extras: {}
157
158
  };
158
159
  },
159
- async get(t, r, s) {
160
- const n = m(t, e), o = n.pk ?? "id", i = await e.client.from(n.table).select(n.select ?? a).eq(o, r).single();
160
+ async get(t, s, r) {
161
+ const n = m(t, e), o = n.pk ?? "id", i = await e.client.from(n.table).select(n.select ?? a).eq(o, s).single();
161
162
  return i.error && f(i.error), { data: i.data };
162
163
  },
163
- async create(t, r, s) {
164
- const n = m(t, e), o = g(r), i = n.mapPayload ? n.mapPayload(o, "create") : o, d = await e.client.from(n.table).insert(i).select(n.select ?? a).single();
165
- return d.error && f(d.error), { data: d.data };
164
+ async create(t, s, r) {
165
+ const n = m(t, e), o = g(s), i = n.mapPayload ? n.mapPayload(o, "create") : o, u = await e.client.from(n.table).insert(i).select(n.select ?? a).single();
166
+ return u.error && f(u.error), { data: u.data };
166
167
  },
167
- async update(t, r, s, n) {
168
- const o = m(t, e), i = o.pk ?? "id", d = g(s), c = o.mapPayload ? o.mapPayload(d, "update") : d, l = await e.client.from(o.table).update(c).eq(i, r).select(o.select ?? a).single();
168
+ async update(t, s, r, n) {
169
+ const o = m(t, e), i = o.pk ?? "id", u = g(r), c = o.mapPayload ? o.mapPayload(u, "update") : u, l = await e.client.from(o.table).update(c).eq(i, s).select(o.select ?? a).single();
169
170
  return l.error && f(l.error), { data: l.data };
170
171
  },
171
- async delete(t, r) {
172
- const s = m(t, e), n = s.pk ?? "id", o = s.softDelete === !0 ? { is_active: !1 } : typeof s.softDelete == "object" ? s.softDelete : null, i = o ? await e.client.from(s.table).update(o).eq(n, r) : await e.client.from(s.table).delete().eq(n, r);
172
+ async delete(t, s) {
173
+ const r = m(t, e), n = r.pk ?? "id", o = r.softDelete === !0 ? { is_active: !1 } : typeof r.softDelete == "object" ? r.softDelete : null, i = o ? await e.client.from(r.table).update(o).eq(n, s) : await e.client.from(r.table).delete().eq(n, s);
173
174
  i.error && f(i.error);
174
175
  }
175
176
  };
176
177
  }
177
178
  export {
178
- Re as DEFAULT_CRUD_LABELS,
179
- B as WActionBar,
180
- A as WAutoCompleteFK,
181
- O as WCheckList,
182
- b as WCrudColumnRenderer,
179
+ ke as DEFAULT_CRUD_LABELS,
180
+ N as WActionBar,
181
+ C as WAutoCompleteFK,
182
+ V as WCheckList,
183
+ A as WCrudColumnRenderer,
183
184
  S as WCrudFormDialog,
184
- V as WCrudSubview,
185
- C as WCrudView,
186
- H as WDatePicker,
187
- N as WDateRange,
188
- q as WDetailHeader,
189
- j as WEditableTable,
190
- U as WEmptyState,
191
- G as WFileUpload,
192
- J as WFormRenderer,
193
- X as WFormSection,
194
- Q as WImageCropper,
195
- Z as WInfoCard,
196
- ee as WKanbanBoard,
197
- ae as WKpiCard,
198
- te as WKpiGrid,
199
- re as WMapSelect,
200
- se as WMarkdownEditor,
201
- ne as WMarkdownToc,
202
- oe as WMarkdownView,
185
+ q as WCrudSubview,
186
+ b as WCrudView,
187
+ j as WDatePicker,
188
+ U as WDateRange,
189
+ G as WDetailHeader,
190
+ J as WDialog,
191
+ X as WEditableTable,
192
+ Q as WEmptyState,
193
+ Z as WFileUpload,
194
+ ee as WFormRenderer,
195
+ ae as WFormSection,
196
+ te as WImageCropper,
197
+ se as WInfoCard,
198
+ re as WKanbanBoard,
199
+ ne as WKpiCard,
200
+ oe as WKpiGrid,
201
+ ie as WMapSelect,
202
+ ce as WMarkdownEditor,
203
+ ue as WMarkdownToc,
204
+ le as WMarkdownView,
203
205
  P as WMoneyInput,
204
- ie as WPageHeader,
205
- I as WPrimeVuePlugin,
206
- ce as WProgressFlow,
207
- de as WSectionHeader,
208
- le as WStatusTag,
209
- ue as WStepFlow,
210
- fe as WStepSection,
211
- me as WTabBar,
206
+ de as WPageHeader,
207
+ Y as WPrimeVuePlugin,
208
+ fe as WProgressFlow,
209
+ me as WSectionHeader,
210
+ pe as WStatusTag,
211
+ ge as WStepFlow,
212
+ We as WStepSection,
213
+ _e as WTabBar,
214
+ ye as WTabNav,
215
+ we as WTabViewport,
212
216
  v as WTransferList,
213
- F as WTreeSelect,
214
- y as W_AXIOS_KEY,
217
+ D as WTreeSelect,
218
+ _ as W_AXIOS_KEY,
215
219
  w as W_CONFIG_KEY,
216
- _ as W_DATA_PROVIDER_KEY,
217
- pe as W_STEP_FLOW_KEY,
218
- x as createAxiosDataProvider,
219
- Y as createSupabaseDataProvider,
220
- ge as downloadCsv,
221
- Fe as extractApiError,
222
- We as mapApiFieldToColumnDef,
223
- ye as mapApiFieldToFieldDef,
224
- _e as mapApiFieldsToColumnDefs,
225
- we as mapApiFieldsToFieldDefs,
226
- Ce as toCsv,
227
- be as useApi,
228
- De as useApiError,
229
- xe as useAppConfirm,
230
- Ee as useAppToast,
231
- Ae as useCrudManager,
232
- Te as useDateInput,
233
- he as useFormatters,
234
- Pe as useSubviewCrud
220
+ y as W_DATA_PROVIDER_KEY,
221
+ be as W_STEP_FLOW_KEY,
222
+ O as W_TAB_HOST_KEY,
223
+ T as createAxiosDataProvider,
224
+ I as createSupabaseDataProvider,
225
+ Se as downloadCsv,
226
+ $e as extractApiError,
227
+ Ae as mapApiFieldToColumnDef,
228
+ Ce as mapApiFieldToFieldDef,
229
+ Pe as mapApiFieldsToColumnDefs,
230
+ ve as mapApiFieldsToFieldDefs,
231
+ De as toCsv,
232
+ Te as useApi,
233
+ ze as useApiError,
234
+ Le as useAppConfirm,
235
+ Me as useAppToast,
236
+ xe as useCrudManager,
237
+ Ye as useDateInput,
238
+ Ie as useFormatters,
239
+ Ee as useRouteTabs,
240
+ he as useSubviewCrud,
241
+ B as useTabHost
235
242
  };
236
243
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/data-providers/axiosDataProvider.ts","../src/plugin.ts","../src/data-providers/supabaseDataProvider.ts"],"sourcesContent":["import type { AxiosInstance } from 'axios'\nimport type {\n DataProvider,\n DataProviderListParams,\n DataProviderListResponse,\n DataProviderRequestConfig,\n DataProviderResponse,\n} from '@/types/dataProvider'\n\nfunction normalizeListResponse<T>(\n responseData: unknown,\n fallbackPage: number,\n fallbackPageSize: number,\n): DataProviderListResponse<T> {\n const data = responseData as Record<string, unknown>\n\n if (Array.isArray(data.results)) {\n return {\n data: data.results as T[],\n page: (data.page as number) ?? fallbackPage,\n page_size: (data.page_size as number) ?? fallbackPageSize,\n rows: (data.count as number) ?? 0,\n extras: (data.extras as Record<string, unknown>) ?? {},\n }\n }\n\n if (Array.isArray(data.data)) {\n return {\n data: data.data as T[],\n page: (data.page as number) ?? fallbackPage,\n page_size: (data.page_size as number) ?? fallbackPageSize,\n rows: (data.rows as number) ?? 0,\n extras: (data.extras as Record<string, unknown>) ?? {},\n }\n }\n\n return {\n data: Array.isArray(responseData) ? (responseData as T[]) : [],\n page: fallbackPage,\n page_size: fallbackPageSize,\n rows: Array.isArray(responseData) ? responseData.length : 0,\n extras: {},\n }\n}\n\nexport function createAxiosDataProvider(axios: AxiosInstance): DataProvider {\n return {\n async list<T = Record<string, unknown>>(\n endpoint: string,\n params: DataProviderListParams = {},\n ): Promise<DataProviderListResponse<T>> {\n const response = await axios.get(endpoint, { params })\n return normalizeListResponse<T>(\n response.data,\n Number(params.page ?? 1),\n Number(params.page_size ?? 20),\n )\n },\n\n async get<T = Record<string, unknown>>(\n endpoint: string,\n id: string | number,\n config?: DataProviderRequestConfig,\n ): Promise<DataProviderResponse<T>> {\n const response = await axios.get<T>(`${endpoint}${id}/`, config)\n return { data: response.data }\n },\n\n async create<T = Record<string, unknown>>(\n endpoint: string,\n payload: Record<string, unknown> | FormData,\n config?: DataProviderRequestConfig,\n ): Promise<DataProviderResponse<T>> {\n const response = await axios.post<T>(endpoint, payload, config)\n return { data: response.data }\n },\n\n async update<T = Record<string, unknown>>(\n endpoint: string,\n id: string | number,\n payload: Record<string, unknown> | FormData,\n config?: DataProviderRequestConfig,\n ): Promise<DataProviderResponse<T>> {\n const response = await axios.patch<T>(`${endpoint}${id}/`, payload, config)\n return { data: response.data }\n },\n\n async delete(endpoint: string, id: string | number): Promise<void> {\n await axios.delete(`${endpoint}${id}/`)\n },\n }\n}\n","import type { App, Plugin } from 'vue'\nimport type { WPluginOptions, WPluginConfig } from './types/plugin'\nimport { W_AXIOS_KEY, W_CONFIG_KEY, W_DATA_PROVIDER_KEY } from './types/plugin'\nimport {\n WCrudView,\n WCrudFormDialog,\n WCrudColumnRenderer,\n WAutoCompleteFK,\n WMoneyInput,\n WTransferList,\n WTreeSelect,\n} from './components'\nimport { createAxiosDataProvider } from './data-providers/axiosDataProvider'\n\nexport const WPrimeVuePlugin: Plugin = {\n install(app: App, options: WPluginOptions) {\n if (!options?.axios && !options?.dataProvider) {\n throw new Error(\n '[wPrimeVueComponents] Informe \"axios\" ou \"dataProvider\" ao registrar o WPrimeVuePlugin.',\n )\n }\n\n const dataProvider = options.dataProvider ?? createAxiosDataProvider(options.axios!)\n\n const config: WPluginConfig = {\n axios: options.axios,\n dataProvider,\n defaultPageSize: options.defaultPageSize ?? 20,\n dateFormat: options.dateFormat ?? 'DD/MM/YYYY',\n dateTimeFormat: options.dateTimeFormat ?? 'DD/MM/YYYY HH:mm',\n locale: options.locale ?? 'pt-BR',\n currency: options.currency ?? 'BRL',\n }\n\n if (options.axios) {\n app.provide(W_AXIOS_KEY, options.axios)\n }\n app.provide(W_DATA_PROVIDER_KEY, dataProvider)\n app.provide(W_CONFIG_KEY, config)\n\n if (options.registerComponents !== false) {\n app.component('WCrudView', WCrudView)\n app.component('WCrudFormDialog', WCrudFormDialog)\n app.component('WCrudColumnRenderer', WCrudColumnRenderer)\n app.component('WAutoCompleteFK', WAutoCompleteFK)\n app.component('WMoneyInput', WMoneyInput)\n app.component('WTransferList', WTransferList)\n app.component('WTreeSelect', WTreeSelect)\n }\n },\n}\n","import type {\n DataProvider,\n DataProviderListParams,\n DataProviderListResponse,\n DataProviderRequestConfig,\n DataProviderResponse,\n} from '@/types/dataProvider'\n\ntype SupabaseResult<T> = {\n data: T | null\n error: {\n message: string\n code?: string\n details?: string\n hint?: string\n } | null\n count?: number | null\n}\n\ntype SupabaseFilterBuilder<T> = PromiseLike<SupabaseResult<T>> & {\n select(\n columns?: string,\n options?: { count?: 'exact' | 'planned' | 'estimated' },\n ): SupabaseFilterBuilder<T>\n eq(column: string, value: unknown): SupabaseFilterBuilder<T>\n ilike(column: string, pattern: string): SupabaseFilterBuilder<T>\n or(filters: string): SupabaseFilterBuilder<T>\n order(column: string, options?: { ascending?: boolean }): SupabaseFilterBuilder<T>\n range(from: number, to: number): SupabaseFilterBuilder<T>\n single(): Promise<SupabaseResult<T>>\n}\n\ntype SupabaseTable = {\n select<T = unknown>(\n columns?: string,\n options?: { count?: 'exact' | 'planned' | 'estimated' },\n ): SupabaseFilterBuilder<T>\n insert<T = unknown>(payload: unknown): SupabaseFilterBuilder<T>\n update<T = unknown>(payload: unknown): SupabaseFilterBuilder<T>\n delete<T = unknown>(): SupabaseFilterBuilder<T>\n}\n\nexport interface SupabaseDataProviderClient {\n from(table: string): SupabaseTable\n}\n\nexport interface SupabaseResourceConfig {\n table: string\n pk?: string\n select?: string\n searchFields?: string[]\n defaultOrdering?: string\n defaultFilters?: Record<string, unknown>\n softDelete?: boolean | Record<string, unknown>\n mapListItem?: (item: Record<string, unknown>) => Record<string, unknown>\n mapPayload?: (\n payload: Record<string, unknown>,\n operation: 'create' | 'update',\n ) => Record<string, unknown>\n}\n\nexport interface CreateSupabaseDataProviderOptions {\n client: SupabaseDataProviderClient\n resources?: Record<string, SupabaseResourceConfig | string>\n defaultSelect?: string\n allowedTables?: string[]\n}\n\nfunction normalizeEndpoint(endpoint: string): string {\n return endpoint\n .split('?')[0]\n .replace(/^\\/+|\\/+$/g, '')\n .replace(/^api\\/v\\d+\\//, '')\n}\n\nfunction toResourceConfig(resource: SupabaseResourceConfig | string): SupabaseResourceConfig {\n return typeof resource === 'string' ? { table: resource } : resource\n}\n\nfunction createProviderError(message: string, status = 400) {\n return {\n response: {\n status,\n data: { detail: message },\n },\n message,\n }\n}\n\nfunction assertPlainPayload(payload: Record<string, unknown> | FormData): Record<string, unknown> {\n if (payload instanceof FormData) {\n throw createProviderError(\n 'SupabaseDataProvider nao envia FormData diretamente. Faça upload do arquivo no Storage e envie a URL/caminho no payload.',\n )\n }\n\n return payload\n}\n\nfunction normalizeSupabaseError(error: SupabaseResult<unknown>['error']): never {\n throw {\n response: {\n data: {\n detail: error?.message ?? 'Erro ao consultar Supabase',\n code: error?.code,\n details: error?.details,\n hint: error?.hint,\n },\n },\n message: error?.message ?? 'Erro ao consultar Supabase',\n }\n}\n\nfunction resolveResource(\n endpoint: string,\n options: CreateSupabaseDataProviderOptions,\n): SupabaseResourceConfig {\n const resourceName = normalizeEndpoint(endpoint)\n const configuredResource = options.resources?.[resourceName]\n\n if (configuredResource) {\n return toResourceConfig(configuredResource)\n }\n\n if (options.allowedTables?.includes(resourceName)) {\n return { table: resourceName }\n }\n\n throw createProviderError(`Recurso Supabase nao registrado para o endpoint \"${endpoint}\".`, 404)\n}\n\nfunction applyFilters<T>(\n query: SupabaseFilterBuilder<T>,\n params: DataProviderListParams,\n resource: SupabaseResourceConfig,\n): SupabaseFilterBuilder<T> {\n const reservedKeys = new Set(['page', 'page_size', 'search', 'ordering'])\n const filters = { ...resource.defaultFilters, ...params }\n\n for (const [key, value] of Object.entries(filters)) {\n if (reservedKeys.has(key) || value === null || value === undefined || value === '') {\n continue\n }\n query = query.eq(key, value)\n }\n\n return query\n}\n\nfunction applySearch<T>(\n query: SupabaseFilterBuilder<T>,\n search: unknown,\n searchFields?: string[],\n): SupabaseFilterBuilder<T> {\n if (typeof search !== 'string' || !search.trim() || !searchFields?.length) {\n return query\n }\n\n const escapedSearch = search.trim().replace(/,/g, '\\\\,')\n const expression = searchFields.map((field) => `${field}.ilike.%${escapedSearch}%`).join(',')\n\n return query.or(expression)\n}\n\nfunction parseOrdering(ordering: unknown, fallback?: string) {\n const value = typeof ordering === 'string' && ordering ? ordering : fallback\n if (!value) return null\n\n return {\n field: value.startsWith('-') ? value.slice(1) : value,\n ascending: !value.startsWith('-'),\n }\n}\n\nfunction mapList<T>(data: T[] | null, resource: SupabaseResourceConfig): T[] {\n if (!data) return []\n if (!resource.mapListItem) return data\n\n return data.map((item) => resource.mapListItem?.(item as Record<string, unknown>)) as T[]\n}\n\nexport function createSupabaseDataProvider(\n options: CreateSupabaseDataProviderOptions,\n): DataProvider {\n const defaultSelect = options.defaultSelect ?? '*'\n\n return {\n async list<T = Record<string, unknown>>(\n endpoint: string,\n params: DataProviderListParams = {},\n ): Promise<DataProviderListResponse<T>> {\n const resource = resolveResource(endpoint, options)\n const page = Math.max(Number(params.page ?? 1), 1)\n const pageSize = Math.max(Number(params.page_size ?? 20), 1)\n const from = (page - 1) * pageSize\n const to = from + pageSize - 1\n\n let query = options.client\n .from(resource.table)\n .select<T[]>(resource.select ?? defaultSelect, { count: 'exact' })\n\n query = applyFilters(query, params, resource)\n query = applySearch(query, params.search, resource.searchFields)\n\n const ordering = parseOrdering(params.ordering, resource.defaultOrdering)\n if (ordering) {\n query = query.order(ordering.field, { ascending: ordering.ascending })\n }\n\n const result = await query.range(from, to)\n if (result.error) normalizeSupabaseError(result.error)\n\n return {\n data: mapList(result.data, resource),\n page,\n page_size: pageSize,\n rows: result.count ?? result.data?.length ?? 0,\n extras: {},\n }\n },\n\n async get<T = Record<string, unknown>>(\n endpoint: string,\n id: string | number,\n _config?: DataProviderRequestConfig,\n ): Promise<DataProviderResponse<T>> {\n const resource = resolveResource(endpoint, options)\n const pk = resource.pk ?? 'id'\n const result = await options.client\n .from(resource.table)\n .select<T>(resource.select ?? defaultSelect)\n .eq(pk, id)\n .single()\n\n if (result.error) normalizeSupabaseError(result.error)\n return { data: result.data as T }\n },\n\n async create<T = Record<string, unknown>>(\n endpoint: string,\n payload: Record<string, unknown> | FormData,\n _config?: DataProviderRequestConfig,\n ): Promise<DataProviderResponse<T>> {\n const resource = resolveResource(endpoint, options)\n const plainPayload = assertPlainPayload(payload)\n const mappedPayload = resource.mapPayload\n ? resource.mapPayload(plainPayload, 'create')\n : plainPayload\n const result = await options.client\n .from(resource.table)\n .insert<T>(mappedPayload)\n .select(resource.select ?? defaultSelect)\n .single()\n\n if (result.error) normalizeSupabaseError(result.error)\n return { data: result.data as T }\n },\n\n async update<T = Record<string, unknown>>(\n endpoint: string,\n id: string | number,\n payload: Record<string, unknown> | FormData,\n _config?: DataProviderRequestConfig,\n ): Promise<DataProviderResponse<T>> {\n const resource = resolveResource(endpoint, options)\n const pk = resource.pk ?? 'id'\n const plainPayload = assertPlainPayload(payload)\n const mappedPayload = resource.mapPayload\n ? resource.mapPayload(plainPayload, 'update')\n : plainPayload\n const result = await options.client\n .from(resource.table)\n .update<T>(mappedPayload)\n .eq(pk, id)\n .select(resource.select ?? defaultSelect)\n .single()\n\n if (result.error) normalizeSupabaseError(result.error)\n return { data: result.data as T }\n },\n\n async delete(endpoint: string, id: string | number): Promise<void> {\n const resource = resolveResource(endpoint, options)\n const pk = resource.pk ?? 'id'\n const softDeletePayload =\n resource.softDelete === true\n ? { is_active: false }\n : typeof resource.softDelete === 'object'\n ? resource.softDelete\n : null\n\n const result = softDeletePayload\n ? await options.client.from(resource.table).update(softDeletePayload).eq(pk, id)\n : await options.client.from(resource.table).delete().eq(pk, id)\n\n if (result.error) normalizeSupabaseError(result.error)\n },\n }\n}\n"],"names":["normalizeListResponse","responseData","fallbackPage","fallbackPageSize","data","createAxiosDataProvider","axios","endpoint","params","response","id","config","payload","WPrimeVuePlugin","app","options","dataProvider","W_AXIOS_KEY","W_DATA_PROVIDER_KEY","W_CONFIG_KEY","WCrudView","WCrudFormDialog","WCrudColumnRenderer","WAutoCompleteFK","WMoneyInput","WTransferList","WTreeSelect","normalizeEndpoint","toResourceConfig","resource","createProviderError","message","status","assertPlainPayload","normalizeSupabaseError","error","resolveResource","resourceName","configuredResource","_a","_b","applyFilters","query","reservedKeys","filters","key","value","applySearch","search","searchFields","escapedSearch","expression","field","parseOrdering","ordering","fallback","mapList","item","createSupabaseDataProvider","defaultSelect","page","pageSize","from","to","result","_config","pk","plainPayload","mappedPayload","softDeletePayload"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../src/data-providers/axiosDataProvider.ts","../src/plugin.ts","../src/data-providers/supabaseDataProvider.ts"],"sourcesContent":["import type { AxiosInstance } from 'axios'\nimport type {\n DataProvider,\n DataProviderListParams,\n DataProviderListResponse,\n DataProviderRequestConfig,\n DataProviderResponse,\n} from '@/types/dataProvider'\n\nfunction normalizeListResponse<T>(\n responseData: unknown,\n fallbackPage: number,\n fallbackPageSize: number,\n): DataProviderListResponse<T> {\n const data = responseData as Record<string, unknown>\n\n if (Array.isArray(data.results)) {\n return {\n data: data.results as T[],\n page: (data.page as number) ?? fallbackPage,\n page_size: (data.page_size as number) ?? fallbackPageSize,\n rows: (data.count as number) ?? 0,\n extras: (data.extras as Record<string, unknown>) ?? {},\n }\n }\n\n if (Array.isArray(data.data)) {\n return {\n data: data.data as T[],\n page: (data.page as number) ?? fallbackPage,\n page_size: (data.page_size as number) ?? fallbackPageSize,\n rows: (data.rows as number) ?? 0,\n extras: (data.extras as Record<string, unknown>) ?? {},\n }\n }\n\n return {\n data: Array.isArray(responseData) ? (responseData as T[]) : [],\n page: fallbackPage,\n page_size: fallbackPageSize,\n rows: Array.isArray(responseData) ? responseData.length : 0,\n extras: {},\n }\n}\n\nexport function createAxiosDataProvider(axios: AxiosInstance): DataProvider {\n return {\n async list<T = Record<string, unknown>>(\n endpoint: string,\n params: DataProviderListParams = {},\n ): Promise<DataProviderListResponse<T>> {\n const response = await axios.get(endpoint, { params })\n return normalizeListResponse<T>(\n response.data,\n Number(params.page ?? 1),\n Number(params.page_size ?? 20),\n )\n },\n\n async get<T = Record<string, unknown>>(\n endpoint: string,\n id: string | number,\n config?: DataProviderRequestConfig,\n ): Promise<DataProviderResponse<T>> {\n const response = await axios.get<T>(`${endpoint}${id}/`, config)\n return { data: response.data }\n },\n\n async create<T = Record<string, unknown>>(\n endpoint: string,\n payload: Record<string, unknown> | FormData,\n config?: DataProviderRequestConfig,\n ): Promise<DataProviderResponse<T>> {\n const response = await axios.post<T>(endpoint, payload, config)\n return { data: response.data }\n },\n\n async update<T = Record<string, unknown>>(\n endpoint: string,\n id: string | number,\n payload: Record<string, unknown> | FormData,\n config?: DataProviderRequestConfig,\n ): Promise<DataProviderResponse<T>> {\n const response = await axios.patch<T>(`${endpoint}${id}/`, payload, config)\n return { data: response.data }\n },\n\n async delete(endpoint: string, id: string | number): Promise<void> {\n await axios.delete(`${endpoint}${id}/`)\n },\n }\n}\n","import type { App, Plugin } from 'vue'\nimport type { WPluginOptions, WPluginConfig } from './types/plugin'\nimport { W_AXIOS_KEY, W_CONFIG_KEY, W_DATA_PROVIDER_KEY } from './types/plugin'\nimport {\n WCrudView,\n WCrudFormDialog,\n WCrudColumnRenderer,\n WAutoCompleteFK,\n WMoneyInput,\n WTransferList,\n WTreeSelect,\n} from './components'\nimport { createAxiosDataProvider } from './data-providers/axiosDataProvider'\n\nexport const WPrimeVuePlugin: Plugin = {\n install(app: App, options: WPluginOptions) {\n if (!options?.axios && !options?.dataProvider) {\n throw new Error(\n '[wPrimeVueComponents] Informe \"axios\" ou \"dataProvider\" ao registrar o WPrimeVuePlugin.',\n )\n }\n\n const dataProvider = options.dataProvider ?? createAxiosDataProvider(options.axios!)\n\n const config: WPluginConfig = {\n axios: options.axios,\n dataProvider,\n defaultPageSize: options.defaultPageSize ?? 20,\n dateFormat: options.dateFormat ?? 'DD/MM/YYYY',\n dateTimeFormat: options.dateTimeFormat ?? 'DD/MM/YYYY HH:mm',\n locale: options.locale ?? 'pt-BR',\n currency: options.currency ?? 'BRL',\n }\n\n if (options.axios) {\n app.provide(W_AXIOS_KEY, options.axios)\n }\n app.provide(W_DATA_PROVIDER_KEY, dataProvider)\n app.provide(W_CONFIG_KEY, config)\n\n if (options.registerComponents !== false) {\n app.component('WCrudView', WCrudView)\n app.component('WCrudFormDialog', WCrudFormDialog)\n app.component('WCrudColumnRenderer', WCrudColumnRenderer)\n app.component('WAutoCompleteFK', WAutoCompleteFK)\n app.component('WMoneyInput', WMoneyInput)\n app.component('WTransferList', WTransferList)\n app.component('WTreeSelect', WTreeSelect)\n }\n },\n}\n","import type {\n DataProvider,\n DataProviderListParams,\n DataProviderListResponse,\n DataProviderRequestConfig,\n DataProviderResponse,\n} from '@/types/dataProvider'\n\ntype SupabaseResult<T> = {\n data: T | null\n error: {\n message: string\n code?: string\n details?: string\n hint?: string\n } | null\n count?: number | null\n}\n\ntype SupabaseFilterBuilder<T> = PromiseLike<SupabaseResult<T>> & {\n select(\n columns?: string,\n options?: { count?: 'exact' | 'planned' | 'estimated' },\n ): SupabaseFilterBuilder<T>\n eq(column: string, value: unknown): SupabaseFilterBuilder<T>\n ilike(column: string, pattern: string): SupabaseFilterBuilder<T>\n or(filters: string): SupabaseFilterBuilder<T>\n order(column: string, options?: { ascending?: boolean }): SupabaseFilterBuilder<T>\n range(from: number, to: number): SupabaseFilterBuilder<T>\n single(): Promise<SupabaseResult<T>>\n}\n\ntype SupabaseTable = {\n select<T = unknown>(\n columns?: string,\n options?: { count?: 'exact' | 'planned' | 'estimated' },\n ): SupabaseFilterBuilder<T>\n insert<T = unknown>(payload: unknown): SupabaseFilterBuilder<T>\n update<T = unknown>(payload: unknown): SupabaseFilterBuilder<T>\n delete<T = unknown>(): SupabaseFilterBuilder<T>\n}\n\nexport interface SupabaseDataProviderClient {\n from(table: string): SupabaseTable\n}\n\nexport interface SupabaseResourceConfig {\n table: string\n pk?: string\n select?: string\n searchFields?: string[]\n defaultOrdering?: string\n defaultFilters?: Record<string, unknown>\n softDelete?: boolean | Record<string, unknown>\n mapListItem?: (item: Record<string, unknown>) => Record<string, unknown>\n mapPayload?: (\n payload: Record<string, unknown>,\n operation: 'create' | 'update',\n ) => Record<string, unknown>\n}\n\nexport interface CreateSupabaseDataProviderOptions {\n client: SupabaseDataProviderClient\n resources?: Record<string, SupabaseResourceConfig | string>\n defaultSelect?: string\n allowedTables?: string[]\n}\n\nfunction normalizeEndpoint(endpoint: string): string {\n return endpoint\n .split('?')[0]\n .replace(/^\\/+|\\/+$/g, '')\n .replace(/^api\\/v\\d+\\//, '')\n}\n\nfunction toResourceConfig(resource: SupabaseResourceConfig | string): SupabaseResourceConfig {\n return typeof resource === 'string' ? { table: resource } : resource\n}\n\nfunction createProviderError(message: string, status = 400) {\n return {\n response: {\n status,\n data: { detail: message },\n },\n message,\n }\n}\n\nfunction assertPlainPayload(payload: Record<string, unknown> | FormData): Record<string, unknown> {\n if (payload instanceof FormData) {\n throw createProviderError(\n 'SupabaseDataProvider nao envia FormData diretamente. Faça upload do arquivo no Storage e envie a URL/caminho no payload.',\n )\n }\n\n return payload\n}\n\nfunction normalizeSupabaseError(error: SupabaseResult<unknown>['error']): never {\n throw {\n response: {\n data: {\n detail: error?.message ?? 'Erro ao consultar Supabase',\n code: error?.code,\n details: error?.details,\n hint: error?.hint,\n },\n },\n message: error?.message ?? 'Erro ao consultar Supabase',\n }\n}\n\nfunction resolveResource(\n endpoint: string,\n options: CreateSupabaseDataProviderOptions,\n): SupabaseResourceConfig {\n const resourceName = normalizeEndpoint(endpoint)\n const configuredResource = options.resources?.[resourceName]\n\n if (configuredResource) {\n return toResourceConfig(configuredResource)\n }\n\n if (options.allowedTables?.includes(resourceName)) {\n return { table: resourceName }\n }\n\n throw createProviderError(`Recurso Supabase nao registrado para o endpoint \"${endpoint}\".`, 404)\n}\n\nfunction applyFilters<T>(\n query: SupabaseFilterBuilder<T>,\n params: DataProviderListParams,\n resource: SupabaseResourceConfig,\n): SupabaseFilterBuilder<T> {\n const reservedKeys = new Set(['page', 'page_size', 'search', 'ordering'])\n const filters = { ...resource.defaultFilters, ...params }\n\n for (const [key, value] of Object.entries(filters)) {\n if (reservedKeys.has(key) || value === null || value === undefined || value === '') {\n continue\n }\n query = query.eq(key, value)\n }\n\n return query\n}\n\nfunction applySearch<T>(\n query: SupabaseFilterBuilder<T>,\n search: unknown,\n searchFields?: string[],\n): SupabaseFilterBuilder<T> {\n if (typeof search !== 'string' || !search.trim() || !searchFields?.length) {\n return query\n }\n\n const escapedSearch = search.trim().replace(/,/g, '\\\\,')\n const expression = searchFields.map((field) => `${field}.ilike.%${escapedSearch}%`).join(',')\n\n return query.or(expression)\n}\n\nfunction parseOrdering(ordering: unknown, fallback?: string) {\n const value = typeof ordering === 'string' && ordering ? ordering : fallback\n if (!value) return null\n\n return {\n field: value.startsWith('-') ? value.slice(1) : value,\n ascending: !value.startsWith('-'),\n }\n}\n\nfunction mapList<T>(data: T[] | null, resource: SupabaseResourceConfig): T[] {\n if (!data) return []\n if (!resource.mapListItem) return data\n\n return data.map((item) => resource.mapListItem?.(item as Record<string, unknown>)) as T[]\n}\n\nexport function createSupabaseDataProvider(\n options: CreateSupabaseDataProviderOptions,\n): DataProvider {\n const defaultSelect = options.defaultSelect ?? '*'\n\n return {\n async list<T = Record<string, unknown>>(\n endpoint: string,\n params: DataProviderListParams = {},\n ): Promise<DataProviderListResponse<T>> {\n const resource = resolveResource(endpoint, options)\n const page = Math.max(Number(params.page ?? 1), 1)\n const pageSize = Math.max(Number(params.page_size ?? 20), 1)\n const from = (page - 1) * pageSize\n const to = from + pageSize - 1\n\n let query = options.client\n .from(resource.table)\n .select<T[]>(resource.select ?? defaultSelect, { count: 'exact' })\n\n query = applyFilters(query, params, resource)\n query = applySearch(query, params.search, resource.searchFields)\n\n const ordering = parseOrdering(params.ordering, resource.defaultOrdering)\n if (ordering) {\n query = query.order(ordering.field, { ascending: ordering.ascending })\n }\n\n const result = await query.range(from, to)\n if (result.error) normalizeSupabaseError(result.error)\n\n return {\n data: mapList(result.data, resource),\n page,\n page_size: pageSize,\n rows: result.count ?? result.data?.length ?? 0,\n extras: {},\n }\n },\n\n async get<T = Record<string, unknown>>(\n endpoint: string,\n id: string | number,\n _config?: DataProviderRequestConfig,\n ): Promise<DataProviderResponse<T>> {\n const resource = resolveResource(endpoint, options)\n const pk = resource.pk ?? 'id'\n const result = await options.client\n .from(resource.table)\n .select<T>(resource.select ?? defaultSelect)\n .eq(pk, id)\n .single()\n\n if (result.error) normalizeSupabaseError(result.error)\n return { data: result.data as T }\n },\n\n async create<T = Record<string, unknown>>(\n endpoint: string,\n payload: Record<string, unknown> | FormData,\n _config?: DataProviderRequestConfig,\n ): Promise<DataProviderResponse<T>> {\n const resource = resolveResource(endpoint, options)\n const plainPayload = assertPlainPayload(payload)\n const mappedPayload = resource.mapPayload\n ? resource.mapPayload(plainPayload, 'create')\n : plainPayload\n const result = await options.client\n .from(resource.table)\n .insert<T>(mappedPayload)\n .select(resource.select ?? defaultSelect)\n .single()\n\n if (result.error) normalizeSupabaseError(result.error)\n return { data: result.data as T }\n },\n\n async update<T = Record<string, unknown>>(\n endpoint: string,\n id: string | number,\n payload: Record<string, unknown> | FormData,\n _config?: DataProviderRequestConfig,\n ): Promise<DataProviderResponse<T>> {\n const resource = resolveResource(endpoint, options)\n const pk = resource.pk ?? 'id'\n const plainPayload = assertPlainPayload(payload)\n const mappedPayload = resource.mapPayload\n ? resource.mapPayload(plainPayload, 'update')\n : plainPayload\n const result = await options.client\n .from(resource.table)\n .update<T>(mappedPayload)\n .eq(pk, id)\n .select(resource.select ?? defaultSelect)\n .single()\n\n if (result.error) normalizeSupabaseError(result.error)\n return { data: result.data as T }\n },\n\n async delete(endpoint: string, id: string | number): Promise<void> {\n const resource = resolveResource(endpoint, options)\n const pk = resource.pk ?? 'id'\n const softDeletePayload =\n resource.softDelete === true\n ? { is_active: false }\n : typeof resource.softDelete === 'object'\n ? resource.softDelete\n : null\n\n const result = softDeletePayload\n ? await options.client.from(resource.table).update(softDeletePayload).eq(pk, id)\n : await options.client.from(resource.table).delete().eq(pk, id)\n\n if (result.error) normalizeSupabaseError(result.error)\n },\n }\n}\n"],"names":["normalizeListResponse","responseData","fallbackPage","fallbackPageSize","data","createAxiosDataProvider","axios","endpoint","params","response","id","config","payload","WPrimeVuePlugin","app","options","dataProvider","W_AXIOS_KEY","W_DATA_PROVIDER_KEY","W_CONFIG_KEY","WCrudView","WCrudFormDialog","WCrudColumnRenderer","WAutoCompleteFK","WMoneyInput","WTransferList","WTreeSelect","normalizeEndpoint","toResourceConfig","resource","createProviderError","message","status","assertPlainPayload","normalizeSupabaseError","error","resolveResource","resourceName","configuredResource","_a","_b","applyFilters","query","reservedKeys","filters","key","value","applySearch","search","searchFields","escapedSearch","expression","field","parseOrdering","ordering","fallback","mapList","item","createSupabaseDataProvider","defaultSelect","page","pageSize","from","to","result","_config","pk","plainPayload","mappedPayload","softDeletePayload"],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ const e = {
2
+ createTitle: "Novo Registro",
3
+ editTitle: "Editar Registro",
4
+ createButton: "Novo",
5
+ saveButton: "Salvar",
6
+ updateButton: "Atualizar",
7
+ cancelButton: "Cancelar",
8
+ deleteConfirmTitle: "Confirmar Exclusão",
9
+ deleteConfirmMessage: "Deseja realmente excluir este registro?",
10
+ searchPlaceholder: "Buscar...",
11
+ emptyMessage: "Nenhum registro encontrado",
12
+ successCreate: "Registro criado com sucesso",
13
+ successUpdate: "Registro atualizado com sucesso",
14
+ successDelete: "Registro excluído com sucesso"
15
+ };
16
+ export {
17
+ e as D
18
+ };
19
+ //# sourceMappingURL=labels-B28P8JNB.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"labels-B28P8JNB.js","sources":["../src/types/labels.ts"],"sourcesContent":["// ---------------------------------------------------------------------------\n// Labels\n// ---------------------------------------------------------------------------\n\nexport interface CrudLabels {\n createTitle: string\n editTitle: string\n viewTitle?: string\n createButton: string\n saveButton: string\n updateButton: string\n cancelButton: string\n deleteConfirmTitle: string\n deleteConfirmMessage: string\n searchPlaceholder: string\n emptyMessage: string\n successCreate: string\n successUpdate: string\n successDelete: string\n}\n\nexport const DEFAULT_CRUD_LABELS: CrudLabels = {\n createTitle: 'Novo Registro',\n editTitle: 'Editar Registro',\n createButton: 'Novo',\n saveButton: 'Salvar',\n updateButton: 'Atualizar',\n cancelButton: 'Cancelar',\n deleteConfirmTitle: 'Confirmar Exclusão',\n deleteConfirmMessage: 'Deseja realmente excluir este registro?',\n searchPlaceholder: 'Buscar...',\n emptyMessage: 'Nenhum registro encontrado',\n successCreate: 'Registro criado com sucesso',\n successUpdate: 'Registro atualizado com sucesso',\n successDelete: 'Registro excluído com sucesso',\n}\n"],"names":["DEFAULT_CRUD_LABELS"],"mappings":"AAqBO,MAAMA,IAAkC;AAAA,EAC7C,aAAa;AAAA,EACb,WAAW;AAAA,EACX,cAAc;AAAA,EACd,YAAY;AAAA,EACZ,cAAc;AAAA,EACd,cAAc;AAAA,EACd,oBAAoB;AAAA,EACpB,sBAAsB;AAAA,EACtB,mBAAmB;AAAA,EACnB,cAAc;AAAA,EACd,eAAe;AAAA,EACf,eAAe;AAAA,EACf,eAAe;AACjB;"}
@@ -0,0 +1,2 @@
1
+ "use strict";const e={createTitle:"Novo Registro",editTitle:"Editar Registro",createButton:"Novo",saveButton:"Salvar",updateButton:"Atualizar",cancelButton:"Cancelar",deleteConfirmTitle:"Confirmar Exclusão",deleteConfirmMessage:"Deseja realmente excluir este registro?",searchPlaceholder:"Buscar...",emptyMessage:"Nenhum registro encontrado",successCreate:"Registro criado com sucesso",successUpdate:"Registro atualizado com sucesso",successDelete:"Registro excluído com sucesso"};exports.DEFAULT_CRUD_LABELS=e;
2
+ //# sourceMappingURL=labels-pNskxXcl.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"labels-pNskxXcl.cjs","sources":["../src/types/labels.ts"],"sourcesContent":["// ---------------------------------------------------------------------------\n// Labels\n// ---------------------------------------------------------------------------\n\nexport interface CrudLabels {\n createTitle: string\n editTitle: string\n viewTitle?: string\n createButton: string\n saveButton: string\n updateButton: string\n cancelButton: string\n deleteConfirmTitle: string\n deleteConfirmMessage: string\n searchPlaceholder: string\n emptyMessage: string\n successCreate: string\n successUpdate: string\n successDelete: string\n}\n\nexport const DEFAULT_CRUD_LABELS: CrudLabels = {\n createTitle: 'Novo Registro',\n editTitle: 'Editar Registro',\n createButton: 'Novo',\n saveButton: 'Salvar',\n updateButton: 'Atualizar',\n cancelButton: 'Cancelar',\n deleteConfirmTitle: 'Confirmar Exclusão',\n deleteConfirmMessage: 'Deseja realmente excluir este registro?',\n searchPlaceholder: 'Buscar...',\n emptyMessage: 'Nenhum registro encontrado',\n successCreate: 'Registro criado com sucesso',\n successUpdate: 'Registro atualizado com sucesso',\n successDelete: 'Registro excluído com sucesso',\n}\n"],"names":["DEFAULT_CRUD_LABELS"],"mappings":"aAqBO,MAAMA,EAAkC,CAC7C,YAAa,gBACb,UAAW,kBACX,aAAc,OACd,WAAY,SACZ,aAAc,YACd,aAAc,WACd,mBAAoB,qBACpB,qBAAsB,0CACtB,kBAAmB,YACnB,aAAc,6BACd,cAAe,8BACf,cAAe,kCACf,cAAe,+BACjB"}
@@ -0,0 +1,14 @@
1
+ import { inject as o } from "vue";
2
+ const s = Symbol("w-tab-host");
3
+ function a() {
4
+ return o(s, null);
5
+ }
6
+ const n = Symbol("w-axios"), _ = Symbol("w-data-provider"), c = Symbol("w-config");
7
+ export {
8
+ n as W,
9
+ c as a,
10
+ _ as b,
11
+ s as c,
12
+ a as u
13
+ };
14
+ //# sourceMappingURL=plugin-CIBvOgwG.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin-CIBvOgwG.js","sources":["../src/types/routeTabs.ts","../src/types/plugin.ts"],"sourcesContent":["import { inject, type Component, type InjectionKey, type Ref } from 'vue'\nimport type { RouteLocationNormalizedLoaded, Router } from 'vue-router'\n\n/**\n * Navegação por abas (estilo browser/ERP): cada rota vira uma aba viva, com\n * fechar/recarregar e estado preservado ao alternar. O estado mora no\n * composable `useRouteTabs`; `WTabNav` (barra) e `WTabViewport` (painéis)\n * apenas o recebem via prop — nenhum componente guarda estado global.\n */\n\n/** Meta de apresentação de uma aba, resolvida a partir da rota. */\nexport interface RouteTabMeta {\n title: string\n /** Ícone PrimeIcons (ex.: 'pi pi-file'). */\n icon?: string\n /** `false` esconde o X e ignora fechar (ex.: dashboard fixo). */\n closable?: boolean\n /**\n * Grupo da aba (ex.: o módulo do menu — \"Sementes\", \"Estoque\"). Abas do\n * mesmo grupo ficam juntas na barra, com o rótulo do grupo antes do bloco.\n */\n group?: string\n}\n\n/** Uma aba aberta. `key` identifica (path com params); `fullPath` navega. */\nexport interface RouteTab {\n key: string\n /** Último fullPath visitado (query inclusa) — usado no push e no restore. */\n fullPath: string\n title: string\n icon?: string\n closable: boolean\n /** Grupo (módulo) da aba — abas do mesmo grupo ficam contíguas na barra. */\n group?: string\n /**\n * `false` = aba restaurada do storage, ainda sem componente montado.\n * Hidrata na primeira ativação (o router resolve o lazy no caminho).\n */\n hydrated: boolean\n /** Contador de remontagem: `reload()` incrementa e o pane troca o `:key`. */\n remount: number\n}\n\n/**\n * Lado não serializável de uma aba hidratada — componente resolvido, snapshot\n * de rota e os registros feitos pela tela via `useTabHost`. Consumido pelo\n * WTabViewport; não persiste.\n */\nexport interface RouteTabRuntime {\n component: Component | null\n props: Record<string, unknown>\n /**\n * Snapshot reativo da rota, provido ao pane sob a `routeLocationKey` do\n * vue-router: `useRoute()` da tela enxerga ESTA rota, congelada — só é\n * atualizada quando a aba é a ativa. É o que impede um pane oculto de\n * reagir à navegação global (o bug clássico de sistemas de abas).\n */\n route: RouteLocationNormalizedLoaded\n closeGuards: Array<() => boolean | Promise<boolean>>\n activatedHooks: Array<() => void>\n deactivatedHooks: Array<() => void>\n /** Título default da rota, para `setTitle(null)` restaurar. */\n defaultTitle: string\n}\n\nexport interface UseRouteTabsOptions {\n router: Router\n /**\n * Modo de uso — o parâmetro que define o que é \"uma aba\":\n * - `'screen'` (default): cada tela é uma aba. Identidade = `route.path`\n * (params contam, query não): NF 123 e NF 456 são abas distintas.\n * - `'module'`: uma aba por entrada de menu. Identidade = `moduleRoot(route)`;\n * navegar entre telas do mesmo módulo acontece DENTRO da aba (a view\n * remonta, título/ícone voltam aos da rota nova e os close guards valem\n * também nessa troca).\n */\n mode?: 'screen' | 'module'\n /**\n * Raiz do módulo da rota (ex.: path da listagem) — identidade da aba no modo\n * `'module'`. Obrigatório nesse modo; retornar falsy cai em `route.path`.\n */\n moduleRoot?: (route: RouteLocationNormalizedLoaded) => string | null | undefined\n /** Título/ícone/closable da aba. O que faltar cai em defaults sensatos. */\n resolveTabMeta?: (route: RouteLocationNormalizedLoaded) => Partial<RouteTabMeta>\n /** Quais rotas viram aba. Default: todas. */\n isTabRoute?: (route: RouteLocationNormalizedLoaded) => boolean\n /** Onde persistir. Default: `localStorage`; `null` desliga a persistência. */\n storage?: Storage | null\n /** Chave no storage. Função permite chave por usuário avaliada tarde. */\n storageKey?: string | (() => string)\n /** Destino ao fechar a última aba. Default: `/`. */\n homePath?: string\n /** Acima disso, a aba mais antiga não-ativa é fechada (guards respeitados). */\n maxTabs?: number\n}\n\nexport interface RouteTabsApi {\n tabs: Ref<RouteTab[]>\n activeKey: Ref<string | null>\n /** Ativa a aba (navega para o fullPath dela). */\n activate: (key: string) => Promise<void>\n /** Fecha respeitando os close guards da aba. `false` = algum guard vetou. */\n close: (key: string) => Promise<boolean>\n closeOthers: (key: string) => Promise<void>\n closeAll: () => Promise<void>\n /** Remonta o componente da aba (o estado da tela é descartado). */\n reload: (key: string) => void\n /** Título dinâmico (\"NF 000123\"). `null` volta ao título default da rota. */\n setTitle: (key: string, title: string | null | undefined) => void\n /** A rota já tem aba hidratada? (ex.: para pular overlay de navegação). */\n isLive: (target: RouteLocationNormalizedLoaded | string) => boolean\n /** Runtime interno da aba. Uso do WTabViewport; não persiste. */\n runtime: (key: string) => RouteTabRuntime | undefined\n}\n\n/**\n * Contexto que o pane fornece à tela (e aos dialogs dela). Injete com\n * `useTabHost()` — fora de abas retorna `null` e tudo degrada para o\n * comportamento padrão (dialog no body, título no breadcrumb etc.).\n */\nexport interface TabHostContext {\n /** Container do pane — alvo de `appendTo` para o dialog viver NA aba. */\n hostEl: Ref<HTMLElement | null>\n active: Ref<boolean>\n /** Título dinâmico da aba; `null` restaura o default da rota. */\n setTitle: (title: string | null | undefined) => void\n /** Chamado ao voltar para a aba (equivalente a onActivated). */\n onTabActivated: (fn: () => void) => void\n /** Chamado ao sair da aba (equivalente a onDeactivated). */\n onTabDeactivated: (fn: () => void) => void\n /** Veta o fechar da aba (ex.: alterações não salvas). `false` = não fecha. */\n registerCloseGuard: (guard: () => boolean | Promise<boolean>) => void\n}\n\nexport const W_TAB_HOST_KEY: InjectionKey<TabHostContext> = Symbol('w-tab-host')\n\n/** Contexto da aba que envolve o componente atual, ou `null` fora de abas. */\nexport function useTabHost(): TabHostContext | null {\n return inject(W_TAB_HOST_KEY, null)\n}\n","import type { AxiosInstance } from 'axios'\nimport type { DataProvider } from './dataProvider'\n\nexport interface WPluginOptions {\n axios?: AxiosInstance\n dataProvider?: DataProvider\n defaultPageSize?: number\n dateFormat?: string\n dateTimeFormat?: string\n locale?: string\n currency?: string\n registerComponents?: boolean\n}\n\nexport interface WPluginConfig {\n axios?: AxiosInstance\n dataProvider: DataProvider\n defaultPageSize: number\n dateFormat: string\n dateTimeFormat: string\n locale: string\n currency: string\n}\n\nexport const W_AXIOS_KEY = Symbol('w-axios')\nexport const W_DATA_PROVIDER_KEY = Symbol('w-data-provider')\nexport const W_CONFIG_KEY = Symbol('w-config')\n"],"names":["W_TAB_HOST_KEY","useTabHost","inject","W_AXIOS_KEY","W_DATA_PROVIDER_KEY","W_CONFIG_KEY"],"mappings":";AAsIO,MAAMA,IAA+C,OAAO,YAAY;AAGxE,SAASC,IAAoC;AAClD,SAAOC,EAAOF,GAAgB,IAAI;AACpC;ACnHO,MAAMG,IAAc,OAAO,SAAS,GAC9BC,IAAsB,OAAO,iBAAiB,GAC9CC,IAAe,OAAO,UAAU;"}
@@ -0,0 +1,2 @@
1
+ "use strict";const o=require("vue"),_=Symbol("w-tab-host");function t(){return o.inject(_,null)}const s=Symbol("w-axios"),n=Symbol("w-data-provider"),E=Symbol("w-config");exports.W_AXIOS_KEY=s;exports.W_CONFIG_KEY=E;exports.W_DATA_PROVIDER_KEY=n;exports.W_TAB_HOST_KEY=_;exports.useTabHost=t;
2
+ //# sourceMappingURL=plugin-D2IZHyBm.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin-D2IZHyBm.cjs","sources":["../src/types/routeTabs.ts","../src/types/plugin.ts"],"sourcesContent":["import { inject, type Component, type InjectionKey, type Ref } from 'vue'\nimport type { RouteLocationNormalizedLoaded, Router } from 'vue-router'\n\n/**\n * Navegação por abas (estilo browser/ERP): cada rota vira uma aba viva, com\n * fechar/recarregar e estado preservado ao alternar. O estado mora no\n * composable `useRouteTabs`; `WTabNav` (barra) e `WTabViewport` (painéis)\n * apenas o recebem via prop — nenhum componente guarda estado global.\n */\n\n/** Meta de apresentação de uma aba, resolvida a partir da rota. */\nexport interface RouteTabMeta {\n title: string\n /** Ícone PrimeIcons (ex.: 'pi pi-file'). */\n icon?: string\n /** `false` esconde o X e ignora fechar (ex.: dashboard fixo). */\n closable?: boolean\n /**\n * Grupo da aba (ex.: o módulo do menu — \"Sementes\", \"Estoque\"). Abas do\n * mesmo grupo ficam juntas na barra, com o rótulo do grupo antes do bloco.\n */\n group?: string\n}\n\n/** Uma aba aberta. `key` identifica (path com params); `fullPath` navega. */\nexport interface RouteTab {\n key: string\n /** Último fullPath visitado (query inclusa) — usado no push e no restore. */\n fullPath: string\n title: string\n icon?: string\n closable: boolean\n /** Grupo (módulo) da aba — abas do mesmo grupo ficam contíguas na barra. */\n group?: string\n /**\n * `false` = aba restaurada do storage, ainda sem componente montado.\n * Hidrata na primeira ativação (o router resolve o lazy no caminho).\n */\n hydrated: boolean\n /** Contador de remontagem: `reload()` incrementa e o pane troca o `:key`. */\n remount: number\n}\n\n/**\n * Lado não serializável de uma aba hidratada — componente resolvido, snapshot\n * de rota e os registros feitos pela tela via `useTabHost`. Consumido pelo\n * WTabViewport; não persiste.\n */\nexport interface RouteTabRuntime {\n component: Component | null\n props: Record<string, unknown>\n /**\n * Snapshot reativo da rota, provido ao pane sob a `routeLocationKey` do\n * vue-router: `useRoute()` da tela enxerga ESTA rota, congelada — só é\n * atualizada quando a aba é a ativa. É o que impede um pane oculto de\n * reagir à navegação global (o bug clássico de sistemas de abas).\n */\n route: RouteLocationNormalizedLoaded\n closeGuards: Array<() => boolean | Promise<boolean>>\n activatedHooks: Array<() => void>\n deactivatedHooks: Array<() => void>\n /** Título default da rota, para `setTitle(null)` restaurar. */\n defaultTitle: string\n}\n\nexport interface UseRouteTabsOptions {\n router: Router\n /**\n * Modo de uso — o parâmetro que define o que é \"uma aba\":\n * - `'screen'` (default): cada tela é uma aba. Identidade = `route.path`\n * (params contam, query não): NF 123 e NF 456 são abas distintas.\n * - `'module'`: uma aba por entrada de menu. Identidade = `moduleRoot(route)`;\n * navegar entre telas do mesmo módulo acontece DENTRO da aba (a view\n * remonta, título/ícone voltam aos da rota nova e os close guards valem\n * também nessa troca).\n */\n mode?: 'screen' | 'module'\n /**\n * Raiz do módulo da rota (ex.: path da listagem) — identidade da aba no modo\n * `'module'`. Obrigatório nesse modo; retornar falsy cai em `route.path`.\n */\n moduleRoot?: (route: RouteLocationNormalizedLoaded) => string | null | undefined\n /** Título/ícone/closable da aba. O que faltar cai em defaults sensatos. */\n resolveTabMeta?: (route: RouteLocationNormalizedLoaded) => Partial<RouteTabMeta>\n /** Quais rotas viram aba. Default: todas. */\n isTabRoute?: (route: RouteLocationNormalizedLoaded) => boolean\n /** Onde persistir. Default: `localStorage`; `null` desliga a persistência. */\n storage?: Storage | null\n /** Chave no storage. Função permite chave por usuário avaliada tarde. */\n storageKey?: string | (() => string)\n /** Destino ao fechar a última aba. Default: `/`. */\n homePath?: string\n /** Acima disso, a aba mais antiga não-ativa é fechada (guards respeitados). */\n maxTabs?: number\n}\n\nexport interface RouteTabsApi {\n tabs: Ref<RouteTab[]>\n activeKey: Ref<string | null>\n /** Ativa a aba (navega para o fullPath dela). */\n activate: (key: string) => Promise<void>\n /** Fecha respeitando os close guards da aba. `false` = algum guard vetou. */\n close: (key: string) => Promise<boolean>\n closeOthers: (key: string) => Promise<void>\n closeAll: () => Promise<void>\n /** Remonta o componente da aba (o estado da tela é descartado). */\n reload: (key: string) => void\n /** Título dinâmico (\"NF 000123\"). `null` volta ao título default da rota. */\n setTitle: (key: string, title: string | null | undefined) => void\n /** A rota já tem aba hidratada? (ex.: para pular overlay de navegação). */\n isLive: (target: RouteLocationNormalizedLoaded | string) => boolean\n /** Runtime interno da aba. Uso do WTabViewport; não persiste. */\n runtime: (key: string) => RouteTabRuntime | undefined\n}\n\n/**\n * Contexto que o pane fornece à tela (e aos dialogs dela). Injete com\n * `useTabHost()` — fora de abas retorna `null` e tudo degrada para o\n * comportamento padrão (dialog no body, título no breadcrumb etc.).\n */\nexport interface TabHostContext {\n /** Container do pane — alvo de `appendTo` para o dialog viver NA aba. */\n hostEl: Ref<HTMLElement | null>\n active: Ref<boolean>\n /** Título dinâmico da aba; `null` restaura o default da rota. */\n setTitle: (title: string | null | undefined) => void\n /** Chamado ao voltar para a aba (equivalente a onActivated). */\n onTabActivated: (fn: () => void) => void\n /** Chamado ao sair da aba (equivalente a onDeactivated). */\n onTabDeactivated: (fn: () => void) => void\n /** Veta o fechar da aba (ex.: alterações não salvas). `false` = não fecha. */\n registerCloseGuard: (guard: () => boolean | Promise<boolean>) => void\n}\n\nexport const W_TAB_HOST_KEY: InjectionKey<TabHostContext> = Symbol('w-tab-host')\n\n/** Contexto da aba que envolve o componente atual, ou `null` fora de abas. */\nexport function useTabHost(): TabHostContext | null {\n return inject(W_TAB_HOST_KEY, null)\n}\n","import type { AxiosInstance } from 'axios'\nimport type { DataProvider } from './dataProvider'\n\nexport interface WPluginOptions {\n axios?: AxiosInstance\n dataProvider?: DataProvider\n defaultPageSize?: number\n dateFormat?: string\n dateTimeFormat?: string\n locale?: string\n currency?: string\n registerComponents?: boolean\n}\n\nexport interface WPluginConfig {\n axios?: AxiosInstance\n dataProvider: DataProvider\n defaultPageSize: number\n dateFormat: string\n dateTimeFormat: string\n locale: string\n currency: string\n}\n\nexport const W_AXIOS_KEY = Symbol('w-axios')\nexport const W_DATA_PROVIDER_KEY = Symbol('w-data-provider')\nexport const W_CONFIG_KEY = Symbol('w-config')\n"],"names":["W_TAB_HOST_KEY","useTabHost","inject","W_AXIOS_KEY","W_DATA_PROVIDER_KEY","W_CONFIG_KEY"],"mappings":"oCAsIaA,EAA+C,OAAO,YAAY,EAGxE,SAASC,GAAoC,CAClD,OAAOC,EAAAA,OAAOF,EAAgB,IAAI,CACpC,CCnHO,MAAMG,EAAc,OAAO,SAAS,EAC9BC,EAAsB,OAAO,iBAAiB,EAC9CC,EAAe,OAAO,UAAU"}