@mapl/web 0.1.0 → 0.1.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/README.md +12 -7
- package/constants.d.ts +2 -0
- package/constants.js +1 -1
- package/core/compile.js +1 -1
- package/core/context.d.ts +1 -1
- package/core/context.js +1 -1
- package/core/handler.d.ts +51 -11
- package/core/handler.js +1 -1
- package/core/index.d.ts +15 -46
- package/core/index.js +1 -1
- package/core/middleware.d.ts +9 -3
- package/core/middleware.js +1 -1
- package/core/utils.d.ts +5 -0
- package/index.d.ts +3 -1
- package/index.js +1 -1
- package/package.json +5 -5
package/README.md
CHANGED
|
@@ -2,15 +2,20 @@
|
|
|
2
2
|
A compiled web framework for all runtimes.
|
|
3
3
|
|
|
4
4
|
```ts
|
|
5
|
-
import { router, layer, compile } from '@mapl/web';
|
|
5
|
+
import { router, handle, layer, compile } from '@mapl/web';
|
|
6
6
|
|
|
7
|
-
const
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
7
|
+
const api = router.init(
|
|
8
|
+
[],
|
|
9
|
+
[ handle.get('/', () => 'Hi') ]
|
|
10
|
+
);
|
|
11
|
+
|
|
12
|
+
const app = router.init(
|
|
13
|
+
[ layer.attach('id', () => performance.now()) ],
|
|
14
|
+
[ handle.get('/path', (c) => c.id) ],
|
|
15
|
+
{ '/api': api }
|
|
16
|
+
);
|
|
12
17
|
|
|
13
18
|
export default {
|
|
14
|
-
fetch: compile(app)
|
|
19
|
+
fetch: router.compile(app)
|
|
15
20
|
};
|
|
16
21
|
```
|
package/constants.d.ts
CHANGED
|
@@ -5,6 +5,8 @@ export declare const CTX_INIT: string;
|
|
|
5
5
|
export declare const PARSE_PATH: string;
|
|
6
6
|
export declare const CHTML: string;
|
|
7
7
|
export declare const CJSON: string;
|
|
8
|
+
export declare const OHTML: string;
|
|
9
|
+
export declare const OJSON: string;
|
|
8
10
|
export declare const R404: string;
|
|
9
11
|
export declare const R400: string;
|
|
10
12
|
export declare const GLOBALS: string;
|
package/constants.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{MAPL,HEADERS,CTX,PATH,REQ,URL,PATH_START,PATH_END}from"@mapl/framework/constants.js";export*from"@mapl/framework/constants.js";export let WEB=MAPL+`w`;export let CTX_FN=WEB+`c`;export let CTX_INIT=`let `+HEADERS+`=[],`+CTX+`=`+CTX_FN+`(`+REQ+`,`+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+`.substring(`+PATH_START+`,`+PATH_END+`);`;export let CHTML=WEB+`h`;export let CJSON=WEB+`j`;export let R404=WEB+`n`;export let R400=WEB+`b`;export let GLOBALS=`let
|
|
1
|
+
import{MAPL,HEADERS,CTX,PATH,REQ,URL,PATH_START,PATH_END,TMP}from"@mapl/framework/constants.js";export*from"@mapl/framework/constants.js";export let WEB=MAPL+`w`;export let CTX_FN=WEB+`c`;export let CTX_INIT=`let `+HEADERS+`=[],`+CTX+`=`+CTX_FN+`(`+REQ+`,`+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+`.substring(`+PATH_START+`,`+PATH_END+`);`;export let CHTML=WEB+`h`;export let CJSON=WEB+`j`;export let OHTML=WEB+`oh`;export let OJSON=WEB+`oj`;export let R404=WEB+`n`;export let R400=WEB+`b`;export let GLOBALS=`let `+TMP+`=["text/html","application/json"].map(c=>["Content-Type",c]),[`+CHTML+`,`+CJSON+`]=`+TMP+`,[`+OHTML+`,`+OJSON+`]=`+TMP+`.map(c=>({headers:[c]})),[`+R404+`,`+R400+`]=[404,400].map(s=>new Response(null,{status:s}));`;
|
package/core/compile.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{compileGroup,createArgSet,isFuncAsync}from"@mapl/framework";import{o2}from"@mapl/router/tree/compiler.js";import compile from"@mapl/router/method/compiler.js";import{countParams}from"@mapl/router/path/index.js";import{isErr}from"safe-throw";import createContext from"./context.js";let paramArgs=createArgSet(new Array(16).fill(0).map((_1,i)=>`q`+i));let compileReturn=(state,dat,fnAsync,scopeAsync,contextCreated,result)=>{let typ=dat.type;if(typ===`raw`)return`return `+result;if(fnAsync)result=`await `+result;let str=typ==null?`return new Response(`+result+(contextCreated?`,c)`:`)`):
|
|
1
|
+
import{compileGroup,createArgSet,isFuncAsync}from"@mapl/framework";import{o2}from"@mapl/router/tree/compiler.js";import compile from"@mapl/router/method/compiler.js";import{countParams}from"@mapl/router/path/index.js";import{isErr}from"safe-throw";import createContext from"./context.js";let paramArgs=createArgSet(new Array(16).fill(0).map((_1,i)=>`q`+i));let compileReturn=(state,dat,fnAsync,scopeAsync,contextCreated,result)=>{let typ=dat.type;if(typ===`raw`)return`return `+result;if(fnAsync)result=`await `+result;let str=typ==null?`return new Response(`+result+(contextCreated?`,c)`:`)`):contextCreated?`mh.push(`+(typ===`json`?`mwj`:`mwh`)+`);return new Response(`+(typ===`json`?`JSON.stringify(`+result+`)`:result)+`,c)`:`return new Response(`+(typ===`json`?`JSON.stringify(`+result+`),mwoj`:result+`,mwoh`)+`)`;return scopeAsync?str+`})()`:fnAsync?`return (async()=>{`+str+`})()`:str};export default router=>{let baseRouter={};let dependencies=[];compileGroup(router,[baseRouter,dependencies,`let mh=[],c=mwc(r,mh);`,(fn,dat,path,state,scope)=>{let call=`f`+state[1].push(fn)+`(`;let paramCount=countParams(path);if(paramCount>0)call+=paramArgs[paramCount];if(fn.length>paramCount){call+=paramCount===0?`c`:`,c`;if(!scope[1])return state[2]+compileReturn(state,dat,isFuncAsync(fn),scope[0],true,call+`)`)}return compileReturn(state,dat,isFuncAsync(fn),scope[0],scope[1],call+`)`)},(fn,dat,state,scope)=>{let call=`f`+state[1].push(fn)+`(t`;if(fn.length>1){call+=`,c`;if(!scope[1])return state[2]+compileReturn(state,dat,isFuncAsync(fn),scope[0],true,call+`)`)}return compileReturn(state,dat,isFuncAsync(fn),scope[0],scope[1],call+`)`)}],[false,false,null,`return mwb`],``,``);return Function(`me`,`mwc`,...dependencies.map((_,i)=>`f`+(i+1)),`let t=["text/html","application/json"].map(c=>["Content-Type",c]),[mwh,mwj]=t,[mwoh,mwoj]=t.map(c=>({headers:[c]})),[mwn,mwb]=[404,400].map(s=>new Response(null,{status:s}));return(r)=>{`+compile(baseRouter,o2,`r.method`,`let u=r.url,s=u.indexOf("/",12)+1,e=u.indexOf("?",s),p=e===-1?u.slice(s):u.substring(s,e);`,1)+`return mwn}`)(isErr,createContext,...dependencies)};
|
package/core/context.d.ts
CHANGED
package/core/context.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{proto}from"./utils.js";let ctxProto=proto({req:void 0,headers:void 0,status:200});export default req=>{let obj=Object.create(ctxProto);obj.headers=
|
|
1
|
+
import{proto}from"./utils.js";let ctxProto=proto({req:void 0,headers:void 0,status:200});export default (req,headers)=>{let obj=Object.create(ctxProto);obj.headers=headers;obj.req=req;return obj};
|
package/core/handler.d.ts
CHANGED
|
@@ -1,22 +1,62 @@
|
|
|
1
1
|
import type { Err } from "safe-throw";
|
|
2
2
|
import type { Context } from "./context.js";
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
> = (err: E, c: Context & T) => any;
|
|
3
|
+
import { type Tag } from "./utils.js";
|
|
4
|
+
import type { RouterTag } from "./index.js";
|
|
5
|
+
export type ErrorHandler<E extends Err = Err> = (err: E, c: Context) => any;
|
|
7
6
|
export type Handler<
|
|
8
7
|
Params extends string[] = string[],
|
|
9
8
|
T extends {} = Record<string, any>
|
|
10
9
|
> = (...args: [...params: Params, c: Context & T]) => any;
|
|
11
|
-
export type
|
|
12
|
-
|
|
13
|
-
E = never,
|
|
10
|
+
export type DefineHandler = <
|
|
11
|
+
P extends string,
|
|
14
12
|
S = {}
|
|
15
|
-
>
|
|
16
|
-
export type AnyMiddlewareTypes = MiddlewareTypes<any, any>;
|
|
17
|
-
export type MergeMiddlewareTypes<T extends AnyMiddlewareTypes[]> = T extends [infer First extends AnyMiddlewareTypes, ...infer Rest extends AnyMiddlewareTypes[]] ? [First[0] | MergeMiddlewareTypes<Rest>[0], First[1] & MergeMiddlewareTypes<Rest>[1]] : [never, {}];
|
|
13
|
+
>(path: P, handler: Handler<InferPath<P>, Required<S>>, ...dat: HandlerData[]) => HandlerTag<S>;
|
|
18
14
|
export interface HandlerData extends Record<symbol, any> {
|
|
19
15
|
type?: "json" | "html" | "raw";
|
|
20
16
|
}
|
|
21
17
|
export type InferPath<T extends string> = T extends `${string}*${infer Next}` ? Next extends "*" ? [string] : [string, ...InferPath<Next>] : [];
|
|
22
|
-
|
|
18
|
+
declare const handlerTag: unique symbol;
|
|
19
|
+
export type HandlerTag<T> = Tag<T, typeof handlerTag>;
|
|
20
|
+
/**
|
|
21
|
+
* Return JSON
|
|
22
|
+
*/
|
|
23
|
+
export declare const json: {
|
|
24
|
+
readonly type: "json"
|
|
25
|
+
};
|
|
26
|
+
/**
|
|
27
|
+
* Return HTML
|
|
28
|
+
*/
|
|
29
|
+
export declare const html: {
|
|
30
|
+
readonly type: "html"
|
|
31
|
+
};
|
|
32
|
+
/**
|
|
33
|
+
* Return raw Response
|
|
34
|
+
*/
|
|
35
|
+
export declare const raw: {
|
|
36
|
+
readonly type: "raw"
|
|
37
|
+
};
|
|
38
|
+
/**
|
|
39
|
+
* Handle errors of a router
|
|
40
|
+
* @param f
|
|
41
|
+
*/
|
|
42
|
+
export declare const error: <const E extends Err>(r: RouterTag<E>, f: ErrorHandler<E>, ...dat: HandlerData[]) => RouterTag<never>;
|
|
43
|
+
/**
|
|
44
|
+
* Handle requests to a path with a specific method
|
|
45
|
+
* @param method
|
|
46
|
+
* @param path
|
|
47
|
+
* @param handler
|
|
48
|
+
* @param dat
|
|
49
|
+
*/
|
|
50
|
+
export declare const route: <
|
|
51
|
+
P extends string,
|
|
52
|
+
S = {}
|
|
53
|
+
>(method: string, path: P, handler: Handler<InferPath<P>, Required<S>>, ...dat: HandlerData[]) => HandlerTag<S>;
|
|
54
|
+
export declare const any: DefineHandler;
|
|
55
|
+
export declare const get: DefineHandler;
|
|
56
|
+
export declare const post: DefineHandler;
|
|
57
|
+
export declare const put: DefineHandler;
|
|
58
|
+
export declare const del: DefineHandler;
|
|
59
|
+
export declare const patch: DefineHandler;
|
|
60
|
+
export declare const options: DefineHandler;
|
|
61
|
+
export declare const trace: DefineHandler;
|
|
62
|
+
export {};
|
package/core/handler.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export{};
|
|
1
|
+
import{ALL}from"@mapl/router/method/index.js";import{proto}from"./utils.js";export let json={type:`json`};export let html={type:`html`};export let raw={type:`raw`};export let error=(r,f,...dat)=>{r[2]=[f,proto(...dat)];return r};export let route=(method,path,handler,...dat)=>[method,path,handler,proto(...dat)];export let any=(...a)=>route(ALL,...a);export let get=(...a)=>route(`GET`,...a);export let post=(...a)=>route(`POST`,...a);export let put=(...a)=>route(`PUT`,...a);export let del=(...a)=>route(`DELETE`,...a);export let patch=(...a)=>route(`PATCH`,...a);export let options=(...a)=>route(`OPTIONS`,...a);export let trace=(...a)=>route(`TRACE`,...a);
|
package/core/index.d.ts
CHANGED
|
@@ -1,46 +1,15 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
import type {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
export
|
|
16
|
-
/**
|
|
17
|
-
* Handle requests to a path with a specific method
|
|
18
|
-
* @param method
|
|
19
|
-
* @param path
|
|
20
|
-
* @param handler
|
|
21
|
-
* @param dat
|
|
22
|
-
*/
|
|
23
|
-
export declare const on: <
|
|
24
|
-
S,
|
|
25
|
-
P extends string
|
|
26
|
-
>(method: RequestMethod | (string & {}), path: P, handler: Handler<InferPath<P>, S & {}>, ...dat: HandlerData[]) => RouteHandler<S>;
|
|
27
|
-
/**
|
|
28
|
-
* Handle any request method
|
|
29
|
-
* @param path
|
|
30
|
-
* @param handler
|
|
31
|
-
* @param dat
|
|
32
|
-
*/
|
|
33
|
-
export declare const any: <
|
|
34
|
-
S,
|
|
35
|
-
P extends string
|
|
36
|
-
>(path: P, handler: Handler<InferPath<P>, S & {}>, ...dat: HandlerData[]) => RouteHandler<S>;
|
|
37
|
-
/**
|
|
38
|
-
* Handle router error
|
|
39
|
-
* @param router
|
|
40
|
-
* @param f
|
|
41
|
-
*/
|
|
42
|
-
export declare const onErr: <
|
|
43
|
-
E extends Err,
|
|
44
|
-
S extends {}
|
|
45
|
-
>(router: MiddlewareTypes<E, S> & RouterTag, f: ErrorHandler<E, S>) => void;
|
|
46
|
-
export {};
|
|
1
|
+
import type { HandlerTag } from "./handler.js";
|
|
2
|
+
import type { AnyMiddlewareTypes } from "./middleware.js";
|
|
3
|
+
import type { Tag, ToNever, UnionToIntersection } from "./utils.js";
|
|
4
|
+
declare const routerTag: unique symbol;
|
|
5
|
+
export type RouterTag<E = any> = Tag<E, typeof routerTag>;
|
|
6
|
+
export type InferError<
|
|
7
|
+
T extends AnyMiddlewareTypes[],
|
|
8
|
+
S extends Record<string, RouterTag>
|
|
9
|
+
> = ToNever<S[keyof S][typeof routerTag] | T[number][0]>;
|
|
10
|
+
export type InferHandler<T extends AnyMiddlewareTypes[]> = HandlerTag<T extends [] ? {} : UnionToIntersection<T[number][1]>>;
|
|
11
|
+
declare const _default: <
|
|
12
|
+
const T extends AnyMiddlewareTypes[],
|
|
13
|
+
const S extends Record<string, RouterTag> = {}
|
|
14
|
+
>(middlewares: T, handlers: InferHandler<T>[], children?: S) => RouterTag<InferError<T, S>>;
|
|
15
|
+
export default _default;
|
package/core/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
export default (middlewares,handlers,children)=>[middlewares,handlers,null,children==null?[]:Object.entries(children)];
|
package/core/middleware.d.ts
CHANGED
|
@@ -1,12 +1,18 @@
|
|
|
1
|
-
import type { MiddlewareHandler, MiddlewareTypes } from "./handler.js";
|
|
2
1
|
import type { InferErr } from "safe-throw";
|
|
3
2
|
import type { AwaitedReturn } from "./utils.js";
|
|
4
|
-
|
|
3
|
+
import type { Context } from "./context.js";
|
|
4
|
+
export type MiddlewareHandler = (c: Context) => any;
|
|
5
|
+
export type MiddlewareTypes<
|
|
6
|
+
E,
|
|
7
|
+
S
|
|
8
|
+
> = [err: E, state: S];
|
|
9
|
+
export type AnyMiddlewareTypes = MiddlewareTypes<any, any>;
|
|
10
|
+
export declare const tap: (f: MiddlewareHandler) => MiddlewareTypes<never, {}>;
|
|
5
11
|
export declare const attach: <
|
|
6
12
|
Prop extends string,
|
|
7
13
|
const T extends MiddlewareHandler
|
|
8
14
|
>(prop: Prop, f: T) => MiddlewareTypes<never, Record<Prop, AwaitedReturn<T>>>;
|
|
9
|
-
export declare const validate: <const T extends MiddlewareHandler>(f: T) => MiddlewareTypes<InferErr<AwaitedReturn<T
|
|
15
|
+
export declare const validate: <const T extends MiddlewareHandler>(f: T) => MiddlewareTypes<InferErr<AwaitedReturn<T>>, {}>;
|
|
10
16
|
export declare const parse: <
|
|
11
17
|
Prop extends string,
|
|
12
18
|
const T extends MiddlewareHandler
|
package/core/middleware.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export let
|
|
1
|
+
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,8 @@
|
|
|
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
|
+
export type ToNever<T> = unknown extends T ? never : T;
|
|
4
|
+
export type Tag<
|
|
5
|
+
S,
|
|
6
|
+
T extends symbol
|
|
7
|
+
> = Record<T, S>;
|
|
3
8
|
export declare const proto: <T extends any[]>(...f: T) => UnionToIntersection<T[number]>;
|
package/index.d.ts
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
-
export
|
|
1
|
+
export { default as router } from "./core/index.js";
|
|
2
|
+
export * as handle from "./core/handler.js";
|
|
2
3
|
export * as layer from "./core/middleware.js";
|
|
3
4
|
export { default as compile } from "./core/compile.js";
|
|
5
|
+
export { st } from "safe-throw";
|
package/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export
|
|
1
|
+
export{default as router}from"./core/index.js";export*as handle from"./core/handler.js";export*as layer from"./core/middleware.js";export{default as compile}from"./core/compile.js";export{st}from"safe-throw";
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mapl/web",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.1",
|
|
4
4
|
"description": "A compiled web framework for all runtimes",
|
|
5
5
|
"keywords": [],
|
|
6
6
|
"license": "MIT",
|
|
@@ -15,11 +15,11 @@
|
|
|
15
15
|
"exports": {
|
|
16
16
|
"./constants": "./constants.js",
|
|
17
17
|
"./core/compile": "./core/compile.js",
|
|
18
|
-
"./core/utils": "./core/utils.js",
|
|
19
18
|
"./core/context": "./core/context.js",
|
|
20
|
-
"./core/middleware": "./core/middleware.js",
|
|
21
19
|
".": "./index.js",
|
|
22
|
-
"./core/
|
|
23
|
-
"./core": "./core/
|
|
20
|
+
"./core/utils": "./core/utils.js",
|
|
21
|
+
"./core/middleware": "./core/middleware.js",
|
|
22
|
+
"./core": "./core/index.js",
|
|
23
|
+
"./core/handler": "./core/handler.js"
|
|
24
24
|
}
|
|
25
25
|
}
|