@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 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 app = router.init([
8
- layer.attach('id', () => performance.now())
9
- ], [
10
- router.on('GET', '/path', (c) => c.id)
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 [`+CHTML+`,`+CJSON+`]=["text/html","application/json"].map(c=>["content-type",c]),[`+R404+`,`+R400+`]=[404,400].map(s=>new Response(null,{status:s}));`;
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)`:`)`):(contextCreated?``:state[2])+`mh.push(`+(typ===`json`?`mwj`:`mwh`)+`);return new Response(`+(typ===`json`?`JSON.stringify(`+result+`)`:result)+`,c)`;return fnAsync&&!scopeAsync?`return (async()=>{`+str+`})()`:scopeAsync?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 [mwh,mwj]=["text/html","application/json"].map(c=>["content-type",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)};
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
@@ -6,5 +6,5 @@ export interface Context {
6
6
  status?: number;
7
7
  statusText?: string;
8
8
  }
9
- declare const _default: (req: Request) => Context;
9
+ declare const _default: (req: Request, headers: Headers) => Context;
10
10
  export default _default;
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=[];obj.req=req;return obj};
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
- export type ErrorHandler<
4
- E extends Err = Err,
5
- T extends {} = Record<string, any>
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 MiddlewareHandler = (c: Context) => any;
12
- export type MiddlewareTypes<
13
- E = never,
10
+ export type DefineHandler = <
11
+ P extends string,
14
12
  S = {}
15
- > = [err: E, state: S];
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
- export type RequestMethod = "GET" | "POST" | "PUT" | "DELETE" | "PATCH" | "OPTIONS" | "TRACE";
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 { Err } from "safe-throw";
2
- import type { MiddlewareTypes, AnyMiddlewareTypes, MergeMiddlewareTypes, ErrorHandler, Handler, HandlerData, InferPath, RequestMethod } from "./handler.js";
3
- declare const tag: unique symbol;
4
- export interface RouteHandler<S> {
5
- readonly [tag]: S;
6
- }
7
- export type RouterTag = RouteHandler<typeof tag>;
8
- export type AnyRouter = AnyMiddlewareTypes & RouterTag;
9
- /**
10
- * Create a router
11
- * @param middlewares
12
- * @param handlers
13
- * @param children
14
- */
15
- export declare const init: <const T extends AnyMiddlewareTypes[]>(middlewares: T, handlers: RouteHandler<MergeMiddlewareTypes<T>[1]>[], children?: Record<string, AnyRouter>) => MergeMiddlewareTypes<T> & RouterTag;
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
- import{proto}from"./utils.js";import{ALL}from"@mapl/router/method/index.js";export let init=(middlewares,handlers,children={})=>[middlewares,handlers,null,Object.entries(children)];export let on=(method,path,handler,...dat)=>[method,path,handler,proto(...dat)];export let any=(path,handler,...dat)=>[ALL,path,handler,proto(...dat)];export let onErr=(router,f)=>{router[2]=f};
1
+ export default (middlewares,handlers,children)=>[middlewares,handlers,null,children==null?[]:Object.entries(children)];
@@ -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
- export declare const run: (f: MiddlewareHandler) => MiddlewareTypes;
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
@@ -1 +1 @@
1
- export let run=f=>[0,f];export let attach=(prop,f)=>[1,f,prop];export let validate=f=>[2,f];export let parse=(prop,f)=>[3,f];
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 * as router from "./core/index.js";
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*as router from"./core/index.js";export*as layer from"./core/middleware.js";export{default as compile}from"./core/compile.js";
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.0",
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/handler": "./core/handler.js",
23
- "./core": "./core/index.js"
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
  }