@mapl/web 0.2.0 → 0.3.0-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/compiler/aot.js +1 -1
- package/compiler/jit.d.ts +3 -1
- package/compiler/jit.js +1 -1
- package/constants.d.ts +0 -7
- package/constants.js +1 -1
- package/core/handler.d.ts +31 -23
- package/core/handler.js +1 -1
- package/core/middleware.d.ts +1 -1
- package/core/middleware.js +1 -1
- package/core/utils.d.ts +1 -0
- package/core/utils.js +1 -1
- package/package.json +10 -10
- package/utils/cors.js +1 -1
- package/utils/static-headers.js +1 -1
package/compiler/aot.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{hydrateDependency,setHooks}from"@mapl/framework";import{injectExternalDependency,markExported}from"runtime-compiler";import"../core/context.js";export default router=>{let
|
|
1
|
+
import{hydrateDependency,setHooks}from"@mapl/framework";import{injectExternalDependency,markExported}from"runtime-compiler";import"../core/context.js";import{countParams}from"@mapl/router/path";export default router=>{setHooks({compileHandler:(handler,_,_1,scope)=>{let fn=handler[2];injectExternalDependency(fn);handler[3]?.type?.(``,scope[1]||fn.length>countParams(handler[1]))},compileErrorHandler:(_,fn,dat,scope)=>{injectExternalDependency(fn);dat?.type?.(``,scope[1]||fn.length>1);return``}});hydrateDependency(router,[false,false,,``,false],``);markExported()};
|
package/compiler/jit.d.ts
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import type { RouterTag } from "../core/index.js";
|
|
2
2
|
import { type CompiledDependency } from "runtime-compiler";
|
|
3
|
+
export declare const RES404: string;
|
|
4
|
+
export declare const RES400: string;
|
|
3
5
|
export declare const compileToString: (router: RouterTag) => string;
|
|
4
|
-
export declare const
|
|
6
|
+
export declare const compileToExportedDependency: (router: RouterTag) => CompiledDependency<(req: Request) => any>;
|
|
5
7
|
export declare const compileToHandler: (router: RouterTag) => Promise<(req: Request) => any>;
|
|
6
8
|
export declare const compileToHandlerSync: (router: RouterTag) => ((req: Request) => any);
|
package/compiler/jit.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{compileGroup,createArgSet,AsyncFunction,setHooks,contextInit,setContextInit}from"@mapl/framework";import compile from"@mapl/router/method/compiler";import{countParams}from"@mapl/router/path";import{insertItem}from"@mapl/router/method";import{exportDependency,getDependency,injectDependency,injectExternalDependency}from"runtime-compiler";import{evaluate,evaluateSync}from"runtime-compiler/jit";let
|
|
1
|
+
import{compileGroup,createArgSet,AsyncFunction,setHooks,contextInit,setContextInit}from"@mapl/framework";import compile from"@mapl/router/method/compiler";import{countParams}from"@mapl/router/path";import{insertItem}from"@mapl/router/method";import{exportDependency,getDependency,injectDependency,injectExternalDependency}from"runtime-compiler";import{evaluate,evaluateSync}from"runtime-compiler/jit";let URL_ROUTER;export let RES404=injectDependency(`new Response(null,{status:404})`);export let RES400=injectDependency(`new Response(null,{status:400})`);let paramArgs=createArgSet(new Array(16).fill(0).map((_1,i)=>`q`+i));let compileReturn=(dat,fnAsync,scopeAsync,contextCreated,result)=>{let res=dat?.type;if(res==null)return`return `+result;let str=res(fnAsync?`await `+result:result,contextCreated);return fnAsync&&!scopeAsync?`return (async()=>{`+str+`})()`:str};let compileToState=router=>{URL_ROUTER={};setHooks({compileHandler:(handler,prevContent,path,scope)=>{let fn=handler[2];let call=injectExternalDependency(fn)+`(`;let paramCount=countParams(handler[1]);paramCount>0&&(call+=paramArgs[paramCount]);if(fn.length>paramCount){call+=paramCount===0?`c`:`,c`;if(!scope[1]){insertItem(URL_ROUTER,handler[0],path,prevContent+contextInit+compileReturn(handler[3],fn instanceof AsyncFunction,scope[0],true,call+`)`)+(scope[0]?`})()`:``));return}}insertItem(URL_ROUTER,handler[0],path,prevContent+compileReturn(handler[3],fn instanceof AsyncFunction,scope[0],scope[1],call+`)`)+(scope[0]?`})()`:``))},compileErrorHandler:(input,fn,dat,scope)=>{let call=injectExternalDependency(fn)+`(`+input;if(fn.length>1){call+=`,c`;if(!scope[1])return contextInit+compileReturn(dat,fn instanceof AsyncFunction,scope[0],true,call+`)`)}return compileReturn(dat,fn instanceof AsyncFunction,scope[0],scope[1],call+`)`)}});setContextInit(`let h=[],c={status:200,req:r,headers:h};`);compileGroup(router,[false,false,,`return `+RES400,false],``,``)};export let compileToString=router=>{compileToState(router);return`(r)=>{`+compile(URL_ROUTER,`r.method`,`let u=r.url,s=u.indexOf("/",12)+1,e=u.indexOf("?",s),p=e===-1?u.slice(s):u.slice(s,e);`,1)+`return `+RES404+`}`};export let compileToExportedDependency=router=>exportDependency(injectDependency(`(`+compileToString(router)+`)()`));export let compileToHandler=async router=>{let id=compileToExportedDependency(router);await evaluate();return getDependency(id)};export let compileToHandlerSync=router=>{let id=compileToExportedDependency(router);evaluateSync();return getDependency(id)};
|
package/constants.d.ts
CHANGED
|
@@ -2,10 +2,3 @@ export * from "@mapl/framework/constants";
|
|
|
2
2
|
export declare const HEADERS: string;
|
|
3
3
|
export declare const CTX_INIT: string;
|
|
4
4
|
export declare const PARSE_PATH: string;
|
|
5
|
-
export declare const CHTML: string;
|
|
6
|
-
export declare const CJSON: string;
|
|
7
|
-
export declare const OHTML: string;
|
|
8
|
-
export declare const OJSON: string;
|
|
9
|
-
export declare const R404: string;
|
|
10
|
-
export declare const R400: string;
|
|
11
|
-
export declare const GLOBALS: string;
|
package/constants.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{CTX,PATH,REQ,URL,PATH_START,PATH_END
|
|
1
|
+
import{CTX,PATH,REQ,URL,PATH_START,PATH_END}from"@mapl/framework/constants";export*from"@mapl/framework/constants";export let HEADERS=`h`;export let CTX_INIT=`let `+HEADERS+`=[],`+CTX+`={status:200,req:`+REQ+`,headers:`+HEADERS+`};`;export let PARSE_PATH=`let `+URL+`=`+REQ+`.url,`+PATH_START+`=`+URL+`.indexOf("/",12)+1,`+PATH_END+`=`+URL+`.indexOf("?",`+PATH_START+`),`+PATH+`=`+PATH_END+`===-1?`+URL+`.slice(`+PATH_START+`):`+URL+`.slice(`+PATH_START+`,`+PATH_END+`);`;
|
package/core/handler.d.ts
CHANGED
|
@@ -1,20 +1,30 @@
|
|
|
1
1
|
import type { Err } from "@safe-std/error";
|
|
2
2
|
import type { Context } from "./context.js";
|
|
3
3
|
import type { RouterTag } from "./index.js";
|
|
4
|
-
import type
|
|
5
|
-
export type
|
|
4
|
+
import { type RequestMethod } from "./utils.js";
|
|
5
|
+
export type HandlerResponse<I = any> = (response: string, hasContext: boolean, _?: I) => string;
|
|
6
|
+
export interface HandlerData extends Record<symbol, any> {
|
|
7
|
+
type?: HandlerResponse;
|
|
8
|
+
}
|
|
6
9
|
export type Handler<
|
|
7
10
|
Params extends string[] = string[],
|
|
8
|
-
T extends {} = Record<string, any
|
|
9
|
-
|
|
10
|
-
|
|
11
|
+
T extends {} = Record<string, any>,
|
|
12
|
+
R = any
|
|
13
|
+
> = (...args: [...params: Params, c: Context & T]) => R;
|
|
14
|
+
export type InferPath<T extends string> = T extends `${string}*${infer Next}` ? Next extends "*" ? [string] : [string, ...InferPath<Next>] : [];
|
|
15
|
+
export type InferReturn<D extends HandlerData | undefined> = D extends HandlerData ? D["type"] extends HandlerResponse<infer I> ? I : Response : Response;
|
|
16
|
+
export type InferHandler<
|
|
11
17
|
P extends string,
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
18
|
+
D extends HandlerData | undefined,
|
|
19
|
+
C
|
|
20
|
+
> = Handler<InferPath<P>, Required<C>, InferReturn<D>>;
|
|
21
|
+
export interface DefineHandler {
|
|
22
|
+
<
|
|
23
|
+
P extends string,
|
|
24
|
+
const D extends HandlerData | undefined = undefined,
|
|
25
|
+
C = {}
|
|
26
|
+
>(path: P, handler: NoInfer<InferHandler<P, D, C>>, dat?: D): HandlerTag<C>;
|
|
16
27
|
}
|
|
17
|
-
export type InferPath<T extends string> = T extends `${string}*${infer Next}` ? Next extends "*" ? [string] : [string, ...InferPath<Next>] : [];
|
|
18
28
|
declare const handlerTag: unique symbol;
|
|
19
29
|
export interface HandlerTag<T> {
|
|
20
30
|
[handlerTag]: T;
|
|
@@ -22,26 +32,23 @@ export interface HandlerTag<T> {
|
|
|
22
32
|
/**
|
|
23
33
|
* Return JSON
|
|
24
34
|
*/
|
|
25
|
-
export declare const json:
|
|
26
|
-
readonly type: "json"
|
|
27
|
-
};
|
|
35
|
+
export declare const json: HandlerResponse;
|
|
28
36
|
/**
|
|
29
37
|
* Return HTML
|
|
30
38
|
*/
|
|
31
|
-
export declare const html:
|
|
32
|
-
readonly type: "html"
|
|
33
|
-
};
|
|
39
|
+
export declare const html: HandlerResponse<BodyInit>;
|
|
34
40
|
/**
|
|
35
|
-
* Return
|
|
41
|
+
* Return a body init
|
|
36
42
|
*/
|
|
37
|
-
export declare const
|
|
38
|
-
readonly type: "raw"
|
|
39
|
-
};
|
|
43
|
+
export declare const text: HandlerResponse<BodyInit>;
|
|
40
44
|
/**
|
|
41
45
|
* Handle errors of a router
|
|
42
46
|
* @param f
|
|
43
47
|
*/
|
|
44
|
-
export declare const error: <
|
|
48
|
+
export declare const error: <
|
|
49
|
+
const E extends Err,
|
|
50
|
+
const D extends HandlerData | undefined = undefined
|
|
51
|
+
>(r: RouterTag<E>, f: NoInfer<(err: E, c: Context) => InferReturn<D>>, dat?: D) => RouterTag<never>;
|
|
45
52
|
/**
|
|
46
53
|
* Handle requests to a path with a specific method
|
|
47
54
|
* @param method
|
|
@@ -51,8 +58,9 @@ export declare const error: <const E extends Err>(r: RouterTag<E>, f: ErrorHandl
|
|
|
51
58
|
*/
|
|
52
59
|
export declare const route: <
|
|
53
60
|
P extends string,
|
|
54
|
-
|
|
55
|
-
|
|
61
|
+
const D extends HandlerData | undefined = undefined,
|
|
62
|
+
C = {}
|
|
63
|
+
>(method: RequestMethod, path: P, handler: NoInfer<InferHandler<P, D, C>>, dat?: D) => HandlerTag<C>;
|
|
56
64
|
export declare const any: DefineHandler;
|
|
57
65
|
export declare const get: DefineHandler;
|
|
58
66
|
export declare const post: DefineHandler;
|
package/core/handler.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export let json={type
|
|
1
|
+
import{noOp}from"./utils.js";import{isHydrating}from"runtime-compiler/config";import{injectDependency}from"runtime-compiler";export let json=isHydrating?noOp:(()=>{let jsonHeader=injectDependency(`["content-type","application/json"]`);let jsonOptions=injectDependency(`{headers:[`+jsonHeader+`]}`);return(res,hasContext)=>hasContext?`h.push(`+jsonHeader+`);return new Response(JSON.stringify(`+res+`),c)`:`return new Response(JSON.stringify(`+res+`),`+jsonOptions+`)`})();export let html=isHydrating?noOp:(()=>{let htmlHeader=injectDependency(`["content-type","text/html"]`);let htmlOptions=injectDependency(`{headers:[`+htmlHeader+`]}`);return(res,hasContext)=>hasContext?`h.push(`+htmlHeader+`);return new Response(`+res+`,c)`:`return new Response(`+res+`,`+htmlOptions+`)`})();export let text=isHydrating?noOp:(res,hasContext)=>`return new Response(`+res+(hasContext?`,c)`:`)`);export let error=(r,f,dat)=>{r[2]=[f,dat];return r};export let route=(method,path,handler,dat)=>[method,path,handler,dat];export let any=(path,handler,dat)=>[``,path,handler,dat];export let get=(path,handler,dat)=>[`GET`,path,handler,dat];export let post=(path,handler,dat)=>[`POST`,path,handler,dat];export let put=(path,handler,dat)=>[`PUT`,path,handler,dat];export let del=(path,handler,dat)=>[`DELETE`,path,handler,dat];export let patch=(path,handler,dat)=>[`PATCH`,path,handler,dat];export let options=(path,handler,dat)=>[`OPTIONS`,path,handler,dat];export let trace=(path,handler,dat)=>[`TRACE`,path,handler,dat];
|
package/core/middleware.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { ScopeState } from "@mapl/framework";
|
|
2
2
|
import type { InferErr, InferResult } from "@safe-std/error";
|
|
3
|
-
import type
|
|
3
|
+
import { type AwaitedReturn } from "./utils.js";
|
|
4
4
|
import type { Context } from "./context.js";
|
|
5
5
|
export type MiddlewareHandler = (c: Context) => any;
|
|
6
6
|
export type MiddlewareTypes<
|
package/core/middleware.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export let macro=f=>[-1,f];export let noOpMacro=macro(
|
|
1
|
+
import{noOp}from"./utils.js";export let macro=f=>[-1,f];export let noOpMacro=macro(noOp);export let tap=f=>[0,f];export let attach=(prop,f)=>[1,f,prop];export let validate=f=>[2,f];export let parse=(prop,f)=>[3,f,prop];
|
package/core/utils.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
1
|
export type UnionToIntersection<U> = (U extends any ? (x: U) => void : never) extends (x: infer I) => void ? I : never;
|
|
2
2
|
export type AwaitedReturn<U extends (...a: any[]) => any> = Awaited<ReturnType<U>>;
|
|
3
3
|
export type RequestMethod = "GET" | "POST" | "PUT" | "DELETE" | "PATCH" | "OPTIONS" | "TRACE" | (string & {});
|
|
4
|
+
export declare const noOp: () => string;
|
package/core/utils.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export
|
|
1
|
+
export let noOp=()=>``;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mapl/web",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0-alpha.1",
|
|
4
4
|
"description": "A compiled web framework for all runtimes",
|
|
5
5
|
"keywords": ["fast", "lightweight", "cross-runtime", "framework", "web", "backend"],
|
|
6
6
|
"repository": {
|
|
@@ -12,26 +12,26 @@
|
|
|
12
12
|
"main": "./index.js",
|
|
13
13
|
"types": "./index.d.ts",
|
|
14
14
|
"dependencies": {
|
|
15
|
-
"@mapl/framework": "^0.4.
|
|
15
|
+
"@mapl/framework": "^0.4.7",
|
|
16
16
|
"@mapl/router": "^0.6.2",
|
|
17
17
|
"@safe-std/error": "^1.0.1",
|
|
18
|
-
"runtime-compiler": "^1.0.
|
|
18
|
+
"runtime-compiler": "^1.0.11"
|
|
19
19
|
},
|
|
20
20
|
"optionalDependencies": {
|
|
21
21
|
"secure-headers": "^0.0.6"
|
|
22
22
|
},
|
|
23
23
|
"exports": {
|
|
24
|
-
"./core/middleware": "./core/middleware.js",
|
|
25
|
-
"./core/context": "./core/context.js",
|
|
26
24
|
"./constants": "./constants.js",
|
|
27
|
-
"
|
|
25
|
+
".": "./index.js",
|
|
26
|
+
"./utils/secure-headers": "./utils/secure-headers.js",
|
|
27
|
+
"./core/context": "./core/context.js",
|
|
28
28
|
"./utils/cors": "./utils/cors.js",
|
|
29
|
+
"./core/middleware": "./core/middleware.js",
|
|
30
|
+
"./compiler/jit": "./compiler/jit.js",
|
|
29
31
|
"./core": "./core/index.js",
|
|
32
|
+
"./utils/static-headers": "./utils/static-headers.js",
|
|
30
33
|
"./compiler/aot": "./compiler/aot.js",
|
|
31
34
|
"./core/handler": "./core/handler.js",
|
|
32
|
-
"./core/utils": "./core/utils.js"
|
|
33
|
-
".": "./index.js",
|
|
34
|
-
"./utils/secure-headers": "./utils/secure-headers.js",
|
|
35
|
-
"./compiler/jit": "./compiler/jit.js"
|
|
35
|
+
"./core/utils": "./core/utils.js"
|
|
36
36
|
}
|
|
37
37
|
}
|
package/utils/cors.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{injectDependency}from"runtime-compiler";import{macro}from"../core/middleware.js";import{isHydrating}from"runtime-compiler/config";import{createContext}from"@mapl/framework";import{injectList}from"./static-headers.js";export let allowMethods=v=>[`access-control-allow-methods`,v];export let allowHeaders=v=>[`access-control-allow-headers`,``+v];export let maxAge=v=>[`access-control-max-age`,``+v];export let allowCredentials=[`access-control-allow-credentials`,`true`];export let exposeHeaders=v=>[`access-control-expose-headers`,``+v];let createContextMacro=macro(createContext);export let init=isHydrating?()=>createContextMacro:(origins,preflightHeaders=[],headers=[])=>{if(origins!==`*`){headers.push([`vary`,`origin`]);if(Array.isArray(origins))return macro(scope=>{let originList=injectDependency(JSON.stringify(origins));return createContext(scope)+(injectDependency(`(r,h)=>{let o=r.headers.get("origin");h.push(["access-control-allow-origin",typeof o==="string"&&`+originList+`.includes(o)?o:`+originList+`[0]]);`+(headers.length>0?`h.push(`+injectList(headers)+`);`:``)+(preflightHeaders.length>0?`r.method==="OPTIONS"&&h.push(`+injectList(preflightHeaders)+`)}`:`}`))+`(r,
|
|
1
|
+
import{injectDependency}from"runtime-compiler";import{macro}from"../core/middleware.js";import{isHydrating}from"runtime-compiler/config";import{createContext}from"@mapl/framework";import{injectList}from"./static-headers.js";export let allowMethods=v=>[`access-control-allow-methods`,v];export let allowHeaders=v=>[`access-control-allow-headers`,``+v];export let maxAge=v=>[`access-control-max-age`,``+v];export let allowCredentials=[`access-control-allow-credentials`,`true`];export let exposeHeaders=v=>[`access-control-expose-headers`,``+v];let createContextMacro=macro(createContext);export let init=isHydrating?()=>createContextMacro:(origins,preflightHeaders=[],headers=[])=>{if(origins!==`*`){headers.push([`vary`,`origin`]);if(Array.isArray(origins))return macro(scope=>{let originList=injectDependency(JSON.stringify(origins));return createContext(scope)+(injectDependency(`(r,h)=>{let o=r.headers.get("origin");h.push(["access-control-allow-origin",typeof o==="string"&&`+originList+`.includes(o)?o:`+originList+`[0]]);`+(headers.length>0?`h.push(`+injectList(headers)+`);`:``)+(preflightHeaders.length>0?`r.method==="OPTIONS"&&h.push(`+injectList(preflightHeaders)+`)}`:`}`))+`(r,h);`)})}headers.push([`access-control-allow-origin`,origins]);return macro(scope=>{let pushHeaders=headers.length>0?`h.push(`+injectList(headers)+`);`:``;return createContext(scope)+(preflightHeaders.length>0?injectDependency(`(r,h)=>{`+pushHeaders+`r.method==="OPTIONS"&&h.push(`+injectList(preflightHeaders)+`)}`)+`(r,h);`:pushHeaders)})};
|
package/utils/static-headers.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{isHydrating}from"runtime-compiler/config";import{macro,noOpMacro}from"../core/middleware.js";import{injectDependency}from"runtime-compiler";export let injectList=list=>list.length>1?`...`+injectDependency(JSON.stringify(list)):injectDependency(JSON.stringify(list[0]));export default isHydrating?()=>noOpMacro:headers=>macro(()=>`
|
|
1
|
+
import{isHydrating}from"runtime-compiler/config";import{macro,noOpMacro}from"../core/middleware.js";import{injectDependency}from"runtime-compiler";export let injectList=list=>list.length>1?`...`+injectDependency(JSON.stringify(list)):injectDependency(JSON.stringify(list[0]));export default isHydrating?()=>noOpMacro:headers=>macro(()=>`h.push(`+injectList(Array.isArray(headers)?headers:headers instanceof Headers?headers.entries().toArray():Object.entries(headers))+`);`);
|