@yeverlibs/ds 1.1.4 → 1.1.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,8 @@
1
+ type PaginatedData = {
2
+ current: number
3
+ last: number
4
+ total: number
5
+ per_page: number
6
+ }
7
+
8
+ export type { PaginatedData as P };
@@ -0,0 +1,8 @@
1
+ type PaginatedData = {
2
+ current: number
3
+ last: number
4
+ total: number
5
+ per_page: number
6
+ }
7
+
8
+ export type { PaginatedData as P };
@@ -0,0 +1,39 @@
1
+ import { P as PaginatedData } from './paginate.d-DS7epQ82.mjs';
2
+
3
+ type fetchServerSideProps<T = string | number | boolean | null | undefined | object> = {
4
+ urlRequest: string
5
+ parseData?: (data: string | number | boolean | null | undefined | object) => T
6
+ filtersAllowed?: string[]
7
+ method?: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE'
8
+ body?: string | number | boolean | null | undefined | object
9
+ }
10
+
11
+ declare const fetchServerSide: <T>({ urlRequest, parseData, filtersAllowed, method, body, }: fetchServerSideProps<T>) => Promise<{
12
+ props: {
13
+ pagination: PaginatedData | undefined;
14
+ data: T;
15
+ error?: undefined;
16
+ };
17
+ } | {
18
+ props: {
19
+ error: {
20
+ status: number;
21
+ message: string;
22
+ errors: Record<string, string[]>;
23
+ };
24
+ data: null;
25
+ pagination?: undefined;
26
+ };
27
+ } | {
28
+ props: {
29
+ error: {
30
+ status: number;
31
+ message: string | undefined;
32
+ errors: Record<string, string[]> | undefined;
33
+ };
34
+ pagination?: undefined;
35
+ data?: undefined;
36
+ };
37
+ }>;
38
+
39
+ export { fetchServerSide };
@@ -0,0 +1,39 @@
1
+ import { P as PaginatedData } from './paginate.d-DS7epQ82.js';
2
+
3
+ type fetchServerSideProps<T = string | number | boolean | null | undefined | object> = {
4
+ urlRequest: string
5
+ parseData?: (data: string | number | boolean | null | undefined | object) => T
6
+ filtersAllowed?: string[]
7
+ method?: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE'
8
+ body?: string | number | boolean | null | undefined | object
9
+ }
10
+
11
+ declare const fetchServerSide: <T>({ urlRequest, parseData, filtersAllowed, method, body, }: fetchServerSideProps<T>) => Promise<{
12
+ props: {
13
+ pagination: PaginatedData | undefined;
14
+ data: T;
15
+ error?: undefined;
16
+ };
17
+ } | {
18
+ props: {
19
+ error: {
20
+ status: number;
21
+ message: string;
22
+ errors: Record<string, string[]>;
23
+ };
24
+ data: null;
25
+ pagination?: undefined;
26
+ };
27
+ } | {
28
+ props: {
29
+ error: {
30
+ status: number;
31
+ message: string | undefined;
32
+ errors: Record<string, string[]> | undefined;
33
+ };
34
+ pagination?: undefined;
35
+ data?: undefined;
36
+ };
37
+ }>;
38
+
39
+ export { fetchServerSide };
package/dist/server.js ADDED
@@ -0,0 +1,253 @@
1
+ 'use strict';
2
+
3
+ var headers = require('next/headers');
4
+ var navigation = require('next/navigation');
5
+ var Cookies = require('js-cookie');
6
+
7
+ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
8
+
9
+ var Cookies__default = /*#__PURE__*/_interopDefault(Cookies);
10
+
11
+ async function getCsrfToken() {
12
+ const baseURL = process.env.NEXT_PUBLIC_API_URL ?? "";
13
+ const response = await fetch(`${baseURL}/sanctum/csrf-cookie`, {
14
+ credentials: "include",
15
+ headers: {
16
+ "X-Requested-With": "XMLHttpRequest"
17
+ }
18
+ });
19
+ if (!response.ok) {
20
+ throw new Error("Falha ao obter token CSRF");
21
+ }
22
+ await new Promise((resolve) => setTimeout(resolve, 100));
23
+ }
24
+ async function apiFetch(options) {
25
+ const baseURL = process.env.NEXT_PUBLIC_API_URL ?? "";
26
+ const isAbsolute = /^https?:\/\//i.test(options.url);
27
+ const url = isAbsolute ? options.url : `${baseURL}${options.url}`;
28
+ const method = (options.method ?? "GET").toString().toLowerCase();
29
+ const needsCSRFToken = ["post", "put", "delete"].includes(method);
30
+ const hasCSRFCookie = Cookies__default.default.get("XSRF-TOKEN");
31
+ if (needsCSRFToken && !hasCSRFCookie) {
32
+ await getCsrfToken();
33
+ }
34
+ const defaultHeaders = {
35
+ "X-Requested-With": "XMLHttpRequest",
36
+ Accept: "application/json"
37
+ };
38
+ if (!(options.body instanceof FormData)) {
39
+ defaultHeaders["Content-Type"] = "application/json";
40
+ }
41
+ const finalHeaders = new Headers(defaultHeaders);
42
+ if (options.headers) {
43
+ if (options.headers instanceof Headers) {
44
+ options.headers.forEach((v, k) => finalHeaders.set(k, v));
45
+ } else {
46
+ Object.entries(options.headers).forEach(([k, v]) => {
47
+ if (v !== void 0) finalHeaders.set(k, v);
48
+ });
49
+ }
50
+ }
51
+ const csrfToken = Cookies__default.default.get("XSRF-TOKEN");
52
+ if (csrfToken) {
53
+ finalHeaders.set("X-XSRF-TOKEN", csrfToken);
54
+ }
55
+ let finalOptions = options;
56
+ if (options.body) {
57
+ finalOptions = {
58
+ ...options,
59
+ body: options.body instanceof FormData ? options.body : JSON.stringify(options.body)
60
+ };
61
+ }
62
+ let response = await fetch(url, {
63
+ credentials: "include",
64
+ headers: finalHeaders,
65
+ ...finalOptions
66
+ });
67
+ if (response.status === 419) {
68
+ Cookies__default.default.remove("XSRF-TOKEN");
69
+ await getCsrfToken();
70
+ const newToken = Cookies__default.default.get("XSRF-TOKEN");
71
+ if (newToken) {
72
+ finalHeaders.set("X-XSRF-TOKEN", newToken);
73
+ }
74
+ response = await fetch(url, {
75
+ credentials: "include",
76
+ headers: finalHeaders,
77
+ ...options
78
+ });
79
+ if (!response.ok) {
80
+ Cookies__default.default.remove("XSRF-TOKEN");
81
+ Cookies__default.default.remove("yeverClientUser");
82
+ window.location.href = "/login";
83
+ return Promise.reject(new Error("CSRF token expirado"));
84
+ }
85
+ }
86
+ const headers2 = {};
87
+ response.headers.forEach((value, key) => {
88
+ headers2[key] = value;
89
+ });
90
+ if (!response.ok) {
91
+ const data2 = await response.json().catch(() => null);
92
+ const errorMessage = typeof data2 === "object" && data2 !== null && "message" in data2 ? data2.message : "Request failed";
93
+ const error = new Error(errorMessage);
94
+ error.status = response.status;
95
+ error.response = {
96
+ data: data2,
97
+ status: response.status
98
+ };
99
+ throw error;
100
+ }
101
+ let data = null;
102
+ if (options.responseType === "blob") {
103
+ data = await response.blob().catch(() => null);
104
+ } else {
105
+ data = await response.json().catch(() => null);
106
+ }
107
+ return {
108
+ status: response.status,
109
+ statusText: response.statusText,
110
+ data,
111
+ headers: headers2
112
+ };
113
+ }
114
+
115
+ // src/utils/parse-parameters-into-url/index.tsx
116
+ var parseParametersIntoUrl = (url, query, filtersAllowed) => {
117
+ let urlFiltered = url;
118
+ for (const key in query) {
119
+ if (query && Object.keys(query).length > 0) {
120
+ urlFiltered = urlFiltered.replace(`/${key}/`, `/${query[key]}/`);
121
+ urlFiltered = urlFiltered.replace(`/${key}`, `/${query[key]}`);
122
+ if (filtersAllowed && filtersAllowed.includes(key)) {
123
+ if (urlFiltered.includes("?")) {
124
+ if (key === "searchNew") {
125
+ urlFiltered = urlFiltered + `&${key}=${atob(query[key])}`;
126
+ } else {
127
+ urlFiltered = urlFiltered + `&${key}=${query[key]}`;
128
+ }
129
+ } else {
130
+ if (key === "searchNew") {
131
+ urlFiltered = urlFiltered + `?${key}=${atob(query[key])}`;
132
+ } else {
133
+ urlFiltered = urlFiltered + `?${key}=${query[key]}`;
134
+ }
135
+ }
136
+ }
137
+ }
138
+ }
139
+ return urlFiltered;
140
+ };
141
+
142
+ // src/lib/fetch-server-side/index.ts
143
+ var fetchServerSide = async ({
144
+ urlRequest,
145
+ parseData,
146
+ filtersAllowed,
147
+ method = "GET",
148
+ body
149
+ }) => {
150
+ "use server";
151
+ try {
152
+ const headersObject = Object.fromEntries((await headers.headers()).entries());
153
+ const searchParams = new URLSearchParams(headersObject.referer ? new URL(headersObject.referer).search : "");
154
+ const query = Array.from(searchParams.entries()).reduce((acc, [key, value]) => {
155
+ acc[key] = value;
156
+ return acc;
157
+ }, {});
158
+ const url = parseParametersIntoUrl(urlRequest, query, filtersAllowed);
159
+ const origin = headersObject.host;
160
+ const cookie = headersObject.cookie;
161
+ const xsrfToken = cookie?.match(/XSRF-TOKEN=([^;]+)/)?.[1];
162
+ const requestHeaders = {
163
+ Cookie: cookie,
164
+ origin
165
+ };
166
+ if (xsrfToken) {
167
+ requestHeaders["X-XSRF-TOKEN"] = decodeURIComponent(xsrfToken);
168
+ }
169
+ let pagination;
170
+ const res = await apiFetch({
171
+ url,
172
+ method,
173
+ body,
174
+ headers: requestHeaders,
175
+ cache: "no-store"
176
+ });
177
+ if (res?.data && typeof res.data === "object" && "paginate" in res.data) {
178
+ pagination = res.data.paginate;
179
+ }
180
+ const parsedData = parseData ? parseData(res) : res;
181
+ return {
182
+ props: {
183
+ pagination,
184
+ data: parsedData
185
+ }
186
+ };
187
+ } catch (error) {
188
+ const apiError = error;
189
+ switch (apiError.response?.status) {
190
+ case 401:
191
+ navigation.redirect("/login");
192
+ case 403:
193
+ return {
194
+ props: {
195
+ error: {
196
+ status: 403,
197
+ message: "Voc\xEA n\xE3o tem permiss\xE3o para executar essa a\xE7\xE3o",
198
+ errors: {}
199
+ },
200
+ data: null
201
+ }
202
+ };
203
+ case 404:
204
+ return {
205
+ props: {
206
+ error: {
207
+ status: 404,
208
+ message: apiError.response.data?.message || "Recurso n\xE3o encontrado",
209
+ errors: apiError.response?.data?.errors || {}
210
+ },
211
+ data: null
212
+ }
213
+ };
214
+ case 422:
215
+ return {
216
+ props: {
217
+ error: {
218
+ status: 422,
219
+ message: apiError.response.data?.message || "Erro de valida\xE7\xE3o",
220
+ errors: apiError.response?.data?.errors
221
+ }
222
+ }
223
+ };
224
+ case 500:
225
+ return {
226
+ props: {
227
+ error: {
228
+ status: 500,
229
+ message: apiError.response.data?.message || "Ocorreu um erro durante o processamento dessa requisi\xE7\xE3o. A Yever foi notificada e estamos atuando para sanar o problema.",
230
+ errors: {}
231
+ }
232
+ }
233
+ };
234
+ default:
235
+ if (apiError.response?.data?.errors || apiError.response?.data?.message) {
236
+ return {
237
+ props: {
238
+ error: {
239
+ status: apiError.response.status,
240
+ message: apiError.response.data?.message,
241
+ errors: apiError.response.data?.errors
242
+ }
243
+ }
244
+ };
245
+ }
246
+ navigation.redirect("/500");
247
+ }
248
+ }
249
+ };
250
+
251
+ exports.fetchServerSide = fetchServerSide;
252
+ //# sourceMappingURL=server.js.map
253
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/lib/fetch.ts","../src/utils/parse-parameters-into-url/index.tsx","../src/lib/fetch-server-side/index.ts"],"names":["Cookies","headers","data","redirect"],"mappings":"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","file":"server.js","sourcesContent":["import Cookies from 'js-cookie'\n\nimport { CustomRequestInit, FetchResponse, FetchError } from './type'\n\nasync function getCsrfToken() {\n const baseURL = process.env.NEXT_PUBLIC_API_URL ?? ''\n const response = await fetch(`${baseURL}/sanctum/csrf-cookie`, {\n credentials: 'include',\n headers: {\n 'X-Requested-With': 'XMLHttpRequest',\n },\n })\n\n if (!response.ok) {\n throw new Error('Falha ao obter token CSRF')\n }\n\n await new Promise((resolve) => setTimeout(resolve, 100))\n}\n\nexport async function apiFetch(options: CustomRequestInit): Promise<FetchResponse> {\n const baseURL = process.env.NEXT_PUBLIC_API_URL ?? ''\n const isAbsolute = /^https?:\\/\\//i.test(options.url)\n const url = isAbsolute ? options.url : `${baseURL}${options.url}`\n\n const method = (options.method ?? 'GET').toString().toLowerCase()\n const needsCSRFToken = ['post', 'put', 'delete'].includes(method)\n const hasCSRFCookie = Cookies.get('XSRF-TOKEN')\n\n if (needsCSRFToken && !hasCSRFCookie) {\n await getCsrfToken()\n }\n\n const defaultHeaders: Record<string, string> = {\n 'X-Requested-With': 'XMLHttpRequest',\n Accept: 'application/json',\n }\n\n if (!(options.body instanceof FormData)) {\n defaultHeaders['Content-Type'] = 'application/json'\n }\n\n const finalHeaders = new Headers(defaultHeaders)\n if (options.headers) {\n if (options.headers instanceof Headers) {\n options.headers.forEach((v, k) => finalHeaders.set(k, v))\n } else {\n Object.entries(options.headers).forEach(([k, v]) => {\n if (v !== undefined) finalHeaders.set(k, v)\n })\n }\n }\n\n const csrfToken = Cookies.get('XSRF-TOKEN')\n if (csrfToken) {\n finalHeaders.set('X-XSRF-TOKEN', csrfToken)\n }\n\n let finalOptions = options\n if (options.body) {\n finalOptions = {\n ...options,\n body: options.body instanceof FormData ? options.body : JSON.stringify(options.body),\n }\n }\n\n let response = await fetch(url, {\n credentials: 'include',\n headers: finalHeaders,\n ...finalOptions,\n })\n\n if (response.status === 419) {\n Cookies.remove('XSRF-TOKEN')\n\n await getCsrfToken()\n\n const newToken = Cookies.get('XSRF-TOKEN')\n if (newToken) {\n finalHeaders.set('X-XSRF-TOKEN', newToken)\n }\n\n response = await fetch(url, {\n credentials: 'include',\n headers: finalHeaders,\n ...options,\n })\n\n if (!response.ok) {\n Cookies.remove('XSRF-TOKEN')\n Cookies.remove('yeverClientUser')\n window.location.href = '/login'\n return Promise.reject(new Error('CSRF token expirado'))\n }\n }\n\n const headers: Record<string, string> = {}\n response.headers.forEach((value, key) => {\n headers[key] = value\n })\n\n if (!response.ok) {\n const data = await response.json().catch(() => null)\n const errorMessage =\n typeof data === 'object' && data !== null && 'message' in data\n ? (data as { message: string }).message\n : 'Request failed'\n const error = new Error(errorMessage) as FetchError\n error.status = response.status\n error.response = {\n data,\n status: response.status,\n }\n throw error\n }\n\n let data = null\n if (options.responseType === 'blob') {\n data = await response.blob().catch(() => null)\n } else {\n data = await response.json().catch(() => null)\n }\n\n return {\n status: response.status,\n statusText: response.statusText,\n data,\n headers,\n }\n}\n","const parseParametersIntoUrl = (url: string, query: { [key: string]: string }, filtersAllowed?: string[]) => {\n let urlFiltered = url\n\n for (const key in query) {\n if (query && Object.keys(query).length > 0) {\n urlFiltered = urlFiltered.replace(`/${key}/`, `/${query[key]}/`)\n urlFiltered = urlFiltered.replace(`/${key}`, `/${query[key]}`)\n\n if (filtersAllowed && filtersAllowed.includes(key)) {\n if (urlFiltered.includes('?')) {\n if (key === 'searchNew') {\n urlFiltered = urlFiltered + `&${key}=${atob(query[key])}`\n } else {\n urlFiltered = urlFiltered + `&${key}=${query[key]}`\n }\n } else {\n if (key === 'searchNew') {\n urlFiltered = urlFiltered + `?${key}=${atob(query[key])}`\n } else {\n urlFiltered = urlFiltered + `?${key}=${query[key]}`\n }\n }\n }\n }\n }\n\n return urlFiltered\n}\n\nexport { parseParametersIntoUrl }\n\n","'use server'\n\nimport { headers } from 'next/headers'\nimport { redirect } from 'next/navigation'\n\nimport { PaginatedData } from '@/@types/paginate'\nimport { apiFetch } from '@/lib/fetch'\nimport { parseParametersIntoUrl } from '@/utils/parse-parameters-into-url'\n\nimport { ApiError, fetchServerSideProps } from './type'\n\nexport const fetchServerSide = async <T>({\n urlRequest,\n parseData,\n filtersAllowed,\n method = 'GET',\n body,\n}: fetchServerSideProps<T>) => {\n 'use server'\n\n try {\n const headersObject = Object.fromEntries((await headers()).entries())\n const searchParams = new URLSearchParams(headersObject.referer ? new URL(headersObject.referer).search : '')\n\n const query = Array.from(searchParams.entries()).reduce((acc: { [key: string]: string }, [key, value]) => {\n acc[key] = value\n return acc\n }, {})\n\n const url = parseParametersIntoUrl(urlRequest, query, filtersAllowed)\n const origin = headersObject.host\n const cookie = headersObject.cookie\n\n const xsrfToken = cookie?.match(/XSRF-TOKEN=([^;]+)/)?.[1]\n const requestHeaders: Record<string, string> = {\n Cookie: cookie,\n origin,\n }\n\n if (xsrfToken) {\n requestHeaders['X-XSRF-TOKEN'] = decodeURIComponent(xsrfToken)\n }\n\n let pagination: PaginatedData | undefined\n\n const res = await apiFetch({\n url,\n method: method as 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH',\n body: body as string | FormData | null | undefined,\n headers: requestHeaders,\n cache: 'no-store',\n })\n\n if (res?.data && typeof res.data === 'object' && 'paginate' in res.data) {\n pagination = (res.data as { paginate: PaginatedData }).paginate\n }\n\n const parsedData = parseData ? (parseData(res) as T) : (res as T)\n\n return {\n props: {\n pagination,\n data: parsedData,\n },\n }\n } catch (error) {\n const apiError = error as ApiError\n\n switch (apiError.response?.status) {\n case 401:\n redirect('/login')\n case 403:\n return {\n props: {\n error: {\n status: 403,\n message: 'Você não tem permissão para executar essa ação',\n errors: {},\n },\n data: null,\n },\n }\n case 404:\n return {\n props: {\n error: {\n status: 404,\n message: apiError.response.data?.message || 'Recurso não encontrado',\n errors: apiError.response?.data?.errors || {},\n },\n data: null,\n },\n }\n case 422:\n return {\n props: {\n error: {\n status: 422,\n message: apiError.response.data?.message || 'Erro de validação',\n errors: apiError.response?.data?.errors,\n },\n },\n }\n case 500:\n return {\n props: {\n error: {\n status: 500,\n message:\n apiError.response.data?.message ||\n 'Ocorreu um erro durante o processamento dessa requisição. A Yever foi notificada e estamos atuando para sanar o problema.',\n errors: {},\n },\n },\n }\n default:\n if (apiError.response?.data?.errors || apiError.response?.data?.message) {\n return {\n props: {\n error: {\n status: apiError.response.status,\n message: apiError.response.data?.message,\n errors: apiError.response.data?.errors,\n },\n },\n }\n }\n redirect('/500')\n }\n }\n}\n"]}
@@ -0,0 +1,247 @@
1
+ import { headers } from 'next/headers';
2
+ import { redirect } from 'next/navigation';
3
+ import Cookies from 'js-cookie';
4
+
5
+ async function getCsrfToken() {
6
+ const baseURL = process.env.NEXT_PUBLIC_API_URL ?? "";
7
+ const response = await fetch(`${baseURL}/sanctum/csrf-cookie`, {
8
+ credentials: "include",
9
+ headers: {
10
+ "X-Requested-With": "XMLHttpRequest"
11
+ }
12
+ });
13
+ if (!response.ok) {
14
+ throw new Error("Falha ao obter token CSRF");
15
+ }
16
+ await new Promise((resolve) => setTimeout(resolve, 100));
17
+ }
18
+ async function apiFetch(options) {
19
+ const baseURL = process.env.NEXT_PUBLIC_API_URL ?? "";
20
+ const isAbsolute = /^https?:\/\//i.test(options.url);
21
+ const url = isAbsolute ? options.url : `${baseURL}${options.url}`;
22
+ const method = (options.method ?? "GET").toString().toLowerCase();
23
+ const needsCSRFToken = ["post", "put", "delete"].includes(method);
24
+ const hasCSRFCookie = Cookies.get("XSRF-TOKEN");
25
+ if (needsCSRFToken && !hasCSRFCookie) {
26
+ await getCsrfToken();
27
+ }
28
+ const defaultHeaders = {
29
+ "X-Requested-With": "XMLHttpRequest",
30
+ Accept: "application/json"
31
+ };
32
+ if (!(options.body instanceof FormData)) {
33
+ defaultHeaders["Content-Type"] = "application/json";
34
+ }
35
+ const finalHeaders = new Headers(defaultHeaders);
36
+ if (options.headers) {
37
+ if (options.headers instanceof Headers) {
38
+ options.headers.forEach((v, k) => finalHeaders.set(k, v));
39
+ } else {
40
+ Object.entries(options.headers).forEach(([k, v]) => {
41
+ if (v !== void 0) finalHeaders.set(k, v);
42
+ });
43
+ }
44
+ }
45
+ const csrfToken = Cookies.get("XSRF-TOKEN");
46
+ if (csrfToken) {
47
+ finalHeaders.set("X-XSRF-TOKEN", csrfToken);
48
+ }
49
+ let finalOptions = options;
50
+ if (options.body) {
51
+ finalOptions = {
52
+ ...options,
53
+ body: options.body instanceof FormData ? options.body : JSON.stringify(options.body)
54
+ };
55
+ }
56
+ let response = await fetch(url, {
57
+ credentials: "include",
58
+ headers: finalHeaders,
59
+ ...finalOptions
60
+ });
61
+ if (response.status === 419) {
62
+ Cookies.remove("XSRF-TOKEN");
63
+ await getCsrfToken();
64
+ const newToken = Cookies.get("XSRF-TOKEN");
65
+ if (newToken) {
66
+ finalHeaders.set("X-XSRF-TOKEN", newToken);
67
+ }
68
+ response = await fetch(url, {
69
+ credentials: "include",
70
+ headers: finalHeaders,
71
+ ...options
72
+ });
73
+ if (!response.ok) {
74
+ Cookies.remove("XSRF-TOKEN");
75
+ Cookies.remove("yeverClientUser");
76
+ window.location.href = "/login";
77
+ return Promise.reject(new Error("CSRF token expirado"));
78
+ }
79
+ }
80
+ const headers2 = {};
81
+ response.headers.forEach((value, key) => {
82
+ headers2[key] = value;
83
+ });
84
+ if (!response.ok) {
85
+ const data2 = await response.json().catch(() => null);
86
+ const errorMessage = typeof data2 === "object" && data2 !== null && "message" in data2 ? data2.message : "Request failed";
87
+ const error = new Error(errorMessage);
88
+ error.status = response.status;
89
+ error.response = {
90
+ data: data2,
91
+ status: response.status
92
+ };
93
+ throw error;
94
+ }
95
+ let data = null;
96
+ if (options.responseType === "blob") {
97
+ data = await response.blob().catch(() => null);
98
+ } else {
99
+ data = await response.json().catch(() => null);
100
+ }
101
+ return {
102
+ status: response.status,
103
+ statusText: response.statusText,
104
+ data,
105
+ headers: headers2
106
+ };
107
+ }
108
+
109
+ // src/utils/parse-parameters-into-url/index.tsx
110
+ var parseParametersIntoUrl = (url, query, filtersAllowed) => {
111
+ let urlFiltered = url;
112
+ for (const key in query) {
113
+ if (query && Object.keys(query).length > 0) {
114
+ urlFiltered = urlFiltered.replace(`/${key}/`, `/${query[key]}/`);
115
+ urlFiltered = urlFiltered.replace(`/${key}`, `/${query[key]}`);
116
+ if (filtersAllowed && filtersAllowed.includes(key)) {
117
+ if (urlFiltered.includes("?")) {
118
+ if (key === "searchNew") {
119
+ urlFiltered = urlFiltered + `&${key}=${atob(query[key])}`;
120
+ } else {
121
+ urlFiltered = urlFiltered + `&${key}=${query[key]}`;
122
+ }
123
+ } else {
124
+ if (key === "searchNew") {
125
+ urlFiltered = urlFiltered + `?${key}=${atob(query[key])}`;
126
+ } else {
127
+ urlFiltered = urlFiltered + `?${key}=${query[key]}`;
128
+ }
129
+ }
130
+ }
131
+ }
132
+ }
133
+ return urlFiltered;
134
+ };
135
+
136
+ // src/lib/fetch-server-side/index.ts
137
+ var fetchServerSide = async ({
138
+ urlRequest,
139
+ parseData,
140
+ filtersAllowed,
141
+ method = "GET",
142
+ body
143
+ }) => {
144
+ "use server";
145
+ try {
146
+ const headersObject = Object.fromEntries((await headers()).entries());
147
+ const searchParams = new URLSearchParams(headersObject.referer ? new URL(headersObject.referer).search : "");
148
+ const query = Array.from(searchParams.entries()).reduce((acc, [key, value]) => {
149
+ acc[key] = value;
150
+ return acc;
151
+ }, {});
152
+ const url = parseParametersIntoUrl(urlRequest, query, filtersAllowed);
153
+ const origin = headersObject.host;
154
+ const cookie = headersObject.cookie;
155
+ const xsrfToken = cookie?.match(/XSRF-TOKEN=([^;]+)/)?.[1];
156
+ const requestHeaders = {
157
+ Cookie: cookie,
158
+ origin
159
+ };
160
+ if (xsrfToken) {
161
+ requestHeaders["X-XSRF-TOKEN"] = decodeURIComponent(xsrfToken);
162
+ }
163
+ let pagination;
164
+ const res = await apiFetch({
165
+ url,
166
+ method,
167
+ body,
168
+ headers: requestHeaders,
169
+ cache: "no-store"
170
+ });
171
+ if (res?.data && typeof res.data === "object" && "paginate" in res.data) {
172
+ pagination = res.data.paginate;
173
+ }
174
+ const parsedData = parseData ? parseData(res) : res;
175
+ return {
176
+ props: {
177
+ pagination,
178
+ data: parsedData
179
+ }
180
+ };
181
+ } catch (error) {
182
+ const apiError = error;
183
+ switch (apiError.response?.status) {
184
+ case 401:
185
+ redirect("/login");
186
+ case 403:
187
+ return {
188
+ props: {
189
+ error: {
190
+ status: 403,
191
+ message: "Voc\xEA n\xE3o tem permiss\xE3o para executar essa a\xE7\xE3o",
192
+ errors: {}
193
+ },
194
+ data: null
195
+ }
196
+ };
197
+ case 404:
198
+ return {
199
+ props: {
200
+ error: {
201
+ status: 404,
202
+ message: apiError.response.data?.message || "Recurso n\xE3o encontrado",
203
+ errors: apiError.response?.data?.errors || {}
204
+ },
205
+ data: null
206
+ }
207
+ };
208
+ case 422:
209
+ return {
210
+ props: {
211
+ error: {
212
+ status: 422,
213
+ message: apiError.response.data?.message || "Erro de valida\xE7\xE3o",
214
+ errors: apiError.response?.data?.errors
215
+ }
216
+ }
217
+ };
218
+ case 500:
219
+ return {
220
+ props: {
221
+ error: {
222
+ status: 500,
223
+ message: apiError.response.data?.message || "Ocorreu um erro durante o processamento dessa requisi\xE7\xE3o. A Yever foi notificada e estamos atuando para sanar o problema.",
224
+ errors: {}
225
+ }
226
+ }
227
+ };
228
+ default:
229
+ if (apiError.response?.data?.errors || apiError.response?.data?.message) {
230
+ return {
231
+ props: {
232
+ error: {
233
+ status: apiError.response.status,
234
+ message: apiError.response.data?.message,
235
+ errors: apiError.response.data?.errors
236
+ }
237
+ }
238
+ };
239
+ }
240
+ redirect("/500");
241
+ }
242
+ }
243
+ };
244
+
245
+ export { fetchServerSide };
246
+ //# sourceMappingURL=server.mjs.map
247
+ //# sourceMappingURL=server.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/lib/fetch.ts","../src/utils/parse-parameters-into-url/index.tsx","../src/lib/fetch-server-side/index.ts"],"names":["headers","data"],"mappings":"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","file":"server.mjs","sourcesContent":["import Cookies from 'js-cookie'\n\nimport { CustomRequestInit, FetchResponse, FetchError } from './type'\n\nasync function getCsrfToken() {\n const baseURL = process.env.NEXT_PUBLIC_API_URL ?? ''\n const response = await fetch(`${baseURL}/sanctum/csrf-cookie`, {\n credentials: 'include',\n headers: {\n 'X-Requested-With': 'XMLHttpRequest',\n },\n })\n\n if (!response.ok) {\n throw new Error('Falha ao obter token CSRF')\n }\n\n await new Promise((resolve) => setTimeout(resolve, 100))\n}\n\nexport async function apiFetch(options: CustomRequestInit): Promise<FetchResponse> {\n const baseURL = process.env.NEXT_PUBLIC_API_URL ?? ''\n const isAbsolute = /^https?:\\/\\//i.test(options.url)\n const url = isAbsolute ? options.url : `${baseURL}${options.url}`\n\n const method = (options.method ?? 'GET').toString().toLowerCase()\n const needsCSRFToken = ['post', 'put', 'delete'].includes(method)\n const hasCSRFCookie = Cookies.get('XSRF-TOKEN')\n\n if (needsCSRFToken && !hasCSRFCookie) {\n await getCsrfToken()\n }\n\n const defaultHeaders: Record<string, string> = {\n 'X-Requested-With': 'XMLHttpRequest',\n Accept: 'application/json',\n }\n\n if (!(options.body instanceof FormData)) {\n defaultHeaders['Content-Type'] = 'application/json'\n }\n\n const finalHeaders = new Headers(defaultHeaders)\n if (options.headers) {\n if (options.headers instanceof Headers) {\n options.headers.forEach((v, k) => finalHeaders.set(k, v))\n } else {\n Object.entries(options.headers).forEach(([k, v]) => {\n if (v !== undefined) finalHeaders.set(k, v)\n })\n }\n }\n\n const csrfToken = Cookies.get('XSRF-TOKEN')\n if (csrfToken) {\n finalHeaders.set('X-XSRF-TOKEN', csrfToken)\n }\n\n let finalOptions = options\n if (options.body) {\n finalOptions = {\n ...options,\n body: options.body instanceof FormData ? options.body : JSON.stringify(options.body),\n }\n }\n\n let response = await fetch(url, {\n credentials: 'include',\n headers: finalHeaders,\n ...finalOptions,\n })\n\n if (response.status === 419) {\n Cookies.remove('XSRF-TOKEN')\n\n await getCsrfToken()\n\n const newToken = Cookies.get('XSRF-TOKEN')\n if (newToken) {\n finalHeaders.set('X-XSRF-TOKEN', newToken)\n }\n\n response = await fetch(url, {\n credentials: 'include',\n headers: finalHeaders,\n ...options,\n })\n\n if (!response.ok) {\n Cookies.remove('XSRF-TOKEN')\n Cookies.remove('yeverClientUser')\n window.location.href = '/login'\n return Promise.reject(new Error('CSRF token expirado'))\n }\n }\n\n const headers: Record<string, string> = {}\n response.headers.forEach((value, key) => {\n headers[key] = value\n })\n\n if (!response.ok) {\n const data = await response.json().catch(() => null)\n const errorMessage =\n typeof data === 'object' && data !== null && 'message' in data\n ? (data as { message: string }).message\n : 'Request failed'\n const error = new Error(errorMessage) as FetchError\n error.status = response.status\n error.response = {\n data,\n status: response.status,\n }\n throw error\n }\n\n let data = null\n if (options.responseType === 'blob') {\n data = await response.blob().catch(() => null)\n } else {\n data = await response.json().catch(() => null)\n }\n\n return {\n status: response.status,\n statusText: response.statusText,\n data,\n headers,\n }\n}\n","const parseParametersIntoUrl = (url: string, query: { [key: string]: string }, filtersAllowed?: string[]) => {\n let urlFiltered = url\n\n for (const key in query) {\n if (query && Object.keys(query).length > 0) {\n urlFiltered = urlFiltered.replace(`/${key}/`, `/${query[key]}/`)\n urlFiltered = urlFiltered.replace(`/${key}`, `/${query[key]}`)\n\n if (filtersAllowed && filtersAllowed.includes(key)) {\n if (urlFiltered.includes('?')) {\n if (key === 'searchNew') {\n urlFiltered = urlFiltered + `&${key}=${atob(query[key])}`\n } else {\n urlFiltered = urlFiltered + `&${key}=${query[key]}`\n }\n } else {\n if (key === 'searchNew') {\n urlFiltered = urlFiltered + `?${key}=${atob(query[key])}`\n } else {\n urlFiltered = urlFiltered + `?${key}=${query[key]}`\n }\n }\n }\n }\n }\n\n return urlFiltered\n}\n\nexport { parseParametersIntoUrl }\n\n","'use server'\n\nimport { headers } from 'next/headers'\nimport { redirect } from 'next/navigation'\n\nimport { PaginatedData } from '@/@types/paginate'\nimport { apiFetch } from '@/lib/fetch'\nimport { parseParametersIntoUrl } from '@/utils/parse-parameters-into-url'\n\nimport { ApiError, fetchServerSideProps } from './type'\n\nexport const fetchServerSide = async <T>({\n urlRequest,\n parseData,\n filtersAllowed,\n method = 'GET',\n body,\n}: fetchServerSideProps<T>) => {\n 'use server'\n\n try {\n const headersObject = Object.fromEntries((await headers()).entries())\n const searchParams = new URLSearchParams(headersObject.referer ? new URL(headersObject.referer).search : '')\n\n const query = Array.from(searchParams.entries()).reduce((acc: { [key: string]: string }, [key, value]) => {\n acc[key] = value\n return acc\n }, {})\n\n const url = parseParametersIntoUrl(urlRequest, query, filtersAllowed)\n const origin = headersObject.host\n const cookie = headersObject.cookie\n\n const xsrfToken = cookie?.match(/XSRF-TOKEN=([^;]+)/)?.[1]\n const requestHeaders: Record<string, string> = {\n Cookie: cookie,\n origin,\n }\n\n if (xsrfToken) {\n requestHeaders['X-XSRF-TOKEN'] = decodeURIComponent(xsrfToken)\n }\n\n let pagination: PaginatedData | undefined\n\n const res = await apiFetch({\n url,\n method: method as 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH',\n body: body as string | FormData | null | undefined,\n headers: requestHeaders,\n cache: 'no-store',\n })\n\n if (res?.data && typeof res.data === 'object' && 'paginate' in res.data) {\n pagination = (res.data as { paginate: PaginatedData }).paginate\n }\n\n const parsedData = parseData ? (parseData(res) as T) : (res as T)\n\n return {\n props: {\n pagination,\n data: parsedData,\n },\n }\n } catch (error) {\n const apiError = error as ApiError\n\n switch (apiError.response?.status) {\n case 401:\n redirect('/login')\n case 403:\n return {\n props: {\n error: {\n status: 403,\n message: 'Você não tem permissão para executar essa ação',\n errors: {},\n },\n data: null,\n },\n }\n case 404:\n return {\n props: {\n error: {\n status: 404,\n message: apiError.response.data?.message || 'Recurso não encontrado',\n errors: apiError.response?.data?.errors || {},\n },\n data: null,\n },\n }\n case 422:\n return {\n props: {\n error: {\n status: 422,\n message: apiError.response.data?.message || 'Erro de validação',\n errors: apiError.response?.data?.errors,\n },\n },\n }\n case 500:\n return {\n props: {\n error: {\n status: 500,\n message:\n apiError.response.data?.message ||\n 'Ocorreu um erro durante o processamento dessa requisição. A Yever foi notificada e estamos atuando para sanar o problema.',\n errors: {},\n },\n },\n }\n default:\n if (apiError.response?.data?.errors || apiError.response?.data?.message) {\n return {\n props: {\n error: {\n status: apiError.response.status,\n message: apiError.response.data?.message,\n errors: apiError.response.data?.errors,\n },\n },\n }\n }\n redirect('/500')\n }\n }\n}\n"]}