Complete Email Sortierer implementation with Appwrite and Stripe integration

This commit is contained in:
2026-01-14 20:02:16 +01:00
commit 95349af50b
3355 changed files with 644802 additions and 0 deletions

View File

@@ -0,0 +1,114 @@
MIT License
Copyright (c) Pooya Parsa <pooya@pi0.io>
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
---
https://github.com/node-fetch/node-fetch
The MIT License (MIT)
Copyright (c) 2016 - 2020 Node Fetch Team
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
---
https://github.com/mysticatea/abort-controller
MIT License
Copyright (c) 2017 Toru Nagashima
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
---
https://github.com/TooTallNate/proxy-agents
(The MIT License)
Copyright (c) 2013 Nathan Rajlich <nathan@tootallnate.net>
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
'Software'), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
---
https://github.com/nodejs/undici
MIT License
Copyright (c) Matteo Collina and Undici contributors
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

View File

@@ -0,0 +1,222 @@
# node-fetch-native
[![][npm-version-src]][npm-version-href]
[![][github-actions-src]][github-actions-href]
[![][packagephobia-src]][packagephobia-href]
[![npm downloads][npm-downloads-src]][npm-downloads-href]
<!-- [![Codecov][codecov-src]][codecov-href] -->
A redistribution of [node-fetch v3](https://github.com/node-fetch/node-fetch) (+ more!) for better backward and forward compatibility.
**Why this package?**
- We can no longer `require('node-fetch')` with the latest version. This stopped popular libraries from upgrading and dependency conflicts between `node-fetch@2` and `node-fetch@3`.
- With upcoming versions of Node.js, native `fetch` is being supported. We are prepared for native fetch support using this package yet keep supporting older Node versions.
- With the introduction of native fetch to Node.js via [undici](https://github.com/nodejs/undici) there is no easy way to support http proxies!
**Features:**
✅ Prefer to **native globals** when available (See Node.js [experimental fetch](https://nodejs.org/dist/latest-v17.x/docs/api/cli.html#--experimental-fetch)).
✅ Compact build and less install size with **zero dependencies** [![][packagephobia-s-src]][packagephobia-s-href] <sup>vs</sup> [![][packagephobia-s-alt-src]][packagephobia-s-alt-href]
✅ Support both **CommonJS** (`require`) and **ESM** (`import`) usage
✅ Use native version if imported without `node` condition using [conditional exports](https://nodejs.org/api/packages.html#packages_conditional_exports) with **zero bundle overhead**
✅ Polyfill support for Node.js
✅ Compact and simple proxy supporting both Node.js versions without native fetch using [HTTP Agent](https://github.com/TooTallNate/proxy-agents/tree/main/packages/proxy-agent) and versions with native fetch using [Undici Proxy Agent](https://undici.nodejs.org/#/docs/api/ProxyAgent)
## Usage
Install `node-fetch-native` dependency:
```sh
# npm
npm i node-fetch-native
# yarn
yarn add node-fetch-native
# pnpm
pnpm i node-fetch-native
```
You can now either import or require the dependency:
```js
// ESM
import fetch from "node-fetch-native";
// CommonJS
const fetch = require("node-fetch-native");
```
More named exports:
```js
// ESM
import {
fetch,
Blob,
FormData,
Headers,
Request,
Response,
AbortController,
} from "node-fetch-native";
// CommonJS
const {
fetch,
Blob,
FormData,
Headers,
Request,
Response,
AbortController,
} = require("node-fetch-native");
```
## Force using non-native version
Sometimes you want to explicitly use none native (`node-fetch`) implementation of `fetch` in case of issues with the native/polyfill version of `globalThis.fetch` with Node.js or runtime environment.
You have two ways to do this:
- Set the `FORCE_NODE_FETCH` environment variable before starting the application.
- Import from `node-fetch-native/node`
## Polyfill support
Using the polyfill method, we can ensure global fetch is available in the environment and all files. Natives are always preferred.
**Note:** I don't recommend this if you are authoring a library! Please prefer the explicit methods.
```js
// ESM
import "node-fetch-native/polyfill";
// CJS
require("node-fetch-native/polyfill");
// You can now use fetch() without any import!
```
## Proxy Support
Node.js has no built-in support for HTTP Proxies for fetch (see [nodejs/undici#1650](https://github.com/nodejs/undici/issues/1650) and [nodejs/node#8381](https://github.com/nodejs/node/issues/8381))
This package bundles a compact and simple proxy-supported solution for both Node.js versions without native fetch using [HTTP Agent](https://github.com/TooTallNate/proxy-agents/tree/main/packages/proxy-agent) and versions with native fetch using [Undici Proxy Agent](https://undici.nodejs.org/#/docs/api/ProxyAgent).
By default, `https_proxy`, `http_proxy`, `HTTPS_PROXY`, and `HTTP_PROXY` environment variables will be checked and used (in order) for the proxy and if not any of them are set, the proxy will be disabled. You can override it using the `url` option passed to `createFetch` and `createProxy` utils.
By default, `no_proxy` and `NO_PROXY` environment variables will be checked and used for the (comma-separated) list of hosts to ignore the proxy for. You can override it using the `noProxy` option passed to `createFetch` and `createProxy` utils. The entries starting with a dot will be used to check the domain and also any subdomain.
> [!NOTE]
> Using export conditions, this utility adds proxy support for Node.js and for other runtimes, it will simply return native fetch.
> [!IMPORTANT]
> Proxy support is under development. Check [unjs/node-fetch-native#107](https://github.com/unjs/node-fetch-native/issues/107) for the roadmap and contributing!
### `fetch` with proxy support
You can simply import `{ fetch }` from `node-fetch-native/proxy` with a preconfigured `fetch` function that has proxy support.
```ts
import { fetch } from "node-fetch-native/proxy";
console.log(await fetch("https://icanhazip.com").then((r) => r.text());
```
### `createFetch` utility
You can use the `createFetch` utility to instantiate a `fetch` instance with custom proxy options.
```ts
import { createFetch } from "node-fetch-native/proxy";
const fetch = createFetch({ url: "http://localhost:9080" });
console.log(await fetch("https://icanhazip.com").then((r) => r.text());
```
### `createProxy` utility
`createProxy` returns an object with `agent` and `dispatcher` keys that can be passed as fetch options.
```ts
import { fetch } from "node-fetch-native";
import { createProxy } from "node-fetch-native/proxy";
const proxy = createProxy();
// const proxy = createProxy({ url: "http://localhost:8080" });
console.log(await fetch("https://icanhazip.com", { ...proxy }).then((r) => r.text());
```
## Alias to `node-fetch`
Using this method, you can ensure all project dependencies and usages of `node-fetch` can benefit from improved `node-fetch-native` and won't conflict between `node-fetch@2` and `node-fetch@3`.
### npm
Using npm [overrides](https://docs.npmjs.com/cli/v8/configuring-npm/package-json#overrides):
```jsonc
// package.json
{
"overrides": {
"node-fetch": "npm:node-fetch-native@latest"
}
}
```
### yarn
Using yarn [selective dependency resolutions](https://classic.yarnpkg.com/lang/en/docs/selective-version-resolutions/):
```jsonc
// package.json
{
"resolutions": {
"node-fetch": "npm:node-fetch-native@latest"
}
}
```
### pnpm
Using [pnpm.overrides](https://pnpm.io/package_json#pnpmoverrides):
```jsonc
// package.json
{
"pnpm": {
"overrides": {
"node-fetch": "npm:node-fetch-native@latest"
}
}
}
```
## License
Made with 💛 Published under the [MIT](./LICENSE) license.
<!-- Badges -->
[npm-version-src]: https://flat.badgen.net/npm/v/node-fetch-native
[npm-version-href]: https://npmjs.com/package/node-fetch-native
[npm-downloads-src]: https://flat.badgen.net/npm/dm/node-fetch-native
[npm-downloads-href]: https://npmjs.com/package/node-fetch-native
[github-actions-src]: https://flat.badgen.net/github/checks/unjs/node-fetch-native
[github-actions-href]: https://github.com/unjs/node-fetch-native/actions?query=workflow%3Aci
[packagephobia-src]: https://flat.badgen.net/packagephobia/install/node-fetch-native
[packagephobia-href]: https://packagephobia.com/result?p=node-fetch-native
[packagephobia-s-src]: https://flat.badgen.net/packagephobia/install/node-fetch-native?label=node-fetch-native&scale=.9
[packagephobia-s-href]: https://packagephobia.com/result?p=node-fetch-native
[packagephobia-s-alt-src]: https://flat.badgen.net/packagephobia/install/node-fetch?label=node-fetch&scale=.9
[packagephobia-s-alt-href]: https://packagephobia.com/result?p=node-fetch

View File

@@ -0,0 +1 @@
export * from "./lib/agent";

View File

@@ -0,0 +1 @@
"use strict";var n=Object.defineProperty;var t=(r,a)=>n(r,"name",{value:a,configurable:!0});var c=Object.defineProperty,e=t((r,a)=>c(r,"name",{value:a,configurable:!0}),"e");function createAgent(){return{agent:void 0,dispatcher:void 0}}t(createAgent,"createAgent"),e(createAgent,"createAgent");function createFetch(){return globalThis.fetch}t(createFetch,"createFetch"),e(createFetch,"createFetch");const fetch=globalThis.fetch;exports.createAgent=createAgent,exports.createFetch=createFetch,exports.fetch=fetch;

View File

@@ -0,0 +1 @@
var o=Object.defineProperty;var e=(t,c)=>o(t,"name",{value:c,configurable:!0});var i=Object.defineProperty,r=e((t,c)=>i(t,"name",{value:c,configurable:!0}),"e");function a(){return{agent:void 0,dispatcher:void 0}}e(a,"createAgent"),r(a,"createAgent");function n(){return globalThis.fetch}e(n,"createFetch"),r(n,"createFetch");const h=globalThis.fetch;export{a as createAgent,n as createFetch,h as fetch};

View File

@@ -0,0 +1 @@
"use strict";var u=Object.defineProperty;var o=(e,t)=>u(e,"name",{value:t,configurable:!0});const http=require("node:http"),https=require("node:https"),index=require("./shared/node-fetch-native-with-agent.df7e6bd6.cjs"),nodeFetchNativeWithAgent=require("node-fetch-native-with-agent");require("node:assert"),require("node:net"),require("node:stream"),require("node:buffer"),require("node:util"),require("node:querystring"),require("node:diagnostics_channel"),require("node:events"),require("./shared/node-fetch-native-with-agent.61758d11.cjs"),require("node:tls"),require("node:zlib"),require("node:perf_hooks"),require("node:util/types"),require("node:os"),require("node:url"),require("node:async_hooks"),require("node:console"),require("string_decoder"),require("node:worker_threads");var i=Object.defineProperty,r=o((e,t)=>i(e,"name",{value:t,configurable:!0}),"r");function createAgent(e,t={}){const n={rejectUnauthorized:t.rejectUnauthorized},c=e?.startsWith("https:")?new https.Agent(n):new http.Agent,s=new index.Agent_1({connect:n});return{agent:c,dispatcher:s}}o(createAgent,"createAgent"),r(createAgent,"createAgent");function createFetch(e={}){const t=createAgent(void 0,e);return(n,c)=>nodeFetchNativeWithAgent.fetch(n,{...t,...c})}o(createFetch,"createFetch"),r(createFetch,"createFetch");const fetch=createFetch({});exports.createAgent=createAgent,exports.createFetch=createFetch,exports.fetch=fetch;

View File

@@ -0,0 +1 @@
var a=Object.defineProperty;var o=(t,r)=>a(t,"name",{value:r,configurable:!0});import{Agent as f}from"node:http";import{Agent as h}from"node:https";import{A as s}from"./shared/node-fetch-native-with-agent.56860586.mjs";import{fetch as g}from"node-fetch-native-with-agent";import"node:assert";import"node:net";import"node:stream";import"node:buffer";import"node:util";import"node:querystring";import"node:diagnostics_channel";import"node:events";import"./shared/node-fetch-native-with-agent.1a4a356d.mjs";import"node:tls";import"node:zlib";import"node:perf_hooks";import"node:util/types";import"node:os";import"node:url";import"node:async_hooks";import"node:console";import"string_decoder";import"node:worker_threads";var u=Object.defineProperty,p=o((t,r)=>u(t,"name",{value:r,configurable:!0}),"r");function m(t,r={}){const e={rejectUnauthorized:r.rejectUnauthorized},i=t?.startsWith("https:")?new h(e):new f,c=new s({connect:e});return{agent:i,dispatcher:c}}o(m,"createAgent"),p(m,"createAgent");function n(t={}){const r=m(void 0,t);return(e,i)=>g(e,{...r,...i})}o(n,"createFetch"),p(n,"createFetch");const A=n({});export{m as createAgent,n as createFetch,A as fetch};

View File

@@ -0,0 +1,2 @@
"use strict";var y=Object.defineProperty;var c=(R,o)=>y(R,"name",{value:o,configurable:!0});require("node:fs"),require("node:path");const node=require("../node.cjs");require("node:http"),require("node:https"),require("node:zlib"),require("node:stream"),require("node:buffer"),require("node:util"),require("../shared/node-fetch-native-with-agent.61758d11.cjs"),require("node:url"),require("node:net");let s=0;const S={START_BOUNDARY:s++,HEADER_FIELD_START:s++,HEADER_FIELD:s++,HEADER_VALUE_START:s++,HEADER_VALUE:s++,HEADER_VALUE_ALMOST_DONE:s++,HEADERS_ALMOST_DONE:s++,PART_DATA_START:s++,PART_DATA:s++,END:s++};let f=1;const F={PART_BOUNDARY:f,LAST_BOUNDARY:f*=2},LF=10,CR=13,SPACE=32,HYPHEN=45,COLON=58,A=97,Z=122,lower=c(R=>R|32,"lower"),noop=c(()=>{},"noop"),O=class O{constructor(o){this.index=0,this.flags=0,this.onHeaderEnd=noop,this.onHeaderField=noop,this.onHeadersEnd=noop,this.onHeaderValue=noop,this.onPartBegin=noop,this.onPartData=noop,this.onPartEnd=noop,this.boundaryChars={},o=`\r
--`+o;const t=new Uint8Array(o.length);for(let n=0;n<o.length;n++)t[n]=o.charCodeAt(n),this.boundaryChars[t[n]]=!0;this.boundary=t,this.lookbehind=new Uint8Array(this.boundary.length+8),this.state=S.START_BOUNDARY}write(o){let t=0;const n=o.length;let E=this.index,{lookbehind:l,boundary:h,boundaryChars:H,index:e,state:a,flags:d}=this;const b=this.boundary.length,g=b-1,m=o.length;let r,P;const u=c(D=>{this[D+"Mark"]=t},"mark"),i=c(D=>{delete this[D+"Mark"]},"clear"),T=c((D,p,_,N)=>{(p===void 0||p!==_)&&this[D](N&&N.subarray(p,_))},"callback"),L=c((D,p)=>{const _=D+"Mark";_ in this&&(p?(T(D,this[_],t,o),delete this[_]):(T(D,this[_],o.length,o),this[_]=0))},"dataCallback");for(t=0;t<n;t++)switch(r=o[t],a){case S.START_BOUNDARY:if(e===h.length-2){if(r===HYPHEN)d|=F.LAST_BOUNDARY;else if(r!==CR)return;e++;break}else if(e-1===h.length-2){if(d&F.LAST_BOUNDARY&&r===HYPHEN)a=S.END,d=0;else if(!(d&F.LAST_BOUNDARY)&&r===LF)e=0,T("onPartBegin"),a=S.HEADER_FIELD_START;else return;break}r!==h[e+2]&&(e=-2),r===h[e+2]&&e++;break;case S.HEADER_FIELD_START:a=S.HEADER_FIELD,u("onHeaderField"),e=0;case S.HEADER_FIELD:if(r===CR){i("onHeaderField"),a=S.HEADERS_ALMOST_DONE;break}if(e++,r===HYPHEN)break;if(r===COLON){if(e===1)return;L("onHeaderField",!0),a=S.HEADER_VALUE_START;break}if(P=lower(r),P<A||P>Z)return;break;case S.HEADER_VALUE_START:if(r===SPACE)break;u("onHeaderValue"),a=S.HEADER_VALUE;case S.HEADER_VALUE:r===CR&&(L("onHeaderValue",!0),T("onHeaderEnd"),a=S.HEADER_VALUE_ALMOST_DONE);break;case S.HEADER_VALUE_ALMOST_DONE:if(r!==LF)return;a=S.HEADER_FIELD_START;break;case S.HEADERS_ALMOST_DONE:if(r!==LF)return;T("onHeadersEnd"),a=S.PART_DATA_START;break;case S.PART_DATA_START:a=S.PART_DATA,u("onPartData");case S.PART_DATA:if(E=e,e===0){for(t+=g;t<m&&!(o[t]in H);)t+=b;t-=g,r=o[t]}if(e<h.length)h[e]===r?(e===0&&L("onPartData",!0),e++):e=0;else if(e===h.length)e++,r===CR?d|=F.PART_BOUNDARY:r===HYPHEN?d|=F.LAST_BOUNDARY:e=0;else if(e-1===h.length)if(d&F.PART_BOUNDARY){if(e=0,r===LF){d&=~F.PART_BOUNDARY,T("onPartEnd"),T("onPartBegin"),a=S.HEADER_FIELD_START;break}}else d&F.LAST_BOUNDARY&&r===HYPHEN?(T("onPartEnd"),a=S.END,d=0):e=0;if(e>0)l[e-1]=r;else if(E>0){const D=new Uint8Array(l.buffer,l.byteOffset,l.byteLength);T("onPartData",0,E,D),E=0,u("onPartData"),t--}break;case S.END:break;default:throw new Error(`Unexpected state entered: ${a}`)}L("onHeaderField"),L("onHeaderValue"),L("onPartData"),this.index=e,this.state=a,this.flags=d}end(){if(this.state===S.HEADER_FIELD_START&&this.index===0||this.state===S.PART_DATA&&this.index===this.boundary.length)this.onPartEnd();else if(this.state!==S.END)throw new Error("MultipartParser.end(): stream ended unexpectedly")}};c(O,"MultipartParser");let MultipartParser=O;function _fileName(R){const o=R.match(/\bfilename=("(.*?)"|([^()<>@,;:\\"/[\]?={}\s\t]+))($|;\s)/i);if(!o)return;const t=o[2]||o[3]||"";let n=t.slice(t.lastIndexOf("\\")+1);return n=n.replace(/%22/g,'"'),n=n.replace(/&#(\d{4});/g,(E,l)=>String.fromCharCode(l)),n}c(_fileName,"_fileName");async function toFormData(R,o){if(!/multipart/i.test(o))throw new TypeError("Failed to fetch");const t=o.match(/boundary=(?:"([^"]+)"|([^;]+))/i);if(!t)throw new TypeError("no or bad content-type header, no multipart boundary");const n=new MultipartParser(t[1]||t[2]);let E,l,h,H,e,a;const d=[],b=new node.FormData,g=c(i=>{h+=u.decode(i,{stream:!0})},"onPartData"),m=c(i=>{d.push(i)},"appendToFile"),r=c(()=>{const i=new node.File(d,a,{type:e});b.append(H,i)},"appendFileToFormData"),P=c(()=>{b.append(H,h)},"appendEntryToFormData"),u=new TextDecoder("utf-8");u.decode(),n.onPartBegin=function(){n.onPartData=g,n.onPartEnd=P,E="",l="",h="",H="",e="",a=null,d.length=0},n.onHeaderField=function(i){E+=u.decode(i,{stream:!0})},n.onHeaderValue=function(i){l+=u.decode(i,{stream:!0})},n.onHeaderEnd=function(){if(l+=u.decode(),E=E.toLowerCase(),E==="content-disposition"){const i=l.match(/\bname=("([^"]*)"|([^()<>@,;:\\"/[\]?={}\s\t]+))/i);i&&(H=i[2]||i[3]||""),a=_fileName(l),a&&(n.onPartData=m,n.onPartEnd=r)}else E==="content-type"&&(e=l);l="",E=""};for await(const i of R)n.write(i);return n.end(),b}c(toFormData,"toFormData"),exports.toFormData=toFormData;

View File

@@ -0,0 +1,2 @@
var B=Object.defineProperty;var E=(u,a)=>B(u,"name",{value:a,configurable:!0});import"node:fs";import"node:path";import{FormData as V,File as Y}from"../node.mjs";import"node:http";import"node:https";import"node:zlib";import"node:stream";import"node:buffer";import"node:util";import"../shared/node-fetch-native-with-agent.1a4a356d.mjs";import"node:url";import"node:net";let D=0;const t={START_BOUNDARY:D++,HEADER_FIELD_START:D++,HEADER_FIELD:D++,HEADER_VALUE_START:D++,HEADER_VALUE:D++,HEADER_VALUE_ALMOST_DONE:D++,HEADERS_ALMOST_DONE:D++,PART_DATA_START:D++,PART_DATA:D++,END:D++};let w=1;const R={PART_BOUNDARY:w,LAST_BOUNDARY:w*=2},g=10,N=13,x=32,P=45,C=58,I=97,M=122,$=E(u=>u|32,"lower"),m=E(()=>{},"noop"),F=class F{constructor(a){this.index=0,this.flags=0,this.onHeaderEnd=m,this.onHeaderField=m,this.onHeadersEnd=m,this.onHeaderValue=m,this.onPartBegin=m,this.onPartData=m,this.onPartEnd=m,this.boundaryChars={},a=`\r
--`+a;const n=new Uint8Array(a.length);for(let r=0;r<a.length;r++)n[r]=a.charCodeAt(r),this.boundaryChars[n[r]]=!0;this.boundary=n,this.lookbehind=new Uint8Array(this.boundary.length+8),this.state=t.START_BOUNDARY}write(a){let n=0;const r=a.length;let d=this.index,{lookbehind:l,boundary:c,boundaryChars:p,index:e,state:i,flags:A}=this;const H=this.boundary.length,O=H-1,y=a.length;let o,L;const f=E(h=>{this[h+"Mark"]=n},"mark"),s=E(h=>{delete this[h+"Mark"]},"clear"),T=E((h,S,_,U)=>{(S===void 0||S!==_)&&this[h](U&&U.subarray(S,_))},"callback"),b=E((h,S)=>{const _=h+"Mark";_ in this&&(S?(T(h,this[_],n,a),delete this[_]):(T(h,this[_],a.length,a),this[_]=0))},"dataCallback");for(n=0;n<r;n++)switch(o=a[n],i){case t.START_BOUNDARY:if(e===c.length-2){if(o===P)A|=R.LAST_BOUNDARY;else if(o!==N)return;e++;break}else if(e-1===c.length-2){if(A&R.LAST_BOUNDARY&&o===P)i=t.END,A=0;else if(!(A&R.LAST_BOUNDARY)&&o===g)e=0,T("onPartBegin"),i=t.HEADER_FIELD_START;else return;break}o!==c[e+2]&&(e=-2),o===c[e+2]&&e++;break;case t.HEADER_FIELD_START:i=t.HEADER_FIELD,f("onHeaderField"),e=0;case t.HEADER_FIELD:if(o===N){s("onHeaderField"),i=t.HEADERS_ALMOST_DONE;break}if(e++,o===P)break;if(o===C){if(e===1)return;b("onHeaderField",!0),i=t.HEADER_VALUE_START;break}if(L=$(o),L<I||L>M)return;break;case t.HEADER_VALUE_START:if(o===x)break;f("onHeaderValue"),i=t.HEADER_VALUE;case t.HEADER_VALUE:o===N&&(b("onHeaderValue",!0),T("onHeaderEnd"),i=t.HEADER_VALUE_ALMOST_DONE);break;case t.HEADER_VALUE_ALMOST_DONE:if(o!==g)return;i=t.HEADER_FIELD_START;break;case t.HEADERS_ALMOST_DONE:if(o!==g)return;T("onHeadersEnd"),i=t.PART_DATA_START;break;case t.PART_DATA_START:i=t.PART_DATA,f("onPartData");case t.PART_DATA:if(d=e,e===0){for(n+=O;n<y&&!(a[n]in p);)n+=H;n-=O,o=a[n]}if(e<c.length)c[e]===o?(e===0&&b("onPartData",!0),e++):e=0;else if(e===c.length)e++,o===N?A|=R.PART_BOUNDARY:o===P?A|=R.LAST_BOUNDARY:e=0;else if(e-1===c.length)if(A&R.PART_BOUNDARY){if(e=0,o===g){A&=~R.PART_BOUNDARY,T("onPartEnd"),T("onPartBegin"),i=t.HEADER_FIELD_START;break}}else A&R.LAST_BOUNDARY&&o===P?(T("onPartEnd"),i=t.END,A=0):e=0;if(e>0)l[e-1]=o;else if(d>0){const h=new Uint8Array(l.buffer,l.byteOffset,l.byteLength);T("onPartData",0,d,h),d=0,f("onPartData"),n--}break;case t.END:break;default:throw new Error(`Unexpected state entered: ${i}`)}b("onHeaderField"),b("onHeaderValue"),b("onPartData"),this.index=e,this.state=i,this.flags=A}end(){if(this.state===t.HEADER_FIELD_START&&this.index===0||this.state===t.PART_DATA&&this.index===this.boundary.length)this.onPartEnd();else if(this.state!==t.END)throw new Error("MultipartParser.end(): stream ended unexpectedly")}};E(F,"MultipartParser");let k=F;function v(u){const a=u.match(/\bfilename=("(.*?)"|([^()<>@,;:\\"/[\]?={}\s\t]+))($|;\s)/i);if(!a)return;const n=a[2]||a[3]||"";let r=n.slice(n.lastIndexOf("\\")+1);return r=r.replace(/%22/g,'"'),r=r.replace(/&#(\d{4});/g,(d,l)=>String.fromCharCode(l)),r}E(v,"_fileName");async function Z(u,a){if(!/multipart/i.test(a))throw new TypeError("Failed to fetch");const n=a.match(/boundary=(?:"([^"]+)"|([^;]+))/i);if(!n)throw new TypeError("no or bad content-type header, no multipart boundary");const r=new k(n[1]||n[2]);let d,l,c,p,e,i;const A=[],H=new V,O=E(s=>{c+=f.decode(s,{stream:!0})},"onPartData"),y=E(s=>{A.push(s)},"appendToFile"),o=E(()=>{const s=new Y(A,i,{type:e});H.append(p,s)},"appendFileToFormData"),L=E(()=>{H.append(p,c)},"appendEntryToFormData"),f=new TextDecoder("utf-8");f.decode(),r.onPartBegin=function(){r.onPartData=O,r.onPartEnd=L,d="",l="",c="",p="",e="",i=null,A.length=0},r.onHeaderField=function(s){d+=f.decode(s,{stream:!0})},r.onHeaderValue=function(s){l+=f.decode(s,{stream:!0})},r.onHeaderEnd=function(){if(l+=f.decode(),d=d.toLowerCase(),d==="content-disposition"){const s=l.match(/\bname=("([^"]*)"|([^()<>@,;:\\"/[\]?={}\s\t]+))/i);s&&(p=s[2]||s[3]||""),i=v(l),i&&(r.onPartData=y,r.onPartEnd=o)}else d==="content-type"&&(e=l);l="",d=""};for await(const s of u)r.write(s);return r.end(),H}E(Z,"toFormData");export{Z as toFormData};

View File

@@ -0,0 +1 @@
"use strict";var i=Object.defineProperty;var l=(r,t)=>i(r,"name",{value:t,configurable:!0});Object.defineProperty(exports,"__esModule",{value:!0});const node=require("./node.cjs");require("node:http"),require("node:https"),require("node:zlib"),require("node:stream"),require("node:buffer"),require("node:util"),require("./shared/node-fetch-native-with-agent.61758d11.cjs"),require("node:url"),require("node:net"),require("node:fs"),require("node:path");var s=Object.defineProperty,e=l((r,t)=>s(r,"name",{value:t,configurable:!0}),"e");const o=!!globalThis.process?.env?.FORCE_NODE_FETCH;function p(){return!o&&globalThis.fetch?globalThis.fetch:node.fetch}l(p,"p"),e(p,"_getFetch");const fetch=p(),Blob=!o&&globalThis.Blob||node.Blob,File=!o&&globalThis.File||node.File,FormData=!o&&globalThis.FormData||node.FormData,Headers=!o&&globalThis.Headers||node.Headers,Request=!o&&globalThis.Request||node.Request,Response=!o&&globalThis.Response||node.Response,AbortController=!o&&globalThis.AbortController||node.AbortController;exports.AbortError=node.AbortError,exports.FetchError=node.FetchError,exports.blobFrom=node.blobFrom,exports.blobFromSync=node.blobFromSync,exports.fileFrom=node.fileFrom,exports.fileFromSync=node.fileFromSync,exports.isRedirect=node.isRedirect,exports.AbortController=AbortController,exports.Blob=Blob,exports.File=File,exports.FormData=FormData,exports.Headers=Headers,exports.Request=Request,exports.Response=Response,exports.default=fetch,exports.fetch=fetch;

View File

@@ -0,0 +1 @@
var a=Object.defineProperty;var t=(e,r)=>a(e,"name",{value:r,configurable:!0});import{Blob as i,File as b,FormData as m,Headers as p,Request as n,Response as c,AbortController as h,fetch as F}from"./node.mjs";export{AbortError,FetchError,blobFrom,blobFromSync,fileFrom,fileFromSync,isRedirect}from"./node.mjs";import"node:http";import"node:https";import"node:zlib";import"node:stream";import"node:buffer";import"node:util";import"./shared/node-fetch-native-with-agent.1a4a356d.mjs";import"node:url";import"node:net";import"node:fs";import"node:path";var f=Object.defineProperty,g=t((e,r)=>f(e,"name",{value:r,configurable:!0}),"e");const o=!!globalThis.process?.env?.FORCE_NODE_FETCH;function l(){return!o&&globalThis.fetch?globalThis.fetch:F}t(l,"p"),g(l,"_getFetch");const s=l(),T=!o&&globalThis.Blob||i,R=!o&&globalThis.File||b,u=!o&&globalThis.FormData||m,d=!o&&globalThis.Headers||p,$=!o&&globalThis.Request||n,C=!o&&globalThis.Response||c,A=!o&&globalThis.AbortController||h;export{A as AbortController,T as Blob,R as File,u as FormData,d as Headers,$ as Request,C as Response,s as default,s as fetch};

View File

@@ -0,0 +1 @@
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});const Blob=globalThis.Blob,File=globalThis.File,FormData=globalThis.FormData,Headers=globalThis.Headers,Request=globalThis.Request,Response=globalThis.Response,AbortController=globalThis.AbortController,fetch=globalThis.fetch||(()=>{throw new Error("[node-fetch-native] Failed to fetch: `globalThis.fetch` is not available!")});exports.AbortController=AbortController,exports.Blob=Blob,exports.File=File,exports.FormData=FormData,exports.Headers=Headers,exports.Request=Request,exports.Response=Response,exports.default=fetch,exports.fetch=fetch;

View File

@@ -0,0 +1 @@
const e=globalThis.Blob,o=globalThis.File,a=globalThis.FormData,s=globalThis.Headers,t=globalThis.Request,h=globalThis.Response,i=globalThis.AbortController,l=globalThis.fetch||(()=>{throw new Error("[node-fetch-native] Failed to fetch: `globalThis.fetch` is not available!")});export{i as AbortController,e as Blob,o as File,a as FormData,s as Headers,t as Request,h as Response,l as default,l as fetch};

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
"use strict";var n=Object.defineProperty;var i=(r,o)=>n(r,"name",{value:o,configurable:!0});const node=require("./node.cjs");require("node:fs"),require("node:path"),require("node:http"),require("node:https"),require("node:zlib"),require("node:stream"),require("node:buffer"),require("node:util"),require("./shared/node-fetch-native-with-agent.61758d11.cjs"),require("node:url"),require("node:net");var t=Object.defineProperty,a=i((r,o)=>t(r,"name",{value:o,configurable:!0}),"a");function e(r,o){if(!(r in globalThis))try{globalThis[r]=o}catch{}}i(e,"e"),a(e,"polyfill"),e("fetch",node.fetch),e("Blob",node.Blob),e("File",node.File),e("FormData",node.FormData),e("Headers",node.Headers),e("Request",node.Request),e("Response",node.Response),e("AbortController",node.AbortController);

View File

@@ -0,0 +1 @@
var i=Object.defineProperty;var e=(r,t)=>i(r,"name",{value:t,configurable:!0});import{fetch as l,Blob as a,File as m,FormData as p,Headers as s,Request as n,Response as b,AbortController as f}from"./node.mjs";import"node:fs";import"node:path";import"node:http";import"node:https";import"node:zlib";import"node:stream";import"node:buffer";import"node:util";import"./shared/node-fetch-native-with-agent.1a4a356d.mjs";import"node:url";import"node:net";var c=Object.defineProperty,h=e((r,t)=>c(r,"name",{value:t,configurable:!0}),"a");function o(r,t){if(!(r in globalThis))try{globalThis[r]=t}catch{}}e(o,"e"),h(o,"polyfill"),o("fetch",l),o("Blob",a),o("File",m),o("FormData",p),o("Headers",s),o("Request",n),o("Response",b),o("AbortController",f);

View File

@@ -0,0 +1 @@
"use strict";var o=Object.defineProperty;var t=(c,a)=>o(c,"name",{value:a,configurable:!0});var r=Object.defineProperty,e=t((c,a)=>r(c,"name",{value:a,configurable:!0}),"e");function createProxy(){return{agent:void 0,dispatcher:void 0}}t(createProxy,"createProxy"),e(createProxy,"createProxy");function createFetch(){return globalThis.fetch}t(createFetch,"createFetch"),e(createFetch,"createFetch");const fetch=globalThis.fetch;exports.createFetch=createFetch,exports.createProxy=createProxy,exports.fetch=fetch;

View File

@@ -0,0 +1 @@
var n=Object.defineProperty;var e=(t,r)=>n(t,"name",{value:r,configurable:!0});var i=Object.defineProperty,c=e((t,r)=>i(t,"name",{value:r,configurable:!0}),"e");function a(){return{agent:void 0,dispatcher:void 0}}e(a,"createProxy"),c(a,"createProxy");function o(){return globalThis.fetch}e(o,"createFetch"),c(o,"createFetch");const h=globalThis.fetch;export{o as createFetch,a as createProxy,h as fetch};

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
var t=Object.defineProperty;var o=(e,l)=>t(e,"name",{value:l,configurable:!0});var n=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{};function f(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}o(f,"getDefaultExportFromCjs");export{n as c,f as g};

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
"use strict";var l=Object.defineProperty;var o=(e,t)=>l(e,"name",{value:t,configurable:!0});var commonjsGlobal=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{};function getDefaultExportFromCjs(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}o(getDefaultExportFromCjs,"getDefaultExportFromCjs"),exports.commonjsGlobal=commonjsGlobal,exports.getDefaultExportFromCjs=getDefaultExportFromCjs;

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
export * from "./lib/index";

View File

@@ -0,0 +1,24 @@
import type * as http from "node:http";
import type * as https from "node:https";
import type * as undici from "undici";
export type AgentOptions = {
/**
* Reject unauthorized TLS certificates, default is `true`
*/
rejectUnauthorized?: boolean;
};
export declare const createAgent: (
uri?: string,
opts?: AgentOptions,
) => {
agent: http.Agent | https.Agent | undefined;
dispatcher: undici.Dispatcher | undefined;
};
export declare const createFetch: (
agentOptions?: AgentOptions,
) => typeof globalThis.fetch;
export declare const fetch: typeof globalThis.fetch;

View File

View File

View File

@@ -0,0 +1,11 @@
const nodeFetch = require("../dist/index.cjs");
function fetch(input, options) {
return nodeFetch.fetch(input, options);
}
for (const key in nodeFetch) {
fetch[key] = nodeFetch[key];
}
module.exports = fetch;

View File

@@ -0,0 +1,10 @@
export declare const fetch: typeof globalThis.fetch;
export declare const Blob: typeof globalThis.Blob;
export declare const File: typeof globalThis.File;
export declare const FormData: typeof globalThis.FormData;
export declare const Headers: typeof globalThis.Headers;
export declare const Request: typeof globalThis.Request;
export declare const Response: typeof globalThis.Response;
export declare const AbortController: typeof globalThis.AbortController;
export default fetch;

View File

@@ -0,0 +1,10 @@
export declare const fetch: typeof globalThis.fetch;
export declare const Blob: typeof globalThis.Blob;
export declare const File: typeof globalThis.File;
export declare const FormData: typeof globalThis.FormData;
export declare const Headers: typeof globalThis.Headers;
export declare const Request: typeof globalThis.Request;
export declare const Response: typeof globalThis.Response;
export declare const AbortController: typeof globalThis.AbortController;
export default fetch;

View File

@@ -0,0 +1,10 @@
export declare const fetch: typeof globalThis.fetch;
export declare const Blob: typeof globalThis.Blob;
export declare const File: typeof globalThis.File;
export declare const FormData: typeof globalThis.FormData;
export declare const Headers: typeof globalThis.Headers;
export declare const Request: typeof globalThis.Request;
export declare const Response: typeof globalThis.Response;
export declare const AbortController: typeof globalThis.AbortController;
export default fetch;

View File

@@ -0,0 +1,11 @@
const nodeFetch = require("../dist/native.cjs");
function fetch(input, options) {
return nodeFetch.fetch(input, options);
}
for (const key in nodeFetch) {
fetch[key] = nodeFetch[key];
}
module.exports = fetch;

View File

@@ -0,0 +1 @@
export {};

View File

@@ -0,0 +1 @@
export {};

View File

@@ -0,0 +1 @@
export {};

View File

@@ -0,0 +1,32 @@
import type * as http from "node:http";
import type * as https from "node:https";
import type * as undici from "undici";
export type ProxyOptions = {
/**
* HTTP(s) Proxy URL
*
* Default is read from `https_proxy`, `http_proxy`, `HTTPS_PROXY` or `HTTP_PROXY` environment variables
* */
url?: string;
/**
* List of hosts to skip proxy for (comma separated or array of strings)
*
* Default is read from `no_proxy` or `NO_PROXY` environment variables
*
* Hots starting with a leading dot, like `.foo.com` are also matched against domain and all its subdomains like `bar.foo.com`
*/
noProxy?: string | string[];
};
export declare const createProxy: (opts?: ProxyOptions) => {
agent: http.Agent | https.Agent | undefined;
dispatcher: undici.Dispatcher | undefined;
};
export declare const createFetch: (
proxyOptions?: ProxyOptions,
) => typeof globalThis.fetch;
export declare const fetch: typeof globalThis.fetch;

View File

@@ -0,0 +1 @@
export * from "./lib/index";

View File

@@ -0,0 +1,155 @@
{
"name": "node-fetch-native-with-agent",
"version": "1.7.2",
"description": "Fork of node-fetch-native with support for custom agents",
"repository": "loks0n/node-fetch-native",
"license": "MIT",
"type": "module",
"exports": {
".": {
"browser": "./dist/native.mjs",
"bun": "./dist/native.mjs",
"deno": "./dist/native.mjs",
"edge-light": "./dist/native.mjs",
"edge-routine": "./dist/native.mjs",
"lagon": "./dist/native.mjs",
"netlify": "./dist/native.mjs",
"react-native": "./dist/native.mjs",
"wintercg": "./dist/native.mjs",
"worker": "./dist/native.mjs",
"workerd": "./dist/native.mjs",
"node": {
"import": {
"types": "./lib/index.d.mts",
"default": "./dist/index.mjs"
},
"require": {
"types": "./lib/index.d.cts",
"default": "./lib/index.cjs"
}
},
"types": "./lib/index.d.mts",
"import": "./dist/native.mjs",
"require": "./dist/native.cjs",
"default": "./dist/native.mjs"
},
"./polyfill": {
"node": {
"import": {
"types": "./lib/polyfill.d.mts",
"default": "./dist/polyfill.mjs"
},
"require": {
"types": "./lib/polyfill.d.cts",
"default": "./dist/polyfill.cjs"
}
},
"types": "./lib/polyfill.d.mts",
"import": "./lib/empty.mjs",
"require": "./lib/empty.cjs",
"default": "./lib/empty.mjs"
},
"./node": {
"import": {
"types": "./lib/index.d.mts",
"default": "./dist/node.mjs"
},
"require": {
"types": "./lib/index.d.cts",
"default": "./dist/node.cjs"
}
},
"./native": {
"import": {
"types": "./lib/index.d.mts",
"default": "./dist/native.mjs"
},
"require": {
"types": "./lib/index.d.cts",
"default": "./lib/native.cjs"
}
},
"./src/index.js": {
"import": {
"types": "./lib/index.d.mts",
"default": "./dist/index.mjs"
},
"require": {
"types": "./lib/index.d.cts",
"default": "./lib/index.cjs"
}
},
"./proxy": {
"node": {
"types": "./lib/proxy.d.ts",
"default": "./dist/proxy.cjs"
},
"default": {
"import": {
"types": "./lib/proxy.d.ts",
"default": "./dist/proxy-stub.mjs"
},
"require": {
"types": "./lib/proxy.d.ts",
"default": "./dist/proxy-stub.cjs"
}
}
},
"./agent": {
"node": {
"types": "./lib/agent.d.ts",
"default": "./dist/agent.cjs"
},
"default": {
"import": {
"types": "./lib/agent.d.ts",
"default": "./dist/agent-stub.mjs"
},
"require": {
"types": "./lib/agent.d.ts",
"default": "./dist/agent-stub.cjs"
}
}
}
},
"main": "./lib/index.cjs",
"module": "./dist/index.mjs",
"react-native": "./dist/native.mjs",
"types": "./lib/index.d.mts",
"files": [
"dist",
"lib",
"index.d.ts",
"node.d.ts",
"polyfill.d.ts",
"proxy.d.ts",
"agent.d.ts"
],
"scripts": {
"build": "unbuild",
"lint": "eslint --ext .ts,.js,.mjs,.cjs . && prettier -c src test lib",
"lint:fix": "eslint --fix --ext .ts,.js,.mjs,.cjs . && prettier -w src test lib",
"prepack": "unbuild",
"release": "pnpm test && changelogen --release && npm publish && git push --follow-tags",
"test": "pnpm lint && pnpm build && vitest run --coverage"
},
"devDependencies": {
"@types/node": "^20.11.30",
"@vitest/coverage-v8": "^1.4.0",
"abort-controller": "^3.0.0",
"agent-base": "^7.1.0",
"changelogen": "^0.5.5",
"eslint": "^8.57.0",
"eslint-config-unjs": "^0.2.1",
"http-proxy-agent": "^7.0.2",
"https-proxy-agent": "^7.0.4",
"node-fetch": "^3.3.2",
"prettier": "^3.2.5",
"proxy-agent": "^6.4.0",
"typescript": "^5.4.3",
"unbuild": "^2.0.0",
"undici": "^6.10.2",
"vitest": "^1.4.0"
},
"packageManager": "pnpm@8.15.5"
}

View File

@@ -0,0 +1 @@
export {};

View File

@@ -0,0 +1 @@
export * from "./lib/proxy";