@ureq/impl-fetch 0.0.1-alpha.4 → 0.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/package.json CHANGED
@@ -1,22 +1,22 @@
1
1
  {
2
2
  "name": "@ureq/impl-fetch",
3
- "version": "0.0.1-alpha.4",
3
+ "version": "0.0.1",
4
4
  "main": "./dist/index.js",
5
5
  "module": "./dist/index.mjs",
6
6
  "types": "./dist/index.d.ts",
7
7
  "files": [
8
8
  "dist"
9
9
  ],
10
+ "scripts": {
11
+ "build": "tsup --config tsup.config.ts",
12
+ "dev": "tsup --watch",
13
+ "test": "vitest"
14
+ },
10
15
  "dependencies": {
11
- "@ureq/core": "0.0.1-alpha.4"
16
+ "@ureq/core": "workspace:*"
12
17
  },
13
18
  "devDependencies": {
14
19
  "tsup": "^8.3.6",
15
20
  "typescript": "^5.7.3"
16
- },
17
- "scripts": {
18
- "build": "tsup --config tsup.config.ts",
19
- "dev": "tsup --watch",
20
- "test": "vitest"
21
21
  }
22
22
  }
package/dist/index.d.mts DELETED
@@ -1,22 +0,0 @@
1
- import { Requestor, RequestOptions, Response } from '@ureq/core';
2
-
3
- interface FetchRequestorOptions {
4
- baseURL?: string;
5
- defaultHeaders?: Record<string, string>;
6
- }
7
- declare class FetchRequestor implements Requestor {
8
- private baseURL;
9
- private defaultHeaders;
10
- constructor(options?: FetchRequestorOptions);
11
- private getFullURL;
12
- private convertResponse;
13
- private handleError;
14
- private createRequestInit;
15
- get<T>(url: string, options?: RequestOptions): Promise<Response<T>>;
16
- post<T>(url: string, data?: any, options?: RequestOptions): Promise<Response<T>>;
17
- put<T>(url: string, data?: any, options?: RequestOptions): Promise<Response<T>>;
18
- delete<T>(url: string, options?: RequestOptions): Promise<Response<T>>;
19
- patch<T>(url: string, data?: any, options?: RequestOptions): Promise<Response<T>>;
20
- }
21
-
22
- export { FetchRequestor, type FetchRequestorOptions };
package/dist/index.d.ts DELETED
@@ -1,22 +0,0 @@
1
- import { Requestor, RequestOptions, Response } from '@ureq/core';
2
-
3
- interface FetchRequestorOptions {
4
- baseURL?: string;
5
- defaultHeaders?: Record<string, string>;
6
- }
7
- declare class FetchRequestor implements Requestor {
8
- private baseURL;
9
- private defaultHeaders;
10
- constructor(options?: FetchRequestorOptions);
11
- private getFullURL;
12
- private convertResponse;
13
- private handleError;
14
- private createRequestInit;
15
- get<T>(url: string, options?: RequestOptions): Promise<Response<T>>;
16
- post<T>(url: string, data?: any, options?: RequestOptions): Promise<Response<T>>;
17
- put<T>(url: string, data?: any, options?: RequestOptions): Promise<Response<T>>;
18
- delete<T>(url: string, options?: RequestOptions): Promise<Response<T>>;
19
- patch<T>(url: string, data?: any, options?: RequestOptions): Promise<Response<T>>;
20
- }
21
-
22
- export { FetchRequestor, type FetchRequestorOptions };
package/dist/index.js DELETED
@@ -1,2 +0,0 @@
1
- 'use strict';var n=class{constructor(e){this.baseURL=e?.baseURL||"",this.defaultHeaders=e?.defaultHeaders||{};}getFullURL(e){return this.baseURL?new URL(e,this.baseURL).toString():e}async convertResponse(e){let s;try{s=await e.json();}catch{s=await e.text();}return {data:s,status:e.status,statusText:e.statusText,headers:Object.fromEntries(e.headers.entries())}}handleError(e){let s=new Error(e.message);throw e instanceof globalThis.Response&&(s.status=e.status),s}createRequestInit(e,s,t){return {method:e,headers:{"Content-Type":"application/json",...this.defaultHeaders,...t?.headers},body:s?JSON.stringify(s):void 0,signal:t?.signal,credentials:"same-origin",...t}}async get(e,s){try{let t=await fetch(this.getFullURL(e),this.createRequestInit("GET",void 0,s));if(!t.ok)throw t;return this.convertResponse(t)}catch(t){this.handleError(t);}}async post(e,s,t){try{let r=await fetch(this.getFullURL(e),this.createRequestInit("POST",s,t));if(!r.ok)throw r;return this.convertResponse(r)}catch(r){this.handleError(r);}}async put(e,s,t){try{let r=await fetch(this.getFullURL(e),this.createRequestInit("PUT",s,t));if(!r.ok)throw r;return this.convertResponse(r)}catch(r){this.handleError(r);}}async delete(e,s){try{let t=await fetch(this.getFullURL(e),this.createRequestInit("DELETE",void 0,s));if(!t.ok)throw t;return this.convertResponse(t)}catch(t){this.handleError(t);}}async patch(e,s,t){try{let r=await fetch(this.getFullURL(e),this.createRequestInit("PATCH",s,t));if(!r.ok)throw r;return this.convertResponse(r)}catch(r){this.handleError(r);}}};exports.FetchRequestor=n;//# sourceMappingURL=index.js.map
2
- //# sourceMappingURL=index.js.map
package/dist/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/index.ts"],"names":["FetchRequestor","options","url","response","data","error","requestError","method"],"mappings":"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","file":"index.js","sourcesContent":["import { Requestor, RequestOptions, Response, RequestError } from '@ureq/core';\n\nexport interface FetchRequestorOptions {\n baseURL?: string;\n defaultHeaders?: Record<string, string>;\n}\n\nexport class FetchRequestor implements Requestor {\n private baseURL: string;\n private defaultHeaders: Record<string, string>;\n\n constructor(options?: FetchRequestorOptions) {\n this.baseURL = options?.baseURL || '';\n this.defaultHeaders = options?.defaultHeaders || {};\n }\n\n private getFullURL(url: string): string {\n return this.baseURL ? new URL(url, this.baseURL).toString() : url;\n }\n\n private async convertResponse<T>(response: globalThis.Response): Promise<Response<T>> {\n let data: T;\n \n try {\n data = await response.json();\n } catch {\n data = await response.text() as any;\n }\n\n return {\n data,\n status: response.status,\n statusText: response.statusText,\n headers: Object.fromEntries(response.headers.entries()),\n };\n }\n\n private handleError(error: any): never {\n const requestError: RequestError = new Error(error.message);\n if (error instanceof globalThis.Response) {\n requestError.status = error.status;\n }\n throw requestError;\n }\n\n private createRequestInit(\n method: string,\n data?: any,\n options?: RequestOptions\n ): RequestInit {\n return {\n method,\n headers: {\n 'Content-Type': 'application/json',\n ...this.defaultHeaders,\n ...options?.headers,\n },\n body: data ? JSON.stringify(data) : undefined,\n signal: options?.signal,\n credentials: 'same-origin',\n ...options,\n };\n }\n\n async get<T>(url: string, options?: RequestOptions): Promise<Response<T>> {\n try {\n const response = await fetch(\n this.getFullURL(url),\n this.createRequestInit('GET', undefined, options)\n );\n \n if (!response.ok) {\n throw response;\n }\n \n return this.convertResponse(response);\n } catch (error) {\n this.handleError(error);\n }\n }\n\n async post<T>(url: string, data?: any, options?: RequestOptions): Promise<Response<T>> {\n try {\n const response = await fetch(\n this.getFullURL(url),\n this.createRequestInit('POST', data, options)\n );\n \n if (!response.ok) {\n throw response;\n }\n \n return this.convertResponse(response);\n } catch (error) {\n this.handleError(error);\n }\n }\n\n async put<T>(url: string, data?: any, options?: RequestOptions): Promise<Response<T>> {\n try {\n const response = await fetch(\n this.getFullURL(url),\n this.createRequestInit('PUT', data, options)\n );\n \n if (!response.ok) {\n throw response;\n }\n \n return this.convertResponse(response);\n } catch (error) {\n this.handleError(error);\n }\n }\n\n async delete<T>(url: string, options?: RequestOptions): Promise<Response<T>> {\n try {\n const response = await fetch(\n this.getFullURL(url),\n this.createRequestInit('DELETE', undefined, options)\n );\n \n if (!response.ok) {\n throw response;\n }\n \n return this.convertResponse(response);\n } catch (error) {\n this.handleError(error);\n }\n }\n\n async patch<T>(url: string, data?: any, options?: RequestOptions): Promise<Response<T>> {\n try {\n const response = await fetch(\n this.getFullURL(url),\n this.createRequestInit('PATCH', data, options)\n );\n \n if (!response.ok) {\n throw response;\n }\n \n return this.convertResponse(response);\n } catch (error) {\n this.handleError(error);\n }\n }\n\n // 实现其他方法...\n} "]}
package/dist/index.mjs DELETED
@@ -1,2 +0,0 @@
1
- var n=class{constructor(e){this.baseURL=e?.baseURL||"",this.defaultHeaders=e?.defaultHeaders||{};}getFullURL(e){return this.baseURL?new URL(e,this.baseURL).toString():e}async convertResponse(e){let s;try{s=await e.json();}catch{s=await e.text();}return {data:s,status:e.status,statusText:e.statusText,headers:Object.fromEntries(e.headers.entries())}}handleError(e){let s=new Error(e.message);throw e instanceof globalThis.Response&&(s.status=e.status),s}createRequestInit(e,s,t){return {method:e,headers:{"Content-Type":"application/json",...this.defaultHeaders,...t?.headers},body:s?JSON.stringify(s):void 0,signal:t?.signal,credentials:"same-origin",...t}}async get(e,s){try{let t=await fetch(this.getFullURL(e),this.createRequestInit("GET",void 0,s));if(!t.ok)throw t;return this.convertResponse(t)}catch(t){this.handleError(t);}}async post(e,s,t){try{let r=await fetch(this.getFullURL(e),this.createRequestInit("POST",s,t));if(!r.ok)throw r;return this.convertResponse(r)}catch(r){this.handleError(r);}}async put(e,s,t){try{let r=await fetch(this.getFullURL(e),this.createRequestInit("PUT",s,t));if(!r.ok)throw r;return this.convertResponse(r)}catch(r){this.handleError(r);}}async delete(e,s){try{let t=await fetch(this.getFullURL(e),this.createRequestInit("DELETE",void 0,s));if(!t.ok)throw t;return this.convertResponse(t)}catch(t){this.handleError(t);}}async patch(e,s,t){try{let r=await fetch(this.getFullURL(e),this.createRequestInit("PATCH",s,t));if(!r.ok)throw r;return this.convertResponse(r)}catch(r){this.handleError(r);}}};export{n as FetchRequestor};//# sourceMappingURL=index.mjs.map
2
- //# sourceMappingURL=index.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/index.ts"],"names":["FetchRequestor","options","url","response","data","error","requestError","method"],"mappings":"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","file":"index.mjs","sourcesContent":["import { Requestor, RequestOptions, Response, RequestError } from '@ureq/core';\n\nexport interface FetchRequestorOptions {\n baseURL?: string;\n defaultHeaders?: Record<string, string>;\n}\n\nexport class FetchRequestor implements Requestor {\n private baseURL: string;\n private defaultHeaders: Record<string, string>;\n\n constructor(options?: FetchRequestorOptions) {\n this.baseURL = options?.baseURL || '';\n this.defaultHeaders = options?.defaultHeaders || {};\n }\n\n private getFullURL(url: string): string {\n return this.baseURL ? new URL(url, this.baseURL).toString() : url;\n }\n\n private async convertResponse<T>(response: globalThis.Response): Promise<Response<T>> {\n let data: T;\n \n try {\n data = await response.json();\n } catch {\n data = await response.text() as any;\n }\n\n return {\n data,\n status: response.status,\n statusText: response.statusText,\n headers: Object.fromEntries(response.headers.entries()),\n };\n }\n\n private handleError(error: any): never {\n const requestError: RequestError = new Error(error.message);\n if (error instanceof globalThis.Response) {\n requestError.status = error.status;\n }\n throw requestError;\n }\n\n private createRequestInit(\n method: string,\n data?: any,\n options?: RequestOptions\n ): RequestInit {\n return {\n method,\n headers: {\n 'Content-Type': 'application/json',\n ...this.defaultHeaders,\n ...options?.headers,\n },\n body: data ? JSON.stringify(data) : undefined,\n signal: options?.signal,\n credentials: 'same-origin',\n ...options,\n };\n }\n\n async get<T>(url: string, options?: RequestOptions): Promise<Response<T>> {\n try {\n const response = await fetch(\n this.getFullURL(url),\n this.createRequestInit('GET', undefined, options)\n );\n \n if (!response.ok) {\n throw response;\n }\n \n return this.convertResponse(response);\n } catch (error) {\n this.handleError(error);\n }\n }\n\n async post<T>(url: string, data?: any, options?: RequestOptions): Promise<Response<T>> {\n try {\n const response = await fetch(\n this.getFullURL(url),\n this.createRequestInit('POST', data, options)\n );\n \n if (!response.ok) {\n throw response;\n }\n \n return this.convertResponse(response);\n } catch (error) {\n this.handleError(error);\n }\n }\n\n async put<T>(url: string, data?: any, options?: RequestOptions): Promise<Response<T>> {\n try {\n const response = await fetch(\n this.getFullURL(url),\n this.createRequestInit('PUT', data, options)\n );\n \n if (!response.ok) {\n throw response;\n }\n \n return this.convertResponse(response);\n } catch (error) {\n this.handleError(error);\n }\n }\n\n async delete<T>(url: string, options?: RequestOptions): Promise<Response<T>> {\n try {\n const response = await fetch(\n this.getFullURL(url),\n this.createRequestInit('DELETE', undefined, options)\n );\n \n if (!response.ok) {\n throw response;\n }\n \n return this.convertResponse(response);\n } catch (error) {\n this.handleError(error);\n }\n }\n\n async patch<T>(url: string, data?: any, options?: RequestOptions): Promise<Response<T>> {\n try {\n const response = await fetch(\n this.getFullURL(url),\n this.createRequestInit('PATCH', data, options)\n );\n \n if (!response.ok) {\n throw response;\n }\n \n return this.convertResponse(response);\n } catch (error) {\n this.handleError(error);\n }\n }\n\n // 实现其他方法...\n} "]}