@mapl/web 0.5.4 → 0.6.2

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 (58) hide show
  1. package/README.md +1 -27
  2. package/bun/compiler/index.d.ts +27 -0
  3. package/bun/compiler/index.js +1 -0
  4. package/bun/compiler/router.d.ts +9 -0
  5. package/bun/compiler/router.js +1 -0
  6. package/bun/index.d.ts +4 -3
  7. package/bun/index.js +1 -1
  8. package/cloudflare/compiler.d.ts +19 -0
  9. package/cloudflare/compiler.js +1 -0
  10. package/cloudflare/index.d.ts +7 -0
  11. package/cloudflare/index.js +1 -0
  12. package/compilers/call.d.ts +9 -0
  13. package/compilers/call.js +1 -0
  14. package/compilers/globals.d.ts +21 -0
  15. package/compilers/globals.js +1 -0
  16. package/compilers/scope.d.ts +14 -0
  17. package/compilers/scope.js +1 -0
  18. package/constants.d.ts +4 -2
  19. package/constants.js +1 -1
  20. package/deno/compiler.d.ts +11 -0
  21. package/deno/compiler.js +1 -0
  22. package/deno/index.d.ts +4 -0
  23. package/deno/index.js +1 -0
  24. package/generic/compiler.d.ts +17 -22
  25. package/generic/compiler.js +1 -1
  26. package/generic/index.d.ts +3 -3
  27. package/generic/index.js +1 -1
  28. package/index.d.ts +3 -6
  29. package/index.js +1 -1
  30. package/layer.d.ts +45 -0
  31. package/layer.js +1 -0
  32. package/package.json +1 -1
  33. package/response.d.ts +41 -0
  34. package/response.js +1 -0
  35. package/router.d.ts +32 -0
  36. package/router.js +1 -0
  37. package/utils.d.ts +1 -0
  38. package/utils.js +1 -0
  39. package/compiler/call.d.ts +0 -10
  40. package/compiler/call.js +0 -1
  41. package/compiler/globals.d.ts +0 -37
  42. package/compiler/globals.js +0 -1
  43. package/compiler/router.d.ts +0 -38
  44. package/compiler/router.js +0 -1
  45. package/compiler/state.d.ts +0 -32
  46. package/compiler/state.js +0 -1
  47. package/generic/handlers.d.ts +0 -23
  48. package/generic/handlers.js +0 -1
  49. package/generic/layers.d.ts +0 -6
  50. package/generic/layers.js +0 -1
  51. package/generic/parsers.d.ts +0 -21
  52. package/generic/parsers.js +0 -1
  53. package/generic/route.d.ts +0 -12
  54. package/generic/route.js +0 -1
  55. package/generic/types.d.ts +0 -7
  56. package/generic/types.js +0 -1
  57. package/generic/utils/cors.d.ts +0 -11
  58. package/generic/utils/cors.js +0 -1
package/README.md CHANGED
@@ -1,30 +1,4 @@
1
1
  # `@mapl/web`
2
2
  A low level, fast and type-safe framework.
3
3
 
4
- ```ts
5
- import { inject, router, send } from '@mapl/web';
6
- import { compiler, request } from '@mapl/web/generic';
7
-
8
- const app = router.init(
9
- [],
10
- [
11
- router.get(
12
- '/',
13
- send.raw((c) => {
14
- c.status = 418;
15
- return 'Hi';
16
- }),
17
- ),
18
- router.post(
19
- '/body',
20
- send.json(
21
- inject([request], async (req) => req.json())
22
- ),
23
- ),
24
- ],
25
- );
26
-
27
- export default {
28
- fetch: compiler.buildSync(app)(),
29
- };
30
- ```
4
+ See example usage in [./examples](./examples);
@@ -0,0 +1,27 @@
1
+ import { type ExportedDependency, type Value } from "runtime-compiler";
2
+ import { type HandlerScope } from "../../compilers/scope.ts";
3
+ import type { Router } from "../../router.ts";
4
+ /**
5
+ * Describe compiler compiled result
6
+ */
7
+ export type CompiledResult = Bun.Serve.Routes<any, string>;
8
+ /**
9
+ * Load all global state for a router
10
+ *
11
+ * @example
12
+ * setHandlerArgs(constants.GENERIC_ARGS);
13
+ * _load(router);
14
+ */
15
+ export declare const _load: (router: Router) => void;
16
+ export declare const loadToString: () => Value<CompiledResult>;
17
+ /**
18
+ * Hydrate router data
19
+ */
20
+ export declare const _hydrate: (router: Router, scope: HandlerScope) => void;
21
+ /**
22
+ * @example
23
+ * export default {
24
+ * fetch: getDependency(build(app))
25
+ * };
26
+ */
27
+ export declare const build: (router: Router) => ExportedDependency<CompiledResult>;
@@ -0,0 +1 @@
1
+ import{exportScope,markExported}from"runtime-compiler";import{isHydrating}from"runtime-compiler/config";import{TMP_SCOPE,initScope,setHandlerArgs}from"../../compilers/globals.js";import{wrapScope}from"../../compilers/scope.js";import{initRouter,insertItem,toRoutes}from"./router.js";let PARAM_MAP;let loadToMethodRouter=(router,scope,prefix,content)=>{for(let i=0,layers=router[0];i<layers.length;i++){let self=layers[i];content+=self[0](self,scope)}for(let i=0,routes=router[1];i<routes.length;i++){let route=routes[i];let routeScope=scope.slice();let path=route[1];let routeContent;if(path.includes(`*`)){routeContent=`let{`;let paramCount=0;{let newPath=``,startIdx=0;if(path.endsWith(`**`)){let len=path.length-3;for(let i=path.indexOf(`*`);i>-1&&i<len;i=path.indexOf(`*`,i+2)){let id=`q`+ paramCount++;routeContent+=id+`,`;newPath+=path.slice(startIdx,i)+`:`+id;startIdx=i+1}startIdx<len&&(newPath+=path.slice(startIdx,len));path=newPath+`/*`;routeContent+=`"*":q`+ paramCount++}else{for(let i=path.indexOf(`*`);i>-1;i=path.indexOf(`*`,i+2)){let id=`q`+ paramCount++;routeContent+=id+`,`;newPath+=path.slice(startIdx,i)+`:`+id;startIdx=i+1}path=startIdx<path.length?newPath+path.slice(startIdx):newPath}routeContent+=`}=mr.params;`+content}for(let j=2,params=PARAM_MAP[paramCount];j<route.length;j++){let self=route[j];routeContent+=self[0](self,routeScope,params,paramCount)}}else{routeContent=content;for(let j=2;j<route.length;j++){let self=route[j];routeContent+=self[0](self,routeScope,``,0)}}insertItem(route[0],prefix+path,wrapScope(routeScope,routeContent))}for(let i=2;i<router.length;i++){let childRouter=router[i];loadToMethodRouter(childRouter[1],scope.slice(),childRouter[0]===`/`?prefix:prefix+childRouter[0],content)}};export let _load=router=>{initScope();initRouter();PARAM_MAP=[``,`q0`];for(let i=1;i<=8;i++)PARAM_MAP.push(`${PARAM_MAP[i]},q${i}`);loadToMethodRouter(router,[0],``,``)};export let loadToString=toRoutes;export let _hydrate=(router,scope)=>{for(let i=0,layers=router[0];i<layers.length;i++){let self=layers[i];self[0](self,scope)}for(let i=0,routes=router[1];i<routes.length;i++){let route=routes[i];let routeScope=scope.slice();let path=route[1];if(path.includes(`*`)){let paramCount=0;if(path.endsWith(`**`)){let len=path.length-3;for(let i=path.indexOf(`*`);i>-1&&i<len;i=path.indexOf(`*`,i+2),paramCount++);paramCount++}else for(let i=path.indexOf(`*`);i>-1;i=path.indexOf(`*`,i+2),paramCount++);for(let j=2,params=PARAM_MAP[paramCount];j<route.length;j++){let self=route[j];self[0](self,routeScope,params,paramCount)}}else for(let j=2;j<route.length;j++){let self=route[j];self[0](self,routeScope,``,0)}}for(let i=2;i<router.length;i++)_hydrate(router[i][1],scope.slice())};export let build=isHydrating?router=>(_hydrate(router,[0]),markExported()):router=>(setHandlerArgs(`(mr,mi)`),_load(router),exportScope(TMP_SCOPE,loadToString()));
@@ -0,0 +1,9 @@
1
+ export declare const initRouter: () => void;
2
+ /**
3
+ * Path and content must be processed before inserting
4
+ * @param method
5
+ * @param path
6
+ * @param content
7
+ */
8
+ export declare const insertItem: (method: string, path: string, content: string) => void;
9
+ export declare const toRoutes: () => string;
@@ -0,0 +1 @@
1
+ let METHOD_ROUTER;let DEOPT_PATHS;export let initRouter=()=>{METHOD_ROUTER={};DEOPT_PATHS=[]};export let insertItem=(method,path,content)=>{let methods=METHOD_ROUTER[path];if(methods!=null)methods[``]??DEOPT_PATHS.push(path);else methods=METHOD_ROUTER[path]={};method!==`GET`&&method!==`POST`&&method!==`PUT`&&method!==`DELETE`&&method!==`PATCH`&&method!==`OPTIONS`&&DEOPT_PATHS.push(path);methods[method]=content};export let toRoutes=()=>{let str=`{`;for(let i=0;i<DEOPT_PATHS.length;i++){let back=`return mnf},`;let path=DEOPT_PATHS[i];str+=`"`+path+`":(mr,mi)=>{`;let methods=METHOD_ROUTER[path];delete METHOD_ROUTER[path];let first=true;for(let method in methods)if(method===``)back=methods[``]+`},`;else{if(first){first=false;str+=`if(`}else str+=`else if(`;str+=`mr.method==="`+method+`"){`+methods[method]+`}`}str+=back}for(const path in METHOD_ROUTER){str+=`"`+path;let methods=METHOD_ROUTER[path];if(methods[``]==null){str+=`":{`;for(const method in methods)str+=method+`:(mr,mi)=>{`+methods[method]+`},`;str+=`},`}else str+=`":(mr,mi)=>{`+methods[``]+`},`}return str+`}`};
package/bun/index.d.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  import type { BunRequest, Server } from "bun";
2
- import type { LocalDependency } from "runtime-compiler";
3
- export declare const request: LocalDependency<BunRequest>;
4
- export declare const server: LocalDependency<Server<any>>;
2
+ import type { Identifier } from "runtime-compiler";
3
+ export declare const request: Identifier<BunRequest>;
4
+ export declare const server: Identifier<Server<any>>;
5
+ export { build } from "./compiler/index.ts";
package/bun/index.js CHANGED
@@ -1 +1 @@
1
- export let request=`mr`;export let server=`mi`;
1
+ export let request=`mr`;export let server=`mi`;export{build}from"./compiler/index.js";
@@ -0,0 +1,19 @@
1
+ import { type ExportedDependency, type Value } from "runtime-compiler";
2
+ import type { Router } from "../router.ts";
3
+ /**
4
+ * Describe compiler compiled result
5
+ */
6
+ export type CompiledResult = () => ExportedHandlerFetchHandler<Cloudflare.Env, unknown>;
7
+ export declare const loadToString: () => Value<CompiledResult>;
8
+ /**
9
+ * @example
10
+ * const createFetch = getDependency(build(app));
11
+ *
12
+ * export default {
13
+ * fetch(...args) {
14
+ * // Set up stuff...
15
+ * return (this.fetch = createFetch())(...args);
16
+ * }
17
+ * } satisfies ExportedHandler<Env>;
18
+ */
19
+ export declare const build: (router: Router) => ExportedDependency<CompiledResult>;
@@ -0,0 +1 @@
1
+ import{exportExpr,markExported}from"runtime-compiler";import{isHydrating}from"runtime-compiler/config";import{_hydrate,_load,loadToString as genericLoadToString}from"../generic/compiler.js";import{TMP_SCOPE,setHandlerArgs}from"../compilers/globals.js";export let loadToString=()=>`()=>{`+TMP_SCOPE[0]+`return `+genericLoadToString()+`}`;export let build=isHydrating?router=>(_hydrate(router,[0]),markExported()):router=>(setHandlerArgs(`(mr,mi,mec)`),_load(router),exportExpr(loadToString()));
@@ -0,0 +1,7 @@
1
+ /// <reference types="@cloudflare/workers-types" />
2
+ import type { Request as WorkerRequest, ExecutionContext } from "@cloudflare/workers-types";
3
+ import type { Identifier } from "runtime-compiler";
4
+ export declare const request: Identifier<WorkerRequest>;
5
+ export declare const env: Identifier<Cloudflare.Env>;
6
+ export declare const ctx: Identifier<ExecutionContext>;
7
+ export { build } from "./compiler.ts";
@@ -0,0 +1 @@
1
+ export let request=`mr`;export let env=`mi`;export let ctx=`mec`;export{build}from"./compiler.js";
@@ -0,0 +1,9 @@
1
+ import { type Identifier } from "runtime-compiler";
2
+ import type { HandlerScope } from "./scope.ts";
3
+ import type { SendLayer } from "../response.ts";
4
+ export interface Call<T extends (...args: any[]) => any> {
5
+ 0: T;
6
+ 1: Identifier<any>[];
7
+ }
8
+ export declare const buildCall: (scope: HandlerScope, fn: (...args: any[]) => any, args: string, argsCount: number) => string;
9
+ export declare const buildRouteCall: SendLayer<any>[0];
@@ -0,0 +1 @@
1
+ import{declareLocal,injectExternal}from"runtime-compiler";import{isHydrating}from"runtime-compiler/config";import{AsyncFunction}from"runtime-compiler/utils";import{TMP_SCOPE}from"./globals.js";export let buildCall=isHydrating?(scope,fn,_,argsCount)=>{injectExternal(fn);fn instanceof AsyncFunction&&(scope[0]|=1);fn.length>argsCount&&(scope[0]|=2);return``}:(scope,fn,args,argsCount)=>{let str=declareLocal(TMP_SCOPE,injectExternal(fn))+`(`+args;if(fn instanceof AsyncFunction){scope[0]|=1;str=`await `+str}if(fn.length>argsCount){scope[0]|=2;str+=`,mc`}return str+`)`};export let buildRouteCall=isHydrating?(self,scope,_,paramsCount)=>{let args=self[2];return args.length>0?paramsCount>0?buildCall(scope,self[1],``,args.length+paramsCount):buildCall(scope,self[1],``,args.length):paramsCount>0?buildCall(scope,self[1],``,paramsCount):buildCall(scope,self[1],``,0)}:(self,scope,params,paramsCount)=>{let args=self[2];return args.length>0?paramsCount>0?buildCall(scope,self[1],args.join()+`,`+params,args.length+paramsCount):buildCall(scope,self[1],args.join(),args.length):paramsCount>0?buildCall(scope,self[1],params,paramsCount):buildCall(scope,self[1],``,0)};
@@ -0,0 +1,21 @@
1
+ import { type Identifier, type Scope } from "runtime-compiler";
2
+ import { isErr } from "@safe-std/error";
3
+ /**
4
+ * @example
5
+ * '(req,env,ctx)'
6
+ */
7
+ export declare let HANDLER_ARGS: string;
8
+ /**
9
+ * @example
10
+ * setHandlerArgs('(req,env,ctx)');
11
+ */
12
+ export declare const setHandlerArgs: (str: string) => void;
13
+ /**
14
+ * Store local variables
15
+ */
16
+ export declare let TMP_SCOPE: Scope;
17
+ /**
18
+ * Check whether value is an error
19
+ */
20
+ export declare let IS_ERR: Identifier<typeof isErr>;
21
+ export declare const initScope: () => void;
@@ -0,0 +1 @@
1
+ import{declareLocal,injectExternal}from"runtime-compiler";import{isErr}from"@safe-std/error";export let HANDLER_ARGS;export let setHandlerArgs=str=>{HANDLER_ARGS=str};export let TMP_SCOPE;export let IS_ERR;export let initScope=()=>{TMP_SCOPE=[`let mhh=['content-type','text/html'],mho={headers:mhh},mnf=new Response(null,{status:404});`,0];IS_ERR=declareLocal(TMP_SCOPE,injectExternal(isErr))};
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Handler scope state.
3
+ */
4
+ export interface HandlerScope {
5
+ /**
6
+ * Scope flags.
7
+ *
8
+ * bit 0: scope requires async or not
9
+ * bit 1: scope requires context or not
10
+ */
11
+ 0: number;
12
+ slice: () => this;
13
+ }
14
+ export declare const wrapScope: (scope: HandlerScope, content: string) => string;
@@ -0,0 +1 @@
1
+ import{declareLocal}from"runtime-compiler";import{HANDLER_ARGS,TMP_SCOPE}from"./globals.js";export let wrapScope=(scope,content)=>{let flags=scope[0];(flags&2)===2&&(content=`let mh=[],mc={status:200,headers:mh};`+content);return(flags&1)===1?`return `+declareLocal(TMP_SCOPE,`async`+HANDLER_ARGS+`=>{`+content+`}`)+HANDLER_ARGS:content};
package/constants.d.ts CHANGED
@@ -8,10 +8,12 @@ export declare const CREATE_CTX: string;
8
8
  // Mapl locals
9
9
  export declare const REQ = "mr";
10
10
  export declare const INFO = "mi";
11
+ export declare const EXEC_CTX = "mec";
11
12
  export declare const FULL_URL = "mu";
13
+ export declare const GENERIC_ARGS: string;
14
+ export declare const BUN_DENO_ARGS: string;
15
+ export declare const CLOUDFLARE_ARGS: string;
12
16
  export declare const RES_404 = "mnf";
13
- export declare const JSON_HEADER = "mjh";
14
- export declare const JSON_OPTION = "mjo";
15
17
  export declare const HTML_HEADER = "mhh";
16
18
  export declare const HTML_OPTION = "mho";
17
19
  // Fast path for injecting mapl symbols
package/constants.js CHANGED
@@ -1 +1 @@
1
- export*from"@mapl/framework/constants";export*from"@mapl/router/constants";export let CTX=`mc`;export let HEADERS=`mh`;export let PARSED_RESULT=`mt`;export let CREATE_CTX=`let ${HEADERS}=[],${CTX}={status:200,headers:${HEADERS}};`;export let REQ=`mr`;export let INFO=`mi`;export let FULL_URL=`mu`;export let RES_404=`mnf`;export let JSON_HEADER=`mjh`;export let JSON_OPTION=`mjo`;export let HTML_HEADER=`mhh`;export let HTML_OPTION=`mho`;export let DECL_GLOBALS=`var ${JSON_HEADER}=['content-type','application/json'],${JSON_OPTION}={headers:${JSON_HEADER}},${HTML_HEADER}=['content-type','text/html'],${HTML_OPTION}={headers:${HTML_HEADER}},${RES_404}=new Response(null,{status:404});`;
1
+ export*from"@mapl/framework/constants";export*from"@mapl/router/constants";export let CTX=`mc`;export let HEADERS=`mh`;export let PARSED_RESULT=`mt`;export let CREATE_CTX=`let ${HEADERS}=[],${CTX}={status:200,headers:${HEADERS}};`;export let REQ=`mr`;export let INFO=`mi`;export let EXEC_CTX=`mec`;export let FULL_URL=`mu`;export let GENERIC_ARGS=`(${REQ})`;export let BUN_DENO_ARGS=`(${REQ},${INFO})`;export let CLOUDFLARE_ARGS=`(${REQ},${INFO},${EXEC_CTX})`;export let RES_404=`mnf`;export let HTML_HEADER=`mhh`;export let HTML_OPTION=`mho`;export let DECL_GLOBALS=`let ${HTML_HEADER}=['content-type','text/html'],${HTML_OPTION}={headers:${HTML_HEADER}},${RES_404}=new Response(null,{status:404});`;
@@ -0,0 +1,11 @@
1
+ import { type ExportedDependency } from "runtime-compiler";
2
+ import type { Router } from "../router.ts";
3
+ /**
4
+ * Describe compiler compiled result
5
+ */
6
+ export type CompiledResult = (req: Request) => Response | Promise<Response>;
7
+ /**
8
+ * @example
9
+ * Deno.serve(getDependency(build(app)));
10
+ */
11
+ export declare const build: (router: Router) => ExportedDependency<CompiledResult>;
@@ -0,0 +1 @@
1
+ import{exportExpr,markExported}from"runtime-compiler";import{isHydrating}from"runtime-compiler/config";import{_hydrate,_load,loadToString}from"../generic/compiler.js";import{setHandlerArgs}from"../compilers/globals.js";export let build=isHydrating?router=>(_hydrate(router,[0]),markExported()):router=>(setHandlerArgs(`(mr,mi)`),_load(router),exportExpr(loadToString()));
@@ -0,0 +1,4 @@
1
+ import type { Identifier } from "runtime-compiler";
2
+ export { request } from "../generic/index.ts";
3
+ export declare const info: Identifier<Deno.ServeHandlerInfo<Deno.Addr>>;
4
+ export { build } from "./compiler.ts";
package/deno/index.js ADDED
@@ -0,0 +1 @@
1
+ export{request}from"../generic/index.js";export let info=`mi`;export{build}from"./compiler.js";
@@ -1,32 +1,27 @@
1
- import { type LocalDependency } from "runtime-compiler";
2
- import { type Router } from "../compiler/router.ts";
3
- import { type registerRoute } from "../compiler/globals.ts";
4
- export type BuiltFn = () => (req: Request) => any;
5
- export declare const registerRouteCb: typeof registerRoute;
1
+ import { type ExportedDependency, type Value } from "runtime-compiler";
2
+ import { type HandlerScope } from "../compilers/scope.ts";
3
+ import type { Router } from "../router.ts";
6
4
  /**
7
- * Build to a local dependency.
8
- * Use in `default` and `build` mode.
5
+ * Describe compiler compiled result
9
6
  */
10
- export declare const buildToDependency: (router: Router) => LocalDependency<BuiltFn>;
7
+ export type CompiledResult = (req: Request) => Response | Promise<Response>;
11
8
  /**
12
- * Hydrate to a local dependency.
13
- * Use in `hydrate` mode.
14
- */
15
- export declare const hydrateToDependency: (router: Router) => void;
16
- /**
17
- * Build the router into evaluatable string.
18
- * Use in `build` mode.
9
+ * Load all global state for a router
19
10
  *
20
11
  * @example
21
- * `const fetch = (${buildToString(app)})(hydrate(app))();`
12
+ * setHandlerArgs(constants.GENERIC_ARGS);
13
+ * _load(router);
22
14
  */
23
- export declare const buildToString: (router: Router) => string;
15
+ export declare const _load: (router: Router) => void;
16
+ export declare const loadToString: () => Value<CompiledResult>;
24
17
  /**
25
- * Build the router to a lazy function.
26
- * Use in `default` mode.
18
+ * Hydrate router data
27
19
  */
28
- export declare const build: (router: Router) => BuiltFn;
20
+ export declare const _hydrate: (router: Router, scope: HandlerScope) => void;
29
21
  /**
30
- * Return the arguments needed in `hydrate` mode.
22
+ * @example
23
+ * export default {
24
+ * fetch: getDependency(build(app))
25
+ * };
31
26
  */
32
- export declare const hydrate: (router: Router) => any[];
27
+ export declare const build: (router: Router) => ExportedDependency<CompiledResult>;
@@ -1 +1 @@
1
- import{createRouter,insertItem}from"@mapl/router/method";import compileMethodRouter from"@mapl/router/method/compiler";import{addExtraCode,evaluate,evaluateToString,hydrate as finishHydration,injectDependency}from"runtime-compiler";import{build as buildRouter,hydrate as hydrateRouter}from"../compiler/router.js";import{finalizeReturn}from"../compiler/state.js";import{setHandlerArgs,setRegisterRoute,setRouteParamMap}from"../compiler/globals.js";let methodRouter;export let registerRouteCb=(route,state,prefix,content)=>{insertItem(methodRouter,route[0],prefix+route[1],finalizeReturn(state,content))};let buildWrapper=router=>{setHandlerArgs(`(mr)`);methodRouter=createRouter();setRegisterRoute(registerRouteCb);let paramMap=[``,`q0,`];for(let i=1;i<=8;i++)paramMap.push(`${paramMap[i]}q${i},`);setRouteParamMap(paramMap);buildRouter(router,[false,false],``,``);return`()=>{var mjh=['content-type','application/json'],mjo={headers:mjh},mhh=['content-type','text/html'],mho={headers:mhh},mnf=new Response(null,{status:404});return(mr)=>{${compileMethodRouter(methodRouter,`mr.method`,`let mu=mr.url,s=mu.indexOf('/',10)+1,e=mu.indexOf('?',s),p=e===-1?mu.slice(s):mu.slice(s,e);`,0)}return mnf}}`};export let buildToDependency=router=>injectDependency(buildWrapper(router));export let hydrateToDependency=router=>{hydrateRouter(router,[false,false])};export let buildToString=router=>(addExtraCode(`return`+buildWrapper(router)),evaluateToString());export let build=router=>(addExtraCode(`return`+buildWrapper(router)),evaluate());export let hydrate=router=>(hydrateToDependency(router),finishHydration());
1
+ import{createRouter as createMethodRouter,insertItem as insertItemToMethodRouter}from"@mapl/router/method";import compileMethodRouter from"@mapl/router/method/compiler";import{countParams}from"@mapl/router/utils";import{exportScope,markExported}from"runtime-compiler";import{isHydrating}from"runtime-compiler/config";import{TMP_SCOPE,initScope,setHandlerArgs}from"../compilers/globals.js";import{wrapScope}from"../compilers/scope.js";let METHOD_ROUTER;let PARAM_MAP;let loadToMethodRouter=(router,scope,prefix,content)=>{for(let i=0,layers=router[0];i<layers.length;i++){let self=layers[i];content+=self[0](self,scope)}for(let i=0,routes=router[1];i<routes.length;i++){let route=routes[i];let routeScope=scope.slice();let routeContent=content;for(let j=2,paramCount=countParams(route[1]),params=PARAM_MAP[paramCount];j<route.length;j++){let self=route[j];routeContent+=self[0](self,routeScope,params,paramCount)}insertItemToMethodRouter(METHOD_ROUTER,route[0],prefix+route[1],wrapScope(routeScope,routeContent))}for(let i=2;i<router.length;i++){let childRouter=router[i];loadToMethodRouter(childRouter[1],scope.slice(),childRouter[0]===`/`?prefix:prefix+childRouter[0],content)}};export let _load=router=>{initScope();METHOD_ROUTER=createMethodRouter();PARAM_MAP=[``,`q0`];for(let i=1;i<=8;i++)PARAM_MAP.push(`${PARAM_MAP[i]},q${i}`);loadToMethodRouter(router,[0],``,``)};export let loadToString=()=>`(mr)=>{${compileMethodRouter(METHOD_ROUTER,`mr.method`,`let mu=mr.url,s=mu.indexOf('/',10)+1,e=mu.indexOf('?',s),p=e===-1?mu.slice(s):mu.slice(s,e);`,0)}return mnf}`;export let _hydrate=(router,scope)=>{for(let i=0,layers=router[0];i<layers.length;i++){let self=layers[i];self[0](self,scope)}for(let i=0,routes=router[1];i<routes.length;i++)for(let j=2,route=routes[i],routeScope=scope.slice(),paramCount=countParams(route[1]);j<route.length;j++){let self=route[j];self[0](self,routeScope,``,paramCount)}for(let i=2;i<router.length;i++)_hydrate(router[i][1],scope.slice())};export let build=isHydrating?router=>(_hydrate(router,[0]),markExported()):router=>(setHandlerArgs(`(mr)`),_load(router),exportScope(TMP_SCOPE,loadToString()));
@@ -1,3 +1,3 @@
1
- import type { LocalDependency } from "runtime-compiler";
2
- export declare const request: LocalDependency<Request>;
3
- export * as compiler from "./compiler.ts";
1
+ import type { Identifier } from "runtime-compiler";
2
+ export declare const request: Identifier<Request>;
3
+ export { build } from "./compiler.ts";
package/generic/index.js CHANGED
@@ -1 +1 @@
1
- export let request=`mr`;export*as compiler from"./compiler.js";
1
+ export let request=`mr`;export{build}from"./compiler.js";
package/index.d.ts CHANGED
@@ -1,6 +1,3 @@
1
- export * as send from "./generic/handlers.ts";
2
- export * as router from "./generic/route.ts";
3
- export * as layer from "./generic/layers.ts";
4
- export * as parser from "./generic/parsers.ts";
5
- export { inject } from "runtime-compiler/call";
6
- export * as cors from "./generic/utils/cors.ts";
1
+ export * as send from "./response.ts";
2
+ export * as router from "./router.ts";
3
+ export * as layer from "./layer.ts";
package/index.js CHANGED
@@ -1 +1 @@
1
- export*as send from"./generic/handlers.js";export*as router from"./generic/route.js";export*as layer from"./generic/layers.js";export*as parser from"./generic/parsers.js";export{inject}from"runtime-compiler/call";export*as cors from"./generic/utils/cors.js";
1
+ export*as send from"./response.js";export*as router from"./router.js";export*as layer from"./layer.js";
package/layer.d.ts ADDED
@@ -0,0 +1,45 @@
1
+ import type { Identifier } from "runtime-compiler";
2
+ import type { ResponseState } from "./response.ts";
3
+ import type { HandlerScope } from "./compilers/scope.ts";
4
+ /**
5
+ * @example
6
+ * f[0](f, scope);
7
+ */
8
+ export interface AnyLayer {
9
+ 0: (self: any, scope: HandlerScope) => string;
10
+ }
11
+ /**
12
+ * @example
13
+ * f[0](f, scope);
14
+ */
15
+ export interface Layer {
16
+ 0: (self: this, scope: HandlerScope) => string;
17
+ }
18
+ /**
19
+ * @example
20
+ * f[0](f, scope, 'p0,p1,');
21
+ */
22
+ export interface AnyRouteLayer<Params extends any[]> {
23
+ 0: (self: any, scope: HandlerScope, params: string, paramsCount: number) => string;
24
+ "~"?: Params;
25
+ }
26
+ /**
27
+ * @example
28
+ * f[0](f, scope, 'p0,p1,');
29
+ */
30
+ export interface RouteLayer<Params extends any[]> {
31
+ 0: (self: this, scope: HandlerScope, params: string, paramsCount: number) => string;
32
+ "~"?: Params;
33
+ }
34
+ ///
35
+ /// Impls
36
+ ///
37
+ interface TapLayer extends Layer {
38
+ 1: (...args: any[]) => any;
39
+ 2: Identifier<any>[];
40
+ }
41
+ /**
42
+ * Tap a function to request lifecycle.
43
+ */
44
+ export declare const tap: <Args extends Identifier<any>[]>(fn: (...args: [...{ [K in keyof Args] : Args[K]["~type"] }, res: ResponseState]) => void | Promise<void>, ...args: Args) => TapLayer;
45
+ export {};
package/layer.js ADDED
@@ -0,0 +1 @@
1
+ import{buildCall}from"./compilers/call.js";let loadTap=(self,scope)=>{let args=self[2];return buildCall(scope,self[1],args.join(),args.length)+`;`};export let tap=(fn,...args)=>[loadTap,fn,args];
package/package.json CHANGED
@@ -1 +1 @@
1
- {"name":"@mapl/web","version":"0.5.4","description":"A compiled web framework for all runtimes","keywords":["fast","lightweight","cross-runtime","framework","web","backend"],"repository":{"type":"git","url":"git+https://github.com/mapljs/web.git"},"license":"MIT","type":"module","main":"./index.js","types":"./index.d.ts","dependencies":{"@mapl/router":"^0.8.1","@safe-std/error":"^2.0.4","runtime-compiler":"^2.1.2"},"exports":{"./constants":"./constants.js","./generic/route":"./generic/route.js","./generic/handlers":"./generic/handlers.js",".":"./index.js","./generic/types":"./generic/types.js","./generic/layers":"./generic/layers.js","./generic/parsers":"./generic/parsers.js","./generic/utils/cors":"./generic/utils/cors.js","./generic/compiler":"./generic/compiler.js","./compiler/call":"./compiler/call.js","./compiler/state":"./compiler/state.js","./generic":"./generic/index.js","./compiler/router":"./compiler/router.js","./compiler/globals":"./compiler/globals.js","./bun":"./bun/index.js"}}
1
+ {"name":"@mapl/web","version":"0.6.2","description":"A compiled web framework for all runtimes","keywords":["fast","lightweight","cross-runtime","framework","web","backend"],"repository":{"type":"git","url":"git+https://github.com/mapljs/web.git"},"license":"MIT","type":"module","main":"./index.js","types":"./index.d.ts","dependencies":{"@mapl/router":"^0.8.3","@safe-std/error":"^2.0.4","runtime-compiler":"^3.1.0"},"exports":{"./utils":"./utils.js","./layer":"./layer.js","./constants":"./constants.js",".":"./index.js","./router":"./router.js","./response":"./response.js","./cloudflare/compiler":"./cloudflare/compiler.js","./bun":"./bun/index.js","./cloudflare":"./cloudflare/index.js","./bun/compiler/router":"./bun/compiler/router.js","./compilers/scope":"./compilers/scope.js","./compilers/globals":"./compilers/globals.js","./compilers/call":"./compilers/call.js","./deno":"./deno/index.js","./generic/compiler":"./generic/compiler.js","./deno/compiler":"./deno/compiler.js","./bun/compiler":"./bun/compiler/index.js","./generic":"./generic/index.js"}}
package/response.d.ts ADDED
@@ -0,0 +1,41 @@
1
+ import type { Identifier } from "runtime-compiler";
2
+ import type { RouteLayer } from "./layer.ts";
3
+ /**
4
+ * Describe a header pair
5
+ */
6
+ export type ResponseHeader = [string, string] | readonly [string, string];
7
+ /**
8
+ * Response state
9
+ */
10
+ export interface ResponseState {
11
+ status: number;
12
+ headers: ResponseHeader[];
13
+ }
14
+ export interface SendLayer<Params extends any[]> extends RouteLayer<Params> {
15
+ 1: (...args: any[]) => any;
16
+ 2: Identifier<any>[];
17
+ }
18
+ /**
19
+ * @example
20
+ * router.get('/', send.raw(() => 'Hi'))
21
+ */
22
+ export declare const raw: <
23
+ const Args extends Identifier<any>[],
24
+ Params extends any[] = []
25
+ >(fn: (...args: [...{ [K in keyof Args] : Args[K]["~type"] }, ...Params, res: ResponseState]) => BodyInit | Promise<BodyInit>, ...args: Args) => SendLayer<Params>;
26
+ /**
27
+ * @example
28
+ * router.post('/', send.json(() => ({ hello: 'world' })))
29
+ */
30
+ export declare const json: <
31
+ const Args extends Identifier<any>[],
32
+ Params extends any[] = []
33
+ >(fn: (...args: [...{ [K in keyof Args] : Args[K]["~type"] }, ...Params, res: ResponseState]) => any, ...args: Args) => SendLayer<Params>;
34
+ /**
35
+ * @example
36
+ * router.get('/', send.html(() => '<p>Hi</p>'))
37
+ */
38
+ export declare const html: <
39
+ const Args extends Identifier<any>[],
40
+ Params extends any[] = []
41
+ >(fn: (...args: [...{ [K in keyof Args] : Args[K]["~type"] }, ...Params, res: ResponseState]) => BodyInit | Promise<BodyInit>, ...args: Args) => SendLayer<Params>;
package/response.js ADDED
@@ -0,0 +1 @@
1
+ import{buildRouteCall}from"./compilers/call.js";let loadRaw=(self,scope,params,paramsCount)=>`return new Response(`+buildRouteCall(self,scope,params,paramsCount)+((scope[0]&2)===2?`,mc)`:`)`);export let raw=(fn,...args)=>[loadRaw,fn,args];let loadJSON=(self,scope,params,paramsCount)=>`return Response.json(`+buildRouteCall(self,scope,params,paramsCount)+((scope[0]&2)===2?`,mc)`:`)`);export let json=(fn,...args)=>[loadJSON,fn,args];let loadHTML=(self,scope,params,paramsCount)=>{let call=buildRouteCall(self,scope,params,paramsCount);return(scope[0]&2)===2?`mh.push(mhh);return new Response(`+call+`,mc)`:`return new Response(`+call+`,mho)`};export let html=(fn,...args)=>[loadHTML,fn,args];
package/router.d.ts ADDED
@@ -0,0 +1,32 @@
1
+ import type { AnyLayer, AnyRouteLayer } from "./layer.ts";
2
+ /**
3
+ * @example
4
+ * ['GET', '/', ...]
5
+ */
6
+ export type Route = [method: string, path: string, ...layers: AnyRouteLayer<any>[]];
7
+ /**
8
+ * Child router data
9
+ */
10
+ export type ChildRouter = [subpath: string, Router];
11
+ /**
12
+ * Router data
13
+ */
14
+ export type Router = [layers: AnyLayer[], routes: Route[], ...ChildRouter[]];
15
+ /**
16
+ * Infer param args from path
17
+ */
18
+ export type InferParams<Path extends string> = Path extends `${string}*${infer Rest}` ? Rest extends "*" ? [string] : [string, ...InferParams<Rest>] : [];
19
+ // Handle a specific method
20
+ export type HandleMethod = <Path extends string>(path: Path, ...layers: AnyRouteLayer<InferParams<Path>>[]) => Route;
21
+ /**
22
+ * Create a router
23
+ */
24
+ export declare const init: (...args: Router) => Router;
25
+ export declare const handle: <Path extends string>(method: string, path: Path, ...layers: AnyRouteLayer<InferParams<Path>>[]) => Route;
26
+ export declare const mount: (...args: ChildRouter) => ChildRouter;
27
+ export declare const get: HandleMethod;
28
+ export declare const post: HandleMethod;
29
+ export declare const put: HandleMethod;
30
+ export declare const del: HandleMethod;
31
+ export declare const patch: HandleMethod;
32
+ export declare const options: HandleMethod;
package/router.js ADDED
@@ -0,0 +1 @@
1
+ import{argsToArray}from"./utils.js";export let init=argsToArray;export let handle=argsToArray;export let mount=argsToArray;let GET=[`GET`];export let get=(...args)=>GET.concat(args);let POST=[`POST`];export let post=(...args)=>POST.concat(args);let PUT=[`PUT`];export let put=(...args)=>PUT.concat(args);let DELETE=[`DELETE`];export let del=(...args)=>DELETE.concat(args);let PATCH=[`PATCH`];export let patch=(...args)=>PATCH.concat(args);let OPTIONS=[`OPTIONS`];export let options=(...args)=>OPTIONS.concat(args);
package/utils.d.ts ADDED
@@ -0,0 +1 @@
1
+ export declare const argsToArray: <T extends any[]>(...args: T) => T;
package/utils.js ADDED
@@ -0,0 +1 @@
1
+ export let argsToArray=(...args)=>args;
@@ -1,10 +0,0 @@
1
- import type { State } from "./state.ts";
2
- /**
3
- * Compile a function to call statement.
4
- * Use in `default` and `build` mode.
5
- */
6
- export declare const buildCall: (state: State, fn: (...args: any[]) => any, paramCount: number, params: string) => string;
7
- /**
8
- * Hydrate a call.
9
- */
10
- export declare const hydrateCall: (state: State, fn: (...args: any[]) => any, paramCount: number) => void;
package/compiler/call.js DELETED
@@ -1 +0,0 @@
1
- import{getDeps}from"runtime-compiler/call";import{injectExternalDependency}from"runtime-compiler";import{AsyncFunction}from"runtime-compiler/utils";export let buildCall=(state,fn,paramCount,params)=>{let fnId=injectExternalDependency(fn);if(fn instanceof AsyncFunction){state[0]=true;fnId=`await `+fnId}let deps=getDeps(fn);return deps==null?fn.length>paramCount?(state[1]=true,`${fnId}(${params}mc)`):`${fnId}(${params})`:fn.length>paramCount+deps.length?(state[1]=true,`${fnId}(${deps.join()},${params}mc)`):`${fnId}(${deps.join()},${params})`};export let hydrateCall=(state,fn,paramCount)=>{injectExternalDependency(fn);state[0]||=fn instanceof AsyncFunction;let deps=getDeps(fn);state[1]||=fn.length>(deps==null?paramCount:deps.length+paramCount)};
@@ -1,37 +0,0 @@
1
- /**
2
- * @module Global compiler hooks
3
- *
4
- * ONLY COMPILER MODULES SHOULD INCLUDE THIS FILE.
5
- * IF NOT IT BREAKS BUNDLING :(
6
- */
7
- import type { Route } from "./router.ts";
8
- import type { State } from "./state.ts";
9
- export declare let registerRoute: (route: Route, state: State, prefix: string, content: string) => any;
10
- /**
11
- * Set a callback that register routes to a router.
12
- * Use in `default` and `build` mode.
13
- */
14
- export declare const setRegisterRoute: (f: typeof registerRoute) => void;
15
- export declare let routeParamMap: string[];
16
- /**
17
- * Set route param map.
18
- * Use in `default` and `build` mode.
19
- *
20
- * @example
21
- * setRouteParamMap([
22
- * '', 'err'
23
- * ]);
24
- *
25
- * routeParamMap[paramCount << 1]; // No context
26
- * routeParamMap[paramCount << 1 | 1]; // With context
27
- */
28
- export declare const setRouteParamMap: (m: string[]) => void;
29
- export declare let handlerArgs: string;
30
- /**
31
- * Set request handler args.
32
- * Use in `default` and `build` mode.
33
- *
34
- * @example
35
- * setHandlerArgs('(req, env, ctx)');
36
- */
37
- export declare const setHandlerArgs: (a: string) => void;
@@ -1 +0,0 @@
1
- export let registerRoute;export let setRegisterRoute=f=>{registerRoute=f};export let routeParamMap=[];export let setRouteParamMap=m=>{routeParamMap=m};export let handlerArgs;export let setHandlerArgs=a=>{handlerArgs=a};
@@ -1,38 +0,0 @@
1
- import type { State } from "./state.ts";
2
- import type { RequestMethod } from "../generic/types.ts";
3
- /*
4
- * From what i've tested closures use 5x more
5
- * memory than [fn, ...data] and runs slower too
6
- */
7
- export type Layer<Data extends any[] = any[]> = [build: (data: any[], state: State) => string, ...Data];
8
- export type InferPath<Path extends string> = Path extends `${string}*${infer Rest}` ? Rest extends "*" ? [string] : [string, ...InferPath<Rest>] : [];
9
- export type RouteLayer<Params extends any[]> = [build: (data: any[], state: State, paramCount: number, paramString: string) => string, ...any[]] & {
10
- _?: Params;
11
- };
12
- export type Route = [method: string, path: string, ...layers: RouteLayer<any[]>[]];
13
- export type RegisterRouteFn = <const Path extends string>(path: Path, ...layers: RouteLayer<InferPath<Path>>[]) => Route;
14
- export type RegisterRouteWithMethodFn = <const Path extends string>(method: RequestMethod, path: Path, ...layers: RouteLayer<InferPath<Path>>[]) => Route;
15
- export type Router = [layers: Layer[], routes: Route[]] | [layers: Layer[], routes: Route[], children: Record<string, Router>];
16
- /**
17
- * Run a layer
18
- */
19
- export declare const evaluateLayer: (layer: Layer, state: State) => string;
20
- /**
21
- * Run a route layer
22
- */
23
- export declare const evaluateRouteLayer: (layer: RouteLayer<any[]>, state: State, paramCount: number, params: string) => string;
24
- // Build implementations
25
- /**
26
- * Use in `default` and `build` mode.
27
- *
28
- * @example
29
- * build(router, [false, false] as any, '', '');
30
- */
31
- export declare const build: (router: Router, state: State, prefix: string, content: string) => void;
32
- /**
33
- * Use in `hydrate` mode.
34
- *
35
- * @example
36
- * build(router, [false, false] as any);
37
- */
38
- export declare const hydrate: (router: Router, state: State) => void;
@@ -1 +0,0 @@
1
- import{countParams}from"@mapl/router/utils";import{registerRoute,routeParamMap}from"./globals.js";export let evaluateLayer=(layer,state)=>layer[0](layer,state);export let evaluateRouteLayer=(layer,state,paramCount,params)=>layer[0](layer,state,paramCount,params);export let build=(router,state,prefix,content)=>{for(let i=0,layers=router[0];i<layers.length;i++)content+=evaluateLayer(layers[i],state);for(let i=0,routes=router[1];i<routes.length;i++){let route=routes[i];let routeState=state.slice();let routeContent=content;for(let j=2,paramCount=countParams(route[1]),params=routeParamMap[paramCount];j<route.length;j++)routeContent+=evaluateRouteLayer(route[j],routeState,paramCount,params);registerRoute(route,routeState,prefix,routeContent)}if(router.length>2){let children=router[2];for(let key in children)build(children[key],state.slice(),key===`/`?prefix:prefix+key,content)}};export let hydrate=(router,state)=>{for(let i=0,layers=router[0];i<layers.length;i++)evaluateLayer(layers[i],state);for(let i=0,routes=router[1];i<routes.length;i++){let route=routes[i];let routeState=state.slice();for(let j=2,paramCount=countParams(route[1]);j<route.length;j++)evaluateRouteLayer(route[j],routeState,paramCount,``)}if(router.length>2){let children=router[2];for(const key in children)hydrate(children[key],state.slice())}};
@@ -1,32 +0,0 @@
1
- export interface State extends Array<any> {
2
- /**
3
- * Whether scope should be async
4
- */
5
- 0: boolean;
6
- /**
7
- * Whether the scope needs a context object
8
- */
9
- 1: boolean;
10
- /**
11
- * Fork the current state
12
- */
13
- slice: () => this;
14
- }
15
- /**
16
- * Create initial state
17
- */
18
- export declare const initState: () => State;
19
- /**
20
- * Use in `default` and `build` mode.
21
- *
22
- * @example
23
- * finalizeReturn([true, true], 'return await fn(c);');
24
- */
25
- export declare const finalizeReturn: (state: State, content: string) => string;
26
- /**
27
- * Use in `default` and `build` mode.
28
- *
29
- * @example
30
- * finalizeFn([true, true], 'return await fn(c);');
31
- */
32
- export declare const finalizeFn: (state: State, content: string) => string;
package/compiler/state.js DELETED
@@ -1 +0,0 @@
1
- import{injectDependency}from"runtime-compiler";import{handlerArgs}from"./globals.js";export let initState=()=>[false,false];let wrapContent=(state,content)=>state[1]?`let mh=[],mc={status:200,headers:mh};`+content:content;export let finalizeReturn=(state,content)=>state[0]?`return `+injectDependency(`async${handlerArgs}=>{${wrapContent(state,content)}}`)+handlerArgs:wrapContent(state,content);export let finalizeFn=(state,content)=>injectDependency(`${state[0]?`async`+handlerArgs:handlerArgs}=>{${wrapContent(state,content)}}`);
@@ -1,23 +0,0 @@
1
- import type { Context, MaybePromise } from "./types.ts";
2
- import type { RouteLayer } from "../compiler/router.ts";
3
- // Send text and streams
4
- type SendFn<Params extends any[]> = (...args: [...Params, c: Context]) => MaybePromise<BodyInit | null>;
5
- export declare const sendFn: RouteLayer<any[]>[0];
6
- /**
7
- * Send raw content
8
- */
9
- export declare const raw: <Params extends any[]>(fn: SendFn<Params>) => RouteLayer<Params>;
10
- // Send JSON
11
- type SendJSONFn<Params extends any[]> = (...args: [...Params, c: Context]) => any;
12
- export declare const sendJSONFn: RouteLayer<any[]>[0];
13
- /**
14
- * Send JSON
15
- */
16
- export declare const json: <Params extends any[]>(fn: SendJSONFn<Params>) => RouteLayer<Params>;
17
- // Send HTML
18
- export declare const sendHTMLFn: RouteLayer<any[]>[0];
19
- /**
20
- * Send HTML
21
- */
22
- export declare const html: <Params extends any[]>(fn: SendFn<Params>) => RouteLayer<Params>;
23
- export {};
@@ -1 +0,0 @@
1
- import{isHydrating}from"runtime-compiler/config";import{buildCall,hydrateCall}from"../compiler/call.js";let onlyHydrateCall=(data,state,paramCount)=>(hydrateCall(state,data[1],paramCount),``);export let sendFn=isHydrating?onlyHydrateCall:(data,state,paramCount,params)=>{let call=buildCall(state,data[1],paramCount,params);return state[1]?`return new Response(${call},mc)`:`return new Response(${call})`};export let raw=fn=>[sendFn,fn];export let sendJSONFn=isHydrating?onlyHydrateCall:(data,state,paramCount,params)=>{let call=buildCall(state,data[1],paramCount,params);return state[1]?`mh.push(mjh);return new Response(${call},mc)`:`return new Response(${call},mjo)`};export let json=fn=>[sendJSONFn,fn];export let sendHTMLFn=isHydrating?onlyHydrateCall:(data,state,paramCount,params)=>{let call=buildCall(state,data[1],paramCount,params);return state[1]?`mh.push(mhh);return new Response(${call},mc)`:`return new Response(${call},mho)`};export let html=fn=>[sendHTMLFn,fn];
@@ -1,6 +0,0 @@
1
- import type { Layer } from "../compiler/router.ts";
2
- import type { Context } from "./types.ts";
3
- /**
4
- * Run a function on every request
5
- */
6
- export declare const tap: <const Fn extends (c: Context) => any>(fn: Fn) => Layer<[Fn]>;
package/generic/layers.js DELETED
@@ -1 +0,0 @@
1
- import{isHydrating}from"runtime-compiler/config";import{buildCall,hydrateCall}from"../compiler/call.js";let buildTap=isHydrating?(data,state)=>(hydrateCall(state,data[1],0),``):(data,state)=>buildCall(state,data[1],0,``)+`;`;export let tap=fn=>[buildTap,fn];
@@ -1,21 +0,0 @@
1
- import { type InferErr, type InferResult, isErr } from "@safe-std/error";
2
- import { type LocalDependency } from "runtime-compiler";
3
- import type { Context } from "./types.ts";
4
- import { type Layer, type RouteLayer } from "../compiler/router.ts";
5
- interface ParseLayerFn {
6
- <const T>(fn: (c: Context) => T, handleError: RouteLayer<[InferErr<Awaited<T>>]>): Layer<[LocalDependency<InferResult<Awaited<T>>>, typeof fn, typeof handleError]>;
7
- <const T>(fn: (c: Context) => T): Layer<[LocalDependency<Awaited<T>>, typeof fn]>;
8
- }
9
- /**
10
- * Check whether value is an error
11
- */
12
- export declare const IS_ERR: LocalDependency<typeof isErr>;
13
- /**
14
- * Parse and assign the value to a local variable on every request
15
- */
16
- export declare const init: ParseLayerFn;
17
- /**
18
- * Get the parsed result of a parser
19
- */
20
- export declare const result: <T extends LocalDependency<any>>(parser: Layer<[T, ...any[]]>) => T;
21
- export {};
@@ -1 +0,0 @@
1
- import{isErr}from"@safe-std/error";import{injectExternalDependency}from"runtime-compiler";import{isHydrating}from"runtime-compiler/config";import{evaluateRouteLayer}from"../compiler/router.js";import{buildCall,hydrateCall}from"../compiler/call.js";export let IS_ERR=injectExternalDependency(isErr);let buildParse=isHydrating?(data,state)=>(hydrateCall(state,data[2],0),data.length>3?evaluateRouteLayer(data[3],state,1,data[1]):``):(data,state)=>{let id=data[1];return`let ${id}=${buildCall(state,data[2],0,``)};`+(data.length>3?`if(${IS_ERR}(${id})){${evaluateRouteLayer(data[3],state,1,id+`,`)}}`:``)};let tmpId=0;export let init=(fn,handleError)=>handleError==null?[buildParse,`mt`+ tmpId++,fn]:[buildParse,`mt`+ tmpId++,fn,handleError];export let result=parser=>parser[1];
@@ -1,12 +0,0 @@
1
- import type { RegisterRouteFn, RegisterRouteWithMethodFn, Router } from "../compiler/router.ts";
2
- export declare const get: RegisterRouteFn;
3
- export declare const post: RegisterRouteFn;
4
- export declare const put: RegisterRouteFn;
5
- export declare const del: RegisterRouteFn;
6
- export declare const patch: RegisterRouteFn;
7
- export declare const options: RegisterRouteFn;
8
- export declare const trace: RegisterRouteFn;
9
- export declare const query: RegisterRouteFn;
10
- export declare const any: RegisterRouteFn;
11
- export declare const def: RegisterRouteWithMethodFn;
12
- export declare const init: (layers: Router[0], routes: Router[1], children?: Router[2]) => Router;
package/generic/route.js DELETED
@@ -1 +0,0 @@
1
- let GET=[`GET`];export let get=(...args)=>GET.concat(args);let POST=[`POST`];export let post=(...args)=>POST.concat(args);let PUT=[`PUT`];export let put=(...args)=>PUT.concat(args);let DEL=[`DELETE`];export let del=(...args)=>DEL.concat(args);let PATCH=[`PATCH`];export let patch=(...args)=>PATCH.concat(args);let OPTIONS=[`OPTIONS`];export let options=(...args)=>OPTIONS.concat(args);let TRACE=[`TRACE`];export let trace=(...args)=>TRACE.concat(args);let QUERY=[`QUERY`];export let query=(...args)=>QUERY.concat(args);let ANY=[``];export let any=(...args)=>ANY.concat(args);export let def=(...args)=>args;export let init=(layers,routes,children)=>children==null?[layers,routes]:[layers,routes,children];
@@ -1,7 +0,0 @@
1
- export type Header = [string, string] | readonly [string, string];
2
- export interface Context {
3
- status: number;
4
- headers: Header[];
5
- }
6
- export type MaybePromise<T> = T | Promise<T>;
7
- export type RequestMethod = "GET" | "POST" | "PUT" | "DELETE" | "PATCH" | "OPTIONS" | "TRACE" | (string & {});
package/generic/types.js DELETED
@@ -1 +0,0 @@
1
- export{};
@@ -1,11 +0,0 @@
1
- import type { Header, RequestMethod } from "../types.ts";
2
- import type { Layer } from "../../compiler/router.ts";
3
- export type PreflightHeader = Header & {
4
- "~": 0;
5
- };
6
- export declare const allowMethods: (methods: [RequestMethod, RequestMethod, ...RequestMethod[]] | RequestMethod | "*") => PreflightHeader;
7
- export declare const allowHeaders: (headers: string | string[]) => PreflightHeader;
8
- export declare const maxAge: (seconds: number) => PreflightHeader;
9
- export declare const allowCredentials: Header;
10
- export declare const exposeHeaders: (headers: "*" | (string & {}) | [string, string, ...string[]]) => Header;
11
- export declare const init: (origins: "*" | (string & {}) | [string, string, ...string[]], preflightHeaders?: [PreflightHeader, ...PreflightHeader[]], headers?: [Header, ...Header[]]) => Layer<any[]>;
@@ -1 +0,0 @@
1
- import{isHydrating}from"runtime-compiler/config";import{injectDependency}from"runtime-compiler";import{injectArgsList}from"runtime-compiler/utils";export let allowMethods=methods=>[`access-control-allow-methods`,``+methods];export let allowHeaders=headers=>[`access-control-allow-headers`,``+headers];export let maxAge=seconds=>[`access-control-max-age`,``+seconds];export let allowCredentials=[`access-control-allow-credentials`,`true`];export let exposeHeaders=headers=>[`access-control-expose-headers`,``+headers];let hydrateInit=[(_,state)=>(state[1]=true,``),null,null,null];let buildInit=(layer,state)=>{state[1]=true;let origins=layer[1];let preflightHeaders=layer[2];let headers=layer[3]??[];if(origins!==`*`){headers.push([`vary`,`origin`]);if(Array.isArray(origins)){let str=`(r,h)=>{let o=r.headers.get("origin");h.push(["access-control-allow-origin",typeof o==="string"&&o===`+JSON.stringify(origins[1]);for(let i=2;i<origins.length;i++)str+=`||o===`+JSON.stringify(origins[i]);return injectDependency(str+`?o:`+JSON.stringify(origins[0])+`]);`+(headers.length>0?`h.push(`+injectArgsList(headers)+`);`:``)+(preflightHeaders!=null?`r.method==="OPTIONS"&&h.push(`+injectArgsList(preflightHeaders)+`)}`:`}`))+`(mr,mh);`}}headers.push([`access-control-allow-origin`,origins]);let pushHeaders=headers.length>0?`h.push(`+injectArgsList(headers)+`);`:``;return preflightHeaders!=null?injectDependency(`(r,h)=>{`+pushHeaders+`r.method==="OPTIONS"&&h.push(`+injectArgsList(preflightHeaders)+`)}`)+`(mr,mh);`:pushHeaders};export let init=isHydrating?()=>hydrateInit:(origin,preflightHeaders,headers)=>[buildInit,origin,preflightHeaders,headers];