@dreamkit/app 0.0.4 → 0.0.6

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/lib/App.d.ts CHANGED
@@ -44,6 +44,7 @@ export declare class App {
44
44
  protected startService(item: AppService): Promise<void>;
45
45
  protected stopService(item: AppService): Promise<void>;
46
46
  add(objects: Record<string, any>): Promise<void>;
47
+ createRequestContext(request: Request): IocContext;
47
48
  request(request: Request): Promise<Response | undefined>;
48
49
  start(): Promise<void>;
49
50
  stop(): Promise<void>;
package/lib/App.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"App.d.ts","sourceRoot":"","sources":["../src/App.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,4BAA4B,CAAC;AACnD,OAAO,EAAgB,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAC9E,OAAO,EACL,UAAU,EAEV,kBAAkB,EACnB,MAAM,sBAAsB,CAAC;AAG9B,OAAO,EAAW,UAAU,EAAE,MAAM,eAAe,CAAC;AAEpD,qBAAa,GAAG;IACd,MAAM,CAAC,WAAW,SAAY;IAC9B,QAAQ,CAAC,OAAO,SAAS;IACzB,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAC;IAC7B,QAAQ,CAAC,OAAO,mBAA0B;IAC1C,QAAQ,CAAC,MAAM,aAAoB;IACnC,QAAQ,CAAC,QAAQ,kBAAyB;IAC1C,QAAQ,CAAC,WAAW,6BAAoC;IACxD,SAAS,CAAC,SAAS;wBACG;YAAE,EAAE,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,OAAO,CAAA;SAAE,KAAK,GAAG;2BACnC;YAAE,EAAE,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,OAAO,CAAA;SAAE,KAAK,GAAG;2BAEpD;YAAE,EAAE,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,OAAO,CAAC;YAAC,MAAM,EAAE,KAAK,GAAG,QAAQ,CAAA;SAAE,KAAK,GAAG;MAEzE;;IAIF,MAAM,CAAC,QAAQ,IAAI,GAAG;IAKtB,MAAM,CAAC,YAAY,CAAC,QAAQ,EAAE,GAAG;IAGjC,EAAE,CACA,KAAK,EAAE,KAAK,GAAG,QAAQ,EACvB,EAAE,EAAE,CAAC,IAAI,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,OAAO,CAAA;KAAE,KAAK,GAAG,GAChD,IAAI;IACP,EAAE,CACA,KAAK,EAAE,QAAQ,EACf,EAAE,EAAE,CAAC,IAAI,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,KAAK,GAAG,QAAQ,CAAA;KAAE,KAAK,GAAG,GAC1E,IAAI;IAKP,GAAG,CAAC,KAAK,EAAE,KAAK,GAAG,QAAQ,GAAG,QAAQ,EAAE,EAAE,EAAE,GAAG,GAAG,IAAI;IAItD,WAAW,CAAC,KAAK,EAAE,OAAO;IAMpB,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE;IAmB1B,SAAS,CAAC,UAAU,CAAC,OAAO,EAAE,kBAAkB,GAAG,UAAU;cAU7C,YAAY,CAAC,IAAI,EAAE,UAAU;cAU7B,WAAW,CAAC,IAAI,EAAE,UAAU;IAQtC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IAsBhC,OAAO,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC;IAcxD,KAAK;IAKL,IAAI;CAiBX"}
1
+ {"version":3,"file":"App.d.ts","sourceRoot":"","sources":["../src/App.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,4BAA4B,CAAC;AACnD,OAAO,EAAgB,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAC9E,OAAO,EACL,UAAU,EAEV,kBAAkB,EACnB,MAAM,sBAAsB,CAAC;AAG9B,OAAO,EAAW,UAAU,EAAE,MAAM,eAAe,CAAC;AAEpD,qBAAa,GAAG;IACd,MAAM,CAAC,WAAW,SAAY;IAC9B,QAAQ,CAAC,OAAO,SAAS;IACzB,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAC;IAC7B,QAAQ,CAAC,OAAO,mBAA0B;IAC1C,QAAQ,CAAC,MAAM,aAAoB;IACnC,QAAQ,CAAC,QAAQ,kBAAyB;IAC1C,QAAQ,CAAC,WAAW,6BAAoC;IACxD,SAAS,CAAC,SAAS;wBACG;YAAE,EAAE,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,OAAO,CAAA;SAAE,KAAK,GAAG;2BACnC;YAAE,EAAE,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,OAAO,CAAA;SAAE,KAAK,GAAG;2BAEpD;YAAE,EAAE,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,OAAO,CAAC;YAAC,MAAM,EAAE,KAAK,GAAG,QAAQ,CAAA;SAAE,KAAK,GAAG;MAEzE;;IAMF,MAAM,CAAC,QAAQ,IAAI,GAAG;IAKtB,MAAM,CAAC,YAAY,CAAC,QAAQ,EAAE,GAAG;IAGjC,EAAE,CACA,KAAK,EAAE,KAAK,GAAG,QAAQ,EACvB,EAAE,EAAE,CAAC,IAAI,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,OAAO,CAAA;KAAE,KAAK,GAAG,GAChD,IAAI;IACP,EAAE,CACA,KAAK,EAAE,QAAQ,EACf,EAAE,EAAE,CAAC,IAAI,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,KAAK,GAAG,QAAQ,CAAA;KAAE,KAAK,GAAG,GAC1E,IAAI;IAKP,GAAG,CAAC,KAAK,EAAE,KAAK,GAAG,QAAQ,GAAG,QAAQ,EAAE,EAAE,EAAE,GAAG,GAAG,IAAI;IAItD,WAAW,CAAC,KAAK,EAAE,OAAO;IAMpB,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE;IAmB1B,SAAS,CAAC,UAAU,CAAC,OAAO,EAAE,kBAAkB,GAAG,UAAU;cAU7C,YAAY,CAAC,IAAI,EAAE,UAAU;cAU7B,WAAW,CAAC,IAAI,EAAE,UAAU;IAQtC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IAsBtC,oBAAoB,CAAC,OAAO,EAAE,OAAO;IAS/B,OAAO,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC;IASxD,KAAK;IAKL,IAAI;CAiBX"}
package/lib/App.js CHANGED
@@ -18,7 +18,9 @@ export class App {
18
18
  change: new Set(),
19
19
  };
20
20
  constructor() {
21
- this.context = context.fork();
21
+ this.context = context.fork().register(App, {
22
+ value: this,
23
+ });
22
24
  }
23
25
  static instance() {
24
26
  const value = globalThis[App.instanceKey];
@@ -119,14 +121,17 @@ export class App {
119
121
  await this.startService(service);
120
122
  }
121
123
  }
122
- async request(request) {
124
+ createRequestContext(request) {
123
125
  const url = new RequestUrl(request.url, "http://localhost");
124
- log("request", url.pathname);
125
- const context = this.context
126
+ return this.context
126
127
  .fork()
127
128
  .register(Request, { value: request })
128
129
  .register(Headers, { value: request.headers })
129
130
  .register(RequestUrl, { value: url });
131
+ }
132
+ async request(request) {
133
+ const context = this.createRequestContext(request);
134
+ log("request", context.resolve(RequestUrl).pathname);
130
135
  for (const middleware of this.middlewares) {
131
136
  const $md = context.resolve(middleware);
132
137
  const response = await $md.onRequest();
@@ -1 +1 @@
1
- {"version":3,"file":"RequestUrl.d.ts","sourceRoot":"","sources":["../src/RequestUrl.ts"],"names":[],"mappings":"AAEA,qBAAa,UAAU,CAAC,CAAC,GAAG,MAAM,CAAE,SAAQ,GAAG;IAI7C,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,OAAO;CAInC"}
1
+ {"version":3,"file":"RequestUrl.d.ts","sourceRoot":"","sources":["../src/RequestUrl.ts"],"names":[],"mappings":"AAGA,qBAAa,UAAU,CAAC,CAAC,GAAG,MAAM,CAAE,SAAQ,GAAG;IAI7C,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,OAAO;CAKnC"}
package/lib/RequestUrl.js CHANGED
@@ -1,10 +1,10 @@
1
1
  import { kindApp } from "./utils/kind.js";
2
+ import { createRoutePathRegex } from "./utils/routing.js";
2
3
  export class RequestUrl extends URL {
3
4
  static {
4
5
  kindApp(this, "RequestUrl");
5
6
  }
6
7
  is(...paths) {
7
- // [review]
8
- return paths.includes(this.pathname);
8
+ return paths.some((path) => createRoutePathRegex(path).test(this.pathname));
9
9
  }
10
10
  }
@@ -0,0 +1,6 @@
1
+ import { Func, FuncBuilder, FuncData } from "@dreamkit/func";
2
+ export declare const kindApi: (input: object, name?: string) => void, isApi: (input: unknown) => input is Func;
3
+ export declare class ApiBuilder<T extends FuncData> extends FuncBuilder<T> {
4
+ protected onCreate(func: Func): Func;
5
+ }
6
+ //# sourceMappingURL=ApiBuilder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ApiBuilder.d.ts","sourceRoot":"","sources":["../../src/builders/ApiBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAG7D,eAAO,MAAO,OAAO,0CAAE,KAAK,mCAAyC,CAAC;AAEtE,qBAAa,UAAU,CAAC,CAAC,SAAS,QAAQ,CAAE,SAAQ,WAAW,CAAC,CAAC,CAAC;cAC7C,QAAQ,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI;CAI9C"}
@@ -0,0 +1,9 @@
1
+ import { FuncBuilder } from "@dreamkit/func";
2
+ import { createKind } from "@dreamkit/kind";
3
+ export const [kindApi, isApi] = createKind("@dreamkit/app/api");
4
+ export class ApiBuilder extends FuncBuilder {
5
+ onCreate(func) {
6
+ kindApi(func);
7
+ return func;
8
+ }
9
+ }
@@ -1,11 +1,16 @@
1
+ import { Func } from "@dreamkit/func";
1
2
  import { InferType, MinimalObjectType, ObjectType, ObjectTypeProps } from "@dreamkit/schema";
2
3
  import type { Merge } from "@dreamkit/utils/ts.js";
3
4
  export type RoutePathParams<P extends string | number | symbol> = {
4
5
  [K in P]: K extends string ? `:${K}` : never;
5
6
  };
6
7
  export type RouteParams = MinimalObjectType | undefined;
7
- export type RouteData<TParams extends RouteParams = RouteParams> = {
8
+ export type RouteApi = {
9
+ [key: string]: (...args: any[]) => any;
10
+ };
11
+ export type RouteData<TParams extends RouteParams = RouteParams, TApi extends RouteApi = RouteApi> = {
8
12
  params?: TParams;
13
+ api?: TApi;
9
14
  };
10
15
  export type RouteOptions<T extends RouteData = RouteData> = T & {
11
16
  title?: string;
@@ -26,6 +31,9 @@ export type InferRouteParams<T extends RouteData> = [undefined] extends [
26
31
  export type RouteProps<T extends RouteData = RouteData> = {
27
32
  setParams: [undefined] extends [T["params"]] ? never : (params: InferRouteParams<T>) => void;
28
33
  params: InferRouteParams<T>;
34
+ api: {
35
+ [K in keyof T["api"]]: T["api"][K] extends Func<infer TData, infer TResult> ? Func<Omit<TData, "self">, Promise<Awaited<TResult>>> : never;
36
+ };
29
37
  };
30
38
  export type Route<T extends RouteData = RouteData> = ((props: any) => any) & {
31
39
  $options: RouteOptions<T>;
@@ -37,6 +45,9 @@ export declare class RouteBuilder<T extends RouteData = RouteData> {
37
45
  constructor(options: RouteOptions<T>);
38
46
  protected clone(input?: Partial<RouteOptions> | RouteBuilder): this;
39
47
  title(value: string | undefined): this;
48
+ api<TApi extends RouteApi>(api: TApi): RouteBuilder<MergeFuncData<T, {
49
+ api: T["api"] & TApi;
50
+ }>>;
40
51
  params<TParams extends RouteParams>(type: TParams): RouteBuilder<MergeFuncData<T, {
41
52
  params: TParams;
42
53
  }>>;
@@ -1 +1 @@
1
- {"version":3,"file":"RouteBuilder.d.ts","sourceRoot":"","sources":["../../src/builders/RouteBuilder.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,SAAS,EACT,iBAAiB,EACjB,UAAU,EACV,eAAe,EAEhB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAEnD,MAAM,MAAM,eAAe,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,GAAG,MAAM,IAAI;KAC/D,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,MAAM,GAAG,IAAI,CAAC,EAAE,GAAG,KAAK;CAC7C,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG,iBAAiB,GAAG,SAAS,CAAC;AACxD,MAAM,MAAM,SAAS,CAAC,OAAO,SAAS,WAAW,GAAG,WAAW,IAAI;IACjE,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,YAAY,CAAC,CAAC,SAAS,SAAS,GAAG,SAAS,IAAI,CAAC,GAAG;IAC9D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,aAAa,CAAC,EAAE;QAAE,KAAK,EAAE,gBAAgB,CAAC,CAAC,CAAC,CAAA;KAAE,GAAG;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;IACtE,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,GAAG,CAAC;IAChC,eAAe,CAAC,EAAE,CAAC,OAAO,EAAE,YAAY,KAAK,GAAG,CAAC;IACjD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,CAAC,OAAO,EAAE,YAAY,KAAK,GAAG,CAAC;CAClD,CAAC;AAEF,MAAM,MAAM,gBAAgB,CAAC,CAAC,SAAS,SAAS,IAAI,CAAC,SAAS,CAAC,SAAS;IACtE,CAAC,CAAC,QAAQ,CAAC;CACZ,GACG,SAAS,GACT,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC;AAEhC,MAAM,MAAM,UAAU,CAAC,CAAC,SAAS,SAAS,GAAG,SAAS,IAAI;IACxD,SAAS,EAAE,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,GACxC,KAAK,GACL,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC;IAC1C,MAAM,EAAE,gBAAgB,CAAC,CAAC,CAAC,CAAC;CAC7B,CAAC;AACF,MAAM,MAAM,KAAK,CAAC,CAAC,SAAS,SAAS,GAAG,SAAS,IAAI,CAAC,CAAC,KAAK,EAAE,GAAG,KAAK,GAAG,CAAC,GAAG;IAC3E,QAAQ,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,aAAa,CACvB,EAAE,SAAS,SAAS,EACpB,EAAE,SAAS,OAAO,CAAC,SAAS,CAAC,IAC3B,KAAK,CAAC,SAAS,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;AAE7B,qBAAa,YAAY,CAAC,CAAC,SAAS,SAAS,GAAG,SAAS;IAIvD,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;IACjB,QAAQ,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC;gBACtB,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC;IAMpC,SAAS,CAAC,KAAK,CAAC,KAAK,GAAE,OAAO,CAAC,YAAY,CAAC,GAAG,YAAiB,GAAG,IAAI;IAcvE,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS;IAG/B,MAAM,CAAC,OAAO,SAAS,WAAW,EAChC,IAAI,EAAE,OAAO,GACZ,YAAY,CAAC,aAAa,CAAC,CAAC,EAAE;QAAE,MAAM,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IACtD,MAAM,CAAC,MAAM,SAAS,eAAe,EACnC,KAAK,EAAE,MAAM,GACZ,YAAY,CAAC,aAAa,CAAC,CAAC,EAAE;QAAE,MAAM,EAAE,UAAU,CAAC,MAAM,CAAC,CAAA;KAAE,CAAC,CAAC;IAIjE,aAAa,CACX,KAAK,EAAE;QAAE,KAAK,EAAE,gBAAgB,CAAC,CAAC,CAAC,CAAA;KAAE,GAAG;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE,GAC3D,IAAI;IAGP,IAAI,CACF,KAAK,EACD,MAAM,GACN,CAAC,CACC,MAAM,EAAE,eAAe,CAAC,MAAM,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,KAC7D,MAAM,CAAC,GACf,IAAI;IAQP,SAAS,CAAC,qBAAqB,IAAI,GAAG;IAKtC,MAAM,CAAC,SAAS,EAAE,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,KAAK,GAAG,GAAG,KAAK;CAaxD"}
1
+ {"version":3,"file":"RouteBuilder.d.ts","sourceRoot":"","sources":["../../src/builders/RouteBuilder.ts"],"names":[],"mappings":"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"}
@@ -29,6 +29,9 @@ export class RouteBuilder {
29
29
  title(value) {
30
30
  return this.clone({ title: value });
31
31
  }
32
+ api(api) {
33
+ return this.clone({ api });
34
+ }
32
35
  params(params) {
33
36
  return this.clone({ params });
34
37
  }
@@ -38,7 +41,12 @@ export class RouteBuilder {
38
41
  path(value) {
39
42
  if (typeof value === "string")
40
43
  return this.clone({ path: value });
41
- const params = new Proxy({}, { get: (_, prop) => `:${prop}` });
44
+ const params = new Proxy({}, {
45
+ get: (_, prop) => {
46
+ const optional = (this.options.params?.props?.[prop]).options.optional;
47
+ return `:${prop}${optional ? "?" : ""}`;
48
+ },
49
+ });
42
50
  return this.clone({ path: value(params) });
43
51
  }
44
52
  createRouteDefinition() {
package/lib/index.d.ts CHANGED
@@ -1,9 +1,11 @@
1
1
  export { RequestUrl } from "./RequestUrl.js";
2
2
  export { isRoute, isApp } from "./utils/kind.js";
3
+ export { isApi } from "./builders/ApiBuilder.js";
3
4
  export { App } from "./App.js";
4
5
  export { RouteBuilder, type RouteOptions, type Route, type RouteData, type RouteProps, } from "./builders/RouteBuilder.js";
5
6
  export { defineRoutePath, routePath } from "./routePath.js";
6
7
  export { $route } from "./objects/$route.js";
8
+ export { $api } from "./objects/$api.js";
7
9
  export { Middleware, MiddlewareClass, isMiddleware, } from "./objects/middleware.js";
8
10
  export { Service, ServiceClass, type ServiceStop, isService, } from "./objects/service.js";
9
11
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,EACL,YAAY,EACZ,KAAK,YAAY,EACjB,KAAK,KAAK,EACV,KAAK,SAAS,EACd,KAAK,UAAU,GAChB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE5D,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EACL,UAAU,EACV,eAAe,EACf,YAAY,GACb,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,OAAO,EACP,YAAY,EACZ,KAAK,WAAW,EAChB,SAAS,GACV,MAAM,sBAAsB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,KAAK,EAAE,MAAM,0BAA0B,CAAC;AACjD,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,EACL,YAAY,EACZ,KAAK,YAAY,EACjB,KAAK,KAAK,EACV,KAAK,SAAS,EACd,KAAK,UAAU,GAChB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE5D,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AACzC,OAAO,EACL,UAAU,EACV,eAAe,EACf,YAAY,GACb,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,OAAO,EACP,YAAY,EACZ,KAAK,WAAW,EAChB,SAAS,GACV,MAAM,sBAAsB,CAAC"}
package/lib/index.js CHANGED
@@ -1,9 +1,11 @@
1
1
  export { RequestUrl } from "./RequestUrl.js";
2
2
  export { isRoute, isApp } from "./utils/kind.js";
3
+ export { isApi } from "./builders/ApiBuilder.js";
3
4
  export { App } from "./App.js";
4
5
  export { RouteBuilder, } from "./builders/RouteBuilder.js";
5
6
  export { defineRoutePath, routePath } from "./routePath.js";
6
7
  // objects
7
8
  export { $route } from "./objects/$route.js";
9
+ export { $api } from "./objects/$api.js";
8
10
  export { Middleware, MiddlewareClass, isMiddleware, } from "./objects/middleware.js";
9
11
  export { Service, ServiceClass, isService, } from "./objects/service.js";
@@ -0,0 +1,3 @@
1
+ import { ApiBuilder } from "../builders/ApiBuilder.js";
2
+ export declare const $api: ApiBuilder<{}>;
3
+ //# sourceMappingURL=$api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"$api.d.ts","sourceRoot":"","sources":["../../src/objects/$api.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAEvD,eAAO,MAAM,IAAI,gBAAmC,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { ApiBuilder } from "../builders/ApiBuilder.js";
2
+ export const $api = /*#__PURE__*/ new ApiBuilder({});
@@ -2,5 +2,5 @@ import type { App } from "../App.js";
2
2
  import type { Route, RouteBuilder } from "../builders/RouteBuilder.js";
3
3
  export declare const kindApp: (input: object, name?: string) => void, isApp: (input: unknown) => input is App;
4
4
  export declare const kindRoute: (input: object, name?: string) => void, isRoute: (input: unknown) => input is Route;
5
- export declare const kindRouteBuilder: (input: object, name?: string) => void, isRouteBuilder: (input: unknown) => input is RouteBuilder<import("../builders/RouteBuilder.js").RouteData<import("../builders/RouteBuilder.js").RouteParams>>;
5
+ export declare const kindRouteBuilder: (input: object, name?: string) => void, isRouteBuilder: (input: unknown) => input is RouteBuilder<import("../builders/RouteBuilder.js").RouteData<import("../builders/RouteBuilder.js").RouteParams, import("../builders/RouteBuilder.js").RouteApi>>;
6
6
  //# sourceMappingURL=kind.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"kind.d.ts","sourceRoot":"","sources":["../../src/utils/kind.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAGvE,eAAO,MAAO,OAAO,0CAAE,KAAK,kCAAoC,CAAC;AACjE,eAAO,MAAO,SAAS,0CAAE,OAAO,oCAA4C,CAAC;AAC7E,eAAO,MAAO,gBAAgB,0CAAE,cAAc,+IAE7C,CAAC"}
1
+ {"version":3,"file":"kind.d.ts","sourceRoot":"","sources":["../../src/utils/kind.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAGvE,eAAO,MAAO,OAAO,0CAAE,KAAK,kCAAoC,CAAC;AACjE,eAAO,MAAO,SAAS,0CAAE,OAAO,oCAA4C,CAAC;AAC7E,eAAO,MAAO,gBAAgB,0CAAE,cAAc,+LAE7C,CAAC"}
@@ -2,7 +2,9 @@ export declare function extractPathParams(path: string): {
2
2
  spread: boolean;
3
3
  name: string;
4
4
  key: string;
5
+ optional?: boolean;
5
6
  }[];
7
+ export declare function createRoutePathRegex(path: string): RegExp;
6
8
  export declare function createRouteUrl(path: string, params?: Record<string, any>, base?: string): URL;
7
9
  export declare function createRouteHref(path: string, params?: Record<string, any>): string;
8
10
  //# sourceMappingURL=routing.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"routing.d.ts","sourceRoot":"","sources":["../../src/utils/routing.ts"],"names":[],"mappings":"AAAA,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,MAAM,GACX;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,EAAE,CAMlD;AAED,wBAAgB,cAAc,CAC5B,IAAI,EAAE,MAAM,EACZ,MAAM,GAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAM,EAChC,IAAI,SAAoD,OAazD;AAED,wBAAgB,eAAe,CAC7B,IAAI,EAAE,MAAM,EACZ,MAAM,GAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAM,UAIjC"}
1
+ {"version":3,"file":"routing.d.ts","sourceRoot":"","sources":["../../src/utils/routing.ts"],"names":[],"mappings":"AAAA,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,MAAM,GACX;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE,EAAE,CAOtE;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,UAsBhD;AAED,wBAAgB,cAAc,CAC5B,IAAI,EAAE,MAAM,EACZ,MAAM,GAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAM,EAChC,IAAI,SAAoD,OAezD;AAED,wBAAgB,eAAe,CAC7B,IAAI,EAAE,MAAM,EACZ,MAAM,GAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAM,UAIjC"}
@@ -1,14 +1,43 @@
1
1
  export function extractPathParams(path) {
2
- return [...path.matchAll(/([:\*])(\w+)/g)].map((match) => ({
2
+ return [...path.matchAll(/([:\*])(\w+)(\?)?/g)].map((match) => ({
3
3
  key: match[0],
4
4
  spread: match[1] === "*",
5
5
  name: match[2],
6
+ optional: match[3] === "?",
6
7
  }));
7
8
  }
9
+ export function createRoutePathRegex(path) {
10
+ const paramNames = extractPathParams(path);
11
+ let pattern = path.replace(/\//g, "\\/");
12
+ const optionalPattern = "([^\\/]+)?";
13
+ const endOptionalPattern = `\\/${optionalPattern}`;
14
+ const spreadPattern = "(.*)";
15
+ const endOptionalSpreadPattern = `\\/${spreadPattern}`;
16
+ for (const param of paramNames) {
17
+ if (param.spread) {
18
+ pattern = pattern.replace(param.key, spreadPattern);
19
+ }
20
+ else if (param.optional) {
21
+ pattern = pattern.replace(param.key, optionalPattern);
22
+ }
23
+ else {
24
+ pattern = pattern.replace(param.key, "([^\\/]+)");
25
+ }
26
+ }
27
+ if (pattern.endsWith(endOptionalSpreadPattern)) {
28
+ pattern = pattern.slice(0, -endOptionalSpreadPattern.length) + `(\\/.*)?`;
29
+ }
30
+ else if (pattern.endsWith(endOptionalPattern)) {
31
+ pattern = pattern.slice(0, -endOptionalPattern.length) + `(\\/[^\\/]+)?`;
32
+ }
33
+ return new RegExp(`^${pattern}\/?$`);
34
+ }
8
35
  export function createRouteUrl(path, params = {}, base = globalThis.location?.origin ?? "http://localhost") {
9
36
  const paramNames = extractPathParams(path);
10
37
  for (const param of paramNames)
11
- path = path.replaceAll(param.key, params[param.name]);
38
+ path = path.replaceAll(param.key, params[param.name] ?? "");
39
+ if (path.length > 1 && path.endsWith("/"))
40
+ path = path.slice(0, -1);
12
41
  const url = new URL(path, base);
13
42
  for (const name in params)
14
43
  if (!paramNames.find((param) => param.name === name))
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dreamkit/app",
3
- "version": "0.0.4",
3
+ "version": "0.0.6",
4
4
  "description": "Set of utils to create applications.",
5
5
  "homepage": "https://dreamkit.dev",
6
6
  "repository": {
@@ -27,10 +27,11 @@
27
27
  ],
28
28
  "dependencies": {
29
29
  "debug": "^4.3.7",
30
+ "@dreamkit/func": "0.0.2",
30
31
  "@dreamkit/ioc": "0.0.1",
31
32
  "@dreamkit/kind": "0.0.2",
32
- "@dreamkit/schema": "0.0.3",
33
- "@dreamkit/utils": "0.0.3"
33
+ "@dreamkit/schema": "0.0.4",
34
+ "@dreamkit/utils": "0.0.4"
34
35
  },
35
36
  "devDependencies": {
36
37
  "@types/debug": "^4.1.12",