@teambit/express 0.0.937 → 0.0.939
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/dist/express.composition.d.ts +2 -2
- package/dist/express.main.runtime.d.ts +3 -3
- package/dist/express.main.runtime.js +3 -3
- package/dist/express.main.runtime.js.map +1 -1
- package/dist/{preview-1703387662836.js → preview-1703647408454.js} +2 -2
- package/dist/types/next.d.ts +1 -1
- package/dist/types/response.d.ts +1 -1
- package/dist/types/route.d.ts +1 -1
- package/express.aspect.ts +7 -0
- package/express.main.runtime.ts +174 -0
- package/index.ts +7 -0
- package/middleware-manifest.ts +6 -0
- package/package.json +13 -20
- package/tsconfig.json +16 -21
- package/types/asset.d.ts +15 -3
| @@ -1,2 +1,2 @@ | |
| 1 | 
            -
             | 
| 2 | 
            -
            export declare const Logo: () =>  | 
| 1 | 
            +
            /// <reference types="react" />
         | 
| 2 | 
            +
            export declare const Logo: () => JSX.Element;
         | 
| @@ -5,13 +5,13 @@ import { Logger, LoggerMain } from '@teambit/logger'; | |
| 5 5 | 
             
            import { Express } from 'express';
         | 
| 6 6 | 
             
            import { Route } from './types';
         | 
| 7 7 | 
             
            import { MiddlewareManifest } from './middleware-manifest';
         | 
| 8 | 
            -
            export  | 
| 8 | 
            +
            export type ExpressConfig = {
         | 
| 9 9 | 
             
                port: number;
         | 
| 10 10 | 
             
                namespace: string;
         | 
| 11 11 | 
             
                loggerIgnorePath: string[];
         | 
| 12 12 | 
             
            };
         | 
| 13 | 
            -
            export  | 
| 14 | 
            -
            export  | 
| 13 | 
            +
            export type MiddlewareSlot = SlotRegistry<MiddlewareManifest[]>;
         | 
| 14 | 
            +
            export type RouteSlot = SlotRegistry<Route[]>;
         | 
| 15 15 | 
             
            export declare class ExpressMain {
         | 
| 16 16 | 
             
                /**
         | 
| 17 17 | 
             
                 * extension config
         | 
| @@ -69,8 +69,8 @@ function _types() { | |
| 69 69 | 
             
            }
         | 
| 70 70 | 
             
            function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
         | 
| 71 71 | 
             
            function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
         | 
| 72 | 
            -
            function _toPropertyKey( | 
| 73 | 
            -
            function _toPrimitive( | 
| 72 | 
            +
            function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : String(i); }
         | 
| 73 | 
            +
            function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
         | 
| 74 74 | 
             
            class ExpressMain {
         | 
| 75 75 | 
             
              constructor(
         | 
| 76 76 | 
             
              /**
         | 
| @@ -138,7 +138,7 @@ class ExpressMain { | |
| 138 138 | 
             
                  this.logger.debug(`express got a request to a URL: ${req.url}', headers:`, req.headers);
         | 
| 139 139 | 
             
                  return next();
         | 
| 140 140 | 
             
                });
         | 
| 141 | 
            -
                if (! | 
| 141 | 
            +
                if (!options?.disableBodyParser) this.bodyParser(app);
         | 
| 142 142 | 
             
                const middlewaresSlot = this.middlewareSlot.values().flat();
         | 
| 143 143 | 
             
                middlewaresSlot.forEach(({
         | 
| 144 144 | 
             
                  route,
         | 
| @@ -1 +1 @@ | |
| 1 | 
            -
            {"version":3,"names":["_cli","data","require","_harmony","_logger","_express","_interopRequireDefault","_lodash","_bodyParser","_express2","_middlewares","_types","obj","__esModule","default","_defineProperty","key","value","_toPropertyKey","Object","defineProperty","enumerable","configurable","writable","arg","_toPrimitive","String","input","hint","prim","Symbol","toPrimitive","undefined","res","call","TypeError","Number","ExpressMain","constructor","config","moduleSlot","logger","middlewareSlot","listen","port","serverPort","app","createApp","register","routes","registerMiddleware","middlewares","createRootRoutes","namespace","ExpressAspect","id","method","path","disableNamespace","priority","req","send","expressApp","options","internalRoutes","createRoutes","allRoutes","concat","sortedRoutes","sortBy","r","reverse","express","use","next","loggerIgnorePath","includes","url","debug","headers","disableBodyParser","bodyParser","middlewaresSlot","values","flat","forEach","route","middleware","routeInfo","catchErrorsMiddlewares","routesSlots","toArray","routeEntries","map","flatten","verbValidation","lowerCase","verb","Verb","READ","status","jsonp","message","error","catchErrors","json","limit","raw","type","provider","loggerFactory","routeSlot","createLogger","exports","MainRuntime","Slot","withType","LoggerAspect","addRuntime"],"sources":["express.main.runtime.ts"],"sourcesContent":["import { MainRuntime } from '@teambit/cli';\nimport { Server } from 'http';\nimport { Slot, SlotRegistry } from '@teambit/harmony';\nimport { Logger, LoggerAspect, LoggerMain } from '@teambit/logger';\nimport express, { Express } from 'express';\nimport { concat, flatten, lowerCase, sortBy } from 'lodash';\nimport bodyParser from 'body-parser';\nimport { ExpressAspect } from './express.aspect';\nimport { catchErrors } from './middlewares';\nimport { Middleware, Request, Response, Route, Verb } from './types';\nimport { MiddlewareManifest } from './middleware-manifest';\n\nexport type ExpressConfig = {\n  port: number;\n  namespace: string;\n  loggerIgnorePath: string[];\n};\n\nexport type MiddlewareSlot = SlotRegistry<MiddlewareManifest[]>;\n\nexport type RouteSlot = SlotRegistry<Route[]>;\n\nexport class ExpressMain {\n  static runtime = MainRuntime;\n\n  constructor(\n    /**\n     * extension config\n     */\n    readonly config: ExpressConfig,\n\n    /**\n     * slot for registering graphql modules\n     */\n    private moduleSlot: RouteSlot,\n\n    /**\n     * logger extension.\n     */\n    readonly logger: Logger,\n\n    readonly middlewareSlot: MiddlewareSlot\n  ) {}\n\n  /**\n   * start an express server.\n   */\n  async listen(port?: number): Promise<Server> {\n    const serverPort = port || this.config.port;\n    const app = this.createApp();\n    return app.listen(serverPort);\n  }\n\n  /**\n   * register a new express routes.\n   * route will be added as `/api/${route}`\n   */\n  register(routes: Route[]) {\n    this.moduleSlot.register(routes);\n    return this;\n  }\n\n  /**\n   * register a new middleware into express.\n   */\n  registerMiddleware(middlewares: MiddlewareManifest[]) {\n    this.middlewareSlot.register(middlewares);\n    return this;\n  }\n\n  private createRootRoutes() {\n    // TODO: @guy refactor health to service aspect.\n    return [\n      {\n        namespace: ExpressAspect.id,\n        method: 'get',\n        path: '/_health',\n        disableNamespace: false,\n        priority: 0,\n        middlewares: [async (req: Request, res: Response) => res.send('ok')],\n      },\n    ];\n  }\n\n  createApp(expressApp?: Express, options?: { disableBodyParser: true }): Express {\n    const internalRoutes = this.createRootRoutes();\n    const routes = this.createRoutes();\n    const allRoutes = concat(routes, internalRoutes);\n    const sortedRoutes = sortBy(allRoutes, (r) => r.priority).reverse();\n    const app = expressApp || express();\n    app.use((req, res, next) => {\n      if (this.config.loggerIgnorePath.includes(req.url)) return next();\n      this.logger.debug(`express got a request to a URL: ${req.url}', headers:`, req.headers);\n      return next();\n    });\n    if (!options?.disableBodyParser) this.bodyParser(app);\n\n    const middlewaresSlot = this.middlewareSlot.values().flat();\n    middlewaresSlot.forEach(({ route, middleware }) => {\n      // eslint-disable-next-line @typescript-eslint/no-misused-promises\n      if (!route) app.use(middleware);\n      // eslint-disable-next-line @typescript-eslint/no-misused-promises\n      if (route) app.use(route, middleware);\n    });\n\n    sortedRoutes.forEach((routeInfo) => {\n      const { method, path, middlewares, disableNamespace } = routeInfo;\n      // TODO: @guy make sure to support single middleware here.\n      const namespace = disableNamespace ? '' : `/${this.config.namespace}`;\n      app[method](`${namespace}${path}`, this.catchErrorsMiddlewares(middlewares));\n    });\n\n    return app;\n  }\n\n  private createRoutes() {\n    const routesSlots = this.moduleSlot.toArray();\n    const routeEntries = routesSlots.map(([, routes]) => {\n      return routes.map((route) => {\n        const middlewares = flatten([this.verbValidation(route), route.middlewares]);\n        return {\n          method: lowerCase(route.method),\n          path: route.route,\n          disableNamespace: route.disableNamespace,\n          middlewares,\n          priority: route.priority || 0,\n        };\n      });\n    });\n\n    return flatten(routeEntries);\n  }\n\n  private verbValidation(route: Route): Middleware {\n    return async (req: express.Request, res: express.Response, next: express.NextFunction) => {\n      if (!route.verb) return next();\n      const verb = req.headers['x-verb'] || Verb.READ;\n      if (verb !== route.verb) {\n        res.status(403);\n        return res.jsonp({ message: 'You are not authorized', error: 'forbidden' });\n      }\n      return next();\n    };\n  }\n\n  private catchErrorsMiddlewares(middlewares: Middleware[]) {\n    return middlewares.map((middleware) => catchErrors(middleware));\n  }\n\n  private bodyParser(app: Express) {\n    app.use(bodyParser.json({ limit: '5000mb' }));\n    app.use(bodyParser.raw({ type: 'application/octet-stream', limit: '5000mb' }));\n  }\n\n  static slots = [Slot.withType<Route[]>(), Slot.withType<MiddlewareManifest[]>()];\n  static dependencies = [LoggerAspect];\n\n  static defaultConfig = {\n    port: 4001,\n    namespace: 'api',\n    loggerIgnorePath: ['/api/_health'],\n  };\n\n  static async provider(\n    [loggerFactory]: [LoggerMain],\n    config: ExpressConfig,\n    [routeSlot, middlewareSlot]: [RouteSlot, MiddlewareSlot]\n  ) {\n    const logger = loggerFactory.createLogger(ExpressAspect.id);\n    return new ExpressMain(config, routeSlot, logger, middlewareSlot);\n  }\n}\n\nExpressAspect.addRuntime(ExpressMain);\n"],"mappings":"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"}
         | 
| 1 | 
            +
            {"version":3,"names":["_cli","data","require","_harmony","_logger","_express","_interopRequireDefault","_lodash","_bodyParser","_express2","_middlewares","_types","obj","__esModule","default","_defineProperty","key","value","_toPropertyKey","Object","defineProperty","enumerable","configurable","writable","t","i","_toPrimitive","String","r","e","Symbol","toPrimitive","call","TypeError","Number","ExpressMain","constructor","config","moduleSlot","logger","middlewareSlot","listen","port","serverPort","app","createApp","register","routes","registerMiddleware","middlewares","createRootRoutes","namespace","ExpressAspect","id","method","path","disableNamespace","priority","req","res","send","expressApp","options","internalRoutes","createRoutes","allRoutes","concat","sortedRoutes","sortBy","reverse","express","use","next","loggerIgnorePath","includes","url","debug","headers","disableBodyParser","bodyParser","middlewaresSlot","values","flat","forEach","route","middleware","routeInfo","catchErrorsMiddlewares","routesSlots","toArray","routeEntries","map","flatten","verbValidation","lowerCase","verb","Verb","READ","status","jsonp","message","error","catchErrors","json","limit","raw","type","provider","loggerFactory","routeSlot","createLogger","exports","MainRuntime","Slot","withType","LoggerAspect","addRuntime"],"sources":["express.main.runtime.ts"],"sourcesContent":["import { MainRuntime } from '@teambit/cli';\nimport { Server } from 'http';\nimport { Slot, SlotRegistry } from '@teambit/harmony';\nimport { Logger, LoggerAspect, LoggerMain } from '@teambit/logger';\nimport express, { Express } from 'express';\nimport { concat, flatten, lowerCase, sortBy } from 'lodash';\nimport bodyParser from 'body-parser';\nimport { ExpressAspect } from './express.aspect';\nimport { catchErrors } from './middlewares';\nimport { Middleware, Request, Response, Route, Verb } from './types';\nimport { MiddlewareManifest } from './middleware-manifest';\n\nexport type ExpressConfig = {\n  port: number;\n  namespace: string;\n  loggerIgnorePath: string[];\n};\n\nexport type MiddlewareSlot = SlotRegistry<MiddlewareManifest[]>;\n\nexport type RouteSlot = SlotRegistry<Route[]>;\n\nexport class ExpressMain {\n  static runtime = MainRuntime;\n\n  constructor(\n    /**\n     * extension config\n     */\n    readonly config: ExpressConfig,\n\n    /**\n     * slot for registering graphql modules\n     */\n    private moduleSlot: RouteSlot,\n\n    /**\n     * logger extension.\n     */\n    readonly logger: Logger,\n\n    readonly middlewareSlot: MiddlewareSlot\n  ) {}\n\n  /**\n   * start an express server.\n   */\n  async listen(port?: number): Promise<Server> {\n    const serverPort = port || this.config.port;\n    const app = this.createApp();\n    return app.listen(serverPort);\n  }\n\n  /**\n   * register a new express routes.\n   * route will be added as `/api/${route}`\n   */\n  register(routes: Route[]) {\n    this.moduleSlot.register(routes);\n    return this;\n  }\n\n  /**\n   * register a new middleware into express.\n   */\n  registerMiddleware(middlewares: MiddlewareManifest[]) {\n    this.middlewareSlot.register(middlewares);\n    return this;\n  }\n\n  private createRootRoutes() {\n    // TODO: @guy refactor health to service aspect.\n    return [\n      {\n        namespace: ExpressAspect.id,\n        method: 'get',\n        path: '/_health',\n        disableNamespace: false,\n        priority: 0,\n        middlewares: [async (req: Request, res: Response) => res.send('ok')],\n      },\n    ];\n  }\n\n  createApp(expressApp?: Express, options?: { disableBodyParser: true }): Express {\n    const internalRoutes = this.createRootRoutes();\n    const routes = this.createRoutes();\n    const allRoutes = concat(routes, internalRoutes);\n    const sortedRoutes = sortBy(allRoutes, (r) => r.priority).reverse();\n    const app = expressApp || express();\n    app.use((req, res, next) => {\n      if (this.config.loggerIgnorePath.includes(req.url)) return next();\n      this.logger.debug(`express got a request to a URL: ${req.url}', headers:`, req.headers);\n      return next();\n    });\n    if (!options?.disableBodyParser) this.bodyParser(app);\n\n    const middlewaresSlot = this.middlewareSlot.values().flat();\n    middlewaresSlot.forEach(({ route, middleware }) => {\n      // eslint-disable-next-line @typescript-eslint/no-misused-promises\n      if (!route) app.use(middleware);\n      // eslint-disable-next-line @typescript-eslint/no-misused-promises\n      if (route) app.use(route, middleware);\n    });\n\n    sortedRoutes.forEach((routeInfo) => {\n      const { method, path, middlewares, disableNamespace } = routeInfo;\n      // TODO: @guy make sure to support single middleware here.\n      const namespace = disableNamespace ? '' : `/${this.config.namespace}`;\n      app[method](`${namespace}${path}`, this.catchErrorsMiddlewares(middlewares));\n    });\n\n    return app;\n  }\n\n  private createRoutes() {\n    const routesSlots = this.moduleSlot.toArray();\n    const routeEntries = routesSlots.map(([, routes]) => {\n      return routes.map((route) => {\n        const middlewares = flatten([this.verbValidation(route), route.middlewares]);\n        return {\n          method: lowerCase(route.method),\n          path: route.route,\n          disableNamespace: route.disableNamespace,\n          middlewares,\n          priority: route.priority || 0,\n        };\n      });\n    });\n\n    return flatten(routeEntries);\n  }\n\n  private verbValidation(route: Route): Middleware {\n    return async (req: express.Request, res: express.Response, next: express.NextFunction) => {\n      if (!route.verb) return next();\n      const verb = req.headers['x-verb'] || Verb.READ;\n      if (verb !== route.verb) {\n        res.status(403);\n        return res.jsonp({ message: 'You are not authorized', error: 'forbidden' });\n      }\n      return next();\n    };\n  }\n\n  private catchErrorsMiddlewares(middlewares: Middleware[]) {\n    return middlewares.map((middleware) => catchErrors(middleware));\n  }\n\n  private bodyParser(app: Express) {\n    app.use(bodyParser.json({ limit: '5000mb' }));\n    app.use(bodyParser.raw({ type: 'application/octet-stream', limit: '5000mb' }));\n  }\n\n  static slots = [Slot.withType<Route[]>(), Slot.withType<MiddlewareManifest[]>()];\n  static dependencies = [LoggerAspect];\n\n  static defaultConfig = {\n    port: 4001,\n    namespace: 'api',\n    loggerIgnorePath: ['/api/_health'],\n  };\n\n  static async provider(\n    [loggerFactory]: [LoggerMain],\n    config: ExpressConfig,\n    [routeSlot, middlewareSlot]: [RouteSlot, MiddlewareSlot]\n  ) {\n    const logger = loggerFactory.createLogger(ExpressAspect.id);\n    return new ExpressMain(config, routeSlot, logger, middlewareSlot);\n  }\n}\n\nExpressAspect.addRuntime(ExpressMain);\n"],"mappings":"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"}
         | 
| @@ -1,5 +1,5 @@ | |
| 1 | 
            -
            import * as compositions_0 from '/home/circleci/Library/Caches/Bit/capsules/8891be5ad3d35bfc38b9cd90c0e05b598a5a55af/teambit.harmony_express@0.0. | 
| 2 | 
            -
            import * as overview_0 from '/home/circleci/Library/Caches/Bit/capsules/8891be5ad3d35bfc38b9cd90c0e05b598a5a55af/teambit.harmony_express@0.0. | 
| 1 | 
            +
            import * as compositions_0 from '/home/circleci/Library/Caches/Bit/capsules/8891be5ad3d35bfc38b9cd90c0e05b598a5a55af/teambit.harmony_express@0.0.939/dist/express.composition.js';
         | 
| 2 | 
            +
            import * as overview_0 from '/home/circleci/Library/Caches/Bit/capsules/8891be5ad3d35bfc38b9cd90c0e05b598a5a55af/teambit.harmony_express@0.0.939/dist/express.docs.mdx';
         | 
| 3 3 |  | 
| 4 4 | 
             
            export const compositions = [compositions_0];
         | 
| 5 5 | 
             
            export const overview = [overview_0];
         | 
    
        package/dist/types/next.d.ts
    CHANGED
    
    | @@ -1,2 +1,2 @@ | |
| 1 1 | 
             
            import express from 'express';
         | 
| 2 | 
            -
            export  | 
| 2 | 
            +
            export type NextFunction = express.NextFunction;
         | 
    
        package/dist/types/response.d.ts
    CHANGED
    
    | @@ -1,2 +1,2 @@ | |
| 1 1 | 
             
            import express from 'express';
         | 
| 2 | 
            -
            export  | 
| 2 | 
            +
            export type Response = {} & express.Response;
         | 
    
        package/dist/types/route.d.ts
    CHANGED
    
    | @@ -5,7 +5,7 @@ import { Response } from './response'; | |
| 5 5 | 
             
            /**
         | 
| 6 6 | 
             
             * define express Middleware
         | 
| 7 7 | 
             
             */
         | 
| 8 | 
            -
            export  | 
| 8 | 
            +
            export type Middleware = (req: Request, res: Response, next: NextFunction) => void | Promise<any>;
         | 
| 9 9 | 
             
            export declare enum Verb {
         | 
| 10 10 | 
             
                WRITE = "write",
         | 
| 11 11 | 
             
                READ = "read"
         | 
| @@ -0,0 +1,174 @@ | |
| 1 | 
            +
            import { MainRuntime } from '@teambit/cli';
         | 
| 2 | 
            +
            import { Server } from 'http';
         | 
| 3 | 
            +
            import { Slot, SlotRegistry } from '@teambit/harmony';
         | 
| 4 | 
            +
            import { Logger, LoggerAspect, LoggerMain } from '@teambit/logger';
         | 
| 5 | 
            +
            import express, { Express } from 'express';
         | 
| 6 | 
            +
            import { concat, flatten, lowerCase, sortBy } from 'lodash';
         | 
| 7 | 
            +
            import bodyParser from 'body-parser';
         | 
| 8 | 
            +
            import { ExpressAspect } from './express.aspect';
         | 
| 9 | 
            +
            import { catchErrors } from './middlewares';
         | 
| 10 | 
            +
            import { Middleware, Request, Response, Route, Verb } from './types';
         | 
| 11 | 
            +
            import { MiddlewareManifest } from './middleware-manifest';
         | 
| 12 | 
            +
             | 
| 13 | 
            +
            export type ExpressConfig = {
         | 
| 14 | 
            +
              port: number;
         | 
| 15 | 
            +
              namespace: string;
         | 
| 16 | 
            +
              loggerIgnorePath: string[];
         | 
| 17 | 
            +
            };
         | 
| 18 | 
            +
             | 
| 19 | 
            +
            export type MiddlewareSlot = SlotRegistry<MiddlewareManifest[]>;
         | 
| 20 | 
            +
             | 
| 21 | 
            +
            export type RouteSlot = SlotRegistry<Route[]>;
         | 
| 22 | 
            +
             | 
| 23 | 
            +
            export class ExpressMain {
         | 
| 24 | 
            +
              static runtime = MainRuntime;
         | 
| 25 | 
            +
             | 
| 26 | 
            +
              constructor(
         | 
| 27 | 
            +
                /**
         | 
| 28 | 
            +
                 * extension config
         | 
| 29 | 
            +
                 */
         | 
| 30 | 
            +
                readonly config: ExpressConfig,
         | 
| 31 | 
            +
             | 
| 32 | 
            +
                /**
         | 
| 33 | 
            +
                 * slot for registering graphql modules
         | 
| 34 | 
            +
                 */
         | 
| 35 | 
            +
                private moduleSlot: RouteSlot,
         | 
| 36 | 
            +
             | 
| 37 | 
            +
                /**
         | 
| 38 | 
            +
                 * logger extension.
         | 
| 39 | 
            +
                 */
         | 
| 40 | 
            +
                readonly logger: Logger,
         | 
| 41 | 
            +
             | 
| 42 | 
            +
                readonly middlewareSlot: MiddlewareSlot
         | 
| 43 | 
            +
              ) {}
         | 
| 44 | 
            +
             | 
| 45 | 
            +
              /**
         | 
| 46 | 
            +
               * start an express server.
         | 
| 47 | 
            +
               */
         | 
| 48 | 
            +
              async listen(port?: number): Promise<Server> {
         | 
| 49 | 
            +
                const serverPort = port || this.config.port;
         | 
| 50 | 
            +
                const app = this.createApp();
         | 
| 51 | 
            +
                return app.listen(serverPort);
         | 
| 52 | 
            +
              }
         | 
| 53 | 
            +
             | 
| 54 | 
            +
              /**
         | 
| 55 | 
            +
               * register a new express routes.
         | 
| 56 | 
            +
               * route will be added as `/api/${route}`
         | 
| 57 | 
            +
               */
         | 
| 58 | 
            +
              register(routes: Route[]) {
         | 
| 59 | 
            +
                this.moduleSlot.register(routes);
         | 
| 60 | 
            +
                return this;
         | 
| 61 | 
            +
              }
         | 
| 62 | 
            +
             | 
| 63 | 
            +
              /**
         | 
| 64 | 
            +
               * register a new middleware into express.
         | 
| 65 | 
            +
               */
         | 
| 66 | 
            +
              registerMiddleware(middlewares: MiddlewareManifest[]) {
         | 
| 67 | 
            +
                this.middlewareSlot.register(middlewares);
         | 
| 68 | 
            +
                return this;
         | 
| 69 | 
            +
              }
         | 
| 70 | 
            +
             | 
| 71 | 
            +
              private createRootRoutes() {
         | 
| 72 | 
            +
                // TODO: @guy refactor health to service aspect.
         | 
| 73 | 
            +
                return [
         | 
| 74 | 
            +
                  {
         | 
| 75 | 
            +
                    namespace: ExpressAspect.id,
         | 
| 76 | 
            +
                    method: 'get',
         | 
| 77 | 
            +
                    path: '/_health',
         | 
| 78 | 
            +
                    disableNamespace: false,
         | 
| 79 | 
            +
                    priority: 0,
         | 
| 80 | 
            +
                    middlewares: [async (req: Request, res: Response) => res.send('ok')],
         | 
| 81 | 
            +
                  },
         | 
| 82 | 
            +
                ];
         | 
| 83 | 
            +
              }
         | 
| 84 | 
            +
             | 
| 85 | 
            +
              createApp(expressApp?: Express, options?: { disableBodyParser: true }): Express {
         | 
| 86 | 
            +
                const internalRoutes = this.createRootRoutes();
         | 
| 87 | 
            +
                const routes = this.createRoutes();
         | 
| 88 | 
            +
                const allRoutes = concat(routes, internalRoutes);
         | 
| 89 | 
            +
                const sortedRoutes = sortBy(allRoutes, (r) => r.priority).reverse();
         | 
| 90 | 
            +
                const app = expressApp || express();
         | 
| 91 | 
            +
                app.use((req, res, next) => {
         | 
| 92 | 
            +
                  if (this.config.loggerIgnorePath.includes(req.url)) return next();
         | 
| 93 | 
            +
                  this.logger.debug(`express got a request to a URL: ${req.url}', headers:`, req.headers);
         | 
| 94 | 
            +
                  return next();
         | 
| 95 | 
            +
                });
         | 
| 96 | 
            +
                if (!options?.disableBodyParser) this.bodyParser(app);
         | 
| 97 | 
            +
             | 
| 98 | 
            +
                const middlewaresSlot = this.middlewareSlot.values().flat();
         | 
| 99 | 
            +
                middlewaresSlot.forEach(({ route, middleware }) => {
         | 
| 100 | 
            +
                  // eslint-disable-next-line @typescript-eslint/no-misused-promises
         | 
| 101 | 
            +
                  if (!route) app.use(middleware);
         | 
| 102 | 
            +
                  // eslint-disable-next-line @typescript-eslint/no-misused-promises
         | 
| 103 | 
            +
                  if (route) app.use(route, middleware);
         | 
| 104 | 
            +
                });
         | 
| 105 | 
            +
             | 
| 106 | 
            +
                sortedRoutes.forEach((routeInfo) => {
         | 
| 107 | 
            +
                  const { method, path, middlewares, disableNamespace } = routeInfo;
         | 
| 108 | 
            +
                  // TODO: @guy make sure to support single middleware here.
         | 
| 109 | 
            +
                  const namespace = disableNamespace ? '' : `/${this.config.namespace}`;
         | 
| 110 | 
            +
                  app[method](`${namespace}${path}`, this.catchErrorsMiddlewares(middlewares));
         | 
| 111 | 
            +
                });
         | 
| 112 | 
            +
             | 
| 113 | 
            +
                return app;
         | 
| 114 | 
            +
              }
         | 
| 115 | 
            +
             | 
| 116 | 
            +
              private createRoutes() {
         | 
| 117 | 
            +
                const routesSlots = this.moduleSlot.toArray();
         | 
| 118 | 
            +
                const routeEntries = routesSlots.map(([, routes]) => {
         | 
| 119 | 
            +
                  return routes.map((route) => {
         | 
| 120 | 
            +
                    const middlewares = flatten([this.verbValidation(route), route.middlewares]);
         | 
| 121 | 
            +
                    return {
         | 
| 122 | 
            +
                      method: lowerCase(route.method),
         | 
| 123 | 
            +
                      path: route.route,
         | 
| 124 | 
            +
                      disableNamespace: route.disableNamespace,
         | 
| 125 | 
            +
                      middlewares,
         | 
| 126 | 
            +
                      priority: route.priority || 0,
         | 
| 127 | 
            +
                    };
         | 
| 128 | 
            +
                  });
         | 
| 129 | 
            +
                });
         | 
| 130 | 
            +
             | 
| 131 | 
            +
                return flatten(routeEntries);
         | 
| 132 | 
            +
              }
         | 
| 133 | 
            +
             | 
| 134 | 
            +
              private verbValidation(route: Route): Middleware {
         | 
| 135 | 
            +
                return async (req: express.Request, res: express.Response, next: express.NextFunction) => {
         | 
| 136 | 
            +
                  if (!route.verb) return next();
         | 
| 137 | 
            +
                  const verb = req.headers['x-verb'] || Verb.READ;
         | 
| 138 | 
            +
                  if (verb !== route.verb) {
         | 
| 139 | 
            +
                    res.status(403);
         | 
| 140 | 
            +
                    return res.jsonp({ message: 'You are not authorized', error: 'forbidden' });
         | 
| 141 | 
            +
                  }
         | 
| 142 | 
            +
                  return next();
         | 
| 143 | 
            +
                };
         | 
| 144 | 
            +
              }
         | 
| 145 | 
            +
             | 
| 146 | 
            +
              private catchErrorsMiddlewares(middlewares: Middleware[]) {
         | 
| 147 | 
            +
                return middlewares.map((middleware) => catchErrors(middleware));
         | 
| 148 | 
            +
              }
         | 
| 149 | 
            +
             | 
| 150 | 
            +
              private bodyParser(app: Express) {
         | 
| 151 | 
            +
                app.use(bodyParser.json({ limit: '5000mb' }));
         | 
| 152 | 
            +
                app.use(bodyParser.raw({ type: 'application/octet-stream', limit: '5000mb' }));
         | 
| 153 | 
            +
              }
         | 
| 154 | 
            +
             | 
| 155 | 
            +
              static slots = [Slot.withType<Route[]>(), Slot.withType<MiddlewareManifest[]>()];
         | 
| 156 | 
            +
              static dependencies = [LoggerAspect];
         | 
| 157 | 
            +
             | 
| 158 | 
            +
              static defaultConfig = {
         | 
| 159 | 
            +
                port: 4001,
         | 
| 160 | 
            +
                namespace: 'api',
         | 
| 161 | 
            +
                loggerIgnorePath: ['/api/_health'],
         | 
| 162 | 
            +
              };
         | 
| 163 | 
            +
             | 
| 164 | 
            +
              static async provider(
         | 
| 165 | 
            +
                [loggerFactory]: [LoggerMain],
         | 
| 166 | 
            +
                config: ExpressConfig,
         | 
| 167 | 
            +
                [routeSlot, middlewareSlot]: [RouteSlot, MiddlewareSlot]
         | 
| 168 | 
            +
              ) {
         | 
| 169 | 
            +
                const logger = loggerFactory.createLogger(ExpressAspect.id);
         | 
| 170 | 
            +
                return new ExpressMain(config, routeSlot, logger, middlewareSlot);
         | 
| 171 | 
            +
              }
         | 
| 172 | 
            +
            }
         | 
| 173 | 
            +
             | 
| 174 | 
            +
            ExpressAspect.addRuntime(ExpressMain);
         | 
    
        package/index.ts
    ADDED
    
    | @@ -0,0 +1,7 @@ | |
| 1 | 
            +
            export type { RouteSlot } from './express.main.runtime';
         | 
| 2 | 
            +
            export type { Route } from './types';
         | 
| 3 | 
            +
            export { Verb } from './types';
         | 
| 4 | 
            +
            export type { Request, Response, NextFunction, Middleware } from './types';
         | 
| 5 | 
            +
            export type { MiddlewareManifest } from './middleware-manifest';
         | 
| 6 | 
            +
            export type { ExpressMain } from './express.main.runtime';
         | 
| 7 | 
            +
            export { ExpressAspect } from './express.aspect';
         | 
    
        package/package.json
    CHANGED
    
    | @@ -1,37 +1,33 @@ | |
| 1 1 | 
             
            {
         | 
| 2 2 | 
             
              "name": "@teambit/express",
         | 
| 3 | 
            -
              "version": "0.0. | 
| 3 | 
            +
              "version": "0.0.939",
         | 
| 4 4 | 
             
              "homepage": "https://bit.cloud/teambit/harmony/express",
         | 
| 5 5 | 
             
              "main": "dist/index.js",
         | 
| 6 6 | 
             
              "componentId": {
         | 
| 7 7 | 
             
                "scope": "teambit.harmony",
         | 
| 8 8 | 
             
                "name": "express",
         | 
| 9 | 
            -
                "version": "0.0. | 
| 9 | 
            +
                "version": "0.0.939"
         | 
| 10 10 | 
             
              },
         | 
| 11 11 | 
             
              "dependencies": {
         | 
| 12 12 | 
             
                "body-parser": "1.19.0",
         | 
| 13 13 | 
             
                "express": "4.17.1",
         | 
| 14 14 | 
             
                "lodash": "4.17.21",
         | 
| 15 | 
            -
                "core-js": "^3.0.0",
         | 
| 16 | 
            -
                "@babel/runtime": "7.20.0",
         | 
| 17 15 | 
             
                "@teambit/harmony": "0.4.6",
         | 
| 18 | 
            -
                "@teambit/cli": "0.0. | 
| 19 | 
            -
                "@teambit/logger": "0.0. | 
| 16 | 
            +
                "@teambit/cli": "0.0.840",
         | 
| 17 | 
            +
                "@teambit/logger": "0.0.933"
         | 
| 20 18 | 
             
              },
         | 
| 21 19 | 
             
              "devDependencies": {
         | 
| 22 | 
            -
                "@types/react": "^17.0.8",
         | 
| 23 20 | 
             
                "@types/express": "4.17.13",
         | 
| 24 21 | 
             
                "@types/lodash": "4.14.165",
         | 
| 25 22 | 
             
                "@types/mocha": "9.1.0",
         | 
| 26 | 
            -
                "@types/ | 
| 27 | 
            -
                "@types/ | 
| 28 | 
            -
                "@ | 
| 29 | 
            -
                "@types/testing-library__jest-dom": "5.9.5"
         | 
| 23 | 
            +
                "@types/jest": "^29.2.2",
         | 
| 24 | 
            +
                "@types/testing-library__jest-dom": "^5.9.5",
         | 
| 25 | 
            +
                "@teambit/harmony.envs.core-aspect-env": "0.0.13"
         | 
| 30 26 | 
             
              },
         | 
| 31 27 | 
             
              "peerDependencies": {
         | 
| 32 | 
            -
                " | 
| 33 | 
            -
                "react": "^ | 
| 34 | 
            -
                " | 
| 28 | 
            +
                "react": "^17.0.0 || ^18.0.0",
         | 
| 29 | 
            +
                "@types/react": "^18.2.12",
         | 
| 30 | 
            +
                "@teambit/legacy": "1.0.624"
         | 
| 35 31 | 
             
              },
         | 
| 36 32 | 
             
              "license": "Apache-2.0",
         | 
| 37 33 | 
             
              "optionalDependencies": {},
         | 
| @@ -45,7 +41,7 @@ | |
| 45 41 | 
             
              },
         | 
| 46 42 | 
             
              "private": false,
         | 
| 47 43 | 
             
              "engines": {
         | 
| 48 | 
            -
                "node": ">= | 
| 44 | 
            +
                "node": ">=16.0.0"
         | 
| 49 45 | 
             
              },
         | 
| 50 46 | 
             
              "repository": {
         | 
| 51 47 | 
             
                "type": "git",
         | 
| @@ -54,12 +50,9 @@ | |
| 54 50 | 
             
              "keywords": [
         | 
| 55 51 | 
             
                "bit",
         | 
| 56 52 | 
             
                "bit-aspect",
         | 
| 53 | 
            +
                "bit-core-aspect",
         | 
| 57 54 | 
             
                "components",
         | 
| 58 55 | 
             
                "collaboration",
         | 
| 59 | 
            -
                "web" | 
| 60 | 
            -
                "react",
         | 
| 61 | 
            -
                "react-components",
         | 
| 62 | 
            -
                "angular",
         | 
| 63 | 
            -
                "angular-components"
         | 
| 56 | 
            +
                "web"
         | 
| 64 57 | 
             
              ]
         | 
| 65 58 | 
             
            }
         | 
    
        package/tsconfig.json
    CHANGED
    
    | @@ -1,38 +1,33 @@ | |
| 1 1 | 
             
            {
         | 
| 2 2 | 
             
              "compilerOptions": {
         | 
| 3 3 | 
             
                "lib": [
         | 
| 4 | 
            -
                  " | 
| 5 | 
            -
                  " | 
| 6 | 
            -
                  " | 
| 7 | 
            -
                  "DOM.Iterable",
         | 
| 8 | 
            -
                  "ScriptHost"
         | 
| 4 | 
            +
                  "esnext",
         | 
| 5 | 
            +
                  "dom",
         | 
| 6 | 
            +
                  "dom.Iterable"
         | 
| 9 7 | 
             
                ],
         | 
| 10 | 
            -
                "target": " | 
| 11 | 
            -
                "module": " | 
| 12 | 
            -
                "jsx": "react",
         | 
| 13 | 
            -
                "allowJs": true,
         | 
| 14 | 
            -
                "composite": true,
         | 
| 8 | 
            +
                "target": "es2020",
         | 
| 9 | 
            +
                "module": "es2020",
         | 
| 10 | 
            +
                "jsx": "react-jsx",
         | 
| 15 11 | 
             
                "declaration": true,
         | 
| 16 12 | 
             
                "sourceMap": true,
         | 
| 17 | 
            -
                "skipLibCheck": true,
         | 
| 18 13 | 
             
                "experimentalDecorators": true,
         | 
| 19 | 
            -
                " | 
| 14 | 
            +
                "skipLibCheck": true,
         | 
| 20 15 | 
             
                "moduleResolution": "node",
         | 
| 21 16 | 
             
                "esModuleInterop": true,
         | 
| 22 | 
            -
                "rootDir": ".",
         | 
| 23 17 | 
             
                "resolveJsonModule": true,
         | 
| 24 | 
            -
                " | 
| 25 | 
            -
                " | 
| 26 | 
            -
                " | 
| 27 | 
            -
                "strictPropertyInitialization": false,
         | 
| 28 | 
            -
                "strict": true,
         | 
| 29 | 
            -
                "noImplicitAny": false,
         | 
| 30 | 
            -
                "preserveConstEnums": true
         | 
| 18 | 
            +
                "allowJs": true,
         | 
| 19 | 
            +
                "outDir": "dist",
         | 
| 20 | 
            +
                "emitDeclarationOnly": true
         | 
| 31 21 | 
             
              },
         | 
| 32 22 | 
             
              "exclude": [
         | 
| 23 | 
            +
                "artifacts",
         | 
| 24 | 
            +
                "public",
         | 
| 33 25 | 
             
                "dist",
         | 
| 26 | 
            +
                "node_modules",
         | 
| 27 | 
            +
                "package.json",
         | 
| 34 28 | 
             
                "esm.mjs",
         | 
| 35 | 
            -
                " | 
| 29 | 
            +
                "**/*.cjs",
         | 
| 30 | 
            +
                "./dist"
         | 
| 36 31 | 
             
              ],
         | 
| 37 32 | 
             
              "include": [
         | 
| 38 33 | 
             
                "**/*",
         | 
    
        package/types/asset.d.ts
    CHANGED
    
    | @@ -5,12 +5,12 @@ declare module '*.png' { | |
| 5 5 | 
             
            declare module '*.svg' {
         | 
| 6 6 | 
             
              import type { FunctionComponent, SVGProps } from 'react';
         | 
| 7 7 |  | 
| 8 | 
            -
              export const ReactComponent: FunctionComponent< | 
| 8 | 
            +
              export const ReactComponent: FunctionComponent<
         | 
| 9 | 
            +
                SVGProps<SVGSVGElement> & { title?: string }
         | 
| 10 | 
            +
              >;
         | 
| 9 11 | 
             
              const src: string;
         | 
| 10 12 | 
             
              export default src;
         | 
| 11 13 | 
             
            }
         | 
| 12 | 
            -
             | 
| 13 | 
            -
            // @TODO Gilad
         | 
| 14 14 | 
             
            declare module '*.jpg' {
         | 
| 15 15 | 
             
              const value: any;
         | 
| 16 16 | 
             
              export = value;
         | 
| @@ -27,3 +27,15 @@ declare module '*.bmp' { | |
| 27 27 | 
             
              const value: any;
         | 
| 28 28 | 
             
              export = value;
         | 
| 29 29 | 
             
            }
         | 
| 30 | 
            +
            declare module '*.otf' {
         | 
| 31 | 
            +
              const value: any;
         | 
| 32 | 
            +
              export = value;
         | 
| 33 | 
            +
            }
         | 
| 34 | 
            +
            declare module '*.woff' {
         | 
| 35 | 
            +
              const value: any;
         | 
| 36 | 
            +
              export = value;
         | 
| 37 | 
            +
            }
         | 
| 38 | 
            +
            declare module '*.woff2' {
         | 
| 39 | 
            +
              const value: any;
         | 
| 40 | 
            +
              export = value;
         | 
| 41 | 
            +
            }
         |