react-ultra-fetch 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1 @@
1
+ # react-ultra-fetch
@@ -0,0 +1,16 @@
1
+ interface fetchDataProps {
2
+ method?: "POST" | "GET" | "DEL" | "PUT";
3
+ headers?: Record<string, string>;
4
+ body?: string | FormData | Record<string, unknown>;
5
+ cookie?: boolean;
6
+ }
7
+ interface useFetchProps<T, E> {
8
+ loading: boolean;
9
+ error: E | null;
10
+ data: T | null;
11
+ fetchData: (options?: fetchDataProps) => void;
12
+ }
13
+
14
+ declare const useFetch: <T, E = unknown>(url: string) => useFetchProps<T, E>;
15
+
16
+ export { useFetch };
@@ -0,0 +1,16 @@
1
+ interface fetchDataProps {
2
+ method?: "POST" | "GET" | "DEL" | "PUT";
3
+ headers?: Record<string, string>;
4
+ body?: string | FormData | Record<string, unknown>;
5
+ cookie?: boolean;
6
+ }
7
+ interface useFetchProps<T, E> {
8
+ loading: boolean;
9
+ error: E | null;
10
+ data: T | null;
11
+ fetchData: (options?: fetchDataProps) => void;
12
+ }
13
+
14
+ declare const useFetch: <T, E = unknown>(url: string) => useFetchProps<T, E>;
15
+
16
+ export { useFetch };
package/dist/index.js ADDED
@@ -0,0 +1,159 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/index.ts
21
+ var src_exports = {};
22
+ __export(src_exports, {
23
+ useFetch: () => useFetch
24
+ });
25
+ module.exports = __toCommonJS(src_exports);
26
+
27
+ // src/shared/UltraFetchError.ts
28
+ var UltraFetchError = class _UltraFetchError extends Error {
29
+ constructor(text, status) {
30
+ super(text);
31
+ this.name = "UltraFetchError";
32
+ Object.setPrototypeOf(this, _UltraFetchError.prototype);
33
+ }
34
+ };
35
+ var UltraFetchError_default = UltraFetchError;
36
+
37
+ // src/useFetch.tsx
38
+ var import_react = require("react");
39
+
40
+ // src/utils/body.ts
41
+ var Body = (body) => {
42
+ if (body instanceof FormData || typeof body === "string") return body;
43
+ if (body === null || body === void 0) return void 0;
44
+ return JSON.stringify(body);
45
+ };
46
+ var body_default = Body;
47
+
48
+ // src/utils/headers.ts
49
+ var Headers = (body) => {
50
+ if (body instanceof FormData) return {};
51
+ if (typeof body === "object") return { "Content-Type": "application/json" };
52
+ if (typeof body === "string") return { "Content-Type": "text/plain" };
53
+ return {};
54
+ };
55
+ var headers_default = Headers;
56
+
57
+ // src/utils/parserResponse.ts
58
+ var parserResponse = async (res) => {
59
+ const contentType = res.headers.get("content-type") ?? "";
60
+ const text = await res.text();
61
+ if (!text) return null;
62
+ if (contentType.includes("application/json")) {
63
+ try {
64
+ return JSON.parse(text);
65
+ } catch (err) {
66
+ return text;
67
+ }
68
+ }
69
+ try {
70
+ return JSON.parse(text);
71
+ } catch (err) {
72
+ return text;
73
+ }
74
+ };
75
+ var parserResponse_default = parserResponse;
76
+
77
+ // src/methods.ts
78
+ var Methods = class {
79
+ constructor(url) {
80
+ this.url = url;
81
+ }
82
+ url;
83
+ async Post(options) {
84
+ const fHeaders = { ...headers_default(options.body), ...options.headers };
85
+ const fBody = body_default(options.body);
86
+ try {
87
+ const res = await fetch(this.url, {
88
+ method: "POST",
89
+ headers: fHeaders,
90
+ ...fBody === void 0 ? {} : { body: fBody },
91
+ credentials: options.cookie ? "include" : "same-origin"
92
+ });
93
+ const parse = await parserResponse_default(res);
94
+ if (!res.ok) {
95
+ return { success: false, error: parse, status: res.status };
96
+ }
97
+ return { success: res.ok, data: parse, status: res.status };
98
+ } catch (err) {
99
+ const message = err instanceof Error ? err.message : "server-error";
100
+ return { success: false, error: message };
101
+ }
102
+ }
103
+ };
104
+ var methods_default = Methods;
105
+
106
+ // src/useFetch.tsx
107
+ var METHODS = ["POST", "GET", "DEL", "PUT"];
108
+ var useFetch = (url) => {
109
+ if (!url || typeof url !== "string") {
110
+ throw new UltraFetchError_default(
111
+ "URL is required and must be a non-empty string."
112
+ );
113
+ }
114
+ const [loading, setLoading] = (0, import_react.useState)(false);
115
+ const [error, setError] = (0, import_react.useState)(null);
116
+ const [data, setData] = (0, import_react.useState)(null);
117
+ const fetchData = (0, import_react.useCallback)(
118
+ async (options) => {
119
+ const opts = options ?? {};
120
+ const body = opts.body;
121
+ const headers = opts.headers ?? {};
122
+ const cookie = opts.cookie ?? false;
123
+ const method = opts.method ?? "POST";
124
+ setLoading(true);
125
+ setError(null);
126
+ const client = new methods_default(url);
127
+ let results;
128
+ try {
129
+ switch (method) {
130
+ case "POST":
131
+ results = await client.Post({ headers, body, cookie });
132
+ break;
133
+ default: {
134
+ const text = `Unsupported HTTP method: "${method}". Supported methods: ${METHODS.join(", ")}.`;
135
+ throw new UltraFetchError_default(text);
136
+ }
137
+ }
138
+ if (results.success) {
139
+ setData(results.data ?? null);
140
+ } else {
141
+ setError(results.error ?? null);
142
+ }
143
+ } catch (err) {
144
+ const message = err instanceof Error ? err.message : "Unknown error";
145
+ setError(message);
146
+ console.log(message);
147
+ } finally {
148
+ setLoading(false);
149
+ }
150
+ },
151
+ [url]
152
+ );
153
+ return { loading, error, data, fetchData };
154
+ };
155
+ // Annotate the CommonJS export names for ESM import in node:
156
+ 0 && (module.exports = {
157
+ useFetch
158
+ });
159
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/shared/UltraFetchError.ts","../src/useFetch.tsx","../src/utils/body.ts","../src/utils/headers.ts","../src/utils/parserResponse.ts","../src/methods.ts"],"sourcesContent":["export { useFetch } from \"@/useFetch\";\r\n","class UltraFetchError extends Error {\r\n constructor(text: string, status?: number) {\r\n super(text);\r\n this.name = \"UltraFetchError\";\r\n Object.setPrototypeOf(this, UltraFetchError.prototype);\r\n }\r\n}\r\n\r\nexport default UltraFetchError;\r\n","import type { fetchDataProps, useFetchProps, useResults } from \"@/types\";\r\nimport UltraFetchError from \"@/shared/UltraFetchError\";\r\nimport { useCallback, useState } from \"react\";\r\nimport Methods from \"@/methods\";\r\n\r\nconst METHODS = [\"POST\", \"GET\", \"DEL\", \"PUT\"] as const;\r\n\r\nconst useFetch = <T, E = unknown>(url: string): useFetchProps<T, E> => {\r\n if (!url || typeof url !== \"string\") {\r\n throw new UltraFetchError(\r\n \"URL is required and must be a non-empty string.\",\r\n );\r\n }\r\n const [loading, setLoading] = useState<boolean>(false);\r\n const [error, setError] = useState<E | null>(null);\r\n const [data, setData] = useState<T | null>(null);\r\n\r\n const fetchData = useCallback(\r\n async (options?: fetchDataProps) => {\r\n const opts = options ?? {};\r\n\r\n const body = opts.body;\r\n const headers = opts.headers ?? {};\r\n const cookie = opts.cookie ?? false;\r\n const method = opts.method ?? \"POST\";\r\n\r\n setLoading(true);\r\n setError(null);\r\n\r\n const client = new Methods(url);\r\n let results: useResults<T, E>;\r\n\r\n try {\r\n switch (method) {\r\n case \"POST\":\r\n results = await client.Post<T, E>({ headers, body, cookie });\r\n break;\r\n default: {\r\n const text = `Unsupported HTTP method: \"${method}\". Supported methods: ${METHODS.join(\", \")}.`;\r\n throw new UltraFetchError(text);\r\n }\r\n }\r\n\r\n if (results.success) {\r\n setData(results.data ?? null);\r\n } else {\r\n setError(results.error ?? null);\r\n }\r\n } catch (err) {\r\n const message = err instanceof Error ? err.message : \"Unknown error\";\r\n setError(message as unknown as E);\r\n console.log(message);\r\n } finally {\r\n setLoading(false);\r\n }\r\n },\r\n [url],\r\n );\r\n\r\n return { loading, error, data, fetchData };\r\n};\r\n\r\nexport { useFetch };\r\n","const Body = (body: unknown) => {\r\n if (body instanceof FormData || typeof body === \"string\") return body;\r\n if (body === null || body === undefined) return undefined;\r\n return JSON.stringify(body);\r\n};\r\n\r\nexport default Body;\r\n","const Headers = (body: unknown) => {\r\n if (body instanceof FormData) return {};\r\n if (typeof body === \"object\") return { \"Content-Type\": \"application/json\" };\r\n if (typeof body === \"string\") return { \"Content-Type\": \"text/plain\" };\r\n return {};\r\n};\r\n\r\nexport default Headers;\r\n","const parserResponse = async (res: Response) => {\r\n const contentType = res.headers.get(\"content-type\") ?? \"\";\r\n\r\n const text = await res.text();\r\n if (!text) return null;\r\n\r\n if (contentType.includes(\"application/json\")) {\r\n try {\r\n return JSON.parse(text);\r\n } catch (err) {\r\n return text;\r\n }\r\n }\r\n\r\n try {\r\n return JSON.parse(text);\r\n } catch (err) {\r\n return text;\r\n }\r\n};\r\n\r\nexport default parserResponse;\r\n","import Body from \"@/utils/body\";\r\nimport Headers from \"@/utils/headers\";\r\nimport parserResponse from \"@/utils/parserResponse\";\r\nimport type { MethodsPostProps, useResults } from \"@/types\";\r\n\r\nclass Methods {\r\n constructor(public url: string) {}\r\n\r\n async Post<T = unknown, E = unknown>(\r\n options: MethodsPostProps,\r\n ): Promise<useResults<T, E>> {\r\n const fHeaders = { ...Headers(options.body), ...options.headers };\r\n const fBody = Body(options.body);\r\n\r\n try {\r\n const res = await fetch(this.url, {\r\n method: \"POST\",\r\n headers: fHeaders,\r\n ...(fBody === undefined ? {} : { body: fBody }),\r\n credentials: options.cookie ? \"include\" : \"same-origin\",\r\n });\r\n\r\n const parse = await parserResponse(res);\r\n\r\n if (!res.ok) {\r\n return { success: false, error: parse as E, status: res.status };\r\n }\r\n\r\n return { success: res.ok, data: parse as T, status: res.status };\r\n } catch (err) {\r\n const message = err instanceof Error ? err.message : \"server-error\";\r\n return { success: false, error: message as E };\r\n }\r\n }\r\n}\r\n\r\nexport default Methods;\r\n"],"mappings":"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","names":[]}
package/dist/index.mjs ADDED
@@ -0,0 +1,132 @@
1
+ // src/shared/UltraFetchError.ts
2
+ var UltraFetchError = class _UltraFetchError extends Error {
3
+ constructor(text, status) {
4
+ super(text);
5
+ this.name = "UltraFetchError";
6
+ Object.setPrototypeOf(this, _UltraFetchError.prototype);
7
+ }
8
+ };
9
+ var UltraFetchError_default = UltraFetchError;
10
+
11
+ // src/useFetch.tsx
12
+ import { useCallback, useState } from "react";
13
+
14
+ // src/utils/body.ts
15
+ var Body = (body) => {
16
+ if (body instanceof FormData || typeof body === "string") return body;
17
+ if (body === null || body === void 0) return void 0;
18
+ return JSON.stringify(body);
19
+ };
20
+ var body_default = Body;
21
+
22
+ // src/utils/headers.ts
23
+ var Headers = (body) => {
24
+ if (body instanceof FormData) return {};
25
+ if (typeof body === "object") return { "Content-Type": "application/json" };
26
+ if (typeof body === "string") return { "Content-Type": "text/plain" };
27
+ return {};
28
+ };
29
+ var headers_default = Headers;
30
+
31
+ // src/utils/parserResponse.ts
32
+ var parserResponse = async (res) => {
33
+ const contentType = res.headers.get("content-type") ?? "";
34
+ const text = await res.text();
35
+ if (!text) return null;
36
+ if (contentType.includes("application/json")) {
37
+ try {
38
+ return JSON.parse(text);
39
+ } catch (err) {
40
+ return text;
41
+ }
42
+ }
43
+ try {
44
+ return JSON.parse(text);
45
+ } catch (err) {
46
+ return text;
47
+ }
48
+ };
49
+ var parserResponse_default = parserResponse;
50
+
51
+ // src/methods.ts
52
+ var Methods = class {
53
+ constructor(url) {
54
+ this.url = url;
55
+ }
56
+ url;
57
+ async Post(options) {
58
+ const fHeaders = { ...headers_default(options.body), ...options.headers };
59
+ const fBody = body_default(options.body);
60
+ try {
61
+ const res = await fetch(this.url, {
62
+ method: "POST",
63
+ headers: fHeaders,
64
+ ...fBody === void 0 ? {} : { body: fBody },
65
+ credentials: options.cookie ? "include" : "same-origin"
66
+ });
67
+ const parse = await parserResponse_default(res);
68
+ if (!res.ok) {
69
+ return { success: false, error: parse, status: res.status };
70
+ }
71
+ return { success: res.ok, data: parse, status: res.status };
72
+ } catch (err) {
73
+ const message = err instanceof Error ? err.message : "server-error";
74
+ return { success: false, error: message };
75
+ }
76
+ }
77
+ };
78
+ var methods_default = Methods;
79
+
80
+ // src/useFetch.tsx
81
+ var METHODS = ["POST", "GET", "DEL", "PUT"];
82
+ var useFetch = (url) => {
83
+ if (!url || typeof url !== "string") {
84
+ throw new UltraFetchError_default(
85
+ "URL is required and must be a non-empty string."
86
+ );
87
+ }
88
+ const [loading, setLoading] = useState(false);
89
+ const [error, setError] = useState(null);
90
+ const [data, setData] = useState(null);
91
+ const fetchData = useCallback(
92
+ async (options) => {
93
+ const opts = options ?? {};
94
+ const body = opts.body;
95
+ const headers = opts.headers ?? {};
96
+ const cookie = opts.cookie ?? false;
97
+ const method = opts.method ?? "POST";
98
+ setLoading(true);
99
+ setError(null);
100
+ const client = new methods_default(url);
101
+ let results;
102
+ try {
103
+ switch (method) {
104
+ case "POST":
105
+ results = await client.Post({ headers, body, cookie });
106
+ break;
107
+ default: {
108
+ const text = `Unsupported HTTP method: "${method}". Supported methods: ${METHODS.join(", ")}.`;
109
+ throw new UltraFetchError_default(text);
110
+ }
111
+ }
112
+ if (results.success) {
113
+ setData(results.data ?? null);
114
+ } else {
115
+ setError(results.error ?? null);
116
+ }
117
+ } catch (err) {
118
+ const message = err instanceof Error ? err.message : "Unknown error";
119
+ setError(message);
120
+ console.log(message);
121
+ } finally {
122
+ setLoading(false);
123
+ }
124
+ },
125
+ [url]
126
+ );
127
+ return { loading, error, data, fetchData };
128
+ };
129
+ export {
130
+ useFetch
131
+ };
132
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/shared/UltraFetchError.ts","../src/useFetch.tsx","../src/utils/body.ts","../src/utils/headers.ts","../src/utils/parserResponse.ts","../src/methods.ts"],"sourcesContent":["class UltraFetchError extends Error {\r\n constructor(text: string, status?: number) {\r\n super(text);\r\n this.name = \"UltraFetchError\";\r\n Object.setPrototypeOf(this, UltraFetchError.prototype);\r\n }\r\n}\r\n\r\nexport default UltraFetchError;\r\n","import type { fetchDataProps, useFetchProps, useResults } from \"@/types\";\r\nimport UltraFetchError from \"@/shared/UltraFetchError\";\r\nimport { useCallback, useState } from \"react\";\r\nimport Methods from \"@/methods\";\r\n\r\nconst METHODS = [\"POST\", \"GET\", \"DEL\", \"PUT\"] as const;\r\n\r\nconst useFetch = <T, E = unknown>(url: string): useFetchProps<T, E> => {\r\n if (!url || typeof url !== \"string\") {\r\n throw new UltraFetchError(\r\n \"URL is required and must be a non-empty string.\",\r\n );\r\n }\r\n const [loading, setLoading] = useState<boolean>(false);\r\n const [error, setError] = useState<E | null>(null);\r\n const [data, setData] = useState<T | null>(null);\r\n\r\n const fetchData = useCallback(\r\n async (options?: fetchDataProps) => {\r\n const opts = options ?? {};\r\n\r\n const body = opts.body;\r\n const headers = opts.headers ?? {};\r\n const cookie = opts.cookie ?? false;\r\n const method = opts.method ?? \"POST\";\r\n\r\n setLoading(true);\r\n setError(null);\r\n\r\n const client = new Methods(url);\r\n let results: useResults<T, E>;\r\n\r\n try {\r\n switch (method) {\r\n case \"POST\":\r\n results = await client.Post<T, E>({ headers, body, cookie });\r\n break;\r\n default: {\r\n const text = `Unsupported HTTP method: \"${method}\". Supported methods: ${METHODS.join(\", \")}.`;\r\n throw new UltraFetchError(text);\r\n }\r\n }\r\n\r\n if (results.success) {\r\n setData(results.data ?? null);\r\n } else {\r\n setError(results.error ?? null);\r\n }\r\n } catch (err) {\r\n const message = err instanceof Error ? err.message : \"Unknown error\";\r\n setError(message as unknown as E);\r\n console.log(message);\r\n } finally {\r\n setLoading(false);\r\n }\r\n },\r\n [url],\r\n );\r\n\r\n return { loading, error, data, fetchData };\r\n};\r\n\r\nexport { useFetch };\r\n","const Body = (body: unknown) => {\r\n if (body instanceof FormData || typeof body === \"string\") return body;\r\n if (body === null || body === undefined) return undefined;\r\n return JSON.stringify(body);\r\n};\r\n\r\nexport default Body;\r\n","const Headers = (body: unknown) => {\r\n if (body instanceof FormData) return {};\r\n if (typeof body === \"object\") return { \"Content-Type\": \"application/json\" };\r\n if (typeof body === \"string\") return { \"Content-Type\": \"text/plain\" };\r\n return {};\r\n};\r\n\r\nexport default Headers;\r\n","const parserResponse = async (res: Response) => {\r\n const contentType = res.headers.get(\"content-type\") ?? \"\";\r\n\r\n const text = await res.text();\r\n if (!text) return null;\r\n\r\n if (contentType.includes(\"application/json\")) {\r\n try {\r\n return JSON.parse(text);\r\n } catch (err) {\r\n return text;\r\n }\r\n }\r\n\r\n try {\r\n return JSON.parse(text);\r\n } catch (err) {\r\n return text;\r\n }\r\n};\r\n\r\nexport default parserResponse;\r\n","import Body from \"@/utils/body\";\r\nimport Headers from \"@/utils/headers\";\r\nimport parserResponse from \"@/utils/parserResponse\";\r\nimport type { MethodsPostProps, useResults } from \"@/types\";\r\n\r\nclass Methods {\r\n constructor(public url: string) {}\r\n\r\n async Post<T = unknown, E = unknown>(\r\n options: MethodsPostProps,\r\n ): Promise<useResults<T, E>> {\r\n const fHeaders = { ...Headers(options.body), ...options.headers };\r\n const fBody = Body(options.body);\r\n\r\n try {\r\n const res = await fetch(this.url, {\r\n method: \"POST\",\r\n headers: fHeaders,\r\n ...(fBody === undefined ? {} : { body: fBody }),\r\n credentials: options.cookie ? \"include\" : \"same-origin\",\r\n });\r\n\r\n const parse = await parserResponse(res);\r\n\r\n if (!res.ok) {\r\n return { success: false, error: parse as E, status: res.status };\r\n }\r\n\r\n return { success: res.ok, data: parse as T, status: res.status };\r\n } catch (err) {\r\n const message = err instanceof Error ? err.message : \"server-error\";\r\n return { success: false, error: message as E };\r\n }\r\n }\r\n}\r\n\r\nexport default Methods;\r\n"],"mappings":"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","names":[]}
@@ -0,0 +1,10 @@
1
+ import { Plugin } from 'vite';
2
+
3
+ interface UltraFetchConfigProps {
4
+ url?: string | null;
5
+ cookie?: boolean;
6
+ headers?: Record<string, string>;
7
+ }
8
+ declare const ultraFetchConfig: (options: UltraFetchConfigProps) => Plugin;
9
+
10
+ export { ultraFetchConfig };
@@ -0,0 +1,10 @@
1
+ import { Plugin } from 'vite';
2
+
3
+ interface UltraFetchConfigProps {
4
+ url?: string | null;
5
+ cookie?: boolean;
6
+ headers?: Record<string, string>;
7
+ }
8
+ declare const ultraFetchConfig: (options: UltraFetchConfigProps) => Plugin;
9
+
10
+ export { ultraFetchConfig };
@@ -0,0 +1,47 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/vite/index.ts
21
+ var vite_exports = {};
22
+ __export(vite_exports, {
23
+ ultraFetchConfig: () => ultraFetchConfig
24
+ });
25
+ module.exports = __toCommonJS(vite_exports);
26
+ var import_vite = require("vite");
27
+ var ultraFetchConfig = (options) => {
28
+ return {
29
+ name: "vite-plugin-react-ultra-fetch",
30
+ config() {
31
+ return {
32
+ define: {
33
+ REACT_ULTRA_FETCH_CONFIG: JSON.stringify({
34
+ baseURL: options.url || null,
35
+ cookie: options.cookie || false,
36
+ headers: options.headers || {}
37
+ })
38
+ }
39
+ };
40
+ }
41
+ };
42
+ };
43
+ // Annotate the CommonJS export names for ESM import in node:
44
+ 0 && (module.exports = {
45
+ ultraFetchConfig
46
+ });
47
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/vite/index.ts"],"sourcesContent":["import { type Plugin } from \"vite\";\r\n\r\ninterface UltraFetchConfigProps {\r\n url?: string | null;\r\n cookie?: boolean;\r\n headers?: Record<string, string>;\r\n}\r\n\r\nconst ultraFetchConfig = (options: UltraFetchConfigProps): Plugin => {\r\n return {\r\n name: \"vite-plugin-react-ultra-fetch\",\r\n config() {\r\n return {\r\n define: {\r\n REACT_ULTRA_FETCH_CONFIG: JSON.stringify({\r\n baseURL: options.url || null,\r\n cookie: options.cookie || false,\r\n headers: options.headers || {},\r\n }),\r\n },\r\n };\r\n },\r\n };\r\n};\r\n\r\nexport { ultraFetchConfig };\r\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAA4B;AAQ5B,IAAM,mBAAmB,CAAC,YAA2C;AACnE,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AACP,aAAO;AAAA,QACL,QAAQ;AAAA,UACN,0BAA0B,KAAK,UAAU;AAAA,YACvC,SAAS,QAAQ,OAAO;AAAA,YACxB,QAAQ,QAAQ,UAAU;AAAA,YAC1B,SAAS,QAAQ,WAAW,CAAC;AAAA,UAC/B,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;","names":[]}
@@ -0,0 +1,22 @@
1
+ // src/vite/index.ts
2
+ import "vite";
3
+ var ultraFetchConfig = (options) => {
4
+ return {
5
+ name: "vite-plugin-react-ultra-fetch",
6
+ config() {
7
+ return {
8
+ define: {
9
+ REACT_ULTRA_FETCH_CONFIG: JSON.stringify({
10
+ baseURL: options.url || null,
11
+ cookie: options.cookie || false,
12
+ headers: options.headers || {}
13
+ })
14
+ }
15
+ };
16
+ }
17
+ };
18
+ };
19
+ export {
20
+ ultraFetchConfig
21
+ };
22
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/vite/index.ts"],"sourcesContent":["import { type Plugin } from \"vite\";\r\n\r\ninterface UltraFetchConfigProps {\r\n url?: string | null;\r\n cookie?: boolean;\r\n headers?: Record<string, string>;\r\n}\r\n\r\nconst ultraFetchConfig = (options: UltraFetchConfigProps): Plugin => {\r\n return {\r\n name: \"vite-plugin-react-ultra-fetch\",\r\n config() {\r\n return {\r\n define: {\r\n REACT_ULTRA_FETCH_CONFIG: JSON.stringify({\r\n baseURL: options.url || null,\r\n cookie: options.cookie || false,\r\n headers: options.headers || {},\r\n }),\r\n },\r\n };\r\n },\r\n };\r\n};\r\n\r\nexport { ultraFetchConfig };\r\n"],"mappings":";AAAA,OAA4B;AAQ5B,IAAM,mBAAmB,CAAC,YAA2C;AACnE,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AACP,aAAO;AAAA,QACL,QAAQ;AAAA,UACN,0BAA0B,KAAK,UAAU;AAAA,YACvC,SAAS,QAAQ,OAAO;AAAA,YACxB,QAAQ,QAAQ,UAAU;AAAA,YAC1B,SAAS,QAAQ,WAAW,CAAC;AAAA,UAC/B,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;","names":[]}
package/package.json ADDED
@@ -0,0 +1,55 @@
1
+ {
2
+ "name": "react-ultra-fetch",
3
+ "version": "1.0.1",
4
+ "description": "",
5
+ "main": "./dist/index.js",
6
+ "module": "./dist/index.mjs",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "import": {
11
+ "types": "./dist/index.d.ts",
12
+ "default": "./dist/index.mjs"
13
+ },
14
+ "require": {
15
+ "types": "./dist/index.d.ts",
16
+ "default": "./dist/index.js"
17
+ }
18
+ },
19
+ "./vite": {
20
+ "import": {
21
+ "types": "./dist/vite/index.d.ts",
22
+ "default": "./dist/vite/index.mjs"
23
+ },
24
+ "require": {
25
+ "types": "./dist/vite/index.d.ts",
26
+ "default": "./dist/vite/index.js"
27
+ }
28
+ }
29
+ },
30
+ "files": [
31
+ "dist"
32
+ ],
33
+ "scripts": {
34
+ "build": "tsup",
35
+ "dev": "tsup --watch"
36
+ },
37
+ "keywords": [],
38
+ "author": "",
39
+ "license": "ISC",
40
+ "peerDependencies": {
41
+ "react": ">=18",
42
+ "react-dom": ">=18"
43
+ },
44
+ "devDependencies": {
45
+ "@types/node": "^26.4.0",
46
+ "@types/react": "^19.2.18",
47
+ "@types/react-dom": "^19.2.5",
48
+ "react": "^19.2.8",
49
+ "react-dom": "^19.2.8",
50
+ "tsup": "^8.5.1",
51
+ "typescript": "^5.7.3",
52
+ "vite": "^8.2.2",
53
+ "vite-plugin-dts": "^5.0.3"
54
+ }
55
+ }