spiceflow 0.0.7 → 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.
Files changed (151) hide show
  1. package/README.md +1 -171
  2. package/dist/client/errors.d.ts +7 -0
  3. package/dist/client/errors.d.ts.map +1 -0
  4. package/dist/client/errors.js +18 -0
  5. package/dist/client/errors.js.map +1 -0
  6. package/dist/client/index.d.ts +15 -0
  7. package/dist/client/index.d.ts.map +1 -0
  8. package/dist/client/index.js +376 -0
  9. package/dist/client/index.js.map +1 -0
  10. package/dist/client/types.d.ts +87 -0
  11. package/dist/client/types.d.ts.map +1 -0
  12. package/dist/client/types.js +2 -0
  13. package/dist/client/types.js.map +1 -0
  14. package/dist/client/utils.d.ts +2 -0
  15. package/dist/client/utils.d.ts.map +1 -0
  16. package/dist/client/utils.js +9 -0
  17. package/dist/client/utils.js.map +1 -0
  18. package/dist/client/ws.d.ts +15 -0
  19. package/dist/client/ws.d.ts.map +1 -0
  20. package/dist/client/ws.js +51 -0
  21. package/dist/client/ws.js.map +1 -0
  22. package/dist/client.test.d.ts +2 -0
  23. package/dist/client.test.d.ts.map +1 -0
  24. package/dist/client.test.js +237 -0
  25. package/dist/client.test.js.map +1 -0
  26. package/dist/elysia-fork/context.d.ts +87 -0
  27. package/dist/elysia-fork/context.d.ts.map +1 -0
  28. package/dist/elysia-fork/context.js +2 -0
  29. package/dist/elysia-fork/context.js.map +1 -0
  30. package/dist/elysia-fork/error.d.ts +246 -0
  31. package/dist/elysia-fork/error.d.ts.map +1 -0
  32. package/dist/elysia-fork/error.js +195 -0
  33. package/dist/elysia-fork/error.js.map +1 -0
  34. package/dist/elysia-fork/types.d.ts +570 -0
  35. package/dist/elysia-fork/types.d.ts.map +1 -0
  36. package/dist/elysia-fork/types.js +3 -0
  37. package/dist/elysia-fork/types.js.map +1 -0
  38. package/dist/elysia-fork/utils.d.ts +134 -0
  39. package/dist/elysia-fork/utils.d.ts.map +1 -0
  40. package/dist/elysia-fork/utils.js +70 -0
  41. package/dist/elysia-fork/utils.js.map +1 -0
  42. package/dist/index.d.ts +2 -7
  43. package/dist/index.d.ts.map +1 -1
  44. package/dist/index.js +1 -22
  45. package/dist/index.js.map +1 -1
  46. package/dist/spiceflow.d.ts +237 -0
  47. package/dist/spiceflow.d.ts.map +1 -0
  48. package/dist/spiceflow.js +484 -0
  49. package/dist/spiceflow.js.map +1 -0
  50. package/dist/spiceflow.test.d.ts +2 -0
  51. package/dist/spiceflow.test.d.ts.map +1 -0
  52. package/dist/spiceflow.test.js +225 -0
  53. package/dist/spiceflow.test.js.map +1 -0
  54. package/dist/stream.test.d.ts +2 -0
  55. package/dist/stream.test.d.ts.map +1 -0
  56. package/dist/stream.test.js +286 -0
  57. package/dist/stream.test.js.map +1 -0
  58. package/dist/types.d.ts +1 -0
  59. package/dist/types.d.ts.map +1 -0
  60. package/dist/types.js +2 -0
  61. package/dist/types.js.map +1 -0
  62. package/dist/utils.d.ts +4 -20
  63. package/dist/utils.d.ts.map +1 -1
  64. package/dist/utils.js +17 -46
  65. package/dist/utils.js.map +1 -1
  66. package/package.json +12 -37
  67. package/src/client/errors.ts +21 -0
  68. package/src/client/index.ts +541 -0
  69. package/src/client/types.ts +233 -0
  70. package/src/client/utils.ts +7 -0
  71. package/src/client/ws.ts +99 -0
  72. package/src/client.test.ts +235 -0
  73. package/src/elysia-fork/context.ts +196 -0
  74. package/src/elysia-fork/error.ts +293 -0
  75. package/src/elysia-fork/types.ts +1353 -0
  76. package/src/elysia-fork/utils.ts +85 -0
  77. package/src/index.ts +2 -34
  78. package/src/spiceflow.test.ts +290 -0
  79. package/src/spiceflow.ts +1251 -0
  80. package/src/stream.test.ts +342 -0
  81. package/src/types.ts +0 -0
  82. package/src/utils.ts +21 -70
  83. package/context.d.ts +0 -2
  84. package/context.js +0 -1
  85. package/dist/babel.test.d.ts +0 -2
  86. package/dist/babel.test.d.ts.map +0 -1
  87. package/dist/babel.test.js +0 -27
  88. package/dist/babel.test.js.map +0 -1
  89. package/dist/babelDebugOutputs.d.ts +0 -9
  90. package/dist/babelDebugOutputs.d.ts.map +0 -1
  91. package/dist/babelDebugOutputs.js +0 -34
  92. package/dist/babelDebugOutputs.js.map +0 -1
  93. package/dist/babelTransformRpc.d.ts +0 -19
  94. package/dist/babelTransformRpc.d.ts.map +0 -1
  95. package/dist/babelTransformRpc.js +0 -285
  96. package/dist/babelTransformRpc.js.map +0 -1
  97. package/dist/browser.d.ts +0 -8
  98. package/dist/browser.d.ts.map +0 -1
  99. package/dist/browser.js +0 -126
  100. package/dist/browser.js.map +0 -1
  101. package/dist/build.d.ts +0 -13
  102. package/dist/build.d.ts.map +0 -1
  103. package/dist/build.js +0 -230
  104. package/dist/build.js.map +0 -1
  105. package/dist/cli.d.ts +0 -3
  106. package/dist/cli.d.ts.map +0 -1
  107. package/dist/cli.js +0 -111
  108. package/dist/cli.js.map +0 -1
  109. package/dist/context-internal.d.ts +0 -20
  110. package/dist/context-internal.d.ts.map +0 -1
  111. package/dist/context-internal.js +0 -16
  112. package/dist/context-internal.js.map +0 -1
  113. package/dist/context.d.ts +0 -2
  114. package/dist/context.d.ts.map +0 -1
  115. package/dist/context.js +0 -2
  116. package/dist/context.js.map +0 -1
  117. package/dist/expose.d.ts +0 -6
  118. package/dist/expose.d.ts.map +0 -1
  119. package/dist/expose.js +0 -32
  120. package/dist/expose.js.map +0 -1
  121. package/dist/headers.d.ts +0 -2
  122. package/dist/headers.d.ts.map +0 -1
  123. package/dist/headers.js +0 -18
  124. package/dist/headers.js.map +0 -1
  125. package/dist/jsonRpc.d.ts +0 -32
  126. package/dist/jsonRpc.d.ts.map +0 -1
  127. package/dist/jsonRpc.js +0 -3
  128. package/dist/jsonRpc.js.map +0 -1
  129. package/dist/server.d.ts +0 -32
  130. package/dist/server.d.ts.map +0 -1
  131. package/dist/server.js +0 -292
  132. package/dist/server.js.map +0 -1
  133. package/headers.d.ts +0 -2
  134. package/headers.js +0 -1
  135. package/sdk-template/package.json +0 -22
  136. package/sdk-template/src/index.ts +0 -2
  137. package/sdk-template/src/v1/example.ts +0 -5
  138. package/sdk-template/src/v1/generator.ts +0 -12
  139. package/sdk-template/tsconfig.json +0 -16
  140. package/src/babel.test.ts +0 -35
  141. package/src/babelDebugOutputs.ts +0 -56
  142. package/src/babelTransformRpc.ts +0 -394
  143. package/src/browser.ts +0 -141
  144. package/src/build.ts +0 -298
  145. package/src/cli.ts +0 -132
  146. package/src/context-internal.ts +0 -36
  147. package/src/context.ts +0 -5
  148. package/src/expose.ts +0 -34
  149. package/src/headers.ts +0 -19
  150. package/src/jsonRpc.ts +0 -43
  151. package/src/server.ts +0 -384
package/README.md CHANGED
@@ -4,177 +4,7 @@
4
4
  <br/>
5
5
  <h3>spiceflow</h3>
6
6
  <br/>
7
- <p>If GraphQL, JSON-RPC and React server actions had a baby</p>
7
+ <p>API framework fast, simple and type safe</p>
8
8
  <br/>
9
9
  <br/>
10
-
11
10
  </div>
12
-
13
- ## What is spiceflow?
14
-
15
- Spiceflow is the fastest way to write and expose an RPC API. In Spiceflow any files with the directive `'use spiceflow'` will be processed as an API route, each function defined in the file will be exposed as an JSON-RPC method.
16
-
17
- After defining your functions you can call `spiceflow serve` to start a server exposing your API, you can also espose the API using the Next.js or your own server.
18
-
19
- When calling `spiceflow build` spiceflow will generate a client side SDK for your API, you can use it to call your API from the browser. This client SDK will be type safe, because the functions are called the same way from the server and the client, so types can be reused (after being bundled with @microsoft/api-extractor).
20
-
21
- You can publish this SDK to npm and let your users interact with your API in an easy and type safe way.
22
-
23
- ## Installation
24
-
25
- ```bash
26
- npm i spiceflow
27
- ```
28
-
29
- ## Usage
30
-
31
- ```bash
32
- # create a new spiceflow project, works best in a monorepo
33
- npx spiceflow init --name my-api
34
- # .
35
- # ├── package.json
36
- # ├── src
37
- # │ ├── index.ts
38
- # │ └── v1
39
- # │ ├── example.ts
40
- # │ └── generator.ts
41
- # └── tsconfig.json
42
-
43
- npx spiceflow serve # builds the sdk in the dist folder and starts serving your API
44
-
45
- npm run try-sdk # try using the sdk
46
- ```
47
-
48
- ## Writing your API functions
49
-
50
- #### Any functions exported in a file with the `'use spiceflow'` directive will be processed as an API route, each function defined in the file will be exposed as an JSON-RPC method.
51
-
52
- ```ts
53
- // src/v1/functions.ts
54
- 'use spiceflow';
55
-
56
- export async function spiceflowFunction() {
57
- return { hello: 'world' };
58
- }
59
-
60
- export async function* spiceflowGenerator() {
61
- for (let i = 0; i < 10; i++) {
62
- await sleep(300);
63
- yield { i };
64
- }
65
- }
66
-
67
- function sleep(ms: number) {
68
- return new Promise((resolve) => setTimeout(resolve, ms));
69
- }
70
- ```
71
-
72
- #### Build and serve the API
73
-
74
- ```bash
75
- spiceflow serve --watch
76
- ```
77
-
78
- #### Call your function from the client, these will use fetch to communicate with the server
79
-
80
- ```ts
81
- import {
82
- spiceflowFunction,
83
- spiceflowGenerator,
84
- } from './my-api/dist/v1/functions';
85
-
86
- // will call the server with fetch
87
- const { hello } = await spiceflowFunction();
88
-
89
- for await (const { i } of spiceflowGenerator()) {
90
- console.log(i);
91
- }
92
- ```
93
-
94
- ## Serving your API
95
-
96
- Spiceflow has 3 ways to serve your API:
97
-
98
- ### Built-in Node.js server
99
-
100
- ```
101
- spiceflow serve --port 3333
102
- ```
103
-
104
- ### Next.js pages API handler
105
-
106
- > Note: You will need to call `spiceflow build` before using the SDK when using this method
107
-
108
- ```tsx
109
- // pages/api/spiceflow/[...slug].tsx
110
- import { nodeJsHandler } from './my-api/server';
111
-
112
- export default async function handler(req, res) {
113
- return await nodeJsHandler({ req, res, basePath: '/api/spiceflow' });
114
- }
115
- ```
116
-
117
- ### Next.js app API route
118
-
119
- ```tsx
120
- // pages/api/spiceflow/[...slug]/route.tsx
121
- import { edgeHandler } from './my-api/server';
122
-
123
- export const POST = edgeHandler;
124
- ```
125
-
126
- After exposing your server you will need to rebuild your client sdk using that url:
127
-
128
- ```bash
129
- spiceflow build --url http://localhost:3000/api/spiceflow # the Next.js app url
130
- ```
131
-
132
- ## Accessing the request and response objects
133
-
134
- This plugin injects the `req` and `res` objects in an `AsyncLocalStorage` context, so you can access them in your server functions:
135
-
136
- ```ts
137
- 'use spiceflow';
138
-
139
- import { getNodejsContext } from 'spiceflow/context';
140
-
141
- export async function serverAction({}) {
142
- const { req } = getNodejsContext();
143
- const host = req?.headers.get('host');
144
- return { host };
145
- }
146
- ```
147
-
148
- ## Adding error logging and handling
149
-
150
- You can export a function named `wrapMethod` to easily wrap all your server actions with error logging or other wrappers
151
-
152
- ```ts
153
- 'use spiceflow';
154
-
155
- export function wrapMethod(fn) {
156
- return async (...args) => {
157
- try {
158
- const res = await fn(...args);
159
- return res;
160
- } catch (error) {
161
- console.error(error);
162
- throw error;
163
- }
164
- };
165
- }
166
-
167
- export async function failingFunction({}) {
168
- throw new Error('This function fails');
169
- }
170
- ```
171
-
172
- ## Versioning
173
-
174
- You can create a `v1` folder in your project and exports your function from `index.ts`, when you want to release a breaking version of your API, you can create a new folder and change the imports in `index.ts` file. This way the sdk users will always use the latest version of your API, while old SDK users will keep the old version.
175
-
176
- ## How it works
177
-
178
- Spiceflow `build` command transpiles the files with the `use spiceflow` directive so that any exported function will use fetch to send arguments and get the result, the the transformed files are saved in the `dist` folder.Other files are compiled to the dist directory using `tsc`.
179
-
180
- Spiceflow also bundles the type definitions with `@microsoft/api-extractor` so the generated dist files don't rely on external local packages and can be safely published to npm.
@@ -0,0 +1,7 @@
1
+ export declare class EdenFetchError<Status = number, Value extends any = any> extends Error {
2
+ status: Status;
3
+ passedValue: Value;
4
+ value: Value;
5
+ constructor(status: Status, passedValue: Value);
6
+ }
7
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/client/errors.ts"],"names":[],"mappings":"AAAA,qBAAa,cAAc,CACvB,MAAM,GAAG,MAAM,EACf,KAAK,SAAS,GAAG,GAAG,GAAG,CACzB,SAAQ,KAAK;IAGA,MAAM,EAAE,MAAM;IACd,WAAW,EAAE,KAAK;IAH7B,KAAK,EAAE,KAAK,CAAA;gBAED,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,KAAK;CAahC"}
@@ -0,0 +1,18 @@
1
+ export class EdenFetchError extends Error {
2
+ constructor(status, passedValue) {
3
+ let message = String((passedValue === null || passedValue === void 0 ? void 0 : passedValue.message) || '');
4
+ if (!message) {
5
+ if (typeof passedValue === 'object') {
6
+ message = JSON.stringify(passedValue);
7
+ }
8
+ else {
9
+ message = String(passedValue || '');
10
+ }
11
+ }
12
+ super(message);
13
+ this.status = status;
14
+ this.passedValue = passedValue;
15
+ this.value = passedValue;
16
+ }
17
+ }
18
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/client/errors.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,cAGX,SAAQ,KAAK;IAEX,YACW,MAAc,EACd,WAAkB;QAEzB,IAAI,OAAO,GAAG,MAAM,CAAC,CAAC,WAAmB,aAAnB,WAAW,uBAAX,WAAW,CAAU,OAAO,KAAI,EAAE,CAAC,CAAA;QACzD,IAAI,CAAC,OAAO,EAAE,CAAC;YACX,IAAI,OAAO,WAAW,KAAK,QAAQ,EAAE,CAAC;gBAClC,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,CAAA;YACzC,CAAC;iBAAM,CAAC;gBACJ,OAAO,GAAG,MAAM,CAAC,WAAW,IAAI,EAAE,CAAC,CAAA;YACvC,CAAC;QACL,CAAC;QACD,KAAK,CAAC,OAAO,CAAC,CAAA;QAXP,WAAM,GAAN,MAAM,CAAQ;QACd,gBAAW,GAAX,WAAW,CAAO;QAWzB,IAAI,CAAC,KAAK,GAAG,WAAW,CAAA;IAC5B,CAAC;CACJ"}
@@ -0,0 +1,15 @@
1
+ import type { Spiceflow } from '../spiceflow';
2
+ import type { SpiceflowClient } from './types';
3
+ export { SpiceflowClient };
4
+ interface SSEEvent {
5
+ event: string;
6
+ data: any;
7
+ id?: string;
8
+ }
9
+ export declare class TextDecoderStream extends TransformStream<Uint8Array, string> {
10
+ constructor();
11
+ }
12
+ export declare function streamSSEResponse(response: Response): AsyncGenerator<SSEEvent>;
13
+ export declare const createSpiceflowClient: <const App extends Spiceflow<any, any, any, any, any, any, any, any>>(domain: string | App, config?: SpiceflowClient.Config) => SpiceflowClient.Create<App>;
14
+ export type { SpiceflowClient as Treaty };
15
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AAG7C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA;AAE9C,OAAO,EAAE,eAAe,EAAE,CAAA;AA8G1B,UAAU,QAAQ;IACjB,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,GAAG,CAAA;IACT,EAAE,CAAC,EAAE,MAAM,CAAA;CACX;AAED,qBAAa,iBAAkB,SAAQ,eAAe,CAAC,UAAU,EAAE,MAAM,CAAC;;CAwBzE;AAED,wBAAuB,iBAAiB,CACvC,QAAQ,EAAE,QAAQ,GAChB,cAAc,CAAC,QAAQ,CAAC,CAmB1B;AAqVD,eAAO,MAAM,qBAAqB,gFAGzB,MAAM,GAAG,GAAG,WACZ,gBAAgB,MAAM,KAC5B,gBAAgB,MAAM,CAAC,GAAG,CAqB5B,CAAA;AAED,YAAY,EAAE,eAAe,IAAI,MAAM,EAAE,CAAA"}
@@ -0,0 +1,376 @@
1
+ var __await = (this && this.__await) || function (v) { return this instanceof __await ? (this.v = v, this) : new __await(v); }
2
+ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _arguments, generator) {
3
+ if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
4
+ var g = generator.apply(thisArg, _arguments || []), i, q = [];
5
+ return i = {}, verb("next"), verb("throw"), verb("return", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;
6
+ function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }
7
+ function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }
8
+ function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }
9
+ function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }
10
+ function fulfill(value) { resume("next", value); }
11
+ function reject(value) { resume("throw", value); }
12
+ function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }
13
+ };
14
+ import { EventSourceParserStream } from 'eventsource-parser/stream';
15
+ import { EdenFetchError } from './errors';
16
+ // import { EdenWS } from './ws'
17
+ import { parseStringifiedValue } from './utils';
18
+ const method = [
19
+ 'get',
20
+ 'post',
21
+ 'put',
22
+ 'delete',
23
+ 'patch',
24
+ 'options',
25
+ 'head',
26
+ 'connect',
27
+ 'subscribe'
28
+ ];
29
+ const locals = ['localhost', '127.0.0.1', '0.0.0.0'];
30
+ const isServer = typeof FileList === 'undefined';
31
+ const isFile = (v) => {
32
+ if (isServer)
33
+ return v instanceof Blob;
34
+ return v instanceof FileList || v instanceof File;
35
+ };
36
+ // FormData is 1 level deep
37
+ const hasFile = (obj) => {
38
+ if (!obj)
39
+ return false;
40
+ for (const key in obj) {
41
+ if (isFile(obj[key]))
42
+ return true;
43
+ if (Array.isArray(obj[key]) && obj[key].find(isFile))
44
+ return true;
45
+ }
46
+ return false;
47
+ };
48
+ const createNewFile = (v) => isServer
49
+ ? v
50
+ : new Promise((resolve) => {
51
+ const reader = new FileReader();
52
+ reader.onload = () => {
53
+ const file = new File([reader.result], v.name, {
54
+ lastModified: v.lastModified,
55
+ type: v.type
56
+ });
57
+ resolve(file);
58
+ };
59
+ reader.readAsArrayBuffer(v);
60
+ });
61
+ const processHeaders = (h, path, options = {}, headers = {}) => {
62
+ if (Array.isArray(h)) {
63
+ for (const value of h)
64
+ if (!Array.isArray(value))
65
+ headers = processHeaders(value, path, options, headers);
66
+ else {
67
+ const key = value[0];
68
+ if (typeof key === 'string')
69
+ headers[key.toLowerCase()] = value[1];
70
+ else
71
+ for (const [k, value] of key)
72
+ headers[k.toLowerCase()] = value;
73
+ }
74
+ return headers;
75
+ }
76
+ if (!h)
77
+ return headers;
78
+ switch (typeof h) {
79
+ case 'function':
80
+ if (h instanceof Headers)
81
+ return processHeaders(h, path, options, headers);
82
+ const v = h(path, options);
83
+ if (v)
84
+ return processHeaders(v, path, options, headers);
85
+ return headers;
86
+ case 'object':
87
+ if (h instanceof Headers) {
88
+ h.forEach((value, key) => {
89
+ headers[key.toLowerCase()] = value;
90
+ });
91
+ return headers;
92
+ }
93
+ for (const [key, value] of Object.entries(h))
94
+ headers[key.toLowerCase()] = value;
95
+ return headers;
96
+ default:
97
+ return headers;
98
+ }
99
+ };
100
+ export class TextDecoderStream extends TransformStream {
101
+ constructor() {
102
+ const decoder = new TextDecoder('utf-8', {
103
+ fatal: true,
104
+ ignoreBOM: true
105
+ });
106
+ super({
107
+ transform(chunk, controller) {
108
+ const decoded = decoder.decode(chunk, { stream: true });
109
+ if (decoded.length > 0) {
110
+ controller.enqueue(decoded);
111
+ }
112
+ },
113
+ flush(controller) {
114
+ const output = decoder.decode();
115
+ if (output.length > 0) {
116
+ controller.enqueue(output);
117
+ }
118
+ }
119
+ });
120
+ }
121
+ }
122
+ export function streamSSEResponse(response) {
123
+ return __asyncGenerator(this, arguments, function* streamSSEResponse_1() {
124
+ const body = response.body;
125
+ if (!body)
126
+ return yield __await(void 0);
127
+ const eventStream = response.body
128
+ .pipeThrough(new TextDecoderStream())
129
+ .pipeThrough(new EventSourceParserStream());
130
+ let reader = eventStream.getReader();
131
+ while (true) {
132
+ const { done, value: event } = yield __await(reader.read());
133
+ if (done)
134
+ break;
135
+ if ((event === null || event === void 0 ? void 0 : event.event) === 'error') {
136
+ throw new EdenFetchError(500, event.data);
137
+ }
138
+ if (event) {
139
+ yield yield __await(tryParsingJson(event.data));
140
+ }
141
+ }
142
+ });
143
+ }
144
+ function tryParsingJson(data) {
145
+ try {
146
+ return JSON.parse(data);
147
+ }
148
+ catch (error) {
149
+ return null;
150
+ }
151
+ }
152
+ const createProxy = (domain, config, paths = [], instance) => new Proxy(() => { }, {
153
+ get(_, param) {
154
+ return createProxy(domain, config, param === 'index' ? paths : [...paths, param], instance);
155
+ },
156
+ apply(_, __, [body, options]) {
157
+ if (!body ||
158
+ options ||
159
+ (typeof body === 'object' && Object.keys(body).length !== 1) ||
160
+ method.includes(paths.at(-1))) {
161
+ const methodPaths = [...paths];
162
+ const method = methodPaths.pop();
163
+ const path = '/' + methodPaths.join('/');
164
+ let { fetcher = fetch, headers, onRequest, onResponse, fetch: conf } = config;
165
+ const isGetOrHead = method === 'get' ||
166
+ method === 'head' ||
167
+ method === 'subscribe';
168
+ headers = processHeaders(headers, path, options);
169
+ const query = isGetOrHead
170
+ ? body === null || body === void 0 ? void 0 : body.query
171
+ : options === null || options === void 0 ? void 0 : options.query;
172
+ let q = '';
173
+ if (query) {
174
+ const append = (key, value) => {
175
+ q +=
176
+ (q ? '&' : '?') +
177
+ `${encodeURIComponent(key)}=${encodeURIComponent(value)}`;
178
+ };
179
+ for (const [key, value] of Object.entries(query)) {
180
+ if (Array.isArray(value)) {
181
+ for (const v of value)
182
+ append(key, v);
183
+ continue;
184
+ }
185
+ if (typeof value === 'object') {
186
+ append(key, JSON.stringify(value));
187
+ continue;
188
+ }
189
+ append(key, `${value}`);
190
+ }
191
+ }
192
+ // if (method === 'subscribe') {
193
+ // const url =
194
+ // domain.replace(
195
+ // /^([^]+):\/\//,
196
+ // domain.startsWith('https://')
197
+ // ? 'wss://'
198
+ // : domain.startsWith('http://')
199
+ // ? 'ws://'
200
+ // : locals.find((v) =>
201
+ // (domain as string).includes(v)
202
+ // )
203
+ // ? 'ws://'
204
+ // : 'wss://'
205
+ // ) +
206
+ // path +
207
+ // q
208
+ // return new EdenWS(url)
209
+ // }
210
+ return (async () => {
211
+ var _a, _b;
212
+ let fetchInit = Object.assign(Object.assign({ method: method === null || method === void 0 ? void 0 : method.toUpperCase(), body }, conf), { headers });
213
+ fetchInit.headers = Object.assign(Object.assign({}, headers), processHeaders(
214
+ // For GET and HEAD, options is moved to body (1st param)
215
+ isGetOrHead ? body === null || body === void 0 ? void 0 : body.headers : options === null || options === void 0 ? void 0 : options.headers, path, fetchInit));
216
+ const fetchOpts = isGetOrHead && typeof body === 'object'
217
+ ? body.fetch
218
+ : options === null || options === void 0 ? void 0 : options.fetch;
219
+ fetchInit = Object.assign(Object.assign({}, fetchInit), fetchOpts);
220
+ if (isGetOrHead)
221
+ delete fetchInit.body;
222
+ if (onRequest) {
223
+ if (!Array.isArray(onRequest))
224
+ onRequest = [onRequest];
225
+ for (const value of onRequest) {
226
+ const temp = await value(path, fetchInit);
227
+ if (typeof temp === 'object')
228
+ fetchInit = Object.assign(Object.assign(Object.assign({}, fetchInit), temp), { headers: Object.assign(Object.assign({}, fetchInit.headers), processHeaders(temp.headers, path, fetchInit)) });
229
+ }
230
+ }
231
+ // ? Duplicate because end-user might add a body in onRequest
232
+ if (isGetOrHead)
233
+ delete fetchInit.body;
234
+ if (hasFile(body)) {
235
+ const formData = new FormData();
236
+ // FormData is 1 level deep
237
+ for (const [key, field] of Object.entries(fetchInit.body)) {
238
+ if (isServer) {
239
+ formData.append(key, field);
240
+ continue;
241
+ }
242
+ if (field instanceof File) {
243
+ formData.append(key, await createNewFile(field));
244
+ continue;
245
+ }
246
+ if (field instanceof FileList) {
247
+ for (let i = 0; i < field.length; i++)
248
+ formData.append(key, await createNewFile(field[i]));
249
+ continue;
250
+ }
251
+ if (Array.isArray(field)) {
252
+ for (let i = 0; i < field.length; i++) {
253
+ const value = field[i];
254
+ formData.append(key, value instanceof File
255
+ ? await createNewFile(value)
256
+ : value);
257
+ }
258
+ continue;
259
+ }
260
+ formData.append(key, field);
261
+ }
262
+ // We don't do this because we need to let the browser set the content type with the correct boundary
263
+ // fetchInit.headers['content-type'] = 'multipart/form-data'
264
+ fetchInit.body = formData;
265
+ }
266
+ else if (typeof body === 'object') {
267
+ ;
268
+ fetchInit.headers['content-type'] = 'application/json';
269
+ fetchInit.body = JSON.stringify(body);
270
+ }
271
+ else if (body !== undefined && body !== null) {
272
+ ;
273
+ fetchInit.headers['content-type'] = 'text/plain';
274
+ }
275
+ if (isGetOrHead)
276
+ delete fetchInit.body;
277
+ if (onRequest) {
278
+ if (!Array.isArray(onRequest))
279
+ onRequest = [onRequest];
280
+ for (const value of onRequest) {
281
+ const temp = await value(path, fetchInit);
282
+ if (typeof temp === 'object')
283
+ fetchInit = Object.assign(Object.assign(Object.assign({}, fetchInit), temp), { headers: Object.assign(Object.assign({}, fetchInit.headers), processHeaders(temp.headers, path, fetchInit)) });
284
+ }
285
+ }
286
+ const url = domain + path + q;
287
+ const response = await ((_a = instance === null || instance === void 0 ? void 0 : instance.handle(new Request(url, fetchInit))) !== null && _a !== void 0 ? _a : fetcher(url, fetchInit));
288
+ let data = null;
289
+ let error = null;
290
+ if (onResponse) {
291
+ if (!Array.isArray(onResponse))
292
+ onResponse = [onResponse];
293
+ for (const value of onResponse)
294
+ try {
295
+ const temp = await value(response.clone());
296
+ if (temp !== undefined && temp !== null) {
297
+ data = temp;
298
+ break;
299
+ }
300
+ }
301
+ catch (err) {
302
+ if (err instanceof EdenFetchError)
303
+ error = err;
304
+ else
305
+ error = new EdenFetchError(422, err);
306
+ break;
307
+ }
308
+ }
309
+ if (data !== null) {
310
+ return {
311
+ data,
312
+ error,
313
+ response,
314
+ status: response.status,
315
+ headers: response.headers
316
+ };
317
+ }
318
+ switch ((_b = response.headers.get('Content-Type')) === null || _b === void 0 ? void 0 : _b.split(';')[0]) {
319
+ case 'text/event-stream':
320
+ data = streamSSEResponse(response);
321
+ break;
322
+ case 'application/json':
323
+ data = await response.json();
324
+ break;
325
+ case 'application/octet-stream':
326
+ data = await response.arrayBuffer();
327
+ break;
328
+ case 'multipart/form-data':
329
+ const temp = await response.formData();
330
+ data = {};
331
+ temp.forEach((value, key) => {
332
+ // @ts-ignore
333
+ data[key] = value;
334
+ });
335
+ break;
336
+ default:
337
+ data = await response
338
+ .text()
339
+ .then(parseStringifiedValue);
340
+ }
341
+ if (response.status >= 300 || response.status < 200) {
342
+ error = new EdenFetchError(response.status, data);
343
+ data = null;
344
+ }
345
+ return {
346
+ data,
347
+ error,
348
+ response,
349
+ status: response.status,
350
+ headers: response.headers
351
+ };
352
+ })();
353
+ }
354
+ if (typeof body === 'object')
355
+ return createProxy(domain, config, [...paths, Object.values(body)[0]], instance);
356
+ return createProxy(domain, config, paths);
357
+ }
358
+ });
359
+ export const createSpiceflowClient = (domain, config = {}) => {
360
+ if (typeof domain === 'string') {
361
+ if (!config.keepDomain) {
362
+ if (!domain.includes('://'))
363
+ domain =
364
+ (locals.find((v) => domain.includes(v))
365
+ ? 'http://'
366
+ : 'https://') + domain;
367
+ if (domain.endsWith('/'))
368
+ domain = domain.slice(0, -1);
369
+ }
370
+ return createProxy(domain, config);
371
+ }
372
+ if (typeof window !== 'undefined')
373
+ console.warn('Spiceflow instance server found on client side, this is not recommended for security reason. Use generic type instead.');
374
+ return createProxy('http://e.ly', config, [], domain);
375
+ };
376
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"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"}