remult 0.14.30 → 0.14.33

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 (46) hide show
  1. package/{readme.md → README.md} +2 -2
  2. package/esm/graphql.d.ts +2 -2
  3. package/esm/remult-express.d.ts +4 -9
  4. package/esm/remult-express.js +3 -2
  5. package/esm/remult-fastify.d.ts +2 -2
  6. package/esm/remult-fastify.js +5 -10
  7. package/esm/remult-fresh.d.ts +6 -7
  8. package/esm/remult-fresh.js +29 -32
  9. package/esm/server/expressBridge.d.ts +10 -60
  10. package/esm/server/expressBridge.js +254 -134
  11. package/esm/server/index.d.ts +1 -3
  12. package/esm/server/index.js +1 -3
  13. package/esm/src/backend-tests/test-http-server.backend-spec.js +1 -2
  14. package/esm/src/context.d.ts +1 -6
  15. package/graphql.d.ts +2 -2
  16. package/package.json +4 -4
  17. package/remult-express.d.ts +4 -9
  18. package/remult-express.js +3 -2
  19. package/remult-fastify.d.ts +2 -2
  20. package/remult-fastify.js +5 -10
  21. package/remult-fresh.d.ts +6 -7
  22. package/remult-fresh.js +10 -10
  23. package/server/expressBridge.d.ts +10 -60
  24. package/server/expressBridge.js +361 -215
  25. package/server/index.d.ts +1 -3
  26. package/server/index.js +2 -6
  27. package/src/backend-tests/test-http-server.backend-spec.js +1 -2
  28. package/src/context.d.ts +1 -6
  29. package/esm/remult-middleware.d.ts +0 -10
  30. package/esm/remult-middleware.js +0 -117
  31. package/esm/server/register-actions-on-server.d.ts +0 -3
  32. package/esm/server/register-actions-on-server.js +0 -24
  33. package/esm/server/register-entities-on-server.d.ts +0 -3
  34. package/esm/server/register-entities-on-server.js +0 -15
  35. package/esm/valueConverters.d.ts +0 -12
  36. package/esm/valueConverters.js +0 -169
  37. package/postgres/postgresColumnSyntax.d.ts +0 -2
  38. package/postgres/postgresColumnSyntax.js +0 -34
  39. package/remult-middleware.d.ts +0 -10
  40. package/remult-middleware.js +0 -131
  41. package/server/register-actions-on-server.d.ts +0 -3
  42. package/server/register-actions-on-server.js +0 -50
  43. package/server/register-entities-on-server.d.ts +0 -3
  44. package/server/register-entities-on-server.js +0 -19
  45. package/valueConverters.d.ts +0 -12
  46. package/valueConverters.js +0 -168
@@ -35,13 +35,13 @@
35
35
 
36
36
  ### Status
37
37
 
38
- Remult is **production-ready** and, in fact, used in production apps since 2017. However, we’re keeping the major version at zero so we can use community feedback to finalize the v1 API.
38
+ Remult is **production-ready** and, in fact, used in production apps since 2018. However, we’re keeping the major version at zero so we can use community feedback to finalize the v1 API.
39
39
 
40
40
  ## Motivation
41
41
 
42
42
  Full-stack web development is (still) too complicated. **Simple CRUD, a common requirement of any business application, should be simple to build, maintain, and extend** when the need arises.
43
43
 
44
- Remult abstracts away repetitive, boilerplate, error-prone, and poorly designed code on the one hand, and enables total flexibility and control on the other. **Remult let you write TypeScript code you can follow and safely refactor**, and fits nicely into any existing or new project by being minimalistic and completely unopinionated regarding the developer’s choice of other frameworks and tools.
44
+ Remult abstracts away repetitive, boilerplate, error-prone, and poorly designed code on the one hand, and enables total flexibility and control on the other. **Remult helps building fullstack apps using only TypeScript code you can easily follow and safely refactor**, and fits nicely into any existing or new project by being minimalistic and completely unopinionated regarding the developer’s choice of other frameworks and tools.
45
45
 
46
46
  Other frameworks tend to fall into either too much abstraction (no-code, low-code, BaaS) or partial abstraction (MVC frameworks, GraphQL, ORMs, API generators, code generators), and tend to be opinionated regarding the development tool-chain, deployment environment, configuration/conventions or DSL. Remult attempts to strike a better balance.
47
47
 
package/esm/graphql.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { RemultExpressBridge } from "./server/expressBridge";
2
- export declare function remultGraphql(api: RemultExpressBridge): {
1
+ import { RemultServer } from "./server/expressBridge";
2
+ export declare function remultGraphql(api: RemultServer): {
3
3
  rootValue: {};
4
4
  schema: string;
5
5
  };
@@ -1,11 +1,6 @@
1
- import { RemultMiddlewareOptions } from './server/expressBridge';
2
- export declare function remultExpress(options?: RemultMiddlewareOptions & {
1
+ import * as express from 'express';
2
+ import { RemultServer, RemultServerOptions } from './server/expressBridge';
3
+ export declare function remultExpress(options?: RemultServerOptions & {
3
4
  bodyParser?: boolean;
4
5
  bodySizeLimit?: string;
5
- }): import("express-serve-static-core").Router & {
6
- getRemult: (req: any) => Promise<import(".").Remult>;
7
- openApiDoc: (options: {
8
- title: string;
9
- }) => any;
10
- addArea: (x: any) => void;
11
- };
6
+ }): express.RequestHandler & RemultServer;
@@ -12,10 +12,11 @@ export function remultExpress(options) {
12
12
  app.use(express.json({ limit: options.bodySizeLimit }));
13
13
  app.use(express.urlencoded({ extended: true, limit: options.bodySizeLimit }));
14
14
  }
15
- const server = buildRemultServer(app, options);
15
+ const server = buildRemultServer(options);
16
+ server.registerRouter(app);
16
17
  return Object.assign(app, {
17
18
  getRemult: (req) => server.getRemult(req),
18
19
  openApiDoc: (options) => server.openApiDoc(options),
19
- addArea: x => server.addArea(x)
20
+ registerRouter: x => server.registerRouter(x)
20
21
  });
21
22
  }
@@ -1,3 +1,3 @@
1
1
  import type { FastifyPluginCallback } from 'fastify';
2
- import { RemultServer, RemultMiddlewareOptions } from './server/expressBridge';
3
- export declare function remultFastify(options: RemultMiddlewareOptions): FastifyPluginCallback & RemultServer;
2
+ import { RemultServer, RemultServerOptions } from './server/expressBridge';
3
+ export declare function remultFastify(options: RemultServerOptions): FastifyPluginCallback & RemultServer;
@@ -18,7 +18,7 @@ export function remultFastify(options) {
18
18
  };
19
19
  return response;
20
20
  }
21
- let api;
21
+ const api = buildRemultServer(options);
22
22
  const pluginFunction = async (instance, op) => {
23
23
  //@ts-ignore
24
24
  let fastifyRouter = {
@@ -42,16 +42,11 @@ export function remultFastify(options) {
42
42
  return r;
43
43
  },
44
44
  };
45
- api = buildRemultServer(fastifyRouter, options);
46
- };
47
- const getApi = () => {
48
- if (!api)
49
- throw "Please call fastify's register before using this method";
50
- return api;
45
+ api.registerRouter(fastifyRouter);
51
46
  };
52
47
  return Object.assign(pluginFunction, {
53
- addArea: x => getApi().addArea(x),
54
- getRemult: x => getApi().getRemult(x),
55
- openApiDoc: x => getApi().openApiDoc(x)
48
+ getRemult: x => api.getRemult(x),
49
+ openApiDoc: x => api.openApiDoc(x),
50
+ handle: (req, res) => api.handle(req, res)
56
51
  });
57
52
  }
@@ -1,18 +1,17 @@
1
- import { RemultMiddlewareOptions, RemultServer } from "./server/expressBridge";
2
- export declare function remultFresh(options: RemultMiddlewareOptions, response: FreshResponse): RemultFresh;
1
+ import { RemultServerOptions, RemultServer } from "./server/expressBridge";
2
+ export declare function remultFresh(options: RemultServerOptions, response: FreshResponse): RemultFresh;
3
3
  export interface RemultFresh extends RemultServer {
4
- handle(req: FreshRequest, ctx: FreshContext): Promise<FreshResponse>;
4
+ freshHandler(req: FreshRequest, ctx: FreshContext): Promise<FreshResponse>;
5
5
  }
6
- interface FreshRequest {
6
+ export interface FreshRequest {
7
7
  url: string;
8
8
  method: string;
9
9
  json: () => Promise<any>;
10
10
  }
11
- interface FreshContext {
11
+ export interface FreshContext {
12
12
  next: () => Promise<any>;
13
13
  }
14
- interface FreshResponse {
14
+ export interface FreshResponse {
15
15
  new (body?: any | undefined, init?: ResponseInit): any;
16
16
  json(data: unknown, init?: ResponseInit): any;
17
17
  }
18
- export {};
@@ -1,39 +1,36 @@
1
- import { remultMiddleware } from "./remult-middleware";
1
+ import { buildRemultServer } from "./server/expressBridge";
2
2
  export function remultFresh(options, response) {
3
- const mw = remultMiddleware(options);
4
- const orig = mw.handle;
5
- return {
6
- ...mw,
7
- ...{
8
- handle: async (req, ctx) => {
9
- const theReq = {
10
- method: req.method,
11
- url: req.url,
12
- body: undefined
13
- };
14
- switch (req.method.toLocaleLowerCase()) {
15
- case "put":
16
- case "post":
17
- console.log(req);
18
- theReq.body = await req.json();
19
- break;
20
- }
21
- let init = {};
22
- const res = await orig(theReq);
23
- if (res) {
24
- if (res.statusCode)
25
- init.status = res.statusCode;
26
- if (res.data) {
27
- console.log({ init, res });
28
- return response.json(res.data, init);
29
- }
30
- else
31
- return new response(undefined, init);
3
+ const server = buildRemultServer(options);
4
+ const orig = server.handle;
5
+ return Object.assign(server, {
6
+ freshHandler: async (req, ctx) => {
7
+ const theReq = {
8
+ method: req.method,
9
+ url: req.url,
10
+ body: undefined
11
+ };
12
+ switch (req.method.toLocaleLowerCase()) {
13
+ case "put":
14
+ case "post":
15
+ theReq.body = await req.json();
16
+ break;
17
+ }
18
+ let init = {};
19
+ const res = await orig(theReq);
20
+ if (res) {
21
+ init.status = res.statusCode;
22
+ if (res.data) {
23
+ return response.json(res.data, init);
32
24
  }
33
25
  else
34
- return ctx.next();
26
+ return new response(undefined, init);
35
27
  }
28
+ else {
29
+ return ctx.next();
30
+ }
31
+ ;
36
32
  }
37
- };
33
+ });
38
34
  }
39
35
  ;
36
+ ;
@@ -1,37 +1,38 @@
1
1
  import { queuedJobInfoResponse } from '../src/server-action';
2
2
  import { DataProvider } from '../src/data-interfaces';
3
- import { DataApi, DataApiRequest, DataApiResponse } from '../src/data-api';
4
- import { AllowedForInstance, Remult, UserInfo } from '../src/context';
3
+ import { Remult, UserInfo } from '../src/context';
5
4
  import { ClassType } from '../classType';
6
5
  import { Repository } from '../src/remult3';
7
6
  import { IdEntity } from '../src/id-entity';
8
- export declare type RemultMiddlewareOptions = {
7
+ export declare type RemultServerOptions = {
9
8
  /** Sets a database connection for Remult.
10
9
  *
11
10
  * @see [Connecting to a Database](https://remult.dev/docs/databases.html).
12
11
  */
13
12
  dataProvider?: DataProvider | Promise<DataProvider> | (() => Promise<DataProvider | undefined>);
14
- disableAutoApi?: boolean;
15
13
  queueStorage?: QueueStorage;
16
14
  initRequest?: (remult: Remult, origReq: GenericRequest) => Promise<void>;
15
+ getUser?: (request: GenericRequest) => Promise<UserInfo>;
17
16
  initApi?: (remult: Remult) => void | Promise<void>;
18
17
  logApiEndPoints?: boolean;
19
18
  defaultGetLimit?: number;
20
19
  entities?: ClassType<any>[];
21
20
  controllers?: ClassType<any>[];
22
- bodyParser?: boolean;
23
21
  rootPath?: string;
24
22
  };
25
- export declare function buildRemultServer(app: GenericRouter, options: RemultMiddlewareOptions): RemultServer;
23
+ export declare function buildRemultServer(options: RemultServerOptions): RemultServer;
26
24
  export declare type GenericRequestHandler = (req: GenericRequest, res: GenericResponse, next: VoidFunction) => void;
27
- export interface RemultExpressBridge extends GenericRequestHandler, RemultServer {
25
+ export interface ServerHandleResponse {
26
+ data?: any;
27
+ statusCode: number;
28
28
  }
29
29
  export interface RemultServer {
30
30
  getRemult(req: GenericRequest): Promise<Remult>;
31
31
  openApiDoc(options: {
32
32
  title: string;
33
33
  }): any;
34
- addArea(rootUrl: string): void;
34
+ registerRouter(r: GenericRouter): void;
35
+ handle(req: GenericRequest, gRes?: GenericResponse): Promise<ServerHandleResponse | undefined>;
35
36
  }
36
37
  export declare type GenericRouter = {
37
38
  route(path: string): SpecificRoute;
@@ -48,62 +49,12 @@ export interface GenericRequest {
48
49
  body?: any;
49
50
  query?: any;
50
51
  params?: any;
51
- user?: UserInfo;
52
- auth?: UserInfo;
53
52
  }
54
53
  export interface GenericResponse {
55
54
  json(data: any): any;
56
- status?(statusCode: number): GenericResponse;
57
- setStatus?(statusCode: number): GenericResponse;
55
+ status(statusCode: number): GenericResponse;
58
56
  end(): any;
59
57
  }
60
- declare class ExpressBridge {
61
- private app;
62
- queue: inProcessQueueHandler;
63
- initRequest: (remult: Remult, origReq: GenericRequest) => Promise<void>;
64
- dataProvider: DataProvider | Promise<DataProvider>;
65
- openApiDoc(options: {
66
- title: string;
67
- version?: string;
68
- }): any;
69
- backendMethodsOpenApi: {
70
- path: string;
71
- allowed: AllowedForInstance<any>;
72
- tag: string;
73
- }[];
74
- constructor(app: GenericRouter, queue: inProcessQueueHandler, initRequest: (remult: Remult, origReq: GenericRequest) => Promise<void>, dataProvider: DataProvider | Promise<DataProvider>);
75
- logApiEndPoints: boolean;
76
- private firstArea;
77
- addArea(rootUrl: string): SiteArea;
78
- getRemult(req?: GenericRequest): Promise<Remult>;
79
- }
80
- export declare class SiteArea {
81
- private bridge;
82
- private app;
83
- private rootUrl;
84
- private logApiEndpoints;
85
- constructor(bridge: ExpressBridge, app: GenericRouter, rootUrl: string, logApiEndpoints: boolean);
86
- add(key: string, dataApiFactory: ((req: Remult) => DataApi)): void;
87
- process(what: (remult: Remult, myReq: DataApiRequest, myRes: DataApiResponse, origReq: GenericRequest) => Promise<void>): (req: GenericRequest, res: GenericResponse) => Promise<void>;
88
- getRemult(req: GenericRequest): Promise<Remult>;
89
- initQueue(): void;
90
- addAction(action: {
91
- __register: (reg: (url: string, queue: boolean, allowed: AllowedForInstance<any>, what: ((data: any, req: Remult, res: DataApiResponse) => void)) => void) => void;
92
- }): void;
93
- }
94
- export declare class ExpressRequestBridgeToDataApiRequest implements DataApiRequest {
95
- private r;
96
- get(key: string): any;
97
- constructor(r: GenericRequest);
98
- }
99
- declare class inProcessQueueHandler {
100
- private storage;
101
- constructor(storage: QueueStorage);
102
- submitJob(url: string, req: Remult, body: any): Promise<string>;
103
- mapQueuedAction(url: string, what: (data: any, r: Remult, res: ApiActionResponse) => void): void;
104
- actions: Map<string, (data: any, r: Remult, res: ApiActionResponse) => void>;
105
- getJobInfo(queuedJobId: string): Promise<queuedJobInfo>;
106
- }
107
58
  export interface queuedJobInfo {
108
59
  info: queuedJobInfoResponse;
109
60
  userId: string;
@@ -138,4 +89,3 @@ export declare class JobsInQueueEntity extends IdEntity {
138
89
  error: boolean;
139
90
  progress: number;
140
91
  }
141
- export {};