@wgalleti/primevue-components 0.32.1 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components-BT3HHG7W.cjs +25 -0
- package/dist/components-BT3HHG7W.cjs.map +1 -0
- package/dist/{components-SHgQLpCj.js → components-BVJTg_MO.js} +613 -646
- package/dist/components-BVJTg_MO.js.map +1 -0
- package/dist/components.cjs +1 -1
- package/dist/components.js +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.js +58 -22
- package/dist/index.js.map +1 -1
- package/dist/primevue-components.css +1 -1
- package/dist/routeTabs-BnVpnSeJ.cjs.map +1 -1
- package/dist/routeTabs-D6m8PuP6.js.map +1 -1
- package/dist/types/plugin.d.ts +5 -0
- package/dist/utils/chart.d.ts +3 -2
- package/dist/utils/dialogEscapeStack.d.ts +14 -0
- package/dist/utils/markdownEnhance.d.ts +2 -0
- package/package.json +7 -3
- package/skill/SKILL.md +2 -0
- package/dist/components-CwXJtumP.cjs +0 -25
- package/dist/components-CwXJtumP.cjs.map +0 -1
- package/dist/components-SHgQLpCj.js.map +0 -1
package/dist/components.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./components-
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./components-BT3HHG7W.cjs");exports.WActionBar=e.h,exports.WAutoCompleteFK=e.K,exports.WChart=e.O,exports.WCheckList=e.u,exports.WCrudColumnRenderer=e.Z,exports.WCrudFormDialog=e.B,exports.WCrudSubview=e.F,exports.WCrudView=e.L,exports.WDatePicker=e.G,exports.WDateRange=e.P,exports.WDetailHeader=e.w,exports.WDialog=e.a,exports.WEditableTable=e.I,exports.WEmptyState=e.T,exports.WFileUpload=e.N,exports.WFormRenderer=e.V,exports.WFormSection=e.g,exports.WImageCropper=e.U,exports.WInfoCard=e.C,exports.WKanbanBoard=e.t,exports.WKpiCard=e.S,exports.WKpiGrid=e.x,exports.WMapSelect=e.l,exports.WMarkdownEditor=e.s,exports.WMarkdownToc=e.o,exports.WMarkdownView=e.c,exports.WMoneyInput=e.W,exports.WPageHeader=e.E,exports.WProgressFlow=e.m,exports.WSectionAccordion=e.y,exports.WSectionHeader=e.v,exports.WSectionPanel=e._,exports.WStatusTag=e.D,exports.WStepFlow=e.f,exports.WStepSection=e.d,exports.WTabBar=e.i,exports.WTabNav=e.r,exports.WTabViewport=e.n,exports.WTransferList=e.H,exports.WTreeSelect=e.M;
|
package/dist/components.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { B as e, C as t, D as n, E as r, F as i, G as a, H as o, I as s, K as c, L as l, M as u, N as d, O as f, P as p, S as m, T as h, U as g, V as _, W as v, Z as y, _ as b, a as x, c as S, d as C, f as w, g as T, h as E, i as D, l as O, m as k, n as A, o as j, r as M, s as N, t as P, u as F, v as I, w as L, x as R, y as z } from "./components-
|
|
1
|
+
import { B as e, C as t, D as n, E as r, F as i, G as a, H as o, I as s, K as c, L as l, M as u, N as d, O as f, P as p, S as m, T as h, U as g, V as _, W as v, Z as y, _ as b, a as x, c as S, d as C, f as w, g as T, h as E, i as D, l as O, m as k, n as A, o as j, r as M, s as N, t as P, u as F, v as I, w as L, x as R, y as z } from "./components-BVJTg_MO.js";
|
|
2
2
|
export { E as WActionBar, c as WAutoCompleteFK, f as WChart, F as WCheckList, y as WCrudColumnRenderer, e as WCrudFormDialog, i as WCrudSubview, l as WCrudView, a as WDatePicker, p as WDateRange, L as WDetailHeader, x as WDialog, s as WEditableTable, h as WEmptyState, d as WFileUpload, _ as WFormRenderer, T as WFormSection, g as WImageCropper, t as WInfoCard, P as WKanbanBoard, m as WKpiCard, R as WKpiGrid, O as WMapSelect, N as WMarkdownEditor, j as WMarkdownToc, S as WMarkdownView, v as WMoneyInput, r as WPageHeader, k as WProgressFlow, z as WSectionAccordion, I as WSectionHeader, b as WSectionPanel, n as WStatusTag, w as WStepFlow, C as WStepSection, D as WTabBar, M as WTabNav, A as WTabViewport, o as WTransferList, u as WTreeSelect };
|
package/dist/index.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./useFormKeyboardNav-CzKY9ZV2.cjs"),t=require("./routeTabs-BnVpnSeJ.cjs"),n=require("./components-
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./useFormKeyboardNav-CzKY9ZV2.cjs"),t=require("./routeTabs-BnVpnSeJ.cjs"),n=require("./components-BT3HHG7W.cjs"),r=require("./labels-DiFDhFhQ.cjs"),i=require("./composables-B3Czzje1.cjs");require("./types.cjs");let a=require("primevue/dialog");a=e.v(a,1);let o=require("primevue/drawer");o=e.v(o,1);function s(e,t,n){let r=e;return Array.isArray(r.results)?{data:r.results,page:r.page??t,page_size:r.page_size??n,rows:r.count??0,extras:r.extras??{}}:Array.isArray(r.data)?{data:r.data,page:r.page??t,page_size:r.page_size??n,rows:r.rows??0,extras:r.extras??{}}:{data:Array.isArray(e)?e:[],page:t,page_size:n,rows:Array.isArray(e)?e.length:0,extras:{}}}function c(e){return{async list(t,n={}){return s((await e.get(t,{params:n})).data,Number(n.page??1),Number(n.page_size??20))},async get(t,n,r){return{data:(await e.get(`${t}${n}/`,r)).data}},async create(t,n,r){return{data:(await e.post(t,n,r)).data}},async update(t,n,r,i){return{data:(await e.patch(`${t}${n}/`,r,i)).data}},async delete(t,n){await e.delete(`${t}${n}/`)}}}var l=`[data-pc-name="dialog"], [data-pc-name="drawer"]`,u=Symbol(`w-escape-stack`);function d(e){for(let t=e;t;t=t.parentElement)if(t.hidden||getComputedStyle(t).display===`none`)return!1;return!0}function f(e){let t=Number.parseInt(getComputedStyle(e.parentElement??e).zIndex,10);return Number.isNaN(t)?0:t}function p(){return Array.from(document.querySelectorAll(l)).filter(d)}function m(e){if(!e)return!0;let t=p();if(!t.includes(e))return!1;if(t.length===1)return!0;let n=t[0];for(let e of t)f(e)>=f(n)&&(n=e);return n===e}function h(e,t){let n=e.methods,r=n?.[t];if(!n||!r||r[u])return;let i=function(e){e.code===`Escape`&&!m(this.container)||r.call(this,e)};i[u]=!0,n[t]=i}function g(){typeof document>`u`||(h(a.default,`onKeyDown`),h(o.default,`onKeydown`))}var _={install(e,r){if(!r?.axios&&!r?.dataProvider)throw Error(`[wPrimeVueComponents] Informe "axios" ou "dataProvider" ao registrar o WPrimeVuePlugin.`);let i=r.dataProvider??c(r.axios),a={axios:r.axios,dataProvider:i,defaultPageSize:r.defaultPageSize??20,dateFormat:r.dateFormat??`DD/MM/YYYY`,dateTimeFormat:r.dateTimeFormat??`DD/MM/YYYY HH:mm`,locale:r.locale??`pt-BR`,currency:r.currency??`BRL`};r.axios&&e.provide(t.r,r.axios),e.provide(t.a,i),e.provide(t.i,a),r.patchDialogEscape!==!1&&g(),r.registerComponents!==!1&&(e.component(`WCrudView`,n.L),e.component(`WCrudFormDialog`,n.B),e.component(`WCrudColumnRenderer`,n.Z),e.component(`WAutoCompleteFK`,n.K),e.component(`WMoneyInput`,n.W),e.component(`WTransferList`,n.H),e.component(`WTreeSelect`,n.M))}};function v(e){return e.split(`?`)[0].replace(/^\/+|\/+$/g,``).replace(/^api\/v\d+\//,``)}function y(e){return typeof e==`string`?{table:e}:e}function b(e,t=400){return{response:{status:t,data:{detail:e}},message:e}}function x(e){if(e instanceof FormData)throw b(`SupabaseDataProvider nao envia FormData diretamente. Faça upload do arquivo no Storage e envie a URL/caminho no payload.`);return e}function S(e){throw{response:{data:{detail:e?.message??`Erro ao consultar Supabase`,code:e?.code,details:e?.details,hint:e?.hint}},message:e?.message??`Erro ao consultar Supabase`}}function C(e,t){let n=v(e),r=t.resources?.[n];if(r)return y(r);if(t.allowedTables?.includes(n))return{table:n};throw b(`Recurso Supabase nao registrado para o endpoint "${e}".`,404)}function w(e,t,n){let r=new Set([`page`,`page_size`,`search`,`ordering`]),i={...n.defaultFilters,...t};for(let[t,n]of Object.entries(i))r.has(t)||n==null||n===``||(e=e.eq(t,n));return e}function T(e,t,n){if(typeof t!=`string`||!t.trim()||!n?.length)return e;let r=t.trim().replace(/,/g,`\\,`),i=n.map(e=>`${e}.ilike.%${r}%`).join(`,`);return e.or(i)}function E(e,t){let n=typeof e==`string`&&e?e:t;return n?{field:n.startsWith(`-`)?n.slice(1):n,ascending:!n.startsWith(`-`)}:null}function D(e,t){return e?t.mapListItem?e.map(e=>t.mapListItem?.(e)):e:[]}function O(e){let t=e.defaultSelect??`*`;return{async list(n,r={}){let i=C(n,e),a=Math.max(Number(r.page??1),1),o=Math.max(Number(r.page_size??20),1),s=(a-1)*o,c=s+o-1,l=e.client.from(i.table).select(i.select??t,{count:`exact`});l=w(l,r,i),l=T(l,r.search,i.searchFields);let u=E(r.ordering,i.defaultOrdering);u&&(l=l.order(u.field,{ascending:u.ascending}));let d=await l.range(s,c);return d.error&&S(d.error),{data:D(d.data,i),page:a,page_size:o,rows:d.count??d.data?.length??0,extras:{}}},async get(n,r,i){let a=C(n,e),o=a.pk??`id`,s=await e.client.from(a.table).select(a.select??t).eq(o,r).single();return s.error&&S(s.error),{data:s.data}},async create(n,r,i){let a=C(n,e),o=x(r),s=a.mapPayload?a.mapPayload(o,`create`):o,c=await e.client.from(a.table).insert(s).select(a.select??t).single();return c.error&&S(c.error),{data:c.data}},async update(n,r,i,a){let o=C(n,e),s=o.pk??`id`,c=x(i),l=o.mapPayload?o.mapPayload(c,`update`):c,u=await e.client.from(o.table).update(l).eq(s,r).select(o.select??t).single();return u.error&&S(u.error),{data:u.data}},async delete(t,n){let r=C(t,e),i=r.pk??`id`,a=r.softDelete===!0?{is_active:!1}:typeof r.softDelete==`object`?r.softDelete:null,o=a?await e.client.from(r.table).update(a).eq(i,n):await e.client.from(r.table).delete().eq(i,n);o.error&&S(o.error)}}}exports.BREAKPOINTS=e.g,exports.DEFAULT_CRUD_LABELS=r.t,exports.WActionBar=n.h,exports.WAutoCompleteFK=n.K,exports.WChart=n.O,exports.WCheckList=n.u,exports.WCrudColumnRenderer=n.Z,exports.WCrudFormDialog=n.B,exports.WCrudSubview=n.F,exports.WCrudView=n.L,exports.WDatePicker=n.G,exports.WDateRange=n.P,exports.WDetailHeader=n.w,exports.WDialog=n.a,exports.WEditableTable=n.I,exports.WEmptyState=n.T,exports.WFileUpload=n.N,exports.WFormRenderer=n.V,exports.WFormSection=n.g,exports.WImageCropper=n.U,exports.WInfoCard=n.C,exports.WKanbanBoard=n.t,exports.WKpiCard=n.S,exports.WKpiGrid=n.x,exports.WMapSelect=n.l,exports.WMarkdownEditor=n.s,exports.WMarkdownToc=n.o,exports.WMarkdownView=n.c,exports.WMoneyInput=n.W,exports.WPageHeader=n.E,exports.WPrimeVuePlugin=_,exports.WProgressFlow=n.m,exports.WSectionAccordion=n.y,exports.WSectionHeader=n.v,exports.WSectionPanel=n._,exports.WStatusTag=n.D,exports.WStepFlow=n.f,exports.WStepSection=n.d,exports.WTabBar=n.i,exports.WTabNav=n.r,exports.WTabViewport=n.n,exports.WTransferList=n.H,exports.WTreeSelect=n.M,exports.W_AXIOS_KEY=t.r,exports.W_CONFIG_KEY=t.i,exports.W_DATA_PROVIDER_KEY=t.a,exports.W_SECTION_ACCORDION_KEY=n.b,exports.W_STEP_FLOW_KEY=n.p,exports.W_TAB_HOST_KEY=t.t,exports.buildChartTheme=n.k,exports.buildPrintTheme=n.A,exports.createAxiosDataProvider=c,exports.createSupabaseDataProvider=O,exports.donutOption=n.j,exports.downloadCsv=n.R,exports.extractApiError=e.r,exports.isTopOverlay=m,exports.mapApiFieldToColumnDef=n.q,exports.mapApiFieldToFieldDef=n.J,exports.mapApiFieldsToColumnDefs=n.Y,exports.mapApiFieldsToFieldDefs=n.X,exports.patchDialogEscapeStack=g,exports.toCsv=n.z,exports.useApi=i.n,exports.useApiError=e.i,exports.useAppConfirm=e.a,exports.useAppToast=e.o,exports.useBreakpoint=e._,exports.useCrudManager=i.a,exports.useDateInput=e.n,exports.useFormatters=e.f,exports.useRouteTabs=i.t,exports.useSubviewCrud=i.i,exports.useTabHost=t.n,exports.visibleOverlays=p;
|
|
2
2
|
//# sourceMappingURL=index.cjs.map
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":[],"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"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","names":[],"sources":["../src/data-providers/axiosDataProvider.ts","../src/utils/dialogEscapeStack.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 Dialog from 'primevue/dialog'\nimport Drawer from 'primevue/drawer'\n\n/**\n * Esc fecha todos os overlays empilhados (PrimeVue 4.x): cada `Dialog`/`Drawer`\n * aberto registra o próprio `keydown` no `document` e fecha no Escape sem checar\n * se é o do topo — com dois modais abertos (form do CRUD + FK inline, confirm\n * sobre dialog…), um Esc fecha os dois de uma vez.\n *\n * O patch envolve o handler de teclado do próprio componente: com mais de um\n * overlay visível, só o do topo (maior z-index da máscara; empate resolve pela\n * ordem no DOM) responde ao Esc — os demais ignoram e esperam a vez. Um overlay\n * só mantém o comportamento nativo intacto.\n *\n * Roda uma vez, no `install()` do plugin, antes de qualquer instância ser\n * criada (o Vue liga os `methods` na instanciação). Corrigido no PrimeVue 5;\n * ao migrar, remover.\n */\n\nconst OVERLAY_SELECTOR = '[data-pc-name=\"dialog\"], [data-pc-name=\"drawer\"]'\nconst PATCHED = Symbol('w-escape-stack')\n\ntype OverlayVm = { container?: HTMLElement | null }\ntype KeyHandler = ((this: OverlayVm, event: KeyboardEvent) => void) & { [PATCHED]?: true }\ntype OverlayComponent = { methods?: Record<string, KeyHandler> }\n\nfunction isVisible(el: HTMLElement): boolean {\n for (let node: HTMLElement | null = el; node; node = node.parentElement) {\n if (node.hidden || getComputedStyle(node).display === 'none') return false\n }\n return true\n}\n\nfunction zIndexOf(container: HTMLElement): number {\n // A máscara (pai do container) recebe o z-index incremental do ZIndex utils.\n const z = Number.parseInt(getComputedStyle(container.parentElement ?? container).zIndex, 10)\n return Number.isNaN(z) ? 0 : z\n}\n\n/** Overlays do PrimeVue visíveis no momento (dialogs em abas ocultas ficam fora). */\nexport function visibleOverlays(): HTMLElement[] {\n return Array.from(document.querySelectorAll<HTMLElement>(OVERLAY_SELECTOR)).filter(isVisible)\n}\n\n/**\n * `true` quando `container` é o overlay visível do topo. Sem `container`\n * (instância sem DOM) segue o nativo; um overlay oculto (aba inativa) nunca\n * é topo — o Esc é de quem está na tela.\n */\nexport function isTopOverlay(container: HTMLElement | null | undefined): boolean {\n if (!container) return true\n const abertos = visibleOverlays()\n if (!abertos.includes(container)) return false\n if (abertos.length === 1) return true\n let topo = abertos[0]\n for (const el of abertos) {\n if (zIndexOf(el) >= zIndexOf(topo)) topo = el\n }\n return topo === container\n}\n\nfunction wrapEscape(component: unknown, method: string): void {\n const methods = (component as OverlayComponent).methods\n const original = methods?.[method]\n if (!methods || !original || original[PATCHED]) return\n const patched: KeyHandler = function (this: OverlayVm, event: KeyboardEvent) {\n if (event.code === 'Escape' && !isTopOverlay(this.container)) return\n original.call(this, event)\n }\n patched[PATCHED] = true\n methods[method] = patched\n}\n\n/**\n * Aplica o patch em `Dialog` e `Drawer` do PrimeVue (idempotente). O plugin\n * chama por padrão; exposto para quem registra com `patchDialogEscape: false`\n * e quer aplicar por conta própria, ou para apps sem o plugin.\n */\nexport function patchDialogEscapeStack(): void {\n if (typeof document === 'undefined') return\n wrapEscape(Dialog, 'onKeyDown')\n wrapEscape(Drawer, 'onKeydown')\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'\nimport { patchDialogEscapeStack } from './utils/dialogEscapeStack'\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.patchDialogEscape !== false) {\n patchDialogEscapeStack()\n }\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"],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -18,4 +18,5 @@ export type { ChartTheme, DonutOptionInput, WChartOption } from './utils/chart';
|
|
|
18
18
|
export { buildChartTheme, buildPrintTheme, donutOption } from './utils/chart';
|
|
19
19
|
export type { ToCsvOptions } from './utils/csv';
|
|
20
20
|
export { toCsv, downloadCsv } from './utils/csv';
|
|
21
|
+
export { patchDialogEscapeStack, isTopOverlay, visibleOverlays } from './utils/dialogEscapeStack';
|
|
21
22
|
export type { TreeSelectId, TreeSelectOption, TreeSelectNode, TreeSelectionKeys, TreeSelectionState, } from './utils/treeSelect';
|
package/dist/index.js
CHANGED
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
import { _ as e, a as t, f as n, g as r, i, n as a, o, r as s } from "./useFormKeyboardNav-DuxPdAeK.js";
|
|
2
2
|
import { a as c, i as l, n as u, r as d, t as ee } from "./routeTabs-D6m8PuP6.js";
|
|
3
|
-
import { A as te, B as f, C as
|
|
4
|
-
import { t as
|
|
5
|
-
import { a as
|
|
3
|
+
import { A as te, B as f, C as ne, D as re, E as ie, F as ae, G as oe, H as p, I as m, J as h, K as g, L as _, M as v, N as se, O as ce, P as le, R as ue, S as de, T as fe, U as y, V as b, W as x, X as S, Y as C, Z as w, _ as T, a as E, b as D, c as O, d as k, f as A, g as j, h as M, i as N, j as P, k as F, l as I, m as L, n as R, o as z, p as B, q as V, r as H, s as pe, t as me, u as he, v as ge, w as _e, x as ve, y as ye, z as be } from "./components-BVJTg_MO.js";
|
|
4
|
+
import { t as xe } from "./labels-CXBhCk2N.js";
|
|
5
|
+
import { a as Se, i as Ce, n as we, t as Te } from "./composables-wG25Sz-z.js";
|
|
6
6
|
import "./types.js";
|
|
7
|
+
import Ee from "primevue/dialog";
|
|
8
|
+
import De from "primevue/drawer";
|
|
7
9
|
//#region src/data-providers/axiosDataProvider.ts
|
|
8
|
-
function
|
|
10
|
+
function Oe(e, t, n) {
|
|
9
11
|
let r = e;
|
|
10
12
|
return Array.isArray(r.results) ? {
|
|
11
13
|
data: r.results,
|
|
@@ -27,10 +29,10 @@ function be(e, t, n) {
|
|
|
27
29
|
extras: {}
|
|
28
30
|
};
|
|
29
31
|
}
|
|
30
|
-
function
|
|
32
|
+
function U(e) {
|
|
31
33
|
return {
|
|
32
34
|
async list(t, n = {}) {
|
|
33
|
-
return
|
|
35
|
+
return Oe((await e.get(t, { params: n })).data, Number(n.page ?? 1), Number(n.page_size ?? 20));
|
|
34
36
|
},
|
|
35
37
|
async get(t, n, r) {
|
|
36
38
|
return { data: (await e.get(`${t}${n}/`, r)).data };
|
|
@@ -47,10 +49,44 @@ function Y(e) {
|
|
|
47
49
|
};
|
|
48
50
|
}
|
|
49
51
|
//#endregion
|
|
52
|
+
//#region src/utils/dialogEscapeStack.ts
|
|
53
|
+
var ke = "[data-pc-name=\"dialog\"], [data-pc-name=\"drawer\"]", W = Symbol("w-escape-stack");
|
|
54
|
+
function Ae(e) {
|
|
55
|
+
for (let t = e; t; t = t.parentElement) if (t.hidden || getComputedStyle(t).display === "none") return !1;
|
|
56
|
+
return !0;
|
|
57
|
+
}
|
|
58
|
+
function G(e) {
|
|
59
|
+
let t = Number.parseInt(getComputedStyle(e.parentElement ?? e).zIndex, 10);
|
|
60
|
+
return Number.isNaN(t) ? 0 : t;
|
|
61
|
+
}
|
|
62
|
+
function K() {
|
|
63
|
+
return Array.from(document.querySelectorAll(ke)).filter(Ae);
|
|
64
|
+
}
|
|
65
|
+
function q(e) {
|
|
66
|
+
if (!e) return !0;
|
|
67
|
+
let t = K();
|
|
68
|
+
if (!t.includes(e)) return !1;
|
|
69
|
+
if (t.length === 1) return !0;
|
|
70
|
+
let n = t[0];
|
|
71
|
+
for (let e of t) G(e) >= G(n) && (n = e);
|
|
72
|
+
return n === e;
|
|
73
|
+
}
|
|
74
|
+
function J(e, t) {
|
|
75
|
+
let n = e.methods, r = n?.[t];
|
|
76
|
+
if (!n || !r || r[W]) return;
|
|
77
|
+
let i = function(e) {
|
|
78
|
+
e.code === "Escape" && !q(this.container) || r.call(this, e);
|
|
79
|
+
};
|
|
80
|
+
i[W] = !0, n[t] = i;
|
|
81
|
+
}
|
|
82
|
+
function Y() {
|
|
83
|
+
typeof document > "u" || (J(Ee, "onKeyDown"), J(De, "onKeydown"));
|
|
84
|
+
}
|
|
85
|
+
//#endregion
|
|
50
86
|
//#region src/plugin.ts
|
|
51
|
-
var
|
|
87
|
+
var je = { install(e, t) {
|
|
52
88
|
if (!t?.axios && !t?.dataProvider) throw Error("[wPrimeVueComponents] Informe \"axios\" ou \"dataProvider\" ao registrar o WPrimeVuePlugin.");
|
|
53
|
-
let n = t.dataProvider ??
|
|
89
|
+
let n = t.dataProvider ?? U(t.axios), r = {
|
|
54
90
|
axios: t.axios,
|
|
55
91
|
dataProvider: n,
|
|
56
92
|
defaultPageSize: t.defaultPageSize ?? 20,
|
|
@@ -59,14 +95,14 @@ var xe = { install(e, t) {
|
|
|
59
95
|
locale: t.locale ?? "pt-BR",
|
|
60
96
|
currency: t.currency ?? "BRL"
|
|
61
97
|
};
|
|
62
|
-
t.axios && e.provide(d, t.axios), e.provide(c, n), e.provide(l, r), t.registerComponents !== !1 && (e.component("WCrudView",
|
|
98
|
+
t.axios && e.provide(d, t.axios), e.provide(c, n), e.provide(l, r), t.patchDialogEscape !== !1 && Y(), t.registerComponents !== !1 && (e.component("WCrudView", _), e.component("WCrudFormDialog", f), e.component("WCrudColumnRenderer", w), e.component("WAutoCompleteFK", g), e.component("WMoneyInput", x), e.component("WTransferList", p), e.component("WTreeSelect", v));
|
|
63
99
|
} };
|
|
64
100
|
//#endregion
|
|
65
101
|
//#region src/data-providers/supabaseDataProvider.ts
|
|
66
|
-
function
|
|
102
|
+
function Me(e) {
|
|
67
103
|
return e.split("?")[0].replace(/^\/+|\/+$/g, "").replace(/^api\/v\d+\//, "");
|
|
68
104
|
}
|
|
69
|
-
function
|
|
105
|
+
function Ne(e) {
|
|
70
106
|
return typeof e == "string" ? { table: e } : e;
|
|
71
107
|
}
|
|
72
108
|
function X(e, t = 400) {
|
|
@@ -94,12 +130,12 @@ function Q(e) {
|
|
|
94
130
|
};
|
|
95
131
|
}
|
|
96
132
|
function $(e, t) {
|
|
97
|
-
let n =
|
|
98
|
-
if (r) return
|
|
133
|
+
let n = Me(e), r = t.resources?.[n];
|
|
134
|
+
if (r) return Ne(r);
|
|
99
135
|
if (t.allowedTables?.includes(n)) return { table: n };
|
|
100
136
|
throw X(`Recurso Supabase nao registrado para o endpoint "${e}".`, 404);
|
|
101
137
|
}
|
|
102
|
-
function
|
|
138
|
+
function Pe(e, t, n) {
|
|
103
139
|
let r = /* @__PURE__ */ new Set([
|
|
104
140
|
"page",
|
|
105
141
|
"page_size",
|
|
@@ -112,32 +148,32 @@ function we(e, t, n) {
|
|
|
112
148
|
for (let [t, n] of Object.entries(i)) r.has(t) || n == null || n === "" || (e = e.eq(t, n));
|
|
113
149
|
return e;
|
|
114
150
|
}
|
|
115
|
-
function
|
|
151
|
+
function Fe(e, t, n) {
|
|
116
152
|
if (typeof t != "string" || !t.trim() || !n?.length) return e;
|
|
117
153
|
let r = t.trim().replace(/,/g, "\\,"), i = n.map((e) => `${e}.ilike.%${r}%`).join(",");
|
|
118
154
|
return e.or(i);
|
|
119
155
|
}
|
|
120
|
-
function
|
|
156
|
+
function Ie(e, t) {
|
|
121
157
|
let n = typeof e == "string" && e ? e : t;
|
|
122
158
|
return n ? {
|
|
123
159
|
field: n.startsWith("-") ? n.slice(1) : n,
|
|
124
160
|
ascending: !n.startsWith("-")
|
|
125
161
|
} : null;
|
|
126
162
|
}
|
|
127
|
-
function
|
|
163
|
+
function Le(e, t) {
|
|
128
164
|
return e ? t.mapListItem ? e.map((e) => t.mapListItem?.(e)) : e : [];
|
|
129
165
|
}
|
|
130
|
-
function
|
|
166
|
+
function Re(e) {
|
|
131
167
|
let t = e.defaultSelect ?? "*";
|
|
132
168
|
return {
|
|
133
169
|
async list(n, r = {}) {
|
|
134
170
|
let i = $(n, e), a = Math.max(Number(r.page ?? 1), 1), o = Math.max(Number(r.page_size ?? 20), 1), s = (a - 1) * o, c = s + o - 1, l = e.client.from(i.table).select(i.select ?? t, { count: "exact" });
|
|
135
|
-
l =
|
|
136
|
-
let u =
|
|
171
|
+
l = Pe(l, r, i), l = Fe(l, r.search, i.searchFields);
|
|
172
|
+
let u = Ie(r.ordering, i.defaultOrdering);
|
|
137
173
|
u && (l = l.order(u.field, { ascending: u.ascending }));
|
|
138
174
|
let d = await l.range(s, c);
|
|
139
175
|
return d.error && Q(d.error), {
|
|
140
|
-
data:
|
|
176
|
+
data: Le(d.data, i),
|
|
141
177
|
page: a,
|
|
142
178
|
page_size: o,
|
|
143
179
|
rows: d.count ?? d.data?.length ?? 0,
|
|
@@ -163,6 +199,6 @@ function Oe(e) {
|
|
|
163
199
|
};
|
|
164
200
|
}
|
|
165
201
|
//#endregion
|
|
166
|
-
export { r as BREAKPOINTS,
|
|
202
|
+
export { r as BREAKPOINTS, xe as DEFAULT_CRUD_LABELS, M as WActionBar, g as WAutoCompleteFK, ce as WChart, he as WCheckList, w as WCrudColumnRenderer, f as WCrudFormDialog, ae as WCrudSubview, _ as WCrudView, oe as WDatePicker, le as WDateRange, _e as WDetailHeader, E as WDialog, m as WEditableTable, fe as WEmptyState, se as WFileUpload, b as WFormRenderer, j as WFormSection, y as WImageCropper, ne as WInfoCard, me as WKanbanBoard, de as WKpiCard, ve as WKpiGrid, I as WMapSelect, pe as WMarkdownEditor, z as WMarkdownToc, O as WMarkdownView, x as WMoneyInput, ie as WPageHeader, je as WPrimeVuePlugin, L as WProgressFlow, ye as WSectionAccordion, ge as WSectionHeader, T as WSectionPanel, re as WStatusTag, A as WStepFlow, k as WStepSection, N as WTabBar, H as WTabNav, R as WTabViewport, p as WTransferList, v as WTreeSelect, d as W_AXIOS_KEY, l as W_CONFIG_KEY, c as W_DATA_PROVIDER_KEY, D as W_SECTION_ACCORDION_KEY, B as W_STEP_FLOW_KEY, ee as W_TAB_HOST_KEY, F as buildChartTheme, te as buildPrintTheme, U as createAxiosDataProvider, Re as createSupabaseDataProvider, P as donutOption, ue as downloadCsv, s as extractApiError, q as isTopOverlay, V as mapApiFieldToColumnDef, h as mapApiFieldToFieldDef, C as mapApiFieldsToColumnDefs, S as mapApiFieldsToFieldDefs, Y as patchDialogEscapeStack, be as toCsv, we as useApi, i as useApiError, t as useAppConfirm, o as useAppToast, e as useBreakpoint, Se as useCrudManager, a as useDateInput, n as useFormatters, Te as useRouteTabs, Ce as useSubviewCrud, u as useTabHost, K as visibleOverlays };
|
|
167
203
|
|
|
168
204
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"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"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../src/data-providers/axiosDataProvider.ts","../src/utils/dialogEscapeStack.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 Dialog from 'primevue/dialog'\nimport Drawer from 'primevue/drawer'\n\n/**\n * Esc fecha todos os overlays empilhados (PrimeVue 4.x): cada `Dialog`/`Drawer`\n * aberto registra o próprio `keydown` no `document` e fecha no Escape sem checar\n * se é o do topo — com dois modais abertos (form do CRUD + FK inline, confirm\n * sobre dialog…), um Esc fecha os dois de uma vez.\n *\n * O patch envolve o handler de teclado do próprio componente: com mais de um\n * overlay visível, só o do topo (maior z-index da máscara; empate resolve pela\n * ordem no DOM) responde ao Esc — os demais ignoram e esperam a vez. Um overlay\n * só mantém o comportamento nativo intacto.\n *\n * Roda uma vez, no `install()` do plugin, antes de qualquer instância ser\n * criada (o Vue liga os `methods` na instanciação). Corrigido no PrimeVue 5;\n * ao migrar, remover.\n */\n\nconst OVERLAY_SELECTOR = '[data-pc-name=\"dialog\"], [data-pc-name=\"drawer\"]'\nconst PATCHED = Symbol('w-escape-stack')\n\ntype OverlayVm = { container?: HTMLElement | null }\ntype KeyHandler = ((this: OverlayVm, event: KeyboardEvent) => void) & { [PATCHED]?: true }\ntype OverlayComponent = { methods?: Record<string, KeyHandler> }\n\nfunction isVisible(el: HTMLElement): boolean {\n for (let node: HTMLElement | null = el; node; node = node.parentElement) {\n if (node.hidden || getComputedStyle(node).display === 'none') return false\n }\n return true\n}\n\nfunction zIndexOf(container: HTMLElement): number {\n // A máscara (pai do container) recebe o z-index incremental do ZIndex utils.\n const z = Number.parseInt(getComputedStyle(container.parentElement ?? container).zIndex, 10)\n return Number.isNaN(z) ? 0 : z\n}\n\n/** Overlays do PrimeVue visíveis no momento (dialogs em abas ocultas ficam fora). */\nexport function visibleOverlays(): HTMLElement[] {\n return Array.from(document.querySelectorAll<HTMLElement>(OVERLAY_SELECTOR)).filter(isVisible)\n}\n\n/**\n * `true` quando `container` é o overlay visível do topo. Sem `container`\n * (instância sem DOM) segue o nativo; um overlay oculto (aba inativa) nunca\n * é topo — o Esc é de quem está na tela.\n */\nexport function isTopOverlay(container: HTMLElement | null | undefined): boolean {\n if (!container) return true\n const abertos = visibleOverlays()\n if (!abertos.includes(container)) return false\n if (abertos.length === 1) return true\n let topo = abertos[0]\n for (const el of abertos) {\n if (zIndexOf(el) >= zIndexOf(topo)) topo = el\n }\n return topo === container\n}\n\nfunction wrapEscape(component: unknown, method: string): void {\n const methods = (component as OverlayComponent).methods\n const original = methods?.[method]\n if (!methods || !original || original[PATCHED]) return\n const patched: KeyHandler = function (this: OverlayVm, event: KeyboardEvent) {\n if (event.code === 'Escape' && !isTopOverlay(this.container)) return\n original.call(this, event)\n }\n patched[PATCHED] = true\n methods[method] = patched\n}\n\n/**\n * Aplica o patch em `Dialog` e `Drawer` do PrimeVue (idempotente). O plugin\n * chama por padrão; exposto para quem registra com `patchDialogEscape: false`\n * e quer aplicar por conta própria, ou para apps sem o plugin.\n */\nexport function patchDialogEscapeStack(): void {\n if (typeof document === 'undefined') return\n wrapEscape(Dialog, 'onKeyDown')\n wrapEscape(Drawer, 'onKeydown')\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'\nimport { patchDialogEscapeStack } from './utils/dialogEscapeStack'\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.patchDialogEscape !== false) {\n patchDialogEscapeStack()\n }\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"],"mappings":";;;;;;;;;AASA,SAAS,GACP,GACA,GACA,GAC6B;CAC7B,IAAM,IAAO;CAsBb,OApBI,MAAM,QAAQ,EAAK,OAAO,IACrB;EACL,MAAM,EAAK;EACX,MAAO,EAAK,QAAmB;EAC/B,WAAY,EAAK,aAAwB;EACzC,MAAO,EAAK,SAAoB;EAChC,QAAS,EAAK,UAAsC,CAAC;CACvD,IAGE,MAAM,QAAQ,EAAK,IAAI,IAClB;EACL,MAAM,EAAK;EACX,MAAO,EAAK,QAAmB;EAC/B,WAAY,EAAK,aAAwB;EACzC,MAAO,EAAK,QAAmB;EAC/B,QAAS,EAAK,UAAsC,CAAC;CACvD,IAGK;EACL,MAAM,MAAM,QAAQ,CAAY,IAAK,IAAuB,CAAC;EAC7D,MAAM;EACN,WAAW;EACX,MAAM,MAAM,QAAQ,CAAY,IAAI,EAAa,SAAS;EAC1D,QAAQ,CAAC;CACX;AACF;AAEA,SAAgB,EAAwB,GAAoC;CAC1E,OAAO;EACL,MAAM,KACJ,GACA,IAAiC,CAAC,GACI;GAEtC,OAAO,IACL,MAFqB,EAAM,IAAI,GAAU,EAAE,UAAO,CAAC,EAAA,CAE1C,MACT,OAAO,EAAO,QAAQ,CAAC,GACvB,OAAO,EAAO,aAAa,EAAE,CAC/B;EACF;EAEA,MAAM,IACJ,GACA,GACA,GACkC;GAElC,OAAO,EAAE,OAAM,MADQ,EAAM,IAAO,GAAG,IAAW,EAAG,IAAI,CAAM,EAAA,CACvC,KAAK;EAC/B;EAEA,MAAM,OACJ,GACA,GACA,GACkC;GAElC,OAAO,EAAE,OAAM,MADQ,EAAM,KAAQ,GAAU,GAAS,CAAM,EAAA,CACtC,KAAK;EAC/B;EAEA,MAAM,OACJ,GACA,GACA,GACA,GACkC;GAElC,OAAO,EAAE,OAAM,MADQ,EAAM,MAAS,GAAG,IAAW,EAAG,IAAI,GAAS,CAAM,EAAA,CAClD,KAAK;EAC/B;EAEA,MAAM,OAAO,GAAkB,GAAoC;GACjE,MAAM,EAAM,OAAO,GAAG,IAAW,EAAG,EAAE;EACxC;CACF;AACF;;;ACxEA,IAAM,KAAmB,wDACnB,IAAU,OAAO,gBAAgB;AAMvC,SAAS,GAAU,GAA0B;CAC3C,KAAK,IAAI,IAA2B,GAAI,GAAM,IAAO,EAAK,eACxD,IAAI,EAAK,UAAU,iBAAiB,CAAI,CAAC,CAAC,YAAY,QAAQ,OAAO;CAEvE,OAAO;AACT;AAEA,SAAS,EAAS,GAAgC;CAEhD,IAAM,IAAI,OAAO,SAAS,iBAAiB,EAAU,iBAAiB,CAAS,CAAC,CAAC,QAAQ,EAAE;CAC3F,OAAO,OAAO,MAAM,CAAC,IAAI,IAAI;AAC/B;AAGA,SAAgB,IAAiC;CAC/C,OAAO,MAAM,KAAK,SAAS,iBAA8B,EAAgB,CAAC,CAAC,CAAC,OAAO,EAAS;AAC9F;AAOA,SAAgB,EAAa,GAAoD;CAC/E,IAAI,CAAC,GAAW,OAAO;CACvB,IAAM,IAAU,EAAgB;CAChC,IAAI,CAAC,EAAQ,SAAS,CAAS,GAAG,OAAO;CACzC,IAAI,EAAQ,WAAW,GAAG,OAAO;CACjC,IAAI,IAAO,EAAQ;CACnB,KAAK,IAAM,KAAM,GACf,AAAI,EAAS,CAAE,KAAK,EAAS,CAAI,MAAG,IAAO;CAE7C,OAAO,MAAS;AAClB;AAEA,SAAS,EAAW,GAAoB,GAAsB;CAC5D,IAAM,IAAW,EAA+B,SAC1C,IAAW,IAAU;CAC3B,IAAI,CAAC,KAAW,CAAC,KAAY,EAAS,IAAU;CAChD,IAAM,IAAsB,SAA2B,GAAsB;EACvE,EAAM,SAAS,YAAY,CAAC,EAAa,KAAK,SAAS,KAC3D,EAAS,KAAK,MAAM,CAAK;CAC3B;CAEA,AADA,EAAQ,KAAW,IACnB,EAAQ,KAAU;AACpB;AAOA,SAAgB,IAA+B;CACzC,OAAO,WAAa,QACxB,EAAW,IAAQ,WAAW,GAC9B,EAAW,IAAQ,WAAW;AAChC;;;ACnEA,IAAa,KAA0B,EACrC,QAAQ,GAAU,GAAyB;CACzC,IAAI,CAAC,GAAS,SAAS,CAAC,GAAS,cAC/B,MAAU,MACR,6FACF;CAGF,IAAM,IAAe,EAAQ,gBAAgB,EAAwB,EAAQ,KAAM,GAE7E,IAAwB;EAC5B,OAAO,EAAQ;EACf;EACA,iBAAiB,EAAQ,mBAAmB;EAC5C,YAAY,EAAQ,cAAc;EAClC,gBAAgB,EAAQ,kBAAkB;EAC1C,QAAQ,EAAQ,UAAU;EAC1B,UAAU,EAAQ,YAAY;CAChC;CAYA,AAVI,EAAQ,SACV,EAAI,QAAQ,GAAa,EAAQ,KAAK,GAExC,EAAI,QAAQ,GAAqB,CAAY,GAC7C,EAAI,QAAQ,GAAc,CAAM,GAE5B,EAAQ,sBAAsB,MAChC,EAAuB,GAGrB,EAAQ,uBAAuB,OACjC,EAAI,UAAU,aAAa,CAAS,GACpC,EAAI,UAAU,mBAAmB,CAAe,GAChD,EAAI,UAAU,uBAAuB,CAAmB,GACxD,EAAI,UAAU,mBAAmB,CAAe,GAChD,EAAI,UAAU,eAAe,CAAW,GACxC,EAAI,UAAU,iBAAiB,CAAa,GAC5C,EAAI,UAAU,eAAe,CAAW;AAE5C,EACF;;;ACaA,SAAS,GAAkB,GAA0B;CACnD,OAAO,EACJ,MAAM,GAAG,CAAC,CAAC,EAAE,CACb,QAAQ,cAAc,EAAE,CAAC,CACzB,QAAQ,gBAAgB,EAAE;AAC/B;AAEA,SAAS,GAAiB,GAAmE;CAC3F,OAAO,OAAO,KAAa,WAAW,EAAE,OAAO,EAAS,IAAI;AAC9D;AAEA,SAAS,EAAoB,GAAiB,IAAS,KAAK;CAC1D,OAAO;EACL,UAAU;GACR;GACA,MAAM,EAAE,QAAQ,EAAQ;EAC1B;EACA;CACF;AACF;AAEA,SAAS,EAAmB,GAAsE;CAChG,IAAI,aAAmB,UACrB,MAAM,EACJ,0HACF;CAGF,OAAO;AACT;AAEA,SAAS,EAAuB,GAAgD;CAC9E,MAAM;EACJ,UAAU,EACR,MAAM;GACJ,QAAQ,GAAO,WAAW;GAC1B,MAAM,GAAO;GACb,SAAS,GAAO;GAChB,MAAM,GAAO;EACf,EACF;EACA,SAAS,GAAO,WAAW;CAC7B;AACF;AAEA,SAAS,EACP,GACA,GACwB;CACxB,IAAM,IAAe,GAAkB,CAAQ,GACzC,IAAqB,EAAQ,YAAY;CAE/C,IAAI,GACF,OAAO,GAAiB,CAAkB;CAG5C,IAAI,EAAQ,eAAe,SAAS,CAAY,GAC9C,OAAO,EAAE,OAAO,EAAa;CAG/B,MAAM,EAAoB,oDAAoD,EAAS,KAAK,GAAG;AACjG;AAEA,SAAS,GACP,GACA,GACA,GAC0B;CAC1B,IAAM,oBAAe,IAAI,IAAI;EAAC;EAAQ;EAAa;EAAU;CAAU,CAAC,GAClE,IAAU;EAAE,GAAG,EAAS;EAAgB,GAAG;CAAO;CAExD,KAAK,IAAM,CAAC,GAAK,MAAU,OAAO,QAAQ,CAAO,GAC3C,EAAa,IAAI,CAAG,KAAK,KAAU,QAA+B,MAAU,OAGhF,IAAQ,EAAM,GAAG,GAAK,CAAK;CAG7B,OAAO;AACT;AAEA,SAAS,GACP,GACA,GACA,GAC0B;CAC1B,IAAI,OAAO,KAAW,YAAY,CAAC,EAAO,KAAK,KAAK,CAAC,GAAc,QACjE,OAAO;CAGT,IAAM,IAAgB,EAAO,KAAK,CAAC,CAAC,QAAQ,MAAM,KAAK,GACjD,IAAa,EAAa,KAAK,MAAU,GAAG,EAAM,UAAU,EAAc,EAAE,CAAC,CAAC,KAAK,GAAG;CAE5F,OAAO,EAAM,GAAG,CAAU;AAC5B;AAEA,SAAS,GAAc,GAAmB,GAAmB;CAC3D,IAAM,IAAQ,OAAO,KAAa,YAAY,IAAW,IAAW;CAGpE,OAFK,IAEE;EACL,OAAO,EAAM,WAAW,GAAG,IAAI,EAAM,MAAM,CAAC,IAAI;EAChD,WAAW,CAAC,EAAM,WAAW,GAAG;CAClC,IALmB;AAMrB;AAEA,SAAS,GAAW,GAAkB,GAAuC;CAI3E,OAHK,IACA,EAAS,cAEP,EAAK,KAAK,MAAS,EAAS,cAAc,CAA+B,CAAC,IAF/C,IADhB,CAAC;AAIrB;AAEA,SAAgB,GACd,GACc;CACd,IAAM,IAAgB,EAAQ,iBAAiB;CAE/C,OAAO;EACL,MAAM,KACJ,GACA,IAAiC,CAAC,GACI;GACtC,IAAM,IAAW,EAAgB,GAAU,CAAO,GAC5C,IAAO,KAAK,IAAI,OAAO,EAAO,QAAQ,CAAC,GAAG,CAAC,GAC3C,IAAW,KAAK,IAAI,OAAO,EAAO,aAAa,EAAE,GAAG,CAAC,GACrD,KAAQ,IAAO,KAAK,GACpB,IAAK,IAAO,IAAW,GAEzB,IAAQ,EAAQ,OACjB,KAAK,EAAS,KAAK,CAAC,CACpB,OAAY,EAAS,UAAU,GAAe,EAAE,OAAO,QAAQ,CAAC;GAGnE,AADA,IAAQ,GAAa,GAAO,GAAQ,CAAQ,GAC5C,IAAQ,GAAY,GAAO,EAAO,QAAQ,EAAS,YAAY;GAE/D,IAAM,IAAW,GAAc,EAAO,UAAU,EAAS,eAAe;GACxE,AAAI,MACF,IAAQ,EAAM,MAAM,EAAS,OAAO,EAAE,WAAW,EAAS,UAAU,CAAC;GAGvE,IAAM,IAAS,MAAM,EAAM,MAAM,GAAM,CAAE;GAGzC,OAFI,EAAO,SAAO,EAAuB,EAAO,KAAK,GAE9C;IACL,MAAM,GAAQ,EAAO,MAAM,CAAQ;IACnC;IACA,WAAW;IACX,MAAM,EAAO,SAAS,EAAO,MAAM,UAAU;IAC7C,QAAQ,CAAC;GACX;EACF;EAEA,MAAM,IACJ,GACA,GACA,GACkC;GAClC,IAAM,IAAW,EAAgB,GAAU,CAAO,GAC5C,IAAK,EAAS,MAAM,MACpB,IAAS,MAAM,EAAQ,OAC1B,KAAK,EAAS,KAAK,CAAC,CACpB,OAAU,EAAS,UAAU,CAAa,CAAC,CAC3C,GAAG,GAAI,CAAE,CAAC,CACV,OAAO;GAGV,OADI,EAAO,SAAO,EAAuB,EAAO,KAAK,GAC9C,EAAE,MAAM,EAAO,KAAU;EAClC;EAEA,MAAM,OACJ,GACA,GACA,GACkC;GAClC,IAAM,IAAW,EAAgB,GAAU,CAAO,GAC5C,IAAe,EAAmB,CAAO,GACzC,IAAgB,EAAS,aAC3B,EAAS,WAAW,GAAc,QAAQ,IAC1C,GACE,IAAS,MAAM,EAAQ,OAC1B,KAAK,EAAS,KAAK,CAAC,CACpB,OAAU,CAAa,CAAC,CACxB,OAAO,EAAS,UAAU,CAAa,CAAC,CACxC,OAAO;GAGV,OADI,EAAO,SAAO,EAAuB,EAAO,KAAK,GAC9C,EAAE,MAAM,EAAO,KAAU;EAClC;EAEA,MAAM,OACJ,GACA,GACA,GACA,GACkC;GAClC,IAAM,IAAW,EAAgB,GAAU,CAAO,GAC5C,IAAK,EAAS,MAAM,MACpB,IAAe,EAAmB,CAAO,GACzC,IAAgB,EAAS,aAC3B,EAAS,WAAW,GAAc,QAAQ,IAC1C,GACE,IAAS,MAAM,EAAQ,OAC1B,KAAK,EAAS,KAAK,CAAC,CACpB,OAAU,CAAa,CAAC,CACxB,GAAG,GAAI,CAAE,CAAC,CACV,OAAO,EAAS,UAAU,CAAa,CAAC,CACxC,OAAO;GAGV,OADI,EAAO,SAAO,EAAuB,EAAO,KAAK,GAC9C,EAAE,MAAM,EAAO,KAAU;EAClC;EAEA,MAAM,OAAO,GAAkB,GAAoC;GACjE,IAAM,IAAW,EAAgB,GAAU,CAAO,GAC5C,IAAK,EAAS,MAAM,MACpB,IACJ,EAAS,eAAe,KACpB,EAAE,WAAW,GAAM,IACnB,OAAO,EAAS,cAAe,WAC7B,EAAS,aACT,MAEF,IAAS,IACX,MAAM,EAAQ,OAAO,KAAK,EAAS,KAAK,CAAC,CAAC,OAAO,CAAiB,CAAC,CAAC,GAAG,GAAI,CAAE,IAC7E,MAAM,EAAQ,OAAO,KAAK,EAAS,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,GAAI,CAAE;GAEhE,AAAI,EAAO,SAAO,EAAuB,EAAO,KAAK;EACvD;CACF;AACF"}
|