appflare 0.2.9 → 0.2.11
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/cli/commands/index.ts +12 -2
- package/cli/index.ts +6 -2
- package/cli/templates/dashboard/builders/functions/index.ts +0 -5
- package/cli/templates/dashboard/builders/functions/render-page/index.ts +1 -1
- package/cli/templates/dashboard/builders/functions/render-page/request-panel.ts +153 -49
- package/cli/templates/dashboard/builders/functions/render-page/result-panel.ts +74 -8
- package/cli/templates/dashboard/builders/functions/render-page/scripts.ts +546 -9
- package/cli/utils/handler-discovery.ts +100 -0
- package/dist/chunk-DZUS277V.js +7501 -0
- package/dist/chunk-RZSN246U.mjs +7501 -0
- package/dist/cli/index.d.mts +2 -0
- package/dist/cli/index.d.ts +2 -0
- package/dist/cli/index.js +7 -0
- package/dist/cli/index.mjs +7 -0
- package/dist/index.d.mts +195 -0
- package/dist/index.d.ts +195 -0
- package/dist/index.js +2 -0
- package/dist/index.mjs +2 -0
- package/dist/react/index.d.mts +143 -0
- package/dist/react/index.d.ts +143 -0
- package/dist/react/index.js +2 -0
- package/dist/react/index.mjs +2 -0
- package/package.json +36 -20
- package/tsup.config.ts +16 -0
- package/cli/templates/dashboard/builders/functions/execute-handler.ts +0 -124
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import { QueryKey, UseQueryOptions, UseQueryResult, InfiniteData, UseInfiniteQueryOptions, UseInfiniteQueryResult, UseMutationOptions, UseMutationResult } from '@tanstack/react-query';
|
|
2
|
+
|
|
3
|
+
type AppflareRequestErrorLike$2 = {
|
|
4
|
+
message: string;
|
|
5
|
+
status?: number;
|
|
6
|
+
};
|
|
7
|
+
type AppflareRequestResultLike$2<TData> = {
|
|
8
|
+
data: TData | null;
|
|
9
|
+
error: AppflareRequestErrorLike$2 | null;
|
|
10
|
+
};
|
|
11
|
+
type AppflareRealtimeSubscriptionLike$1 = {
|
|
12
|
+
remove: () => void;
|
|
13
|
+
};
|
|
14
|
+
type AppflareRealtimeQueryUpdateLike$1<TData> = {
|
|
15
|
+
event: "query:update";
|
|
16
|
+
payload: {
|
|
17
|
+
queryName: string;
|
|
18
|
+
signature: string;
|
|
19
|
+
data: TData;
|
|
20
|
+
};
|
|
21
|
+
};
|
|
22
|
+
type AppflareRequiredInputKeys$2<TInput extends Record<string, unknown>> = {
|
|
23
|
+
[K in keyof TInput]-?: undefined extends TInput[K] ? never : K;
|
|
24
|
+
}[keyof TInput];
|
|
25
|
+
type AppflareHasRequiredInputKeys$2<TInput extends Record<string, unknown>> = [
|
|
26
|
+
AppflareRequiredInputKeys$2<TInput>
|
|
27
|
+
] extends [never] ? false : true;
|
|
28
|
+
type AppflareRouteRunArgs$2<TInput extends Record<string, unknown>> = AppflareHasRequiredInputKeys$2<TInput> extends true ? [args: TInput, options?: any] : [args?: TInput, options?: any];
|
|
29
|
+
type AppflareQueryLike$1<TArgs extends Record<string, unknown>, TData> = {
|
|
30
|
+
run: (...params: AppflareRouteRunArgs$2<TArgs>) => Promise<AppflareRequestResultLike$2<TData>>;
|
|
31
|
+
subscribe?: (options: {
|
|
32
|
+
args?: TArgs;
|
|
33
|
+
authToken?: string;
|
|
34
|
+
requestOptions?: any;
|
|
35
|
+
signal?: AbortSignal;
|
|
36
|
+
onChange: (data: TData, update: AppflareRealtimeQueryUpdateLike$1<TData>) => void;
|
|
37
|
+
onError?: (error: unknown) => void;
|
|
38
|
+
}) => AppflareRealtimeSubscriptionLike$1;
|
|
39
|
+
};
|
|
40
|
+
type UseAppflareQueryOptions<TArgs extends Record<string, unknown>, TData, TSelected = TData, TKey extends QueryKey = QueryKey> = {
|
|
41
|
+
realtime?: {
|
|
42
|
+
enabled?: boolean;
|
|
43
|
+
authToken?: string;
|
|
44
|
+
requestOptions?: any;
|
|
45
|
+
onChange?: (data: TData, update: AppflareRealtimeQueryUpdateLike$1<TData>) => void;
|
|
46
|
+
onError?: (error: unknown) => void;
|
|
47
|
+
};
|
|
48
|
+
requestOptions?: any;
|
|
49
|
+
queryOptions?: Omit<UseQueryOptions<TData, Error, TSelected, TKey>, "queryFn" | "queryKey"> & {
|
|
50
|
+
queryKey?: TKey;
|
|
51
|
+
};
|
|
52
|
+
};
|
|
53
|
+
type UseQueryCallParams<TArgs extends Record<string, unknown>, TData, TSelected, TKey extends QueryKey> = AppflareHasRequiredInputKeys$2<TArgs> extends true ? [
|
|
54
|
+
args: TArgs,
|
|
55
|
+
options?: UseAppflareQueryOptions<TArgs, TData, TSelected, TKey>
|
|
56
|
+
] : [
|
|
57
|
+
args?: TArgs,
|
|
58
|
+
options?: UseAppflareQueryOptions<TArgs, TData, TSelected, TKey>
|
|
59
|
+
];
|
|
60
|
+
declare function useQuery<TArgs extends Record<string, unknown>, TData, TSelected = TData, TKey extends QueryKey = QueryKey>(query: AppflareQueryLike$1<TArgs, TData>, ...params: UseQueryCallParams<TArgs, TData, TSelected, TKey>): UseQueryResult<TSelected, Error>;
|
|
61
|
+
|
|
62
|
+
type AppflareRequestErrorLike$1 = {
|
|
63
|
+
message: string;
|
|
64
|
+
status?: number;
|
|
65
|
+
};
|
|
66
|
+
type AppflareRequestResultLike$1<TData> = {
|
|
67
|
+
data: TData | null;
|
|
68
|
+
error: AppflareRequestErrorLike$1 | null;
|
|
69
|
+
};
|
|
70
|
+
type AppflareRealtimeSubscriptionLike = {
|
|
71
|
+
remove: () => void;
|
|
72
|
+
};
|
|
73
|
+
type AppflareRealtimeQueryUpdateLike<TData> = {
|
|
74
|
+
event: "query:update";
|
|
75
|
+
payload: {
|
|
76
|
+
queryName: string;
|
|
77
|
+
signature: string;
|
|
78
|
+
data: TData;
|
|
79
|
+
};
|
|
80
|
+
};
|
|
81
|
+
type AppflareRequiredInputKeys$1<TInput extends Record<string, unknown>> = {
|
|
82
|
+
[K in keyof TInput]-?: undefined extends TInput[K] ? never : K;
|
|
83
|
+
}[keyof TInput];
|
|
84
|
+
type AppflareHasRequiredInputKeys$1<TInput extends Record<string, unknown>> = [
|
|
85
|
+
AppflareRequiredInputKeys$1<TInput>
|
|
86
|
+
] extends [never] ? false : true;
|
|
87
|
+
type AppflareRouteRunArgs$1<TInput extends Record<string, unknown>> = AppflareHasRequiredInputKeys$1<TInput> extends true ? [args: TInput, options?: any] : [args?: TInput, options?: any];
|
|
88
|
+
type AppflareQueryLike<TArgs extends Record<string, unknown>, TData> = {
|
|
89
|
+
run: (...params: AppflareRouteRunArgs$1<TArgs>) => Promise<AppflareRequestResultLike$1<TData>>;
|
|
90
|
+
subscribe?: (options: {
|
|
91
|
+
args?: TArgs;
|
|
92
|
+
authToken?: string;
|
|
93
|
+
requestOptions?: any;
|
|
94
|
+
signal?: AbortSignal;
|
|
95
|
+
onChange: (data: TData, update: AppflareRealtimeQueryUpdateLike<TData>) => void;
|
|
96
|
+
onError?: (error: unknown) => void;
|
|
97
|
+
}) => AppflareRealtimeSubscriptionLike;
|
|
98
|
+
};
|
|
99
|
+
type UseAppflareInfiniteQueryOptions<TArgs extends Record<string, unknown>, TData, TPageParam, TSelected = InfiniteData<TData, TPageParam>, TKey extends QueryKey = QueryKey> = {
|
|
100
|
+
realtime?: {
|
|
101
|
+
enabled?: boolean;
|
|
102
|
+
authToken?: string;
|
|
103
|
+
requestOptions?: any;
|
|
104
|
+
onChange?: (data: TData, update: AppflareRealtimeQueryUpdateLike<TData>) => void;
|
|
105
|
+
onError?: (error: unknown) => void;
|
|
106
|
+
};
|
|
107
|
+
requestOptions?: any;
|
|
108
|
+
pageParamToArgs?: (baseArgs: TArgs, pageParam: TPageParam) => TArgs;
|
|
109
|
+
queryOptions?: Omit<UseInfiniteQueryOptions<TData, Error, TSelected, TKey, TPageParam>, "queryFn" | "queryKey"> & {
|
|
110
|
+
queryKey?: TKey;
|
|
111
|
+
};
|
|
112
|
+
};
|
|
113
|
+
type UseInfiniteQueryCallParams<TArgs extends Record<string, unknown>, TData, TPageParam, TSelected, TKey extends QueryKey> = AppflareHasRequiredInputKeys$1<TArgs> extends true ? [
|
|
114
|
+
args: TArgs,
|
|
115
|
+
options?: UseAppflareInfiniteQueryOptions<TArgs, TData, TPageParam, TSelected, TKey>
|
|
116
|
+
] : [
|
|
117
|
+
args?: TArgs,
|
|
118
|
+
options?: UseAppflareInfiniteQueryOptions<TArgs, TData, TPageParam, TSelected, TKey>
|
|
119
|
+
];
|
|
120
|
+
declare function useInfiniteQuery<TArgs extends Record<string, unknown>, TData, TPageParam = unknown, TSelected = InfiniteData<TData, TPageParam>, TKey extends QueryKey = QueryKey>(query: AppflareQueryLike<TArgs, TData>, ...params: UseInfiniteQueryCallParams<TArgs, TData, TPageParam, TSelected, TKey>): UseInfiniteQueryResult<TSelected, Error>;
|
|
121
|
+
|
|
122
|
+
type AppflareRequestErrorLike = {
|
|
123
|
+
message: string;
|
|
124
|
+
status?: number;
|
|
125
|
+
};
|
|
126
|
+
type AppflareRequestResultLike<TData> = {
|
|
127
|
+
data: TData | null;
|
|
128
|
+
error: AppflareRequestErrorLike | null;
|
|
129
|
+
};
|
|
130
|
+
type AppflareRequiredInputKeys<TInput extends Record<string, unknown>> = {
|
|
131
|
+
[K in keyof TInput]-?: undefined extends TInput[K] ? never : K;
|
|
132
|
+
}[keyof TInput];
|
|
133
|
+
type AppflareHasRequiredInputKeys<TInput extends Record<string, unknown>> = [
|
|
134
|
+
AppflareRequiredInputKeys<TInput>
|
|
135
|
+
] extends [never] ? false : true;
|
|
136
|
+
type AppflareRouteRunArgs<TInput extends Record<string, unknown>> = AppflareHasRequiredInputKeys<TInput> extends true ? [args: TInput, options?: any] : [args?: TInput, options?: any];
|
|
137
|
+
type AppflareMutationVariables<TArgs extends Record<string, unknown>> = AppflareHasRequiredInputKeys<TArgs> extends true ? TArgs : TArgs | void;
|
|
138
|
+
type AppflareMutationLike<TArgs extends Record<string, unknown>, TData> = {
|
|
139
|
+
run: (...params: AppflareRouteRunArgs<TArgs>) => Promise<AppflareRequestResultLike<TData>>;
|
|
140
|
+
};
|
|
141
|
+
declare function useMutation<TArgs extends Record<string, unknown>, TData, TContext = unknown>(mutation: AppflareMutationLike<TArgs, TData>, mutationOptions?: Omit<UseMutationOptions<TData, Error, AppflareMutationVariables<TArgs>, TContext>, "mutationFn">): UseMutationResult<TData, Error, AppflareMutationVariables<TArgs>, TContext>;
|
|
142
|
+
|
|
143
|
+
export { type UseAppflareInfiniteQueryOptions, type UseAppflareQueryOptions, useInfiniteQuery, useMutation, useQuery };
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
'use strict';var reactQuery=require('@tanstack/react-query'),react=require('react');function O(r){let t=new Error(r.message);return r.status!==void 0&&(t.status=r.status),t}function b(r,...t){let a=t[0]??{},e=t[1],o=reactQuery.useQueryClient(),i=react.useRef(e?.realtime?.onChange),p=react.useRef(e?.realtime?.onError);react.useEffect(()=>{i.current=e?.realtime?.onChange,p.current=e?.realtime?.onError;},[e?.realtime?.onChange,e?.realtime?.onError]);let u=react.useMemo(()=>e?.queryOptions?.queryKey??["appflare","query",r,a],[a,e?.queryOptions?.queryKey,r]),g=react.useMemo(()=>reactQuery.hashKey(u),[u]),f=react.useMemo(()=>reactQuery.hashKey([a]),[a]),A=react.useMemo(()=>reactQuery.hashKey([e?.realtime?.requestOptions]),[e?.realtime?.requestOptions]),m=reactQuery.useQuery({...e?.queryOptions,queryKey:u,queryFn:async()=>{let s=await r.run(a,e?.requestOptions);if(s.error)throw O(s.error);return s.data}});return react.useEffect(()=>{if(e?.realtime?.enabled===false||!r.subscribe)return;let s=new AbortController,y=r.subscribe({args:a,authToken:e.realtime?.authToken,requestOptions:e.realtime?.requestOptions,signal:s.signal,onChange:(n,c)=>{o.setQueryData(u,n),i.current?.(n,c);},onError:n=>{p.current?.(n);}});return ()=>{s.abort(),y.remove();}},[f,e?.realtime?.authToken,e?.realtime?.enabled,A,r.subscribe,o,g]),m}function h(r){let t=new Error(r.message);return r.status!==void 0&&(t.status=r.status),t}function P(r,...t){let a=t[0]??{},e=t[1],o=reactQuery.useQueryClient(),i=react.useRef(e?.realtime?.onChange),p=react.useRef(e?.realtime?.onError);react.useEffect(()=>{i.current=e?.realtime?.onChange,p.current=e?.realtime?.onError;},[e?.realtime?.onChange,e?.realtime?.onError]);let u=react.useMemo(()=>e?.queryOptions?.queryKey??["appflare","infinite-query",r,a],[a,e?.queryOptions?.queryKey,r]),g=react.useMemo(()=>reactQuery.hashKey(u),[u]),f=react.useMemo(()=>reactQuery.hashKey([a]),[a]),A=react.useMemo(()=>reactQuery.hashKey([e?.realtime?.requestOptions]),[e?.realtime?.requestOptions]),m=reactQuery.useInfiniteQuery({...e?.queryOptions,queryKey:u,queryFn:async({pageParam:s})=>{let y=s===void 0||!e?.pageParamToArgs?a:e.pageParamToArgs(a,s),n=await r.run(y,e?.requestOptions);if(n.error)throw h(n.error);return n.data}});return react.useEffect(()=>{if(e?.realtime?.enabled===false||!r.subscribe)return;let s=new AbortController,y=r.subscribe({args:a,authToken:e.realtime?.authToken,requestOptions:e.realtime?.requestOptions,signal:s.signal,onChange:(n,c)=>{o.setQueryData(u,l=>!l||l.pages.length===0?l:{...l,pages:[n,...l.pages.slice(1)]}),i.current?.(n,c);},onError:n=>{p.current?.(n);}});return ()=>{s.abort(),y.remove();}},[f,e?.realtime?.authToken,e?.realtime?.enabled,A,r.subscribe,o,g]),m}function L(r){let t=new Error(r.message);return r.status!==void 0&&(t.status=r.status),t}function C(r,t){return reactQuery.useMutation({...t,mutationFn:async a=>{let e=await r.run(a??{});if(e.error)throw L(e.error);return e.data}})}exports.useInfiniteQuery=P;exports.useMutation=C;exports.useQuery=b;
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {useQueryClient,hashKey,useQuery,useInfiniteQuery,useMutation}from'@tanstack/react-query';import {useRef,useEffect,useMemo}from'react';function O(r){let t=new Error(r.message);return r.status!==void 0&&(t.status=r.status),t}function b(r,...t){let a=t[0]??{},e=t[1],o=useQueryClient(),i=useRef(e?.realtime?.onChange),p=useRef(e?.realtime?.onError);useEffect(()=>{i.current=e?.realtime?.onChange,p.current=e?.realtime?.onError;},[e?.realtime?.onChange,e?.realtime?.onError]);let u=useMemo(()=>e?.queryOptions?.queryKey??["appflare","query",r,a],[a,e?.queryOptions?.queryKey,r]),g=useMemo(()=>hashKey(u),[u]),f=useMemo(()=>hashKey([a]),[a]),A=useMemo(()=>hashKey([e?.realtime?.requestOptions]),[e?.realtime?.requestOptions]),m=useQuery({...e?.queryOptions,queryKey:u,queryFn:async()=>{let s=await r.run(a,e?.requestOptions);if(s.error)throw O(s.error);return s.data}});return useEffect(()=>{if(e?.realtime?.enabled===false||!r.subscribe)return;let s=new AbortController,y=r.subscribe({args:a,authToken:e.realtime?.authToken,requestOptions:e.realtime?.requestOptions,signal:s.signal,onChange:(n,c)=>{o.setQueryData(u,n),i.current?.(n,c);},onError:n=>{p.current?.(n);}});return ()=>{s.abort(),y.remove();}},[f,e?.realtime?.authToken,e?.realtime?.enabled,A,r.subscribe,o,g]),m}function h(r){let t=new Error(r.message);return r.status!==void 0&&(t.status=r.status),t}function P(r,...t){let a=t[0]??{},e=t[1],o=useQueryClient(),i=useRef(e?.realtime?.onChange),p=useRef(e?.realtime?.onError);useEffect(()=>{i.current=e?.realtime?.onChange,p.current=e?.realtime?.onError;},[e?.realtime?.onChange,e?.realtime?.onError]);let u=useMemo(()=>e?.queryOptions?.queryKey??["appflare","infinite-query",r,a],[a,e?.queryOptions?.queryKey,r]),g=useMemo(()=>hashKey(u),[u]),f=useMemo(()=>hashKey([a]),[a]),A=useMemo(()=>hashKey([e?.realtime?.requestOptions]),[e?.realtime?.requestOptions]),m=useInfiniteQuery({...e?.queryOptions,queryKey:u,queryFn:async({pageParam:s})=>{let y=s===void 0||!e?.pageParamToArgs?a:e.pageParamToArgs(a,s),n=await r.run(y,e?.requestOptions);if(n.error)throw h(n.error);return n.data}});return useEffect(()=>{if(e?.realtime?.enabled===false||!r.subscribe)return;let s=new AbortController,y=r.subscribe({args:a,authToken:e.realtime?.authToken,requestOptions:e.realtime?.requestOptions,signal:s.signal,onChange:(n,c)=>{o.setQueryData(u,l=>!l||l.pages.length===0?l:{...l,pages:[n,...l.pages.slice(1)]}),i.current?.(n,c);},onError:n=>{p.current?.(n);}});return ()=>{s.abort(),y.remove();}},[f,e?.realtime?.authToken,e?.realtime?.enabled,A,r.subscribe,o,g]),m}function L(r){let t=new Error(r.message);return r.status!==void 0&&(t.status=r.status),t}function C(r,t){return useMutation({...t,mutationFn:async a=>{let e=await r.run(a??{});if(e.error)throw L(e.error);return e.data}})}export{P as useInfiniteQuery,C as useMutation,b as useQuery};
|
package/package.json
CHANGED
|
@@ -1,15 +1,30 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "appflare",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.11",
|
|
4
|
+
"main": "./dist/index.js",
|
|
5
|
+
"module": "./dist/index.mjs",
|
|
6
|
+
"types": "./dist/index.d.ts",
|
|
4
7
|
"bin": {
|
|
5
|
-
"appflare": "./cli/index.
|
|
8
|
+
"appflare": "./dist/cli/index.js"
|
|
6
9
|
},
|
|
7
10
|
"exports": {
|
|
8
|
-
".":
|
|
9
|
-
|
|
10
|
-
|
|
11
|
+
".": {
|
|
12
|
+
"types": "./dist/index.d.ts",
|
|
13
|
+
"import": "./dist/index.mjs",
|
|
14
|
+
"require": "./dist/index.js"
|
|
15
|
+
},
|
|
16
|
+
"./react": {
|
|
17
|
+
"types": "./dist/react/index.d.ts",
|
|
18
|
+
"import": "./dist/react/index.mjs",
|
|
19
|
+
"require": "./dist/react/index.js"
|
|
20
|
+
},
|
|
21
|
+
"./*": "./dist/*.js"
|
|
22
|
+
},
|
|
23
|
+
"scripts": {
|
|
24
|
+
"build": "tsup",
|
|
25
|
+
"dev": "tsup --watch",
|
|
26
|
+
"lint": "tsc --noEmit"
|
|
11
27
|
},
|
|
12
|
-
"scripts": {},
|
|
13
28
|
"peerDependencies": {
|
|
14
29
|
"@tanstack/react-query": "^5.90.21",
|
|
15
30
|
"react": ">=18"
|
|
@@ -21,21 +36,22 @@
|
|
|
21
36
|
"@types/bun": "^1.3.9",
|
|
22
37
|
"@types/node": "^25.3.0",
|
|
23
38
|
"npm-check-updates": "^19.4.0",
|
|
24
|
-
"typescript": "^5.9.3"
|
|
39
|
+
"typescript": "^5.9.3",
|
|
40
|
+
"tsup": "^8.3.6"
|
|
25
41
|
},
|
|
26
42
|
"dependencies": {
|
|
27
|
-
"@better-auth/cli": "
|
|
28
|
-
"@hono/standard-validator": "
|
|
29
|
-
"better-auth": "
|
|
30
|
-
"better-auth-cloudflare": "
|
|
31
|
-
"better-fetch": "
|
|
32
|
-
"bun": "
|
|
33
|
-
"chokidar": "
|
|
34
|
-
"commander": "
|
|
35
|
-
"drizzle-kit": "
|
|
36
|
-
"drizzle-orm": "
|
|
37
|
-
"hono": "
|
|
38
|
-
"wrangler": "
|
|
39
|
-
"zod": "
|
|
43
|
+
"@better-auth/cli": "1.4.18",
|
|
44
|
+
"@hono/standard-validator": "0.2.2",
|
|
45
|
+
"better-auth": "1.4.18",
|
|
46
|
+
"better-auth-cloudflare": "0.2.9",
|
|
47
|
+
"better-fetch": "1.1.2",
|
|
48
|
+
"bun": "1.3.9",
|
|
49
|
+
"chokidar": "5.0.0",
|
|
50
|
+
"commander": "14.0.3",
|
|
51
|
+
"drizzle-kit": "0.31.9",
|
|
52
|
+
"drizzle-orm": "0.45.1",
|
|
53
|
+
"hono": "4.12.0",
|
|
54
|
+
"wrangler": "4.67.0",
|
|
55
|
+
"zod": "4.3.6"
|
|
40
56
|
}
|
|
41
57
|
}
|
package/tsup.config.ts
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { defineConfig } from "tsup";
|
|
2
|
+
|
|
3
|
+
export default defineConfig({
|
|
4
|
+
entry: ["index.ts", "cli/index.ts", "react/index.ts"],
|
|
5
|
+
format: ["esm", "cjs"],
|
|
6
|
+
dts: true,
|
|
7
|
+
splitting: true,
|
|
8
|
+
sourcemap: false,
|
|
9
|
+
clean: true,
|
|
10
|
+
minify: true,
|
|
11
|
+
treeshake: true,
|
|
12
|
+
external: [/^[^./].*/],
|
|
13
|
+
banner: {
|
|
14
|
+
js: "#!/usr/bin/env node",
|
|
15
|
+
},
|
|
16
|
+
});
|
|
@@ -1,124 +0,0 @@
|
|
|
1
|
-
import { DiscoveredHandlerOperation } from "../../../../utils/handler-discovery";
|
|
2
|
-
|
|
3
|
-
export function buildExecutionLogic(h: DiscoveredHandlerOperation): string {
|
|
4
|
-
return `
|
|
5
|
-
const body = await c.req.json();
|
|
6
|
-
let args = {};
|
|
7
|
-
let customHeaders: Record<string, string> = {};
|
|
8
|
-
let token = body.token || "";
|
|
9
|
-
|
|
10
|
-
try {
|
|
11
|
-
args = typeof body.args === 'string' && body.args.trim() ? JSON.parse(body.args) : body.args || {};
|
|
12
|
-
} catch (e) {}
|
|
13
|
-
|
|
14
|
-
try {
|
|
15
|
-
if (body.headers && typeof body.headers === 'string' && body.headers.trim()) {
|
|
16
|
-
customHeaders = JSON.parse(body.headers);
|
|
17
|
-
} else if (body.headers && typeof body.headers === 'object') {
|
|
18
|
-
customHeaders = body.headers;
|
|
19
|
-
}
|
|
20
|
-
} catch (e) {}
|
|
21
|
-
|
|
22
|
-
try {
|
|
23
|
-
// We'll perform a local fetch to the actual API endpoint for maximum compatibility
|
|
24
|
-
const protocol = c.req.raw.url.startsWith('https') ? 'https' : 'http';
|
|
25
|
-
const host = c.req.header('host');
|
|
26
|
-
const baseUrl = body.baseUrl || c.env?.APPFLARE_API_BASE || \`\${protocol}://\${host}\`;
|
|
27
|
-
const isQuery = ${h.kind === "query"};
|
|
28
|
-
const method = isQuery ? "GET" : "POST";
|
|
29
|
-
|
|
30
|
-
let pathWithQuery = \`${h.routePath}\`;
|
|
31
|
-
if (isQuery && args && typeof args === "object") {
|
|
32
|
-
const params = new URLSearchParams();
|
|
33
|
-
for (const [key, value] of Object.entries(args)) {
|
|
34
|
-
if (value !== undefined && value !== null) {
|
|
35
|
-
if (Array.isArray(value)) {
|
|
36
|
-
value.forEach(v => params.append(key, typeof v === "object" ? JSON.stringify(v) : String(v)));
|
|
37
|
-
} else if (typeof value === "object") {
|
|
38
|
-
params.append(key, JSON.stringify(value));
|
|
39
|
-
} else {
|
|
40
|
-
params.append(key, String(value));
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
const qs = params.toString();
|
|
45
|
-
if (qs) {
|
|
46
|
-
pathWithQuery += \`?\${qs}\`;
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
const targetUrl = \`\${baseUrl}\${pathWithQuery}\`;
|
|
51
|
-
const internalUrl = \`https://internal\${pathWithQuery}\`;
|
|
52
|
-
|
|
53
|
-
const fetchHeaders: Record<string, string> = {
|
|
54
|
-
'Content-Type': 'application/json',
|
|
55
|
-
'Cookie': c.req.header('cookie') || '',
|
|
56
|
-
...customHeaders
|
|
57
|
-
};
|
|
58
|
-
|
|
59
|
-
if (token) {
|
|
60
|
-
fetchHeaders['Authorization'] = \`Bearer \${token}\`;
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
const requestInit: RequestInit = {
|
|
64
|
-
method,
|
|
65
|
-
headers: fetchHeaders,
|
|
66
|
-
body: method === "POST" ? JSON.stringify(args) : undefined
|
|
67
|
-
};
|
|
68
|
-
|
|
69
|
-
let res: Response;
|
|
70
|
-
let transport = "service-binding";
|
|
71
|
-
try {
|
|
72
|
-
if (!c.env?.INTERNAL_WORKER || typeof c.env.INTERNAL_WORKER.fetch !== "function") {
|
|
73
|
-
throw new Error("INTERNAL_WORKER binding not configured");
|
|
74
|
-
}
|
|
75
|
-
res = await c.env.INTERNAL_WORKER.fetch(internalUrl, requestInit);
|
|
76
|
-
} catch (bindingErr) {
|
|
77
|
-
transport = "url-fetch";
|
|
78
|
-
res = await fetch(targetUrl, requestInit);
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
console.log('Fetch transport:', transport, 'target:', transport === 'service-binding' ? internalUrl : targetUrl, 'status:', res.status, res.statusText);
|
|
82
|
-
const contentType = res.headers.get('content-type') || '';
|
|
83
|
-
const rawBody = await res.text();
|
|
84
|
-
let parsedBody: any = rawBody;
|
|
85
|
-
if (rawBody && contentType.includes('application/json')) {
|
|
86
|
-
try {
|
|
87
|
-
parsedBody = JSON.parse(rawBody);
|
|
88
|
-
} catch (parseErr: any) {
|
|
89
|
-
parsedBody = {
|
|
90
|
-
parseError: parseErr?.message || 'Failed to parse JSON',
|
|
91
|
-
body: rawBody
|
|
92
|
-
};
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
const result = {
|
|
97
|
-
transport,
|
|
98
|
-
method,
|
|
99
|
-
internalUrl,
|
|
100
|
-
targetUrl,
|
|
101
|
-
status: res.status,
|
|
102
|
-
statusText: res.statusText,
|
|
103
|
-
headers: Object.fromEntries(res.headers),
|
|
104
|
-
body: parsedBody
|
|
105
|
-
};
|
|
106
|
-
|
|
107
|
-
return c.html(\`
|
|
108
|
-
<div class="p-5 font-mono text-sm h-full overflow-auto">
|
|
109
|
-
<pre class="text-success"><code class="language-json">\${JSON.stringify(result, null, 2)\}</code></pre>
|
|
110
|
-
</div>
|
|
111
|
-
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/styles/github-dark.min.css">
|
|
112
|
-
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/highlight.min.js"></script>
|
|
113
|
-
<script>hljs.highlightAll();</script>
|
|
114
|
-
\`);
|
|
115
|
-
} catch (err: any) {
|
|
116
|
-
return c.html(\`
|
|
117
|
-
<div class="p-5 font-mono text-sm h-full overflow-auto text-error bg-error/5">
|
|
118
|
-
<p class="font-bold mb-2">Execution Error:</p>
|
|
119
|
-
<pre>\${err.message}\\n\${err.stack}</pre>
|
|
120
|
-
</div>
|
|
121
|
-
\`);
|
|
122
|
-
}
|
|
123
|
-
`;
|
|
124
|
-
}
|