@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.
- package/dist/index.d.mts +2 -44
- package/dist/index.d.ts +2 -44
- package/dist/index.js +33 -249
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +35 -249
- package/dist/index.mjs.map +1 -1
- package/dist/paginate.d-DS7epQ82.d.mts +8 -0
- package/dist/paginate.d-DS7epQ82.d.ts +8 -0
- package/dist/server.d.mts +39 -0
- package/dist/server.d.ts +39 -0
- package/dist/server.js +253 -0
- package/dist/server.js.map +1 -0
- package/dist/server.mjs +247 -0
- package/dist/server.mjs.map +1 -0
- package/package.json +6 -1
|
@@ -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 };
|
package/dist/server.d.ts
ADDED
|
@@ -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"]}
|
package/dist/server.mjs
ADDED
|
@@ -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"]}
|