@teambit/express 0.0.939 → 0.0.941

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1 @@
1
+ !function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports["teambit.harmony/express-preview"]=t():e["teambit.harmony/express-preview"]=t()}(self,(()=>(()=>{"use strict";var e={62213:(e,t,o)=>{var r={id:"teambit.harmony/express@0.0.941",homepage:"https://bit.cloud/teambit/harmony/express",exported:!0};function n(){const e=i(o(87363));return n=function(){return e},e}function i(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,"__esModule",{value:!0}),t.Logo=void 0,n.__bit_component=r,i.__bit_component=r;const s=()=>n().default.createElement("div",{style:{height:"100%",display:"flex",justifyContent:"center"}},n().default.createElement("img",{style:{width:70},src:"https://static.bit.dev/extensions-icons/express.svg"}));s.__bit_component=r,t.Logo=s},87363:e=>{e.exports=React}},t={};function o(r){var n=t[r];if(void 0!==n)return n.exports;var i=t[r]={exports:{}};return e[r](i,i.exports,o),i.exports}o.d=(e,t)=>{for(var r in t)o.o(t,r)&&!o.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},o.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),o.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var r={};return(()=>{o.r(r),o.d(r,{compositions:()=>u,compositions_metadata:()=>l,overview:()=>f});var e={};o.r(e),o.d(e,{default:()=>d});var t=o(62213);o(87363);const n=MdxJsReact,i=TeambitMdxUiMdxScopeContext;var s=["components"];function p(){return p=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var o=arguments[t];for(var r in o)Object.prototype.hasOwnProperty.call(o,r)&&(e[r]=o[r])}return e},p.apply(this,arguments)}var a={},c="wrapper";function d(e){var t=e.components,o=function(e,t){if(null==e)return{};var o,r,n=function(e,t){if(null==e)return{};var o,r,n={},i=Object.keys(e);for(r=0;r<i.length;r++)o=i[r],t.indexOf(o)>=0||(n[o]=e[o]);return n}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r<i.length;r++)o=i[r],t.indexOf(o)>=0||Object.prototype.propertyIsEnumerable.call(e,o)&&(n[o]=e[o])}return n}(e,s);return(0,n.mdx)(c,p({},a,o,{components:t,mdxType:"MDXLayout"}),(0,n.mdx)(i.MDXScopeProvider,{components:{},mdxType:"MDXScopeProvider"}))}d.isMDXComponent=!0;const u=[t],f=[e],l={compositions:[{displayName:"Logo",identifier:"Logo"}]}})(),r})()));
@@ -1,5 +1,5 @@
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';
1
+ import * as compositions_0 from '/home/circleci/Library/Caches/Bit/capsules/8891be5ad3d35bfc38b9cd90c0e05b598a5a55af/teambit.harmony_express@0.0.941/dist/express.composition.js';
2
+ import * as overview_0 from '/home/circleci/Library/Caches/Bit/capsules/8891be5ad3d35bfc38b9cd90c0e05b598a5a55af/teambit.harmony_express@0.0.941/dist/express.docs.mdx';
3
3
 
4
4
  export const compositions = [compositions_0];
5
5
  export const overview = [overview_0];
package/package.json CHANGED
@@ -1,20 +1,20 @@
1
1
  {
2
2
  "name": "@teambit/express",
3
- "version": "0.0.939",
3
+ "version": "0.0.941",
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.939"
9
+ "version": "0.0.941"
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
15
  "@teambit/harmony": "0.4.6",
16
- "@teambit/cli": "0.0.840",
17
- "@teambit/logger": "0.0.933"
16
+ "@teambit/cli": "0.0.842",
17
+ "@teambit/logger": "0.0.935"
18
18
  },
19
19
  "devDependencies": {
20
20
  "@types/express": "4.17.13",
@@ -22,7 +22,7 @@
22
22
  "@types/mocha": "9.1.0",
23
23
  "@types/jest": "^29.2.2",
24
24
  "@types/testing-library__jest-dom": "^5.9.5",
25
- "@teambit/harmony.envs.core-aspect-env": "0.0.13"
25
+ "@teambit/harmony.envs.core-aspect-env": "0.0.15"
26
26
  },
27
27
  "peerDependencies": {
28
28
  "react": "^17.0.0 || ^18.0.0",
@@ -33,11 +33,15 @@
33
33
  "optionalDependencies": {},
34
34
  "peerDependenciesMeta": {},
35
35
  "exports": {
36
- "node": {
37
- "require": "./dist/index.js",
38
- "import": "./dist/esm.mjs"
36
+ ".": {
37
+ "node": {
38
+ "require": "./dist/index.js",
39
+ "import": "./dist/esm.mjs"
40
+ },
41
+ "default": "./dist/index.js"
39
42
  },
40
- "default": "./dist/index.js"
43
+ "./dist/*": "./dist/*",
44
+ "./artifacts/*": "./artifacts/*"
41
45
  },
42
46
  "private": false,
43
47
  "engines": {
package/express.aspect.ts DELETED
@@ -1,7 +0,0 @@
1
- import { Aspect } from '@teambit/harmony';
2
-
3
- export const ExpressAspect = Aspect.create({
4
- id: 'teambit.harmony/express',
5
- dependencies: [],
6
- defaultConfig: {},
7
- });
@@ -1,174 +0,0 @@
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 DELETED
@@ -1,7 +0,0 @@
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';
@@ -1,6 +0,0 @@
1
- import { Middleware } from './types';
2
-
3
- export interface MiddlewareManifest {
4
- route?: string;
5
- middleware: Middleware;
6
- }