From eb05d237af17428b9fb0f4f834e77ef91ac06040 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kamil=20My=C5=9Bliwiec?= Date: Tue, 27 Mar 2018 13:26:50 +0200 Subject: [PATCH] sample(@nestjs) add execution context app example --- lib/common/constants.d.ts | 25 + lib/common/constants.js | 27 + .../decorators/core/bind.decorator.d.ts | 8 + lib/common/decorators/core/bind.decorator.js | 14 + .../decorators/core/catch.decorator.d.ts | 6 + lib/common/decorators/core/catch.decorator.js | 14 + .../decorators/core/component.decorator.d.ts | 27 + .../decorators/core/component.decorator.js | 60 + .../decorators/core/controller.decorator.d.ts | 6 + .../decorators/core/controller.decorator.js | 16 + .../core/dependencies.decorator.d.ts | 3 + .../decorators/core/dependencies.decorator.js | 16 + .../core/exception-filters.decorator.d.ts | 15 + .../core/exception-filters.decorator.js | 31 + lib/common/decorators/core/index.d.ts | 11 + lib/common/decorators/core/index.js | 16 + .../decorators/core/inject.decorator.d.ts | 6 + .../decorators/core/inject.decorator.js | 18 + .../core/reflect-metadata.decorator.d.ts | 8 + .../core/reflect-metadata.decorator.js | 14 + .../decorators/core/use-guards.decorator.d.ts | 13 + .../decorators/core/use-guards.decorator.js | 29 + .../core/use-interceptors.decorator.d.ts | 13 + .../core/use-interceptors.decorator.js | 29 + .../decorators/core/use-pipes.decorator.d.ts | 14 + .../decorators/core/use-pipes.decorator.js | 30 + ...create-route-param-metadata.decorator.d.ts | 17 + .../create-route-param-metadata.decorator.js | 35 + .../decorators/http/http-code.decorator.d.ts | 7 + .../decorators/http/http-code.decorator.js | 16 + lib/common/decorators/http/index.d.ts | 5 + lib/common/decorators/http/index.js | 10 + .../decorators/http/render.decorator.d.ts | 5 + .../decorators/http/render.decorator.js | 14 + .../http/request-mapping.decorator.d.ts | 37 + .../http/request-mapping.decorator.js | 56 + .../http/route-params.decorator.d.ts | 36 + .../decorators/http/route-params.decorator.js | 45 + lib/common/decorators/index.d.ts | 3 + lib/common/decorators/index.js | 8 + .../modules/exceptions/constants.d.ts | 1 + .../modules/exceptions/constants.js | 3 + .../invalid-module-config.exception.d.ts | 3 + .../invalid-module-config.exception.js | 9 + .../decorators/modules/global.decorator.d.ts | 6 + .../decorators/modules/global.decorator.js | 14 + lib/common/decorators/modules/index.d.ts | 3 + lib/common/decorators/modules/index.js | 8 + .../decorators/modules/module.decorator.d.ts | 13 + .../decorators/modules/module.decorator.js | 62 + .../modules/single-scope.decorator.d.ts | 6 + .../modules/single-scope.decorator.js | 22 + lib/common/enums/http-status.enum.d.ts | 46 + lib/common/enums/http-status.enum.js | 49 + lib/common/enums/index.d.ts | 2 + lib/common/enums/index.js | 7 + lib/common/enums/nest-environment.enum.d.ts | 4 + lib/common/enums/nest-environment.enum.js | 7 + lib/common/enums/request-method.enum.d.ts | 10 + lib/common/enums/request-method.enum.js | 13 + lib/common/enums/route-paramtypes.enum.d.ts | 12 + lib/common/enums/route-paramtypes.enum.js | 15 + lib/common/enums/transport.enum.d.ts | 7 + lib/common/enums/transport.enum.js | 10 + .../exceptions/bad-gateway.exception.d.ts | 4 + .../exceptions/bad-gateway.exception.js | 11 + .../exceptions/bad-request.exception.d.ts | 4 + .../exceptions/bad-request.exception.js | 11 + lib/common/exceptions/conflict.exception.d.ts | 4 + lib/common/exceptions/conflict.exception.js | 11 + .../exceptions/forbidden.exception.d.ts | 4 + lib/common/exceptions/forbidden.exception.js | 11 + .../exceptions/gateway-timeout.exception.d.ts | 4 + .../exceptions/gateway-timeout.exception.js | 11 + lib/common/exceptions/gone.exception.d.ts | 4 + lib/common/exceptions/gone.exception.js | 11 + lib/common/exceptions/http.exception.d.ts | 27 + lib/common/exceptions/http.exception.js | 36 + lib/common/exceptions/index.d.ts | 18 + lib/common/exceptions/index.js | 23 + .../internal-server-error.exception.d.ts | 4 + .../internal-server-error.exception.js | 11 + .../method-not-allowed.exception.d.ts | 4 + .../method-not-allowed.exception.js | 11 + .../exceptions/not-acceptable.exception.d.ts | 4 + .../exceptions/not-acceptable.exception.js | 11 + .../exceptions/not-found.exception.d.ts | 4 + lib/common/exceptions/not-found.exception.js | 11 + .../exceptions/not-implemented.exception.d.ts | 4 + .../exceptions/not-implemented.exception.js | 11 + .../payload-too-large.exception.d.ts | 4 + .../exceptions/payload-too-large.exception.js | 11 + .../exceptions/request-timeout.exception.d.ts | 4 + .../exceptions/request-timeout.exception.js | 11 + .../service-unavailable.exception.d.ts | 4 + .../service-unavailable.exception.js | 11 + .../exceptions/unauthorized.exception.d.ts | 4 + .../exceptions/unauthorized.exception.js | 11 + .../unprocessable-entity.exception.d.ts | 4 + .../unprocessable-entity.exception.js | 11 + .../unsupported-media-type.exception.d.ts | 4 + .../unsupported-media-type.exception.js | 11 + lib/common/http/http.module.d.ts | 1 + lib/common/http/http.module.js | 19 + lib/common/http/http.service.d.ts | 32 + lib/common/http/http.service.js | 28 + lib/common/http/index.d.ts | 2 + lib/common/http/index.js | 7 + lib/common/index.d.ts | 34 + lib/common/index.js | 18 + lib/common/interceptors/file.interceptor.d.ts | 5 + lib/common/interceptors/file.interceptor.js | 34 + .../interceptors/files.interceptor.d.ts | 16 + lib/common/interceptors/files.interceptor.js | 34 + lib/common/interceptors/index.d.ts | 2 + lib/common/interceptors/index.js | 7 + .../interceptors/multer/multer.constants.d.ts | 9 + .../interceptors/multer/multer.constants.js | 11 + .../interceptors/multer/multer.utils.d.ts | 7 + .../interceptors/multer/multer.utils.js | 22 + .../configuration-provider.interface.d.ts | 6 + .../configuration-provider.interface.js | 2 + .../controller-metadata.interface.d.ts | 3 + .../controller-metadata.interface.js | 2 + .../controllers/controller.interface.d.ts | 1 + .../controllers/controller.interface.js | 2 + lib/common/interfaces/controllers/index.d.ts | 2 + lib/common/interfaces/controllers/index.js | 2 + .../exception-filter-metadata.interface.d.ts | 6 + .../exception-filter-metadata.interface.js | 2 + .../exception-filter.interface.d.ts | 4 + .../exceptions/exception-filter.interface.js | 2 + lib/common/interfaces/exceptions/index.d.ts | 5 + lib/common/interfaces/exceptions/index.js | 2 + ...c-exception-filter-metadata.interface.d.ts | 6 + ...rpc-exception-filter-metadata.interface.js | 2 + .../rpc-exception-filter.interface.d.ts | 5 + .../rpc-exception-filter.interface.js | 2 + .../ws-exception-filter.interface.d.ts | 4 + .../ws-exception-filter.interface.js | 2 + .../external/cors-options.interface.d.ts | 14 + .../external/cors-options.interface.js | 2 + .../external/https-options.interface.d.ts | 14 + .../external/https-options.interface.js | 2 + .../external/multer-options.interface.d.ts | 52 + .../external/multer-options.interface.js | 2 + .../serve-static-options.interface.d.ts | 57 + .../serve-static-options.interface.js | 3 + .../features/arguments-host.interface.d.ts | 18 + .../features/arguments-host.interface.js | 2 + .../features/can-activate.interface.d.ts | 7 + .../features/can-activate.interface.js | 2 + .../custom-route-param-factory.interface.d.ts | 1 + .../custom-route-param-factory.interface.js | 2 + .../features/execution-context.interface.d.ts | 6 + .../features/execution-context.interface.js | 2 + .../features/nest-interceptor.interface.d.ts | 8 + .../features/nest-interceptor.interface.js | 2 + .../features/paramtype.interface.d.ts | 1 + .../features/paramtype.interface.js | 2 + .../features/pipe-transform.interface.d.ts | 13 + .../features/pipe-transform.interface.js | 2 + .../http/http-server-factory.interface.d.ts | 3 + .../http/http-server-factory.interface.js | 2 + .../http/http-server.interface.d.ts | 48 + .../interfaces/http/http-server.interface.js | 2 + lib/common/interfaces/index.d.ts | 30 + lib/common/interfaces/index.js | 2 + .../interfaces/injectable.interface.d.ts | 1 + lib/common/interfaces/injectable.interface.js | 2 + .../client-metadata.interface.d.ts | 20 + .../client-metadata.interface.js | 2 + .../custom-transport-strategy.interface.d.ts | 4 + .../custom-transport-strategy.interface.js | 2 + .../microservice-configuration.interface.d.ts | 59 + .../microservice-configuration.interface.js | 2 + .../nest-microservice-options.interface.d.ts | 3 + .../nest-microservice-options.interface.js | 2 + lib/common/interfaces/middlewares/index.d.ts | 5 + lib/common/interfaces/middlewares/index.js | 2 + .../middleware-config-proxy.interface.d.ts | 19 + .../middleware-config-proxy.interface.js | 2 + .../middleware-configuration.interface.d.ts | 5 + .../middleware-configuration.interface.js | 2 + .../middlewares/middleware.interface.d.ts | 1 + .../middlewares/middleware.interface.js | 2 + .../middlewares-consumer.interface.d.ts | 11 + .../middlewares-consumer.interface.js | 2 + .../nest-middleware.interface.d.ts | 4 + .../middlewares/nest-middleware.interface.js | 2 + .../modules/dynamic-module.interface.d.ts | 5 + .../modules/dynamic-module.interface.js | 2 + lib/common/interfaces/modules/index.d.ts | 4 + lib/common/interfaces/modules/index.js | 2 + .../modules/module-metadata.interface.d.ts | 11 + .../modules/module-metadata.interface.js | 2 + .../modules/nest-module.interface.d.ts | 4 + .../modules/nest-module.interface.js | 2 + .../modules/on-destroy.interface.d.ts | 3 + .../modules/on-destroy.interface.js | 2 + .../interfaces/modules/on-init.interface.d.ts | 3 + .../interfaces/modules/on-init.interface.js | 2 + .../modules/provider.interface.d.ts | 19 + .../interfaces/modules/provider.interface.js | 2 + ...application-context-options.interface.d.ts | 4 + ...t-application-context-options.interface.js | 5 + .../nest-application-context.interface.d.ts | 18 + .../nest-application-context.interface.js | 2 + .../nest-application-options.interface.d.ts | 8 + .../nest-application-options.interface.js | 2 + .../nest-application.interface.d.ts | 127 + .../interfaces/nest-application.interface.js | 2 + .../nest-express-application.interface.d.ts | 54 + .../nest-express-application.interface.js | 2 + .../nest-fastify-application.interface.d.ts | 72 + .../nest-fastify-application.interface.js | 2 + .../nest-microservice.interface.d.ts | 59 + .../interfaces/nest-microservice.interface.js | 2 + .../request-mapping-metadata.interface.d.ts | 5 + .../request-mapping-metadata.interface.js | 2 + lib/common/interfaces/type.interface.d.ts | 3 + lib/common/interfaces/type.interface.js | 2 + .../web-socket-adapter.interface.d.ts | 15 + .../web-socket-adapter.interface.js | 2 + lib/common/pipes/index.d.ts | 2 + lib/common/pipes/index.js | 7 + lib/common/pipes/parse-int.pipe.d.ts | 5 + lib/common/pipes/parse-int.pipe.js | 35 + lib/common/pipes/validation.pipe.d.ts | 13 + lib/common/pipes/validation.pipe.js | 72 + lib/common/services/logger.service.d.ts | 39 + lib/common/services/logger.service.js | 66 + .../utils/bind-resolve-values.util.d.ts | 7 + lib/common/utils/bind-resolve-values.util.js | 16 + lib/common/utils/extend-metadata.util.d.ts | 5 + lib/common/utils/extend-metadata.util.js | 8 + lib/common/utils/forward-ref.util.d.ts | 5 + lib/common/utils/forward-ref.util.js | 3 + .../utils/http-exception-body.util.d.ts | 15 + lib/common/utils/http-exception-body.util.js | 3 + lib/common/utils/index.d.ts | 1 + lib/common/utils/index.js | 6 + lib/common/utils/merge-with-values.util.d.ts | 9 + lib/common/utils/merge-with-values.util.js | 16 + lib/common/utils/shared.utils.d.ts | 9 + lib/common/utils/shared.utils.js | 11 + lib/common/utils/validate-each.util.d.ts | 13 + lib/common/utils/validate-each.util.js | 20 + lib/core/adapters/express-adapter.d.ts | 38 + lib/core/adapters/express-adapter.js | 86 + lib/core/adapters/express-factory.d.ts | 3 + lib/core/adapters/express-factory.js | 10 + lib/core/adapters/fastify-adapter.d.ts | 41 + lib/core/adapters/fastify-adapter.js | 91 + lib/core/adapters/index.d.ts | 1 + lib/core/adapters/index.js | 6 + lib/core/application-config.d.ts | 33 + lib/core/application-config.js | 61 + lib/core/constants.d.ts | 10 + lib/core/constants.js | 12 + lib/core/errors/exception-handler.d.ts | 5 + lib/core/errors/exception-handler.js | 15 + lib/core/errors/exceptions-zone.d.ts | 5 + lib/core/errors/exceptions-zone.js | 36 + .../circular-dependency.exception.d.ts | 4 + .../circular-dependency.exception.js | 9 + .../invalid-exception-filter.exception.d.ts | 4 + .../invalid-exception-filter.exception.js | 10 + ...id-middleware-configuration.exception.d.ts | 4 + ...alid-middleware-configuration.exception.js | 10 + .../invalid-middleware.exception.d.ts | 4 + .../invalid-middleware.exception.js | 10 + .../exceptions/invalid-module.exception.d.ts | 4 + .../exceptions/invalid-module.exception.js | 11 + ...oservices-package-not-found.exception.d.ts | 4 + ...croservices-package-not-found.exception.js | 10 + .../missing-dependency.exception.d.ts | 4 + .../missing-dependency.exception.js | 10 + .../errors/exceptions/runtime.exception.d.ts | 11 + .../errors/exceptions/runtime.exception.js | 12 + .../undefined-dependency.exception.d.ts | 4 + .../undefined-dependency.exception.js | 10 + .../unknown-dependencies.exception.d.ts | 4 + .../unknown-dependencies.exception.js | 10 + .../exceptions/unknown-export.exception.d.ts | 4 + .../exceptions/unknown-export.exception.js | 10 + .../exceptions/unknown-module.exception.d.ts | 4 + .../exceptions/unknown-module.exception.js | 9 + .../unknown-request-mapping.exception.d.ts | 4 + .../unknown-request-mapping.exception.js | 10 + lib/core/errors/messages.d.ts | 22 + lib/core/errors/messages.js | 20 + .../base-exception-filter-context.d.ts | 8 + .../base-exception-filter-context.js | 26 + lib/core/exceptions/exceptions-handler.d.ts | 14 + lib/core/exceptions/exceptions-handler.js | 59 + lib/core/guards/constants.d.ts | 1 + lib/core/guards/constants.js | 3 + lib/core/guards/guards-consumer.d.ts | 20 + lib/core/guards/guards-consumer.js | 46 + lib/core/guards/guards-context-creator.d.ts | 27 + lib/core/guards/guards-context-creator.js | 53 + lib/core/helpers/context-creator.d.ts | 15 + lib/core/helpers/context-creator.js | 23 + lib/core/helpers/execution-context.host.d.ts | 20 + lib/core/helpers/execution-context.host.js | 39 + .../helpers/external-context-creator.d.ts | 29 + lib/core/helpers/external-context-creator.js | 53 + lib/core/helpers/messages.d.ts | 6 + lib/core/helpers/messages.js | 6 + lib/core/helpers/router-method-factory.d.ts | 4 + lib/core/helpers/router-method-factory.js | 27 + lib/core/index.d.ts | 7 + lib/core/index.js | 25 + lib/core/injector/container.d.ts | 69 + lib/core/injector/container.js | 150 + lib/core/injector/index.d.ts | 2 + lib/core/injector/index.js | 7 + lib/core/injector/injector.d.ts | 144 + lib/core/injector/injector.js | 234 + lib/core/injector/instance-loader.d.ts | 16 + lib/core/injector/instance-loader.js | 78 + lib/core/injector/module-ref.d.ts | 4 + lib/core/injector/module-ref.js | 5 + lib/core/injector/module-token-factory.d.ts | 15 + lib/core/injector/module-token-factory.js | 35 + lib/core/injector/module.d.ts | 94 + lib/core/injector/module.js | 258 + lib/core/injector/modules-container.d.ts | 2 + lib/core/injector/modules-container.js | 5 + lib/core/injector/tokens.d.ts | 1 + lib/core/injector/tokens.js | 3 + .../interceptors/interceptors-consumer.d.ts | 19 + .../interceptors/interceptors-consumer.js | 39 + .../interceptors-context-creator.d.ts | 26 + .../interceptors-context-creator.js | 55 + lib/core/metadata-scanner.d.ts | 9 + lib/core/metadata-scanner.js | 27 + lib/core/middlewares/builder.d.ts | 16 + lib/core/middlewares/builder.js | 52 + lib/core/middlewares/container.d.ts | 16 + lib/core/middlewares/container.js | 42 + lib/core/middlewares/middlewares-module.d.ts | 46 + lib/core/middlewares/middlewares-module.js | 109 + lib/core/middlewares/resolver.d.ts | 9 + lib/core/middlewares/resolver.js | 29 + lib/core/middlewares/routes-mapper.d.ts | 11 + lib/core/middlewares/routes-mapper.js | 44 + lib/core/middlewares/utils.d.ts | 5 + lib/core/middlewares/utils.js | 27 + lib/core/nest-application-context.d.ts | 15 + lib/core/nest-application-context.js | 57 + lib/core/nest-application.d.ts | 89 + lib/core/nest-application.js | 327 + lib/core/nest-factory.d.ts | 64 + lib/core/nest-factory.js | 140 + lib/core/pipes/params-token-factory.d.ts | 5 + lib/core/pipes/params-token-factory.js | 18 + lib/core/pipes/pipes-consumer.d.ts | 30 + lib/core/pipes/pipes-consumer.js | 35 + lib/core/pipes/pipes-context-creator.d.ts | 11 + lib/core/pipes/pipes-context-creator.js | 32 + .../exceptions-filter.interface.d.ts | 5 + .../interfaces/exceptions-filter.interface.js | 2 + .../router/interfaces/resolver.interface.d.ts | 3 + .../router/interfaces/resolver.interface.js | 2 + .../route-params-factory.interface.d.ts | 16 + .../route-params-factory.interface.js | 2 + lib/core/router/route-params-factory.d.ts | 17 + lib/core/router/route-params-factory.js | 32 + lib/core/router/router-exception-filters.d.ts | 17 + lib/core/router/router-exception-filters.js | 27 + lib/core/router/router-execution-context.d.ts | 102 + lib/core/router/router-execution-context.js | 147 + lib/core/router/router-explorer.d.ts | 67 + lib/core/router/router-explorer.js | 87 + lib/core/router/router-proxy.d.ts | 12 + lib/core/router/router-proxy.js | 32 + .../router/router-response-controller.d.ts | 13 + lib/core/router/router-response-controller.js | 49 + lib/core/router/routes-resolver.d.ts | 24 + lib/core/router/routes-resolver.js | 71 + lib/core/scanner.d.ts | 54 + lib/core/scanner.js | 166 + lib/core/services/reflector.service.d.ts | 3 + lib/core/services/reflector.service.js | 8 + lib/microservices/client/client-grpc.d.ts | 33 + lib/microservices/client/client-grpc.js | 106 + lib/microservices/client/client-mqtt.d.ts | 23 + lib/microservices/client/client-mqtt.js | 80 + lib/microservices/client/client-nats.d.ts | 21 + lib/microservices/client/client-nats.js | 91 + .../client/client-proxy-factory.d.ts | 6 + .../client/client-proxy-factory.js | 26 + lib/microservices/client/client-proxy.d.ts | 26 + lib/microservices/client/client-proxy.js | 46 + lib/microservices/client/client-redis.d.ts | 25 + lib/microservices/client/client-redis.js | 119 + lib/microservices/client/client-tcp.d.ts | 28 + lib/microservices/client/client-tcp.js | 97 + lib/microservices/client/index.d.ts | 2 + lib/microservices/client/index.js | 7 + lib/microservices/constants.d.ts | 17 + lib/microservices/constants.js | 18 + lib/microservices/container.d.ts | 9 + lib/microservices/container.js | 17 + .../context/exception-filters-context.d.ts | 15 + .../context/exception-filters-context.js | 26 + .../context/rpc-context-creator.d.ts | 40 + .../context/rpc-context-creator.js | 52 + lib/microservices/context/rpc-proxy.d.ts | 8 + lib/microservices/context/rpc-proxy.js | 25 + lib/microservices/enums/index.d.ts | 1 + lib/microservices/enums/index.js | 6 + lib/microservices/enums/transport.enum.d.ts | 7 + lib/microservices/enums/transport.enum.js | 10 + lib/microservices/exceptions/index.d.ts | 1 + lib/microservices/exceptions/index.js | 6 + .../invalid-grpc-package.exception.d.ts | 4 + .../invalid-grpc-package.exception.js | 9 + .../invalid-grpc-service.exception.d.ts | 4 + .../invalid-grpc-service.exception.js | 9 + .../exceptions/invalid-message.exception.d.ts | 4 + .../exceptions/invalid-message.exception.js | 9 + .../invalid-proto-definition.exception.d.ts | 4 + .../invalid-proto-definition.exception.js | 9 + .../exceptions/rpc-exception.d.ts | 6 + lib/microservices/exceptions/rpc-exception.js | 13 + .../exceptions/rpc-exceptions-handler.d.ts | 17 + .../exceptions/rpc-exceptions-handler.js | 51 + lib/microservices/index.d.ts | 7 + lib/microservices/index.js | 17 + .../interfaces/client-grpc.interface.d.ts | 3 + .../interfaces/client-grpc.interface.js | 2 + .../interfaces/client-metadata.interface.d.ts | 20 + .../interfaces/client-metadata.interface.js | 2 + .../interfaces/closeable.interface.d.ts | 3 + .../interfaces/closeable.interface.js | 2 + .../custom-transport-strategy.interface.d.ts | 4 + .../custom-transport-strategy.interface.js | 2 + lib/microservices/interfaces/index.d.ts | 8 + lib/microservices/interfaces/index.js | 2 + .../message-handlers.interface.d.ts | 4 + .../interfaces/message-handlers.interface.js | 2 + .../microservice-configuration.interface.d.ts | 60 + .../microservice-configuration.interface.js | 2 + .../interfaces/packet.interface.d.ts | 12 + .../interfaces/packet.interface.js | 2 + .../pattern-metadata.interface.d.ts | 3 + .../interfaces/pattern-metadata.interface.js | 2 + .../listener-metadata-explorer.d.ts | 23 + .../listener-metadata-explorer.js | 38 + lib/microservices/listeners-controller.d.ts | 21 + lib/microservices/listeners-controller.js | 28 + lib/microservices/microservices-module.d.ts | 21 + lib/microservices/microservices-module.js | 57 + lib/microservices/nest-microservice.d.ts | 51 + lib/microservices/nest-microservice.js | 149 + lib/microservices/server/index.d.ts | 1 + lib/microservices/server/index.js | 6 + lib/microservices/server/server-factory.d.ts | 5 + lib/microservices/server/server-factory.js | 26 + lib/microservices/server/server-grpc.d.ts | 28 + lib/microservices/server/server-grpc.js | 127 + lib/microservices/server/server-mqtt.d.ts | 25 + lib/microservices/server/server-mqtt.js | 83 + lib/microservices/server/server-nats.d.ts | 34 + lib/microservices/server/server-nats.js | 78 + lib/microservices/server/server-redis.d.ts | 38 + lib/microservices/server/server-redis.js | 102 + lib/microservices/server/server-tcp.d.ts | 21 + lib/microservices/server/server-tcp.js | 74 + lib/microservices/server/server.d.ts | 30 + lib/microservices/server/server.js | 57 + lib/microservices/utils/client.decorator.d.ts | 15 + lib/microservices/utils/client.decorator.js | 21 + lib/microservices/utils/index.d.ts | 2 + lib/microservices/utils/index.js | 7 + .../utils/pattern.decorator.d.ts | 15 + lib/microservices/utils/pattern.decorator.js | 18 + lib/testing/index.d.ts | 4 + lib/testing/index.js | 14 + lib/testing/interfaces/index.d.ts | 2 + lib/testing/interfaces/index.js | 2 + ...override-by-factory-options.interface.d.ts | 4 + .../override-by-factory-options.interface.js | 2 + .../interfaces/override-by.interface.d.ts | 7 + .../interfaces/override-by.interface.js | 2 + lib/testing/test.d.ts | 7 + lib/testing/test.js | 17 + lib/testing/testing-module.builder.d.ts | 22 + lib/testing/testing-module.builder.js | 75 + lib/testing/testing-module.d.ts | 30 + lib/testing/testing-module.js | 33 + lib/websockets/adapters/index.d.ts | 1 + lib/websockets/adapters/index.js | 6 + lib/websockets/adapters/io-adapter.d.ts | 26 + lib/websockets/adapters/io-adapter.js | 56 + lib/websockets/adapters/ws-adapter.d.ts | 31 + lib/websockets/adapters/ws-adapter.js | 68 + lib/websockets/constants.d.ts | 12 + lib/websockets/constants.js | 14 + lib/websockets/container.d.ts | 12 + lib/websockets/container.js | 20 + .../context/exception-filters-context.d.ts | 11 + .../context/exception-filters-context.js | 22 + .../context/ws-context-creator.d.ts | 39 + lib/websockets/context/ws-context-creator.js | 51 + lib/websockets/context/ws-proxy.d.ts | 7 + lib/websockets/context/ws-proxy.js | 25 + .../invalid-socket-port.exception.d.ts | 4 + .../invalid-socket-port.exception.js | 9 + lib/websockets/exceptions/ws-exception.d.ts | 6 + lib/websockets/exceptions/ws-exception.js | 13 + .../exceptions/ws-exceptions-handler.d.ts | 9 + .../exceptions/ws-exceptions-handler.js | 47 + lib/websockets/gateway-metadata-explorer.d.ts | 17 + lib/websockets/gateway-metadata-explorer.js | 37 + lib/websockets/index.d.ts | 5 + lib/websockets/index.js | 14 + .../gateway-metadata.interface.d.ts | 11 + .../interfaces/gateway-metadata.interface.js | 2 + .../gateway-middleware.interface.d.ts | 3 + .../gateway-middleware.interface.js | 2 + lib/websockets/interfaces/index.d.ts | 9 + lib/websockets/interfaces/index.js | 2 + .../interfaces/nest-gateway.interface.d.ts | 5 + .../interfaces/nest-gateway.interface.js | 2 + .../observable-socket-server.interface.d.ts | 8 + .../observable-socket-server.interface.js | 2 + .../on-gateway-connection.interface.d.ts | 3 + .../on-gateway-connection.interface.js | 2 + .../on-gateway-disconnect.interface.d.ts | 3 + .../on-gateway-disconnect.interface.js | 2 + .../interfaces/on-gateway-init.interface.d.ts | 3 + .../interfaces/on-gateway-init.interface.js | 2 + .../web-socket-server.interface.d.ts | 4 + .../interfaces/web-socket-server.interface.js | 2 + .../interfaces/ws-response.interface.d.ts | 4 + .../interfaces/ws-response.interface.js | 2 + lib/websockets/middlewares-injector.d.ts | 26 + lib/websockets/middlewares-injector.js | 52 + lib/websockets/observable-socket.d.ts | 4 + lib/websockets/observable-socket.js | 15 + lib/websockets/socket-module.d.ts | 19 + lib/websockets/socket-module.js | 64 + lib/websockets/socket-server-provider.d.ts | 16 + lib/websockets/socket-server-provider.js | 51 + .../utils/gateway-server.decorator.d.ts | 5 + .../utils/gateway-server.decorator.js | 13 + lib/websockets/utils/index.d.ts | 3 + lib/websockets/utils/index.js | 8 + .../utils/socket-gateway.decorator.d.ts | 12 + .../utils/socket-gateway.decorator.js | 18 + .../utils/subscribe-message.decorator.d.ts | 7 + .../utils/subscribe-message.decorator.js | 14 + lib/websockets/web-sockets-controller.d.ts | 67 + lib/websockets/web-sockets-controller.js | 113 + .../middleware-config-proxy.interface.ts | 8 +- .../middlewares-consumer.interface.ts | 2 +- .../nest-application-context.interface.ts | 6 +- .../interfaces/nest-application.interface.ts | 42 +- .../nest-express-application.interface.ts | 14 +- .../nest-fastify-application.interface.ts | 8 +- .../interfaces/nest-microservice.interface.ts | 20 +- .../exceptions/unknown-element.exception.ts | 9 + .../exceptions/unknown-module.exception.ts | 4 +- .../base-exception-filter-context.ts | 1 - packages/core/nest-application-context.ts | 53 +- packages/core/nest-application.ts | 20 - packages/core/nest-factory.ts | 14 +- .../core/router/router-exception-filters.ts | 1 - .../test/client/client-nats.spec.ts | 9 +- sample/08-webpack/src/main.ts | 6 +- sample/18-context/.gitignore | 21 + sample/18-context/package.json | 24 + sample/18-context/src/app.controller.ts | 12 + sample/18-context/src/app.module.ts | 10 + sample/18-context/src/app.service.ts | 8 + sample/18-context/src/main.ts | 10 + sample/18-context/tsconfig.json | 17 + sample/18-context/tslint.json | 29 + sample/18-context/yarn.lock | 5742 +++++++++++++++++ 583 files changed, 17628 insertions(+), 94 deletions(-) create mode 100644 lib/common/constants.d.ts create mode 100644 lib/common/constants.js create mode 100644 lib/common/decorators/core/bind.decorator.d.ts create mode 100644 lib/common/decorators/core/bind.decorator.js create mode 100644 lib/common/decorators/core/catch.decorator.d.ts create mode 100644 lib/common/decorators/core/catch.decorator.js create mode 100644 lib/common/decorators/core/component.decorator.d.ts create mode 100644 lib/common/decorators/core/component.decorator.js create mode 100644 lib/common/decorators/core/controller.decorator.d.ts create mode 100644 lib/common/decorators/core/controller.decorator.js create mode 100644 lib/common/decorators/core/dependencies.decorator.d.ts create mode 100644 lib/common/decorators/core/dependencies.decorator.js create mode 100644 lib/common/decorators/core/exception-filters.decorator.d.ts create mode 100644 lib/common/decorators/core/exception-filters.decorator.js create mode 100644 lib/common/decorators/core/index.d.ts create mode 100644 lib/common/decorators/core/index.js create mode 100644 lib/common/decorators/core/inject.decorator.d.ts create mode 100644 lib/common/decorators/core/inject.decorator.js create mode 100644 lib/common/decorators/core/reflect-metadata.decorator.d.ts create mode 100644 lib/common/decorators/core/reflect-metadata.decorator.js create mode 100644 lib/common/decorators/core/use-guards.decorator.d.ts create mode 100644 lib/common/decorators/core/use-guards.decorator.js create mode 100644 lib/common/decorators/core/use-interceptors.decorator.d.ts create mode 100644 lib/common/decorators/core/use-interceptors.decorator.js create mode 100644 lib/common/decorators/core/use-pipes.decorator.d.ts create mode 100644 lib/common/decorators/core/use-pipes.decorator.js create mode 100644 lib/common/decorators/http/create-route-param-metadata.decorator.d.ts create mode 100644 lib/common/decorators/http/create-route-param-metadata.decorator.js create mode 100644 lib/common/decorators/http/http-code.decorator.d.ts create mode 100644 lib/common/decorators/http/http-code.decorator.js create mode 100644 lib/common/decorators/http/index.d.ts create mode 100644 lib/common/decorators/http/index.js create mode 100644 lib/common/decorators/http/render.decorator.d.ts create mode 100644 lib/common/decorators/http/render.decorator.js create mode 100644 lib/common/decorators/http/request-mapping.decorator.d.ts create mode 100644 lib/common/decorators/http/request-mapping.decorator.js create mode 100644 lib/common/decorators/http/route-params.decorator.d.ts create mode 100644 lib/common/decorators/http/route-params.decorator.js create mode 100644 lib/common/decorators/index.d.ts create mode 100644 lib/common/decorators/index.js create mode 100644 lib/common/decorators/modules/exceptions/constants.d.ts create mode 100644 lib/common/decorators/modules/exceptions/constants.js create mode 100644 lib/common/decorators/modules/exceptions/invalid-module-config.exception.d.ts create mode 100644 lib/common/decorators/modules/exceptions/invalid-module-config.exception.js create mode 100644 lib/common/decorators/modules/global.decorator.d.ts create mode 100644 lib/common/decorators/modules/global.decorator.js create mode 100644 lib/common/decorators/modules/index.d.ts create mode 100644 lib/common/decorators/modules/index.js create mode 100644 lib/common/decorators/modules/module.decorator.d.ts create mode 100644 lib/common/decorators/modules/module.decorator.js create mode 100644 lib/common/decorators/modules/single-scope.decorator.d.ts create mode 100644 lib/common/decorators/modules/single-scope.decorator.js create mode 100644 lib/common/enums/http-status.enum.d.ts create mode 100644 lib/common/enums/http-status.enum.js create mode 100644 lib/common/enums/index.d.ts create mode 100644 lib/common/enums/index.js create mode 100644 lib/common/enums/nest-environment.enum.d.ts create mode 100644 lib/common/enums/nest-environment.enum.js create mode 100644 lib/common/enums/request-method.enum.d.ts create mode 100644 lib/common/enums/request-method.enum.js create mode 100644 lib/common/enums/route-paramtypes.enum.d.ts create mode 100644 lib/common/enums/route-paramtypes.enum.js create mode 100644 lib/common/enums/transport.enum.d.ts create mode 100644 lib/common/enums/transport.enum.js create mode 100644 lib/common/exceptions/bad-gateway.exception.d.ts create mode 100644 lib/common/exceptions/bad-gateway.exception.js create mode 100644 lib/common/exceptions/bad-request.exception.d.ts create mode 100644 lib/common/exceptions/bad-request.exception.js create mode 100644 lib/common/exceptions/conflict.exception.d.ts create mode 100644 lib/common/exceptions/conflict.exception.js create mode 100644 lib/common/exceptions/forbidden.exception.d.ts create mode 100644 lib/common/exceptions/forbidden.exception.js create mode 100644 lib/common/exceptions/gateway-timeout.exception.d.ts create mode 100644 lib/common/exceptions/gateway-timeout.exception.js create mode 100644 lib/common/exceptions/gone.exception.d.ts create mode 100644 lib/common/exceptions/gone.exception.js create mode 100644 lib/common/exceptions/http.exception.d.ts create mode 100644 lib/common/exceptions/http.exception.js create mode 100644 lib/common/exceptions/index.d.ts create mode 100644 lib/common/exceptions/index.js create mode 100644 lib/common/exceptions/internal-server-error.exception.d.ts create mode 100644 lib/common/exceptions/internal-server-error.exception.js create mode 100644 lib/common/exceptions/method-not-allowed.exception.d.ts create mode 100644 lib/common/exceptions/method-not-allowed.exception.js create mode 100644 lib/common/exceptions/not-acceptable.exception.d.ts create mode 100644 lib/common/exceptions/not-acceptable.exception.js create mode 100644 lib/common/exceptions/not-found.exception.d.ts create mode 100644 lib/common/exceptions/not-found.exception.js create mode 100644 lib/common/exceptions/not-implemented.exception.d.ts create mode 100644 lib/common/exceptions/not-implemented.exception.js create mode 100644 lib/common/exceptions/payload-too-large.exception.d.ts create mode 100644 lib/common/exceptions/payload-too-large.exception.js create mode 100644 lib/common/exceptions/request-timeout.exception.d.ts create mode 100644 lib/common/exceptions/request-timeout.exception.js create mode 100644 lib/common/exceptions/service-unavailable.exception.d.ts create mode 100644 lib/common/exceptions/service-unavailable.exception.js create mode 100644 lib/common/exceptions/unauthorized.exception.d.ts create mode 100644 lib/common/exceptions/unauthorized.exception.js create mode 100644 lib/common/exceptions/unprocessable-entity.exception.d.ts create mode 100644 lib/common/exceptions/unprocessable-entity.exception.js create mode 100644 lib/common/exceptions/unsupported-media-type.exception.d.ts create mode 100644 lib/common/exceptions/unsupported-media-type.exception.js create mode 100644 lib/common/http/http.module.d.ts create mode 100644 lib/common/http/http.module.js create mode 100644 lib/common/http/http.service.d.ts create mode 100644 lib/common/http/http.service.js create mode 100644 lib/common/http/index.d.ts create mode 100644 lib/common/http/index.js create mode 100644 lib/common/index.d.ts create mode 100644 lib/common/index.js create mode 100644 lib/common/interceptors/file.interceptor.d.ts create mode 100644 lib/common/interceptors/file.interceptor.js create mode 100644 lib/common/interceptors/files.interceptor.d.ts create mode 100644 lib/common/interceptors/files.interceptor.js create mode 100644 lib/common/interceptors/index.d.ts create mode 100644 lib/common/interceptors/index.js create mode 100644 lib/common/interceptors/multer/multer.constants.d.ts create mode 100644 lib/common/interceptors/multer/multer.constants.js create mode 100644 lib/common/interceptors/multer/multer.utils.d.ts create mode 100644 lib/common/interceptors/multer/multer.utils.js create mode 100644 lib/common/interfaces/configuration-provider.interface.d.ts create mode 100644 lib/common/interfaces/configuration-provider.interface.js create mode 100644 lib/common/interfaces/controllers/controller-metadata.interface.d.ts create mode 100644 lib/common/interfaces/controllers/controller-metadata.interface.js create mode 100644 lib/common/interfaces/controllers/controller.interface.d.ts create mode 100644 lib/common/interfaces/controllers/controller.interface.js create mode 100644 lib/common/interfaces/controllers/index.d.ts create mode 100644 lib/common/interfaces/controllers/index.js create mode 100644 lib/common/interfaces/exceptions/exception-filter-metadata.interface.d.ts create mode 100644 lib/common/interfaces/exceptions/exception-filter-metadata.interface.js create mode 100644 lib/common/interfaces/exceptions/exception-filter.interface.d.ts create mode 100644 lib/common/interfaces/exceptions/exception-filter.interface.js create mode 100644 lib/common/interfaces/exceptions/index.d.ts create mode 100644 lib/common/interfaces/exceptions/index.js create mode 100644 lib/common/interfaces/exceptions/rpc-exception-filter-metadata.interface.d.ts create mode 100644 lib/common/interfaces/exceptions/rpc-exception-filter-metadata.interface.js create mode 100644 lib/common/interfaces/exceptions/rpc-exception-filter.interface.d.ts create mode 100644 lib/common/interfaces/exceptions/rpc-exception-filter.interface.js create mode 100644 lib/common/interfaces/exceptions/ws-exception-filter.interface.d.ts create mode 100644 lib/common/interfaces/exceptions/ws-exception-filter.interface.js create mode 100644 lib/common/interfaces/external/cors-options.interface.d.ts create mode 100644 lib/common/interfaces/external/cors-options.interface.js create mode 100644 lib/common/interfaces/external/https-options.interface.d.ts create mode 100644 lib/common/interfaces/external/https-options.interface.js create mode 100644 lib/common/interfaces/external/multer-options.interface.d.ts create mode 100644 lib/common/interfaces/external/multer-options.interface.js create mode 100644 lib/common/interfaces/external/serve-static-options.interface.d.ts create mode 100644 lib/common/interfaces/external/serve-static-options.interface.js create mode 100644 lib/common/interfaces/features/arguments-host.interface.d.ts create mode 100644 lib/common/interfaces/features/arguments-host.interface.js create mode 100644 lib/common/interfaces/features/can-activate.interface.d.ts create mode 100644 lib/common/interfaces/features/can-activate.interface.js create mode 100644 lib/common/interfaces/features/custom-route-param-factory.interface.d.ts create mode 100644 lib/common/interfaces/features/custom-route-param-factory.interface.js create mode 100644 lib/common/interfaces/features/execution-context.interface.d.ts create mode 100644 lib/common/interfaces/features/execution-context.interface.js create mode 100644 lib/common/interfaces/features/nest-interceptor.interface.d.ts create mode 100644 lib/common/interfaces/features/nest-interceptor.interface.js create mode 100644 lib/common/interfaces/features/paramtype.interface.d.ts create mode 100644 lib/common/interfaces/features/paramtype.interface.js create mode 100644 lib/common/interfaces/features/pipe-transform.interface.d.ts create mode 100644 lib/common/interfaces/features/pipe-transform.interface.js create mode 100644 lib/common/interfaces/http/http-server-factory.interface.d.ts create mode 100644 lib/common/interfaces/http/http-server-factory.interface.js create mode 100644 lib/common/interfaces/http/http-server.interface.d.ts create mode 100644 lib/common/interfaces/http/http-server.interface.js create mode 100644 lib/common/interfaces/index.d.ts create mode 100644 lib/common/interfaces/index.js create mode 100644 lib/common/interfaces/injectable.interface.d.ts create mode 100644 lib/common/interfaces/injectable.interface.js create mode 100644 lib/common/interfaces/microservices/client-metadata.interface.d.ts create mode 100644 lib/common/interfaces/microservices/client-metadata.interface.js create mode 100644 lib/common/interfaces/microservices/custom-transport-strategy.interface.d.ts create mode 100644 lib/common/interfaces/microservices/custom-transport-strategy.interface.js create mode 100644 lib/common/interfaces/microservices/microservice-configuration.interface.d.ts create mode 100644 lib/common/interfaces/microservices/microservice-configuration.interface.js create mode 100644 lib/common/interfaces/microservices/nest-microservice-options.interface.d.ts create mode 100644 lib/common/interfaces/microservices/nest-microservice-options.interface.js create mode 100644 lib/common/interfaces/middlewares/index.d.ts create mode 100644 lib/common/interfaces/middlewares/index.js create mode 100644 lib/common/interfaces/middlewares/middleware-config-proxy.interface.d.ts create mode 100644 lib/common/interfaces/middlewares/middleware-config-proxy.interface.js create mode 100644 lib/common/interfaces/middlewares/middleware-configuration.interface.d.ts create mode 100644 lib/common/interfaces/middlewares/middleware-configuration.interface.js create mode 100644 lib/common/interfaces/middlewares/middleware.interface.d.ts create mode 100644 lib/common/interfaces/middlewares/middleware.interface.js create mode 100644 lib/common/interfaces/middlewares/middlewares-consumer.interface.d.ts create mode 100644 lib/common/interfaces/middlewares/middlewares-consumer.interface.js create mode 100644 lib/common/interfaces/middlewares/nest-middleware.interface.d.ts create mode 100644 lib/common/interfaces/middlewares/nest-middleware.interface.js create mode 100644 lib/common/interfaces/modules/dynamic-module.interface.d.ts create mode 100644 lib/common/interfaces/modules/dynamic-module.interface.js create mode 100644 lib/common/interfaces/modules/index.d.ts create mode 100644 lib/common/interfaces/modules/index.js create mode 100644 lib/common/interfaces/modules/module-metadata.interface.d.ts create mode 100644 lib/common/interfaces/modules/module-metadata.interface.js create mode 100644 lib/common/interfaces/modules/nest-module.interface.d.ts create mode 100644 lib/common/interfaces/modules/nest-module.interface.js create mode 100644 lib/common/interfaces/modules/on-destroy.interface.d.ts create mode 100644 lib/common/interfaces/modules/on-destroy.interface.js create mode 100644 lib/common/interfaces/modules/on-init.interface.d.ts create mode 100644 lib/common/interfaces/modules/on-init.interface.js create mode 100644 lib/common/interfaces/modules/provider.interface.d.ts create mode 100644 lib/common/interfaces/modules/provider.interface.js create mode 100644 lib/common/interfaces/nest-application-context-options.interface.d.ts create mode 100644 lib/common/interfaces/nest-application-context-options.interface.js create mode 100644 lib/common/interfaces/nest-application-context.interface.d.ts create mode 100644 lib/common/interfaces/nest-application-context.interface.js create mode 100644 lib/common/interfaces/nest-application-options.interface.d.ts create mode 100644 lib/common/interfaces/nest-application-options.interface.js create mode 100644 lib/common/interfaces/nest-application.interface.d.ts create mode 100644 lib/common/interfaces/nest-application.interface.js create mode 100644 lib/common/interfaces/nest-express-application.interface.d.ts create mode 100644 lib/common/interfaces/nest-express-application.interface.js create mode 100644 lib/common/interfaces/nest-fastify-application.interface.d.ts create mode 100644 lib/common/interfaces/nest-fastify-application.interface.js create mode 100644 lib/common/interfaces/nest-microservice.interface.d.ts create mode 100644 lib/common/interfaces/nest-microservice.interface.js create mode 100644 lib/common/interfaces/request-mapping-metadata.interface.d.ts create mode 100644 lib/common/interfaces/request-mapping-metadata.interface.js create mode 100644 lib/common/interfaces/type.interface.d.ts create mode 100644 lib/common/interfaces/type.interface.js create mode 100644 lib/common/interfaces/websockets/web-socket-adapter.interface.d.ts create mode 100644 lib/common/interfaces/websockets/web-socket-adapter.interface.js create mode 100644 lib/common/pipes/index.d.ts create mode 100644 lib/common/pipes/index.js create mode 100644 lib/common/pipes/parse-int.pipe.d.ts create mode 100644 lib/common/pipes/parse-int.pipe.js create mode 100644 lib/common/pipes/validation.pipe.d.ts create mode 100644 lib/common/pipes/validation.pipe.js create mode 100644 lib/common/services/logger.service.d.ts create mode 100644 lib/common/services/logger.service.js create mode 100644 lib/common/utils/bind-resolve-values.util.d.ts create mode 100644 lib/common/utils/bind-resolve-values.util.js create mode 100644 lib/common/utils/extend-metadata.util.d.ts create mode 100644 lib/common/utils/extend-metadata.util.js create mode 100644 lib/common/utils/forward-ref.util.d.ts create mode 100644 lib/common/utils/forward-ref.util.js create mode 100644 lib/common/utils/http-exception-body.util.d.ts create mode 100644 lib/common/utils/http-exception-body.util.js create mode 100644 lib/common/utils/index.d.ts create mode 100644 lib/common/utils/index.js create mode 100644 lib/common/utils/merge-with-values.util.d.ts create mode 100644 lib/common/utils/merge-with-values.util.js create mode 100644 lib/common/utils/shared.utils.d.ts create mode 100644 lib/common/utils/shared.utils.js create mode 100644 lib/common/utils/validate-each.util.d.ts create mode 100644 lib/common/utils/validate-each.util.js create mode 100644 lib/core/adapters/express-adapter.d.ts create mode 100644 lib/core/adapters/express-adapter.js create mode 100644 lib/core/adapters/express-factory.d.ts create mode 100644 lib/core/adapters/express-factory.js create mode 100644 lib/core/adapters/fastify-adapter.d.ts create mode 100644 lib/core/adapters/fastify-adapter.js create mode 100644 lib/core/adapters/index.d.ts create mode 100644 lib/core/adapters/index.js create mode 100644 lib/core/application-config.d.ts create mode 100644 lib/core/application-config.js create mode 100644 lib/core/constants.d.ts create mode 100644 lib/core/constants.js create mode 100644 lib/core/errors/exception-handler.d.ts create mode 100644 lib/core/errors/exception-handler.js create mode 100644 lib/core/errors/exceptions-zone.d.ts create mode 100644 lib/core/errors/exceptions-zone.js create mode 100644 lib/core/errors/exceptions/circular-dependency.exception.d.ts create mode 100644 lib/core/errors/exceptions/circular-dependency.exception.js create mode 100644 lib/core/errors/exceptions/invalid-exception-filter.exception.d.ts create mode 100644 lib/core/errors/exceptions/invalid-exception-filter.exception.js create mode 100644 lib/core/errors/exceptions/invalid-middleware-configuration.exception.d.ts create mode 100644 lib/core/errors/exceptions/invalid-middleware-configuration.exception.js create mode 100644 lib/core/errors/exceptions/invalid-middleware.exception.d.ts create mode 100644 lib/core/errors/exceptions/invalid-middleware.exception.js create mode 100644 lib/core/errors/exceptions/invalid-module.exception.d.ts create mode 100644 lib/core/errors/exceptions/invalid-module.exception.js create mode 100644 lib/core/errors/exceptions/microservices-package-not-found.exception.d.ts create mode 100644 lib/core/errors/exceptions/microservices-package-not-found.exception.js create mode 100644 lib/core/errors/exceptions/missing-dependency.exception.d.ts create mode 100644 lib/core/errors/exceptions/missing-dependency.exception.js create mode 100644 lib/core/errors/exceptions/runtime.exception.d.ts create mode 100644 lib/core/errors/exceptions/runtime.exception.js create mode 100644 lib/core/errors/exceptions/undefined-dependency.exception.d.ts create mode 100644 lib/core/errors/exceptions/undefined-dependency.exception.js create mode 100644 lib/core/errors/exceptions/unknown-dependencies.exception.d.ts create mode 100644 lib/core/errors/exceptions/unknown-dependencies.exception.js create mode 100644 lib/core/errors/exceptions/unknown-export.exception.d.ts create mode 100644 lib/core/errors/exceptions/unknown-export.exception.js create mode 100644 lib/core/errors/exceptions/unknown-module.exception.d.ts create mode 100644 lib/core/errors/exceptions/unknown-module.exception.js create mode 100644 lib/core/errors/exceptions/unknown-request-mapping.exception.d.ts create mode 100644 lib/core/errors/exceptions/unknown-request-mapping.exception.js create mode 100644 lib/core/errors/messages.d.ts create mode 100644 lib/core/errors/messages.js create mode 100644 lib/core/exceptions/base-exception-filter-context.d.ts create mode 100644 lib/core/exceptions/base-exception-filter-context.js create mode 100644 lib/core/exceptions/exceptions-handler.d.ts create mode 100644 lib/core/exceptions/exceptions-handler.js create mode 100644 lib/core/guards/constants.d.ts create mode 100644 lib/core/guards/constants.js create mode 100644 lib/core/guards/guards-consumer.d.ts create mode 100644 lib/core/guards/guards-consumer.js create mode 100644 lib/core/guards/guards-context-creator.d.ts create mode 100644 lib/core/guards/guards-context-creator.js create mode 100644 lib/core/helpers/context-creator.d.ts create mode 100644 lib/core/helpers/context-creator.js create mode 100644 lib/core/helpers/execution-context.host.d.ts create mode 100644 lib/core/helpers/execution-context.host.js create mode 100644 lib/core/helpers/external-context-creator.d.ts create mode 100644 lib/core/helpers/external-context-creator.js create mode 100644 lib/core/helpers/messages.d.ts create mode 100644 lib/core/helpers/messages.js create mode 100644 lib/core/helpers/router-method-factory.d.ts create mode 100644 lib/core/helpers/router-method-factory.js create mode 100644 lib/core/index.d.ts create mode 100644 lib/core/index.js create mode 100644 lib/core/injector/container.d.ts create mode 100644 lib/core/injector/container.js create mode 100644 lib/core/injector/index.d.ts create mode 100644 lib/core/injector/index.js create mode 100644 lib/core/injector/injector.d.ts create mode 100644 lib/core/injector/injector.js create mode 100644 lib/core/injector/instance-loader.d.ts create mode 100644 lib/core/injector/instance-loader.js create mode 100644 lib/core/injector/module-ref.d.ts create mode 100644 lib/core/injector/module-ref.js create mode 100644 lib/core/injector/module-token-factory.d.ts create mode 100644 lib/core/injector/module-token-factory.js create mode 100644 lib/core/injector/module.d.ts create mode 100644 lib/core/injector/module.js create mode 100644 lib/core/injector/modules-container.d.ts create mode 100644 lib/core/injector/modules-container.js create mode 100644 lib/core/injector/tokens.d.ts create mode 100644 lib/core/injector/tokens.js create mode 100644 lib/core/interceptors/interceptors-consumer.d.ts create mode 100644 lib/core/interceptors/interceptors-consumer.js create mode 100644 lib/core/interceptors/interceptors-context-creator.d.ts create mode 100644 lib/core/interceptors/interceptors-context-creator.js create mode 100644 lib/core/metadata-scanner.d.ts create mode 100644 lib/core/metadata-scanner.js create mode 100644 lib/core/middlewares/builder.d.ts create mode 100644 lib/core/middlewares/builder.js create mode 100644 lib/core/middlewares/container.d.ts create mode 100644 lib/core/middlewares/container.js create mode 100644 lib/core/middlewares/middlewares-module.d.ts create mode 100644 lib/core/middlewares/middlewares-module.js create mode 100644 lib/core/middlewares/resolver.d.ts create mode 100644 lib/core/middlewares/resolver.js create mode 100644 lib/core/middlewares/routes-mapper.d.ts create mode 100644 lib/core/middlewares/routes-mapper.js create mode 100644 lib/core/middlewares/utils.d.ts create mode 100644 lib/core/middlewares/utils.js create mode 100644 lib/core/nest-application-context.d.ts create mode 100644 lib/core/nest-application-context.js create mode 100644 lib/core/nest-application.d.ts create mode 100644 lib/core/nest-application.js create mode 100644 lib/core/nest-factory.d.ts create mode 100644 lib/core/nest-factory.js create mode 100644 lib/core/pipes/params-token-factory.d.ts create mode 100644 lib/core/pipes/params-token-factory.js create mode 100644 lib/core/pipes/pipes-consumer.d.ts create mode 100644 lib/core/pipes/pipes-consumer.js create mode 100644 lib/core/pipes/pipes-context-creator.d.ts create mode 100644 lib/core/pipes/pipes-context-creator.js create mode 100644 lib/core/router/interfaces/exceptions-filter.interface.d.ts create mode 100644 lib/core/router/interfaces/exceptions-filter.interface.js create mode 100644 lib/core/router/interfaces/resolver.interface.d.ts create mode 100644 lib/core/router/interfaces/resolver.interface.js create mode 100644 lib/core/router/interfaces/route-params-factory.interface.d.ts create mode 100644 lib/core/router/interfaces/route-params-factory.interface.js create mode 100644 lib/core/router/route-params-factory.d.ts create mode 100644 lib/core/router/route-params-factory.js create mode 100644 lib/core/router/router-exception-filters.d.ts create mode 100644 lib/core/router/router-exception-filters.js create mode 100644 lib/core/router/router-execution-context.d.ts create mode 100644 lib/core/router/router-execution-context.js create mode 100644 lib/core/router/router-explorer.d.ts create mode 100644 lib/core/router/router-explorer.js create mode 100644 lib/core/router/router-proxy.d.ts create mode 100644 lib/core/router/router-proxy.js create mode 100644 lib/core/router/router-response-controller.d.ts create mode 100644 lib/core/router/router-response-controller.js create mode 100644 lib/core/router/routes-resolver.d.ts create mode 100644 lib/core/router/routes-resolver.js create mode 100644 lib/core/scanner.d.ts create mode 100644 lib/core/scanner.js create mode 100644 lib/core/services/reflector.service.d.ts create mode 100644 lib/core/services/reflector.service.js create mode 100644 lib/microservices/client/client-grpc.d.ts create mode 100644 lib/microservices/client/client-grpc.js create mode 100644 lib/microservices/client/client-mqtt.d.ts create mode 100644 lib/microservices/client/client-mqtt.js create mode 100644 lib/microservices/client/client-nats.d.ts create mode 100644 lib/microservices/client/client-nats.js create mode 100644 lib/microservices/client/client-proxy-factory.d.ts create mode 100644 lib/microservices/client/client-proxy-factory.js create mode 100644 lib/microservices/client/client-proxy.d.ts create mode 100644 lib/microservices/client/client-proxy.js create mode 100644 lib/microservices/client/client-redis.d.ts create mode 100644 lib/microservices/client/client-redis.js create mode 100644 lib/microservices/client/client-tcp.d.ts create mode 100644 lib/microservices/client/client-tcp.js create mode 100644 lib/microservices/client/index.d.ts create mode 100644 lib/microservices/client/index.js create mode 100644 lib/microservices/constants.d.ts create mode 100644 lib/microservices/constants.js create mode 100644 lib/microservices/container.d.ts create mode 100644 lib/microservices/container.js create mode 100644 lib/microservices/context/exception-filters-context.d.ts create mode 100644 lib/microservices/context/exception-filters-context.js create mode 100644 lib/microservices/context/rpc-context-creator.d.ts create mode 100644 lib/microservices/context/rpc-context-creator.js create mode 100644 lib/microservices/context/rpc-proxy.d.ts create mode 100644 lib/microservices/context/rpc-proxy.js create mode 100644 lib/microservices/enums/index.d.ts create mode 100644 lib/microservices/enums/index.js create mode 100644 lib/microservices/enums/transport.enum.d.ts create mode 100644 lib/microservices/enums/transport.enum.js create mode 100644 lib/microservices/exceptions/index.d.ts create mode 100644 lib/microservices/exceptions/index.js create mode 100644 lib/microservices/exceptions/invalid-grpc-package.exception.d.ts create mode 100644 lib/microservices/exceptions/invalid-grpc-package.exception.js create mode 100644 lib/microservices/exceptions/invalid-grpc-service.exception.d.ts create mode 100644 lib/microservices/exceptions/invalid-grpc-service.exception.js create mode 100644 lib/microservices/exceptions/invalid-message.exception.d.ts create mode 100644 lib/microservices/exceptions/invalid-message.exception.js create mode 100644 lib/microservices/exceptions/invalid-proto-definition.exception.d.ts create mode 100644 lib/microservices/exceptions/invalid-proto-definition.exception.js create mode 100644 lib/microservices/exceptions/rpc-exception.d.ts create mode 100644 lib/microservices/exceptions/rpc-exception.js create mode 100644 lib/microservices/exceptions/rpc-exceptions-handler.d.ts create mode 100644 lib/microservices/exceptions/rpc-exceptions-handler.js create mode 100644 lib/microservices/index.d.ts create mode 100644 lib/microservices/index.js create mode 100644 lib/microservices/interfaces/client-grpc.interface.d.ts create mode 100644 lib/microservices/interfaces/client-grpc.interface.js create mode 100644 lib/microservices/interfaces/client-metadata.interface.d.ts create mode 100644 lib/microservices/interfaces/client-metadata.interface.js create mode 100644 lib/microservices/interfaces/closeable.interface.d.ts create mode 100644 lib/microservices/interfaces/closeable.interface.js create mode 100644 lib/microservices/interfaces/custom-transport-strategy.interface.d.ts create mode 100644 lib/microservices/interfaces/custom-transport-strategy.interface.js create mode 100644 lib/microservices/interfaces/index.d.ts create mode 100644 lib/microservices/interfaces/index.js create mode 100644 lib/microservices/interfaces/message-handlers.interface.d.ts create mode 100644 lib/microservices/interfaces/message-handlers.interface.js create mode 100644 lib/microservices/interfaces/microservice-configuration.interface.d.ts create mode 100644 lib/microservices/interfaces/microservice-configuration.interface.js create mode 100644 lib/microservices/interfaces/packet.interface.d.ts create mode 100644 lib/microservices/interfaces/packet.interface.js create mode 100644 lib/microservices/interfaces/pattern-metadata.interface.d.ts create mode 100644 lib/microservices/interfaces/pattern-metadata.interface.js create mode 100644 lib/microservices/listener-metadata-explorer.d.ts create mode 100644 lib/microservices/listener-metadata-explorer.js create mode 100644 lib/microservices/listeners-controller.d.ts create mode 100644 lib/microservices/listeners-controller.js create mode 100644 lib/microservices/microservices-module.d.ts create mode 100644 lib/microservices/microservices-module.js create mode 100644 lib/microservices/nest-microservice.d.ts create mode 100644 lib/microservices/nest-microservice.js create mode 100644 lib/microservices/server/index.d.ts create mode 100644 lib/microservices/server/index.js create mode 100644 lib/microservices/server/server-factory.d.ts create mode 100644 lib/microservices/server/server-factory.js create mode 100644 lib/microservices/server/server-grpc.d.ts create mode 100644 lib/microservices/server/server-grpc.js create mode 100644 lib/microservices/server/server-mqtt.d.ts create mode 100644 lib/microservices/server/server-mqtt.js create mode 100644 lib/microservices/server/server-nats.d.ts create mode 100644 lib/microservices/server/server-nats.js create mode 100644 lib/microservices/server/server-redis.d.ts create mode 100644 lib/microservices/server/server-redis.js create mode 100644 lib/microservices/server/server-tcp.d.ts create mode 100644 lib/microservices/server/server-tcp.js create mode 100644 lib/microservices/server/server.d.ts create mode 100644 lib/microservices/server/server.js create mode 100644 lib/microservices/utils/client.decorator.d.ts create mode 100644 lib/microservices/utils/client.decorator.js create mode 100644 lib/microservices/utils/index.d.ts create mode 100644 lib/microservices/utils/index.js create mode 100644 lib/microservices/utils/pattern.decorator.d.ts create mode 100644 lib/microservices/utils/pattern.decorator.js create mode 100644 lib/testing/index.d.ts create mode 100644 lib/testing/index.js create mode 100644 lib/testing/interfaces/index.d.ts create mode 100644 lib/testing/interfaces/index.js create mode 100644 lib/testing/interfaces/override-by-factory-options.interface.d.ts create mode 100644 lib/testing/interfaces/override-by-factory-options.interface.js create mode 100644 lib/testing/interfaces/override-by.interface.d.ts create mode 100644 lib/testing/interfaces/override-by.interface.js create mode 100644 lib/testing/test.d.ts create mode 100644 lib/testing/test.js create mode 100644 lib/testing/testing-module.builder.d.ts create mode 100644 lib/testing/testing-module.builder.js create mode 100644 lib/testing/testing-module.d.ts create mode 100644 lib/testing/testing-module.js create mode 100644 lib/websockets/adapters/index.d.ts create mode 100644 lib/websockets/adapters/index.js create mode 100644 lib/websockets/adapters/io-adapter.d.ts create mode 100644 lib/websockets/adapters/io-adapter.js create mode 100644 lib/websockets/adapters/ws-adapter.d.ts create mode 100644 lib/websockets/adapters/ws-adapter.js create mode 100644 lib/websockets/constants.d.ts create mode 100644 lib/websockets/constants.js create mode 100644 lib/websockets/container.d.ts create mode 100644 lib/websockets/container.js create mode 100644 lib/websockets/context/exception-filters-context.d.ts create mode 100644 lib/websockets/context/exception-filters-context.js create mode 100644 lib/websockets/context/ws-context-creator.d.ts create mode 100644 lib/websockets/context/ws-context-creator.js create mode 100644 lib/websockets/context/ws-proxy.d.ts create mode 100644 lib/websockets/context/ws-proxy.js create mode 100644 lib/websockets/exceptions/invalid-socket-port.exception.d.ts create mode 100644 lib/websockets/exceptions/invalid-socket-port.exception.js create mode 100644 lib/websockets/exceptions/ws-exception.d.ts create mode 100644 lib/websockets/exceptions/ws-exception.js create mode 100644 lib/websockets/exceptions/ws-exceptions-handler.d.ts create mode 100644 lib/websockets/exceptions/ws-exceptions-handler.js create mode 100644 lib/websockets/gateway-metadata-explorer.d.ts create mode 100644 lib/websockets/gateway-metadata-explorer.js create mode 100644 lib/websockets/index.d.ts create mode 100644 lib/websockets/index.js create mode 100644 lib/websockets/interfaces/gateway-metadata.interface.d.ts create mode 100644 lib/websockets/interfaces/gateway-metadata.interface.js create mode 100644 lib/websockets/interfaces/gateway-middleware.interface.d.ts create mode 100644 lib/websockets/interfaces/gateway-middleware.interface.js create mode 100644 lib/websockets/interfaces/index.d.ts create mode 100644 lib/websockets/interfaces/index.js create mode 100644 lib/websockets/interfaces/nest-gateway.interface.d.ts create mode 100644 lib/websockets/interfaces/nest-gateway.interface.js create mode 100644 lib/websockets/interfaces/observable-socket-server.interface.d.ts create mode 100644 lib/websockets/interfaces/observable-socket-server.interface.js create mode 100644 lib/websockets/interfaces/on-gateway-connection.interface.d.ts create mode 100644 lib/websockets/interfaces/on-gateway-connection.interface.js create mode 100644 lib/websockets/interfaces/on-gateway-disconnect.interface.d.ts create mode 100644 lib/websockets/interfaces/on-gateway-disconnect.interface.js create mode 100644 lib/websockets/interfaces/on-gateway-init.interface.d.ts create mode 100644 lib/websockets/interfaces/on-gateway-init.interface.js create mode 100644 lib/websockets/interfaces/web-socket-server.interface.d.ts create mode 100644 lib/websockets/interfaces/web-socket-server.interface.js create mode 100644 lib/websockets/interfaces/ws-response.interface.d.ts create mode 100644 lib/websockets/interfaces/ws-response.interface.js create mode 100644 lib/websockets/middlewares-injector.d.ts create mode 100644 lib/websockets/middlewares-injector.js create mode 100644 lib/websockets/observable-socket.d.ts create mode 100644 lib/websockets/observable-socket.js create mode 100644 lib/websockets/socket-module.d.ts create mode 100644 lib/websockets/socket-module.js create mode 100644 lib/websockets/socket-server-provider.d.ts create mode 100644 lib/websockets/socket-server-provider.js create mode 100644 lib/websockets/utils/gateway-server.decorator.d.ts create mode 100644 lib/websockets/utils/gateway-server.decorator.js create mode 100644 lib/websockets/utils/index.d.ts create mode 100644 lib/websockets/utils/index.js create mode 100644 lib/websockets/utils/socket-gateway.decorator.d.ts create mode 100644 lib/websockets/utils/socket-gateway.decorator.js create mode 100644 lib/websockets/utils/subscribe-message.decorator.d.ts create mode 100644 lib/websockets/utils/subscribe-message.decorator.js create mode 100644 lib/websockets/web-sockets-controller.d.ts create mode 100644 lib/websockets/web-sockets-controller.js create mode 100644 packages/core/errors/exceptions/unknown-element.exception.ts create mode 100644 sample/18-context/.gitignore create mode 100644 sample/18-context/package.json create mode 100644 sample/18-context/src/app.controller.ts create mode 100644 sample/18-context/src/app.module.ts create mode 100644 sample/18-context/src/app.service.ts create mode 100644 sample/18-context/src/main.ts create mode 100644 sample/18-context/tsconfig.json create mode 100644 sample/18-context/tslint.json create mode 100644 sample/18-context/yarn.lock diff --git a/lib/common/constants.d.ts b/lib/common/constants.d.ts new file mode 100644 index 000000000..e35feb653 --- /dev/null +++ b/lib/common/constants.d.ts @@ -0,0 +1,25 @@ +export declare const metadata: { + MODULES: string; + IMPORTS: string; + COMPONENTS: string; + PROVIDERS: string; + CONTROLLERS: string; + EXPORTS: string; +}; +export declare const SHARED_MODULE_METADATA = '__sharedModule__'; +export declare const GLOBAL_MODULE_METADATA = '__globalModule__'; +export declare const PATH_METADATA = 'path'; +export declare const PARAMTYPES_METADATA = 'design:paramtypes'; +export declare const SELF_DECLARED_DEPS_METADATA = 'self:paramtypes'; +export declare const METHOD_METADATA = 'method'; +export declare const ROUTE_ARGS_METADATA = '__routeArguments__'; +export declare const CUSTOM_ROUTE_AGRS_METADATA = '__customRouteArgs__'; +export declare const EXCEPTION_FILTERS_METADATA = '__exceptionFilters__'; +export declare const FILTER_CATCH_EXCEPTIONS = '__filterCatchExceptions__'; +export declare const PIPES_METADATA = '__pipes__'; +export declare const GUARDS_METADATA = '__guards__'; +export declare const RENDER_METADATA = '__renderTemplate__'; +export declare const INTERCEPTORS_METADATA = '__interceptors__'; +export declare const HTTP_CODE_METADATA = '__httpCode__'; +export declare const GATEWAY_MIDDLEWARES = '__gatewayMiddlewares'; +export declare const MODULE_PATH = '__module_path__'; diff --git a/lib/common/constants.js b/lib/common/constants.js new file mode 100644 index 000000000..77008c70f --- /dev/null +++ b/lib/common/constants.js @@ -0,0 +1,27 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.metadata = { + MODULES: 'modules', + IMPORTS: 'imports', + COMPONENTS: 'components', + PROVIDERS: 'providers', + CONTROLLERS: 'controllers', + EXPORTS: 'exports', +}; +exports.SHARED_MODULE_METADATA = '__sharedModule__'; +exports.GLOBAL_MODULE_METADATA = '__globalModule__'; +exports.PATH_METADATA = 'path'; +exports.PARAMTYPES_METADATA = 'design:paramtypes'; +exports.SELF_DECLARED_DEPS_METADATA = 'self:paramtypes'; +exports.METHOD_METADATA = 'method'; +exports.ROUTE_ARGS_METADATA = '__routeArguments__'; +exports.CUSTOM_ROUTE_AGRS_METADATA = '__customRouteArgs__'; +exports.EXCEPTION_FILTERS_METADATA = '__exceptionFilters__'; +exports.FILTER_CATCH_EXCEPTIONS = '__filterCatchExceptions__'; +exports.PIPES_METADATA = '__pipes__'; +exports.GUARDS_METADATA = '__guards__'; +exports.RENDER_METADATA = '__renderTemplate__'; +exports.INTERCEPTORS_METADATA = '__interceptors__'; +exports.HTTP_CODE_METADATA = '__httpCode__'; +exports.GATEWAY_MIDDLEWARES = '__gatewayMiddlewares'; +exports.MODULE_PATH = '__module_path__'; diff --git a/lib/common/decorators/core/bind.decorator.d.ts b/lib/common/decorators/core/bind.decorator.d.ts new file mode 100644 index 000000000..2f7288280 --- /dev/null +++ b/lib/common/decorators/core/bind.decorator.d.ts @@ -0,0 +1,8 @@ +/** + * Binds parameters decorators to the particular method + * Useful when the language doesn't provide a 'Parameter Decorators' feature (vanilla JavaScript) + * @param {} ...decorators + */ +export declare function Bind( + ...decorators: any[] +): (target: object, key: any, descriptor: any) => any; diff --git a/lib/common/decorators/core/bind.decorator.js b/lib/common/decorators/core/bind.decorator.js new file mode 100644 index 000000000..e32bb3cc9 --- /dev/null +++ b/lib/common/decorators/core/bind.decorator.js @@ -0,0 +1,14 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +/** + * Binds parameters decorators to the particular method + * Useful when the language doesn't provide a 'Parameter Decorators' feature (vanilla JavaScript) + * @param {} ...decorators + */ +function Bind(...decorators) { + return (target, key, descriptor) => { + decorators.forEach((fn, index) => fn(target, key, index)); + return descriptor; + }; +} +exports.Bind = Bind; diff --git a/lib/common/decorators/core/catch.decorator.d.ts b/lib/common/decorators/core/catch.decorator.d.ts new file mode 100644 index 000000000..6e219e6a0 --- /dev/null +++ b/lib/common/decorators/core/catch.decorator.d.ts @@ -0,0 +1,6 @@ +import 'reflect-metadata'; +/** + * Defines the Exceptions Filter. Takes set of exception types as an argument which has to be caught by this Filter. + * The class should implement the `ExceptionFilter` interface. + */ +export declare function Catch(...exceptions: any[]): ClassDecorator; diff --git a/lib/common/decorators/core/catch.decorator.js b/lib/common/decorators/core/catch.decorator.js new file mode 100644 index 000000000..a4016f6af --- /dev/null +++ b/lib/common/decorators/core/catch.decorator.js @@ -0,0 +1,14 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +require("reflect-metadata"); +const constants_1 = require("../../constants"); +/** + * Defines the Exceptions Filter. Takes set of exception types as an argument which has to be caught by this Filter. + * The class should implement the `ExceptionFilter` interface. + */ +function Catch(...exceptions) { + return (target) => { + Reflect.defineMetadata(constants_1.FILTER_CATCH_EXCEPTIONS, exceptions, target); + }; +} +exports.Catch = Catch; diff --git a/lib/common/decorators/core/component.decorator.d.ts b/lib/common/decorators/core/component.decorator.d.ts new file mode 100644 index 000000000..929c86dc9 --- /dev/null +++ b/lib/common/decorators/core/component.decorator.d.ts @@ -0,0 +1,27 @@ +/** + * Defines the injectable class. This class can inject dependencies through constructor. + * Those dependencies have to belong to the same module. + */ +export declare function Injectable(): ClassDecorator; +/** + * Defines the Component. The component can inject dependencies through constructor. + * Those dependencies have to belong to the same module. + */ +export declare function Component(): ClassDecorator; +/** + * Defines the Pipe. The Pipe should implement the `PipeTransform` interface. + */ +export declare function Pipe(): ClassDecorator; +/** + * Defines the Guard. The Guard should implement the `CanActivate` interface. + */ +export declare function Guard(): ClassDecorator; +/** + * Defines the Middleware. The Middleware should implement the `NestMiddleware` interface. + */ +export declare function Middleware(): ClassDecorator; +/** + * Defines the Interceptor. The Interceptor should implement `HttpInterceptor`, `RpcInterceptor` or `WsInterceptor` interface. + */ +export declare function Interceptor(): ClassDecorator; +export declare function mixin(mixinClass: any): any; diff --git a/lib/common/decorators/core/component.decorator.js b/lib/common/decorators/core/component.decorator.js new file mode 100644 index 000000000..eb140a4da --- /dev/null +++ b/lib/common/decorators/core/component.decorator.js @@ -0,0 +1,60 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const deprecate = require("deprecate"); +/** + * Defines the injectable class. This class can inject dependencies through constructor. + * Those dependencies have to belong to the same module. + */ +function Injectable() { + return (target) => { }; +} +exports.Injectable = Injectable; +/** + * Defines the Component. The component can inject dependencies through constructor. + * Those dependencies have to belong to the same module. + */ +function Component() { + deprecate('The @Component() decorator is deprecated and will be removed within next major release. Use @Injectable() instead.'); + return (target) => { }; +} +exports.Component = Component; +/** + * Defines the Pipe. The Pipe should implement the `PipeTransform` interface. + */ +function Pipe() { + return (target) => { }; +} +exports.Pipe = Pipe; +/** + * Defines the Guard. The Guard should implement the `CanActivate` interface. + */ +function Guard() { + deprecate('The @Guard() decorator is deprecated and will be removed within next major release. Use @Injectable() instead.'); + return (target) => { }; +} +exports.Guard = Guard; +/** + * Defines the Middleware. The Middleware should implement the `NestMiddleware` interface. + */ +function Middleware() { + deprecate('The @Middleware() decorator is deprecated and will be removed within next major release. Use @Injectable() instead.'); + return (target) => { }; +} +exports.Middleware = Middleware; +/** + * Defines the Interceptor. The Interceptor should implement `HttpInterceptor`, `RpcInterceptor` or `WsInterceptor` interface. + */ +function Interceptor() { + deprecate('The @Interceptor() decorator is deprecated and will be removed within next major release. Use @Injectable() instead.'); + return (target) => { }; +} +exports.Interceptor = Interceptor; +function mixin(mixinClass) { + this.offset = this.offset ? ++this.offset : Math.random() * 100; + Object.defineProperty(mixinClass, 'name', { + value: JSON.stringify(this.offset), + }); + Injectable()(mixinClass); + return mixinClass; +} +exports.mixin = mixin; diff --git a/lib/common/decorators/core/controller.decorator.d.ts b/lib/common/decorators/core/controller.decorator.d.ts new file mode 100644 index 000000000..deee73052 --- /dev/null +++ b/lib/common/decorators/core/controller.decorator.d.ts @@ -0,0 +1,6 @@ +import 'reflect-metadata'; +/** + * Defines the Controller. The controller can inject dependencies through constructor. + * Those dependencies have to belong to the same module. + */ +export declare function Controller(prefix?: string): ClassDecorator; diff --git a/lib/common/decorators/core/controller.decorator.js b/lib/common/decorators/core/controller.decorator.js new file mode 100644 index 000000000..442f44221 --- /dev/null +++ b/lib/common/decorators/core/controller.decorator.js @@ -0,0 +1,16 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +require("reflect-metadata"); +const shared_utils_1 = require("../../utils/shared.utils"); +const constants_1 = require("../../constants"); +/** + * Defines the Controller. The controller can inject dependencies through constructor. + * Those dependencies have to belong to the same module. + */ +function Controller(prefix) { + const path = shared_utils_1.isUndefined(prefix) ? '/' : prefix; + return (target) => { + Reflect.defineMetadata(constants_1.PATH_METADATA, path, target); + }; +} +exports.Controller = Controller; diff --git a/lib/common/decorators/core/dependencies.decorator.d.ts b/lib/common/decorators/core/dependencies.decorator.d.ts new file mode 100644 index 000000000..7853027ea --- /dev/null +++ b/lib/common/decorators/core/dependencies.decorator.d.ts @@ -0,0 +1,3 @@ +import 'reflect-metadata'; +export declare function flatten(arr: any[]): any; +export declare const Dependencies: (...dependencies: any[]) => ClassDecorator; diff --git a/lib/common/decorators/core/dependencies.decorator.js b/lib/common/decorators/core/dependencies.decorator.js new file mode 100644 index 000000000..a7739cd81 --- /dev/null +++ b/lib/common/decorators/core/dependencies.decorator.js @@ -0,0 +1,16 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +require("reflect-metadata"); +const constants_1 = require("../../constants"); +function flatten(arr) { + const flat = [].concat(...arr); + return flat.some(Array.isArray) ? flatten(flat) : flat; +} +exports.flatten = flatten; +; +exports.Dependencies = (...dependencies) => { + const flattenDeps = flatten(dependencies); + return (target) => { + Reflect.defineMetadata(constants_1.PARAMTYPES_METADATA, flattenDeps, target); + }; +}; diff --git a/lib/common/decorators/core/exception-filters.decorator.d.ts b/lib/common/decorators/core/exception-filters.decorator.d.ts new file mode 100644 index 000000000..7b64dec1e --- /dev/null +++ b/lib/common/decorators/core/exception-filters.decorator.d.ts @@ -0,0 +1,15 @@ +import 'reflect-metadata'; +import { ExceptionFilter } from '../../index'; +/** + * Setups exception filters to the chosen context. + * When the `@UseFilters()` is used on the controller level: + * - Exception Filter will be set up to every handler (every method) + * + * When the `@UseFilters()` is used on the handle level: + * - Exception Filter will be set up only to specified method + * + * @param {ExceptionFilter[]} ...filters (instances) + */ +export declare const UseFilters: ( + ...filters: ExceptionFilter[] +) => (target: any, key?: any, descriptor?: any) => any; diff --git a/lib/common/decorators/core/exception-filters.decorator.js b/lib/common/decorators/core/exception-filters.decorator.js new file mode 100644 index 000000000..77d2c5634 --- /dev/null +++ b/lib/common/decorators/core/exception-filters.decorator.js @@ -0,0 +1,31 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +require("reflect-metadata"); +const constants_1 = require("../../constants"); +const extend_metadata_util_1 = require("../../utils/extend-metadata.util"); +const shared_utils_1 = require("../../utils/shared.utils"); +const validate_each_util_1 = require("../../utils/validate-each.util"); +const defineFiltersMetadata = (...filters) => { + return (target, key, descriptor) => { + const isFilterValid = (filter) => shared_utils_1.isFunction(filter.catch); + if (descriptor) { + validate_each_util_1.validateEach(target.constructor, filters, isFilterValid, '@UseFilters', 'filter'); + extend_metadata_util_1.extendArrayMetadata(constants_1.EXCEPTION_FILTERS_METADATA, filters, descriptor.value); + return descriptor; + } + validate_each_util_1.validateEach(target, filters, isFilterValid, '@UseFilters', 'filter'); + extend_metadata_util_1.extendArrayMetadata(constants_1.EXCEPTION_FILTERS_METADATA, filters, target); + return target; + }; +}; +/** + * Setups exception filters to the chosen context. + * When the `@UseFilters()` is used on the controller level: + * - Exception Filter will be set up to every handler (every method) + * + * When the `@UseFilters()` is used on the handle level: + * - Exception Filter will be set up only to specified method + * + * @param {ExceptionFilter[]} ...filters (instances) + */ +exports.UseFilters = (...filters) => defineFiltersMetadata(...filters); diff --git a/lib/common/decorators/core/index.d.ts b/lib/common/decorators/core/index.d.ts new file mode 100644 index 000000000..b40b25d66 --- /dev/null +++ b/lib/common/decorators/core/index.d.ts @@ -0,0 +1,11 @@ +export * from './controller.decorator'; +export * from './component.decorator'; +export * from './dependencies.decorator'; +export * from './inject.decorator'; +export * from './catch.decorator'; +export * from './exception-filters.decorator'; +export * from './use-pipes.decorator'; +export * from './use-guards.decorator'; +export * from './reflect-metadata.decorator'; +export * from './use-interceptors.decorator'; +export * from './bind.decorator'; diff --git a/lib/common/decorators/core/index.js b/lib/common/decorators/core/index.js new file mode 100644 index 000000000..6311a04fb --- /dev/null +++ b/lib/common/decorators/core/index.js @@ -0,0 +1,16 @@ +"use strict"; +function __export(m) { + for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p]; +} +Object.defineProperty(exports, "__esModule", { value: true }); +__export(require("./controller.decorator")); +__export(require("./component.decorator")); +__export(require("./dependencies.decorator")); +__export(require("./inject.decorator")); +__export(require("./catch.decorator")); +__export(require("./exception-filters.decorator")); +__export(require("./use-pipes.decorator")); +__export(require("./use-guards.decorator")); +__export(require("./reflect-metadata.decorator")); +__export(require("./use-interceptors.decorator")); +__export(require("./bind.decorator")); diff --git a/lib/common/decorators/core/inject.decorator.d.ts b/lib/common/decorators/core/inject.decorator.d.ts new file mode 100644 index 000000000..95ac77b44 --- /dev/null +++ b/lib/common/decorators/core/inject.decorator.d.ts @@ -0,0 +1,6 @@ +import 'reflect-metadata'; +/** + * Injects provider which has to be available in the current injector (module) scope. + * Providers are recognized by types or tokens. + */ +export declare function Inject(token: any): ParameterDecorator; diff --git a/lib/common/decorators/core/inject.decorator.js b/lib/common/decorators/core/inject.decorator.js new file mode 100644 index 000000000..5de9d466f --- /dev/null +++ b/lib/common/decorators/core/inject.decorator.js @@ -0,0 +1,18 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +require("reflect-metadata"); +const constants_1 = require("../../constants"); +const shared_utils_1 = require("../../utils/shared.utils"); +/** + * Injects provider which has to be available in the current injector (module) scope. + * Providers are recognized by types or tokens. + */ +function Inject(token) { + return (target, key, index) => { + const args = Reflect.getMetadata(constants_1.SELF_DECLARED_DEPS_METADATA, target) || []; + const type = shared_utils_1.isFunction(token) ? token.name : token; + args.push({ index, param: type }); + Reflect.defineMetadata(constants_1.SELF_DECLARED_DEPS_METADATA, args, target); + }; +} +exports.Inject = Inject; diff --git a/lib/common/decorators/core/reflect-metadata.decorator.d.ts b/lib/common/decorators/core/reflect-metadata.decorator.d.ts new file mode 100644 index 000000000..8de439ed0 --- /dev/null +++ b/lib/common/decorators/core/reflect-metadata.decorator.d.ts @@ -0,0 +1,8 @@ +/** + * Assigns the metadata to the class / function under specified `key`. + * This metadata can be reflected using `Reflector` class. + */ +export declare const ReflectMetadata: ( + metadataKey: any, + metadataValue: any, +) => (target: object, key?: any, descriptor?: any) => any; diff --git a/lib/common/decorators/core/reflect-metadata.decorator.js b/lib/common/decorators/core/reflect-metadata.decorator.js new file mode 100644 index 000000000..d952cd70b --- /dev/null +++ b/lib/common/decorators/core/reflect-metadata.decorator.js @@ -0,0 +1,14 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +/** + * Assigns the metadata to the class / function under specified `key`. + * This metadata can be reflected using `Reflector` class. + */ +exports.ReflectMetadata = (metadataKey, metadataValue) => (target, key, descriptor) => { + if (descriptor) { + Reflect.defineMetadata(metadataKey, metadataValue, descriptor.value); + return descriptor; + } + Reflect.defineMetadata(metadataKey, metadataValue, target); + return target; +}; diff --git a/lib/common/decorators/core/use-guards.decorator.d.ts b/lib/common/decorators/core/use-guards.decorator.d.ts new file mode 100644 index 000000000..cc424077b --- /dev/null +++ b/lib/common/decorators/core/use-guards.decorator.d.ts @@ -0,0 +1,13 @@ +/** + * Binds guards to the particular context. + * When the `@UseGuards()` is used on the controller level: + * - Guard will be register to each handler (every method) + * + * When the `@UseGuards()` is used on the handler level: + * - Guard will be registered only to specified method + * + * @param {} ...guards (types) + */ +export declare function UseGuards( + ...guards: any[] +): (target: any, key?: any, descriptor?: any) => any; diff --git a/lib/common/decorators/core/use-guards.decorator.js b/lib/common/decorators/core/use-guards.decorator.js new file mode 100644 index 000000000..1c613c415 --- /dev/null +++ b/lib/common/decorators/core/use-guards.decorator.js @@ -0,0 +1,29 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const constants_1 = require("../../constants"); +const extend_metadata_util_1 = require("../../utils/extend-metadata.util"); +const validate_each_util_1 = require("../../utils/validate-each.util"); +const shared_utils_1 = require("../../utils/shared.utils"); +/** + * Binds guards to the particular context. + * When the `@UseGuards()` is used on the controller level: + * - Guard will be register to each handler (every method) + * + * When the `@UseGuards()` is used on the handler level: + * - Guard will be registered only to specified method + * + * @param {} ...guards (types) + */ +function UseGuards(...guards) { + return (target, key, descriptor) => { + if (descriptor) { + validate_each_util_1.validateEach(target.constructor, guards, shared_utils_1.isFunction, '@UseGuards', 'guard'); + extend_metadata_util_1.extendArrayMetadata(constants_1.GUARDS_METADATA, guards, descriptor.value); + return descriptor; + } + validate_each_util_1.validateEach(target, guards, shared_utils_1.isFunction, '@UseGuards', 'guard'); + extend_metadata_util_1.extendArrayMetadata(constants_1.GUARDS_METADATA, guards, target); + return target; + }; +} +exports.UseGuards = UseGuards; diff --git a/lib/common/decorators/core/use-interceptors.decorator.d.ts b/lib/common/decorators/core/use-interceptors.decorator.d.ts new file mode 100644 index 000000000..aa736453f --- /dev/null +++ b/lib/common/decorators/core/use-interceptors.decorator.d.ts @@ -0,0 +1,13 @@ +/** + * Binds interceptors to the particular context. + * When the `@UseInterceptors()` is used on the controller level: + * - Interceptor will be register to each handler (every method) + * + * When the `@UseInterceptors()` is used on the handle level: + * - Interceptor will be registered only to specified method + * + * @param {} ...interceptors (types) + */ +export declare function UseInterceptors( + ...interceptors: any[] +): (target: any, key?: any, descriptor?: any) => any; diff --git a/lib/common/decorators/core/use-interceptors.decorator.js b/lib/common/decorators/core/use-interceptors.decorator.js new file mode 100644 index 000000000..b02b70f5b --- /dev/null +++ b/lib/common/decorators/core/use-interceptors.decorator.js @@ -0,0 +1,29 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const constants_1 = require("../../constants"); +const extend_metadata_util_1 = require("../../utils/extend-metadata.util"); +const shared_utils_1 = require("../../utils/shared.utils"); +const validate_each_util_1 = require("../../utils/validate-each.util"); +/** + * Binds interceptors to the particular context. + * When the `@UseInterceptors()` is used on the controller level: + * - Interceptor will be register to each handler (every method) + * + * When the `@UseInterceptors()` is used on the handle level: + * - Interceptor will be registered only to specified method + * + * @param {} ...interceptors (types) + */ +function UseInterceptors(...interceptors) { + return (target, key, descriptor) => { + if (descriptor) { + validate_each_util_1.validateEach(target.constructor, interceptors, shared_utils_1.isFunction, '@UseInterceptors', 'interceptor'); + extend_metadata_util_1.extendArrayMetadata(constants_1.INTERCEPTORS_METADATA, interceptors, descriptor.value); + return descriptor; + } + validate_each_util_1.validateEach(target, interceptors, shared_utils_1.isFunction, '@UseInterceptors', 'interceptor'); + extend_metadata_util_1.extendArrayMetadata(constants_1.INTERCEPTORS_METADATA, interceptors, target); + return target; + }; +} +exports.UseInterceptors = UseInterceptors; diff --git a/lib/common/decorators/core/use-pipes.decorator.d.ts b/lib/common/decorators/core/use-pipes.decorator.d.ts new file mode 100644 index 000000000..a30b45b65 --- /dev/null +++ b/lib/common/decorators/core/use-pipes.decorator.d.ts @@ -0,0 +1,14 @@ +import { PipeTransform } from '../../interfaces/index'; +/** + * Binds pipes to the particular context. + * When the `@UsePipes()` is used on the controller level: + * - Pipe will be register to each handler (every method) + * + * When the `@UsePipes()` is used on the handle level: + * - Pipe will be registered only to specified method + * + * @param {PipeTransform[]} ...pipes (instances) + */ +export declare function UsePipes( + ...pipes: PipeTransform[] +): (target: any, key?: any, descriptor?: any) => any; diff --git a/lib/common/decorators/core/use-pipes.decorator.js b/lib/common/decorators/core/use-pipes.decorator.js new file mode 100644 index 000000000..3cdc4ce11 --- /dev/null +++ b/lib/common/decorators/core/use-pipes.decorator.js @@ -0,0 +1,30 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const constants_1 = require("../../constants"); +const extend_metadata_util_1 = require("../../utils/extend-metadata.util"); +const validate_each_util_1 = require("../../utils/validate-each.util"); +const shared_utils_1 = require("../../utils/shared.utils"); +/** + * Binds pipes to the particular context. + * When the `@UsePipes()` is used on the controller level: + * - Pipe will be register to each handler (every method) + * + * When the `@UsePipes()` is used on the handle level: + * - Pipe will be registered only to specified method + * + * @param {PipeTransform[]} ...pipes (instances) + */ +function UsePipes(...pipes) { + return (target, key, descriptor) => { + const isPipeValid = (pipe) => shared_utils_1.isFunction(pipe.transform); + if (descriptor) { + validate_each_util_1.validateEach(target.constructor, pipes, isPipeValid, '@UsePipes', 'pipe'); + extend_metadata_util_1.extendArrayMetadata(constants_1.PIPES_METADATA, pipes, descriptor.value); + return descriptor; + } + validate_each_util_1.validateEach(target, pipes, isPipeValid, '@UsePipes', 'pipe'); + extend_metadata_util_1.extendArrayMetadata(constants_1.PIPES_METADATA, pipes, target); + return target; + }; +} +exports.UsePipes = UsePipes; diff --git a/lib/common/decorators/http/create-route-param-metadata.decorator.d.ts b/lib/common/decorators/http/create-route-param-metadata.decorator.d.ts new file mode 100644 index 000000000..da0bc0d62 --- /dev/null +++ b/lib/common/decorators/http/create-route-param-metadata.decorator.d.ts @@ -0,0 +1,17 @@ +import { CustomParamFactory } from '../../interfaces/features/custom-route-param-factory.interface'; +import { PipeTransform } from '../../index'; +/** + * Creates HTTP route param decorator + * @param factory + */ +export declare function createParamDecorator( + factory: CustomParamFactory, +): (data?: any, ...pipes: PipeTransform[]) => ParameterDecorator; +/** + * Creates route params custom decorator + * @deprecated + * @param factory + */ +export declare function createRouteParamDecorator( + factory: CustomParamFactory, +): (data?: any, ...pipes: PipeTransform[]) => ParameterDecorator; diff --git a/lib/common/decorators/http/create-route-param-metadata.decorator.js b/lib/common/decorators/http/create-route-param-metadata.decorator.js new file mode 100644 index 000000000..3963df7f1 --- /dev/null +++ b/lib/common/decorators/http/create-route-param-metadata.decorator.js @@ -0,0 +1,35 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const deprecate = require("deprecate"); +const constants_1 = require("../../constants"); +const assignCustomMetadata = (args, paramtype, index, factory, data, ...pipes) => (Object.assign({}, args, { [`${paramtype}${constants_1.CUSTOM_ROUTE_AGRS_METADATA}:${index}`]: { + index, + factory, + data, + pipes, + } })); +const randomString = () => Math.random() + .toString(36) + .substring(2, 15); +/** + * Creates HTTP route param decorator + * @param factory + */ +function createParamDecorator(factory) { + const paramtype = randomString() + randomString(); + return (data, ...pipes) => (target, key, index) => { + const args = Reflect.getMetadata(constants_1.ROUTE_ARGS_METADATA, target, key) || {}; + Reflect.defineMetadata(constants_1.ROUTE_ARGS_METADATA, assignCustomMetadata(args, paramtype, index, factory, data, ...pipes), target, key); + }; +} +exports.createParamDecorator = createParamDecorator; +/** + * Creates route params custom decorator + * @deprecated + * @param factory + */ +function createRouteParamDecorator(factory) { + deprecate('The "createRouteParamDecorator" function is deprecated and will be removed within next major release. Use "createParamDecorator" instead.'); + return createParamDecorator(factory); +} +exports.createRouteParamDecorator = createRouteParamDecorator; diff --git a/lib/common/decorators/http/http-code.decorator.d.ts b/lib/common/decorators/http/http-code.decorator.d.ts new file mode 100644 index 000000000..ceb78a5e8 --- /dev/null +++ b/lib/common/decorators/http/http-code.decorator.d.ts @@ -0,0 +1,7 @@ +/** + * Defines the HTTP response status code. + * It overrides default status code for the given request method. + * + * @param {number} statusCode + */ +export declare function HttpCode(statusCode: number): MethodDecorator; diff --git a/lib/common/decorators/http/http-code.decorator.js b/lib/common/decorators/http/http-code.decorator.js new file mode 100644 index 000000000..69519a162 --- /dev/null +++ b/lib/common/decorators/http/http-code.decorator.js @@ -0,0 +1,16 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const constants_1 = require("../../constants"); +/** + * Defines the HTTP response status code. + * It overrides default status code for the given request method. + * + * @param {number} statusCode + */ +function HttpCode(statusCode) { + return (target, key, descriptor) => { + Reflect.defineMetadata(constants_1.HTTP_CODE_METADATA, statusCode, descriptor.value); + return descriptor; + }; +} +exports.HttpCode = HttpCode; diff --git a/lib/common/decorators/http/index.d.ts b/lib/common/decorators/http/index.d.ts new file mode 100644 index 000000000..724410aca --- /dev/null +++ b/lib/common/decorators/http/index.d.ts @@ -0,0 +1,5 @@ +export * from './request-mapping.decorator'; +export * from './route-params.decorator'; +export * from './http-code.decorator'; +export * from './create-route-param-metadata.decorator'; +export * from './render.decorator'; diff --git a/lib/common/decorators/http/index.js b/lib/common/decorators/http/index.js new file mode 100644 index 000000000..1db46248f --- /dev/null +++ b/lib/common/decorators/http/index.js @@ -0,0 +1,10 @@ +"use strict"; +function __export(m) { + for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p]; +} +Object.defineProperty(exports, "__esModule", { value: true }); +__export(require("./request-mapping.decorator")); +__export(require("./route-params.decorator")); +__export(require("./http-code.decorator")); +__export(require("./create-route-param-metadata.decorator")); +__export(require("./render.decorator")); diff --git a/lib/common/decorators/http/render.decorator.d.ts b/lib/common/decorators/http/render.decorator.d.ts new file mode 100644 index 000000000..02c54b711 --- /dev/null +++ b/lib/common/decorators/http/render.decorator.d.ts @@ -0,0 +1,5 @@ +import 'reflect-metadata'; +/** + * Defines a template to be rendered by the controller. + */ +export declare function Render(template: string): MethodDecorator; diff --git a/lib/common/decorators/http/render.decorator.js b/lib/common/decorators/http/render.decorator.js new file mode 100644 index 000000000..1a62fce4a --- /dev/null +++ b/lib/common/decorators/http/render.decorator.js @@ -0,0 +1,14 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +require("reflect-metadata"); +const constants_1 = require("../../constants"); +/** + * Defines a template to be rendered by the controller. + */ +function Render(template) { + return (target, key, descriptor) => { + Reflect.defineMetadata(constants_1.RENDER_METADATA, template, descriptor.value); + return descriptor; + }; +} +exports.Render = Render; diff --git a/lib/common/decorators/http/request-mapping.decorator.d.ts b/lib/common/decorators/http/request-mapping.decorator.d.ts new file mode 100644 index 000000000..64f72ff8d --- /dev/null +++ b/lib/common/decorators/http/request-mapping.decorator.d.ts @@ -0,0 +1,37 @@ +import 'reflect-metadata'; +import { RequestMappingMetadata } from '../../interfaces/request-mapping-metadata.interface'; +export declare const RequestMapping: ( + metadata?: RequestMappingMetadata, +) => MethodDecorator; +/** + * Routes HTTP POST requests to the specified path. + */ +export declare const Post: (path?: string) => MethodDecorator; +/** + * Routes HTTP GET requests to the specified path. + */ +export declare const Get: (path?: string) => MethodDecorator; +/** + * Routes HTTP DELETE requests to the specified path. + */ +export declare const Delete: (path?: string) => MethodDecorator; +/** + * Routes HTTP PUT requests to the specified path. + */ +export declare const Put: (path?: string) => MethodDecorator; +/** + * Routes HTTP PATCH requests to the specified path. + */ +export declare const Patch: (path?: string) => MethodDecorator; +/** + * Routes HTTP OPTIONS requests to the specified path. + */ +export declare const Options: (path?: string) => MethodDecorator; +/** + * Routes HTTP HEAD requests to the specified path. + */ +export declare const Head: (path?: string) => MethodDecorator; +/** + * Routes all HTTP requests to the specified path. + */ +export declare const All: (path?: string) => MethodDecorator; diff --git a/lib/common/decorators/http/request-mapping.decorator.js b/lib/common/decorators/http/request-mapping.decorator.js new file mode 100644 index 000000000..45a9eedee --- /dev/null +++ b/lib/common/decorators/http/request-mapping.decorator.js @@ -0,0 +1,56 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +require("reflect-metadata"); +const request_method_enum_1 = require("../../enums/request-method.enum"); +const constants_1 = require("../../constants"); +const defaultMetadata = { + [constants_1.PATH_METADATA]: '/', + [constants_1.METHOD_METADATA]: request_method_enum_1.RequestMethod.GET, +}; +exports.RequestMapping = (metadata = defaultMetadata) => { + const path = metadata[constants_1.PATH_METADATA] || '/'; + const requestMethod = metadata[constants_1.METHOD_METADATA] || request_method_enum_1.RequestMethod.GET; + return (target, key, descriptor) => { + Reflect.defineMetadata(constants_1.PATH_METADATA, path, descriptor.value); + Reflect.defineMetadata(constants_1.METHOD_METADATA, requestMethod, descriptor.value); + return descriptor; + }; +}; +const createMappingDecorator = (method) => (path) => { + return exports.RequestMapping({ + [constants_1.PATH_METADATA]: path, + [constants_1.METHOD_METADATA]: method, + }); +}; +/** + * Routes HTTP POST requests to the specified path. + */ +exports.Post = createMappingDecorator(request_method_enum_1.RequestMethod.POST); +/** + * Routes HTTP GET requests to the specified path. + */ +exports.Get = createMappingDecorator(request_method_enum_1.RequestMethod.GET); +/** + * Routes HTTP DELETE requests to the specified path. + */ +exports.Delete = createMappingDecorator(request_method_enum_1.RequestMethod.DELETE); +/** + * Routes HTTP PUT requests to the specified path. + */ +exports.Put = createMappingDecorator(request_method_enum_1.RequestMethod.PUT); +/** + * Routes HTTP PATCH requests to the specified path. + */ +exports.Patch = createMappingDecorator(request_method_enum_1.RequestMethod.PATCH); +/** + * Routes HTTP OPTIONS requests to the specified path. + */ +exports.Options = createMappingDecorator(request_method_enum_1.RequestMethod.OPTIONS); +/** + * Routes HTTP HEAD requests to the specified path. + */ +exports.Head = createMappingDecorator(request_method_enum_1.RequestMethod.HEAD); +/** + * Routes all HTTP requests to the specified path. + */ +exports.All = createMappingDecorator(request_method_enum_1.RequestMethod.ALL); diff --git a/lib/common/decorators/http/route-params.decorator.d.ts b/lib/common/decorators/http/route-params.decorator.d.ts new file mode 100644 index 000000000..b4d202b4e --- /dev/null +++ b/lib/common/decorators/http/route-params.decorator.d.ts @@ -0,0 +1,36 @@ +import 'reflect-metadata'; +import { PipeTransform } from '../../index'; +export declare type ParamData = object | string | number; +export interface RouteParamsMetadata { + [prop: number]: { + index: number; + data?: ParamData; + }; +} +export declare const Request: () => ParameterDecorator; +export declare const Response: () => ParameterDecorator; +export declare const Next: () => ParameterDecorator; +export declare const Session: () => ParameterDecorator; +export declare const UploadedFile: () => ParameterDecorator; +export declare const UploadedFiles: () => ParameterDecorator; +export declare const Headers: (property?: string) => ParameterDecorator; +export declare function Query(): any; +export declare function Query(...pipes: PipeTransform[]): any; +export declare function Query( + property: string, + ...pipes: PipeTransform[] +): any; +export declare function Body(): any; +export declare function Body(...pipes: PipeTransform[]): any; +export declare function Body( + property: string, + ...pipes: PipeTransform[] +): any; +export declare function Param(): any; +export declare function Param(...pipes: PipeTransform[]): any; +export declare function Param( + property: string, + ...pipes: PipeTransform[] +): any; +export declare const Req: () => ParameterDecorator; +export declare const Res: () => ParameterDecorator; diff --git a/lib/common/decorators/http/route-params.decorator.js b/lib/common/decorators/http/route-params.decorator.js new file mode 100644 index 000000000..29899e4a5 --- /dev/null +++ b/lib/common/decorators/http/route-params.decorator.js @@ -0,0 +1,45 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +require("reflect-metadata"); +const constants_1 = require("../../constants"); +const route_paramtypes_enum_1 = require("../../enums/route-paramtypes.enum"); +const shared_utils_1 = require("../../utils/shared.utils"); +const assignMetadata = (args, paramtype, index, data, ...pipes) => (Object.assign({}, args, { [`${paramtype}:${index}`]: { + index, + data, + pipes, + } })); +const createRouteParamDecorator = (paramtype) => { + return (data) => (target, key, index) => { + const args = Reflect.getMetadata(constants_1.ROUTE_ARGS_METADATA, target, key) || {}; + Reflect.defineMetadata(constants_1.ROUTE_ARGS_METADATA, assignMetadata(args, paramtype, index, data), target, key); + }; +}; +const createPipesRouteParamDecorator = (paramtype) => (data, ...pipes) => (target, key, index) => { + const args = Reflect.getMetadata(constants_1.ROUTE_ARGS_METADATA, target, key) || {}; + const hasParamData = shared_utils_1.isNil(data) || shared_utils_1.isString(data); + const paramData = hasParamData ? data : undefined; + const paramPipes = hasParamData ? pipes : [data, ...pipes]; + Reflect.defineMetadata(constants_1.ROUTE_ARGS_METADATA, assignMetadata(args, paramtype, index, paramData, ...paramPipes), target, key); +}; +exports.Request = createRouteParamDecorator(route_paramtypes_enum_1.RouteParamtypes.REQUEST); +exports.Response = createRouteParamDecorator(route_paramtypes_enum_1.RouteParamtypes.RESPONSE); +exports.Next = createRouteParamDecorator(route_paramtypes_enum_1.RouteParamtypes.NEXT); +exports.Session = createRouteParamDecorator(route_paramtypes_enum_1.RouteParamtypes.SESSION); +exports.UploadedFile = createRouteParamDecorator(route_paramtypes_enum_1.RouteParamtypes.FILE); +exports.UploadedFiles = createRouteParamDecorator(route_paramtypes_enum_1.RouteParamtypes.FILES); +exports.Headers = createRouteParamDecorator(route_paramtypes_enum_1.RouteParamtypes.HEADERS); +function Query(property, ...pipes) { + return createPipesRouteParamDecorator(route_paramtypes_enum_1.RouteParamtypes.QUERY)(property, ...pipes); +} +exports.Query = Query; +function Body(property, ...pipes) { + return createPipesRouteParamDecorator(route_paramtypes_enum_1.RouteParamtypes.BODY)(property, ...pipes); +} +exports.Body = Body; +function Param(property, ...pipes) { + return createPipesRouteParamDecorator(route_paramtypes_enum_1.RouteParamtypes.PARAM)(property, ...pipes); +} +exports.Param = Param; +exports.Req = exports.Request; +exports.Res = exports.Response; diff --git a/lib/common/decorators/index.d.ts b/lib/common/decorators/index.d.ts new file mode 100644 index 000000000..20ab3a19c --- /dev/null +++ b/lib/common/decorators/index.d.ts @@ -0,0 +1,3 @@ +export * from './core'; +export * from './modules'; +export * from './http'; diff --git a/lib/common/decorators/index.js b/lib/common/decorators/index.js new file mode 100644 index 000000000..fe8dab6a5 --- /dev/null +++ b/lib/common/decorators/index.js @@ -0,0 +1,8 @@ +"use strict"; +function __export(m) { + for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p]; +} +Object.defineProperty(exports, "__esModule", { value: true }); +__export(require("./core")); +__export(require("./modules")); +__export(require("./http")); diff --git a/lib/common/decorators/modules/exceptions/constants.d.ts b/lib/common/decorators/modules/exceptions/constants.d.ts new file mode 100644 index 000000000..3aff18f8e --- /dev/null +++ b/lib/common/decorators/modules/exceptions/constants.d.ts @@ -0,0 +1 @@ +export declare const InvalidModuleConfigMessage: (property: string) => string; diff --git a/lib/common/decorators/modules/exceptions/constants.js b/lib/common/decorators/modules/exceptions/constants.js new file mode 100644 index 000000000..0f51c932e --- /dev/null +++ b/lib/common/decorators/modules/exceptions/constants.js @@ -0,0 +1,3 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.InvalidModuleConfigMessage = (property) => `Invalid property '${property}' in @Module() decorator.`; diff --git a/lib/common/decorators/modules/exceptions/invalid-module-config.exception.d.ts b/lib/common/decorators/modules/exceptions/invalid-module-config.exception.d.ts new file mode 100644 index 000000000..0d7dfbbf9 --- /dev/null +++ b/lib/common/decorators/modules/exceptions/invalid-module-config.exception.d.ts @@ -0,0 +1,3 @@ +export declare class InvalidModuleConfigException extends Error { + constructor(property: string); +} diff --git a/lib/common/decorators/modules/exceptions/invalid-module-config.exception.js b/lib/common/decorators/modules/exceptions/invalid-module-config.exception.js new file mode 100644 index 000000000..21bdd3848 --- /dev/null +++ b/lib/common/decorators/modules/exceptions/invalid-module-config.exception.js @@ -0,0 +1,9 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const constants_1 = require("./constants"); +class InvalidModuleConfigException extends Error { + constructor(property) { + super(constants_1.InvalidModuleConfigMessage(property)); + } +} +exports.InvalidModuleConfigException = InvalidModuleConfigException; diff --git a/lib/common/decorators/modules/global.decorator.d.ts b/lib/common/decorators/modules/global.decorator.d.ts new file mode 100644 index 000000000..895692221 --- /dev/null +++ b/lib/common/decorators/modules/global.decorator.d.ts @@ -0,0 +1,6 @@ +import 'reflect-metadata'; +/** + * Makes the module global-scoped. + * Once imported will be available for all existing modules. + */ +export declare function Global(): ClassDecorator; diff --git a/lib/common/decorators/modules/global.decorator.js b/lib/common/decorators/modules/global.decorator.js new file mode 100644 index 000000000..29ccb860d --- /dev/null +++ b/lib/common/decorators/modules/global.decorator.js @@ -0,0 +1,14 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +require("reflect-metadata"); +const constants_1 = require("../../constants"); +/** + * Makes the module global-scoped. + * Once imported will be available for all existing modules. + */ +function Global() { + return (target) => { + Reflect.defineMetadata(constants_1.GLOBAL_MODULE_METADATA, true, target); + }; +} +exports.Global = Global; diff --git a/lib/common/decorators/modules/index.d.ts b/lib/common/decorators/modules/index.d.ts new file mode 100644 index 000000000..7ab2a7e20 --- /dev/null +++ b/lib/common/decorators/modules/index.d.ts @@ -0,0 +1,3 @@ +export * from './module.decorator'; +export * from './single-scope.decorator'; +export * from './global.decorator'; diff --git a/lib/common/decorators/modules/index.js b/lib/common/decorators/modules/index.js new file mode 100644 index 000000000..435880034 --- /dev/null +++ b/lib/common/decorators/modules/index.js @@ -0,0 +1,8 @@ +"use strict"; +function __export(m) { + for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p]; +} +Object.defineProperty(exports, "__esModule", { value: true }); +__export(require("./module.decorator")); +__export(require("./single-scope.decorator")); +__export(require("./global.decorator")); diff --git a/lib/common/decorators/modules/module.decorator.d.ts b/lib/common/decorators/modules/module.decorator.d.ts new file mode 100644 index 000000000..2dffdb3b4 --- /dev/null +++ b/lib/common/decorators/modules/module.decorator.d.ts @@ -0,0 +1,13 @@ +import 'reflect-metadata'; +import { ModuleMetadata } from '../../interfaces/modules/module-metadata.interface'; +/** + * Defines the module + * - `imports` - the set of the 'imported' modules + * - `controllers` - the list of controllers (e.g. HTTP controllers) + * - `providers` - the list of providers that belong to this module. They can be injected between themselves. + * - `exports` - the set of components, which should be available for modules, which imports this module + * - `modules` - @deprecated the set of the 'imported' modules + * - `components` - @deprecated the list of components that belong to this module. They can be injected between themselves. + * @param obj {ModuleMetadata} Module metadata + */ +export declare function Module(obj: ModuleMetadata): ClassDecorator; diff --git a/lib/common/decorators/modules/module.decorator.js b/lib/common/decorators/modules/module.decorator.js new file mode 100644 index 000000000..ddd7e02be --- /dev/null +++ b/lib/common/decorators/modules/module.decorator.js @@ -0,0 +1,62 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +require("reflect-metadata"); +const deprecate = require("deprecate"); +const constants_1 = require("../../constants"); +const invalid_module_config_exception_1 = require("./exceptions/invalid-module-config.exception"); +const metadataKeys = [ + constants_1.metadata.MODULES, + constants_1.metadata.IMPORTS, + constants_1.metadata.EXPORTS, + constants_1.metadata.COMPONENTS, + constants_1.metadata.CONTROLLERS, + constants_1.metadata.PROVIDERS, +]; +const validateKeys = (keys) => { + const isKeyInvalid = key => metadataKeys.findIndex(k => k === key) < 0; + const validateKey = key => { + if (!isKeyInvalid(key)) { + return; + } + throw new invalid_module_config_exception_1.InvalidModuleConfigException(key); + }; + keys.forEach(validateKey); +}; +/** + * Defines the module + * - `imports` - the set of the 'imported' modules + * - `controllers` - the list of controllers (e.g. HTTP controllers) + * - `providers` - the list of providers that belong to this module. They can be injected between themselves. + * - `exports` - the set of components, which should be available for modules, which imports this module + * - `modules` - @deprecated the set of the 'imported' modules + * - `components` - @deprecated the list of components that belong to this module. They can be injected between themselves. + * @param obj {ModuleMetadata} Module metadata + */ +function Module(obj) { + const propsKeys = Object.keys(obj); + validateKeys(propsKeys); + showDeprecatedWarnings(obj); + overrideModuleMetadata(obj); + return (target) => { + for (const property in obj) { + if (obj.hasOwnProperty(property)) { + Reflect.defineMetadata(property, obj[property], target); + } + } + }; +} +exports.Module = Module; +function overrideModuleMetadata(metadata) { + metadata.modules = metadata.imports + ? metadata.imports + : metadata.modules; + metadata.components = metadata.providers + ? metadata.providers + : metadata.components; +} +function showDeprecatedWarnings(metadata) { + const modulesDeprecatedWarning = 'The "modules" key in the @Module() decorator is deprecated and will be removed within next major release. Use the "imports" key instead.'; + const componentsDeprecatetWarning = 'The "components" key in the @Module() decorator is deprecated and will be removed within next major release. Use the "providers" key instead.'; + metadata.modules && deprecate(modulesDeprecatedWarning); + metadata.components && deprecate(componentsDeprecatetWarning); +} diff --git a/lib/common/decorators/modules/single-scope.decorator.d.ts b/lib/common/decorators/modules/single-scope.decorator.d.ts new file mode 100644 index 000000000..25b68b4e1 --- /dev/null +++ b/lib/common/decorators/modules/single-scope.decorator.d.ts @@ -0,0 +1,6 @@ +import 'reflect-metadata'; +/** + * Makes the module single-scoped (not singleton). + * In this case, Nest will always create a new instance of this particular module when it's imported by another one. + */ +export declare function SingleScope(): ClassDecorator; diff --git a/lib/common/decorators/modules/single-scope.decorator.js b/lib/common/decorators/modules/single-scope.decorator.js new file mode 100644 index 000000000..1f6b2f2e4 --- /dev/null +++ b/lib/common/decorators/modules/single-scope.decorator.js @@ -0,0 +1,22 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +require("reflect-metadata"); +const constants_1 = require("../../constants"); +/** + * Makes the module single-scoped (not singleton). + * In this case, Nest will always create a new instance of this particular module when it's imported by another one. + */ +function SingleScope() { + return (target) => { + const Metatype = target; + const Type = class extends Metatype { + constructor(...args) { + super(...args); + } + }; + Reflect.defineMetadata(constants_1.SHARED_MODULE_METADATA, true, Type); + Object.defineProperty(Type, 'name', { value: target.name }); + return Type; + }; +} +exports.SingleScope = SingleScope; diff --git a/lib/common/enums/http-status.enum.d.ts b/lib/common/enums/http-status.enum.d.ts new file mode 100644 index 000000000..1560387ec --- /dev/null +++ b/lib/common/enums/http-status.enum.d.ts @@ -0,0 +1,46 @@ +export declare enum HttpStatus { + CONTINUE = 100, + SWITCHING_PROTOCOLS = 101, + PROCESSING = 102, + OK = 200, + CREATED = 201, + ACCEPTED = 202, + NON_AUTHORITATIVE_INFORMATION = 203, + NO_CONTENT = 204, + RESET_CONTENT = 205, + PARTIAL_CONTENT = 206, + AMBIGUOUS = 300, + MOVED_PERMANENTLY = 301, + FOUND = 302, + SEE_OTHER = 303, + NOT_MODIFIED = 304, + TEMPORARY_REDIRECT = 307, + PERMANENT_REDIRECT = 308, + BAD_REQUEST = 400, + UNAUTHORIZED = 401, + PAYMENT_REQUIRED = 402, + FORBIDDEN = 403, + NOT_FOUND = 404, + METHOD_NOT_ALLOWED = 405, + NOT_ACCEPTABLE = 406, + PROXY_AUTHENTICATION_REQUIRED = 407, + REQUEST_TIMEOUT = 408, + CONFLICT = 409, + GONE = 410, + LENGTH_REQUIRED = 411, + PRECONDITION_FAILED = 412, + PAYLOAD_TOO_LARGE = 413, + URI_TOO_LONG = 414, + UNSUPPORTED_MEDIA_TYPE = 415, + REQUESTED_RANGE_NOT_SATISFIABLE = 416, + EXPECTATION_FAILED = 417, + I_AM_A_TEAPOT = 418, + UNPROCESSABLE_ENTITY = 422, + TOO_MANY_REQUESTS = 429, + INTERNAL_SERVER_ERROR = 500, + NOT_IMPLEMENTED = 501, + BAD_GATEWAY = 502, + SERVICE_UNAVAILABLE = 503, + GATEWAY_TIMEOUT = 504, + HTTP_VERSION_NOT_SUPPORTED = 505, +} diff --git a/lib/common/enums/http-status.enum.js b/lib/common/enums/http-status.enum.js new file mode 100644 index 000000000..fd4f2e610 --- /dev/null +++ b/lib/common/enums/http-status.enum.js @@ -0,0 +1,49 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var HttpStatus; +(function (HttpStatus) { + HttpStatus[HttpStatus["CONTINUE"] = 100] = "CONTINUE"; + HttpStatus[HttpStatus["SWITCHING_PROTOCOLS"] = 101] = "SWITCHING_PROTOCOLS"; + HttpStatus[HttpStatus["PROCESSING"] = 102] = "PROCESSING"; + HttpStatus[HttpStatus["OK"] = 200] = "OK"; + HttpStatus[HttpStatus["CREATED"] = 201] = "CREATED"; + HttpStatus[HttpStatus["ACCEPTED"] = 202] = "ACCEPTED"; + HttpStatus[HttpStatus["NON_AUTHORITATIVE_INFORMATION"] = 203] = "NON_AUTHORITATIVE_INFORMATION"; + HttpStatus[HttpStatus["NO_CONTENT"] = 204] = "NO_CONTENT"; + HttpStatus[HttpStatus["RESET_CONTENT"] = 205] = "RESET_CONTENT"; + HttpStatus[HttpStatus["PARTIAL_CONTENT"] = 206] = "PARTIAL_CONTENT"; + HttpStatus[HttpStatus["AMBIGUOUS"] = 300] = "AMBIGUOUS"; + HttpStatus[HttpStatus["MOVED_PERMANENTLY"] = 301] = "MOVED_PERMANENTLY"; + HttpStatus[HttpStatus["FOUND"] = 302] = "FOUND"; + HttpStatus[HttpStatus["SEE_OTHER"] = 303] = "SEE_OTHER"; + HttpStatus[HttpStatus["NOT_MODIFIED"] = 304] = "NOT_MODIFIED"; + HttpStatus[HttpStatus["TEMPORARY_REDIRECT"] = 307] = "TEMPORARY_REDIRECT"; + HttpStatus[HttpStatus["PERMANENT_REDIRECT"] = 308] = "PERMANENT_REDIRECT"; + HttpStatus[HttpStatus["BAD_REQUEST"] = 400] = "BAD_REQUEST"; + HttpStatus[HttpStatus["UNAUTHORIZED"] = 401] = "UNAUTHORIZED"; + HttpStatus[HttpStatus["PAYMENT_REQUIRED"] = 402] = "PAYMENT_REQUIRED"; + HttpStatus[HttpStatus["FORBIDDEN"] = 403] = "FORBIDDEN"; + HttpStatus[HttpStatus["NOT_FOUND"] = 404] = "NOT_FOUND"; + HttpStatus[HttpStatus["METHOD_NOT_ALLOWED"] = 405] = "METHOD_NOT_ALLOWED"; + HttpStatus[HttpStatus["NOT_ACCEPTABLE"] = 406] = "NOT_ACCEPTABLE"; + HttpStatus[HttpStatus["PROXY_AUTHENTICATION_REQUIRED"] = 407] = "PROXY_AUTHENTICATION_REQUIRED"; + HttpStatus[HttpStatus["REQUEST_TIMEOUT"] = 408] = "REQUEST_TIMEOUT"; + HttpStatus[HttpStatus["CONFLICT"] = 409] = "CONFLICT"; + HttpStatus[HttpStatus["GONE"] = 410] = "GONE"; + HttpStatus[HttpStatus["LENGTH_REQUIRED"] = 411] = "LENGTH_REQUIRED"; + HttpStatus[HttpStatus["PRECONDITION_FAILED"] = 412] = "PRECONDITION_FAILED"; + HttpStatus[HttpStatus["PAYLOAD_TOO_LARGE"] = 413] = "PAYLOAD_TOO_LARGE"; + HttpStatus[HttpStatus["URI_TOO_LONG"] = 414] = "URI_TOO_LONG"; + HttpStatus[HttpStatus["UNSUPPORTED_MEDIA_TYPE"] = 415] = "UNSUPPORTED_MEDIA_TYPE"; + HttpStatus[HttpStatus["REQUESTED_RANGE_NOT_SATISFIABLE"] = 416] = "REQUESTED_RANGE_NOT_SATISFIABLE"; + HttpStatus[HttpStatus["EXPECTATION_FAILED"] = 417] = "EXPECTATION_FAILED"; + HttpStatus[HttpStatus["I_AM_A_TEAPOT"] = 418] = "I_AM_A_TEAPOT"; + HttpStatus[HttpStatus["UNPROCESSABLE_ENTITY"] = 422] = "UNPROCESSABLE_ENTITY"; + HttpStatus[HttpStatus["TOO_MANY_REQUESTS"] = 429] = "TOO_MANY_REQUESTS"; + HttpStatus[HttpStatus["INTERNAL_SERVER_ERROR"] = 500] = "INTERNAL_SERVER_ERROR"; + HttpStatus[HttpStatus["NOT_IMPLEMENTED"] = 501] = "NOT_IMPLEMENTED"; + HttpStatus[HttpStatus["BAD_GATEWAY"] = 502] = "BAD_GATEWAY"; + HttpStatus[HttpStatus["SERVICE_UNAVAILABLE"] = 503] = "SERVICE_UNAVAILABLE"; + HttpStatus[HttpStatus["GATEWAY_TIMEOUT"] = 504] = "GATEWAY_TIMEOUT"; + HttpStatus[HttpStatus["HTTP_VERSION_NOT_SUPPORTED"] = 505] = "HTTP_VERSION_NOT_SUPPORTED"; +})(HttpStatus = exports.HttpStatus || (exports.HttpStatus = {})); diff --git a/lib/common/enums/index.d.ts b/lib/common/enums/index.d.ts new file mode 100644 index 000000000..c17d8692b --- /dev/null +++ b/lib/common/enums/index.d.ts @@ -0,0 +1,2 @@ +export * from './request-method.enum'; +export * from './http-status.enum'; diff --git a/lib/common/enums/index.js b/lib/common/enums/index.js new file mode 100644 index 000000000..520eb0709 --- /dev/null +++ b/lib/common/enums/index.js @@ -0,0 +1,7 @@ +"use strict"; +function __export(m) { + for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p]; +} +Object.defineProperty(exports, "__esModule", { value: true }); +__export(require("./request-method.enum")); +__export(require("./http-status.enum")); diff --git a/lib/common/enums/nest-environment.enum.d.ts b/lib/common/enums/nest-environment.enum.d.ts new file mode 100644 index 000000000..f708d7bdb --- /dev/null +++ b/lib/common/enums/nest-environment.enum.d.ts @@ -0,0 +1,4 @@ +export declare enum NestEnvironment { + RUN = 0, + TEST = 1, +} diff --git a/lib/common/enums/nest-environment.enum.js b/lib/common/enums/nest-environment.enum.js new file mode 100644 index 000000000..31cda50e0 --- /dev/null +++ b/lib/common/enums/nest-environment.enum.js @@ -0,0 +1,7 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var NestEnvironment; +(function (NestEnvironment) { + NestEnvironment[NestEnvironment["RUN"] = 0] = "RUN"; + NestEnvironment[NestEnvironment["TEST"] = 1] = "TEST"; +})(NestEnvironment = exports.NestEnvironment || (exports.NestEnvironment = {})); diff --git a/lib/common/enums/request-method.enum.d.ts b/lib/common/enums/request-method.enum.d.ts new file mode 100644 index 000000000..3255181cd --- /dev/null +++ b/lib/common/enums/request-method.enum.d.ts @@ -0,0 +1,10 @@ +export declare enum RequestMethod { + GET = 0, + POST = 1, + PUT = 2, + DELETE = 3, + PATCH = 4, + ALL = 5, + OPTIONS = 6, + HEAD = 7, +} diff --git a/lib/common/enums/request-method.enum.js b/lib/common/enums/request-method.enum.js new file mode 100644 index 000000000..e95158511 --- /dev/null +++ b/lib/common/enums/request-method.enum.js @@ -0,0 +1,13 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var RequestMethod; +(function (RequestMethod) { + RequestMethod[RequestMethod["GET"] = 0] = "GET"; + RequestMethod[RequestMethod["POST"] = 1] = "POST"; + RequestMethod[RequestMethod["PUT"] = 2] = "PUT"; + RequestMethod[RequestMethod["DELETE"] = 3] = "DELETE"; + RequestMethod[RequestMethod["PATCH"] = 4] = "PATCH"; + RequestMethod[RequestMethod["ALL"] = 5] = "ALL"; + RequestMethod[RequestMethod["OPTIONS"] = 6] = "OPTIONS"; + RequestMethod[RequestMethod["HEAD"] = 7] = "HEAD"; +})(RequestMethod = exports.RequestMethod || (exports.RequestMethod = {})); diff --git a/lib/common/enums/route-paramtypes.enum.d.ts b/lib/common/enums/route-paramtypes.enum.d.ts new file mode 100644 index 000000000..4a7f51b28 --- /dev/null +++ b/lib/common/enums/route-paramtypes.enum.d.ts @@ -0,0 +1,12 @@ +export declare enum RouteParamtypes { + REQUEST = 0, + RESPONSE = 1, + NEXT = 2, + BODY = 3, + QUERY = 4, + PARAM = 5, + HEADERS = 6, + SESSION = 7, + FILE = 8, + FILES = 9, +} diff --git a/lib/common/enums/route-paramtypes.enum.js b/lib/common/enums/route-paramtypes.enum.js new file mode 100644 index 000000000..0aaecd8a7 --- /dev/null +++ b/lib/common/enums/route-paramtypes.enum.js @@ -0,0 +1,15 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var RouteParamtypes; +(function (RouteParamtypes) { + RouteParamtypes[RouteParamtypes["REQUEST"] = 0] = "REQUEST"; + RouteParamtypes[RouteParamtypes["RESPONSE"] = 1] = "RESPONSE"; + RouteParamtypes[RouteParamtypes["NEXT"] = 2] = "NEXT"; + RouteParamtypes[RouteParamtypes["BODY"] = 3] = "BODY"; + RouteParamtypes[RouteParamtypes["QUERY"] = 4] = "QUERY"; + RouteParamtypes[RouteParamtypes["PARAM"] = 5] = "PARAM"; + RouteParamtypes[RouteParamtypes["HEADERS"] = 6] = "HEADERS"; + RouteParamtypes[RouteParamtypes["SESSION"] = 7] = "SESSION"; + RouteParamtypes[RouteParamtypes["FILE"] = 8] = "FILE"; + RouteParamtypes[RouteParamtypes["FILES"] = 9] = "FILES"; +})(RouteParamtypes = exports.RouteParamtypes || (exports.RouteParamtypes = {})); diff --git a/lib/common/enums/transport.enum.d.ts b/lib/common/enums/transport.enum.d.ts new file mode 100644 index 000000000..46494bc2c --- /dev/null +++ b/lib/common/enums/transport.enum.d.ts @@ -0,0 +1,7 @@ +export declare enum Transport { + TCP = 0, + REDIS = 1, + NATS = 2, + MQTT = 3, + GRPC = 4, +} diff --git a/lib/common/enums/transport.enum.js b/lib/common/enums/transport.enum.js new file mode 100644 index 000000000..56b548893 --- /dev/null +++ b/lib/common/enums/transport.enum.js @@ -0,0 +1,10 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var Transport; +(function (Transport) { + Transport[Transport["TCP"] = 0] = "TCP"; + Transport[Transport["REDIS"] = 1] = "REDIS"; + Transport[Transport["NATS"] = 2] = "NATS"; + Transport[Transport["MQTT"] = 3] = "MQTT"; + Transport[Transport["GRPC"] = 4] = "GRPC"; +})(Transport = exports.Transport || (exports.Transport = {})); diff --git a/lib/common/exceptions/bad-gateway.exception.d.ts b/lib/common/exceptions/bad-gateway.exception.d.ts new file mode 100644 index 000000000..70ff89f17 --- /dev/null +++ b/lib/common/exceptions/bad-gateway.exception.d.ts @@ -0,0 +1,4 @@ +import { HttpException } from './http.exception'; +export declare class BadGatewayException extends HttpException { + constructor(message?: string | object | any, error?: string); +} diff --git a/lib/common/exceptions/bad-gateway.exception.js b/lib/common/exceptions/bad-gateway.exception.js new file mode 100644 index 000000000..a0f5dfe33 --- /dev/null +++ b/lib/common/exceptions/bad-gateway.exception.js @@ -0,0 +1,11 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const http_exception_1 = require("./http.exception"); +const http_status_enum_1 = require("../enums/http-status.enum"); +const http_exception_body_util_1 = require("./../utils/http-exception-body.util"); +class BadGatewayException extends http_exception_1.HttpException { + constructor(message, error = 'Bad Gateway') { + super(http_exception_body_util_1.createHttpExceptionBody(message, error, http_status_enum_1.HttpStatus.BAD_GATEWAY), http_status_enum_1.HttpStatus.BAD_GATEWAY); + } +} +exports.BadGatewayException = BadGatewayException; diff --git a/lib/common/exceptions/bad-request.exception.d.ts b/lib/common/exceptions/bad-request.exception.d.ts new file mode 100644 index 000000000..4170e9927 --- /dev/null +++ b/lib/common/exceptions/bad-request.exception.d.ts @@ -0,0 +1,4 @@ +import { HttpException } from './http.exception'; +export declare class BadRequestException extends HttpException { + constructor(message?: string | object | any, error?: string); +} diff --git a/lib/common/exceptions/bad-request.exception.js b/lib/common/exceptions/bad-request.exception.js new file mode 100644 index 000000000..c00f73633 --- /dev/null +++ b/lib/common/exceptions/bad-request.exception.js @@ -0,0 +1,11 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const http_exception_1 = require("./http.exception"); +const http_status_enum_1 = require("../enums/http-status.enum"); +const http_exception_body_util_1 = require("./../utils/http-exception-body.util"); +class BadRequestException extends http_exception_1.HttpException { + constructor(message, error = 'Bad Request') { + super(http_exception_body_util_1.createHttpExceptionBody(message, error, http_status_enum_1.HttpStatus.BAD_REQUEST), http_status_enum_1.HttpStatus.BAD_REQUEST); + } +} +exports.BadRequestException = BadRequestException; diff --git a/lib/common/exceptions/conflict.exception.d.ts b/lib/common/exceptions/conflict.exception.d.ts new file mode 100644 index 000000000..33028a973 --- /dev/null +++ b/lib/common/exceptions/conflict.exception.d.ts @@ -0,0 +1,4 @@ +import { HttpException } from './http.exception'; +export declare class ConflictException extends HttpException { + constructor(message?: string | object | any, error?: string); +} diff --git a/lib/common/exceptions/conflict.exception.js b/lib/common/exceptions/conflict.exception.js new file mode 100644 index 000000000..607e02d9f --- /dev/null +++ b/lib/common/exceptions/conflict.exception.js @@ -0,0 +1,11 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const http_exception_1 = require("./http.exception"); +const http_status_enum_1 = require("../enums/http-status.enum"); +const http_exception_body_util_1 = require("./../utils/http-exception-body.util"); +class ConflictException extends http_exception_1.HttpException { + constructor(message, error = 'Conflict') { + super(http_exception_body_util_1.createHttpExceptionBody(message, error, http_status_enum_1.HttpStatus.CONFLICT), http_status_enum_1.HttpStatus.CONFLICT); + } +} +exports.ConflictException = ConflictException; diff --git a/lib/common/exceptions/forbidden.exception.d.ts b/lib/common/exceptions/forbidden.exception.d.ts new file mode 100644 index 000000000..900c1f7e7 --- /dev/null +++ b/lib/common/exceptions/forbidden.exception.d.ts @@ -0,0 +1,4 @@ +import { HttpException } from './http.exception'; +export declare class ForbiddenException extends HttpException { + constructor(message?: string | object | any, error?: string); +} diff --git a/lib/common/exceptions/forbidden.exception.js b/lib/common/exceptions/forbidden.exception.js new file mode 100644 index 000000000..7e196b99f --- /dev/null +++ b/lib/common/exceptions/forbidden.exception.js @@ -0,0 +1,11 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const http_exception_1 = require("./http.exception"); +const http_status_enum_1 = require("../enums/http-status.enum"); +const http_exception_body_util_1 = require("./../utils/http-exception-body.util"); +class ForbiddenException extends http_exception_1.HttpException { + constructor(message, error = 'Forbidden') { + super(http_exception_body_util_1.createHttpExceptionBody(message, error, http_status_enum_1.HttpStatus.FORBIDDEN), http_status_enum_1.HttpStatus.FORBIDDEN); + } +} +exports.ForbiddenException = ForbiddenException; diff --git a/lib/common/exceptions/gateway-timeout.exception.d.ts b/lib/common/exceptions/gateway-timeout.exception.d.ts new file mode 100644 index 000000000..876d69648 --- /dev/null +++ b/lib/common/exceptions/gateway-timeout.exception.d.ts @@ -0,0 +1,4 @@ +import { HttpException } from './http.exception'; +export declare class GatewayTimeoutException extends HttpException { + constructor(message?: string | object | any, error?: string); +} diff --git a/lib/common/exceptions/gateway-timeout.exception.js b/lib/common/exceptions/gateway-timeout.exception.js new file mode 100644 index 000000000..fb17331c8 --- /dev/null +++ b/lib/common/exceptions/gateway-timeout.exception.js @@ -0,0 +1,11 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const http_exception_1 = require("./http.exception"); +const http_status_enum_1 = require("../enums/http-status.enum"); +const http_exception_body_util_1 = require("./../utils/http-exception-body.util"); +class GatewayTimeoutException extends http_exception_1.HttpException { + constructor(message, error = 'Gateway Timeout') { + super(http_exception_body_util_1.createHttpExceptionBody(message, error, http_status_enum_1.HttpStatus.GATEWAY_TIMEOUT), http_status_enum_1.HttpStatus.GATEWAY_TIMEOUT); + } +} +exports.GatewayTimeoutException = GatewayTimeoutException; diff --git a/lib/common/exceptions/gone.exception.d.ts b/lib/common/exceptions/gone.exception.d.ts new file mode 100644 index 000000000..1b00919fe --- /dev/null +++ b/lib/common/exceptions/gone.exception.d.ts @@ -0,0 +1,4 @@ +import { HttpException } from './http.exception'; +export declare class GoneException extends HttpException { + constructor(message?: string | object | any, error?: string); +} diff --git a/lib/common/exceptions/gone.exception.js b/lib/common/exceptions/gone.exception.js new file mode 100644 index 000000000..a85a08c27 --- /dev/null +++ b/lib/common/exceptions/gone.exception.js @@ -0,0 +1,11 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const http_exception_1 = require("./http.exception"); +const http_status_enum_1 = require("../enums/http-status.enum"); +const http_exception_body_util_1 = require("./../utils/http-exception-body.util"); +class GoneException extends http_exception_1.HttpException { + constructor(message, error = 'Gone') { + super(http_exception_body_util_1.createHttpExceptionBody(message, error, http_status_enum_1.HttpStatus.GONE), http_status_enum_1.HttpStatus.GONE); + } +} +exports.GoneException = GoneException; diff --git a/lib/common/exceptions/http.exception.d.ts b/lib/common/exceptions/http.exception.d.ts new file mode 100644 index 000000000..293a4123b --- /dev/null +++ b/lib/common/exceptions/http.exception.d.ts @@ -0,0 +1,27 @@ +export declare class HttpException extends Error { + private readonly response; + private readonly status; + readonly message: any; + /** + <<<<<<< HEAD + * The base Nest Application exception which is handled by the default Exceptions Handler. + * If you throw an exception from your HTTP route handlers, Nest will map them to the appropriate HTTP response and send to the client. + ======= + * The base Nest Application exception, which is handled by the default Exceptions Handler. + * If you throw an exception from your HTTP route handler, Nest will map them to the appropriate HTTP response and send to the client. + >>>>>>> master + * + * When `response` is an object: + * - object will be stringified and returned to the user as a JSON response, + * + * When `response` is a string: + * - Nest will create a response with two properties: + * ``` + * message: response, + * statusCode: X + * ``` + */ + constructor(response: string | object, status: number); + getResponse(): string | object; + getStatus(): number; +} diff --git a/lib/common/exceptions/http.exception.js b/lib/common/exceptions/http.exception.js new file mode 100644 index 000000000..8cc6b771e --- /dev/null +++ b/lib/common/exceptions/http.exception.js @@ -0,0 +1,36 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +class HttpException extends Error { + /** + <<<<<<< HEAD + * The base Nest Application exception which is handled by the default Exceptions Handler. + * If you throw an exception from your HTTP route handlers, Nest will map them to the appropriate HTTP response and send to the client. + ======= + * The base Nest Application exception, which is handled by the default Exceptions Handler. + * If you throw an exception from your HTTP route handler, Nest will map them to the appropriate HTTP response and send to the client. + >>>>>>> master + * + * When `response` is an object: + * - object will be stringified and returned to the user as a JSON response, + * + * When `response` is a string: + * - Nest will create a response with two properties: + * ``` + * message: response, + * statusCode: X + * ``` + */ + constructor(response, status) { + super(); + this.response = response; + this.status = status; + this.message = response; + } + getResponse() { + return this.response; + } + getStatus() { + return this.status; + } +} +exports.HttpException = HttpException; diff --git a/lib/common/exceptions/index.d.ts b/lib/common/exceptions/index.d.ts new file mode 100644 index 000000000..23c69da65 --- /dev/null +++ b/lib/common/exceptions/index.d.ts @@ -0,0 +1,18 @@ +export * from './bad-request.exception'; +export * from './http.exception'; +export * from './unauthorized.exception'; +export * from './method-not-allowed.exception'; +export * from './not-found.exception'; +export * from './forbidden.exception'; +export * from './not-acceptable.exception'; +export * from './request-timeout.exception'; +export * from './conflict.exception'; +export * from './gone.exception'; +export * from './payload-too-large.exception'; +export * from './unsupported-media-type.exception'; +export * from './unprocessable-entity.exception'; +export * from './internal-server-error.exception'; +export * from './not-implemented.exception'; +export * from './bad-gateway.exception'; +export * from './service-unavailable.exception'; +export * from './gateway-timeout.exception'; diff --git a/lib/common/exceptions/index.js b/lib/common/exceptions/index.js new file mode 100644 index 000000000..272a97955 --- /dev/null +++ b/lib/common/exceptions/index.js @@ -0,0 +1,23 @@ +"use strict"; +function __export(m) { + for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p]; +} +Object.defineProperty(exports, "__esModule", { value: true }); +__export(require("./bad-request.exception")); +__export(require("./http.exception")); +__export(require("./unauthorized.exception")); +__export(require("./method-not-allowed.exception")); +__export(require("./not-found.exception")); +__export(require("./forbidden.exception")); +__export(require("./not-acceptable.exception")); +__export(require("./request-timeout.exception")); +__export(require("./conflict.exception")); +__export(require("./gone.exception")); +__export(require("./payload-too-large.exception")); +__export(require("./unsupported-media-type.exception")); +__export(require("./unprocessable-entity.exception")); +__export(require("./internal-server-error.exception")); +__export(require("./not-implemented.exception")); +__export(require("./bad-gateway.exception")); +__export(require("./service-unavailable.exception")); +__export(require("./gateway-timeout.exception")); diff --git a/lib/common/exceptions/internal-server-error.exception.d.ts b/lib/common/exceptions/internal-server-error.exception.d.ts new file mode 100644 index 000000000..6ea1c207d --- /dev/null +++ b/lib/common/exceptions/internal-server-error.exception.d.ts @@ -0,0 +1,4 @@ +import { HttpException } from './http.exception'; +export declare class InternalServerErrorException extends HttpException { + constructor(message?: string | object | any, error?: string); +} diff --git a/lib/common/exceptions/internal-server-error.exception.js b/lib/common/exceptions/internal-server-error.exception.js new file mode 100644 index 000000000..661bd4423 --- /dev/null +++ b/lib/common/exceptions/internal-server-error.exception.js @@ -0,0 +1,11 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const http_exception_1 = require("./http.exception"); +const http_status_enum_1 = require("../enums/http-status.enum"); +const http_exception_body_util_1 = require("./../utils/http-exception-body.util"); +class InternalServerErrorException extends http_exception_1.HttpException { + constructor(message, error = 'Internal Server Error') { + super(http_exception_body_util_1.createHttpExceptionBody(message, error, http_status_enum_1.HttpStatus.INTERNAL_SERVER_ERROR), http_status_enum_1.HttpStatus.INTERNAL_SERVER_ERROR); + } +} +exports.InternalServerErrorException = InternalServerErrorException; diff --git a/lib/common/exceptions/method-not-allowed.exception.d.ts b/lib/common/exceptions/method-not-allowed.exception.d.ts new file mode 100644 index 000000000..3d9b3b78f --- /dev/null +++ b/lib/common/exceptions/method-not-allowed.exception.d.ts @@ -0,0 +1,4 @@ +import { HttpException } from './http.exception'; +export declare class MethodNotAllowedException extends HttpException { + constructor(message?: string | object | any, error?: string); +} diff --git a/lib/common/exceptions/method-not-allowed.exception.js b/lib/common/exceptions/method-not-allowed.exception.js new file mode 100644 index 000000000..d5ed180ba --- /dev/null +++ b/lib/common/exceptions/method-not-allowed.exception.js @@ -0,0 +1,11 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const http_exception_1 = require("./http.exception"); +const http_status_enum_1 = require("../enums/http-status.enum"); +const http_exception_body_util_1 = require("./../utils/http-exception-body.util"); +class MethodNotAllowedException extends http_exception_1.HttpException { + constructor(message, error = 'Method Not Allowed') { + super(http_exception_body_util_1.createHttpExceptionBody(message, error, http_status_enum_1.HttpStatus.METHOD_NOT_ALLOWED), http_status_enum_1.HttpStatus.METHOD_NOT_ALLOWED); + } +} +exports.MethodNotAllowedException = MethodNotAllowedException; diff --git a/lib/common/exceptions/not-acceptable.exception.d.ts b/lib/common/exceptions/not-acceptable.exception.d.ts new file mode 100644 index 000000000..4921c15e0 --- /dev/null +++ b/lib/common/exceptions/not-acceptable.exception.d.ts @@ -0,0 +1,4 @@ +import { HttpException } from './http.exception'; +export declare class NotAcceptableException extends HttpException { + constructor(message?: string | object | any, error?: string); +} diff --git a/lib/common/exceptions/not-acceptable.exception.js b/lib/common/exceptions/not-acceptable.exception.js new file mode 100644 index 000000000..c93f208c5 --- /dev/null +++ b/lib/common/exceptions/not-acceptable.exception.js @@ -0,0 +1,11 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const http_exception_1 = require("./http.exception"); +const http_status_enum_1 = require("../enums/http-status.enum"); +const http_exception_body_util_1 = require("./../utils/http-exception-body.util"); +class NotAcceptableException extends http_exception_1.HttpException { + constructor(message, error = 'Not Acceptable') { + super(http_exception_body_util_1.createHttpExceptionBody(message, error, http_status_enum_1.HttpStatus.NOT_ACCEPTABLE), http_status_enum_1.HttpStatus.NOT_ACCEPTABLE); + } +} +exports.NotAcceptableException = NotAcceptableException; diff --git a/lib/common/exceptions/not-found.exception.d.ts b/lib/common/exceptions/not-found.exception.d.ts new file mode 100644 index 000000000..84ddc8e47 --- /dev/null +++ b/lib/common/exceptions/not-found.exception.d.ts @@ -0,0 +1,4 @@ +import { HttpException } from './http.exception'; +export declare class NotFoundException extends HttpException { + constructor(message?: string | object | any, error?: string); +} diff --git a/lib/common/exceptions/not-found.exception.js b/lib/common/exceptions/not-found.exception.js new file mode 100644 index 000000000..bfbd9b1d4 --- /dev/null +++ b/lib/common/exceptions/not-found.exception.js @@ -0,0 +1,11 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const http_exception_1 = require("./http.exception"); +const http_status_enum_1 = require("../enums/http-status.enum"); +const http_exception_body_util_1 = require("./../utils/http-exception-body.util"); +class NotFoundException extends http_exception_1.HttpException { + constructor(message, error = 'Not Found') { + super(http_exception_body_util_1.createHttpExceptionBody(message, error, http_status_enum_1.HttpStatus.NOT_FOUND), http_status_enum_1.HttpStatus.NOT_FOUND); + } +} +exports.NotFoundException = NotFoundException; diff --git a/lib/common/exceptions/not-implemented.exception.d.ts b/lib/common/exceptions/not-implemented.exception.d.ts new file mode 100644 index 000000000..0d0c1f5e1 --- /dev/null +++ b/lib/common/exceptions/not-implemented.exception.d.ts @@ -0,0 +1,4 @@ +import { HttpException } from './http.exception'; +export declare class NotImplementedException extends HttpException { + constructor(message?: string | object | any, error?: string); +} diff --git a/lib/common/exceptions/not-implemented.exception.js b/lib/common/exceptions/not-implemented.exception.js new file mode 100644 index 000000000..e552d24ad --- /dev/null +++ b/lib/common/exceptions/not-implemented.exception.js @@ -0,0 +1,11 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const http_exception_1 = require("./http.exception"); +const http_status_enum_1 = require("../enums/http-status.enum"); +const http_exception_body_util_1 = require("./../utils/http-exception-body.util"); +class NotImplementedException extends http_exception_1.HttpException { + constructor(message, error = 'Not Implemented') { + super(http_exception_body_util_1.createHttpExceptionBody(message, error, http_status_enum_1.HttpStatus.NOT_IMPLEMENTED), http_status_enum_1.HttpStatus.NOT_IMPLEMENTED); + } +} +exports.NotImplementedException = NotImplementedException; diff --git a/lib/common/exceptions/payload-too-large.exception.d.ts b/lib/common/exceptions/payload-too-large.exception.d.ts new file mode 100644 index 000000000..808b8d7e1 --- /dev/null +++ b/lib/common/exceptions/payload-too-large.exception.d.ts @@ -0,0 +1,4 @@ +import { HttpException } from './http.exception'; +export declare class PayloadTooLargeException extends HttpException { + constructor(message?: string | object | any, error?: string); +} diff --git a/lib/common/exceptions/payload-too-large.exception.js b/lib/common/exceptions/payload-too-large.exception.js new file mode 100644 index 000000000..3e3da9835 --- /dev/null +++ b/lib/common/exceptions/payload-too-large.exception.js @@ -0,0 +1,11 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const http_exception_1 = require("./http.exception"); +const http_status_enum_1 = require("../enums/http-status.enum"); +const http_exception_body_util_1 = require("./../utils/http-exception-body.util"); +class PayloadTooLargeException extends http_exception_1.HttpException { + constructor(message, error = 'Payload Too Large') { + super(http_exception_body_util_1.createHttpExceptionBody(message, error, http_status_enum_1.HttpStatus.PAYLOAD_TOO_LARGE), http_status_enum_1.HttpStatus.PAYLOAD_TOO_LARGE); + } +} +exports.PayloadTooLargeException = PayloadTooLargeException; diff --git a/lib/common/exceptions/request-timeout.exception.d.ts b/lib/common/exceptions/request-timeout.exception.d.ts new file mode 100644 index 000000000..e12fca810 --- /dev/null +++ b/lib/common/exceptions/request-timeout.exception.d.ts @@ -0,0 +1,4 @@ +import { HttpException } from './http.exception'; +export declare class RequestTimeoutException extends HttpException { + constructor(message?: string | object | any, error?: string); +} diff --git a/lib/common/exceptions/request-timeout.exception.js b/lib/common/exceptions/request-timeout.exception.js new file mode 100644 index 000000000..3504f0c6d --- /dev/null +++ b/lib/common/exceptions/request-timeout.exception.js @@ -0,0 +1,11 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const http_exception_1 = require("./http.exception"); +const http_status_enum_1 = require("../enums/http-status.enum"); +const http_exception_body_util_1 = require("./../utils/http-exception-body.util"); +class RequestTimeoutException extends http_exception_1.HttpException { + constructor(message, error = 'Request Timeout') { + super(http_exception_body_util_1.createHttpExceptionBody(message, error, http_status_enum_1.HttpStatus.REQUEST_TIMEOUT), http_status_enum_1.HttpStatus.REQUEST_TIMEOUT); + } +} +exports.RequestTimeoutException = RequestTimeoutException; diff --git a/lib/common/exceptions/service-unavailable.exception.d.ts b/lib/common/exceptions/service-unavailable.exception.d.ts new file mode 100644 index 000000000..eef882d78 --- /dev/null +++ b/lib/common/exceptions/service-unavailable.exception.d.ts @@ -0,0 +1,4 @@ +import { HttpException } from './http.exception'; +export declare class ServiceUnavailableException extends HttpException { + constructor(message?: string | object | any, error?: string); +} diff --git a/lib/common/exceptions/service-unavailable.exception.js b/lib/common/exceptions/service-unavailable.exception.js new file mode 100644 index 000000000..9662bb8a4 --- /dev/null +++ b/lib/common/exceptions/service-unavailable.exception.js @@ -0,0 +1,11 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const http_exception_1 = require("./http.exception"); +const http_status_enum_1 = require("../enums/http-status.enum"); +const http_exception_body_util_1 = require("./../utils/http-exception-body.util"); +class ServiceUnavailableException extends http_exception_1.HttpException { + constructor(message, error = 'Service Unavailable') { + super(http_exception_body_util_1.createHttpExceptionBody(message, error, http_status_enum_1.HttpStatus.SERVICE_UNAVAILABLE), http_status_enum_1.HttpStatus.SERVICE_UNAVAILABLE); + } +} +exports.ServiceUnavailableException = ServiceUnavailableException; diff --git a/lib/common/exceptions/unauthorized.exception.d.ts b/lib/common/exceptions/unauthorized.exception.d.ts new file mode 100644 index 000000000..a70bef07e --- /dev/null +++ b/lib/common/exceptions/unauthorized.exception.d.ts @@ -0,0 +1,4 @@ +import { HttpException } from './http.exception'; +export declare class UnauthorizedException extends HttpException { + constructor(message?: string | object | any, error?: string); +} diff --git a/lib/common/exceptions/unauthorized.exception.js b/lib/common/exceptions/unauthorized.exception.js new file mode 100644 index 000000000..38189ae9d --- /dev/null +++ b/lib/common/exceptions/unauthorized.exception.js @@ -0,0 +1,11 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const http_exception_1 = require("./http.exception"); +const http_status_enum_1 = require("../enums/http-status.enum"); +const http_exception_body_util_1 = require("./../utils/http-exception-body.util"); +class UnauthorizedException extends http_exception_1.HttpException { + constructor(message, error = 'Unauthorized') { + super(http_exception_body_util_1.createHttpExceptionBody(message, error, http_status_enum_1.HttpStatus.UNAUTHORIZED), http_status_enum_1.HttpStatus.UNAUTHORIZED); + } +} +exports.UnauthorizedException = UnauthorizedException; diff --git a/lib/common/exceptions/unprocessable-entity.exception.d.ts b/lib/common/exceptions/unprocessable-entity.exception.d.ts new file mode 100644 index 000000000..a5fd76711 --- /dev/null +++ b/lib/common/exceptions/unprocessable-entity.exception.d.ts @@ -0,0 +1,4 @@ +import { HttpException } from './http.exception'; +export declare class UnprocessableEntityException extends HttpException { + constructor(message?: string | object | any, error?: string); +} diff --git a/lib/common/exceptions/unprocessable-entity.exception.js b/lib/common/exceptions/unprocessable-entity.exception.js new file mode 100644 index 000000000..fde8e95fb --- /dev/null +++ b/lib/common/exceptions/unprocessable-entity.exception.js @@ -0,0 +1,11 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const http_exception_1 = require("./http.exception"); +const http_status_enum_1 = require("../enums/http-status.enum"); +const http_exception_body_util_1 = require("./../utils/http-exception-body.util"); +class UnprocessableEntityException extends http_exception_1.HttpException { + constructor(message, error = 'Unprocessable Entity') { + super(http_exception_body_util_1.createHttpExceptionBody(message, error, http_status_enum_1.HttpStatus.UNPROCESSABLE_ENTITY), http_status_enum_1.HttpStatus.UNPROCESSABLE_ENTITY); + } +} +exports.UnprocessableEntityException = UnprocessableEntityException; diff --git a/lib/common/exceptions/unsupported-media-type.exception.d.ts b/lib/common/exceptions/unsupported-media-type.exception.d.ts new file mode 100644 index 000000000..5f0921b12 --- /dev/null +++ b/lib/common/exceptions/unsupported-media-type.exception.d.ts @@ -0,0 +1,4 @@ +import { HttpException } from './http.exception'; +export declare class UnsupportedMediaTypeException extends HttpException { + constructor(message?: string | object | any, error?: string); +} diff --git a/lib/common/exceptions/unsupported-media-type.exception.js b/lib/common/exceptions/unsupported-media-type.exception.js new file mode 100644 index 000000000..2c501436f --- /dev/null +++ b/lib/common/exceptions/unsupported-media-type.exception.js @@ -0,0 +1,11 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const http_exception_1 = require("./http.exception"); +const http_status_enum_1 = require("../enums/http-status.enum"); +const http_exception_body_util_1 = require("./../utils/http-exception-body.util"); +class UnsupportedMediaTypeException extends http_exception_1.HttpException { + constructor(message, error = 'Unsupported Media Type') { + super(http_exception_body_util_1.createHttpExceptionBody(message, error, http_status_enum_1.HttpStatus.UNSUPPORTED_MEDIA_TYPE), http_status_enum_1.HttpStatus.UNSUPPORTED_MEDIA_TYPE); + } +} +exports.UnsupportedMediaTypeException = UnsupportedMediaTypeException; diff --git a/lib/common/http/http.module.d.ts b/lib/common/http/http.module.d.ts new file mode 100644 index 000000000..b93acc45b --- /dev/null +++ b/lib/common/http/http.module.d.ts @@ -0,0 +1 @@ +export declare class HttpModule {} diff --git a/lib/common/http/http.module.js b/lib/common/http/http.module.js new file mode 100644 index 000000000..da490efb3 --- /dev/null +++ b/lib/common/http/http.module.js @@ -0,0 +1,19 @@ +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const module_decorator_1 = require("../decorators/modules/module.decorator"); +const http_service_1 = require("./http.service"); +let HttpModule = class HttpModule { +}; +HttpModule = __decorate([ + module_decorator_1.Module({ + components: [http_service_1.HttpService], + exports: [http_service_1.HttpService], + }) +], HttpModule); +exports.HttpModule = HttpModule; diff --git a/lib/common/http/http.service.d.ts b/lib/common/http/http.service.d.ts new file mode 100644 index 000000000..fc874523a --- /dev/null +++ b/lib/common/http/http.service.d.ts @@ -0,0 +1,32 @@ +import { AxiosRequestConfig, AxiosResponse } from 'axios'; +import { Observable } from 'rxjs/Observable'; +export declare class HttpService { + request(config: AxiosRequestConfig): Observable>; + get( + url: string, + config?: AxiosRequestConfig, + ): Observable>; + delete( + url: string, + config?: AxiosRequestConfig, + ): Observable>; + head( + url: string, + config?: AxiosRequestConfig, + ): Observable>; + post( + url: string, + data?: any, + config?: AxiosRequestConfig, + ): Observable>; + put( + url: string, + data?: any, + config?: AxiosRequestConfig, + ): Observable>; + patch( + url: string, + data?: any, + config?: AxiosRequestConfig, + ): Observable>; +} diff --git a/lib/common/http/http.service.js b/lib/common/http/http.service.js new file mode 100644 index 000000000..4bd5f474c --- /dev/null +++ b/lib/common/http/http.service.js @@ -0,0 +1,28 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const axios_1 = require("axios"); +const fromPromise_1 = require("rxjs/observable/fromPromise"); +class HttpService { + request(config) { + return fromPromise_1.fromPromise(axios_1.default.request(config)); + } + get(url, config) { + return fromPromise_1.fromPromise(axios_1.default.get(url, config)); + } + delete(url, config) { + return fromPromise_1.fromPromise(axios_1.default.delete(url, config)); + } + head(url, config) { + return fromPromise_1.fromPromise(axios_1.default.head(url, config)); + } + post(url, data, config) { + return fromPromise_1.fromPromise(axios_1.default.post(url, data, config)); + } + put(url, data, config) { + return fromPromise_1.fromPromise(axios_1.default.post(url, data, config)); + } + patch(url, data, config) { + return fromPromise_1.fromPromise(axios_1.default.post(url, data, config)); + } +} +exports.HttpService = HttpService; diff --git a/lib/common/http/index.d.ts b/lib/common/http/index.d.ts new file mode 100644 index 000000000..c13030e82 --- /dev/null +++ b/lib/common/http/index.d.ts @@ -0,0 +1,2 @@ +export * from './http.module'; +export * from './http.service'; diff --git a/lib/common/http/index.js b/lib/common/http/index.js new file mode 100644 index 000000000..b5df8eb1c --- /dev/null +++ b/lib/common/http/index.js @@ -0,0 +1,7 @@ +"use strict"; +function __export(m) { + for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p]; +} +Object.defineProperty(exports, "__esModule", { value: true }); +__export(require("./http.module")); +__export(require("./http.service")); diff --git a/lib/common/index.d.ts b/lib/common/index.d.ts new file mode 100644 index 000000000..9fb2c132b --- /dev/null +++ b/lib/common/index.d.ts @@ -0,0 +1,34 @@ +export * from './decorators'; +export * from './enums'; +export { + NestModule, + INestApplication, + INestMicroservice, + NestMiddleware, + FunctionMiddleware, + MiddlewaresConsumer, + OnModuleInit, + ExceptionFilter, + WebSocketAdapter, + PipeTransform, + Paramtype, + ArgumentMetadata, + OnModuleDestroy, + ExecutionContext, + CanActivate, + RpcExceptionFilter, + WsExceptionFilter, + NestInterceptor, + DynamicModule, + INestApplicationContext, + HttpServer, + HttpServerFactory, + ArgumentsHost, + INestExpressApplication, + INestFastifyApplication, +} from './interfaces'; +export * from './interceptors'; +export * from './services/logger.service'; +export * from './pipes'; +export * from './utils'; +export * from './exceptions'; diff --git a/lib/common/index.js b/lib/common/index.js new file mode 100644 index 000000000..229ff9f3d --- /dev/null +++ b/lib/common/index.js @@ -0,0 +1,18 @@ +"use strict"; +/* + * Nest @common + * Copyright(c) 2017 - 2018 Kamil Mysliwiec + * https://nestjs.com + * MIT Licensed + */ +function __export(m) { + for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p]; +} +Object.defineProperty(exports, "__esModule", { value: true }); +__export(require("./decorators")); +__export(require("./enums")); +__export(require("./interceptors")); +__export(require("./services/logger.service")); +__export(require("./pipes")); +__export(require("./utils")); +__export(require("./exceptions")); diff --git a/lib/common/interceptors/file.interceptor.d.ts b/lib/common/interceptors/file.interceptor.d.ts new file mode 100644 index 000000000..2c19e14b3 --- /dev/null +++ b/lib/common/interceptors/file.interceptor.d.ts @@ -0,0 +1,5 @@ +import { MulterOptions } from '../interfaces/external/multer-options.interface'; +export declare function FileInterceptor( + fieldName: string, + options?: MulterOptions, +): any; diff --git a/lib/common/interceptors/file.interceptor.js b/lib/common/interceptors/file.interceptor.js new file mode 100644 index 000000000..7e9c9d8d7 --- /dev/null +++ b/lib/common/interceptors/file.interceptor.js @@ -0,0 +1,34 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const multer = require("multer"); +const component_decorator_1 = require("../decorators/core/component.decorator"); +const multer_utils_1 = require("./multer/multer.utils"); +function FileInterceptor(fieldName, options) { + return component_decorator_1.mixin(class { + constructor() { + this.upload = multer(options); + } + intercept(context, stream$) { + return __awaiter(this, void 0, void 0, function* () { + const ctx = context.switchToHttp(); + yield new Promise((resolve, reject) => this.upload.single(fieldName)(ctx.getRequest(), ctx.getResponse(), err => { + if (err) { + const error = multer_utils_1.transformException(err); + return reject(error); + } + resolve(); + })); + return stream$; + }); + } + }); +} +exports.FileInterceptor = FileInterceptor; diff --git a/lib/common/interceptors/files.interceptor.d.ts b/lib/common/interceptors/files.interceptor.d.ts new file mode 100644 index 000000000..797634236 --- /dev/null +++ b/lib/common/interceptors/files.interceptor.d.ts @@ -0,0 +1,16 @@ +import { Observable } from 'rxjs/Observable'; +import { MulterOptions } from '../interfaces/external/multer-options.interface'; +import { ExecutionContext } from './../interfaces'; +export declare function FilesInterceptor( + fieldName: string, + maxCount?: number, + options?: MulterOptions, +): { + new (): { + readonly upload: any; + intercept( + context: ExecutionContext, + stream$: Observable, + ): Promise>; + }; +}; diff --git a/lib/common/interceptors/files.interceptor.js b/lib/common/interceptors/files.interceptor.js new file mode 100644 index 000000000..93c57efca --- /dev/null +++ b/lib/common/interceptors/files.interceptor.js @@ -0,0 +1,34 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const multer = require("multer"); +const multer_utils_1 = require("./multer/multer.utils"); +function FilesInterceptor(fieldName, maxCount, options) { + const Interceptor = class { + constructor() { + this.upload = multer(options); + } + intercept(context, stream$) { + return __awaiter(this, void 0, void 0, function* () { + const ctx = context.switchToHttp(); + yield new Promise((resolve, reject) => this.upload.array(fieldName, maxCount)(ctx.getRequest(), ctx.getResponse(), err => { + if (err) { + const error = multer_utils_1.transformException(err); + return reject(error); + } + resolve(); + })); + return stream$; + }); + } + }; + return Interceptor; +} +exports.FilesInterceptor = FilesInterceptor; diff --git a/lib/common/interceptors/index.d.ts b/lib/common/interceptors/index.d.ts new file mode 100644 index 000000000..73fb2b02f --- /dev/null +++ b/lib/common/interceptors/index.d.ts @@ -0,0 +1,2 @@ +export * from './file.interceptor'; +export * from './files.interceptor'; diff --git a/lib/common/interceptors/index.js b/lib/common/interceptors/index.js new file mode 100644 index 000000000..7183951b7 --- /dev/null +++ b/lib/common/interceptors/index.js @@ -0,0 +1,7 @@ +"use strict"; +function __export(m) { + for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p]; +} +Object.defineProperty(exports, "__esModule", { value: true }); +__export(require("./file.interceptor")); +__export(require("./files.interceptor")); diff --git a/lib/common/interceptors/multer/multer.constants.d.ts b/lib/common/interceptors/multer/multer.constants.d.ts new file mode 100644 index 000000000..f263c7212 --- /dev/null +++ b/lib/common/interceptors/multer/multer.constants.d.ts @@ -0,0 +1,9 @@ +export declare const multerExceptions: { + LIMIT_PART_COUNT: string; + LIMIT_FILE_SIZE: string; + LIMIT_FILE_COUNT: string; + LIMIT_FIELD_KEY: string; + LIMIT_FIELD_VALUE: string; + LIMIT_FIELD_COUNT: string; + LIMIT_UNEXPECTED_FILE: string; +}; diff --git a/lib/common/interceptors/multer/multer.constants.js b/lib/common/interceptors/multer/multer.constants.js new file mode 100644 index 000000000..9fe3faba3 --- /dev/null +++ b/lib/common/interceptors/multer/multer.constants.js @@ -0,0 +1,11 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.multerExceptions = { + LIMIT_PART_COUNT: 'Too many parts', + LIMIT_FILE_SIZE: 'File too large', + LIMIT_FILE_COUNT: 'Too many files', + LIMIT_FIELD_KEY: 'Field name too long', + LIMIT_FIELD_VALUE: 'Field value too long', + LIMIT_FIELD_COUNT: 'Too many fields', + LIMIT_UNEXPECTED_FILE: 'Unexpected field', +}; diff --git a/lib/common/interceptors/multer/multer.utils.d.ts b/lib/common/interceptors/multer/multer.utils.d.ts new file mode 100644 index 000000000..0c02c0019 --- /dev/null +++ b/lib/common/interceptors/multer/multer.utils.d.ts @@ -0,0 +1,7 @@ +import { + PayloadTooLargeException, + BadRequestException, +} from './../../exceptions'; +export declare function transformException( + error: Error | undefined, +): Error | BadRequestException | PayloadTooLargeException; diff --git a/lib/common/interceptors/multer/multer.utils.js b/lib/common/interceptors/multer/multer.utils.js new file mode 100644 index 000000000..b9306b549 --- /dev/null +++ b/lib/common/interceptors/multer/multer.utils.js @@ -0,0 +1,22 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const exceptions_1 = require("./../../exceptions"); +const multer_constants_1 = require("./multer.constants"); +function transformException(error) { + if (!error || error instanceof exceptions_1.HttpException) { + return error; + } + switch (error.message) { + case multer_constants_1.multerExceptions.LIMIT_FILE_SIZE: + return new exceptions_1.PayloadTooLargeException(error.message); + case multer_constants_1.multerExceptions.LIMIT_FILE_COUNT: + case multer_constants_1.multerExceptions.LIMIT_FIELD_KEY: + case multer_constants_1.multerExceptions.LIMIT_FIELD_VALUE: + case multer_constants_1.multerExceptions.LIMIT_FIELD_COUNT: + case multer_constants_1.multerExceptions.LIMIT_UNEXPECTED_FILE: + case multer_constants_1.multerExceptions.LIMIT_PART_COUNT: + return new exceptions_1.BadRequestException(error.message); + } + return error; +} +exports.transformException = transformException; diff --git a/lib/common/interfaces/configuration-provider.interface.d.ts b/lib/common/interfaces/configuration-provider.interface.d.ts new file mode 100644 index 000000000..3e11f22f7 --- /dev/null +++ b/lib/common/interfaces/configuration-provider.interface.d.ts @@ -0,0 +1,6 @@ +import { NestInterceptor } from './features/nest-interceptor.interface'; +import { CanActivate } from './features/can-activate.interface'; +export interface ConfigurationProvider { + getGlobalInterceptors(): NestInterceptor[]; + getGlobalGuards(): CanActivate[]; +} diff --git a/lib/common/interfaces/configuration-provider.interface.js b/lib/common/interfaces/configuration-provider.interface.js new file mode 100644 index 000000000..c8ad2e549 --- /dev/null +++ b/lib/common/interfaces/configuration-provider.interface.js @@ -0,0 +1,2 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/lib/common/interfaces/controllers/controller-metadata.interface.d.ts b/lib/common/interfaces/controllers/controller-metadata.interface.d.ts new file mode 100644 index 000000000..593c4054e --- /dev/null +++ b/lib/common/interfaces/controllers/controller-metadata.interface.d.ts @@ -0,0 +1,3 @@ +export interface ControllerMetadata { + path?: string; +} diff --git a/lib/common/interfaces/controllers/controller-metadata.interface.js b/lib/common/interfaces/controllers/controller-metadata.interface.js new file mode 100644 index 000000000..c8ad2e549 --- /dev/null +++ b/lib/common/interfaces/controllers/controller-metadata.interface.js @@ -0,0 +1,2 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/lib/common/interfaces/controllers/controller.interface.d.ts b/lib/common/interfaces/controllers/controller.interface.d.ts new file mode 100644 index 000000000..30fb9c54b --- /dev/null +++ b/lib/common/interfaces/controllers/controller.interface.d.ts @@ -0,0 +1 @@ +export interface Controller {} diff --git a/lib/common/interfaces/controllers/controller.interface.js b/lib/common/interfaces/controllers/controller.interface.js new file mode 100644 index 000000000..c8ad2e549 --- /dev/null +++ b/lib/common/interfaces/controllers/controller.interface.js @@ -0,0 +1,2 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/lib/common/interfaces/controllers/index.d.ts b/lib/common/interfaces/controllers/index.d.ts new file mode 100644 index 000000000..4bd60924b --- /dev/null +++ b/lib/common/interfaces/controllers/index.d.ts @@ -0,0 +1,2 @@ +export * from './controller-metadata.interface'; +export * from './controller.interface'; diff --git a/lib/common/interfaces/controllers/index.js b/lib/common/interfaces/controllers/index.js new file mode 100644 index 000000000..c8ad2e549 --- /dev/null +++ b/lib/common/interfaces/controllers/index.js @@ -0,0 +1,2 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/lib/common/interfaces/exceptions/exception-filter-metadata.interface.d.ts b/lib/common/interfaces/exceptions/exception-filter-metadata.interface.d.ts new file mode 100644 index 000000000..edfad3faf --- /dev/null +++ b/lib/common/interfaces/exceptions/exception-filter-metadata.interface.d.ts @@ -0,0 +1,6 @@ +import { ExceptionFilter } from './exception-filter.interface'; +import { Type } from '../type.interface'; +export interface ExceptionFilterMetadata { + func: ExceptionFilter['catch']; + exceptionMetatypes: Type[]; +} diff --git a/lib/common/interfaces/exceptions/exception-filter-metadata.interface.js b/lib/common/interfaces/exceptions/exception-filter-metadata.interface.js new file mode 100644 index 000000000..c8ad2e549 --- /dev/null +++ b/lib/common/interfaces/exceptions/exception-filter-metadata.interface.js @@ -0,0 +1,2 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/lib/common/interfaces/exceptions/exception-filter.interface.d.ts b/lib/common/interfaces/exceptions/exception-filter.interface.d.ts new file mode 100644 index 000000000..9bd1a7ec3 --- /dev/null +++ b/lib/common/interfaces/exceptions/exception-filter.interface.d.ts @@ -0,0 +1,4 @@ +import { ArgumentsHost } from './../features/arguments-host.interface'; +export interface ExceptionFilter { + catch(exception: T, host: ArgumentsHost): any; +} diff --git a/lib/common/interfaces/exceptions/exception-filter.interface.js b/lib/common/interfaces/exceptions/exception-filter.interface.js new file mode 100644 index 000000000..c8ad2e549 --- /dev/null +++ b/lib/common/interfaces/exceptions/exception-filter.interface.js @@ -0,0 +1,2 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/lib/common/interfaces/exceptions/index.d.ts b/lib/common/interfaces/exceptions/index.d.ts new file mode 100644 index 000000000..f35002c2e --- /dev/null +++ b/lib/common/interfaces/exceptions/index.d.ts @@ -0,0 +1,5 @@ +export * from './exception-filter-metadata.interface'; +export * from './exception-filter.interface'; +export * from './rpc-exception-filter-metadata.interface'; +export * from './rpc-exception-filter.interface'; +export * from './ws-exception-filter.interface'; diff --git a/lib/common/interfaces/exceptions/index.js b/lib/common/interfaces/exceptions/index.js new file mode 100644 index 000000000..c8ad2e549 --- /dev/null +++ b/lib/common/interfaces/exceptions/index.js @@ -0,0 +1,2 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/lib/common/interfaces/exceptions/rpc-exception-filter-metadata.interface.d.ts b/lib/common/interfaces/exceptions/rpc-exception-filter-metadata.interface.d.ts new file mode 100644 index 000000000..dbed4d5a3 --- /dev/null +++ b/lib/common/interfaces/exceptions/rpc-exception-filter-metadata.interface.d.ts @@ -0,0 +1,6 @@ +import { RpcExceptionFilter } from './rpc-exception-filter.interface'; +import { Type } from '../type.interface'; +export interface RpcExceptionFilterMetadata { + func: RpcExceptionFilter['catch']; + exceptionMetatypes: Type[]; +} diff --git a/lib/common/interfaces/exceptions/rpc-exception-filter-metadata.interface.js b/lib/common/interfaces/exceptions/rpc-exception-filter-metadata.interface.js new file mode 100644 index 000000000..c8ad2e549 --- /dev/null +++ b/lib/common/interfaces/exceptions/rpc-exception-filter-metadata.interface.js @@ -0,0 +1,2 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/lib/common/interfaces/exceptions/rpc-exception-filter.interface.d.ts b/lib/common/interfaces/exceptions/rpc-exception-filter.interface.d.ts new file mode 100644 index 000000000..a6a119dde --- /dev/null +++ b/lib/common/interfaces/exceptions/rpc-exception-filter.interface.d.ts @@ -0,0 +1,5 @@ +import { Observable } from 'rxjs/Observable'; +import { ArgumentsHost } from './../features/arguments-host.interface'; +export interface RpcExceptionFilter { + catch(exception: T, host: ArgumentsHost): Observable; +} diff --git a/lib/common/interfaces/exceptions/rpc-exception-filter.interface.js b/lib/common/interfaces/exceptions/rpc-exception-filter.interface.js new file mode 100644 index 000000000..c8ad2e549 --- /dev/null +++ b/lib/common/interfaces/exceptions/rpc-exception-filter.interface.js @@ -0,0 +1,2 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/lib/common/interfaces/exceptions/ws-exception-filter.interface.d.ts b/lib/common/interfaces/exceptions/ws-exception-filter.interface.d.ts new file mode 100644 index 000000000..54c3f9197 --- /dev/null +++ b/lib/common/interfaces/exceptions/ws-exception-filter.interface.d.ts @@ -0,0 +1,4 @@ +import { ArgumentsHost } from './../features/arguments-host.interface'; +export interface WsExceptionFilter { + catch(exception: T, host: ArgumentsHost): any; +} diff --git a/lib/common/interfaces/exceptions/ws-exception-filter.interface.js b/lib/common/interfaces/exceptions/ws-exception-filter.interface.js new file mode 100644 index 000000000..c8ad2e549 --- /dev/null +++ b/lib/common/interfaces/exceptions/ws-exception-filter.interface.js @@ -0,0 +1,2 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/lib/common/interfaces/external/cors-options.interface.d.ts b/lib/common/interfaces/external/cors-options.interface.d.ts new file mode 100644 index 000000000..1dfc22ab2 --- /dev/null +++ b/lib/common/interfaces/external/cors-options.interface.d.ts @@ -0,0 +1,14 @@ +export declare type CustomOrigin = ( + requestOrigin: string, + callback: (err: Error | null, allow?: boolean) => void, +) => void; +export interface CorsOptions { + origin?: boolean | string | RegExp | (string | RegExp)[] | CustomOrigin; + methods?: string | string[]; + allowedHeaders?: string | string[]; + exposedHeaders?: string | string[]; + credentials?: boolean; + maxAge?: number; + preflightContinue?: boolean; + optionsSuccessStatus?: number; +} diff --git a/lib/common/interfaces/external/cors-options.interface.js b/lib/common/interfaces/external/cors-options.interface.js new file mode 100644 index 000000000..c8ad2e549 --- /dev/null +++ b/lib/common/interfaces/external/cors-options.interface.js @@ -0,0 +1,2 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/lib/common/interfaces/external/https-options.interface.d.ts b/lib/common/interfaces/external/https-options.interface.d.ts new file mode 100644 index 000000000..2ad2b1cd9 --- /dev/null +++ b/lib/common/interfaces/external/https-options.interface.d.ts @@ -0,0 +1,14 @@ +export interface HttpsOptions { + pfx?: any; + key?: any; + passphrase?: string; + cert?: any; + ca?: any; + crl?: any; + ciphers?: string; + honorCipherOrder?: boolean; + requestCert?: boolean; + rejectUnauthorized?: boolean; + NPNProtocols?: any; + SNICallback?: (servername: string, cb: (err: Error, ctx: any) => any) => any; +} diff --git a/lib/common/interfaces/external/https-options.interface.js b/lib/common/interfaces/external/https-options.interface.js new file mode 100644 index 000000000..c8ad2e549 --- /dev/null +++ b/lib/common/interfaces/external/https-options.interface.js @@ -0,0 +1,2 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/lib/common/interfaces/external/multer-options.interface.d.ts b/lib/common/interfaces/external/multer-options.interface.d.ts new file mode 100644 index 000000000..eec1c1eac --- /dev/null +++ b/lib/common/interfaces/external/multer-options.interface.d.ts @@ -0,0 +1,52 @@ +/// +export interface MulterOptions { + dest?: string; + /** The storage engine to use for uploaded files. */ + storage?: any; + /** + * An object specifying the size limits of the following optional properties. This object is passed to busboy + * directly, and the details of properties can be found on https://github.com/mscdex/busboy#busboy-methods + */ + limits?: { + /** Max field name size (Default: 100 bytes) */ + fieldNameSize?: number; + /** Max field value size (Default: 1MB) */ + fieldSize?: number; + /** Max number of non- file fields (Default: Infinity) */ + fields?: number; + /** For multipart forms, the max file size (in bytes)(Default: Infinity) */ + fileSize?: number; + /** For multipart forms, the max number of file fields (Default: Infinity) */ + files?: number; + /** For multipart forms, the max number of parts (fields + files)(Default: Infinity) */ + parts?: number; + /** For multipart forms, the max number of header key=> value pairs to parse Default: 2000(same as node's http). */ + headerPairs?: number; + /** Keep the full path of files instead of just the base name (Default: false) */ + preservePath?: boolean; + }; + fileFilter?( + req: any, + file: { + /** Field name specified in the form */ + fieldname: string; + /** Name of the file on the user's computer */ + originalname: string; + /** Encoding type of the file */ + encoding: string; + /** Mime type of the file */ + mimetype: string; + /** Size of the file in bytes */ + size: number; + /** The folder to which the file has been saved (DiskStorage) */ + destination: string; + /** The name of the file within the destination (DiskStorage) */ + filename: string; + /** Location of the uploaded file (DiskStorage) */ + path: string; + /** A Buffer of the entire file (MemoryStorage) */ + buffer: Buffer; + }, + callback: (error: Error | null, acceptFile: boolean) => void, + ): void; +} diff --git a/lib/common/interfaces/external/multer-options.interface.js b/lib/common/interfaces/external/multer-options.interface.js new file mode 100644 index 000000000..c8ad2e549 --- /dev/null +++ b/lib/common/interfaces/external/multer-options.interface.js @@ -0,0 +1,2 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/lib/common/interfaces/external/serve-static-options.interface.d.ts b/lib/common/interfaces/external/serve-static-options.interface.d.ts new file mode 100644 index 000000000..593713db5 --- /dev/null +++ b/lib/common/interfaces/external/serve-static-options.interface.d.ts @@ -0,0 +1,57 @@ +export interface ServeStaticOptions { + /** + * Set how "dotfiles" are treated when encountered. A dotfile is a file or directory that begins with a dot ("."). + * Note this check is done on the path itself without checking if the path actually exists on the disk. + * If root is specified, only the dotfiles above the root are checked (i.e. the root itself can be within a dotfile when when set to "deny"). + * The default value is 'ignore'. + * 'allow' No special treatment for dotfiles + * 'deny' Send a 403 for any request for a dotfile + * 'ignore' Pretend like the dotfile does not exist and call next() + */ + dotfiles?: string; + /** + * Enable or disable etag generation, defaults to true. + */ + etag?: boolean; + /** + * Set file extension fallbacks. When set, if a file is not found, the given extensions will be added to the file name and search for. + * The first that exists will be served. Example: ['html', 'htm']. + * The default value is false. + */ + extensions?: string[]; + /** + * Let client errors fall-through as unhandled requests, otherwise forward a client error. + * The default value is false. + */ + fallthrough?: boolean; + /** + * Enable or disable the immutable directive in the Cache-Control response header. + * If enabled, the maxAge option should also be specified to enable caching. The immutable directive will prevent supported clients from making conditional requests during the life of the maxAge option to check if the file has changed. + */ + immutable?: boolean; + /** + * By default this module will send "index.html" files in response to a request on a directory. + * To disable this set false or to supply a new index pass a string or an array in preferred order. + */ + index?: boolean | string | string[]; + /** + * Enable or disable Last-Modified header, defaults to true. Uses the file system's last modified value. + */ + lastModified?: boolean; + /** + * Provide a max-age in milliseconds for http caching, defaults to 0. This can also be a string accepted by the ms module. + */ + maxAge?: number | string; + /** + * Redirect to trailing "/" when the pathname is a dir. Defaults to true. + */ + redirect?: boolean; + /** + * Function to set custom headers on response. Alterations to the headers need to occur synchronously. + * The function is called as fn(res, path, stat), where the arguments are: + * res the response object + * path the file path that is being sent + * stat the stat object of the file that is being sent + */ + setHeaders?: (res, path: string, stat: any) => any; +} diff --git a/lib/common/interfaces/external/serve-static-options.interface.js b/lib/common/interfaces/external/serve-static-options.interface.js new file mode 100644 index 000000000..bc3f9336b --- /dev/null +++ b/lib/common/interfaces/external/serve-static-options.interface.js @@ -0,0 +1,3 @@ +"use strict"; +/// Reference: https://www.npmjs.com/package/@types/serve-static +Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/lib/common/interfaces/features/arguments-host.interface.d.ts b/lib/common/interfaces/features/arguments-host.interface.d.ts new file mode 100644 index 000000000..cd0038423 --- /dev/null +++ b/lib/common/interfaces/features/arguments-host.interface.d.ts @@ -0,0 +1,18 @@ +export interface HttpArgumentsHost { + getRequest(): T; + getResponse(): T; +} +export interface WsArgumentsHost { + getData(): T; + getClient(): T; +} +export interface RpcArgumentsHost { + getData(): T; +} +export interface ArgumentsHost { + getArgs = any[]>(): T; + getArgByIndex(index: number): T; + switchToRpc(): RpcArgumentsHost; + switchToHttp(): HttpArgumentsHost; + switchToWs(): WsArgumentsHost; +} diff --git a/lib/common/interfaces/features/arguments-host.interface.js b/lib/common/interfaces/features/arguments-host.interface.js new file mode 100644 index 000000000..c8ad2e549 --- /dev/null +++ b/lib/common/interfaces/features/arguments-host.interface.js @@ -0,0 +1,2 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/lib/common/interfaces/features/can-activate.interface.d.ts b/lib/common/interfaces/features/can-activate.interface.d.ts new file mode 100644 index 000000000..12bf4903f --- /dev/null +++ b/lib/common/interfaces/features/can-activate.interface.d.ts @@ -0,0 +1,7 @@ +import { Observable } from 'rxjs/Observable'; +import { ExecutionContext } from './execution-context.interface'; +export interface CanActivate { + canActivate( + context: ExecutionContext, + ): boolean | Promise | Observable; +} diff --git a/lib/common/interfaces/features/can-activate.interface.js b/lib/common/interfaces/features/can-activate.interface.js new file mode 100644 index 000000000..c8ad2e549 --- /dev/null +++ b/lib/common/interfaces/features/can-activate.interface.js @@ -0,0 +1,2 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/lib/common/interfaces/features/custom-route-param-factory.interface.d.ts b/lib/common/interfaces/features/custom-route-param-factory.interface.d.ts new file mode 100644 index 000000000..c5580392b --- /dev/null +++ b/lib/common/interfaces/features/custom-route-param-factory.interface.d.ts @@ -0,0 +1 @@ +export declare type CustomParamFactory = (data, req) => any; diff --git a/lib/common/interfaces/features/custom-route-param-factory.interface.js b/lib/common/interfaces/features/custom-route-param-factory.interface.js new file mode 100644 index 000000000..c8ad2e549 --- /dev/null +++ b/lib/common/interfaces/features/custom-route-param-factory.interface.js @@ -0,0 +1,2 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/lib/common/interfaces/features/execution-context.interface.d.ts b/lib/common/interfaces/features/execution-context.interface.d.ts new file mode 100644 index 000000000..3a92574a4 --- /dev/null +++ b/lib/common/interfaces/features/execution-context.interface.d.ts @@ -0,0 +1,6 @@ +import { Type } from './../index'; +import { ArgumentsHost } from './arguments-host.interface'; +export interface ExecutionContext extends ArgumentsHost { + getClass(): Type; + getHandler(): Function; +} diff --git a/lib/common/interfaces/features/execution-context.interface.js b/lib/common/interfaces/features/execution-context.interface.js new file mode 100644 index 000000000..c8ad2e549 --- /dev/null +++ b/lib/common/interfaces/features/execution-context.interface.js @@ -0,0 +1,2 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/lib/common/interfaces/features/nest-interceptor.interface.d.ts b/lib/common/interfaces/features/nest-interceptor.interface.d.ts new file mode 100644 index 000000000..9701e59e0 --- /dev/null +++ b/lib/common/interfaces/features/nest-interceptor.interface.d.ts @@ -0,0 +1,8 @@ +import { Observable } from 'rxjs/Observable'; +import { ExecutionContext } from './execution-context.interface'; +export interface NestInterceptor { + intercept( + context: ExecutionContext, + stream$: Observable, + ): Observable | Promise>; +} diff --git a/lib/common/interfaces/features/nest-interceptor.interface.js b/lib/common/interfaces/features/nest-interceptor.interface.js new file mode 100644 index 000000000..c8ad2e549 --- /dev/null +++ b/lib/common/interfaces/features/nest-interceptor.interface.js @@ -0,0 +1,2 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/lib/common/interfaces/features/paramtype.interface.d.ts b/lib/common/interfaces/features/paramtype.interface.d.ts new file mode 100644 index 000000000..8c3e7767e --- /dev/null +++ b/lib/common/interfaces/features/paramtype.interface.d.ts @@ -0,0 +1 @@ +export declare type Paramtype = 'body' | 'query' | 'param' | 'custom'; diff --git a/lib/common/interfaces/features/paramtype.interface.js b/lib/common/interfaces/features/paramtype.interface.js new file mode 100644 index 000000000..c8ad2e549 --- /dev/null +++ b/lib/common/interfaces/features/paramtype.interface.js @@ -0,0 +1,2 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/lib/common/interfaces/features/pipe-transform.interface.d.ts b/lib/common/interfaces/features/pipe-transform.interface.d.ts new file mode 100644 index 000000000..1ea1599bb --- /dev/null +++ b/lib/common/interfaces/features/pipe-transform.interface.d.ts @@ -0,0 +1,13 @@ +import { Paramtype } from './paramtype.interface'; +export declare type Transform = ( + value: T, + metadata: ArgumentMetadata, +) => any; +export interface ArgumentMetadata { + type: Paramtype; + metatype?: new (...args) => any; + data?: string; +} +export interface PipeTransform { + transform(value: T, metadata: ArgumentMetadata): R; +} diff --git a/lib/common/interfaces/features/pipe-transform.interface.js b/lib/common/interfaces/features/pipe-transform.interface.js new file mode 100644 index 000000000..c8ad2e549 --- /dev/null +++ b/lib/common/interfaces/features/pipe-transform.interface.js @@ -0,0 +1,2 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/lib/common/interfaces/http/http-server-factory.interface.d.ts b/lib/common/interfaces/http/http-server-factory.interface.d.ts new file mode 100644 index 000000000..176fb6d06 --- /dev/null +++ b/lib/common/interfaces/http/http-server-factory.interface.d.ts @@ -0,0 +1,3 @@ +export interface HttpServerFactory { + createServer(Function: any): any; +} diff --git a/lib/common/interfaces/http/http-server-factory.interface.js b/lib/common/interfaces/http/http-server-factory.interface.js new file mode 100644 index 000000000..c8ad2e549 --- /dev/null +++ b/lib/common/interfaces/http/http-server-factory.interface.js @@ -0,0 +1,2 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/lib/common/interfaces/http/http-server.interface.d.ts b/lib/common/interfaces/http/http-server.interface.d.ts new file mode 100644 index 000000000..e9d08f5eb --- /dev/null +++ b/lib/common/interfaces/http/http-server.interface.d.ts @@ -0,0 +1,48 @@ +/// +import { IncomingMessage, ServerResponse } from 'http'; +export interface ErrorHandler { + ( + error: any, + req: Partial, + res: ServerResponse | any, + next?: Function, + ): any; +} +export interface RequestHandler { + ( + req: Partial, + res: ServerResponse | any, + next?: Function, + ): any; +} +export interface HttpServer { + use(handler: RequestHandler | ErrorHandler): any; + use(path: any, handler: RequestHandler | ErrorHandler): any; + get(handler: RequestHandler): any; + get(path: any, handler: RequestHandler): any; + post(handler: RequestHandler): any; + post(path: any, handler: RequestHandler): any; + head(handler: RequestHandler): any; + head(path: any, handler: RequestHandler): any; + delete(handler: RequestHandler): any; + delete(path: any, handler: RequestHandler): any; + put(handler: RequestHandler): any; + put(path: any, handler: RequestHandler): any; + patch(handler: RequestHandler): any; + patch(path: any, handler: RequestHandler): any; + options(handler: RequestHandler): any; + options(path: any, handler: RequestHandler): any; + listen(port: number | string, callback?: () => void): any; + listen(port: number | string, hostname: string, callback?: () => void): any; + reply(response: any, body: any, statusCode: number): any; + render(response: any, view: string, options: any): any; + setErrorHandler?(handler: Function): any; + setNotFoundHandler?(handler: Function): any; + useStaticAssets?(...args: any[]): this; + setBaseViewsDir?(path: string): this; + setViewEngine?(engineOrOptions: any): this; + getRequestMethod?(request: any): string; + getRequestUrl?(request: any): string; + getHttpServer(): any; + close(): any; +} diff --git a/lib/common/interfaces/http/http-server.interface.js b/lib/common/interfaces/http/http-server.interface.js new file mode 100644 index 000000000..c8ad2e549 --- /dev/null +++ b/lib/common/interfaces/http/http-server.interface.js @@ -0,0 +1,2 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/lib/common/interfaces/index.d.ts b/lib/common/interfaces/index.d.ts new file mode 100644 index 000000000..8159ade13 --- /dev/null +++ b/lib/common/interfaces/index.d.ts @@ -0,0 +1,30 @@ +export * from './request-mapping-metadata.interface'; +export * from './modules/nest-module.interface'; +export * from './modules/module-metadata.interface'; +export * from './controllers/controller.interface'; +export * from './injectable.interface'; +export * from './controllers/controller-metadata.interface'; +export * from './modules/module-metadata.interface'; +export * from './type.interface'; +export * from './nest-application.interface'; +export * from './nest-microservice.interface'; +export * from './nest-application-context.interface'; +export * from './modules/on-init.interface'; +export * from './modules/on-destroy.interface'; +export * from './exceptions/exception-filter.interface'; +export * from './middlewares'; +export * from './websockets/web-socket-adapter.interface'; +export * from './features/pipe-transform.interface'; +export * from './features/paramtype.interface'; +export * from './features/can-activate.interface'; +export * from './exceptions/rpc-exception-filter.interface'; +export * from './exceptions/ws-exception-filter.interface'; +export * from './features/execution-context.interface'; +export * from './features/nest-interceptor.interface'; +export * from './features/custom-route-param-factory.interface'; +export * from './modules/dynamic-module.interface'; +export * from './http/http-server.interface'; +export * from './http/http-server-factory.interface'; +export * from './features/arguments-host.interface'; +export * from './nest-express-application.interface'; +export * from './nest-fastify-application.interface'; diff --git a/lib/common/interfaces/index.js b/lib/common/interfaces/index.js new file mode 100644 index 000000000..c8ad2e549 --- /dev/null +++ b/lib/common/interfaces/index.js @@ -0,0 +1,2 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/lib/common/interfaces/injectable.interface.d.ts b/lib/common/interfaces/injectable.interface.d.ts new file mode 100644 index 000000000..a9e2b48fa --- /dev/null +++ b/lib/common/interfaces/injectable.interface.d.ts @@ -0,0 +1 @@ +export interface Injectable {} diff --git a/lib/common/interfaces/injectable.interface.js b/lib/common/interfaces/injectable.interface.js new file mode 100644 index 000000000..c8ad2e549 --- /dev/null +++ b/lib/common/interfaces/injectable.interface.js @@ -0,0 +1,2 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/lib/common/interfaces/microservices/client-metadata.interface.d.ts b/lib/common/interfaces/microservices/client-metadata.interface.d.ts new file mode 100644 index 000000000..9af8d6678 --- /dev/null +++ b/lib/common/interfaces/microservices/client-metadata.interface.d.ts @@ -0,0 +1,20 @@ +import { Transport } from './../../enums/transport.enum'; +import { + RedisOptions, + NatsOptions, + MqttOptions, + GrpcOptions, +} from './microservice-configuration.interface'; +export interface ClientOptions { + transport?: Transport; + options?: + | TcpClientOptions + | RedisOptions + | NatsOptions + | MqttOptions + | GrpcOptions; +} +export interface TcpClientOptions { + host?: string; + port?: number; +} diff --git a/lib/common/interfaces/microservices/client-metadata.interface.js b/lib/common/interfaces/microservices/client-metadata.interface.js new file mode 100644 index 000000000..c8ad2e549 --- /dev/null +++ b/lib/common/interfaces/microservices/client-metadata.interface.js @@ -0,0 +1,2 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/lib/common/interfaces/microservices/custom-transport-strategy.interface.d.ts b/lib/common/interfaces/microservices/custom-transport-strategy.interface.d.ts new file mode 100644 index 000000000..15072dab2 --- /dev/null +++ b/lib/common/interfaces/microservices/custom-transport-strategy.interface.d.ts @@ -0,0 +1,4 @@ +export interface CustomTransportStrategy { + listen(callback: () => void): any; + close(): any; +} diff --git a/lib/common/interfaces/microservices/custom-transport-strategy.interface.js b/lib/common/interfaces/microservices/custom-transport-strategy.interface.js new file mode 100644 index 000000000..c8ad2e549 --- /dev/null +++ b/lib/common/interfaces/microservices/custom-transport-strategy.interface.js @@ -0,0 +1,2 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/lib/common/interfaces/microservices/microservice-configuration.interface.d.ts b/lib/common/interfaces/microservices/microservice-configuration.interface.d.ts new file mode 100644 index 000000000..6998d0dae --- /dev/null +++ b/lib/common/interfaces/microservices/microservice-configuration.interface.d.ts @@ -0,0 +1,59 @@ +import { Transport } from '../../enums/transport.enum'; +import { CustomTransportStrategy } from './custom-transport-strategy.interface'; +import { IClientOptions } from 'mqtt'; +import { ServerCredentials } from 'grpc'; +export declare type MicroserviceOptions = + | GrpcOptions + | TcpOptions + | RedisOptions + | NatsOptions + | MqttOptions + | CustomStrategy; +export interface CustomStrategy { + strategy?: CustomTransportStrategy; + options?: {}; +} +export interface GrpcOptions { + transport?: Transport.GRPC; + options: { + url?: string; + credentials?: ServerCredentials; + protoPath: string; + package: string; + }; +} +export interface TcpOptions { + transport?: Transport.TCP; + options?: { + host?: string; + port?: number; + retryAttempts?: number; + retryDelay?: number; + }; +} +export interface RedisOptions { + transport?: Transport.REDIS; + options?: { + url?: string; + retryAttempts?: number; + retryDelay?: number; + }; +} +export interface MqttOptions { + transport?: Transport.MQTT; + options?: IClientOptions & { + url?: string; + }; +} +export interface NatsOptions { + transport?: Transport.NATS; + options?: { + url?: string; + name?: string; + pass?: string; + maxReconnectAttempts?: number; + reconnectTimeWait?: number; + servers?: string[]; + tls?: any; + }; +} diff --git a/lib/common/interfaces/microservices/microservice-configuration.interface.js b/lib/common/interfaces/microservices/microservice-configuration.interface.js new file mode 100644 index 000000000..c8ad2e549 --- /dev/null +++ b/lib/common/interfaces/microservices/microservice-configuration.interface.js @@ -0,0 +1,2 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/lib/common/interfaces/microservices/nest-microservice-options.interface.d.ts b/lib/common/interfaces/microservices/nest-microservice-options.interface.d.ts new file mode 100644 index 000000000..540cad6ff --- /dev/null +++ b/lib/common/interfaces/microservices/nest-microservice-options.interface.d.ts @@ -0,0 +1,3 @@ +import { NestApplicationContextOptions } from '../nest-application-context-options.interface'; +export interface NestMicroserviceOptions + extends NestApplicationContextOptions {} diff --git a/lib/common/interfaces/microservices/nest-microservice-options.interface.js b/lib/common/interfaces/microservices/nest-microservice-options.interface.js new file mode 100644 index 000000000..c8ad2e549 --- /dev/null +++ b/lib/common/interfaces/microservices/nest-microservice-options.interface.js @@ -0,0 +1,2 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/lib/common/interfaces/middlewares/index.d.ts b/lib/common/interfaces/middlewares/index.d.ts new file mode 100644 index 000000000..71b6c501a --- /dev/null +++ b/lib/common/interfaces/middlewares/index.d.ts @@ -0,0 +1,5 @@ +export * from './middleware-config-proxy.interface'; +export * from './middlewares-consumer.interface'; +export * from './middleware-configuration.interface'; +export * from './nest-middleware.interface'; +export * from './middleware.interface'; diff --git a/lib/common/interfaces/middlewares/index.js b/lib/common/interfaces/middlewares/index.js new file mode 100644 index 000000000..c8ad2e549 --- /dev/null +++ b/lib/common/interfaces/middlewares/index.js @@ -0,0 +1,2 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/lib/common/interfaces/middlewares/middleware-config-proxy.interface.d.ts b/lib/common/interfaces/middlewares/middleware-config-proxy.interface.d.ts new file mode 100644 index 000000000..27eea95e5 --- /dev/null +++ b/lib/common/interfaces/middlewares/middleware-config-proxy.interface.d.ts @@ -0,0 +1,19 @@ +import { MiddlewaresConsumer } from './middlewares-consumer.interface'; +import { Type } from '../type.interface'; +export interface MiddlewareConfigProxy { + /** + * Passes custom arguments to `resolve()` method of the middleware + * + * @param {} ...data + * @returns MiddlewareConfigProxy + */ + with(...data: any[]): MiddlewareConfigProxy; + /** + * Attaches passed either routes (strings) or controllers to the processed middleware(s). + * When you pass Controller class, Nest will attach middleware to every HTTP route handler inside this controller. + * + * @param {} ...routes + * @returns MiddlewaresConsumer + */ + forRoutes(...routes: (string | Type)[]): MiddlewaresConsumer; +} diff --git a/lib/common/interfaces/middlewares/middleware-config-proxy.interface.js b/lib/common/interfaces/middlewares/middleware-config-proxy.interface.js new file mode 100644 index 000000000..c8ad2e549 --- /dev/null +++ b/lib/common/interfaces/middlewares/middleware-config-proxy.interface.js @@ -0,0 +1,2 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/lib/common/interfaces/middlewares/middleware-configuration.interface.d.ts b/lib/common/interfaces/middlewares/middleware-configuration.interface.d.ts new file mode 100644 index 000000000..faab1da15 --- /dev/null +++ b/lib/common/interfaces/middlewares/middleware-configuration.interface.d.ts @@ -0,0 +1,5 @@ +import { Type } from './../type.interface'; +export interface MiddlewareConfiguration { + middlewares: any; + forRoutes: (Type | string)[]; +} diff --git a/lib/common/interfaces/middlewares/middleware-configuration.interface.js b/lib/common/interfaces/middlewares/middleware-configuration.interface.js new file mode 100644 index 000000000..c8ad2e549 --- /dev/null +++ b/lib/common/interfaces/middlewares/middleware-configuration.interface.js @@ -0,0 +1,2 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/lib/common/interfaces/middlewares/middleware.interface.d.ts b/lib/common/interfaces/middlewares/middleware.interface.d.ts new file mode 100644 index 000000000..843380ae2 --- /dev/null +++ b/lib/common/interfaces/middlewares/middleware.interface.d.ts @@ -0,0 +1 @@ +export declare type FunctionMiddleware = (req?, res?, next?) => any; diff --git a/lib/common/interfaces/middlewares/middleware.interface.js b/lib/common/interfaces/middlewares/middleware.interface.js new file mode 100644 index 000000000..c8ad2e549 --- /dev/null +++ b/lib/common/interfaces/middlewares/middleware.interface.js @@ -0,0 +1,2 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/lib/common/interfaces/middlewares/middlewares-consumer.interface.d.ts b/lib/common/interfaces/middlewares/middlewares-consumer.interface.d.ts new file mode 100644 index 000000000..5ec112ba8 --- /dev/null +++ b/lib/common/interfaces/middlewares/middlewares-consumer.interface.d.ts @@ -0,0 +1,11 @@ +import { MiddlewareConfigProxy } from './middleware-config-proxy.interface'; +export interface MiddlewaresConsumer { + /** + * Takes single middleware class or array of classes + * that subsequently could be attached to the passed either routes or controllers. + * + * @param {any|any[]} middlewares + * @returns MiddlewareConfigProxy + */ + apply(middlewares: any | any[]): MiddlewareConfigProxy; +} diff --git a/lib/common/interfaces/middlewares/middlewares-consumer.interface.js b/lib/common/interfaces/middlewares/middlewares-consumer.interface.js new file mode 100644 index 000000000..c8ad2e549 --- /dev/null +++ b/lib/common/interfaces/middlewares/middlewares-consumer.interface.js @@ -0,0 +1,2 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/lib/common/interfaces/middlewares/nest-middleware.interface.d.ts b/lib/common/interfaces/middlewares/nest-middleware.interface.d.ts new file mode 100644 index 000000000..f6c9956ab --- /dev/null +++ b/lib/common/interfaces/middlewares/nest-middleware.interface.d.ts @@ -0,0 +1,4 @@ +export declare type MiddlewareFunction = (req, res, next) => any | Promise; +export interface NestMiddleware { + resolve(...args: any[]): MiddlewareFunction | Promise; +} diff --git a/lib/common/interfaces/middlewares/nest-middleware.interface.js b/lib/common/interfaces/middlewares/nest-middleware.interface.js new file mode 100644 index 000000000..c8ad2e549 --- /dev/null +++ b/lib/common/interfaces/middlewares/nest-middleware.interface.js @@ -0,0 +1,2 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/lib/common/interfaces/modules/dynamic-module.interface.d.ts b/lib/common/interfaces/modules/dynamic-module.interface.d.ts new file mode 100644 index 000000000..d1e806216 --- /dev/null +++ b/lib/common/interfaces/modules/dynamic-module.interface.d.ts @@ -0,0 +1,5 @@ +import { ModuleMetadata } from './module-metadata.interface'; +import { Type } from '../type.interface'; +export interface DynamicModule extends ModuleMetadata { + module: Type; +} diff --git a/lib/common/interfaces/modules/dynamic-module.interface.js b/lib/common/interfaces/modules/dynamic-module.interface.js new file mode 100644 index 000000000..c8ad2e549 --- /dev/null +++ b/lib/common/interfaces/modules/dynamic-module.interface.js @@ -0,0 +1,2 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/lib/common/interfaces/modules/index.d.ts b/lib/common/interfaces/modules/index.d.ts new file mode 100644 index 000000000..5d116192f --- /dev/null +++ b/lib/common/interfaces/modules/index.d.ts @@ -0,0 +1,4 @@ +export * from './module-metadata.interface'; +export * from './nest-module.interface'; +export * from './on-init.interface'; +export * from './dynamic-module.interface'; diff --git a/lib/common/interfaces/modules/index.js b/lib/common/interfaces/modules/index.js new file mode 100644 index 000000000..c8ad2e549 --- /dev/null +++ b/lib/common/interfaces/modules/index.js @@ -0,0 +1,2 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/lib/common/interfaces/modules/module-metadata.interface.d.ts b/lib/common/interfaces/modules/module-metadata.interface.d.ts new file mode 100644 index 000000000..c06ce90c9 --- /dev/null +++ b/lib/common/interfaces/modules/module-metadata.interface.d.ts @@ -0,0 +1,11 @@ +import { DynamicModule } from './dynamic-module.interface'; +import { Type } from '../type.interface'; +import { Provider } from './provider.interface'; +export interface ModuleMetadata { + imports?: Array | DynamicModule | any[]>; + controllers?: Type[]; + providers?: Provider[]; + exports?: Array; + modules?: Array | DynamicModule | any[]>; + components?: Provider[]; +} diff --git a/lib/common/interfaces/modules/module-metadata.interface.js b/lib/common/interfaces/modules/module-metadata.interface.js new file mode 100644 index 000000000..c8ad2e549 --- /dev/null +++ b/lib/common/interfaces/modules/module-metadata.interface.js @@ -0,0 +1,2 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/lib/common/interfaces/modules/nest-module.interface.d.ts b/lib/common/interfaces/modules/nest-module.interface.d.ts new file mode 100644 index 000000000..13c0747ab --- /dev/null +++ b/lib/common/interfaces/modules/nest-module.interface.d.ts @@ -0,0 +1,4 @@ +import { MiddlewaresConsumer } from '../middlewares/middlewares-consumer.interface'; +export interface NestModule { + configure(consumer: MiddlewaresConsumer): MiddlewaresConsumer | void; +} diff --git a/lib/common/interfaces/modules/nest-module.interface.js b/lib/common/interfaces/modules/nest-module.interface.js new file mode 100644 index 000000000..c8ad2e549 --- /dev/null +++ b/lib/common/interfaces/modules/nest-module.interface.js @@ -0,0 +1,2 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/lib/common/interfaces/modules/on-destroy.interface.d.ts b/lib/common/interfaces/modules/on-destroy.interface.d.ts new file mode 100644 index 000000000..d778b2b9c --- /dev/null +++ b/lib/common/interfaces/modules/on-destroy.interface.d.ts @@ -0,0 +1,3 @@ +export interface OnModuleDestroy { + onModuleDestroy(): any; +} diff --git a/lib/common/interfaces/modules/on-destroy.interface.js b/lib/common/interfaces/modules/on-destroy.interface.js new file mode 100644 index 000000000..c8ad2e549 --- /dev/null +++ b/lib/common/interfaces/modules/on-destroy.interface.js @@ -0,0 +1,2 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/lib/common/interfaces/modules/on-init.interface.d.ts b/lib/common/interfaces/modules/on-init.interface.d.ts new file mode 100644 index 000000000..a59b767e9 --- /dev/null +++ b/lib/common/interfaces/modules/on-init.interface.d.ts @@ -0,0 +1,3 @@ +export interface OnModuleInit { + onModuleInit(): any; +} diff --git a/lib/common/interfaces/modules/on-init.interface.js b/lib/common/interfaces/modules/on-init.interface.js new file mode 100644 index 000000000..c8ad2e549 --- /dev/null +++ b/lib/common/interfaces/modules/on-init.interface.js @@ -0,0 +1,2 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/lib/common/interfaces/modules/provider.interface.d.ts b/lib/common/interfaces/modules/provider.interface.d.ts new file mode 100644 index 000000000..6abf09a1e --- /dev/null +++ b/lib/common/interfaces/modules/provider.interface.d.ts @@ -0,0 +1,19 @@ +import { Type } from './../type.interface'; +export declare type Provider = + | Type + | ClassProvider + | ValueProvider + | FactoryProvider; +export interface ClassProvider { + provide: any; + useClass: Type; +} +export interface ValueProvider { + provide: any; + useValue: any; +} +export interface FactoryProvider { + provide: any; + useFactory: (...args: any[]) => any; + inject?: Array | string | any>; +} diff --git a/lib/common/interfaces/modules/provider.interface.js b/lib/common/interfaces/modules/provider.interface.js new file mode 100644 index 000000000..c8ad2e549 --- /dev/null +++ b/lib/common/interfaces/modules/provider.interface.js @@ -0,0 +1,2 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/lib/common/interfaces/nest-application-context-options.interface.d.ts b/lib/common/interfaces/nest-application-context-options.interface.d.ts new file mode 100644 index 000000000..a4d219bb8 --- /dev/null +++ b/lib/common/interfaces/nest-application-context-options.interface.d.ts @@ -0,0 +1,4 @@ +import { LoggerService } from '../services/logger.service'; +export declare class NestApplicationContextOptions { + logger?: LoggerService; +} diff --git a/lib/common/interfaces/nest-application-context-options.interface.js b/lib/common/interfaces/nest-application-context-options.interface.js new file mode 100644 index 000000000..165c699e3 --- /dev/null +++ b/lib/common/interfaces/nest-application-context-options.interface.js @@ -0,0 +1,5 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +class NestApplicationContextOptions { +} +exports.NestApplicationContextOptions = NestApplicationContextOptions; diff --git a/lib/common/interfaces/nest-application-context.interface.d.ts b/lib/common/interfaces/nest-application-context.interface.d.ts new file mode 100644 index 000000000..6b3e2a19d --- /dev/null +++ b/lib/common/interfaces/nest-application-context.interface.d.ts @@ -0,0 +1,18 @@ +import { Type } from './type.interface'; +export interface INestApplicationContext { + /** + * Allows navigating through the modules tree, for example, to pull out a specific instance from the selected module. + * @returns INestApplicationContext + */ + select(module: Type): INestApplicationContext; + /** + * Retrieves an instance of either injectable or controller available inside the processed module, otherwise, returns null. + * @returns T + */ + get(typeOrToken: Type | string | symbol): T | null; + /** + * Retrieves an instance of either injectable or controller available inside any module, otherwise, returns null. + * @returns T + */ + find(typeOrToken: Type | string | symbol): T | null; +} diff --git a/lib/common/interfaces/nest-application-context.interface.js b/lib/common/interfaces/nest-application-context.interface.js new file mode 100644 index 000000000..c8ad2e549 --- /dev/null +++ b/lib/common/interfaces/nest-application-context.interface.js @@ -0,0 +1,2 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/lib/common/interfaces/nest-application-options.interface.d.ts b/lib/common/interfaces/nest-application-options.interface.d.ts new file mode 100644 index 000000000..e980bff76 --- /dev/null +++ b/lib/common/interfaces/nest-application-options.interface.d.ts @@ -0,0 +1,8 @@ +import { HttpsOptions } from './external/https-options.interface'; +import { NestApplicationContextOptions } from './nest-application-context-options.interface'; +import { CorsOptions } from './external/cors-options.interface'; +export interface NestApplicationOptions extends NestApplicationContextOptions { + cors?: boolean | CorsOptions; + bodyParser?: boolean; + httpsOptions?: HttpsOptions; +} diff --git a/lib/common/interfaces/nest-application-options.interface.js b/lib/common/interfaces/nest-application-options.interface.js new file mode 100644 index 000000000..c8ad2e549 --- /dev/null +++ b/lib/common/interfaces/nest-application-options.interface.js @@ -0,0 +1,2 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/lib/common/interfaces/nest-application.interface.d.ts b/lib/common/interfaces/nest-application.interface.d.ts new file mode 100644 index 000000000..e32fb8508 --- /dev/null +++ b/lib/common/interfaces/nest-application.interface.d.ts @@ -0,0 +1,127 @@ +import { INestMicroservice, ExceptionFilter, PipeTransform } from './index'; +import { WebSocketAdapter } from './websockets/web-socket-adapter.interface'; +import { CanActivate } from './features/can-activate.interface'; +import { NestInterceptor } from './features/nest-interceptor.interface'; +import { INestApplicationContext } from './nest-application-context.interface'; +import { CorsOptions } from './external/cors-options.interface'; +import { MicroserviceOptions } from './microservices/microservice-configuration.interface'; +export interface INestApplication extends INestApplicationContext { + /** + * Initializes application. It is not mandatory to call this method directly. + * + * @returns Promise + */ + init(): Promise; + /** + * A wrapper function around HTTP adapter method: `adapter.use()`. + * Example `app.use(cors())` + * + * @returns void + */ + use(...args: any[]): this; + /** + * Enables CORS (Cross-Origin Resource Sharing) + * + * @returns void + */ + enableCors(options?: CorsOptions): this; + /** + * Starts the application. + * + * @param {number} port + * @param {string} hostname + * @param {Function} callback Optional callback + * @returns Promise + */ + listen(port: number | string, callback?: () => void): Promise; + listen( + port: number | string, + hostname: string, + callback?: () => void, + ): Promise; + /** + * Starts the application and can be awaited. + * + * @param {number} port + * @param {string} hostname (optional) + * @returns Promise + */ + listenAsync(port: number | string, hostname?: string): Promise; + /** + * Setups the prefix for the every HTTP route path + * + * @param {string} prefix The prefix for the every HTTP route path (for example `/v1/api`) + * @returns void + */ + setGlobalPrefix(prefix: string): this; + /** + * Setup Ws Adapter which will be used inside Gateways. + * Use, when you want to override default `socket.io` library. + * + * @param {WebSocketAdapter} adapter + * @returns void + */ + useWebSocketAdapter(adapter: WebSocketAdapter): this; + /** + * Connects microservice to the NestApplication instance. Transforms application to the hybrid instance. + * + * @param {MicroserviceOptions} options Microservice options object + * @returns INestMicroservice + */ + connectMicroservice(options: MicroserviceOptions): INestMicroservice; + /** + * Returns array of the connected microservices to the NestApplication. + * + * @returns INestMicroservice[] + */ + getMicroservices(): INestMicroservice[]; + /** + * Returns underlying, native HTTP server. + * + * @returns http.Server + */ + getHttpServer(): any; + /** + * Starts all connected microservices asynchronously + * + * @param {Function} callback Optional callback function + * @returns void + */ + startAllMicroservices(callback?: () => void): this; + /** + * Starts all connected microservices and can be awaited + * + * @returns Promise + */ + startAllMicroservicesAsync(): Promise; + /** + * Setups exception filters as a global filters (will be used within every HTTP route handler) + * + * @param {ExceptionFilter[]} ...filters + */ + useGlobalFilters(...filters: ExceptionFilter[]): this; + /** + * Setups pipes as a global pipes (will be used within every HTTP route handler) + * + * @param {PipeTransform[]} ...pipes + */ + useGlobalPipes(...pipes: PipeTransform[]): this; + /** + * Setups interceptors as a global interceptors (will be used within every HTTP route handler) + * + * @param {NestInterceptor[]} ...interceptors + */ + useGlobalInterceptors(...interceptors: NestInterceptor[]): this; + /** + * Setups guards as a global guards (will be used within every HTTP route handler) + * + * @param {CanActivate[]} ...guards + */ + useGlobalGuards(...guards: CanActivate[]): this; + /** + * Terminates the application (both NestApplication, Gateways and each connected microservice) + * + * @returns void + */ + close(): void; +} diff --git a/lib/common/interfaces/nest-application.interface.js b/lib/common/interfaces/nest-application.interface.js new file mode 100644 index 000000000..c8ad2e549 --- /dev/null +++ b/lib/common/interfaces/nest-application.interface.js @@ -0,0 +1,2 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/lib/common/interfaces/nest-express-application.interface.d.ts b/lib/common/interfaces/nest-express-application.interface.d.ts new file mode 100644 index 000000000..0e3ba5896 --- /dev/null +++ b/lib/common/interfaces/nest-express-application.interface.d.ts @@ -0,0 +1,54 @@ +import { ServeStaticOptions } from './external/serve-static-options.interface'; +export interface INestExpressApplication { + /** + * A wrapper function around native `express.set()` method. + * Example `app.set('trust proxy', 'loopback')` + * + * @returns this + */ + set(...args: any[]): this; + /** + * A wrapper function around native `express.engine()` method. + * Example `app.engine('mustache', mustacheExpress())` + * + * @returns this + */ + engine(...args: any[]): this; + /** + * A wrapper function around native `express.enable()` method. + * Example `app.enable('x-powered-by')` + * + * @returns this + */ + enable(...args: any[]): this; + /** + * A wrapper function around native `express.disable()` method. + * Example `app.disable('x-powered-by')` + * + * @returns this + */ + disable(...args: any[]): this; + /** + * Sets a base directory for public assets. + * Example `app.useStaticAssets('public') + * + * @returns this + */ + useStaticAssets(options: any): this; + useStaticAssets(path: string, options?: ServeStaticOptions): any; + useStaticAssets(pathOrOptions: any, options?: ServeStaticOptions): this; + /** + * Sets a base directory for templates (views). + * Example `app.setBaseViewsDir('views')` + * + * @returns this + */ + setBaseViewsDir(path: string): this; + /** + * Sets a view engine for templates (views). + * Example `app.setViewEngine('pug')` + * + * @returns this + */ + setViewEngine(engine: string): this; +} diff --git a/lib/common/interfaces/nest-express-application.interface.js b/lib/common/interfaces/nest-express-application.interface.js new file mode 100644 index 000000000..c8ad2e549 --- /dev/null +++ b/lib/common/interfaces/nest-express-application.interface.js @@ -0,0 +1,2 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/lib/common/interfaces/nest-fastify-application.interface.d.ts b/lib/common/interfaces/nest-fastify-application.interface.d.ts new file mode 100644 index 000000000..ad8742f25 --- /dev/null +++ b/lib/common/interfaces/nest-fastify-application.interface.d.ts @@ -0,0 +1,72 @@ +/// +export interface INestFastifyApplication { + /** + * A wrapper function around native `fastify.register()` method. + * Example `app.register(require('fastify-formbody'))` + * + * @returns this + */ + register(...args: any[]): this; + /** + * Sets a base directory for public assets. + * Example `app.useStaticAssets({ root: 'public' })` + * + * @returns this + */ + useStaticAssets(options: { + root: string; + prefix?: string; + setHeaders?: Function; + send?: any; + }): this; + /** + * Sets a view engine for templates (views), for example: `pug`, `handlebars`, or `ejs`. + * + * @returns this + */ + setViewEngine(options: any): this; + /** + * A wrapper function around native `fastify.inject()` method. + * @returns void + */ + inject(opts: HTTPInjectOptions | string): Promise; +} +/** Reference: https://github.com/fastify/fastify */ +export declare type HTTPMethod = + | 'DELETE' + | 'GET' + | 'HEAD' + | 'PATCH' + | 'POST' + | 'PUT' + | 'OPTIONS'; +/** + * Fake http inject options + */ +export interface HTTPInjectOptions { + url: string; + method?: HTTPMethod; + authority?: string; + headers?: object; + remoteAddress?: string; + payload?: string | object | Buffer | any; + simulate?: { + end?: boolean; + split?: boolean; + error?: boolean; + close?: boolean; + }; + validate?: boolean; +} +/** + * Fake http inject response + */ +export interface HTTPInjectResponse { + raw: any; + headers: object; + statusCode: number; + statusMessage: string; + payload: string; + rawPayload: Buffer; + trailers: object; +} diff --git a/lib/common/interfaces/nest-fastify-application.interface.js b/lib/common/interfaces/nest-fastify-application.interface.js new file mode 100644 index 000000000..c8ad2e549 --- /dev/null +++ b/lib/common/interfaces/nest-fastify-application.interface.js @@ -0,0 +1,2 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/lib/common/interfaces/nest-microservice.interface.d.ts b/lib/common/interfaces/nest-microservice.interface.d.ts new file mode 100644 index 000000000..475dbf2c0 --- /dev/null +++ b/lib/common/interfaces/nest-microservice.interface.d.ts @@ -0,0 +1,59 @@ +import { WebSocketAdapter } from './websockets/web-socket-adapter.interface'; +import { ExceptionFilter } from './exceptions/exception-filter.interface'; +import { PipeTransform } from './features/pipe-transform.interface'; +import { NestInterceptor } from './features/nest-interceptor.interface'; +import { CanActivate } from './features/can-activate.interface'; +import { INestApplicationContext } from './nest-application-context.interface'; +export interface INestMicroservice extends INestApplicationContext { + /** + * Starts the microservice. + * + * @param {Function} callback + * @returns Promise + */ + listen(callback: () => void): any; + /** + * Starts the microservice and can be awaited. + * + * @returns Promise + */ + listenAsync(): Promise; + /** + * Setup Ws Adapter which will be used inside Gateways. + * Use, when you want to override default `socket.io` library. + * + * @param {WebSocketAdapter} adapter + * @returns void + */ + useWebSocketAdapter(adapter: WebSocketAdapter): this; + /** + * Setups exception filters as a global filters (will be used within every message pattern handler) + * + * @param {ExceptionFilter[]} ...filters + */ + useGlobalFilters(...filters: ExceptionFilter[]): this; + /** + * Setups pipes as a global pipes (will be used within every message pattern handler) + * + * @param {PipeTransform[]} ...pipes + */ + useGlobalPipes(...pipes: PipeTransform[]): this; + /** + * Setups interceptors as a global interceptors (will be used within every message pattern handler) + * + * @param {NestInterceptor[]} ...interceptors + */ + useGlobalInterceptors(...interceptors: NestInterceptor[]): this; + /** + * Setups guards as a global guards (will be used within every message pattern handler) + * + * @param {CanActivate[]} ...guards + */ + useGlobalGuards(...guards: CanActivate[]): this; + /** + * Terminates the application (both NestMicroservice and Gateways) + * + * @returns void + */ + close(): void; +} diff --git a/lib/common/interfaces/nest-microservice.interface.js b/lib/common/interfaces/nest-microservice.interface.js new file mode 100644 index 000000000..c8ad2e549 --- /dev/null +++ b/lib/common/interfaces/nest-microservice.interface.js @@ -0,0 +1,2 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/lib/common/interfaces/request-mapping-metadata.interface.d.ts b/lib/common/interfaces/request-mapping-metadata.interface.d.ts new file mode 100644 index 000000000..ebf0ef321 --- /dev/null +++ b/lib/common/interfaces/request-mapping-metadata.interface.d.ts @@ -0,0 +1,5 @@ +import { RequestMethod } from '../enums/request-method.enum'; +export interface RequestMappingMetadata { + path?: string; + method?: RequestMethod; +} diff --git a/lib/common/interfaces/request-mapping-metadata.interface.js b/lib/common/interfaces/request-mapping-metadata.interface.js new file mode 100644 index 000000000..c8ad2e549 --- /dev/null +++ b/lib/common/interfaces/request-mapping-metadata.interface.js @@ -0,0 +1,2 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/lib/common/interfaces/type.interface.d.ts b/lib/common/interfaces/type.interface.d.ts new file mode 100644 index 000000000..3a5628f43 --- /dev/null +++ b/lib/common/interfaces/type.interface.d.ts @@ -0,0 +1,3 @@ +export interface Type extends Function { + new (...args: any[]): T; +} diff --git a/lib/common/interfaces/type.interface.js b/lib/common/interfaces/type.interface.js new file mode 100644 index 000000000..c8ad2e549 --- /dev/null +++ b/lib/common/interfaces/type.interface.js @@ -0,0 +1,2 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/lib/common/interfaces/websockets/web-socket-adapter.interface.d.ts b/lib/common/interfaces/websockets/web-socket-adapter.interface.d.ts new file mode 100644 index 000000000..000b30728 --- /dev/null +++ b/lib/common/interfaces/websockets/web-socket-adapter.interface.d.ts @@ -0,0 +1,15 @@ +import { Observable } from 'rxjs/Observable'; +export interface WebSocketAdapter { + create(port: number, options?: T): any; + bindClientConnect(server: any, callback: (...args) => void): any; + bindClientDisconnect?(client: any, callback: (...args) => void): any; + bindMessageHandlers( + client: any, + handler: { + message: any; + callback: (...args) => Observable | Promise | any; + }[], + process: (data) => Observable, + ): any; + close(server: any): any; +} diff --git a/lib/common/interfaces/websockets/web-socket-adapter.interface.js b/lib/common/interfaces/websockets/web-socket-adapter.interface.js new file mode 100644 index 000000000..c8ad2e549 --- /dev/null +++ b/lib/common/interfaces/websockets/web-socket-adapter.interface.js @@ -0,0 +1,2 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/lib/common/pipes/index.d.ts b/lib/common/pipes/index.d.ts new file mode 100644 index 000000000..001a3fc7f --- /dev/null +++ b/lib/common/pipes/index.d.ts @@ -0,0 +1,2 @@ +export * from './validation.pipe'; +export * from './parse-int.pipe'; diff --git a/lib/common/pipes/index.js b/lib/common/pipes/index.js new file mode 100644 index 000000000..c56b080c2 --- /dev/null +++ b/lib/common/pipes/index.js @@ -0,0 +1,7 @@ +"use strict"; +function __export(m) { + for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p]; +} +Object.defineProperty(exports, "__esModule", { value: true }); +__export(require("./validation.pipe")); +__export(require("./parse-int.pipe")); diff --git a/lib/common/pipes/parse-int.pipe.d.ts b/lib/common/pipes/parse-int.pipe.d.ts new file mode 100644 index 000000000..100b1fbb9 --- /dev/null +++ b/lib/common/pipes/parse-int.pipe.d.ts @@ -0,0 +1,5 @@ +import { PipeTransform } from '../interfaces/features/pipe-transform.interface'; +import { ArgumentMetadata } from '../index'; +export declare class ParseIntPipe implements PipeTransform { + transform(value: string, metadata: ArgumentMetadata): Promise; +} diff --git a/lib/common/pipes/parse-int.pipe.js b/lib/common/pipes/parse-int.pipe.js new file mode 100644 index 000000000..dd74d4ff7 --- /dev/null +++ b/lib/common/pipes/parse-int.pipe.js @@ -0,0 +1,35 @@ +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const bad_request_exception_1 = require("../exceptions/bad-request.exception"); +const index_1 = require("../index"); +let ParseIntPipe = class ParseIntPipe { + transform(value, metadata) { + return __awaiter(this, void 0, void 0, function* () { + const isNumeric = 'string' === typeof value && + !isNaN(parseFloat(value)) && + isFinite(value); + if (!isNumeric) { + throw new bad_request_exception_1.BadRequestException('Numeric string is expected'); + } + return parseInt(value, 10); + }); + } +}; +ParseIntPipe = __decorate([ + index_1.Pipe() +], ParseIntPipe); +exports.ParseIntPipe = ParseIntPipe; diff --git a/lib/common/pipes/validation.pipe.d.ts b/lib/common/pipes/validation.pipe.d.ts new file mode 100644 index 000000000..c49a36d40 --- /dev/null +++ b/lib/common/pipes/validation.pipe.d.ts @@ -0,0 +1,13 @@ +import { ValidatorOptions } from 'class-validator'; +import { PipeTransform } from '../interfaces/features/pipe-transform.interface'; +import { ArgumentMetadata } from '../index'; +export interface ValidationPipeOptions extends ValidatorOptions { + transform?: boolean; +} +export declare class ValidationPipe implements PipeTransform { + private isTransformEnabled; + private validatorOptions; + constructor(options?: ValidationPipeOptions); + transform(value: any, metadata: ArgumentMetadata): Promise; + private toValidate(metadata); +} diff --git a/lib/common/pipes/validation.pipe.js b/lib/common/pipes/validation.pipe.js new file mode 100644 index 000000000..729c0f23f --- /dev/null +++ b/lib/common/pipes/validation.pipe.js @@ -0,0 +1,72 @@ +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __rest = (this && this.__rest) || function (s, e) { + var t = {}; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) + t[p] = s[p]; + if (s != null && typeof Object.getOwnPropertySymbols === "function") + for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) if (e.indexOf(p[i]) < 0) + t[p[i]] = s[p[i]]; + return t; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const class_validator_1 = require("class-validator"); +const class_transformer_1 = require("class-transformer"); +const index_1 = require("../index"); +const shared_utils_1 = require("../utils/shared.utils"); +const component_decorator_1 = require("./../decorators/core/component.decorator"); +let ValidationPipe = class ValidationPipe { + constructor(options) { + options = options || {}; + const { transform } = options, validatorOptions = __rest(options, ["transform"]); + this.isTransformEnabled = !!transform; + this.validatorOptions = validatorOptions; + } + transform(value, metadata) { + return __awaiter(this, void 0, void 0, function* () { + const { metatype } = metadata; + if (!metatype || !this.toValidate(metadata)) { + return value; + } + const entity = class_transformer_1.plainToClass(metatype, value); + const errors = yield class_validator_1.validate(entity, this.validatorOptions); + if (errors.length > 0) { + throw new index_1.BadRequestException(errors); + } + return this.isTransformEnabled + ? entity + : Object.keys(this.validatorOptions).length > 0 + ? class_transformer_1.classToPlain(entity) + : value; + }); + } + toValidate(metadata) { + const { metatype, type } = metadata; + if (type === 'custom') { + return false; + } + const types = [String, Boolean, Number, Array, Object]; + return !types.find(type => metatype === type) && !shared_utils_1.isNil(metatype); + } +}; +ValidationPipe = __decorate([ + component_decorator_1.Pipe(), + __metadata("design:paramtypes", [Object]) +], ValidationPipe); +exports.ValidationPipe = ValidationPipe; diff --git a/lib/common/services/logger.service.d.ts b/lib/common/services/logger.service.d.ts new file mode 100644 index 000000000..3ce8df0fb --- /dev/null +++ b/lib/common/services/logger.service.d.ts @@ -0,0 +1,39 @@ +import { NestEnvironment } from '../enums/nest-environment.enum'; +export interface LoggerService { + log(message: string): void; + error(message: string, trace: string): void; + warn(message: string): void; +} +export declare class Logger implements LoggerService { + private readonly context; + private readonly isTimeDiffEnabled; + private static prevTimestamp; + private static contextEnv; + private static logger; + private static readonly yellow; + constructor(context: string, isTimeDiffEnabled?: boolean); + log(message: string): void; + error(message: string, trace?: string): void; + warn(message: string): void; + static overrideLogger(logger: LoggerService): void; + static setMode(mode: NestEnvironment): void; + static log( + message: string, + context?: string, + isTimeDiffEnabled?: boolean, + ): void; + static error( + message: string, + trace?: string, + context?: string, + isTimeDiffEnabled?: boolean, + ): void; + static warn( + message: string, + context?: string, + isTimeDiffEnabled?: boolean, + ): void; + private static printMessage(message, color, context?, isTimeDiffEnabled?); + private static printTimestamp(isTimeDiffEnabled?); + private static printStackTrace(trace); +} diff --git a/lib/common/services/logger.service.js b/lib/common/services/logger.service.js new file mode 100644 index 000000000..38e71e683 --- /dev/null +++ b/lib/common/services/logger.service.js @@ -0,0 +1,66 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const clc = require("cli-color"); +const nest_environment_enum_1 = require("../enums/nest-environment.enum"); +class Logger { + constructor(context, isTimeDiffEnabled = false) { + this.context = context; + this.isTimeDiffEnabled = isTimeDiffEnabled; + } + log(message) { + const { logger } = Logger; + logger.log.call(logger, message, this.context, this.isTimeDiffEnabled); + } + error(message, trace = '') { + const { logger } = Logger; + logger.error.call(logger, message, trace, this.context, this.isTimeDiffEnabled); + } + warn(message) { + const { logger } = Logger; + logger.warn.call(logger, message, this.context, this.isTimeDiffEnabled); + } + static overrideLogger(logger) { + this.logger = logger; + } + static setMode(mode) { + this.contextEnv = mode; + } + static log(message, context = '', isTimeDiffEnabled = true) { + this.printMessage(message, clc.green, context, isTimeDiffEnabled); + } + static error(message, trace = '', context = '', isTimeDiffEnabled = true) { + this.printMessage(message, clc.red, context, isTimeDiffEnabled); + this.printStackTrace(trace); + } + static warn(message, context = '', isTimeDiffEnabled = true) { + this.printMessage(message, clc.yellow, context, isTimeDiffEnabled); + } + static printMessage(message, color, context = '', isTimeDiffEnabled) { + if (Logger.contextEnv === nest_environment_enum_1.NestEnvironment.TEST) + return; + process.stdout.write(color(`[Nest] ${process.pid} - `)); + process.stdout.write(`${new Date(Date.now()).toLocaleString()} `); + process.stdout.write(this.yellow(`[${context}] `)); + process.stdout.write(color(message)); + this.printTimestamp(isTimeDiffEnabled); + process.stdout.write(`\n`); + } + static printTimestamp(isTimeDiffEnabled) { + const includeTimestamp = Logger.prevTimestamp && isTimeDiffEnabled; + if (includeTimestamp) { + process.stdout.write(this.yellow(` +${Date.now() - Logger.prevTimestamp}ms`)); + } + Logger.prevTimestamp = Date.now(); + } + static printStackTrace(trace) { + if (this.contextEnv === nest_environment_enum_1.NestEnvironment.TEST || !trace) + return; + process.stdout.write(trace); + process.stdout.write(`\n`); + } +} +Logger.prevTimestamp = null; +Logger.contextEnv = nest_environment_enum_1.NestEnvironment.RUN; +Logger.logger = Logger; +Logger.yellow = clc.xterm(3); +exports.Logger = Logger; diff --git a/lib/common/utils/bind-resolve-values.util.d.ts b/lib/common/utils/bind-resolve-values.util.d.ts new file mode 100644 index 000000000..213f8b10b --- /dev/null +++ b/lib/common/utils/bind-resolve-values.util.d.ts @@ -0,0 +1,7 @@ +import { Constructor } from './merge-with-values.util'; +import { NestMiddleware } from '../interfaces/middlewares/nest-middleware.interface'; +export declare const BindResolveMiddlewareValues: < + T extends Constructor +>( + data: any[], +) => (Metatype: T) => any; diff --git a/lib/common/utils/bind-resolve-values.util.js b/lib/common/utils/bind-resolve-values.util.js new file mode 100644 index 000000000..2b267f725 --- /dev/null +++ b/lib/common/utils/bind-resolve-values.util.js @@ -0,0 +1,16 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const component_decorator_1 = require("../decorators/core/component.decorator"); +exports.BindResolveMiddlewareValues = (data) => { + return (Metatype) => { + const type = class extends Metatype { + resolve() { + return super.resolve(...data); + } + }; + const token = Metatype.name + JSON.stringify(data); + Object.defineProperty(type, 'name', { value: token }); + component_decorator_1.Injectable()(type); + return type; + }; +}; diff --git a/lib/common/utils/extend-metadata.util.d.ts b/lib/common/utils/extend-metadata.util.d.ts new file mode 100644 index 000000000..1bab6eca9 --- /dev/null +++ b/lib/common/utils/extend-metadata.util.d.ts @@ -0,0 +1,5 @@ +export declare function extendArrayMetadata>( + key: string, + metadata: T, + target: any, +): void; diff --git a/lib/common/utils/extend-metadata.util.js b/lib/common/utils/extend-metadata.util.js new file mode 100644 index 000000000..3153a6dc4 --- /dev/null +++ b/lib/common/utils/extend-metadata.util.js @@ -0,0 +1,8 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +function extendArrayMetadata(key, metadata, target) { + const previousValue = Reflect.getMetadata(key, target) || []; + const value = [...previousValue, ...metadata]; + Reflect.defineMetadata(key, value, target); +} +exports.extendArrayMetadata = extendArrayMetadata; diff --git a/lib/common/utils/forward-ref.util.d.ts b/lib/common/utils/forward-ref.util.d.ts new file mode 100644 index 000000000..be409388f --- /dev/null +++ b/lib/common/utils/forward-ref.util.d.ts @@ -0,0 +1,5 @@ +export declare const forwardRef: ( + fn: () => any, +) => { + forwardRef: () => any; +}; diff --git a/lib/common/utils/forward-ref.util.js b/lib/common/utils/forward-ref.util.js new file mode 100644 index 000000000..76ab4e01c --- /dev/null +++ b/lib/common/utils/forward-ref.util.js @@ -0,0 +1,3 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.forwardRef = (fn) => ({ forwardRef: fn }); diff --git a/lib/common/utils/http-exception-body.util.d.ts b/lib/common/utils/http-exception-body.util.d.ts new file mode 100644 index 000000000..53a980d2d --- /dev/null +++ b/lib/common/utils/http-exception-body.util.d.ts @@ -0,0 +1,15 @@ +export declare const createHttpExceptionBody: ( + message: any, + error: string, + statusCode: number, +) => + | { + statusCode: number; + error: string; + message: any; + } + | { + statusCode: number; + error: string; + message?: undefined; + }; diff --git a/lib/common/utils/http-exception-body.util.js b/lib/common/utils/http-exception-body.util.js new file mode 100644 index 000000000..6df0a3d47 --- /dev/null +++ b/lib/common/utils/http-exception-body.util.js @@ -0,0 +1,3 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.createHttpExceptionBody = (message, error, statusCode) => (message ? { statusCode, error, message } : { statusCode, error }); diff --git a/lib/common/utils/index.d.ts b/lib/common/utils/index.d.ts new file mode 100644 index 000000000..c8719691c --- /dev/null +++ b/lib/common/utils/index.d.ts @@ -0,0 +1 @@ +export * from './forward-ref.util'; diff --git a/lib/common/utils/index.js b/lib/common/utils/index.js new file mode 100644 index 000000000..c658b017f --- /dev/null +++ b/lib/common/utils/index.js @@ -0,0 +1,6 @@ +"use strict"; +function __export(m) { + for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p]; +} +Object.defineProperty(exports, "__esModule", { value: true }); +__export(require("./forward-ref.util")); diff --git a/lib/common/utils/merge-with-values.util.d.ts b/lib/common/utils/merge-with-values.util.d.ts new file mode 100644 index 000000000..79fe2e97a --- /dev/null +++ b/lib/common/utils/merge-with-values.util.d.ts @@ -0,0 +1,9 @@ +import 'reflect-metadata'; +export interface Constructor { + new (...args: any[]): T; +} +export declare const MergeWithValues: >( + data: { + [param: string]: any; + }, +) => (Metatype: T) => any; diff --git a/lib/common/utils/merge-with-values.util.js b/lib/common/utils/merge-with-values.util.js new file mode 100644 index 000000000..55f3132d5 --- /dev/null +++ b/lib/common/utils/merge-with-values.util.js @@ -0,0 +1,16 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +require("reflect-metadata"); +exports.MergeWithValues = (data) => { + return (Metatype) => { + const Type = class extends Metatype { + constructor(...args) { + super(...args); + } + }; + const token = Metatype.name + JSON.stringify(data); + Object.defineProperty(Type, 'name', { value: token }); + Object.assign(Type.prototype, data); + return Type; + }; +}; diff --git a/lib/common/utils/shared.utils.d.ts b/lib/common/utils/shared.utils.d.ts new file mode 100644 index 000000000..c3ab0cae2 --- /dev/null +++ b/lib/common/utils/shared.utils.d.ts @@ -0,0 +1,9 @@ +export declare const isUndefined: (obj: any) => obj is undefined; +export declare const isFunction: (fn: any) => boolean; +export declare const isObject: (fn: any) => fn is object; +export declare const isString: (fn: any) => fn is string; +export declare const isConstructor: (fn: any) => boolean; +export declare const validatePath: (path: any) => string; +export declare const isNil: (obj: any) => boolean; +export declare const isEmpty: (array: any) => boolean; +export declare const isSymbol: (fn: any) => boolean; diff --git a/lib/common/utils/shared.utils.js b/lib/common/utils/shared.utils.js new file mode 100644 index 000000000..5a66db171 --- /dev/null +++ b/lib/common/utils/shared.utils.js @@ -0,0 +1,11 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.isUndefined = (obj) => typeof obj === 'undefined'; +exports.isFunction = (fn) => typeof fn === 'function'; +exports.isObject = (fn) => typeof fn === 'object'; +exports.isString = (fn) => typeof fn === 'string'; +exports.isConstructor = (fn) => fn === 'constructor'; +exports.validatePath = (path) => path.charAt(0) !== '/' ? '/' + path : path; +exports.isNil = (obj) => exports.isUndefined(obj) || obj === null; +exports.isEmpty = (array) => !(array && array.length > 0); +exports.isSymbol = (fn) => typeof fn === 'symbol'; diff --git a/lib/common/utils/validate-each.util.d.ts b/lib/common/utils/validate-each.util.d.ts new file mode 100644 index 000000000..d5c65c2c3 --- /dev/null +++ b/lib/common/utils/validate-each.util.d.ts @@ -0,0 +1,13 @@ +import { RuntimeException } from '@nestjs/core/errors/exceptions/runtime.exception'; +export declare class InvalidDecoratorItemException extends RuntimeException { + constructor(decorator: string, item: string, context: string); +} +export declare function validateEach( + context: { + name: string; + }, + arr: any[], + predicate: Function, + decorator: string, + item: string, +): boolean; diff --git a/lib/common/utils/validate-each.util.js b/lib/common/utils/validate-each.util.js new file mode 100644 index 000000000..4158024c5 --- /dev/null +++ b/lib/common/utils/validate-each.util.js @@ -0,0 +1,20 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const runtime_exception_1 = require("@nestjs/core/errors/exceptions/runtime.exception"); +class InvalidDecoratorItemException extends runtime_exception_1.RuntimeException { + constructor(decorator, item, context) { + super(`Invalid ${item} passed to ${decorator}() decorator (${context}).`); + } +} +exports.InvalidDecoratorItemException = InvalidDecoratorItemException; +function validateEach(context, arr, predicate, decorator, item) { + if (!context || !context.name) { + return true; + } + const errors = arr.filter(item => !predicate(item)); + if (errors.length > 0) { + throw new InvalidDecoratorItemException(decorator, item, context.name); + } + return true; +} +exports.validateEach = validateEach; diff --git a/lib/core/adapters/express-adapter.d.ts b/lib/core/adapters/express-adapter.d.ts new file mode 100644 index 000000000..a2ff5e77b --- /dev/null +++ b/lib/core/adapters/express-adapter.d.ts @@ -0,0 +1,38 @@ +import { HttpServer, RequestHandler } from '@nestjs/common/interfaces'; +import { ServeStaticOptions } from '@nestjs/common/interfaces/external/serve-static-options.interface'; +export declare class ExpressAdapter implements HttpServer { + private readonly instance; + constructor(instance: any); + use(...args: any[]): any; + get(handler: RequestHandler): any; + get(path: any, handler: RequestHandler): any; + post(handler: RequestHandler): any; + post(path: any, handler: RequestHandler): any; + head(handler: RequestHandler): any; + head(path: any, handler: RequestHandler): any; + delete(handler: RequestHandler): any; + delete(path: any, handler: RequestHandler): any; + put(handler: RequestHandler): any; + put(path: any, handler: RequestHandler): any; + patch(handler: RequestHandler): any; + patch(path: any, handler: RequestHandler): any; + options(handler: RequestHandler): any; + options(path: any, handler: RequestHandler): any; + listen(port: string | number, callback?: () => void): any; + listen(port: string | number, hostname: string, callback?: () => void): any; + reply(response: any, body: any, statusCode: number): any; + render(response: any, view: string, options: any): any; + setErrorHandler(handler: Function): any; + setNotFoundHandler(handler: Function): any; + getHttpServer(): any; + close(): any; + set(...args: any[]): any; + enable(...args: any[]): any; + disable(...args: any[]): any; + engine(...args: any[]): any; + useStaticAssets(path: string, options: ServeStaticOptions): any; + setBaseViewsDir(path: string): any; + setViewEngine(engine: string): any; + getRequestMethod(request: any): string; + getRequestUrl(request: any): string; +} diff --git a/lib/core/adapters/express-adapter.js b/lib/core/adapters/express-adapter.js new file mode 100644 index 000000000..79463bddb --- /dev/null +++ b/lib/core/adapters/express-adapter.js @@ -0,0 +1,86 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const express = require("express"); +const shared_utils_1 = require("@nestjs/common/utils/shared.utils"); +class ExpressAdapter { + constructor(instance) { + this.instance = instance; + } + use(...args) { + return this.instance.use(...args); + } + get(pathOrHandler, handler) { + return this.instance.get(pathOrHandler, handler); + } + post(pathOrHandler, handler) { + return this.instance.post(pathOrHandler, handler); + } + head(pathOrHandler, handler) { + return this.instance.head(pathOrHandler, handler); + } + delete(pathOrHandler, handler) { + return this.instance.delete(pathOrHandler, handler); + } + put(pathOrHandler, handler) { + return this.instance.put(pathOrHandler, handler); + } + patch(pathOrHandler, handler) { + return this.instance.patch(pathOrHandler, handler); + } + options(pathOrHandler, handler) { + return this.instance.options(pathOrHandler, handler); + } + listen(port, hostname, callback) { + return this.instance.listen(port, hostname, callback); + } + reply(response, body, statusCode) { + const res = response.status(statusCode); + if (shared_utils_1.isNil(body)) { + return res.send(); + } + return shared_utils_1.isObject(body) ? res.json(body) : res.send(String(body)); + } + render(response, view, options) { + return response.render(view, options); + } + setErrorHandler(handler) { + return this.use(handler); + } + setNotFoundHandler(handler) { + return this.use(handler); + } + getHttpServer() { + return this.instance; + } + close() { + return this.instance.close(); + } + set(...args) { + return this.instance.set(...args); + } + enable(...args) { + return this.instance.set(...args); + } + disable(...args) { + return this.instance.set(...args); + } + engine(...args) { + return this.instance.set(...args); + } + useStaticAssets(path, options) { + return this.use(express.static(path, options)); + } + setBaseViewsDir(path) { + return this.set('views', path); + } + setViewEngine(engine) { + return this.set('view engine', engine); + } + getRequestMethod(request) { + return request.method; + } + getRequestUrl(request) { + return request.url; + } +} +exports.ExpressAdapter = ExpressAdapter; diff --git a/lib/core/adapters/express-factory.d.ts b/lib/core/adapters/express-factory.d.ts new file mode 100644 index 000000000..327579610 --- /dev/null +++ b/lib/core/adapters/express-factory.d.ts @@ -0,0 +1,3 @@ +export declare class ExpressFactory { + static create(): any; +} diff --git a/lib/core/adapters/express-factory.js b/lib/core/adapters/express-factory.js new file mode 100644 index 000000000..ecfb635ab --- /dev/null +++ b/lib/core/adapters/express-factory.js @@ -0,0 +1,10 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const express = require("express"); +const express_adapter_1 = require("./express-adapter"); +class ExpressFactory { + static create() { + return new express_adapter_1.ExpressAdapter(express()); + } +} +exports.ExpressFactory = ExpressFactory; diff --git a/lib/core/adapters/fastify-adapter.d.ts b/lib/core/adapters/fastify-adapter.d.ts new file mode 100644 index 000000000..2a18f8bf7 --- /dev/null +++ b/lib/core/adapters/fastify-adapter.d.ts @@ -0,0 +1,41 @@ +import { RequestHandler, ErrorHandler } from '@nestjs/common/interfaces'; +export declare class FastifyAdapter { + private readonly logger; + protected readonly instance: any; + constructor(); + use(handler: RequestHandler | ErrorHandler): any; + use(path: any, handler: RequestHandler | ErrorHandler): any; + get(handler: RequestHandler): any; + get(path: any, handler: RequestHandler): any; + post(handler: RequestHandler): any; + post(path: any, handler: RequestHandler): any; + head(handler: RequestHandler): any; + head(path: any, handler: RequestHandler): any; + delete(handler: RequestHandler): any; + delete(path: any, handler: RequestHandler): any; + put(handler: RequestHandler): any; + put(path: any, handler: RequestHandler): any; + patch(handler: RequestHandler): any; + patch(path: any, handler: RequestHandler): any; + options(handler: RequestHandler): any; + options(path: any, handler: RequestHandler): any; + listen(port: string | number, callback?: () => void): any; + listen(port: string | number, hostname: string, callback?: () => void): any; + reply(response: any, body: any, statusCode: number): any; + render(response: any, view: string, options: any): any; + setErrorHandler(handler: Function): any; + setNotFoundHandler(handler: Function): any; + getHttpServer(): any; + register(...args: any[]): any; + inject(...args: any[]): any; + close(): any; + useStaticAssets(options: { + root: string; + prefix?: string; + setHeaders?: Function; + send?: any; + }): any; + setViewEngine(options: any): any; + getRequestMethod(request: any): string; + getRequestUrl(request: any): string; +} diff --git a/lib/core/adapters/fastify-adapter.js b/lib/core/adapters/fastify-adapter.js new file mode 100644 index 000000000..e32cba59e --- /dev/null +++ b/lib/core/adapters/fastify-adapter.js @@ -0,0 +1,91 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const common_1 = require("@nestjs/common"); +const missing_dependency_exception_1 = require("../errors/exceptions/missing-dependency.exception"); +class FastifyAdapter { + constructor() { + this.logger = new common_1.Logger(FastifyAdapter.name); + try { + this.instance = require('fastify')(); + } + catch (e) { + throw new missing_dependency_exception_1.MissingRequiredDependencyException('fastify', 'FastifyAdapter'); + } + } + use(pathOrHandler, handler) { + return handler + ? this.instance.use(pathOrHandler, handler) + : this.instance.use(pathOrHandler); + } + get(pathOrHandler, handler) { + return this.instance.get(pathOrHandler, handler); + } + post(pathOrHandler, handler) { + return this.instance.post(pathOrHandler, handler); + } + head(pathOrHandler, handler) { + return this.instance.head(pathOrHandler, handler); + } + delete(pathOrHandler, handler) { + return this.instance.delete(pathOrHandler, handler); + } + put(pathOrHandler, handler) { + return this.instance.put(pathOrHandler, handler); + } + patch(pathOrHandler, handler) { + return this.instance.patch(pathOrHandler, handler); + } + options(pathOrHandler, handler) { + return this.instance.options(pathOrHandler, handler); + } + listen(port, hostname, callback) { + return this.instance.listen(port, hostname, callback); + } + reply(response, body, statusCode) { + return response.code(statusCode).send(body); + } + render(response, view, options) { + return response.view(view, options); + } + setErrorHandler(handler) { + return this.instance.setErrorHandler(handler); + } + setNotFoundHandler(handler) { + return this.instance.setNotFoundHandler(handler); + } + getHttpServer() { + return this.instance.server; + } + register(...args) { + return this.instance.register(...args); + } + inject(...args) { + return this.instance.inject(...args); + } + close() { + return this.instance.close(); + } + useStaticAssets(options) { + try { + return this.register(require('fastify-static'), options); + } + catch (e) { + throw new missing_dependency_exception_1.MissingRequiredDependencyException('fastify-static', 'FastifyAdapter.useStaticAssets()'); + } + } + setViewEngine(options) { + try { + return this.register(require('point-of-view'), options); + } + catch (e) { + throw new missing_dependency_exception_1.MissingRequiredDependencyException('point-of-view', 'FastifyAdapter.setViewEngine()'); + } + } + getRequestMethod(request) { + return request.raw.method; + } + getRequestUrl(request) { + return request.raw.url; + } +} +exports.FastifyAdapter = FastifyAdapter; diff --git a/lib/core/adapters/index.d.ts b/lib/core/adapters/index.d.ts new file mode 100644 index 000000000..109d506ff --- /dev/null +++ b/lib/core/adapters/index.d.ts @@ -0,0 +1 @@ +export * from './fastify-adapter'; diff --git a/lib/core/adapters/index.js b/lib/core/adapters/index.js new file mode 100644 index 000000000..a3abf07a6 --- /dev/null +++ b/lib/core/adapters/index.js @@ -0,0 +1,6 @@ +"use strict"; +function __export(m) { + for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p]; +} +Object.defineProperty(exports, "__esModule", { value: true }); +__export(require("./fastify-adapter")); diff --git a/lib/core/application-config.d.ts b/lib/core/application-config.d.ts new file mode 100644 index 000000000..c7a0d4f0f --- /dev/null +++ b/lib/core/application-config.d.ts @@ -0,0 +1,33 @@ +import { + PipeTransform, + WebSocketAdapter, + ExceptionFilter, + NestInterceptor, + CanActivate, +} from '@nestjs/common'; +import { ConfigurationProvider } from '@nestjs/common/interfaces/configuration-provider.interface'; +export declare class ApplicationConfig implements ConfigurationProvider { + private ioAdapter; + private globalPipes; + private globalFilters; + private globalInterceptors; + private globalGuards; + private globalPrefix; + constructor(ioAdapter?: WebSocketAdapter | null); + setGlobalPrefix(prefix: string): void; + getGlobalPrefix(): string; + setIoAdapter(ioAdapter: WebSocketAdapter): void; + getIoAdapter(): WebSocketAdapter; + addGlobalPipe(pipe: PipeTransform): void; + useGlobalPipes(...pipes: PipeTransform[]): void; + getGlobalFilters(): ExceptionFilter[]; + addGlobalFilter(filter: ExceptionFilter): void; + useGlobalFilters(...filters: ExceptionFilter[]): void; + getGlobalPipes(): PipeTransform[]; + getGlobalInterceptors(): NestInterceptor[]; + addGlobalInterceptor(interceptor: NestInterceptor): void; + useGlobalInterceptors(...interceptors: NestInterceptor[]): void; + getGlobalGuards(): CanActivate[]; + addGlobalGuard(guard: CanActivate): void; + useGlobalGuards(...guards: CanActivate[]): void; +} diff --git a/lib/core/application-config.js b/lib/core/application-config.js new file mode 100644 index 000000000..04eab9d72 --- /dev/null +++ b/lib/core/application-config.js @@ -0,0 +1,61 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +class ApplicationConfig { + constructor(ioAdapter = null) { + this.ioAdapter = ioAdapter; + this.globalPipes = []; + this.globalFilters = []; + this.globalInterceptors = []; + this.globalGuards = []; + this.globalPrefix = ''; + } + setGlobalPrefix(prefix) { + this.globalPrefix = prefix; + } + getGlobalPrefix() { + return this.globalPrefix; + } + setIoAdapter(ioAdapter) { + this.ioAdapter = ioAdapter; + } + getIoAdapter() { + return this.ioAdapter; + } + addGlobalPipe(pipe) { + this.globalPipes.push(pipe); + } + useGlobalPipes(...pipes) { + this.globalPipes = this.globalPipes.concat(pipes); + } + getGlobalFilters() { + return this.globalFilters; + } + addGlobalFilter(filter) { + this.globalFilters.push(filter); + } + useGlobalFilters(...filters) { + this.globalFilters = this.globalFilters.concat(filters); + } + getGlobalPipes() { + return this.globalPipes; + } + getGlobalInterceptors() { + return this.globalInterceptors; + } + addGlobalInterceptor(interceptor) { + this.globalInterceptors.push(interceptor); + } + useGlobalInterceptors(...interceptors) { + this.globalInterceptors = this.globalInterceptors.concat(interceptors); + } + getGlobalGuards() { + return this.globalGuards; + } + addGlobalGuard(guard) { + this.globalGuards.push(guard); + } + useGlobalGuards(...guards) { + this.globalGuards = this.globalGuards.concat(guards); + } +} +exports.ApplicationConfig = ApplicationConfig; diff --git a/lib/core/constants.d.ts b/lib/core/constants.d.ts new file mode 100644 index 000000000..74a939353 --- /dev/null +++ b/lib/core/constants.d.ts @@ -0,0 +1,10 @@ +export declare const messages: { + APPLICATION_START: string; + APPLICATION_READY: string; + MICROSERVICE_READY: string; + UNKNOWN_EXCEPTION_MESSAGE: string; +}; +export declare const APP_INTERCEPTOR = 'APP_INTERCEPTOR'; +export declare const APP_PIPE = 'APP_PIPE'; +export declare const APP_GUARD = 'APP_GUARD'; +export declare const APP_FILTER = 'APP_FILTER'; diff --git a/lib/core/constants.js b/lib/core/constants.js new file mode 100644 index 000000000..1aa683d33 --- /dev/null +++ b/lib/core/constants.js @@ -0,0 +1,12 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.messages = { + APPLICATION_START: `Starting Nest application...`, + APPLICATION_READY: `Nest application successfully started`, + MICROSERVICE_READY: `Nest microservice successfully started`, + UNKNOWN_EXCEPTION_MESSAGE: 'Internal server error', +}; +exports.APP_INTERCEPTOR = 'APP_INTERCEPTOR'; +exports.APP_PIPE = 'APP_PIPE'; +exports.APP_GUARD = 'APP_GUARD'; +exports.APP_FILTER = 'APP_FILTER'; diff --git a/lib/core/errors/exception-handler.d.ts b/lib/core/errors/exception-handler.d.ts new file mode 100644 index 000000000..1dc7eb8ee --- /dev/null +++ b/lib/core/errors/exception-handler.d.ts @@ -0,0 +1,5 @@ +import { RuntimeException } from './exceptions/runtime.exception'; +export declare class ExceptionHandler { + private static readonly logger; + handle(exception: RuntimeException | Error): void; +} diff --git a/lib/core/errors/exception-handler.js b/lib/core/errors/exception-handler.js new file mode 100644 index 000000000..2ba6f363b --- /dev/null +++ b/lib/core/errors/exception-handler.js @@ -0,0 +1,15 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const runtime_exception_1 = require("./exceptions/runtime.exception"); +const logger_service_1 = require("@nestjs/common/services/logger.service"); +class ExceptionHandler { + handle(exception) { + if (!(exception instanceof runtime_exception_1.RuntimeException)) { + ExceptionHandler.logger.error(exception.message, exception.stack); + return; + } + ExceptionHandler.logger.error(exception.what(), exception.stack); + } +} +ExceptionHandler.logger = new logger_service_1.Logger(ExceptionHandler.name); +exports.ExceptionHandler = ExceptionHandler; diff --git a/lib/core/errors/exceptions-zone.d.ts b/lib/core/errors/exceptions-zone.d.ts new file mode 100644 index 000000000..b3beb201c --- /dev/null +++ b/lib/core/errors/exceptions-zone.d.ts @@ -0,0 +1,5 @@ +export declare class ExceptionsZone { + private static readonly exceptionHandler; + static run(fn: () => void): void; + static asyncRun(fn: () => Promise): Promise; +} diff --git a/lib/core/errors/exceptions-zone.js b/lib/core/errors/exceptions-zone.js new file mode 100644 index 000000000..6efb52578 --- /dev/null +++ b/lib/core/errors/exceptions-zone.js @@ -0,0 +1,36 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const exception_handler_1 = require("./exception-handler"); +const messages_1 = require("./messages"); +class ExceptionsZone { + static run(fn) { + try { + fn(); + } + catch (e) { + this.exceptionHandler.handle(e); + throw messages_1.UNHANDLED_RUNTIME_EXCEPTION; + } + } + static asyncRun(fn) { + return __awaiter(this, void 0, void 0, function* () { + try { + yield fn(); + } + catch (e) { + this.exceptionHandler.handle(e); + throw messages_1.UNHANDLED_RUNTIME_EXCEPTION; + } + }); + } +} +ExceptionsZone.exceptionHandler = new exception_handler_1.ExceptionHandler(); +exports.ExceptionsZone = ExceptionsZone; diff --git a/lib/core/errors/exceptions/circular-dependency.exception.d.ts b/lib/core/errors/exceptions/circular-dependency.exception.d.ts new file mode 100644 index 000000000..42612b095 --- /dev/null +++ b/lib/core/errors/exceptions/circular-dependency.exception.d.ts @@ -0,0 +1,4 @@ +import { RuntimeException } from './runtime.exception'; +export declare class CircularDependencyException extends RuntimeException { + constructor(context: string); +} diff --git a/lib/core/errors/exceptions/circular-dependency.exception.js b/lib/core/errors/exceptions/circular-dependency.exception.js new file mode 100644 index 000000000..e23997685 --- /dev/null +++ b/lib/core/errors/exceptions/circular-dependency.exception.js @@ -0,0 +1,9 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const runtime_exception_1 = require("./runtime.exception"); +class CircularDependencyException extends runtime_exception_1.RuntimeException { + constructor(context) { + super(`A circular dependency has been detected inside ${context}. Please, make sure that each side of a bidirectional relationships are decorated with "forwardRef()".`); + } +} +exports.CircularDependencyException = CircularDependencyException; diff --git a/lib/core/errors/exceptions/invalid-exception-filter.exception.d.ts b/lib/core/errors/exceptions/invalid-exception-filter.exception.d.ts new file mode 100644 index 000000000..6fe54055b --- /dev/null +++ b/lib/core/errors/exceptions/invalid-exception-filter.exception.d.ts @@ -0,0 +1,4 @@ +import { RuntimeException } from './runtime.exception'; +export declare class InvalidExceptionFilterException extends RuntimeException { + constructor(); +} diff --git a/lib/core/errors/exceptions/invalid-exception-filter.exception.js b/lib/core/errors/exceptions/invalid-exception-filter.exception.js new file mode 100644 index 000000000..28c87bd78 --- /dev/null +++ b/lib/core/errors/exceptions/invalid-exception-filter.exception.js @@ -0,0 +1,10 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const runtime_exception_1 = require("./runtime.exception"); +const messages_1 = require("../messages"); +class InvalidExceptionFilterException extends runtime_exception_1.RuntimeException { + constructor() { + super(messages_1.INVALID_EXCEPTION_FILTER); + } +} +exports.InvalidExceptionFilterException = InvalidExceptionFilterException; diff --git a/lib/core/errors/exceptions/invalid-middleware-configuration.exception.d.ts b/lib/core/errors/exceptions/invalid-middleware-configuration.exception.d.ts new file mode 100644 index 000000000..dcc64b115 --- /dev/null +++ b/lib/core/errors/exceptions/invalid-middleware-configuration.exception.d.ts @@ -0,0 +1,4 @@ +import { RuntimeException } from './runtime.exception'; +export declare class InvalidMiddlewareConfigurationException extends RuntimeException { + constructor(); +} diff --git a/lib/core/errors/exceptions/invalid-middleware-configuration.exception.js b/lib/core/errors/exceptions/invalid-middleware-configuration.exception.js new file mode 100644 index 000000000..107eb3c00 --- /dev/null +++ b/lib/core/errors/exceptions/invalid-middleware-configuration.exception.js @@ -0,0 +1,10 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const runtime_exception_1 = require("./runtime.exception"); +const messages_1 = require("../messages"); +class InvalidMiddlewareConfigurationException extends runtime_exception_1.RuntimeException { + constructor() { + super(messages_1.INVALID_MIDDLEWARE_CONFIGURATION); + } +} +exports.InvalidMiddlewareConfigurationException = InvalidMiddlewareConfigurationException; diff --git a/lib/core/errors/exceptions/invalid-middleware.exception.d.ts b/lib/core/errors/exceptions/invalid-middleware.exception.d.ts new file mode 100644 index 000000000..0ea67d771 --- /dev/null +++ b/lib/core/errors/exceptions/invalid-middleware.exception.d.ts @@ -0,0 +1,4 @@ +import { RuntimeException } from './runtime.exception'; +export declare class InvalidMiddlewareException extends RuntimeException { + constructor(name: string); +} diff --git a/lib/core/errors/exceptions/invalid-middleware.exception.js b/lib/core/errors/exceptions/invalid-middleware.exception.js new file mode 100644 index 000000000..dacc35585 --- /dev/null +++ b/lib/core/errors/exceptions/invalid-middleware.exception.js @@ -0,0 +1,10 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const runtime_exception_1 = require("./runtime.exception"); +const messages_1 = require("../messages"); +class InvalidMiddlewareException extends runtime_exception_1.RuntimeException { + constructor(name) { + super(messages_1.InvalidMiddlewareMessage(name)); + } +} +exports.InvalidMiddlewareException = InvalidMiddlewareException; diff --git a/lib/core/errors/exceptions/invalid-module.exception.d.ts b/lib/core/errors/exceptions/invalid-module.exception.d.ts new file mode 100644 index 000000000..9bcbe8fa6 --- /dev/null +++ b/lib/core/errors/exceptions/invalid-module.exception.d.ts @@ -0,0 +1,4 @@ +import { RuntimeException } from './runtime.exception'; +export declare class InvalidModuleException extends RuntimeException { + constructor(trace: any[]); +} diff --git a/lib/core/errors/exceptions/invalid-module.exception.js b/lib/core/errors/exceptions/invalid-module.exception.js new file mode 100644 index 000000000..1062349ab --- /dev/null +++ b/lib/core/errors/exceptions/invalid-module.exception.js @@ -0,0 +1,11 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const runtime_exception_1 = require("./runtime.exception"); +const messages_1 = require("../messages"); +class InvalidModuleException extends runtime_exception_1.RuntimeException { + constructor(trace) { + const scope = (trace || []).map(module => module.name).join(' -> '); + super(messages_1.InvalidModuleMessage(scope)); + } +} +exports.InvalidModuleException = InvalidModuleException; diff --git a/lib/core/errors/exceptions/microservices-package-not-found.exception.d.ts b/lib/core/errors/exceptions/microservices-package-not-found.exception.d.ts new file mode 100644 index 000000000..cdc117e8f --- /dev/null +++ b/lib/core/errors/exceptions/microservices-package-not-found.exception.d.ts @@ -0,0 +1,4 @@ +import { RuntimeException } from './runtime.exception'; +export declare class MicroservicesPackageNotFoundException extends RuntimeException { + constructor(); +} diff --git a/lib/core/errors/exceptions/microservices-package-not-found.exception.js b/lib/core/errors/exceptions/microservices-package-not-found.exception.js new file mode 100644 index 000000000..188f9b326 --- /dev/null +++ b/lib/core/errors/exceptions/microservices-package-not-found.exception.js @@ -0,0 +1,10 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const runtime_exception_1 = require("./runtime.exception"); +const messages_1 = require("../messages"); +class MicroservicesPackageNotFoundException extends runtime_exception_1.RuntimeException { + constructor() { + super(messages_1.MICROSERVICES_PACKAGE_NOT_FOUND_EXCEPTION); + } +} +exports.MicroservicesPackageNotFoundException = MicroservicesPackageNotFoundException; diff --git a/lib/core/errors/exceptions/missing-dependency.exception.d.ts b/lib/core/errors/exceptions/missing-dependency.exception.d.ts new file mode 100644 index 000000000..45d77c098 --- /dev/null +++ b/lib/core/errors/exceptions/missing-dependency.exception.d.ts @@ -0,0 +1,4 @@ +import { RuntimeException } from './runtime.exception'; +export declare class MissingRequiredDependencyException extends RuntimeException { + constructor(name: string, context: string); +} diff --git a/lib/core/errors/exceptions/missing-dependency.exception.js b/lib/core/errors/exceptions/missing-dependency.exception.js new file mode 100644 index 000000000..7044d5ac0 --- /dev/null +++ b/lib/core/errors/exceptions/missing-dependency.exception.js @@ -0,0 +1,10 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const runtime_exception_1 = require("./runtime.exception"); +const messages_1 = require("../messages"); +class MissingRequiredDependencyException extends runtime_exception_1.RuntimeException { + constructor(name, context) { + super(messages_1.MissingRequiredDependency(name, context)); + } +} +exports.MissingRequiredDependencyException = MissingRequiredDependencyException; diff --git a/lib/core/errors/exceptions/runtime.exception.d.ts b/lib/core/errors/exceptions/runtime.exception.d.ts new file mode 100644 index 000000000..9258ce67e --- /dev/null +++ b/lib/core/errors/exceptions/runtime.exception.d.ts @@ -0,0 +1,11 @@ +export declare class Error { + name: string; + message: string; + stack: string; + constructor(message?: string); +} +export declare class RuntimeException extends Error { + private msg; + constructor(msg?: string); + what(): string; +} diff --git a/lib/core/errors/exceptions/runtime.exception.js b/lib/core/errors/exceptions/runtime.exception.js new file mode 100644 index 000000000..95b4d1658 --- /dev/null +++ b/lib/core/errors/exceptions/runtime.exception.js @@ -0,0 +1,12 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +class RuntimeException extends Error { + constructor(msg = ``) { + super(msg); + this.msg = msg; + } + what() { + return this.msg; + } +} +exports.RuntimeException = RuntimeException; diff --git a/lib/core/errors/exceptions/undefined-dependency.exception.d.ts b/lib/core/errors/exceptions/undefined-dependency.exception.d.ts new file mode 100644 index 000000000..967fde9fb --- /dev/null +++ b/lib/core/errors/exceptions/undefined-dependency.exception.d.ts @@ -0,0 +1,4 @@ +import { RuntimeException } from './runtime.exception'; +export declare class UndefinedDependencyException extends RuntimeException { + constructor(type: string, index: number, length: number); +} diff --git a/lib/core/errors/exceptions/undefined-dependency.exception.js b/lib/core/errors/exceptions/undefined-dependency.exception.js new file mode 100644 index 000000000..35f9c7bb5 --- /dev/null +++ b/lib/core/errors/exceptions/undefined-dependency.exception.js @@ -0,0 +1,10 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const runtime_exception_1 = require("./runtime.exception"); +const messages_1 = require("../messages"); +class UndefinedDependencyException extends runtime_exception_1.RuntimeException { + constructor(type, index, length) { + super(messages_1.UnknownDependenciesMessage(type, index, length)); + } +} +exports.UndefinedDependencyException = UndefinedDependencyException; diff --git a/lib/core/errors/exceptions/unknown-dependencies.exception.d.ts b/lib/core/errors/exceptions/unknown-dependencies.exception.d.ts new file mode 100644 index 000000000..4c0965947 --- /dev/null +++ b/lib/core/errors/exceptions/unknown-dependencies.exception.d.ts @@ -0,0 +1,4 @@ +import { RuntimeException } from './runtime.exception'; +export declare class UnknownDependenciesException extends RuntimeException { + constructor(type: string, index: number, length: number); +} diff --git a/lib/core/errors/exceptions/unknown-dependencies.exception.js b/lib/core/errors/exceptions/unknown-dependencies.exception.js new file mode 100644 index 000000000..f41e22714 --- /dev/null +++ b/lib/core/errors/exceptions/unknown-dependencies.exception.js @@ -0,0 +1,10 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const runtime_exception_1 = require("./runtime.exception"); +const messages_1 = require("../messages"); +class UnknownDependenciesException extends runtime_exception_1.RuntimeException { + constructor(type, index, length) { + super(messages_1.UnknownDependenciesMessage(type, index, length)); + } +} +exports.UnknownDependenciesException = UnknownDependenciesException; diff --git a/lib/core/errors/exceptions/unknown-export.exception.d.ts b/lib/core/errors/exceptions/unknown-export.exception.d.ts new file mode 100644 index 000000000..8d61d96b9 --- /dev/null +++ b/lib/core/errors/exceptions/unknown-export.exception.d.ts @@ -0,0 +1,4 @@ +import { RuntimeException } from './runtime.exception'; +export declare class UnknownExportException extends RuntimeException { + constructor(name: string); +} diff --git a/lib/core/errors/exceptions/unknown-export.exception.js b/lib/core/errors/exceptions/unknown-export.exception.js new file mode 100644 index 000000000..033f9dbd0 --- /dev/null +++ b/lib/core/errors/exceptions/unknown-export.exception.js @@ -0,0 +1,10 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const runtime_exception_1 = require("./runtime.exception"); +const messages_1 = require("../messages"); +class UnknownExportException extends runtime_exception_1.RuntimeException { + constructor(name) { + super(messages_1.UnknownExportMessage(name)); + } +} +exports.UnknownExportException = UnknownExportException; diff --git a/lib/core/errors/exceptions/unknown-module.exception.d.ts b/lib/core/errors/exceptions/unknown-module.exception.d.ts new file mode 100644 index 000000000..02ad09d0b --- /dev/null +++ b/lib/core/errors/exceptions/unknown-module.exception.d.ts @@ -0,0 +1,4 @@ +import { RuntimeException } from './runtime.exception'; +export declare class UnknownModuleException extends RuntimeException { + constructor(); +} diff --git a/lib/core/errors/exceptions/unknown-module.exception.js b/lib/core/errors/exceptions/unknown-module.exception.js new file mode 100644 index 000000000..84e1209e8 --- /dev/null +++ b/lib/core/errors/exceptions/unknown-module.exception.js @@ -0,0 +1,9 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const runtime_exception_1 = require("./runtime.exception"); +class UnknownModuleException extends runtime_exception_1.RuntimeException { + constructor() { + super(); + } +} +exports.UnknownModuleException = UnknownModuleException; diff --git a/lib/core/errors/exceptions/unknown-request-mapping.exception.d.ts b/lib/core/errors/exceptions/unknown-request-mapping.exception.d.ts new file mode 100644 index 000000000..b7276d884 --- /dev/null +++ b/lib/core/errors/exceptions/unknown-request-mapping.exception.d.ts @@ -0,0 +1,4 @@ +import { RuntimeException } from './runtime.exception'; +export declare class UnknownRequestMappingException extends RuntimeException { + constructor(); +} diff --git a/lib/core/errors/exceptions/unknown-request-mapping.exception.js b/lib/core/errors/exceptions/unknown-request-mapping.exception.js new file mode 100644 index 000000000..f03fa61a8 --- /dev/null +++ b/lib/core/errors/exceptions/unknown-request-mapping.exception.js @@ -0,0 +1,10 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const runtime_exception_1 = require("./runtime.exception"); +const messages_1 = require("../messages"); +class UnknownRequestMappingException extends runtime_exception_1.RuntimeException { + constructor() { + super(messages_1.UNKNOWN_REQUEST_MAPPING); + } +} +exports.UnknownRequestMappingException = UnknownRequestMappingException; diff --git a/lib/core/errors/messages.d.ts b/lib/core/errors/messages.d.ts new file mode 100644 index 000000000..002b06941 --- /dev/null +++ b/lib/core/errors/messages.d.ts @@ -0,0 +1,22 @@ +export declare const UnknownDependenciesMessage: ( + type: string, + index: number, + length: number, +) => string; +export declare const InvalidMiddlewareMessage: (name: string) => string; +export declare const InvalidModuleMessage: (scope: string) => string; +export declare const UnknownExportMessage: (module: string) => string; +export declare const MissingRequiredDependency: ( + name: string, + reason: string, +) => string; +export declare const INVALID_MIDDLEWARE_CONFIGURATION = + "Invalid middleware configuration passed inside the module 'configure()' method."; +export declare const UNKNOWN_REQUEST_MAPPING = + 'Request mapping properties not defined in the @RequestMapping() annotation!'; +export declare const UNHANDLED_RUNTIME_EXCEPTION = + 'Unhandled Runtime Exception.'; +export declare const INVALID_EXCEPTION_FILTER = + 'Invalid exception filters (@UseFilters()).'; +export declare const MICROSERVICES_PACKAGE_NOT_FOUND_EXCEPTION = + "Unable to load @nestjs/microservices package (please, make sure whether it's installed already)."; diff --git a/lib/core/errors/messages.js b/lib/core/errors/messages.js new file mode 100644 index 000000000..e7b3cd190 --- /dev/null +++ b/lib/core/errors/messages.js @@ -0,0 +1,20 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.UnknownDependenciesMessage = (type, index, length) => { + let message = `Nest can't resolve dependencies of the ${type}`; + message += ` (`; + const args = new Array(length).fill('+'); + args[index] = '?'; + message += args.join(', '); + message += `). Please verify whether [${index}] argument is available in the current context.`; + return message; +}; +exports.InvalidMiddlewareMessage = (name) => `The middleware doesn't provide the 'resolve' method (${name})`; +exports.InvalidModuleMessage = (scope) => `Nest cannot create the module instance. The frequent reason of this exception is the circular dependency between modules. Use forwardRef() to avoid it (read more https://docs.nestjs.com/advanced/circular-dependency). Scope [${scope}]`; +exports.UnknownExportMessage = (module) => `Nest cannot export component / module that is not a part of the currently proccessed module (${module}). Please verify whether each exported unit is available in this particular context.`; +exports.MissingRequiredDependency = (name, reason) => `The "${name}" package is missing. Please, make sure to install this library ($ npm install ${name}) to take advantage of ${reason}.`; +exports.INVALID_MIDDLEWARE_CONFIGURATION = `Invalid middleware configuration passed inside the module 'configure()' method.`; +exports.UNKNOWN_REQUEST_MAPPING = `Request mapping properties not defined in the @RequestMapping() annotation!`; +exports.UNHANDLED_RUNTIME_EXCEPTION = `Unhandled Runtime Exception.`; +exports.INVALID_EXCEPTION_FILTER = `Invalid exception filters (@UseFilters()).`; +exports.MICROSERVICES_PACKAGE_NOT_FOUND_EXCEPTION = `Unable to load @nestjs/microservices package (please, make sure whether it's installed already).`; diff --git a/lib/core/exceptions/base-exception-filter-context.d.ts b/lib/core/exceptions/base-exception-filter-context.d.ts new file mode 100644 index 000000000..f0dede322 --- /dev/null +++ b/lib/core/exceptions/base-exception-filter-context.d.ts @@ -0,0 +1,8 @@ +import 'reflect-metadata'; +import { Type } from '@nestjs/common/interfaces/index'; +import { ExceptionFilter } from '@nestjs/common/interfaces/exceptions/exception-filter.interface'; +import { ContextCreator } from './../helpers/context-creator'; +export declare class BaseExceptionFilterContext extends ContextCreator { + createConcreteContext(metadata: T): R; + reflectCatchExceptions(instance: ExceptionFilter): Type[]; +} diff --git a/lib/core/exceptions/base-exception-filter-context.js b/lib/core/exceptions/base-exception-filter-context.js new file mode 100644 index 000000000..42bd9b8df --- /dev/null +++ b/lib/core/exceptions/base-exception-filter-context.js @@ -0,0 +1,26 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +require("reflect-metadata"); +const iterare_1 = require("iterare"); +const constants_1 = require("@nestjs/common/constants"); +const shared_utils_1 = require("@nestjs/common/utils/shared.utils"); +const context_creator_1 = require("./../helpers/context-creator"); +class BaseExceptionFilterContext extends context_creator_1.ContextCreator { + createConcreteContext(metadata) { + if (shared_utils_1.isUndefined(metadata) || shared_utils_1.isEmpty(metadata)) { + return []; + } + return iterare_1.default(metadata) + .filter(instance => instance.catch && shared_utils_1.isFunction(instance.catch)) + .map(instance => ({ + func: instance.catch.bind(instance), + exceptionMetatypes: this.reflectCatchExceptions(instance), + })) + .toArray(); + } + reflectCatchExceptions(instance) { + const prototype = Object.getPrototypeOf(instance); + return (Reflect.getMetadata(constants_1.FILTER_CATCH_EXCEPTIONS, prototype.constructor) || []); + } +} +exports.BaseExceptionFilterContext = BaseExceptionFilterContext; diff --git a/lib/core/exceptions/exceptions-handler.d.ts b/lib/core/exceptions/exceptions-handler.d.ts new file mode 100644 index 000000000..dafaf5e4c --- /dev/null +++ b/lib/core/exceptions/exceptions-handler.d.ts @@ -0,0 +1,14 @@ +import { HttpServer } from '@nestjs/common'; +import { ExceptionFilterMetadata } from '@nestjs/common/interfaces/exceptions/exception-filter-metadata.interface'; +import { HttpException } from '@nestjs/common'; +import { ArgumentsHost } from '@nestjs/common/interfaces/features/arguments-host.interface'; +export declare class ExceptionsHandler { + private readonly applicationRef; + private static readonly logger; + private filters; + constructor(applicationRef: HttpServer); + next(exception: Error | HttpException | any, ctx: ArgumentsHost): void; + setCustomFilters(filters: ExceptionFilterMetadata[]): void; + invokeCustomFilters(exception: any, response: any): boolean; + isExceptionObject(err: any): err is Error; +} diff --git a/lib/core/exceptions/exceptions-handler.js b/lib/core/exceptions/exceptions-handler.js new file mode 100644 index 000000000..2331d0c48 --- /dev/null +++ b/lib/core/exceptions/exceptions-handler.js @@ -0,0 +1,59 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const constants_1 = require("../constants"); +const common_1 = require("@nestjs/common"); +const shared_utils_1 = require("@nestjs/common/utils/shared.utils"); +const invalid_exception_filter_exception_1 = require("../errors/exceptions/invalid-exception-filter.exception"); +const common_2 = require("@nestjs/common"); +class ExceptionsHandler { + constructor(applicationRef) { + this.applicationRef = applicationRef; + this.filters = []; + } + next(exception, ctx) { + if (this.invokeCustomFilters(exception, ctx)) + return; + if (!(exception instanceof common_2.HttpException)) { + const body = { + statusCode: 500, + message: constants_1.messages.UNKNOWN_EXCEPTION_MESSAGE, + }; + const statusCode = 500; + this.applicationRef.reply(ctx.getArgByIndex(1), body, statusCode); + if (this.isExceptionObject(exception)) { + return ExceptionsHandler.logger.error(exception.message, exception.stack); + } + return ExceptionsHandler.logger.error(exception); + } + const res = exception.getResponse(); + const message = shared_utils_1.isObject(res) + ? res + : { + statusCode: exception.getStatus(), + message: res, + }; + this.applicationRef.reply(ctx.getArgByIndex(1), message, exception.getStatus()); + } + setCustomFilters(filters) { + if (!Array.isArray(filters)) { + throw new invalid_exception_filter_exception_1.InvalidExceptionFilterException(); + } + this.filters = filters; + } + invokeCustomFilters(exception, response) { + if (shared_utils_1.isEmpty(this.filters)) + return false; + const filter = this.filters.find(({ exceptionMetatypes, func }) => { + const hasMetatype = !exceptionMetatypes.length || + !!exceptionMetatypes.find(ExceptionMetatype => exception instanceof ExceptionMetatype); + return hasMetatype; + }); + filter && filter.func(exception, response); + return !!filter; + } + isExceptionObject(err) { + return shared_utils_1.isObject(err) && !!err.message; + } +} +ExceptionsHandler.logger = new common_1.Logger(ExceptionsHandler.name); +exports.ExceptionsHandler = ExceptionsHandler; diff --git a/lib/core/guards/constants.d.ts b/lib/core/guards/constants.d.ts new file mode 100644 index 000000000..a2f6cc391 --- /dev/null +++ b/lib/core/guards/constants.d.ts @@ -0,0 +1 @@ +export declare const FORBIDDEN_MESSAGE = 'Forbidden resource'; diff --git a/lib/core/guards/constants.js b/lib/core/guards/constants.js new file mode 100644 index 000000000..3f2a9b02d --- /dev/null +++ b/lib/core/guards/constants.js @@ -0,0 +1,3 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.FORBIDDEN_MESSAGE = 'Forbidden resource'; diff --git a/lib/core/guards/guards-consumer.d.ts b/lib/core/guards/guards-consumer.d.ts new file mode 100644 index 000000000..8b0c5101a --- /dev/null +++ b/lib/core/guards/guards-consumer.d.ts @@ -0,0 +1,20 @@ +import { Controller } from '@nestjs/common/interfaces'; +import { CanActivate } from '@nestjs/common'; +import { Observable } from 'rxjs/Observable'; +import { ExecutionContextHost } from '../helpers/execution-context.host'; +export declare class GuardsConsumer { + tryActivate( + guards: CanActivate[], + args: any[], + instance: Controller, + callback: (...args) => any, + ): Promise; + createContext( + args: any[], + instance: Controller, + callback: (...args) => any, + ): ExecutionContextHost; + pickResult( + result: boolean | Promise | Observable, + ): Promise; +} diff --git a/lib/core/guards/guards-consumer.js b/lib/core/guards/guards-consumer.js new file mode 100644 index 000000000..61ee76c56 --- /dev/null +++ b/lib/core/guards/guards-consumer.js @@ -0,0 +1,46 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const shared_utils_1 = require("@nestjs/common/utils/shared.utils"); +const Observable_1 = require("rxjs/Observable"); +const execution_context_host_1 = require("../helpers/execution-context.host"); +class GuardsConsumer { + tryActivate(guards, args, instance, callback) { + return __awaiter(this, void 0, void 0, function* () { + if (!guards || shared_utils_1.isEmpty(guards)) { + return true; + } + const context = this.createContext(args, instance, callback); + for (const guard of guards) { + const result = guard.canActivate(context); + if (yield this.pickResult(result)) { + continue; + } + return false; + } + return true; + }); + } + createContext(args, instance, callback) { + return new execution_context_host_1.ExecutionContextHost(args, instance.constructor, callback); + } + pickResult(result) { + return __awaiter(this, void 0, void 0, function* () { + if (result instanceof Observable_1.Observable) { + return yield result.toPromise(); + } + if (result instanceof Promise) { + return yield result; + } + return result; + }); + } +} +exports.GuardsConsumer = GuardsConsumer; diff --git a/lib/core/guards/guards-context-creator.d.ts b/lib/core/guards/guards-context-creator.d.ts new file mode 100644 index 000000000..8dd217e53 --- /dev/null +++ b/lib/core/guards/guards-context-creator.d.ts @@ -0,0 +1,27 @@ +import 'reflect-metadata'; +import { Controller } from '@nestjs/common/interfaces'; +import { ContextCreator } from './../helpers/context-creator'; +import { NestContainer } from '../injector/container'; +import { CanActivate } from '@nestjs/common'; +import { ConfigurationProvider } from '@nestjs/common/interfaces/configuration-provider.interface'; +export declare class GuardsContextCreator extends ContextCreator { + private readonly container; + private readonly config; + private moduleContext; + constructor(container: NestContainer, config?: ConfigurationProvider); + create( + instance: Controller, + callback: (...args) => any, + module: string, + ): CanActivate[]; + createConcreteContext(metadata: T): R; + createGlobalMetadataContext(metadata: T): R; + getInstanceByMetatype( + metatype: any, + ): + | { + instance: any; + } + | undefined; + getGlobalMetadata(): T; +} diff --git a/lib/core/guards/guards-context-creator.js b/lib/core/guards/guards-context-creator.js new file mode 100644 index 000000000..334d25b89 --- /dev/null +++ b/lib/core/guards/guards-context-creator.js @@ -0,0 +1,53 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +require("reflect-metadata"); +const iterare_1 = require("iterare"); +const constants_1 = require("@nestjs/common/constants"); +const shared_utils_1 = require("@nestjs/common/utils/shared.utils"); +const context_creator_1 = require("./../helpers/context-creator"); +class GuardsContextCreator extends context_creator_1.ContextCreator { + constructor(container, config) { + super(); + this.container = container; + this.config = config; + } + create(instance, callback, module) { + this.moduleContext = module; + return this.createContext(instance, callback, constants_1.GUARDS_METADATA); + } + createConcreteContext(metadata) { + if (shared_utils_1.isUndefined(metadata) || shared_utils_1.isEmpty(metadata) || !this.moduleContext) { + return []; + } + const isGlobalMetadata = metadata === this.getGlobalMetadata(); + return isGlobalMetadata + ? this.createGlobalMetadataContext(metadata) + : iterare_1.default(metadata) + .filter((metatype) => metatype && metatype.name) + .map(metatype => this.getInstanceByMetatype(metatype)) + .filter((wrapper) => wrapper && wrapper.instance) + .map(wrapper => wrapper.instance) + .filter((guard) => guard && shared_utils_1.isFunction(guard.canActivate)) + .toArray(); + } + createGlobalMetadataContext(metadata) { + return iterare_1.default(metadata) + .filter(guard => guard && guard.canActivate && shared_utils_1.isFunction(guard.canActivate)) + .toArray(); + } + getInstanceByMetatype(metatype) { + const collection = this.container.getModules(); + const module = collection.get(this.moduleContext); + if (!module) { + return undefined; + } + return module.injectables.get(metatype.name); + } + getGlobalMetadata() { + if (!this.config) { + return []; + } + return this.config.getGlobalGuards(); + } +} +exports.GuardsContextCreator = GuardsContextCreator; diff --git a/lib/core/helpers/context-creator.d.ts b/lib/core/helpers/context-creator.d.ts new file mode 100644 index 000000000..bc308c8b1 --- /dev/null +++ b/lib/core/helpers/context-creator.d.ts @@ -0,0 +1,15 @@ +import 'reflect-metadata'; +import { Controller } from '@nestjs/common/interfaces'; +export abstract class ContextCreator { + abstract createConcreteContext( + metadata: T, + ): R; + getGlobalMetadata?(): T; + createContext( + instance: Controller, + callback: (...args) => any, + metadataKey: string, + ): R; + reflectClassMetadata(instance: Controller, metadataKey: string): T; + reflectMethodMetadata(callback: (...args) => any, metadataKey: string): T; +} diff --git a/lib/core/helpers/context-creator.js b/lib/core/helpers/context-creator.js new file mode 100644 index 000000000..cde0ff7d1 --- /dev/null +++ b/lib/core/helpers/context-creator.js @@ -0,0 +1,23 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +require("reflect-metadata"); +class ContextCreator { + createContext(instance, callback, metadataKey) { + const globalMetadata = this.getGlobalMetadata && this.getGlobalMetadata(); + const classMetadata = this.reflectClassMetadata(instance, metadataKey); + const methodMetadata = this.reflectMethodMetadata(callback, metadataKey); + return [ + ...this.createConcreteContext(globalMetadata || []), + ...this.createConcreteContext(classMetadata), + ...this.createConcreteContext(methodMetadata), + ]; + } + reflectClassMetadata(instance, metadataKey) { + const prototype = Object.getPrototypeOf(instance); + return Reflect.getMetadata(metadataKey, prototype.constructor); + } + reflectMethodMetadata(callback, metadataKey) { + return Reflect.getMetadata(metadataKey, callback); + } +} +exports.ContextCreator = ContextCreator; diff --git a/lib/core/helpers/execution-context.host.d.ts b/lib/core/helpers/execution-context.host.d.ts new file mode 100644 index 000000000..c568961a6 --- /dev/null +++ b/lib/core/helpers/execution-context.host.d.ts @@ -0,0 +1,20 @@ +import { ExecutionContext } from '@nestjs/common'; +import { Type } from '@nestjs/common/interfaces'; +import { + RpcArgumentsHost, + WsArgumentsHost, + HttpArgumentsHost, +} from '@nestjs/common/interfaces/features/arguments-host.interface'; +export declare class ExecutionContextHost implements ExecutionContext { + private readonly args; + private readonly constructorRef; + private readonly handler; + constructor(args: any[], constructorRef?: Type, handler?: Function); + getClass(): Type; + getHandler(): Function; + getArgs = any[]>(): T; + getArgByIndex(index: number): T; + switchToRpc(): RpcArgumentsHost; + switchToHttp(): HttpArgumentsHost; + switchToWs(): WsArgumentsHost; +} diff --git a/lib/core/helpers/execution-context.host.js b/lib/core/helpers/execution-context.host.js new file mode 100644 index 000000000..1a68aa64c --- /dev/null +++ b/lib/core/helpers/execution-context.host.js @@ -0,0 +1,39 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +class ExecutionContextHost { + constructor(args, constructorRef = null, handler = null) { + this.args = args; + this.constructorRef = constructorRef; + this.handler = handler; + } + getClass() { + return this.constructorRef; + } + getHandler() { + return this.handler; + } + getArgs() { + return this.args; + } + getArgByIndex(index) { + return this.args[index]; + } + switchToRpc() { + return Object.assign(this, { + getData: () => this.getArgByIndex(0), + }); + } + switchToHttp() { + return Object.assign(this, { + getRequest: () => this.getArgByIndex(0), + getResponse: () => this.getArgByIndex(1), + }); + } + switchToWs() { + return Object.assign(this, { + getClient: () => this.getArgByIndex(0), + getData: () => this.getArgByIndex(1), + }); + } +} +exports.ExecutionContextHost = ExecutionContextHost; diff --git a/lib/core/helpers/external-context-creator.d.ts b/lib/core/helpers/external-context-creator.d.ts new file mode 100644 index 000000000..7403a0512 --- /dev/null +++ b/lib/core/helpers/external-context-creator.d.ts @@ -0,0 +1,29 @@ +import 'reflect-metadata'; +import { GuardsContextCreator } from './../guards/guards-context-creator'; +import { GuardsConsumer } from './../guards/guards-consumer'; +import { InterceptorsContextCreator } from './../interceptors/interceptors-context-creator'; +import { InterceptorsConsumer } from './../interceptors/interceptors-consumer'; +import { Controller } from '@nestjs/common/interfaces'; +import { Module } from './../injector/module'; +import { ModulesContainer } from './../injector/modules-container'; +export declare class ExternalContextCreator { + private readonly guardsContextCreator; + private readonly guardsConsumer; + private readonly interceptorsContextCreator; + private readonly interceptorsConsumer; + private readonly modulesContainer; + constructor( + guardsContextCreator: GuardsContextCreator, + guardsConsumer: GuardsConsumer, + interceptorsContextCreator: InterceptorsContextCreator, + interceptorsConsumer: InterceptorsConsumer, + modulesContainer: ModulesContainer, + ); + create( + instance: Controller, + callback: (...args) => any, + methodName: string, + ): (...args: any[]) => Promise; + findContextModuleName(constructor: Function): string; + findComponentByClassName(module: Module, className: string): boolean; +} diff --git a/lib/core/helpers/external-context-creator.js b/lib/core/helpers/external-context-creator.js new file mode 100644 index 000000000..13524e5c7 --- /dev/null +++ b/lib/core/helpers/external-context-creator.js @@ -0,0 +1,53 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +require("reflect-metadata"); +const constants_1 = require("../guards/constants"); +const common_1 = require("@nestjs/common"); +class ExternalContextCreator { + constructor(guardsContextCreator, guardsConsumer, interceptorsContextCreator, interceptorsConsumer, modulesContainer) { + this.guardsContextCreator = guardsContextCreator; + this.guardsConsumer = guardsConsumer; + this.interceptorsContextCreator = interceptorsContextCreator; + this.interceptorsConsumer = interceptorsConsumer; + this.modulesContainer = modulesContainer; + } + create(instance, callback, methodName) { + const module = this.findContextModuleName(instance.constructor); + const guards = this.guardsContextCreator.create(instance, callback, module); + const interceptors = this.interceptorsContextCreator.create(instance, callback, module); + return (...args) => __awaiter(this, void 0, void 0, function* () { + const canActivate = yield this.guardsConsumer.tryActivate(guards, args, instance, callback); + if (!canActivate) { + throw new common_1.HttpException(constants_1.FORBIDDEN_MESSAGE, common_1.HttpStatus.FORBIDDEN); + } + const handler = () => callback.apply(instance, args); + return yield this.interceptorsConsumer.intercept(interceptors, args, instance, callback, handler); + }); + } + findContextModuleName(constructor) { + const className = constructor.name; + if (!className) { + return ''; + } + for (const [key, module] of [...this.modulesContainer.entries()]) { + if (this.findComponentByClassName(module, className)) { + return key; + } + } + return ''; + } + findComponentByClassName(module, className) { + const { components } = module; + const hasComponent = [...components.keys()].find(component => component === className); + return !!hasComponent; + } +} +exports.ExternalContextCreator = ExternalContextCreator; diff --git a/lib/core/helpers/messages.d.ts b/lib/core/helpers/messages.d.ts new file mode 100644 index 000000000..5ac034db2 --- /dev/null +++ b/lib/core/helpers/messages.d.ts @@ -0,0 +1,6 @@ +export declare const moduleInitMessage: (module: string) => string; +export declare const routeMappedMessage: (path: string, method: any) => string; +export declare const controllerMappingMessage: ( + name: string, + path: string, +) => string; diff --git a/lib/core/helpers/messages.js b/lib/core/helpers/messages.js new file mode 100644 index 000000000..6d885da74 --- /dev/null +++ b/lib/core/helpers/messages.js @@ -0,0 +1,6 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const request_method_enum_1 = require("@nestjs/common/enums/request-method.enum"); +exports.moduleInitMessage = (module) => `${module} dependencies initialized`; +exports.routeMappedMessage = (path, method) => `Mapped {${path}, ${request_method_enum_1.RequestMethod[method]}} route`; +exports.controllerMappingMessage = (name, path) => `${name} {${path}}:`; diff --git a/lib/core/helpers/router-method-factory.d.ts b/lib/core/helpers/router-method-factory.d.ts new file mode 100644 index 000000000..26fa69778 --- /dev/null +++ b/lib/core/helpers/router-method-factory.d.ts @@ -0,0 +1,4 @@ +import { RequestMethod } from '@nestjs/common/enums/request-method.enum'; +export declare class RouterMethodFactory { + get(target: any, requestMethod: RequestMethod): any; +} diff --git a/lib/core/helpers/router-method-factory.js b/lib/core/helpers/router-method-factory.js new file mode 100644 index 000000000..3e9395e7d --- /dev/null +++ b/lib/core/helpers/router-method-factory.js @@ -0,0 +1,27 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const request_method_enum_1 = require("@nestjs/common/enums/request-method.enum"); +class RouterMethodFactory { + get(target, requestMethod) { + switch (requestMethod) { + case request_method_enum_1.RequestMethod.POST: + return target.post; + case request_method_enum_1.RequestMethod.ALL: + return target.use; + case request_method_enum_1.RequestMethod.DELETE: + return target.delete; + case request_method_enum_1.RequestMethod.PUT: + return target.put; + case request_method_enum_1.RequestMethod.PATCH: + return target.patch; + case request_method_enum_1.RequestMethod.OPTIONS: + return target.options; + case request_method_enum_1.RequestMethod.HEAD: + return target.head; + default: { + return target.get; + } + } + } +} +exports.RouterMethodFactory = RouterMethodFactory; diff --git a/lib/core/index.d.ts b/lib/core/index.d.ts new file mode 100644 index 000000000..e85d59874 --- /dev/null +++ b/lib/core/index.d.ts @@ -0,0 +1,7 @@ +export { MiddlewareBuilder } from './middlewares/builder'; +export { ModuleRef } from './injector/module-ref'; +export { NestFactory } from './nest-factory'; +export { APP_INTERCEPTOR, APP_FILTER, APP_GUARD, APP_PIPE } from './constants'; +export * from './services/reflector.service'; +export * from './nest-application'; +export * from './nest-application-context'; diff --git a/lib/core/index.js b/lib/core/index.js new file mode 100644 index 000000000..5aa152037 --- /dev/null +++ b/lib/core/index.js @@ -0,0 +1,25 @@ +"use strict"; +/* + * Nest @core + * Copyright(c) 2017 - 2018 Kamil Mysliwiec + * https://nestjs.com + * MIT Licensed + */ +function __export(m) { + for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p]; +} +Object.defineProperty(exports, "__esModule", { value: true }); +var builder_1 = require("./middlewares/builder"); +exports.MiddlewareBuilder = builder_1.MiddlewareBuilder; +var module_ref_1 = require("./injector/module-ref"); +exports.ModuleRef = module_ref_1.ModuleRef; +var nest_factory_1 = require("./nest-factory"); +exports.NestFactory = nest_factory_1.NestFactory; +var constants_1 = require("./constants"); +exports.APP_INTERCEPTOR = constants_1.APP_INTERCEPTOR; +exports.APP_FILTER = constants_1.APP_FILTER; +exports.APP_GUARD = constants_1.APP_GUARD; +exports.APP_PIPE = constants_1.APP_PIPE; +__export(require("./services/reflector.service")); +__export(require("./nest-application")); +__export(require("./nest-application-context")); diff --git a/lib/core/injector/container.d.ts b/lib/core/injector/container.d.ts new file mode 100644 index 000000000..12da2c9d3 --- /dev/null +++ b/lib/core/injector/container.d.ts @@ -0,0 +1,69 @@ +import 'reflect-metadata'; +import { Type } from '@nestjs/common/interfaces/type.interface'; +import { Module } from './module'; +import { DynamicModule } from '@nestjs/common'; +import { ModulesContainer } from './modules-container'; +import { ApplicationConfig } from './../application-config'; +export declare class NestContainer { + private readonly _applicationConfig; + private readonly globalModules; + private readonly modules; + private readonly dynamicModulesMetadata; + private readonly moduleTokenFactory; + private applicationRef; + constructor(_applicationConfig?: ApplicationConfig); + readonly applicationConfig: ApplicationConfig | undefined; + setApplicationRef(applicationRef: any): void; + getApplicationRef(): any; + addModule(metatype: Type | DynamicModule, scope: Type[]): void; + extractMetadata( + metatype: Type | DynamicModule, + ): { + type: Type; + dynamicMetadata?: Partial | undefined; + }; + isDynamicModule(module: Type | DynamicModule): module is DynamicModule; + addDynamicMetadata( + token: string, + dynamicModuleMetadata: Partial, + scope: Type[], + ): any; + addDynamicModules(modules: any[], scope: Type[]): void; + isGlobalModule(metatype: Type): boolean; + addGlobalModule(module: Module): void; + getModules(): ModulesContainer; + addRelatedModule( + relatedModule: Type | DynamicModule, + token: string, + ): void; + addComponent(component: Type, token: string): string; + addInjectable(injectable: Type, token: string): void; + addExportedComponent(exportedComponent: Type, token: string): void; + addController(controller: Type, token: string): void; + clear(): void; + replace( + toReplace: any, + options: any & { + scope: any[] | null; + }, + ): void; + bindGlobalScope(): void; + bindGlobalsToRelatedModules(module: Module): void; + bindGlobalModuleToModule(module: Module, globalModule: Module): any; + getDynamicMetadataByToken( + token: string, + metadataKey: keyof DynamicModule, + ): any[]; +} +export interface InstanceWrapper { + name: any; + metatype: Type; + instance: T; + isResolved: boolean; + isPending?: boolean; + done$?: Promise; + inject?: Type[]; + isNotMetatype?: boolean; + forwardRef?: boolean; + async?: boolean; +} diff --git a/lib/core/injector/container.js b/lib/core/injector/container.js new file mode 100644 index 000000000..4ea77b685 --- /dev/null +++ b/lib/core/injector/container.js @@ -0,0 +1,150 @@ +"use strict"; +var __rest = (this && this.__rest) || function (s, e) { + var t = {}; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) + t[p] = s[p]; + if (s != null && typeof Object.getOwnPropertySymbols === "function") + for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) if (e.indexOf(p[i]) < 0) + t[p[i]] = s[p[i]]; + return t; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +require("reflect-metadata"); +const constants_1 = require("@nestjs/common/constants"); +const module_1 = require("./module"); +const unknown_module_exception_1 = require("../errors/exceptions/unknown-module.exception"); +const module_token_factory_1 = require("./module-token-factory"); +const invalid_module_exception_1 = require("./../errors/exceptions/invalid-module.exception"); +const modules_container_1 = require("./modules-container"); +class NestContainer { + constructor(_applicationConfig = void 0) { + this._applicationConfig = _applicationConfig; + this.globalModules = new Set(); + this.modules = new modules_container_1.ModulesContainer(); + this.dynamicModulesMetadata = new Map(); + this.moduleTokenFactory = new module_token_factory_1.ModuleTokenFactory(); + } + get applicationConfig() { + return this._applicationConfig; + } + setApplicationRef(applicationRef) { + this.applicationRef = applicationRef; + } + getApplicationRef() { + return this.applicationRef; + } + addModule(metatype, scope) { + if (!metatype) { + throw new invalid_module_exception_1.InvalidModuleException(scope); + } + const { type, dynamicMetadata } = this.extractMetadata(metatype); + const token = this.moduleTokenFactory.create(type, scope, dynamicMetadata); + if (this.modules.has(token)) { + return; + } + const module = new module_1.Module(type, scope, this); + this.modules.set(token, module); + this.addDynamicMetadata(token, dynamicMetadata, [].concat(scope, type)); + this.isGlobalModule(type) && this.addGlobalModule(module); + } + extractMetadata(metatype) { + if (!this.isDynamicModule(metatype)) { + return { type: metatype }; + } + const { module: type } = metatype, dynamicMetadata = __rest(metatype, ["module"]); + return { type, dynamicMetadata }; + } + isDynamicModule(module) { + return !!module.module; + } + addDynamicMetadata(token, dynamicModuleMetadata, scope) { + if (!dynamicModuleMetadata) { + return undefined; + } + this.dynamicModulesMetadata.set(token, dynamicModuleMetadata); + const { modules, imports } = dynamicModuleMetadata; + this.addDynamicModules(modules, scope); + this.addDynamicModules(imports, scope); + } + addDynamicModules(modules, scope) { + if (!modules) { + return; + } + modules.map(module => this.addModule(module, scope)); + } + isGlobalModule(metatype) { + return !!Reflect.getMetadata(constants_1.GLOBAL_MODULE_METADATA, metatype); + } + addGlobalModule(module) { + this.globalModules.add(module); + } + getModules() { + return this.modules; + } + addRelatedModule(relatedModule, token) { + if (!this.modules.has(token)) + return; + const module = this.modules.get(token); + const parent = module.metatype; + const { type, dynamicMetadata } = this.extractMetadata(relatedModule); + const relatedModuleToken = this.moduleTokenFactory.create(type, [].concat(module.scope, parent), dynamicMetadata); + const related = this.modules.get(relatedModuleToken); + module.addRelatedModule(related); + } + addComponent(component, token) { + if (!this.modules.has(token)) { + throw new unknown_module_exception_1.UnknownModuleException(); + } + const module = this.modules.get(token); + return module.addComponent(component); + } + addInjectable(injectable, token) { + if (!this.modules.has(token)) { + throw new unknown_module_exception_1.UnknownModuleException(); + } + const module = this.modules.get(token); + module.addInjectable(injectable); + } + addExportedComponent(exportedComponent, token) { + if (!this.modules.has(token)) { + throw new unknown_module_exception_1.UnknownModuleException(); + } + const module = this.modules.get(token); + module.addExportedComponent(exportedComponent); + } + addController(controller, token) { + if (!this.modules.has(token)) { + throw new unknown_module_exception_1.UnknownModuleException(); + } + const module = this.modules.get(token); + module.addRoute(controller); + } + clear() { + this.modules.clear(); + } + replace(toReplace, options) { + [...this.modules.values()].forEach(module => { + module.replace(toReplace, options); + }); + } + bindGlobalScope() { + this.modules.forEach(module => this.bindGlobalsToRelatedModules(module)); + } + bindGlobalsToRelatedModules(module) { + this.globalModules.forEach(globalModule => this.bindGlobalModuleToModule(module, globalModule)); + } + bindGlobalModuleToModule(module, globalModule) { + if (module === globalModule) { + return undefined; + } + module.addRelatedModule(globalModule); + } + getDynamicMetadataByToken(token, metadataKey) { + const metadata = this.dynamicModulesMetadata.get(token); + if (metadata && metadata[metadataKey]) { + return metadata[metadataKey]; + } + return []; + } +} +exports.NestContainer = NestContainer; diff --git a/lib/core/injector/index.d.ts b/lib/core/injector/index.d.ts new file mode 100644 index 000000000..d0377ada4 --- /dev/null +++ b/lib/core/injector/index.d.ts @@ -0,0 +1,2 @@ +export * from './modules-container'; +export * from './tokens'; diff --git a/lib/core/injector/index.js b/lib/core/injector/index.js new file mode 100644 index 000000000..b1c509876 --- /dev/null +++ b/lib/core/injector/index.js @@ -0,0 +1,7 @@ +"use strict"; +function __export(m) { + for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p]; +} +Object.defineProperty(exports, "__esModule", { value: true }); +__export(require("./modules-container")); +__export(require("./tokens")); diff --git a/lib/core/injector/injector.d.ts b/lib/core/injector/injector.d.ts new file mode 100644 index 000000000..ec2342c1b --- /dev/null +++ b/lib/core/injector/injector.d.ts @@ -0,0 +1,144 @@ +import 'reflect-metadata'; +import { InstanceWrapper } from './container'; +import { Module } from './module'; +import { Type } from '@nestjs/common/interfaces/type.interface'; +import { Controller } from '@nestjs/common/interfaces/controllers/controller.interface'; +import { Injectable } from '@nestjs/common/interfaces/injectable.interface'; +import { MiddlewareWrapper } from '../middlewares/container'; +export declare class Injector { + loadInstanceOfMiddleware( + wrapper: MiddlewareWrapper, + collection: Map, + module: Module, + ): Promise; + loadInstanceOfRoute( + wrapper: InstanceWrapper, + module: Module, + ): Promise; + loadInstanceOfInjectable( + wrapper: InstanceWrapper, + module: Module, + ): Promise; + loadPrototypeOfInstance( + { metatype, name }: InstanceWrapper, + collection: Map>, + ): any; + loadInstanceOfComponent( + wrapper: InstanceWrapper, + module: Module, + context?: Module[], + ): Promise; + applyDoneSubject(wrapper: InstanceWrapper): () => void; + loadInstance( + wrapper: InstanceWrapper, + collection: any, + module: Module, + context?: Module[], + ): Promise; + resolveConstructorParams( + wrapper: InstanceWrapper, + module: Module, + inject: any[], + context: Module[], + callback: (args) => void, + ): Promise; + reflectConstructorParams(type: Type): any[]; + reflectSelfParams(type: Type): any[]; + resolveSingleParam( + wrapper: InstanceWrapper, + param: Type | string | symbol | any, + { + index, + length, + }: { + index: number; + length: number; + }, + module: Module, + context: Module[], + ): Promise; + resolveParamToken( + wrapper: InstanceWrapper, + param: Type | string | symbol | any, + ): any; + resolveComponentInstance( + module: Module, + name: any, + { + index, + length, + }: { + index: number; + length: number; + }, + wrapper: InstanceWrapper, + context: Module[], + ): Promise; + scanForComponent( + components: Map, + module: Module, + { + name, + index, + length, + }: { + name: any; + index: number; + length: number; + }, + { + metatype, + }: { + metatype: any; + }, + context?: Module[], + ): any; + scanForComponentInExports( + components: Map, + { + name, + index, + length, + }: { + name: any; + index: number; + length: number; + }, + module: Module, + metatype: any, + context?: Module[], + ): Promise; + scanForComponentInScopes( + context: Module[], + { + name, + index, + length, + }: { + name: any; + index: number; + length: number; + }, + metatype: any, + ): any; + scanForComponentInScope( + context: Module, + { + name, + index, + length, + }: { + name: any; + index: number; + length: number; + }, + metatype: any, + ): any; + scanForComponentInRelatedModules( + module: Module, + name: any, + context: Module[], + ): Promise; + resolveFactoryInstance(factoryResult: any): Promise; + flatMap(modules: Module[]): Module[]; +} diff --git a/lib/core/injector/injector.js b/lib/core/injector/injector.js new file mode 100644 index 000000000..ec44e5fbe --- /dev/null +++ b/lib/core/injector/injector.js @@ -0,0 +1,234 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +require("reflect-metadata"); +const unknown_dependencies_exception_1 = require("../errors/exceptions/unknown-dependencies.exception"); +const runtime_exception_1 = require("../errors/exceptions/runtime.exception"); +const shared_utils_1 = require("@nestjs/common/utils/shared.utils"); +const constants_1 = require("@nestjs/common/constants"); +const undefined_dependency_exception_1 = require("./../errors/exceptions/undefined-dependency.exception"); +class Injector { + loadInstanceOfMiddleware(wrapper, collection, module) { + return __awaiter(this, void 0, void 0, function* () { + const { metatype } = wrapper; + const currentMetatype = collection.get(metatype.name); + if (currentMetatype.instance !== null) + return; + yield this.resolveConstructorParams(wrapper, module, null, null, instances => { + collection.set(metatype.name, { + instance: new metatype(...instances), + metatype, + }); + }); + }); + } + loadInstanceOfRoute(wrapper, module) { + return __awaiter(this, void 0, void 0, function* () { + const routes = module.routes; + yield this.loadInstance(wrapper, routes, module); + }); + } + loadInstanceOfInjectable(wrapper, module) { + return __awaiter(this, void 0, void 0, function* () { + const injectables = module.injectables; + yield this.loadInstance(wrapper, injectables, module); + }); + } + loadPrototypeOfInstance({ metatype, name }, collection) { + if (!collection) + return null; + const target = collection.get(name); + if (target.isResolved || !shared_utils_1.isNil(target.inject) || !metatype.prototype) + return null; + collection.set(name, Object.assign({}, collection.get(name), { instance: Object.create(metatype.prototype) })); + } + loadInstanceOfComponent(wrapper, module, context = []) { + return __awaiter(this, void 0, void 0, function* () { + const components = module.components; + yield this.loadInstance(wrapper, components, module, context); + }); + } + applyDoneSubject(wrapper) { + let done; + wrapper.done$ = new Promise((resolve, reject) => { + done = resolve; + }); + wrapper.isPending = true; + return done; + } + loadInstance(wrapper, collection, module, context = []) { + return __awaiter(this, void 0, void 0, function* () { + if (wrapper.isPending) { + return yield wrapper.done$; + } + const done = this.applyDoneSubject(wrapper); + const { metatype, name, inject } = wrapper; + const currentMetatype = collection.get(name); + if (shared_utils_1.isUndefined(currentMetatype)) { + throw new runtime_exception_1.RuntimeException(); + } + if (currentMetatype.isResolved) + return null; + yield this.resolveConstructorParams(wrapper, module, inject, context, (instances) => __awaiter(this, void 0, void 0, function* () { + if (shared_utils_1.isNil(inject)) { + currentMetatype.instance = Object.assign(currentMetatype.instance, new metatype(...instances)); + } + else { + const factoryResult = currentMetatype.metatype(...instances); + currentMetatype.instance = yield this.resolveFactoryInstance(factoryResult); + } + currentMetatype.isResolved = true; + done(); + })); + }); + } + resolveConstructorParams(wrapper, module, inject, context, callback) { + return __awaiter(this, void 0, void 0, function* () { + let isResolved = true; + const args = shared_utils_1.isNil(inject) + ? this.reflectConstructorParams(wrapper.metatype) + : inject; + const instances = yield Promise.all(args.map((param, index) => __awaiter(this, void 0, void 0, function* () { + const paramWrapper = yield this.resolveSingleParam(wrapper, param, { index, length: args.length }, module, context); + if (!paramWrapper.isResolved && !paramWrapper.forwardRef) { + isResolved = false; + } + return paramWrapper.instance; + }))); + isResolved && (yield callback(instances)); + }); + } + reflectConstructorParams(type) { + const paramtypes = Reflect.getMetadata(constants_1.PARAMTYPES_METADATA, type) || []; + const selfParams = this.reflectSelfParams(type); + selfParams.forEach(({ index, param }) => (paramtypes[index] = param)); + return paramtypes; + } + reflectSelfParams(type) { + return Reflect.getMetadata(constants_1.SELF_DECLARED_DEPS_METADATA, type) || []; + } + resolveSingleParam(wrapper, param, { index, length }, module, context) { + return __awaiter(this, void 0, void 0, function* () { + if (shared_utils_1.isUndefined(param)) { + throw new undefined_dependency_exception_1.UndefinedDependencyException(wrapper.name, index, length); + } + const token = this.resolveParamToken(wrapper, param); + return yield this.resolveComponentInstance(module, shared_utils_1.isFunction(token) ? token.name : token, { index, length }, wrapper, context); + }); + } + resolveParamToken(wrapper, param) { + if (!param.forwardRef) { + return param; + } + wrapper.forwardRef = true; + return param.forwardRef(); + } + resolveComponentInstance(module, name, { index, length }, wrapper, context) { + return __awaiter(this, void 0, void 0, function* () { + const components = module.components; + const instanceWrapper = yield this.scanForComponent(components, module, { name, index, length }, wrapper, context); + if (!instanceWrapper.isResolved && !instanceWrapper.forwardRef) { + yield this.loadInstanceOfComponent(instanceWrapper, module); + } + if (instanceWrapper.async) { + instanceWrapper.instance = yield instanceWrapper.instance; + } + return instanceWrapper; + }); + } + scanForComponent(components, module, { name, index, length }, { metatype }, context = []) { + return __awaiter(this, void 0, void 0, function* () { + const component = yield this.scanForComponentInScopes(context, { name, index, length }, metatype); + if (component) { + return component; + } + const scanInExports = () => this.scanForComponentInExports(components, { name, index, length }, module, metatype, context); + return components.has(name) ? components.get(name) : yield scanInExports(); + }); + } + scanForComponentInExports(components, { name, index, length }, module, metatype, context = []) { + return __awaiter(this, void 0, void 0, function* () { + const instanceWrapper = yield this.scanForComponentInRelatedModules(module, name, context); + if (shared_utils_1.isNil(instanceWrapper)) { + throw new unknown_dependencies_exception_1.UnknownDependenciesException(metatype.name, index, length); + } + return instanceWrapper; + }); + } + scanForComponentInScopes(context, { name, index, length }, metatype) { + return __awaiter(this, void 0, void 0, function* () { + context = context || []; + for (const ctx of context) { + const component = yield this.scanForComponentInScope(ctx, { name, index, length }, metatype); + if (component) + return component; + } + return null; + }); + } + scanForComponentInScope(context, { name, index, length }, metatype) { + return __awaiter(this, void 0, void 0, function* () { + try { + const component = yield this.scanForComponent(context.components, context, { name, index, length }, { metatype }, null); + if (!component.isResolved && !component.forwardRef) { + yield this.loadInstanceOfComponent(component, context); + } + return component; + } + catch (e) { + if (e instanceof runtime_exception_1.RuntimeException) { + return null; + } + throw e; + } + }); + } + scanForComponentInRelatedModules(module, name, context) { + return __awaiter(this, void 0, void 0, function* () { + let component = null; + const relatedModules = module.relatedModules || []; + for (const relatedModule of this.flatMap([...relatedModules.values()])) { + const { components, exports } = relatedModule; + const isInScope = context === null; + if ((!exports.has(name) && !isInScope) || !components.has(name)) { + continue; + } + component = components.get(name); + if (!component.isResolved && !component.forwardRef) { + const ctx = isInScope ? [module] : [].concat(context, module); + yield this.loadInstanceOfComponent(component, relatedModule, ctx); + break; + } + } + return component; + }); + } + resolveFactoryInstance(factoryResult) { + return __awaiter(this, void 0, void 0, function* () { + if (!(factoryResult instanceof Promise)) { + return factoryResult; + } + const result = yield factoryResult; + return result; + }); + } + flatMap(modules) { + return modules.concat.apply(modules, modules.map((module) => { + const { relatedModules, exports } = module; + return this.flatMap([...relatedModules.values()] + .filter(related => !!related) + .filter(related => { + const { metatype } = related; + return exports.has(metatype.name); + })); + })); + } +} +exports.Injector = Injector; diff --git a/lib/core/injector/instance-loader.d.ts b/lib/core/injector/instance-loader.d.ts new file mode 100644 index 000000000..2494741b8 --- /dev/null +++ b/lib/core/injector/instance-loader.d.ts @@ -0,0 +1,16 @@ +import { NestContainer } from './container'; +export declare class InstanceLoader { + private readonly container; + private readonly injector; + private readonly logger; + constructor(container: NestContainer); + createInstancesOfDependencies(): Promise; + private createPrototypes(modules); + private createInstances(modules); + private createPrototypesOfComponents(module); + private createInstancesOfComponents(module); + private createPrototypesOfRoutes(module); + private createInstancesOfRoutes(module); + private createPrototypesOfInjectables(module); + private createInstancesOfInjectables(module); +} diff --git a/lib/core/injector/instance-loader.js b/lib/core/injector/instance-loader.js new file mode 100644 index 000000000..b23e2a9ea --- /dev/null +++ b/lib/core/injector/instance-loader.js @@ -0,0 +1,78 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const injector_1 = require("./injector"); +const common_1 = require("@nestjs/common"); +const messages_1 = require("../helpers/messages"); +class InstanceLoader { + constructor(container) { + this.container = container; + this.injector = new injector_1.Injector(); + this.logger = new common_1.Logger(InstanceLoader.name, true); + } + createInstancesOfDependencies() { + return __awaiter(this, void 0, void 0, function* () { + const modules = this.container.getModules(); + this.createPrototypes(modules); + yield this.createInstances(modules); + }); + } + createPrototypes(modules) { + modules.forEach(module => { + this.createPrototypesOfComponents(module); + this.createPrototypesOfInjectables(module); + this.createPrototypesOfRoutes(module); + }); + } + createInstances(modules) { + return __awaiter(this, void 0, void 0, function* () { + for (const module of [...modules.values()]) { + yield this.createInstancesOfComponents(module); + yield this.createInstancesOfInjectables(module); + yield this.createInstancesOfRoutes(module); + const { name } = module.metatype; + this.logger.log(messages_1.moduleInitMessage(name)); + } + }); + } + createPrototypesOfComponents(module) { + module.components.forEach(wrapper => { + this.injector.loadPrototypeOfInstance(wrapper, module.components); + }); + } + createInstancesOfComponents(module) { + return __awaiter(this, void 0, void 0, function* () { + for (const [key, wrapper] of module.components) { + yield this.injector.loadInstanceOfComponent(wrapper, module); + } + }); + } + createPrototypesOfRoutes(module) { + module.routes.forEach(wrapper => { + this.injector.loadPrototypeOfInstance(wrapper, module.routes); + }); + } + createInstancesOfRoutes(module) { + return __awaiter(this, void 0, void 0, function* () { + yield Promise.all([...module.routes.values()].map((wrapper) => __awaiter(this, void 0, void 0, function* () { return yield this.injector.loadInstanceOfRoute(wrapper, module); }))); + }); + } + createPrototypesOfInjectables(module) { + module.injectables.forEach(wrapper => { + this.injector.loadPrototypeOfInstance(wrapper, module.injectables); + }); + } + createInstancesOfInjectables(module) { + return __awaiter(this, void 0, void 0, function* () { + yield Promise.all([...module.injectables.values()].map((wrapper) => __awaiter(this, void 0, void 0, function* () { return yield this.injector.loadInstanceOfInjectable(wrapper, module); }))); + }); + } +} +exports.InstanceLoader = InstanceLoader; diff --git a/lib/core/injector/module-ref.d.ts b/lib/core/injector/module-ref.d.ts new file mode 100644 index 000000000..8c4ada880 --- /dev/null +++ b/lib/core/injector/module-ref.d.ts @@ -0,0 +1,4 @@ +import { OpaqueToken } from './module'; +export abstract class ModuleRef { + abstract get(type: OpaqueToken): T; +} diff --git a/lib/core/injector/module-ref.js b/lib/core/injector/module-ref.js new file mode 100644 index 000000000..d5f06f1c9 --- /dev/null +++ b/lib/core/injector/module-ref.js @@ -0,0 +1,5 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +class ModuleRef { +} +exports.ModuleRef = ModuleRef; diff --git a/lib/core/injector/module-token-factory.d.ts b/lib/core/injector/module-token-factory.d.ts new file mode 100644 index 000000000..1ce404eae --- /dev/null +++ b/lib/core/injector/module-token-factory.d.ts @@ -0,0 +1,15 @@ +import { Type } from '@nestjs/common/interfaces/type.interface'; +import { DynamicModule } from '@nestjs/common'; +export declare class ModuleTokenFactory { + create( + metatype: Type, + scope: Type[], + dynamicModuleMetadata?: Partial | undefined, + ): string; + getDynamicMetadataToken( + dynamicModuleMetadata: Partial | undefined, + ): string; + getModuleName(metatype: Type): string; + getScopeStack(scope: Type[]): string[]; + private reflectScope(metatype); +} diff --git a/lib/core/injector/module-token-factory.js b/lib/core/injector/module-token-factory.js new file mode 100644 index 000000000..0a8d39212 --- /dev/null +++ b/lib/core/injector/module-token-factory.js @@ -0,0 +1,35 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const constants_1 = require("@nestjs/common/constants"); +class ModuleTokenFactory { + create(metatype, scope, dynamicModuleMetadata) { + const reflectedScope = this.reflectScope(metatype); + const isSingleScoped = reflectedScope === true; + const opaqueToken = { + module: this.getModuleName(metatype), + dynamic: this.getDynamicMetadataToken(dynamicModuleMetadata), + scope: isSingleScoped ? this.getScopeStack(scope) : reflectedScope, + }; + return JSON.stringify(opaqueToken); + } + getDynamicMetadataToken(dynamicModuleMetadata) { + return dynamicModuleMetadata ? JSON.stringify(dynamicModuleMetadata) : ''; + } + getModuleName(metatype) { + return metatype.name; + } + getScopeStack(scope) { + const reversedScope = scope.reverse(); + const firstGlobalIndex = reversedScope.findIndex(s => this.reflectScope(s) === 'global'); + scope.reverse(); + const stack = firstGlobalIndex >= 0 + ? scope.slice(scope.length - firstGlobalIndex - 1) + : scope; + return stack.map(module => module.name); + } + reflectScope(metatype) { + const scope = Reflect.getMetadata(constants_1.SHARED_MODULE_METADATA, metatype); + return scope ? scope : 'global'; + } +} +exports.ModuleTokenFactory = ModuleTokenFactory; diff --git a/lib/core/injector/module.d.ts b/lib/core/injector/module.d.ts new file mode 100644 index 000000000..bb12a698d --- /dev/null +++ b/lib/core/injector/module.d.ts @@ -0,0 +1,94 @@ +import { InstanceWrapper, NestContainer } from './container'; +import { + Injectable, + Controller, + NestModule, + DynamicModule, +} from '@nestjs/common/interfaces'; +import { Type } from '@nestjs/common/interfaces/type.interface'; +export interface CustomComponent { + provide: any; + name: string; +} +export declare type OpaqueToken = string | symbol | object | Type; +export declare type CustomClass = CustomComponent & { + useClass: Type; +}; +export declare type CustomFactory = CustomComponent & { + useFactory: (...args) => any; + inject?: OpaqueToken[]; +}; +export declare type CustomValue = CustomComponent & { + useValue: any; +}; +export declare type ComponentMetatype = + | Type + | CustomFactory + | CustomValue + | CustomClass; +export declare class Module { + private readonly _metatype; + private readonly _scope; + private _relatedModules; + private _components; + private _injectables; + private _routes; + private _exports; + constructor( + _metatype: Type, + _scope: Type[], + container: NestContainer, + ); + readonly scope: Type[]; + readonly relatedModules: Set; + readonly components: Map>; + readonly injectables: Map>; + readonly routes: Map>; + readonly exports: Set; + readonly instance: NestModule; + readonly metatype: Type; + addCoreInjectables(container: NestContainer): void; + addModuleRef(): void; + addModuleAsComponent(): void; + addReflector(): void; + addApplicationRef(applicationRef: any): void; + addExternalContextCreator(container: NestContainer): void; + addModulesContainer(container: NestContainer): void; + addInjectable(injectable: Type): string; + addComponent(component: ComponentMetatype): string; + isCustomProvider( + component: ComponentMetatype, + ): component is CustomClass | CustomFactory | CustomValue; + addCustomProvider( + component: CustomFactory | CustomValue | CustomClass, + collection: Map, + ): string; + isCustomClass(component: any): component is CustomClass; + isCustomValue(component: any): component is CustomValue; + isCustomFactory(component: any): component is CustomFactory; + isDynamicModule(exported: any): exported is DynamicModule; + addCustomClass(component: CustomClass, collection: Map): void; + addCustomValue(component: CustomValue, collection: Map): void; + addCustomFactory( + component: CustomFactory, + collection: Map, + ): void; + addExportedComponent( + exportedComponent: ComponentMetatype | string | DynamicModule, + ): Set; + addCustomExportedComponent( + exportedComponent: CustomFactory | CustomValue | CustomClass, + ): Set; + validateExportedProvider(token: string): string; + addRoute(route: Type): void; + addRelatedModule(relatedModule: any): void; + replace(toReplace: any, options: any): string; + createModuleRefMetatype( + components: any, + ): { + new (): { + readonly components: any; + get(type: OpaqueToken): T; + }; + }; +} diff --git a/lib/core/injector/module.js b/lib/core/injector/module.js new file mode 100644 index 000000000..49df8b488 --- /dev/null +++ b/lib/core/injector/module.js @@ -0,0 +1,258 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const unknown_export_exception_1 = require("../errors/exceptions/unknown-export.exception"); +const module_ref_1 = require("./module-ref"); +const shared_utils_1 = require("@nestjs/common/utils/shared.utils"); +const runtime_exception_1 = require("../errors/exceptions/runtime.exception"); +const external_context_creator_1 = require("./../helpers/external-context-creator"); +const guards_context_creator_1 = require("./../guards/guards-context-creator"); +const interceptors_context_creator_1 = require("./../interceptors/interceptors-context-creator"); +const interceptors_consumer_1 = require("./../interceptors/interceptors-consumer"); +const guards_consumer_1 = require("./../guards/guards-consumer"); +const modules_container_1 = require("./modules-container"); +const reflector_service_1 = require("../services/reflector.service"); +const tokens_1 = require("./tokens"); +class Module { + constructor(_metatype, _scope, container) { + this._metatype = _metatype; + this._scope = _scope; + this._relatedModules = new Set(); + this._components = new Map(); + this._injectables = new Map(); + this._routes = new Map(); + this._exports = new Set(); + this.addCoreInjectables(container); + } + get scope() { + return this._scope; + } + get relatedModules() { + return this._relatedModules; + } + get components() { + return this._components; + } + get injectables() { + return this._injectables; + } + get routes() { + return this._routes; + } + get exports() { + return this._exports; + } + get instance() { + if (!this._components.has(this._metatype.name)) { + throw new runtime_exception_1.RuntimeException(); + } + const module = this._components.get(this._metatype.name); + return module.instance; + } + get metatype() { + return this._metatype; + } + addCoreInjectables(container) { + this.addModuleRef(); + this.addModuleAsComponent(); + this.addReflector(); + this.addApplicationRef(container.getApplicationRef()); + this.addExternalContextCreator(container); + this.addModulesContainer(container); + } + addModuleRef() { + const moduleRef = this.createModuleRefMetatype(this._components); + this._components.set(module_ref_1.ModuleRef.name, { + name: module_ref_1.ModuleRef.name, + metatype: module_ref_1.ModuleRef, + isResolved: true, + instance: new moduleRef(), + }); + } + addModuleAsComponent() { + this._components.set(this._metatype.name, { + name: this._metatype.name, + metatype: this._metatype, + isResolved: false, + instance: null, + }); + } + addReflector() { + this._components.set(reflector_service_1.Reflector.name, { + name: reflector_service_1.Reflector.name, + metatype: reflector_service_1.Reflector, + isResolved: false, + instance: null, + }); + } + addApplicationRef(applicationRef) { + this._components.set(tokens_1.HTTP_SERVER_REF, { + name: tokens_1.HTTP_SERVER_REF, + metatype: {}, + isResolved: true, + instance: applicationRef || {}, + }); + } + addExternalContextCreator(container) { + this._components.set(external_context_creator_1.ExternalContextCreator.name, { + name: external_context_creator_1.ExternalContextCreator.name, + metatype: external_context_creator_1.ExternalContextCreator, + isResolved: true, + instance: new external_context_creator_1.ExternalContextCreator(new guards_context_creator_1.GuardsContextCreator(container, container.applicationConfig), new guards_consumer_1.GuardsConsumer(), new interceptors_context_creator_1.InterceptorsContextCreator(container, container.applicationConfig), new interceptors_consumer_1.InterceptorsConsumer(), container.getModules()), + }); + } + addModulesContainer(container) { + this._components.set(modules_container_1.ModulesContainer.name, { + name: modules_container_1.ModulesContainer.name, + metatype: modules_container_1.ModulesContainer, + isResolved: true, + instance: container.getModules(), + }); + } + addInjectable(injectable) { + if (this.isCustomProvider(injectable)) { + return this.addCustomProvider(injectable, this._injectables); + } + this._injectables.set(injectable.name, { + name: injectable.name, + metatype: injectable, + instance: null, + isResolved: false, + }); + } + addComponent(component) { + if (this.isCustomProvider(component)) { + return this.addCustomProvider(component, this._components); + } + this._components.set(component.name, { + name: component.name, + metatype: component, + instance: null, + isResolved: false, + }); + return component.name; + } + isCustomProvider(component) { + return !shared_utils_1.isNil(component.provide); + } + addCustomProvider(component, collection) { + const { provide } = component; + const name = shared_utils_1.isFunction(provide) ? provide.name : provide; + const comp = Object.assign({}, component, { name }); + if (this.isCustomClass(comp)) + this.addCustomClass(comp, collection); + else if (this.isCustomValue(comp)) + this.addCustomValue(comp, collection); + else if (this.isCustomFactory(comp)) + this.addCustomFactory(comp, collection); + return name; + } + isCustomClass(component) { + return !shared_utils_1.isUndefined(component.useClass); + } + isCustomValue(component) { + return !shared_utils_1.isUndefined(component.useValue); + } + isCustomFactory(component) { + return !shared_utils_1.isUndefined(component.useFactory); + } + isDynamicModule(exported) { + return exported && exported.module; + } + addCustomClass(component, collection) { + const { provide, name, useClass } = component; + collection.set(name, { + name, + metatype: useClass, + instance: null, + isResolved: false, + }); + } + addCustomValue(component, collection) { + const { provide, name, useValue: value } = component; + collection.set(name, { + name, + metatype: null, + instance: value, + isResolved: true, + isNotMetatype: true, + async: value instanceof Promise, + }); + } + addCustomFactory(component, collection) { + const { provide, name, useFactory: factory, inject } = component; + collection.set(name, { + name, + metatype: factory, + instance: null, + isResolved: false, + inject: inject || [], + isNotMetatype: true, + }); + } + addExportedComponent(exportedComponent) { + const addExportedUnit = (token) => this._exports.add(this.validateExportedProvider(token)); + if (this.isCustomProvider(exportedComponent)) { + return this.addCustomExportedComponent(exportedComponent); + } + else if (shared_utils_1.isString(exportedComponent)) { + return addExportedUnit(exportedComponent); + } + else if (this.isDynamicModule(exportedComponent)) { + const { module } = exportedComponent; + return addExportedUnit(module.name); + } + addExportedUnit(exportedComponent.name); + } + addCustomExportedComponent(exportedComponent) { + const provide = exportedComponent.provide; + if (shared_utils_1.isString(provide) || shared_utils_1.isSymbol(provide)) { + return this._exports.add(this.validateExportedProvider(provide)); + } + this._exports.add(this.validateExportedProvider(provide.name)); + } + validateExportedProvider(token) { + if (this._components.has(token)) { + return token; + } + const relatedModules = [...this._relatedModules.values()]; + const modulesTokens = relatedModules + .map(({ metatype }) => metatype) + .filter(metatype => !!metatype) + .map(({ name }) => name); + if (modulesTokens.indexOf(token) < 0) { + const { name } = this.metatype; + throw new unknown_export_exception_1.UnknownExportException(name); + } + return token; + } + addRoute(route) { + this._routes.set(route.name, { + name: route.name, + metatype: route, + instance: null, + isResolved: false, + }); + } + addRelatedModule(relatedModule) { + this._relatedModules.add(relatedModule); + } + replace(toReplace, options) { + if (options.isComponent) { + return this.addComponent(Object.assign({ provide: toReplace }, options)); + } + this.addInjectable(Object.assign({ provide: toReplace }, options)); + } + createModuleRefMetatype(components) { + return class { + constructor() { + this.components = components; + } + get(type) { + const name = shared_utils_1.isFunction(type) ? type.name : type; + const exists = this.components.has(name); + return exists ? this.components.get(name).instance : null; + } + }; + } +} +exports.Module = Module; diff --git a/lib/core/injector/modules-container.d.ts b/lib/core/injector/modules-container.d.ts new file mode 100644 index 000000000..7eb90a234 --- /dev/null +++ b/lib/core/injector/modules-container.d.ts @@ -0,0 +1,2 @@ +import { Module } from './module'; +export declare class ModulesContainer extends Map {} diff --git a/lib/core/injector/modules-container.js b/lib/core/injector/modules-container.js new file mode 100644 index 000000000..f4e51e134 --- /dev/null +++ b/lib/core/injector/modules-container.js @@ -0,0 +1,5 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +class ModulesContainer extends Map { +} +exports.ModulesContainer = ModulesContainer; diff --git a/lib/core/injector/tokens.d.ts b/lib/core/injector/tokens.d.ts new file mode 100644 index 000000000..da31434a5 --- /dev/null +++ b/lib/core/injector/tokens.d.ts @@ -0,0 +1 @@ +export declare const HTTP_SERVER_REF = 'HTTP_SERVER_REF'; diff --git a/lib/core/injector/tokens.js b/lib/core/injector/tokens.js new file mode 100644 index 000000000..421fa56ca --- /dev/null +++ b/lib/core/injector/tokens.js @@ -0,0 +1,3 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.HTTP_SERVER_REF = 'HTTP_SERVER_REF'; diff --git a/lib/core/interceptors/interceptors-consumer.d.ts b/lib/core/interceptors/interceptors-consumer.d.ts new file mode 100644 index 000000000..0c2e4699b --- /dev/null +++ b/lib/core/interceptors/interceptors-consumer.d.ts @@ -0,0 +1,19 @@ +import { Controller } from '@nestjs/common/interfaces'; +import { NestInterceptor } from '@nestjs/common'; +import { Observable } from 'rxjs/Observable'; +import { ExecutionContextHost } from '../helpers/execution-context.host'; +export declare class InterceptorsConsumer { + intercept( + interceptors: NestInterceptor[], + args: any[], + instance: Controller, + callback: (...args) => any, + next: () => Promise, + ): Promise; + createContext( + args: any[], + instance: Controller, + callback: (...args) => any, + ): ExecutionContextHost; + transformDeffered(next: () => Promise): Observable; +} diff --git a/lib/core/interceptors/interceptors-consumer.js b/lib/core/interceptors/interceptors-consumer.js new file mode 100644 index 000000000..1262a1b7d --- /dev/null +++ b/lib/core/interceptors/interceptors-consumer.js @@ -0,0 +1,39 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const shared_utils_1 = require("@nestjs/common/utils/shared.utils"); +const Observable_1 = require("rxjs/Observable"); +const defer_1 = require("rxjs/observable/defer"); +const fromPromise_1 = require("rxjs/observable/fromPromise"); +const operators_1 = require("rxjs/operators"); +const execution_context_host_1 = require("../helpers/execution-context.host"); +class InterceptorsConsumer { + intercept(interceptors, args, instance, callback, next) { + return __awaiter(this, void 0, void 0, function* () { + if (!interceptors || shared_utils_1.isEmpty(interceptors)) { + return yield yield next(); + } + const context = this.createContext(args, instance, callback); + const start$ = defer_1.defer(() => this.transformDeffered(next)); + const result$ = yield interceptors.reduce((stream$, interceptor) => __awaiter(this, void 0, void 0, function* () { return yield interceptor.intercept(context, yield stream$); }), Promise.resolve(start$)); + return yield result$.toPromise(); + }); + } + createContext(args, instance, callback) { + return new execution_context_host_1.ExecutionContextHost(args, instance.constructor, callback); + } + transformDeffered(next) { + return fromPromise_1.fromPromise(next()).pipe(operators_1.switchMap(res => { + const isDeffered = res instanceof Promise || res instanceof Observable_1.Observable; + return isDeffered ? res : Promise.resolve(res); + })); + } +} +exports.InterceptorsConsumer = InterceptorsConsumer; diff --git a/lib/core/interceptors/interceptors-context-creator.d.ts b/lib/core/interceptors/interceptors-context-creator.d.ts new file mode 100644 index 000000000..b6326f7ad --- /dev/null +++ b/lib/core/interceptors/interceptors-context-creator.d.ts @@ -0,0 +1,26 @@ +import 'reflect-metadata'; +import { Controller, NestInterceptor } from '@nestjs/common/interfaces'; +import { ContextCreator } from './../helpers/context-creator'; +import { NestContainer } from '../injector/container'; +import { ConfigurationProvider } from '@nestjs/common/interfaces/configuration-provider.interface'; +export declare class InterceptorsContextCreator extends ContextCreator { + private readonly container; + private readonly config; + private moduleContext; + constructor(container: NestContainer, config?: ConfigurationProvider); + create( + instance: Controller, + callback: (...args) => any, + module: string, + ): NestInterceptor[]; + createConcreteContext(metadata: T): R; + createGlobalMetadataContext(metadata: T): R; + getInstanceByMetatype( + metatype: any, + ): + | { + instance: any; + } + | undefined; + getGlobalMetadata(): T; +} diff --git a/lib/core/interceptors/interceptors-context-creator.js b/lib/core/interceptors/interceptors-context-creator.js new file mode 100644 index 000000000..171be5a0f --- /dev/null +++ b/lib/core/interceptors/interceptors-context-creator.js @@ -0,0 +1,55 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +require("reflect-metadata"); +const iterare_1 = require("iterare"); +const constants_1 = require("@nestjs/common/constants"); +const shared_utils_1 = require("@nestjs/common/utils/shared.utils"); +const context_creator_1 = require("./../helpers/context-creator"); +class InterceptorsContextCreator extends context_creator_1.ContextCreator { + constructor(container, config) { + super(); + this.container = container; + this.config = config; + } + create(instance, callback, module) { + this.moduleContext = module; + return this.createContext(instance, callback, constants_1.INTERCEPTORS_METADATA); + } + createConcreteContext(metadata) { + if (shared_utils_1.isUndefined(metadata) || shared_utils_1.isEmpty(metadata) || !this.moduleContext) { + return []; + } + const isGlobalMetadata = metadata === this.getGlobalMetadata(); + return isGlobalMetadata + ? this.createGlobalMetadataContext(metadata) + : iterare_1.default(metadata) + .filter((metatype) => metatype && metatype.name) + .map(metatype => this.getInstanceByMetatype(metatype)) + .filter((wrapper) => wrapper && wrapper.instance) + .map(wrapper => wrapper.instance) + .filter((interceptor) => interceptor && shared_utils_1.isFunction(interceptor.intercept)) + .toArray(); + } + createGlobalMetadataContext(metadata) { + return iterare_1.default(metadata) + .filter(interceptor => interceptor && + interceptor.intercept && + shared_utils_1.isFunction(interceptor.intercept)) + .toArray(); + } + getInstanceByMetatype(metatype) { + const collection = this.container.getModules(); + const module = collection.get(this.moduleContext); + if (!module) { + return undefined; + } + return module.injectables.get(metatype.name); + } + getGlobalMetadata() { + if (!this.config) { + return []; + } + return this.config.getGlobalInterceptors(); + } +} +exports.InterceptorsContextCreator = InterceptorsContextCreator; diff --git a/lib/core/metadata-scanner.d.ts b/lib/core/metadata-scanner.d.ts new file mode 100644 index 000000000..5e444a1a2 --- /dev/null +++ b/lib/core/metadata-scanner.d.ts @@ -0,0 +1,9 @@ +import { Injectable } from '@nestjs/common/interfaces/injectable.interface'; +export declare class MetadataScanner { + scanFromPrototype( + instance: T, + prototype: any, + callback: (name: string) => R, + ): R[]; + getAllFilteredMethodNames(prototype: any): IterableIterator; +} diff --git a/lib/core/metadata-scanner.js b/lib/core/metadata-scanner.js new file mode 100644 index 000000000..251679209 --- /dev/null +++ b/lib/core/metadata-scanner.js @@ -0,0 +1,27 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const iterare_1 = require("iterare"); +const shared_utils_1 = require("@nestjs/common/utils/shared.utils"); +class MetadataScanner { + scanFromPrototype(instance, prototype, callback) { + return iterare_1.default([...this.getAllFilteredMethodNames(prototype)]) + .map(callback) + .filter(metadata => !shared_utils_1.isNil(metadata)) + .toArray(); + } + *getAllFilteredMethodNames(prototype) { + do { + yield* iterare_1.default(Object.getOwnPropertyNames(prototype)) + .filter(prop => { + const descriptor = Object.getOwnPropertyDescriptor(prototype, prop); + if (descriptor.set || descriptor.get) { + return false; + } + return !shared_utils_1.isConstructor(prop) && shared_utils_1.isFunction(prototype[prop]); + }) + .toArray(); + } while ((prototype = Reflect.getPrototypeOf(prototype)) && + prototype != Object.prototype); + } +} +exports.MetadataScanner = MetadataScanner; diff --git a/lib/core/middlewares/builder.d.ts b/lib/core/middlewares/builder.d.ts new file mode 100644 index 000000000..d65055491 --- /dev/null +++ b/lib/core/middlewares/builder.d.ts @@ -0,0 +1,16 @@ +import { MiddlewareConfiguration } from '@nestjs/common/interfaces/middlewares/middleware-configuration.interface'; +import { Type, MiddlewaresConsumer } from '@nestjs/common/interfaces'; +import { MiddlewareConfigProxy } from '@nestjs/common/interfaces/middlewares'; +import { RoutesMapper } from './routes-mapper'; +export declare class MiddlewareBuilder implements MiddlewaresConsumer { + private readonly routesMapper; + private readonly middlewaresCollection; + private readonly logger; + constructor(routesMapper: RoutesMapper); + apply( + ...middlewares: Array | Function | any> + ): MiddlewareConfigProxy; + build(): MiddlewareConfiguration[]; + private bindValuesToResolve(middlewares, resolveParams); + private static ConfigProxy; +} diff --git a/lib/core/middlewares/builder.js b/lib/core/middlewares/builder.js new file mode 100644 index 000000000..23d96b5a2 --- /dev/null +++ b/lib/core/middlewares/builder.js @@ -0,0 +1,52 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const shared_utils_1 = require("@nestjs/common/utils/shared.utils"); +const bind_resolve_values_util_1 = require("@nestjs/common/utils/bind-resolve-values.util"); +const logger_service_1 = require("@nestjs/common/services/logger.service"); +const utils_1 = require("./utils"); +const dependencies_decorator_1 = require("@nestjs/common/decorators/core/dependencies.decorator"); +class MiddlewareBuilder { + constructor(routesMapper) { + this.routesMapper = routesMapper; + this.middlewaresCollection = new Set(); + this.logger = new logger_service_1.Logger(MiddlewareBuilder.name); + } + apply(...middlewares) { + return new MiddlewareBuilder.ConfigProxy(this, dependencies_decorator_1.flatten(middlewares)); + } + build() { + return [...this.middlewaresCollection]; + } + bindValuesToResolve(middlewares, resolveParams) { + if (shared_utils_1.isNil(resolveParams)) { + return middlewares; + } + const bindArgs = bind_resolve_values_util_1.BindResolveMiddlewareValues(resolveParams); + return [].concat(middlewares).map(bindArgs); + } +} +MiddlewareBuilder.ConfigProxy = class { + constructor(builder, middlewares) { + this.builder = builder; + this.contextParameters = null; + this.includedRoutes = utils_1.filterMiddlewares(middlewares); + } + with(...args) { + this.contextParameters = args; + return this; + } + forRoutes(...routes) { + const { middlewaresCollection, bindValuesToResolve, routesMapper, } = this.builder; + const forRoutes = this.mapRoutesToFlatList(routes.map(route => routesMapper.mapRouteToRouteProps(route))); + const configuration = { + middlewares: bindValuesToResolve(this.includedRoutes, this.contextParameters), + forRoutes, + }; + middlewaresCollection.add(configuration); + return this.builder; + } + mapRoutesToFlatList(forRoutes) { + return forRoutes.reduce((a, b) => a.concat(b)); + } +}; +exports.MiddlewareBuilder = MiddlewareBuilder; diff --git a/lib/core/middlewares/container.d.ts b/lib/core/middlewares/container.d.ts new file mode 100644 index 000000000..11ad1436d --- /dev/null +++ b/lib/core/middlewares/container.d.ts @@ -0,0 +1,16 @@ +import { MiddlewareConfiguration } from '@nestjs/common/interfaces/middlewares/middleware-configuration.interface'; +import { NestMiddleware } from '@nestjs/common/interfaces/middlewares/nest-middleware.interface'; +import { Type } from '@nestjs/common/interfaces/type.interface'; +export declare class MiddlewaresContainer { + private readonly middlewares; + private readonly configs; + getMiddlewares(module: string): Map; + getConfigs(): Map>; + addConfig(configList: MiddlewareConfiguration[], module: string): void; + private getCurrentMiddlewares(module); + private getCurrentConfig(module); +} +export interface MiddlewareWrapper { + instance: NestMiddleware; + metatype: Type; +} diff --git a/lib/core/middlewares/container.js b/lib/core/middlewares/container.js new file mode 100644 index 000000000..a70a32d8a --- /dev/null +++ b/lib/core/middlewares/container.js @@ -0,0 +1,42 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +class MiddlewaresContainer { + constructor() { + this.middlewares = new Map(); + this.configs = new Map(); + } + getMiddlewares(module) { + return this.middlewares.get(module) || new Map(); + } + getConfigs() { + return this.configs; + } + addConfig(configList, module) { + const middlewares = this.getCurrentMiddlewares(module); + const currentConfig = this.getCurrentConfig(module); + const configurations = configList || []; + configurations.map(config => { + [].concat(config.middlewares).map(metatype => { + const token = metatype.name; + middlewares.set(token, { + instance: null, + metatype, + }); + }); + currentConfig.add(config); + }); + } + getCurrentMiddlewares(module) { + if (!this.middlewares.has(module)) { + this.middlewares.set(module, new Map()); + } + return this.middlewares.get(module); + } + getCurrentConfig(module) { + if (!this.configs.has(module)) { + this.configs.set(module, new Set()); + } + return this.configs.get(module); + } +} +exports.MiddlewaresContainer = MiddlewaresContainer; diff --git a/lib/core/middlewares/middlewares-module.d.ts b/lib/core/middlewares/middlewares-module.d.ts new file mode 100644 index 000000000..0fffb1874 --- /dev/null +++ b/lib/core/middlewares/middlewares-module.d.ts @@ -0,0 +1,46 @@ +import { NestContainer } from '../injector/container'; +import { MiddlewaresContainer } from './container'; +import { NestModule } from '@nestjs/common/interfaces/modules/nest-module.interface'; +import { MiddlewareConfiguration } from '@nestjs/common/interfaces/middlewares/middleware-configuration.interface'; +import { Module } from '../injector/module'; +import { ApplicationConfig } from './../application-config'; +export declare class MiddlewaresModule { + private readonly routerProxy; + private readonly routerMethodFactory; + private routerExceptionFilter; + private routesMapper; + private resolver; + register( + middlewaresContainer: MiddlewaresContainer, + container: NestContainer, + config: ApplicationConfig, + ): Promise; + resolveMiddlewares( + middlewaresContainer: MiddlewaresContainer, + modules: Map, + ): Promise; + loadConfiguration( + middlewaresContainer: MiddlewaresContainer, + instance: NestModule, + module: string, + ): void; + registerMiddlewares( + middlewaresContainer: MiddlewaresContainer, + app: any, + ): Promise; + registerMiddlewareConfig( + middlewaresContainer: MiddlewaresContainer, + config: MiddlewareConfiguration, + module: string, + app: any, + ): Promise; + registerRouteMiddleware( + middlewaresContainer: MiddlewaresContainer, + routePath: string, + config: MiddlewareConfiguration, + module: string, + app: any, + ): Promise; + private setupHandler(instance, metatype, app, method, path); + private setupHandlerWithProxy(exceptionsHandler, router, middleware, path); +} diff --git a/lib/core/middlewares/middlewares-module.js b/lib/core/middlewares/middlewares-module.js new file mode 100644 index 000000000..5355b385e --- /dev/null +++ b/lib/core/middlewares/middlewares-module.js @@ -0,0 +1,109 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const builder_1 = require("./builder"); +const resolver_1 = require("./resolver"); +const invalid_middleware_exception_1 = require("../errors/exceptions/invalid-middleware.exception"); +const request_method_enum_1 = require("@nestjs/common/enums/request-method.enum"); +const routes_mapper_1 = require("./routes-mapper"); +const router_proxy_1 = require("../router/router-proxy"); +const router_method_factory_1 = require("../helpers/router-method-factory"); +const runtime_exception_1 = require("../errors/exceptions/runtime.exception"); +const shared_utils_1 = require("@nestjs/common/utils/shared.utils"); +const router_exception_filters_1 = require("./../router/router-exception-filters"); +class MiddlewaresModule { + constructor() { + this.routerProxy = new router_proxy_1.RouterProxy(); + this.routerMethodFactory = new router_method_factory_1.RouterMethodFactory(); + } + register(middlewaresContainer, container, config) { + return __awaiter(this, void 0, void 0, function* () { + const appRef = container.getApplicationRef(); + this.routerExceptionFilter = new router_exception_filters_1.RouterExceptionFilters(config, appRef); + this.routesMapper = new routes_mapper_1.RoutesMapper(container); + this.resolver = new resolver_1.MiddlewaresResolver(middlewaresContainer); + const modules = container.getModules(); + yield this.resolveMiddlewares(middlewaresContainer, modules); + }); + } + resolveMiddlewares(middlewaresContainer, modules) { + return __awaiter(this, void 0, void 0, function* () { + yield Promise.all([...modules.entries()].map(([name, module]) => __awaiter(this, void 0, void 0, function* () { + const instance = module.instance; + this.loadConfiguration(middlewaresContainer, instance, name); + yield this.resolver.resolveInstances(module, name); + }))); + }); + } + loadConfiguration(middlewaresContainer, instance, module) { + if (!instance.configure) + return; + const middlewaresBuilder = new builder_1.MiddlewareBuilder(this.routesMapper); + instance.configure(middlewaresBuilder); + if (!(middlewaresBuilder instanceof builder_1.MiddlewareBuilder)) + return; + const config = middlewaresBuilder.build(); + middlewaresContainer.addConfig(config, module); + } + registerMiddlewares(middlewaresContainer, app) { + return __awaiter(this, void 0, void 0, function* () { + const configs = middlewaresContainer.getConfigs(); + yield Promise.all([...configs.entries()].map(([module, moduleConfigs]) => __awaiter(this, void 0, void 0, function* () { + yield Promise.all([...moduleConfigs].map((config) => __awaiter(this, void 0, void 0, function* () { + yield this.registerMiddlewareConfig(middlewaresContainer, config, module, app); + }))); + }))); + }); + } + registerMiddlewareConfig(middlewaresContainer, config, module, app) { + return __awaiter(this, void 0, void 0, function* () { + const { forRoutes } = config; + yield Promise.all(forRoutes.map((routePath) => __awaiter(this, void 0, void 0, function* () { + yield this.registerRouteMiddleware(middlewaresContainer, routePath, config, module, app); + }))); + }); + } + registerRouteMiddleware(middlewaresContainer, routePath, config, module, app) { + return __awaiter(this, void 0, void 0, function* () { + const middlewares = [].concat(config.middlewares); + yield Promise.all(middlewares.map((metatype) => __awaiter(this, void 0, void 0, function* () { + const collection = middlewaresContainer.getMiddlewares(module); + const middleware = collection.get(metatype.name); + if (shared_utils_1.isUndefined(middleware)) { + throw new runtime_exception_1.RuntimeException(); + } + const { instance } = middleware; + yield this.setupHandler(instance, metatype, app, request_method_enum_1.RequestMethod.ALL, routePath); + }))); + }); + } + setupHandler(instance, metatype, app, method, path) { + return __awaiter(this, void 0, void 0, function* () { + if (shared_utils_1.isUndefined(instance.resolve)) { + throw new invalid_middleware_exception_1.InvalidMiddlewareException(metatype.name); + } + const exceptionsHandler = this.routerExceptionFilter.create(instance, instance.resolve); + const router = this.routerMethodFactory.get(app, method).bind(app); + const setupWithProxy = middleware => this.setupHandlerWithProxy(exceptionsHandler, router, middleware, path); + const resolve = instance.resolve(); + if (!(resolve instanceof Promise)) { + setupWithProxy(resolve); + return; + } + const middleware = yield resolve; + setupWithProxy(middleware); + }); + } + setupHandlerWithProxy(exceptionsHandler, router, middleware, path) { + const proxy = this.routerProxy.createProxy(middleware, exceptionsHandler); + router(path, proxy); + } +} +exports.MiddlewaresModule = MiddlewaresModule; diff --git a/lib/core/middlewares/resolver.d.ts b/lib/core/middlewares/resolver.d.ts new file mode 100644 index 000000000..4114bdbbb --- /dev/null +++ b/lib/core/middlewares/resolver.d.ts @@ -0,0 +1,9 @@ +import { MiddlewaresContainer } from './container'; +import { Module } from '../injector/module'; +export declare class MiddlewaresResolver { + private readonly middlewaresContainer; + private readonly instanceLoader; + constructor(middlewaresContainer: MiddlewaresContainer); + resolveInstances(module: Module, moduleName: string): Promise; + private resolveMiddlewareInstance(wrapper, middlewares, module); +} diff --git a/lib/core/middlewares/resolver.js b/lib/core/middlewares/resolver.js new file mode 100644 index 000000000..9b0278773 --- /dev/null +++ b/lib/core/middlewares/resolver.js @@ -0,0 +1,29 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const injector_1 = require("../injector/injector"); +class MiddlewaresResolver { + constructor(middlewaresContainer) { + this.middlewaresContainer = middlewaresContainer; + this.instanceLoader = new injector_1.Injector(); + } + resolveInstances(module, moduleName) { + return __awaiter(this, void 0, void 0, function* () { + const middlewares = this.middlewaresContainer.getMiddlewares(moduleName); + yield Promise.all([...middlewares.values()].map((wrapper) => __awaiter(this, void 0, void 0, function* () { return yield this.resolveMiddlewareInstance(wrapper, middlewares, module); }))); + }); + } + resolveMiddlewareInstance(wrapper, middlewares, module) { + return __awaiter(this, void 0, void 0, function* () { + yield this.instanceLoader.loadInstanceOfMiddleware(wrapper, middlewares, module); + }); + } +} +exports.MiddlewaresResolver = MiddlewaresResolver; diff --git a/lib/core/middlewares/routes-mapper.d.ts b/lib/core/middlewares/routes-mapper.d.ts new file mode 100644 index 000000000..5d13027c6 --- /dev/null +++ b/lib/core/middlewares/routes-mapper.d.ts @@ -0,0 +1,11 @@ +import 'reflect-metadata'; +import { NestContainer } from '../injector/container'; +import { Type } from '@nestjs/common/interfaces'; +export declare class RoutesMapper { + private readonly routerExplorer; + constructor(container: NestContainer); + mapRouteToRouteProps(route: Type | any | string): string[]; + private mapObjectToPath(routeOrPath); + private validateGlobalPath(path); + private validateRoutePath(path); +} diff --git a/lib/core/middlewares/routes-mapper.js b/lib/core/middlewares/routes-mapper.js new file mode 100644 index 000000000..c3a72ad6b --- /dev/null +++ b/lib/core/middlewares/routes-mapper.js @@ -0,0 +1,44 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +require("reflect-metadata"); +const router_explorer_1 = require("../router/router-explorer"); +const unknown_request_mapping_exception_1 = require("../errors/exceptions/unknown-request-mapping.exception"); +const shared_utils_1 = require("@nestjs/common/utils/shared.utils"); +const constants_1 = require("@nestjs/common/constants"); +const metadata_scanner_1 = require("../metadata-scanner"); +class RoutesMapper { + constructor(container) { + this.routerExplorer = new router_explorer_1.RouterExplorer(new metadata_scanner_1.MetadataScanner(), container); + } + mapRouteToRouteProps(route) { + if (shared_utils_1.isString(route)) { + return [route]; + } + const routePath = Reflect.getMetadata(constants_1.PATH_METADATA, route); + if (shared_utils_1.isUndefined(routePath)) { + return [this.mapObjectToPath(route)]; + } + const paths = this.routerExplorer.scanForPaths(Object.create(route), route.prototype); + const uniquePathsSet = new Set(paths.map(route => this.validateGlobalPath(routePath) + + this.validateRoutePath(route.path))); + return [...uniquePathsSet.values()]; + } + mapObjectToPath(routeOrPath) { + if (shared_utils_1.isString(routeOrPath)) { + return this.validateRoutePath(routeOrPath); + } + const { path } = routeOrPath; + if (shared_utils_1.isUndefined(path)) { + throw new unknown_request_mapping_exception_1.UnknownRequestMappingException(); + } + return this.validateRoutePath(path); + } + validateGlobalPath(path) { + const prefix = shared_utils_1.validatePath(path); + return prefix === '/' ? '' : prefix; + } + validateRoutePath(path) { + return shared_utils_1.validatePath(path); + } +} +exports.RoutesMapper = RoutesMapper; diff --git a/lib/core/middlewares/utils.d.ts b/lib/core/middlewares/utils.d.ts new file mode 100644 index 000000000..c7eaa9a0d --- /dev/null +++ b/lib/core/middlewares/utils.d.ts @@ -0,0 +1,5 @@ +import { Type } from '@nestjs/common/interfaces'; +export declare const filterMiddlewares: (middlewares: any) => any[]; +export declare const mapToClass: (middleware: any) => any; +export declare const isClass: (middleware: any) => boolean; +export declare const assignToken: (metatype: any) => Type; diff --git a/lib/core/middlewares/utils.js b/lib/core/middlewares/utils.js new file mode 100644 index 000000000..84e33cc2a --- /dev/null +++ b/lib/core/middlewares/utils.js @@ -0,0 +1,27 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const shared_utils_1 = require("@nestjs/common/utils/shared.utils"); +exports.filterMiddlewares = middlewares => { + return [] + .concat(middlewares) + .filter(shared_utils_1.isFunction) + .map(middleware => exports.mapToClass(middleware)); +}; +exports.mapToClass = middleware => { + if (this.isClass(middleware)) { + return middleware; + } + return exports.assignToken(class { + constructor() { + this.resolve = (...args) => (...args) => middleware(...args); + } + }); +}; +exports.isClass = middleware => { + return middleware.toString().substring(0, 5) === 'class'; +}; +exports.assignToken = (metatype) => { + this.id = this.id || 1; + Object.defineProperty(metatype, 'name', { value: ++this.id }); + return metatype; +}; diff --git a/lib/core/nest-application-context.d.ts b/lib/core/nest-application-context.d.ts new file mode 100644 index 000000000..cdf65eee9 --- /dev/null +++ b/lib/core/nest-application-context.d.ts @@ -0,0 +1,15 @@ +import { NestContainer } from './injector/container'; +import { Type } from '@nestjs/common/interfaces/type.interface'; +import { INestApplicationContext } from '@nestjs/common'; +export declare class NestApplicationContext implements INestApplicationContext { + protected readonly container: NestContainer; + private readonly scope; + protected contextModule: any; + private readonly moduleTokenFactory; + constructor(container: NestContainer, scope: Type[], contextModule: any); + selectContextModule(): void; + select(module: Type): INestApplicationContext; + get(typeOrToken: Type | string | symbol): T | null; + find(typeOrToken: Type | string | symbol): T | null; + private findInstanceByPrototypeOrToken(metatypeOrToken, contextModule); +} diff --git a/lib/core/nest-application-context.js b/lib/core/nest-application-context.js new file mode 100644 index 000000000..bd10e6577 --- /dev/null +++ b/lib/core/nest-application-context.js @@ -0,0 +1,57 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const module_token_factory_1 = require("./injector/module-token-factory"); +const shared_utils_1 = require("@nestjs/common/utils/shared.utils"); +class NestApplicationContext { + constructor(container, scope, contextModule) { + this.container = container; + this.scope = scope; + this.contextModule = contextModule; + this.moduleTokenFactory = new module_token_factory_1.ModuleTokenFactory(); + } + selectContextModule() { + const modules = this.container.getModules().values(); + this.contextModule = modules.next().value; + } + select(module) { + const modules = this.container.getModules(); + const moduleMetatype = this.contextModule.metatype; + const scope = this.scope.concat(moduleMetatype); + const token = this.moduleTokenFactory.create(module, scope); + const selectedModule = modules.get(token); + return selectedModule + ? new NestApplicationContext(this.container, scope, selectedModule) + : null; + } + get(typeOrToken) { + return this.findInstanceByPrototypeOrToken(typeOrToken, this.contextModule); + } + find(typeOrToken) { + const modules = this.container.getModules(); + const flattenModule = [...modules.values()].reduce((flatten, curr) => ({ + components: [...flatten.components, ...curr.components], + routes: [...flatten.routes, ...curr.routes], + injectables: [...flatten.injectables, ...curr.injectables], + }), { + components: [], + routes: [], + injectables: [], + }); + return this.findInstanceByPrototypeOrToken(typeOrToken, flattenModule); + } + findInstanceByPrototypeOrToken(metatypeOrToken, contextModule) { + const dependencies = new Map([ + ...contextModule.components, + ...contextModule.routes, + ...contextModule.injectables, + ]); + const name = shared_utils_1.isFunction(metatypeOrToken) + ? metatypeOrToken.name + : metatypeOrToken; + const instanceWrapper = dependencies.get(name); + return instanceWrapper + ? instanceWrapper.instance + : null; + } +} +exports.NestApplicationContext = NestApplicationContext; diff --git a/lib/core/nest-application.d.ts b/lib/core/nest-application.d.ts new file mode 100644 index 000000000..28f3ef250 --- /dev/null +++ b/lib/core/nest-application.d.ts @@ -0,0 +1,89 @@ +/// +import * as http from 'http'; +import { + CanActivate, + ExceptionFilter, + NestInterceptor, + PipeTransform, + WebSocketAdapter, +} from '@nestjs/common'; +import { INestApplication, INestMicroservice } from '@nestjs/common'; +import { MicroserviceOptions } from '@nestjs/common/interfaces/microservices/microservice-configuration.interface'; +import { ApplicationConfig } from './application-config'; +import { NestContainer } from './injector/container'; +import { NestApplicationContext } from './nest-application-context'; +import { NestApplicationOptions } from '@nestjs/common/interfaces/nest-application-options.interface'; +import { CorsOptions } from '@nestjs/common/interfaces/external/cors-options.interface'; +import { HttpServer } from '@nestjs/common/interfaces'; +import { INestExpressApplication } from '@nestjs/common/interfaces/nest-express-application.interface'; +import { INestFastifyApplication } from '@nestjs/common/interfaces/nest-fastify-application.interface'; +import { ServeStaticOptions } from '@nestjs/common/interfaces/external/serve-static-options.interface'; +export declare class NestApplication extends NestApplicationContext + implements INestApplication, + INestExpressApplication, + INestFastifyApplication { + private httpAdapter; + private readonly config; + private readonly appOptions; + private readonly logger; + private readonly middlewaresModule; + private readonly middlewaresContainer; + private readonly microservicesModule; + private readonly socketModule; + private readonly routesResolver; + private readonly microservices; + private httpServer; + private isInitialized; + constructor( + container: NestContainer, + httpAdapter: HttpServer, + config: ApplicationConfig, + appOptions?: NestApplicationOptions, + ); + registerHttpServer(): void; + applyOptions(): this; + createServer(): any; + getUnderlyingHttpServer(): any; + registerModules(): Promise; + init(): Promise; + registerParserMiddlewares(): any; + isMiddlewareApplied(httpAdapter: HttpServer, name: string): boolean; + registerRouter(): Promise; + connectMicroservice(options: MicroserviceOptions): INestMicroservice; + getMicroservices(): INestMicroservice[]; + getHttpServer(): http.Server; + startAllMicroservices(callback?: () => void): this; + startAllMicroservicesAsync(): Promise; + use(...args: any[]): this; + engine(...args: any[]): this; + set(...args: any[]): this; + disable(...args: any[]): this; + enable(...args: any[]): this; + register(...args: any[]): this; + inject(...args: any[]): any; + enableCors(options?: CorsOptions): this; + listen(port: number | string, callback?: () => void): any; + listen(port: number | string, hostname: string, callback?: () => void): any; + listenAsync(port: number | string, hostname?: string): Promise; + close(): void; + setGlobalPrefix(prefix: string): this; + useWebSocketAdapter(adapter: WebSocketAdapter): this; + useGlobalFilters(...filters: ExceptionFilter[]): this; + useGlobalPipes(...pipes: PipeTransform[]): this; + useGlobalInterceptors(...interceptors: NestInterceptor[]): this; + useGlobalGuards(...guards: CanActivate[]): this; + useStaticAssets(options: any): this; + useStaticAssets(path: string, options?: ServeStaticOptions): any; + setBaseViewsDir(path: string): this; + setViewEngine(engineOrOptions: any): this; + private loadPackage(name, ctx); + private registerMiddlewares(instance); + private isExpress(); + private listenToPromise(microservice); + private callInitHook(); + private callModuleInitHook(module); + private hasOnModuleInitHook(instance); + private callDestroyHook(); + private callModuleDestroyHook(module); + private hasOnModuleDestroyHook(instance); +} diff --git a/lib/core/nest-application.js b/lib/core/nest-application.js new file mode 100644 index 000000000..40489c2fe --- /dev/null +++ b/lib/core/nest-application.js @@ -0,0 +1,327 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const cors = require("cors"); +const http = require("http"); +const https = require("https"); +const optional = require("optional"); +const bodyParser = require("body-parser"); +const iterare_1 = require("iterare"); +const logger_service_1 = require("@nestjs/common/services/logger.service"); +const shared_utils_1 = require("@nestjs/common/utils/shared.utils"); +const application_config_1 = require("./application-config"); +const constants_1 = require("./constants"); +const middlewares_module_1 = require("./middlewares/middlewares-module"); +const routes_resolver_1 = require("./router/routes-resolver"); +const microservices_package_not_found_exception_1 = require("./errors/exceptions/microservices-package-not-found.exception"); +const container_1 = require("./middlewares/container"); +const nest_application_context_1 = require("./nest-application-context"); +const express_adapter_1 = require("./adapters/express-adapter"); +const fastify_adapter_1 = require("./adapters/fastify-adapter"); +const missing_dependency_exception_1 = require("./errors/exceptions/missing-dependency.exception"); +const { SocketModule } = optional('@nestjs/websockets/socket-module') || {}; +const { MicroservicesModule } = optional('@nestjs/microservices/microservices-module') || {}; +const { NestMicroservice } = optional('@nestjs/microservices/nest-microservice') || {}; +const { IoAdapter } = optional('@nestjs/websockets/adapters/io-adapter') || {}; +class NestApplication extends nest_application_context_1.NestApplicationContext { + constructor(container, httpAdapter, config, appOptions = {}) { + super(container, [], null); + this.httpAdapter = httpAdapter; + this.config = config; + this.appOptions = appOptions; + this.logger = new logger_service_1.Logger(NestApplication.name, true); + this.middlewaresModule = new middlewares_module_1.MiddlewaresModule(); + this.middlewaresContainer = new container_1.MiddlewaresContainer(); + this.microservicesModule = MicroservicesModule + ? new MicroservicesModule() + : null; + this.socketModule = SocketModule ? new SocketModule() : null; + this.microservices = []; + this.isInitialized = false; + this.applyOptions(); + this.selectContextModule(); + this.registerHttpServer(); + this.routesResolver = new routes_resolver_1.RoutesResolver(this.container, this.config); + } + registerHttpServer() { + this.httpServer = this.createServer(); + const server = this.getUnderlyingHttpServer(); + const ioAdapter = IoAdapter ? new IoAdapter(server) : null; + this.config.setIoAdapter(ioAdapter); + } + applyOptions() { + if (!this.appOptions || !this.appOptions.cors) { + return undefined; + } + const isCorsOptionsObj = shared_utils_1.isObject(this.appOptions.cors); + if (!isCorsOptionsObj) { + return this.enableCors(); + } + this.enableCors(this.appOptions.cors); + } + createServer() { + const isHttpsEnabled = this.appOptions && this.appOptions.httpsOptions; + const isExpress = this.isExpress(); + if (isHttpsEnabled && isExpress) { + return https.createServer(this.appOptions.httpsOptions, this.httpAdapter.getHttpServer()); + } + if (isExpress) { + return http.createServer(this.httpAdapter.getHttpServer()); + } + return this.httpAdapter; + } + getUnderlyingHttpServer() { + return this.isExpress() + ? this.httpServer + : this.httpAdapter.getHttpServer(); + } + registerModules() { + return __awaiter(this, void 0, void 0, function* () { + this.socketModule && + this.socketModule.register(this.container, this.config); + if (this.microservicesModule) { + this.microservicesModule.register(this.container, this.config); + this.microservicesModule.setupClients(this.container); + } + yield this.middlewaresModule.register(this.middlewaresContainer, this.container, this.config); + }); + } + init() { + return __awaiter(this, void 0, void 0, function* () { + const useBodyParser = this.appOptions && this.appOptions.bodyParser !== false; + useBodyParser && this.registerParserMiddlewares(); + yield this.registerModules(); + yield this.registerRouter(); + this.callInitHook(); + this.logger.log(constants_1.messages.APPLICATION_READY); + this.isInitialized = true; + return this; + }); + } + registerParserMiddlewares() { + if (this.httpAdapter instanceof fastify_adapter_1.FastifyAdapter) { + return this.httpAdapter.register(this.loadPackage('fastify-formbody', 'FastifyAdapter')); + } + if (!this.isExpress()) { + return void 0; + } + const parserMiddlewares = { + jsonParser: bodyParser.json(), + urlencodedParser: bodyParser.urlencoded({ extended: true }), + }; + Object.keys(parserMiddlewares) + .filter(parser => !this.isMiddlewareApplied(this.httpAdapter, parser)) + .forEach(parserKey => this.httpAdapter.use(parserMiddlewares[parserKey])); + } + isMiddlewareApplied(httpAdapter, name) { + const app = this.httpAdapter.getHttpServer(); + return (!!app._router && + !!app._router.stack && + shared_utils_1.isFunction(app._router.stack.filter) && + !!app._router.stack.filter(layer => layer && layer.handle && layer.handle.name === name).length); + } + registerRouter() { + return __awaiter(this, void 0, void 0, function* () { + yield this.registerMiddlewares(this.httpAdapter); + const prefix = this.config.getGlobalPrefix(); + const basePath = prefix ? shared_utils_1.validatePath(prefix) : ''; + this.routesResolver.resolve(this.httpAdapter, basePath); + }); + } + connectMicroservice(options) { + if (!NestMicroservice) { + throw new microservices_package_not_found_exception_1.MicroservicesPackageNotFoundException(); + } + const applicationConfig = new application_config_1.ApplicationConfig(); + const instance = new NestMicroservice(this.container, options, applicationConfig); + instance.registerListeners(); + instance.setIsInitialized(true); + instance.setIsInitHookCalled(true); + this.microservices.push(instance); + return instance; + } + getMicroservices() { + return this.microservices; + } + getHttpServer() { + return this.httpServer; + } + startAllMicroservices(callback) { + Promise.all(this.microservices.map(this.listenToPromise)).then(() => callback && callback()); + return this; + } + startAllMicroservicesAsync() { + return new Promise(resolve => this.startAllMicroservices(resolve)); + } + use(...args) { + this.httpAdapter.use(...args); + return this; + } + engine(...args) { + if (!this.isExpress()) { + return this; + } + this.httpAdapter.engine(...args); + return this; + } + set(...args) { + if (!this.isExpress()) { + return this; + } + this.httpAdapter.set(...args); + return this; + } + disable(...args) { + if (!this.isExpress()) { + return this; + } + this.httpAdapter.disable(...args); + return this; + } + enable(...args) { + if (!this.isExpress()) { + return this; + } + this.httpAdapter.enable(...args); + return this; + } + register(...args) { + const adapter = this.httpAdapter; + adapter.register && adapter.register(...args); + return this; + } + inject(...args) { + const adapter = this.httpAdapter; + return adapter.inject && adapter.inject(...args); + } + enableCors(options) { + this.httpAdapter.use(cors(options)); + return this; + } + listen(port, ...args) { + return __awaiter(this, void 0, void 0, function* () { + !this.isInitialized && (yield this.init()); + this.httpServer.listen(port, ...args); + return this.httpServer; + }); + } + listenAsync(port, hostname) { + return new Promise(resolve => { + const server = this.listen(port, hostname, () => resolve(server)); + }); + } + close() { + this.socketModule && this.socketModule.close(); + this.httpServer && this.httpServer.close(); + this.microservices.forEach(microservice => { + microservice.setIsTerminated(true); + microservice.close(); + }); + this.callDestroyHook(); + } + setGlobalPrefix(prefix) { + this.config.setGlobalPrefix(prefix); + return this; + } + useWebSocketAdapter(adapter) { + this.config.setIoAdapter(adapter); + return this; + } + useGlobalFilters(...filters) { + this.config.useGlobalFilters(...filters); + return this; + } + useGlobalPipes(...pipes) { + this.config.useGlobalPipes(...pipes); + return this; + } + useGlobalInterceptors(...interceptors) { + this.config.useGlobalInterceptors(...interceptors); + return this; + } + useGlobalGuards(...guards) { + this.config.useGlobalGuards(...guards); + return this; + } + useStaticAssets(pathOrOptions, options) { + this.httpAdapter.useStaticAssets && + this.httpAdapter.useStaticAssets(pathOrOptions, options); + return this; + } + setBaseViewsDir(path) { + this.httpAdapter.setBaseViewsDir && this.httpAdapter.setBaseViewsDir(path); + return this; + } + setViewEngine(engineOrOptions) { + this.httpAdapter.setViewEngine && + this.httpAdapter.setViewEngine(engineOrOptions); + return this; + } + loadPackage(name, ctx) { + try { + return require(name); + } + catch (e) { + throw new missing_dependency_exception_1.MissingRequiredDependencyException(name, ctx); + } + } + registerMiddlewares(instance) { + return __awaiter(this, void 0, void 0, function* () { + yield this.middlewaresModule.registerMiddlewares(this.middlewaresContainer, instance); + }); + } + isExpress() { + const isExpress = !this.httpAdapter.getHttpServer; + if (isExpress) { + return isExpress; + } + return this.httpAdapter instanceof express_adapter_1.ExpressAdapter; + } + listenToPromise(microservice) { + return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () { + yield microservice.listen(resolve); + })); + } + callInitHook() { + const modules = this.container.getModules(); + modules.forEach(module => { + this.callModuleInitHook(module); + }); + } + callModuleInitHook(module) { + const components = [...module.routes, ...module.components]; + iterare_1.default(components) + .map(([key, { instance }]) => instance) + .filter(instance => !shared_utils_1.isNil(instance)) + .filter(this.hasOnModuleInitHook) + .forEach(instance => instance.onModuleInit()); + } + hasOnModuleInitHook(instance) { + return !shared_utils_1.isUndefined(instance.onModuleInit); + } + callDestroyHook() { + const modules = this.container.getModules(); + modules.forEach(module => { + this.callModuleDestroyHook(module); + }); + } + callModuleDestroyHook(module) { + const components = [...module.routes, ...module.components]; + iterare_1.default(components) + .map(([key, { instance }]) => instance) + .filter(instance => !shared_utils_1.isNil(instance)) + .filter(this.hasOnModuleDestroyHook) + .forEach(instance => instance.onModuleDestroy()); + } + hasOnModuleDestroyHook(instance) { + return !shared_utils_1.isUndefined(instance.onModuleDestroy); + } +} +exports.NestApplication = NestApplication; diff --git a/lib/core/nest-factory.d.ts b/lib/core/nest-factory.d.ts new file mode 100644 index 000000000..bf1b7c842 --- /dev/null +++ b/lib/core/nest-factory.d.ts @@ -0,0 +1,64 @@ +import { NestApplicationOptions } from '@nestjs/common/interfaces/nest-application-options.interface'; +import { + INestApplication, + INestMicroservice, + INestApplicationContext, + HttpServer, +} from '@nestjs/common'; +import { NestApplicationContextOptions } from '@nestjs/common/interfaces/nest-application-context-options.interface'; +import { NestMicroserviceOptions } from '@nestjs/common/interfaces/microservices/nest-microservice-options.interface'; +import { INestExpressApplication } from '@nestjs/common/interfaces/nest-express-application.interface'; +import { FastifyAdapter } from './adapters/fastify-adapter'; +import { INestFastifyApplication } from '@nestjs/common/interfaces/nest-fastify-application.interface'; +import { MicroserviceOptions } from '@nestjs/common/interfaces/microservices/microservice-configuration.interface'; +export declare class NestFactoryStatic { + private readonly logger; + /** + * Creates an instance of the NestApplication (returns Promise) + * @returns an `Promise` of the INestApplication instance + */ + create(module: any): Promise; + create( + module: any, + options: NestApplicationOptions, + ): Promise; + create( + module: any, + httpServer: FastifyAdapter, + options?: NestApplicationOptions, + ): Promise; + create( + module: any, + httpServer: HttpServer, + options?: NestApplicationOptions, + ): Promise; + /** + * Creates an instance of the NestMicroservice (returns Promise) + * + * @param {} module Entry (root) application module class + * @param {NestMicroserviceOptions & MicroserviceOptions} options Optional microservice configuration + * @returns an `Promise` of the INestMicroservice instance + */ + createMicroservice( + module: any, + options?: NestMicroserviceOptions & MicroserviceOptions, + ): Promise; + /** + * Creates an instance of the NestApplicationContext (returns Promise) + * + * @param {} module Entry (root) application module class + * @param {NestApplicationContextOptions} options Optional Nest application configuration + * @returns an `Promise` of the INestApplicationContext instance + */ + createApplicationContext( + module: any, + options?: NestApplicationContextOptions, + ): Promise; + private createNestInstance(instance); + private initialize(module, container, config?, httpServer?); + private createProxy(target); + private createExceptionProxy(); + private applyLogger(options); + private applyExpressAdapter(httpAdapter); +} +export declare const NestFactory: NestFactoryStatic; diff --git a/lib/core/nest-factory.js b/lib/core/nest-factory.js new file mode 100644 index 000000000..3249eae3a --- /dev/null +++ b/lib/core/nest-factory.js @@ -0,0 +1,140 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const optional = require("optional"); +const scanner_1 = require("./scanner"); +const instance_loader_1 = require("./injector/instance-loader"); +const container_1 = require("./injector/container"); +const exceptions_zone_1 = require("./errors/exceptions-zone"); +const logger_service_1 = require("@nestjs/common/services/logger.service"); +const constants_1 = require("./constants"); +const nest_application_1 = require("./nest-application"); +const shared_utils_1 = require("@nestjs/common/utils/shared.utils"); +const express_factory_1 = require("./adapters/express-factory"); +const metadata_scanner_1 = require("./metadata-scanner"); +const microservices_package_not_found_exception_1 = require("./errors/exceptions/microservices-package-not-found.exception"); +const nest_application_context_1 = require("./nest-application-context"); +const application_config_1 = require("./application-config"); +const express_adapter_1 = require("./adapters/express-adapter"); +const { NestMicroservice } = optional('@nestjs/microservices/nest-microservice') || {}; +class NestFactoryStatic { + constructor() { + this.logger = new logger_service_1.Logger('NestFactory', true); + } + create(module, serverOrOptions, options) { + return __awaiter(this, void 0, void 0, function* () { + const isHttpServer = serverOrOptions && serverOrOptions.patch; + let [httpServer, appOptions] = isHttpServer + ? [serverOrOptions, options] + : [express_factory_1.ExpressFactory.create(), serverOrOptions]; + const applicationConfig = new application_config_1.ApplicationConfig(); + const container = new container_1.NestContainer(applicationConfig); + httpServer = this.applyExpressAdapter(httpServer); + this.applyLogger(appOptions); + yield this.initialize(module, container, applicationConfig, httpServer); + return this.createNestInstance(new nest_application_1.NestApplication(container, httpServer, applicationConfig, appOptions)); + }); + } + /** + * Creates an instance of the NestMicroservice (returns Promise) + * + * @param {} module Entry (root) application module class + * @param {NestMicroserviceOptions & MicroserviceOptions} options Optional microservice configuration + * @returns an `Promise` of the INestMicroservice instance + */ + createMicroservice(module, options) { + return __awaiter(this, void 0, void 0, function* () { + if (!NestMicroservice) { + throw new microservices_package_not_found_exception_1.MicroservicesPackageNotFoundException(); + } + const applicationConfig = new application_config_1.ApplicationConfig(); + const container = new container_1.NestContainer(applicationConfig); + this.applyLogger(options); + yield this.initialize(module, container, applicationConfig); + return this.createNestInstance(new NestMicroservice(container, options, applicationConfig)); + }); + } + /** + * Creates an instance of the NestApplicationContext (returns Promise) + * + * @param {} module Entry (root) application module class + * @param {NestApplicationContextOptions} options Optional Nest application configuration + * @returns an `Promise` of the INestApplicationContext instance + */ + createApplicationContext(module, options) { + return __awaiter(this, void 0, void 0, function* () { + const container = new container_1.NestContainer(); + this.applyLogger(options); + yield this.initialize(module, container); + const modules = container.getModules().values(); + const root = modules.next().value; + return this.createNestInstance(new nest_application_context_1.NestApplicationContext(container, [], root)); + }); + } + createNestInstance(instance) { + return this.createProxy(instance); + } + initialize(module, container, config = new application_config_1.ApplicationConfig(), httpServer = null) { + return __awaiter(this, void 0, void 0, function* () { + const instanceLoader = new instance_loader_1.InstanceLoader(container); + const dependenciesScanner = new scanner_1.DependenciesScanner(container, new metadata_scanner_1.MetadataScanner(), config); + container.setApplicationRef(httpServer); + try { + this.logger.log(constants_1.messages.APPLICATION_START); + yield exceptions_zone_1.ExceptionsZone.asyncRun(() => __awaiter(this, void 0, void 0, function* () { + dependenciesScanner.scan(module); + yield instanceLoader.createInstancesOfDependencies(); + dependenciesScanner.applyApplicationProviders(); + })); + } + catch (e) { + process.abort(); + } + }); + } + createProxy(target) { + const proxy = this.createExceptionProxy(); + return new Proxy(target, { + get: proxy, + set: proxy, + }); + } + createExceptionProxy() { + return (receiver, prop) => { + if (!(prop in receiver)) + return; + if (shared_utils_1.isFunction(receiver[prop])) { + return (...args) => { + let result; + exceptions_zone_1.ExceptionsZone.run(() => { + result = receiver[prop](...args); + }); + return result; + }; + } + return receiver[prop]; + }; + } + applyLogger(options) { + if (!options || !options.logger) { + return; + } + logger_service_1.Logger.overrideLogger(options.logger); + } + applyExpressAdapter(httpAdapter) { + const isAdapter = !!httpAdapter.getHttpServer; + if (isAdapter) { + return httpAdapter; + } + return new express_adapter_1.ExpressAdapter(httpAdapter); + } +} +exports.NestFactoryStatic = NestFactoryStatic; +exports.NestFactory = new NestFactoryStatic(); diff --git a/lib/core/pipes/params-token-factory.d.ts b/lib/core/pipes/params-token-factory.d.ts new file mode 100644 index 000000000..0e44024ff --- /dev/null +++ b/lib/core/pipes/params-token-factory.d.ts @@ -0,0 +1,5 @@ +import { RouteParamtypes } from '@nestjs/common/enums/route-paramtypes.enum'; +import { Paramtype } from '@nestjs/common'; +export declare class ParamsTokenFactory { + exchangeEnumForString(type: RouteParamtypes): Paramtype; +} diff --git a/lib/core/pipes/params-token-factory.js b/lib/core/pipes/params-token-factory.js new file mode 100644 index 000000000..369e96e6b --- /dev/null +++ b/lib/core/pipes/params-token-factory.js @@ -0,0 +1,18 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const route_paramtypes_enum_1 = require("@nestjs/common/enums/route-paramtypes.enum"); +class ParamsTokenFactory { + exchangeEnumForString(type) { + switch (type) { + case route_paramtypes_enum_1.RouteParamtypes.BODY: + return 'body'; + case route_paramtypes_enum_1.RouteParamtypes.PARAM: + return 'param'; + case route_paramtypes_enum_1.RouteParamtypes.QUERY: + return 'query'; + default: + return 'custom'; + } + } +} +exports.ParamsTokenFactory = ParamsTokenFactory; diff --git a/lib/core/pipes/pipes-consumer.d.ts b/lib/core/pipes/pipes-consumer.d.ts new file mode 100644 index 000000000..43ac986b8 --- /dev/null +++ b/lib/core/pipes/pipes-consumer.d.ts @@ -0,0 +1,30 @@ +import { Transform } from '@nestjs/common/interfaces'; +export declare class PipesConsumer { + private readonly paramsTokenFactory; + apply( + value: any, + { + metatype, + type, + data, + }: { + metatype: any; + type: any; + data: any; + }, + transforms: Transform[], + ): Promise; + applyPipes( + value: any, + { + metatype, + type, + data, + }: { + metatype; + type?; + data?; + }, + transforms: Transform[], + ): Promise; +} diff --git a/lib/core/pipes/pipes-consumer.js b/lib/core/pipes/pipes-consumer.js new file mode 100644 index 000000000..6965ce392 --- /dev/null +++ b/lib/core/pipes/pipes-consumer.js @@ -0,0 +1,35 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const params_token_factory_1 = require("./../pipes/params-token-factory"); +class PipesConsumer { + constructor() { + this.paramsTokenFactory = new params_token_factory_1.ParamsTokenFactory(); + } + apply(value, { metatype, type, data }, transforms) { + return __awaiter(this, void 0, void 0, function* () { + const token = this.paramsTokenFactory.exchangeEnumForString(type); + return yield this.applyPipes(value, { metatype, type: token, data }, transforms); + }); + } + applyPipes(value, { metatype, type, data }, transforms) { + return __awaiter(this, void 0, void 0, function* () { + return yield transforms.reduce((defferedValue, fn) => __awaiter(this, void 0, void 0, function* () { + const val = yield defferedValue; + const result = fn(val, { metatype, type, data }); + if (result instanceof Promise) { + return result; + } + return Promise.resolve(result); + }), Promise.resolve(value)); + }); + } +} +exports.PipesConsumer = PipesConsumer; diff --git a/lib/core/pipes/pipes-context-creator.d.ts b/lib/core/pipes/pipes-context-creator.d.ts new file mode 100644 index 000000000..e4c2a4a3e --- /dev/null +++ b/lib/core/pipes/pipes-context-creator.d.ts @@ -0,0 +1,11 @@ +import 'reflect-metadata'; +import { Controller, Transform } from '@nestjs/common/interfaces'; +import { ApplicationConfig } from './../application-config'; +import { ContextCreator } from './../helpers/context-creator'; +export declare class PipesContextCreator extends ContextCreator { + private readonly config; + constructor(config?: ApplicationConfig); + create(instance: Controller, callback: (...args) => any): Transform[]; + createConcreteContext(metadata: T): R; + getGlobalMetadata(): T; +} diff --git a/lib/core/pipes/pipes-context-creator.js b/lib/core/pipes/pipes-context-creator.js new file mode 100644 index 000000000..c9a7398e7 --- /dev/null +++ b/lib/core/pipes/pipes-context-creator.js @@ -0,0 +1,32 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +require("reflect-metadata"); +const iterare_1 = require("iterare"); +const constants_1 = require("@nestjs/common/constants"); +const shared_utils_1 = require("@nestjs/common/utils/shared.utils"); +const context_creator_1 = require("./../helpers/context-creator"); +class PipesContextCreator extends context_creator_1.ContextCreator { + constructor(config) { + super(); + this.config = config; + } + create(instance, callback) { + return this.createContext(instance, callback, constants_1.PIPES_METADATA); + } + createConcreteContext(metadata) { + if (shared_utils_1.isUndefined(metadata) || shared_utils_1.isEmpty(metadata)) { + return []; + } + return iterare_1.default(metadata) + .filter(pipe => pipe && pipe.transform && shared_utils_1.isFunction(pipe.transform)) + .map(pipe => pipe.transform.bind(pipe)) + .toArray(); + } + getGlobalMetadata() { + if (!this.config) { + return []; + } + return this.config.getGlobalPipes(); + } +} +exports.PipesContextCreator = PipesContextCreator; diff --git a/lib/core/router/interfaces/exceptions-filter.interface.d.ts b/lib/core/router/interfaces/exceptions-filter.interface.d.ts new file mode 100644 index 000000000..1d48ec311 --- /dev/null +++ b/lib/core/router/interfaces/exceptions-filter.interface.d.ts @@ -0,0 +1,5 @@ +import { Controller } from '@nestjs/common/interfaces/controllers/controller.interface'; +import { ExceptionsHandler } from '../../exceptions/exceptions-handler'; +export interface ExceptionsFilter { + create(instance: Controller, callback: any): ExceptionsHandler; +} diff --git a/lib/core/router/interfaces/exceptions-filter.interface.js b/lib/core/router/interfaces/exceptions-filter.interface.js new file mode 100644 index 000000000..c8ad2e549 --- /dev/null +++ b/lib/core/router/interfaces/exceptions-filter.interface.js @@ -0,0 +1,2 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/lib/core/router/interfaces/resolver.interface.d.ts b/lib/core/router/interfaces/resolver.interface.d.ts new file mode 100644 index 000000000..08c38a3b8 --- /dev/null +++ b/lib/core/router/interfaces/resolver.interface.d.ts @@ -0,0 +1,3 @@ +export interface Resolver { + resolve(instance: any, basePath: string): any; +} diff --git a/lib/core/router/interfaces/resolver.interface.js b/lib/core/router/interfaces/resolver.interface.js new file mode 100644 index 000000000..c8ad2e549 --- /dev/null +++ b/lib/core/router/interfaces/resolver.interface.js @@ -0,0 +1,2 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/lib/core/router/interfaces/route-params-factory.interface.d.ts b/lib/core/router/interfaces/route-params-factory.interface.d.ts new file mode 100644 index 000000000..158ca159a --- /dev/null +++ b/lib/core/router/interfaces/route-params-factory.interface.d.ts @@ -0,0 +1,16 @@ +import { RouteParamtypes } from '@nestjs/common/enums/route-paramtypes.enum'; +export interface IRouteParamsFactory { + exchangeKeyForValue( + key: RouteParamtypes | string, + data: any, + { + req, + res, + next, + }: { + req: any; + res: any; + next: any; + }, + ): any; +} diff --git a/lib/core/router/interfaces/route-params-factory.interface.js b/lib/core/router/interfaces/route-params-factory.interface.js new file mode 100644 index 000000000..c8ad2e549 --- /dev/null +++ b/lib/core/router/interfaces/route-params-factory.interface.js @@ -0,0 +1,2 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/lib/core/router/route-params-factory.d.ts b/lib/core/router/route-params-factory.d.ts new file mode 100644 index 000000000..e0a54ffe3 --- /dev/null +++ b/lib/core/router/route-params-factory.d.ts @@ -0,0 +1,17 @@ +import { RouteParamtypes } from '@nestjs/common/enums/route-paramtypes.enum'; +import { IRouteParamsFactory } from './interfaces/route-params-factory.interface'; +export declare class RouteParamsFactory implements IRouteParamsFactory { + exchangeKeyForValue( + key: RouteParamtypes | string, + data: any, + { + req, + res, + next, + }: { + req: any; + res: any; + next: any; + }, + ): any; +} diff --git a/lib/core/router/route-params-factory.js b/lib/core/router/route-params-factory.js new file mode 100644 index 000000000..16c2cfd81 --- /dev/null +++ b/lib/core/router/route-params-factory.js @@ -0,0 +1,32 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const route_paramtypes_enum_1 = require("@nestjs/common/enums/route-paramtypes.enum"); +class RouteParamsFactory { + exchangeKeyForValue(key, data, { req, res, next }) { + switch (key) { + case route_paramtypes_enum_1.RouteParamtypes.NEXT: + return next; + case route_paramtypes_enum_1.RouteParamtypes.REQUEST: + return req; + case route_paramtypes_enum_1.RouteParamtypes.RESPONSE: + return res; + case route_paramtypes_enum_1.RouteParamtypes.BODY: + return data && req.body ? req.body[data] : req.body; + case route_paramtypes_enum_1.RouteParamtypes.PARAM: + return data ? req.params[data] : req.params; + case route_paramtypes_enum_1.RouteParamtypes.QUERY: + return data ? req.query[data] : req.query; + case route_paramtypes_enum_1.RouteParamtypes.HEADERS: + return data ? req.headers[data] : req.headers; + case route_paramtypes_enum_1.RouteParamtypes.SESSION: + return req.session; + case route_paramtypes_enum_1.RouteParamtypes.FILE: + return req.file; + case route_paramtypes_enum_1.RouteParamtypes.FILES: + return req.files; + default: + return null; + } + } +} +exports.RouteParamsFactory = RouteParamsFactory; diff --git a/lib/core/router/router-exception-filters.d.ts b/lib/core/router/router-exception-filters.d.ts new file mode 100644 index 000000000..4f1c03c11 --- /dev/null +++ b/lib/core/router/router-exception-filters.d.ts @@ -0,0 +1,17 @@ +import 'reflect-metadata'; +import { Controller } from '@nestjs/common/interfaces/controllers/controller.interface'; +import { ExceptionsHandler } from '../exceptions/exceptions-handler'; +import { RouterProxyCallback } from './../router/router-proxy'; +import { ApplicationConfig } from './../application-config'; +import { BaseExceptionFilterContext } from '../exceptions/base-exception-filter-context'; +import { HttpServer } from '@nestjs/common'; +export declare class RouterExceptionFilters extends BaseExceptionFilterContext { + private readonly config; + private readonly applicationRef; + constructor(config: ApplicationConfig, applicationRef: HttpServer); + create( + instance: Controller, + callback: RouterProxyCallback, + ): ExceptionsHandler; + getGlobalMetadata(): T; +} diff --git a/lib/core/router/router-exception-filters.js b/lib/core/router/router-exception-filters.js new file mode 100644 index 000000000..c7f4291cc --- /dev/null +++ b/lib/core/router/router-exception-filters.js @@ -0,0 +1,27 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +require("reflect-metadata"); +const exceptions_handler_1 = require("../exceptions/exceptions-handler"); +const constants_1 = require("@nestjs/common/constants"); +const shared_utils_1 = require("@nestjs/common/utils/shared.utils"); +const base_exception_filter_context_1 = require("../exceptions/base-exception-filter-context"); +class RouterExceptionFilters extends base_exception_filter_context_1.BaseExceptionFilterContext { + constructor(config, applicationRef) { + super(); + this.config = config; + this.applicationRef = applicationRef; + } + create(instance, callback) { + const exceptionHandler = new exceptions_handler_1.ExceptionsHandler(this.applicationRef); + const filters = this.createContext(instance, callback, constants_1.EXCEPTION_FILTERS_METADATA); + if (shared_utils_1.isEmpty(filters)) { + return exceptionHandler; + } + exceptionHandler.setCustomFilters(filters); + return exceptionHandler; + } + getGlobalMetadata() { + return this.config.getGlobalFilters(); + } +} +exports.RouterExceptionFilters = RouterExceptionFilters; diff --git a/lib/core/router/router-execution-context.d.ts b/lib/core/router/router-execution-context.d.ts new file mode 100644 index 000000000..6a9000c35 --- /dev/null +++ b/lib/core/router/router-execution-context.d.ts @@ -0,0 +1,102 @@ +import 'reflect-metadata'; +import { RouteParamtypes } from '@nestjs/common/enums/route-paramtypes.enum'; +import { Controller, Transform } from '@nestjs/common/interfaces'; +import { RouteParamsMetadata } from '@nestjs/common/decorators'; +import { IRouteParamsFactory } from './interfaces/route-params-factory.interface'; +import { PipesContextCreator } from './../pipes/pipes-context-creator'; +import { PipesConsumer } from './../pipes/pipes-consumer'; +import { + ParamData, + PipeTransform, + RequestMethod, + HttpServer, +} from '@nestjs/common'; +import { GuardsContextCreator } from '../guards/guards-context-creator'; +import { GuardsConsumer } from '../guards/guards-consumer'; +import { InterceptorsContextCreator } from '../interceptors/interceptors-context-creator'; +import { InterceptorsConsumer } from '../interceptors/interceptors-consumer'; +export interface ParamProperties { + index: number; + type: RouteParamtypes | string; + data: ParamData; + pipes: PipeTransform[]; + extractValue: (req, res, next) => any; +} +export declare class RouterExecutionContext { + private readonly paramsFactory; + private readonly pipesContextCreator; + private readonly pipesConsumer; + private readonly guardsContextCreator; + private readonly guardsConsumer; + private readonly interceptorsContextCreator; + private readonly interceptorsConsumer; + private readonly applicationRef; + private readonly responseController; + constructor( + paramsFactory: IRouteParamsFactory, + pipesContextCreator: PipesContextCreator, + pipesConsumer: PipesConsumer, + guardsContextCreator: GuardsContextCreator, + guardsConsumer: GuardsConsumer, + interceptorsContextCreator: InterceptorsContextCreator, + interceptorsConsumer: InterceptorsConsumer, + applicationRef: HttpServer, + ); + create( + instance: Controller, + callback: (...args) => any, + methodName: string, + module: string, + requestMethod: RequestMethod, + ): (req: any, res: any, next: any) => Promise; + mapParamType(key: string): string; + reflectCallbackMetadata( + instance: Controller, + methodName: string, + ): RouteParamsMetadata; + reflectCallbackParamtypes(instance: Controller, methodName: string): any[]; + reflectHttpStatusCode(callback: (...args) => any): number; + reflectRenderTemplate(callback: any): string; + getArgumentsLength(keys: string[], metadata: RouteParamsMetadata): number; + createNullArray(length: number): any[]; + exchangeKeysForValues( + keys: string[], + metadata: RouteParamsMetadata, + ): ParamProperties[]; + getCustomFactory(factory: (...args) => void, data: any): (...args) => any; + mergeParamsMetatypes( + paramsProperties: ParamProperties[], + paramtypes: any[], + ): (ParamProperties & { + metatype?: any; + })[]; + getParamValue( + value: T, + { + metatype, + type, + data, + }: { + metatype: any; + type: any; + data: any; + }, + transforms: Transform[], + ): Promise; + createGuardsFn( + guards: any[], + instance: Controller, + callback: (...args) => any, + ): (args: any[]) => Promise; + createPipesFn( + pipes: any[], + paramsOptions: (ParamProperties & { + metatype?: any; + })[], + ): (args: any, req: any, res: any, next: any) => Promise; + createHandleResponseFn( + callback: any, + isResponseHandled: boolean, + httpStatusCode: number, + ): (result: any, res: any) => Promise; +} diff --git a/lib/core/router/router-execution-context.js b/lib/core/router/router-execution-context.js new file mode 100644 index 000000000..f38fcd04d --- /dev/null +++ b/lib/core/router/router-execution-context.js @@ -0,0 +1,147 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +require("reflect-metadata"); +const constants_1 = require("@nestjs/common/constants"); +const shared_utils_1 = require("@nestjs/common/utils/shared.utils"); +const route_paramtypes_enum_1 = require("@nestjs/common/enums/route-paramtypes.enum"); +const common_1 = require("@nestjs/common"); +const constants_2 = require("../guards/constants"); +const router_response_controller_1 = require("./router-response-controller"); +class RouterExecutionContext { + constructor(paramsFactory, pipesContextCreator, pipesConsumer, guardsContextCreator, guardsConsumer, interceptorsContextCreator, interceptorsConsumer, applicationRef) { + this.paramsFactory = paramsFactory; + this.pipesContextCreator = pipesContextCreator; + this.pipesConsumer = pipesConsumer; + this.guardsContextCreator = guardsContextCreator; + this.guardsConsumer = guardsConsumer; + this.interceptorsContextCreator = interceptorsContextCreator; + this.interceptorsConsumer = interceptorsConsumer; + this.applicationRef = applicationRef; + this.responseController = new router_response_controller_1.RouterResponseController(applicationRef); + } + create(instance, callback, methodName, module, requestMethod) { + const metadata = this.reflectCallbackMetadata(instance, methodName) || {}; + const keys = Object.keys(metadata); + const argsLength = this.getArgumentsLength(keys, metadata); + const pipes = this.pipesContextCreator.create(instance, callback); + const paramtypes = this.reflectCallbackParamtypes(instance, methodName); + const guards = this.guardsContextCreator.create(instance, callback, module); + const interceptors = this.interceptorsContextCreator.create(instance, callback, module); + const httpCode = this.reflectHttpStatusCode(callback); + const paramsMetadata = this.exchangeKeysForValues(keys, metadata); + const isResponseHandled = paramsMetadata.some(({ type }) => type === route_paramtypes_enum_1.RouteParamtypes.RESPONSE || type === route_paramtypes_enum_1.RouteParamtypes.NEXT); + const paramsOptions = this.mergeParamsMetatypes(paramsMetadata, paramtypes); + const httpStatusCode = httpCode + ? httpCode + : this.responseController.getStatusByMethod(requestMethod); + const fnCanActivate = this.createGuardsFn(guards, instance, callback); + const fnApplyPipes = this.createPipesFn(pipes, paramsOptions); + const fnHandleResponse = this.createHandleResponseFn(callback, isResponseHandled, httpStatusCode); + return (req, res, next) => __awaiter(this, void 0, void 0, function* () { + const args = this.createNullArray(argsLength); + fnCanActivate && (yield fnCanActivate([res, res])); + const handler = () => __awaiter(this, void 0, void 0, function* () { + fnApplyPipes && (yield fnApplyPipes(args, req, res, next)); + return callback.apply(instance, args); + }); + const result = yield this.interceptorsConsumer.intercept(interceptors, [req, res], instance, callback, handler); + yield fnHandleResponse(result, res); + }); + } + mapParamType(key) { + const keyPair = key.split(':'); + return keyPair[0]; + } + reflectCallbackMetadata(instance, methodName) { + return Reflect.getMetadata(constants_1.ROUTE_ARGS_METADATA, instance, methodName); + } + reflectCallbackParamtypes(instance, methodName) { + return Reflect.getMetadata(constants_1.PARAMTYPES_METADATA, instance, methodName); + } + reflectHttpStatusCode(callback) { + return Reflect.getMetadata(constants_1.HTTP_CODE_METADATA, callback); + } + reflectRenderTemplate(callback) { + return Reflect.getMetadata(constants_1.RENDER_METADATA, callback); + } + getArgumentsLength(keys, metadata) { + return Math.max(...keys.map(key => metadata[key].index)) + 1; + } + createNullArray(length) { + return Array.apply(null, { length }).fill(null); + } + exchangeKeysForValues(keys, metadata) { + return keys.map(key => { + const { index, data, pipes } = metadata[key]; + const type = this.mapParamType(key); + if (key.includes(constants_1.CUSTOM_ROUTE_AGRS_METADATA)) { + const { factory } = metadata[key]; + const customExtractValue = this.getCustomFactory(factory, data); + return { index, extractValue: customExtractValue, type, data, pipes }; + } + const nType = Number(type); + const extractValue = (req, res, next) => this.paramsFactory.exchangeKeyForValue(nType, data, { req, res, next }); + return { index, extractValue, type: nType, data, pipes }; + }); + } + getCustomFactory(factory, data) { + return !shared_utils_1.isUndefined(factory) && shared_utils_1.isFunction(factory) + ? (req, res, next) => factory(data, req) + : () => null; + } + mergeParamsMetatypes(paramsProperties, paramtypes) { + if (!paramtypes) { + return paramsProperties; + } + return paramsProperties.map(param => (Object.assign({}, param, { metatype: paramtypes[param.index] }))); + } + getParamValue(value, { metatype, type, data }, transforms) { + return __awaiter(this, void 0, void 0, function* () { + if (type === route_paramtypes_enum_1.RouteParamtypes.BODY || + type === route_paramtypes_enum_1.RouteParamtypes.QUERY || + type === route_paramtypes_enum_1.RouteParamtypes.PARAM || + shared_utils_1.isString(type)) { + return yield this.pipesConsumer.apply(value, { metatype, type, data }, transforms); + } + return Promise.resolve(value); + }); + } + createGuardsFn(guards, instance, callback) { + const canActivateFn = (args) => __awaiter(this, void 0, void 0, function* () { + const canActivate = yield this.guardsConsumer.tryActivate(guards, args, instance, callback); + if (!canActivate) { + throw new common_1.HttpException(constants_2.FORBIDDEN_MESSAGE, common_1.HttpStatus.FORBIDDEN); + } + }); + return guards.length ? canActivateFn : null; + } + createPipesFn(pipes, paramsOptions) { + const pipesFn = (args, req, res, next) => __awaiter(this, void 0, void 0, function* () { + yield Promise.all(paramsOptions.map((param) => __awaiter(this, void 0, void 0, function* () { + const { index, extractValue, type, data, metatype, pipes: paramPipes, } = param; + const value = extractValue(req, res, next); + args[index] = yield this.getParamValue(value, { metatype, type, data }, pipes.concat(this.pipesContextCreator.createConcreteContext(paramPipes))); + }))); + }); + return paramsOptions.length ? pipesFn : null; + } + createHandleResponseFn(callback, isResponseHandled, httpStatusCode) { + const renderTemplate = this.reflectRenderTemplate(callback); + if (!!renderTemplate) { + return (result, res) => __awaiter(this, void 0, void 0, function* () { return yield this.responseController.render(result, res, renderTemplate); }); + } + return (result, res) => __awaiter(this, void 0, void 0, function* () { + return !isResponseHandled && + (yield this.responseController.apply(result, res, httpStatusCode)); + }); + } +} +exports.RouterExecutionContext = RouterExecutionContext; diff --git a/lib/core/router/router-explorer.d.ts b/lib/core/router/router-explorer.d.ts new file mode 100644 index 000000000..a779aa028 --- /dev/null +++ b/lib/core/router/router-explorer.d.ts @@ -0,0 +1,67 @@ +import 'reflect-metadata'; +import { Controller } from '@nestjs/common/interfaces/controllers/controller.interface'; +import { RequestMethod } from '@nestjs/common/enums/request-method.enum'; +import { RouterProxy, RouterProxyCallback } from './router-proxy'; +import { Type } from '@nestjs/common/interfaces/type.interface'; +import { ExceptionsFilter } from './interfaces/exceptions-filter.interface'; +import { MetadataScanner } from '../metadata-scanner'; +import { ApplicationConfig } from './../application-config'; +import { NestContainer } from '../injector/container'; +export declare class RouterExplorer { + private readonly metadataScanner; + private readonly routerProxy; + private readonly exceptionsFilter; + private readonly config; + private readonly executionContextCreator; + private readonly routerMethodFactory; + private readonly logger; + constructor( + metadataScanner: MetadataScanner, + container: NestContainer, + routerProxy?: RouterProxy, + exceptionsFilter?: ExceptionsFilter, + config?: ApplicationConfig, + ); + explore( + instance: Controller, + metatype: Type, + module: string, + appInstance: any, + basePath: string, + ): void; + extractRouterPath(metatype: Type, prefix?: string): string; + validateRoutePath(path: string): string; + scanForPaths(instance: Controller, prototype?: any): RoutePathProperties[]; + exploreMethodMetadata( + instance: Controller, + instancePrototype: any, + methodName: string, + ): RoutePathProperties; + applyPathsToRouterProxy( + router: any, + routePaths: RoutePathProperties[], + instance: Controller, + module: string, + basePath: string, + ): void; + private applyCallbackToRouter( + router, + pathProperties, + instance, + module, + basePath, + ); + private createCallbackProxy( + instance, + callback, + methodName, + module, + requestMethod, + ); +} +export interface RoutePathProperties { + path: string; + requestMethod: RequestMethod; + targetCallback: RouterProxyCallback; + methodName: string; +} diff --git a/lib/core/router/router-explorer.js b/lib/core/router/router-explorer.js new file mode 100644 index 000000000..ea079f7f3 --- /dev/null +++ b/lib/core/router/router-explorer.js @@ -0,0 +1,87 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +require("reflect-metadata"); +const unknown_request_mapping_exception_1 = require("../errors/exceptions/unknown-request-mapping.exception"); +const shared_utils_1 = require("@nestjs/common/utils/shared.utils"); +const router_method_factory_1 = require("../helpers/router-method-factory"); +const constants_1 = require("@nestjs/common/constants"); +const logger_service_1 = require("@nestjs/common/services/logger.service"); +const messages_1 = require("../helpers/messages"); +const router_execution_context_1 = require("./router-execution-context"); +const route_params_factory_1 = require("./route-params-factory"); +const pipes_context_creator_1 = require("./../pipes/pipes-context-creator"); +const pipes_consumer_1 = require("./../pipes/pipes-consumer"); +const guards_context_creator_1 = require("../guards/guards-context-creator"); +const guards_consumer_1 = require("../guards/guards-consumer"); +const interceptors_context_creator_1 = require("../interceptors/interceptors-context-creator"); +const interceptors_consumer_1 = require("../interceptors/interceptors-consumer"); +class RouterExplorer { + constructor(metadataScanner, container, routerProxy, exceptionsFilter, config) { + this.metadataScanner = metadataScanner; + this.routerProxy = routerProxy; + this.exceptionsFilter = exceptionsFilter; + this.config = config; + this.routerMethodFactory = new router_method_factory_1.RouterMethodFactory(); + this.logger = new logger_service_1.Logger(RouterExplorer.name, true); + this.executionContextCreator = new router_execution_context_1.RouterExecutionContext(new route_params_factory_1.RouteParamsFactory(), new pipes_context_creator_1.PipesContextCreator(config), new pipes_consumer_1.PipesConsumer(), new guards_context_creator_1.GuardsContextCreator(container, config), new guards_consumer_1.GuardsConsumer(), new interceptors_context_creator_1.InterceptorsContextCreator(container, config), new interceptors_consumer_1.InterceptorsConsumer(), container.getApplicationRef()); + } + explore(instance, metatype, module, appInstance, basePath) { + const routerPaths = this.scanForPaths(instance); + this.applyPathsToRouterProxy(appInstance, routerPaths, instance, module, basePath); + } + extractRouterPath(metatype, prefix) { + let path = Reflect.getMetadata(constants_1.PATH_METADATA, metatype); + if (prefix) + path = prefix + this.validateRoutePath(path); + return this.validateRoutePath(path); + } + validateRoutePath(path) { + if (shared_utils_1.isUndefined(path)) { + throw new unknown_request_mapping_exception_1.UnknownRequestMappingException(); + } + return shared_utils_1.validatePath(path); + } + scanForPaths(instance, prototype) { + const instancePrototype = shared_utils_1.isUndefined(prototype) + ? Object.getPrototypeOf(instance) + : prototype; + return this.metadataScanner.scanFromPrototype(instance, instancePrototype, method => this.exploreMethodMetadata(instance, instancePrototype, method)); + } + exploreMethodMetadata(instance, instancePrototype, methodName) { + const targetCallback = instancePrototype[methodName]; + const routePath = Reflect.getMetadata(constants_1.PATH_METADATA, targetCallback); + if (shared_utils_1.isUndefined(routePath)) { + return null; + } + const requestMethod = Reflect.getMetadata(constants_1.METHOD_METADATA, targetCallback); + return { + path: this.validateRoutePath(routePath), + requestMethod, + targetCallback, + methodName, + }; + } + applyPathsToRouterProxy(router, routePaths, instance, module, basePath) { + (routePaths || []).map(pathProperties => { + const { path, requestMethod } = pathProperties; + this.applyCallbackToRouter(router, pathProperties, instance, module, basePath); + this.logger.log(messages_1.routeMappedMessage(path, requestMethod)); + }); + } + applyCallbackToRouter(router, pathProperties, instance, module, basePath) { + const { path, requestMethod, targetCallback, methodName } = pathProperties; + const routerMethod = this.routerMethodFactory + .get(router, requestMethod) + .bind(router); + const proxy = this.createCallbackProxy(instance, targetCallback, methodName, module, requestMethod); + const stripSlash = str => str[str.length - 1] === '/' ? str.slice(0, str.length - 1) : str; + const fullPath = stripSlash(basePath) + path; + routerMethod(stripSlash(fullPath) || '/', proxy); + } + createCallbackProxy(instance, callback, methodName, module, requestMethod) { + const executionContext = this.executionContextCreator.create(instance, callback, methodName, module, requestMethod); + const exceptionFilter = this.exceptionsFilter.create(instance, callback); + return this.routerProxy.createProxy(executionContext, exceptionFilter); + } +} +exports.RouterExplorer = RouterExplorer; diff --git a/lib/core/router/router-proxy.d.ts b/lib/core/router/router-proxy.d.ts new file mode 100644 index 000000000..b5095277a --- /dev/null +++ b/lib/core/router/router-proxy.d.ts @@ -0,0 +1,12 @@ +import { ExceptionsHandler } from '../exceptions/exceptions-handler'; +export declare type RouterProxyCallback = (req?, res?, next?) => void; +export declare class RouterProxy { + createProxy( + targetCallback: RouterProxyCallback, + exceptionsHandler: ExceptionsHandler, + ): (req: any, res: any, next: any) => void; + createExceptionLayerProxy( + targetCallback: (err, req, res, next) => void, + exceptionsHandler: ExceptionsHandler, + ): (err: any, req: any, res: any, next: any) => void; +} diff --git a/lib/core/router/router-proxy.js b/lib/core/router/router-proxy.js new file mode 100644 index 000000000..4c6b439af --- /dev/null +++ b/lib/core/router/router-proxy.js @@ -0,0 +1,32 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const execution_context_host_1 = require("../helpers/execution-context.host"); +class RouterProxy { + createProxy(targetCallback, exceptionsHandler) { + return (req, res, next) => { + const host = new execution_context_host_1.ExecutionContextHost([req, res]); + try { + Promise.resolve(targetCallback(req, res, next)).catch(e => { + exceptionsHandler.next(e, host); + }); + } + catch (e) { + exceptionsHandler.next(e, host); + } + }; + } + createExceptionLayerProxy(targetCallback, exceptionsHandler) { + return (err, req, res, next) => { + const host = new execution_context_host_1.ExecutionContextHost([req, res]); + try { + Promise.resolve(targetCallback(err, req, res, next)).catch(e => { + exceptionsHandler.next(e, host); + }); + } + catch (e) { + exceptionsHandler.next(e, host); + } + }; + } +} +exports.RouterProxy = RouterProxy; diff --git a/lib/core/router/router-response-controller.d.ts b/lib/core/router/router-response-controller.d.ts new file mode 100644 index 000000000..6a5a31c8d --- /dev/null +++ b/lib/core/router/router-response-controller.d.ts @@ -0,0 +1,13 @@ +import { RequestMethod, HttpServer } from '@nestjs/common'; +export declare class RouterResponseController { + private readonly applicationRef; + constructor(applicationRef: HttpServer); + apply( + resultOrDeffered: any, + response: any, + httpStatusCode: number, + ): Promise; + render(resultOrDeffered: any, response: any, template: string): Promise; + transformToResult(resultOrDeffered: any): Promise; + getStatusByMethod(requestMethod: RequestMethod): number; +} diff --git a/lib/core/router/router-response-controller.js b/lib/core/router/router-response-controller.js new file mode 100644 index 000000000..d6b5fb336 --- /dev/null +++ b/lib/core/router/router-response-controller.js @@ -0,0 +1,49 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const common_1 = require("@nestjs/common"); +const shared_utils_1 = require("@nestjs/common/utils/shared.utils"); +class RouterResponseController { + constructor(applicationRef) { + this.applicationRef = applicationRef; + } + apply(resultOrDeffered, response, httpStatusCode) { + return __awaiter(this, void 0, void 0, function* () { + const result = yield this.transformToResult(resultOrDeffered); + return this.applicationRef.reply(response, result, httpStatusCode); + }); + } + render(resultOrDeffered, response, template) { + return __awaiter(this, void 0, void 0, function* () { + const result = yield this.transformToResult(resultOrDeffered); + this.applicationRef.render(response, template, result); + }); + } + transformToResult(resultOrDeffered) { + return __awaiter(this, void 0, void 0, function* () { + if (resultOrDeffered instanceof Promise) { + return yield resultOrDeffered; + } + else if (resultOrDeffered && shared_utils_1.isFunction(resultOrDeffered.subscribe)) { + return yield resultOrDeffered.toPromise(); + } + return resultOrDeffered; + }); + } + getStatusByMethod(requestMethod) { + switch (requestMethod) { + case common_1.RequestMethod.POST: + return common_1.HttpStatus.CREATED; + default: + return common_1.HttpStatus.OK; + } + } +} +exports.RouterResponseController = RouterResponseController; diff --git a/lib/core/router/routes-resolver.d.ts b/lib/core/router/routes-resolver.d.ts new file mode 100644 index 000000000..f9850a7b4 --- /dev/null +++ b/lib/core/router/routes-resolver.d.ts @@ -0,0 +1,24 @@ +import { NestContainer, InstanceWrapper } from '../injector/container'; +import { Controller } from '@nestjs/common/interfaces/controllers/controller.interface'; +import { Resolver } from './interfaces/resolver.interface'; +import { ApplicationConfig } from './../application-config'; +import { HttpServer } from '@nestjs/common/interfaces'; +export declare class RoutesResolver implements Resolver { + private readonly container; + private readonly config; + private readonly logger; + private readonly routerProxy; + private readonly routerExceptionsFilter; + private readonly routerBuilder; + constructor(container: NestContainer, config: ApplicationConfig); + resolve(appInstance: any, basePath: string): void; + registerRouters( + routes: Map>, + moduleName: string, + basePath: string, + appInstance: HttpServer, + ): void; + registerNotFoundHandler(): void; + registerExceptionHandler(): void; + mapExternalException(err: any): any; +} diff --git a/lib/core/router/routes-resolver.js b/lib/core/router/routes-resolver.js new file mode 100644 index 000000000..0c4c00483 --- /dev/null +++ b/lib/core/router/routes-resolver.js @@ -0,0 +1,71 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const router_proxy_1 = require("./router-proxy"); +const logger_service_1 = require("@nestjs/common/services/logger.service"); +const messages_1 = require("../helpers/messages"); +const router_exception_filters_1 = require("./router-exception-filters"); +const metadata_scanner_1 = require("../metadata-scanner"); +const router_explorer_1 = require("./router-explorer"); +const common_1 = require("@nestjs/common"); +const constants_1 = require("@nestjs/common/constants"); +class RoutesResolver { + constructor(container, config) { + this.container = container; + this.config = config; + this.logger = new logger_service_1.Logger(RoutesResolver.name, true); + this.routerProxy = new router_proxy_1.RouterProxy(); + this.routerExceptionsFilter = new router_exception_filters_1.RouterExceptionFilters(config, container.getApplicationRef()); + this.routerBuilder = new router_explorer_1.RouterExplorer(new metadata_scanner_1.MetadataScanner(), this.container, this.routerProxy, this.routerExceptionsFilter, this.config); + } + resolve(appInstance, basePath) { + const modules = this.container.getModules(); + modules.forEach(({ routes, metatype }, moduleName) => { + let path = metatype + ? Reflect.getMetadata(constants_1.MODULE_PATH, metatype) + : undefined; + path = path ? path + basePath : basePath; + this.registerRouters(routes, moduleName, path, appInstance); + }); + this.registerNotFoundHandler(); + this.registerExceptionHandler(); + } + registerRouters(routes, moduleName, basePath, appInstance) { + routes.forEach(({ instance, metatype }) => { + const path = this.routerBuilder.extractRouterPath(metatype, basePath); + const controllerName = metatype.name; + this.logger.log(messages_1.controllerMappingMessage(controllerName, path)); + this.routerBuilder.explore(instance, metatype, moduleName, appInstance, path); + }); + } + registerNotFoundHandler() { + const applicationRef = this.container.getApplicationRef(); + const callback = (req, res) => { + const method = applicationRef.getRequestMethod(req); + const url = applicationRef.getRequestUrl(req); + throw new common_1.NotFoundException(`Cannot ${method} ${url}`); + }; + const handler = this.routerExceptionsFilter.create({}, callback); + const proxy = this.routerProxy.createProxy(callback, handler); + applicationRef.setNotFoundHandler && + applicationRef.setNotFoundHandler(proxy); + } + registerExceptionHandler() { + const callback = (err, req, res, next) => { + throw this.mapExternalException(err); + }; + const handler = this.routerExceptionsFilter.create({}, callback); + const proxy = this.routerProxy.createExceptionLayerProxy(callback, handler); + const applicationRef = this.container.getApplicationRef(); + applicationRef.setErrorHandler && + applicationRef.setErrorHandler(proxy); + } + mapExternalException(err) { + switch (true) { + case err instanceof SyntaxError: + return new common_1.BadRequestException(err.message); + default: + return err; + } + } +} +exports.RoutesResolver = RoutesResolver; diff --git a/lib/core/scanner.d.ts b/lib/core/scanner.d.ts new file mode 100644 index 000000000..f687bccf9 --- /dev/null +++ b/lib/core/scanner.d.ts @@ -0,0 +1,54 @@ +import 'reflect-metadata'; +import { NestContainer } from './injector/container'; +import { Controller } from '@nestjs/common/interfaces/controllers/controller.interface'; +import { Injectable } from '@nestjs/common/interfaces/injectable.interface'; +import { Type } from '@nestjs/common/interfaces/type.interface'; +import { MetadataScanner } from '../core/metadata-scanner'; +import { DynamicModule } from '@nestjs/common'; +import { ApplicationConfig } from './application-config'; +export declare class DependenciesScanner { + private readonly container; + private readonly metadataScanner; + private readonly applicationConfig; + private readonly applicationProvidersApplyMap; + constructor( + container: NestContainer, + metadataScanner: MetadataScanner, + applicationConfig?: ApplicationConfig, + ); + scan(module: Type): void; + scanForModules(module: Type | DynamicModule, scope?: Type[]): void; + storeModule(module: any, scope: Type[]): void; + scanModulesForDependencies(): void; + reflectRelatedModules( + module: Type, + token: string, + context: string, + ): void; + reflectComponents(module: Type, token: string): void; + reflectComponentMetadata(component: Type, token: string): void; + reflectControllers(module: Type, token: string): void; + reflectDynamicMetadata(obj: Type, token: string): void; + reflectExports(module: Type, token: string): void; + reflectGatewaysMiddlewares(component: Type, token: string): void; + reflectGuards(component: Type, token: string): void; + reflectInterceptors(component: Type, token: string): void; + reflectKeyMetadata( + component: Type, + key: string, + method: string, + ): any; + storeRelatedModule(related: any, token: string, context: string): void; + storeComponent(component: any, token: string): string; + storeInjectable(component: Type, token: string): void; + storeExportedComponent( + exportedComponent: Type, + token: string, + ): void; + storeRoute(route: Type, token: string): void; + reflectMetadata(metatype: any, metadata: string): any; + applyApplicationProviders(): void; + getApplyProvidersMap(): { + [type: string]: Function; + }; +} diff --git a/lib/core/scanner.js b/lib/core/scanner.js new file mode 100644 index 000000000..fa7b86850 --- /dev/null +++ b/lib/core/scanner.js @@ -0,0 +1,166 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +require("reflect-metadata"); +const constants_1 = require("@nestjs/common/constants"); +const application_config_1 = require("./application-config"); +const shared_utils_1 = require("@nestjs/common/utils/shared.utils"); +const constants_2 = require("./constants"); +const circular_dependency_exception_1 = require("./errors/exceptions/circular-dependency.exception"); +class DependenciesScanner { + constructor(container, metadataScanner, applicationConfig = new application_config_1.ApplicationConfig()) { + this.container = container; + this.metadataScanner = metadataScanner; + this.applicationConfig = applicationConfig; + this.applicationProvidersApplyMap = []; + } + scan(module) { + this.scanForModules(module); + this.scanModulesForDependencies(); + this.container.bindGlobalScope(); + } + scanForModules(module, scope = []) { + this.storeModule(module, scope); + const importedModules = this.reflectMetadata(module, constants_1.metadata.MODULES); + importedModules.map(innerModule => { + this.scanForModules(innerModule, [].concat(scope, module)); + }); + } + storeModule(module, scope) { + if (module && module.forwardRef) { + return this.container.addModule(module.forwardRef(), scope); + } + this.container.addModule(module, scope); + } + scanModulesForDependencies() { + const modules = this.container.getModules(); + modules.forEach(({ metatype }, token) => { + this.reflectRelatedModules(metatype, token, metatype.name); + this.reflectComponents(metatype, token); + this.reflectControllers(metatype, token); + this.reflectExports(metatype, token); + }); + } + reflectRelatedModules(module, token, context) { + const modules = [ + ...this.reflectMetadata(module, constants_1.metadata.MODULES), + ...this.container.getDynamicMetadataByToken(token, constants_1.metadata.MODULES), + ...this.container.getDynamicMetadataByToken(token, constants_1.metadata.IMPORTS), + ]; + modules.map(related => this.storeRelatedModule(related, token, context)); + } + reflectComponents(module, token) { + const components = [ + ...this.reflectMetadata(module, constants_1.metadata.COMPONENTS), + ...this.container.getDynamicMetadataByToken(token, constants_1.metadata.COMPONENTS), + ...this.container.getDynamicMetadataByToken(token, constants_1.metadata.PROVIDERS), + ]; + components.map(component => { + this.storeComponent(component, token); + this.reflectComponentMetadata(component, token); + this.reflectDynamicMetadata(component, token); + }); + } + reflectComponentMetadata(component, token) { + this.reflectGatewaysMiddlewares(component, token); + } + reflectControllers(module, token) { + const routes = [ + ...this.reflectMetadata(module, constants_1.metadata.CONTROLLERS), + ...this.container.getDynamicMetadataByToken(token, constants_1.metadata.CONTROLLERS), + ]; + routes.map(route => { + this.storeRoute(route, token); + this.reflectDynamicMetadata(route, token); + }); + } + reflectDynamicMetadata(obj, token) { + if (!obj || !obj.prototype) { + return; + } + this.reflectGuards(obj, token); + this.reflectInterceptors(obj, token); + } + reflectExports(module, token) { + const exports = [ + ...this.reflectMetadata(module, constants_1.metadata.EXPORTS), + ...this.container.getDynamicMetadataByToken(token, constants_1.metadata.EXPORTS), + ]; + exports.map(exportedComponent => this.storeExportedComponent(exportedComponent, token)); + } + reflectGatewaysMiddlewares(component, token) { + const middlewares = this.reflectMetadata(component, constants_1.GATEWAY_MIDDLEWARES); + middlewares.map(middleware => this.storeComponent(middleware, token)); + } + reflectGuards(component, token) { + const controllerGuards = this.reflectMetadata(component, constants_1.GUARDS_METADATA); + const methodsGuards = this.metadataScanner.scanFromPrototype(null, component.prototype, this.reflectKeyMetadata.bind(this, component, constants_1.GUARDS_METADATA)); + const flattenMethodsGuards = methodsGuards.reduce((a, b) => a.concat(b), []); + [...controllerGuards, ...flattenMethodsGuards].map(guard => this.storeInjectable(guard, token)); + } + reflectInterceptors(component, token) { + const controllerInterceptors = this.reflectMetadata(component, constants_1.INTERCEPTORS_METADATA); + const methodsInterceptors = this.metadataScanner.scanFromPrototype(null, component.prototype, this.reflectKeyMetadata.bind(this, component, constants_1.INTERCEPTORS_METADATA)); + const flattenMethodsInterceptors = methodsInterceptors.reduce((a, b) => a.concat(b), []); + [...controllerInterceptors, ...flattenMethodsInterceptors].map(guard => this.storeInjectable(guard, token)); + } + reflectKeyMetadata(component, key, method) { + const descriptor = Reflect.getOwnPropertyDescriptor(component.prototype, method); + return descriptor ? Reflect.getMetadata(key, descriptor.value) : undefined; + } + storeRelatedModule(related, token, context) { + if (shared_utils_1.isUndefined(related)) { + throw new circular_dependency_exception_1.CircularDependencyException(context); + } + if (related && related.forwardRef) { + return this.container.addRelatedModule(related.forwardRef(), token); + } + this.container.addRelatedModule(related, token); + } + storeComponent(component, token) { + const isCustomProvider = component && !shared_utils_1.isNil(component.provide); + if (!isCustomProvider) { + return this.container.addComponent(component, token); + } + const applyProvidersMap = this.getApplyProvidersMap(); + const providersKeys = Object.keys(applyProvidersMap); + const providerToken = component.provide; + if (providersKeys.indexOf(providerToken) < 0) { + return this.container.addComponent(component, token); + } + this.applicationProvidersApplyMap.push({ + moduleToken: token, + providerToken, + }); + this.container.addComponent(component, token); + } + storeInjectable(component, token) { + this.container.addInjectable(component, token); + } + storeExportedComponent(exportedComponent, token) { + this.container.addExportedComponent(exportedComponent, token); + } + storeRoute(route, token) { + this.container.addController(route, token); + } + reflectMetadata(metatype, metadata) { + return Reflect.getMetadata(metadata, metatype) || []; + } + applyApplicationProviders() { + const applyProvidersMap = this.getApplyProvidersMap(); + this.applicationProvidersApplyMap.forEach(({ moduleToken, providerToken }) => { + const modules = this.container.getModules(); + const { components } = modules.get(moduleToken); + const { instance } = components.get(providerToken); + applyProvidersMap[providerToken](instance); + }); + } + getApplyProvidersMap() { + return { + [constants_2.APP_INTERCEPTOR]: interceptor => this.applicationConfig.addGlobalInterceptor(interceptor), + [constants_2.APP_PIPE]: pipe => this.applicationConfig.addGlobalPipe(pipe), + [constants_2.APP_GUARD]: guard => this.applicationConfig.addGlobalGuard(guard), + [constants_2.APP_FILTER]: filter => this.applicationConfig.addGlobalFilter(filter), + }; + } +} +exports.DependenciesScanner = DependenciesScanner; diff --git a/lib/core/services/reflector.service.d.ts b/lib/core/services/reflector.service.d.ts new file mode 100644 index 000000000..a6e96a6ce --- /dev/null +++ b/lib/core/services/reflector.service.d.ts @@ -0,0 +1,3 @@ +export declare class Reflector { + get(metadataKey: any, target: any): T; +} diff --git a/lib/core/services/reflector.service.js b/lib/core/services/reflector.service.js new file mode 100644 index 000000000..2b788a1a0 --- /dev/null +++ b/lib/core/services/reflector.service.js @@ -0,0 +1,8 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +class Reflector { + get(metadataKey, target) { + return Reflect.getMetadata(metadataKey, target); + } +} +exports.Reflector = Reflector; diff --git a/lib/microservices/client/client-grpc.d.ts b/lib/microservices/client/client-grpc.d.ts new file mode 100644 index 000000000..1f481ae80 --- /dev/null +++ b/lib/microservices/client/client-grpc.d.ts @@ -0,0 +1,33 @@ +import { GrpcObject } from 'grpc'; +import { ClientProxy } from './client-proxy'; +import { ClientOptions } from '../interfaces/client-metadata.interface'; +import { ClientGrpc } from './../interfaces'; +import { Observable } from 'rxjs/Observable'; +export declare class ClientGrpcProxy extends ClientProxy implements ClientGrpc { + private readonly options; + private readonly logger; + private readonly url; + private grpcClient; + constructor(options: ClientOptions); + getService(name: string): T; + createServiceMethod( + client: any, + methodName: string, + ): (...args) => Observable; + createStreamServiceMethod( + client: any, + methodName: string, + ): (...args) => Observable; + createUnaryServiceMethod( + client: any, + methodName: string, + ): (...args) => Observable; + createClient(): any; + loadProto(): GrpcObject; + lookupPackage(root: any, packageName: string): any; + close(): void; + protected publish( + partialPacket: any, + callback: (packet) => any, + ): Promise; +} diff --git a/lib/microservices/client/client-grpc.js b/lib/microservices/client/client-grpc.js new file mode 100644 index 000000000..a59746d32 --- /dev/null +++ b/lib/microservices/client/client-grpc.js @@ -0,0 +1,106 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const client_proxy_1 = require("./client-proxy"); +const logger_service_1 = require("@nestjs/common/services/logger.service"); +const constants_1 = require("./../constants"); +const Observable_1 = require("rxjs/Observable"); +const invalid_grpc_service_exception_1 = require("../exceptions/invalid-grpc-service.exception"); +const invalid_grpc_package_exception_1 = require("../exceptions/invalid-grpc-package.exception"); +const invalid_proto_definition_exception_1 = require("../exceptions/invalid-proto-definition.exception"); +let grpcPackage = {}; +class ClientGrpcProxy extends client_proxy_1.ClientProxy { + constructor(options) { + super(); + this.options = options; + this.logger = new logger_service_1.Logger(client_proxy_1.ClientProxy.name); + this.url = + this.getOptionsProp(options, 'url') || constants_1.GRPC_DEFAULT_URL; + grpcPackage = this.loadPackage('grpc', ClientGrpcProxy.name); + this.grpcClient = this.createClient(); + } + getService(name) { + var options, credentials; + if (!this.grpcClient[name]) { + throw new invalid_grpc_service_exception_1.InvalidGrpcServiceException(); + } + const grpcClient = new this.grpcClient[name](this.url, credentials || grpcPackage.credentials.createInsecure(), options); + const protoMethods = Object.keys(this.grpcClient[name].prototype); + const grpcService = {}; + protoMethods.forEach(m => { + grpcService[m] = this.createServiceMethod(grpcClient, m); + }); + return grpcService; + } + createServiceMethod(client, methodName) { + return client[methodName].responseStream + ? this.createStreamServiceMethod(client, methodName) + : this.createUnaryServiceMethod(client, methodName); + } + createStreamServiceMethod(client, methodName) { + return (...args) => { + return new Observable_1.Observable(observer => { + const call = client[methodName](...args); + call.on('data', (data) => observer.next(data)); + call.on('error', (error) => observer.error(error)); + call.on('end', () => observer.complete()); + }); + }; + } + createUnaryServiceMethod(client, methodName) { + return (...args) => { + return new Observable_1.Observable(observer => { + client[methodName](...args, (error, data) => { + if (error) { + return observer.error(error); + } + observer.next(data); + observer.complete(); + }); + }); + }; + } + createClient() { + const grpcContext = this.loadProto(); + const packageName = this.getOptionsProp(this.options, 'package'); + const grpcPackage = this.lookupPackage(grpcContext, packageName); + if (!grpcPackage) { + throw new invalid_grpc_package_exception_1.InvalidGrpcPackageException(); + } + return grpcPackage; + } + loadProto() { + try { + const context = grpcPackage.load(this.getOptionsProp(this.options, 'protoPath')); + return context; + } + catch (e) { + throw new invalid_proto_definition_exception_1.InvalidProtoDefinitionException(); + } + } + lookupPackage(root, packageName) { + /** Reference: https://github.com/kondi/rxjs-grpc */ + let pkg = root; + for (const name of packageName.split(/\./)) { + pkg = pkg[name]; + } + return pkg; + } + close() { + this.grpcClient && this.grpcClient.close(); + this.grpcClient = null; + } + publish(partialPacket, callback) { + return __awaiter(this, void 0, void 0, function* () { + throw new Error('Method is not supported in gRPC mode. Use ClientGrpc instead (learn more in the documentation).'); + }); + } +} +exports.ClientGrpcProxy = ClientGrpcProxy; diff --git a/lib/microservices/client/client-mqtt.d.ts b/lib/microservices/client/client-mqtt.d.ts new file mode 100644 index 000000000..870f4e6b3 --- /dev/null +++ b/lib/microservices/client/client-mqtt.d.ts @@ -0,0 +1,23 @@ +/// +import { MqttClient } from 'mqtt'; +import { ClientProxy } from './client-proxy'; +import { ClientOptions } from '../interfaces/client-metadata.interface'; +import { WritePacket } from './../interfaces'; +import { ReadPacket } from './../interfaces'; +export declare class ClientMqtt extends ClientProxy { + private readonly options; + private readonly logger; + private readonly url; + private mqttClient; + constructor(options: ClientOptions); + protected publish( + partialPacket: ReadPacket, + callback: (packet: WritePacket) => any, + ): (channel: string, buffer: Buffer) => any; + getAckPatternName(pattern: string): string; + getResPatternName(pattern: string): string; + close(): void; + init(callback: (...args) => any): void; + createClient(): MqttClient; + handleError(client: MqttClient, callback: (...args) => any): void; +} diff --git a/lib/microservices/client/client-mqtt.js b/lib/microservices/client/client-mqtt.js new file mode 100644 index 000000000..dc6fb298c --- /dev/null +++ b/lib/microservices/client/client-mqtt.js @@ -0,0 +1,80 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const client_proxy_1 = require("./client-proxy"); +const logger_service_1 = require("@nestjs/common/services/logger.service"); +const constants_1 = require("./../constants"); +let mqttPackage = {}; +class ClientMqtt extends client_proxy_1.ClientProxy { + constructor(options) { + super(); + this.options = options; + this.logger = new logger_service_1.Logger(client_proxy_1.ClientProxy.name); + this.url = + this.getOptionsProp(this.options, 'url') || constants_1.MQTT_DEFAULT_URL; + mqttPackage = this.loadPackage('mqtt', ClientMqtt.name); + } + publish(partialPacket, callback) { + if (!this.mqttClient) { + this.init(callback); + } + const packet = this.assignPacketId(partialPacket); + const pattern = JSON.stringify(partialPacket.pattern); + const responseChannel = this.getResPatternName(pattern); + const responseCallback = (channel, buffer) => { + const { err, response, isDisposed, id } = JSON.parse(buffer.toString()); + if (id !== packet.id) { + return void 0; + } + if (isDisposed || err) { + callback({ + err, + response: null, + isDisposed: true, + }); + this.mqttClient.unsubscribe(channel); + this.mqttClient.removeListener(constants_1.MESSAGE_EVENT, responseCallback); + return; + } + callback({ + err, + response, + }); + }; + this.mqttClient.on(constants_1.MESSAGE_EVENT, responseCallback); + this.mqttClient.subscribe(responseChannel); + this.mqttClient.publish(this.getAckPatternName(pattern), JSON.stringify(packet)); + return responseCallback; + } + getAckPatternName(pattern) { + return `${pattern}_ack`; + } + getResPatternName(pattern) { + return `${pattern}_res`; + } + close() { + this.mqttClient && this.mqttClient.end(); + this.mqttClient = null; + } + init(callback) { + this.mqttClient = this.createClient(); + this.handleError(this.mqttClient, callback); + } + createClient() { + return mqttPackage.connect(this.url, this.options.options); + } + handleError(client, callback) { + const errorCallback = err => { + if (err.code === 'ECONNREFUSED') { + callback(err, null); + this.mqttClient = null; + } + this.logger.error(err); + }; + client.addListener(constants_1.ERROR_EVENT, errorCallback); + client.on(constants_1.CONNECT_EVENT, () => { + client.removeListener(constants_1.ERROR_EVENT, errorCallback); + client.addListener(constants_1.ERROR_EVENT, err => this.logger.error(err)); + }); + } +} +exports.ClientMqtt = ClientMqtt; diff --git a/lib/microservices/client/client-nats.d.ts b/lib/microservices/client/client-nats.d.ts new file mode 100644 index 000000000..3187150a3 --- /dev/null +++ b/lib/microservices/client/client-nats.d.ts @@ -0,0 +1,21 @@ +import { Client } from 'nats'; +import { ClientProxy } from './client-proxy'; +import { ClientOptions } from '../interfaces/client-metadata.interface'; +import { WritePacket, ReadPacket, PacketId } from './../interfaces'; +export declare class ClientNats extends ClientProxy { + private readonly options; + private readonly logger; + private readonly url; + private natsClient; + constructor(options: ClientOptions); + protected publish( + partialPacket: ReadPacket, + callback: (packet: WritePacket) => any, + ): Promise<(message: WritePacket & PacketId) => void>; + getAckPatternName(pattern: string): string; + getResPatternName(pattern: string): string; + close(): void; + init(callback: (...args) => any): Promise; + createClient(): Promise; + handleError(client: Client, callback: (...args) => any): void; +} diff --git a/lib/microservices/client/client-nats.js b/lib/microservices/client/client-nats.js new file mode 100644 index 000000000..5cb411c25 --- /dev/null +++ b/lib/microservices/client/client-nats.js @@ -0,0 +1,91 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const client_proxy_1 = require("./client-proxy"); +const logger_service_1 = require("@nestjs/common/services/logger.service"); +const constants_1 = require("./../constants"); +let natsPackage = {}; +class ClientNats extends client_proxy_1.ClientProxy { + constructor(options) { + super(); + this.options = options; + this.logger = new logger_service_1.Logger(client_proxy_1.ClientProxy.name); + this.url = + this.getOptionsProp(this.options, 'url') || constants_1.NATS_DEFAULT_URL; + natsPackage = this.loadPackage('nats', ClientNats.name); + } + publish(partialPacket, callback) { + return __awaiter(this, void 0, void 0, function* () { + if (!this.natsClient) { + yield this.init(callback); + } + const packet = this.assignPacketId(partialPacket); + const pattern = JSON.stringify(partialPacket.pattern); + const responseChannel = this.getResPatternName(pattern); + const subscriptionHandler = (message) => { + if (message.id !== packet.id) { + return void 0; + } + const { err, response, isDisposed } = message; + if (isDisposed || err) { + callback({ + err, + response: null, + isDisposed: true, + }); + return this.natsClient.unsubscribe(subscriptionId); + } + callback({ + err, + response, + }); + }; + const subscriptionId = this.natsClient.subscribe(responseChannel, subscriptionHandler); + this.natsClient.publish(this.getAckPatternName(pattern), packet); + return subscriptionHandler; + }); + } + getAckPatternName(pattern) { + return `${pattern}_ack`; + } + getResPatternName(pattern) { + return `${pattern}_res`; + } + close() { + this.natsClient && this.natsClient.close(); + this.natsClient = null; + } + init(callback) { + return __awaiter(this, void 0, void 0, function* () { + this.natsClient = yield this.createClient(); + this.handleError(this.natsClient, callback); + }); + } + createClient() { + const options = this.options.options || {}; + const client = natsPackage.connect(Object.assign({}, options, { url: this.url, json: true })); + return new Promise(resolve => client.on(constants_1.CONNECT_EVENT, resolve)); + } + handleError(client, callback) { + const errorCallback = err => { + if (err.code === 'ECONNREFUSED') { + callback(err, null); + this.natsClient = null; + } + this.logger.error(err); + }; + client.addListener(constants_1.ERROR_EVENT, errorCallback); + client.on(constants_1.CONNECT_EVENT, () => { + client.removeListener(constants_1.ERROR_EVENT, errorCallback); + client.addListener(constants_1.ERROR_EVENT, err => this.logger.error(err)); + }); + } +} +exports.ClientNats = ClientNats; diff --git a/lib/microservices/client/client-proxy-factory.d.ts b/lib/microservices/client/client-proxy-factory.d.ts new file mode 100644 index 000000000..33b6bdc15 --- /dev/null +++ b/lib/microservices/client/client-proxy-factory.d.ts @@ -0,0 +1,6 @@ +import { ClientOptions } from '../interfaces/client-metadata.interface'; +import { ClientProxy } from './client-proxy'; +import { Closeable } from '../interfaces/closeable.interface'; +export declare class ClientProxyFactory { + static create(options: ClientOptions): ClientProxy & Closeable; +} diff --git a/lib/microservices/client/client-proxy-factory.js b/lib/microservices/client/client-proxy-factory.js new file mode 100644 index 000000000..8f55a1d0c --- /dev/null +++ b/lib/microservices/client/client-proxy-factory.js @@ -0,0 +1,26 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const client_tcp_1 = require("./client-tcp"); +const client_redis_1 = require("./client-redis"); +const transport_enum_1 = require("../enums/transport.enum"); +const client_nats_1 = require("./client-nats"); +const client_mqtt_1 = require("./client-mqtt"); +const client_grpc_1 = require("./client-grpc"); +class ClientProxyFactory { + static create(options) { + const { transport } = options; + switch (transport) { + case transport_enum_1.Transport.REDIS: + return new client_redis_1.ClientRedis(options); + case transport_enum_1.Transport.NATS: + return new client_nats_1.ClientNats(options); + case transport_enum_1.Transport.MQTT: + return new client_mqtt_1.ClientMqtt(options); + case transport_enum_1.Transport.GRPC: + return new client_grpc_1.ClientGrpcProxy(options); + default: + return new client_tcp_1.ClientTCP(options); + } + } +} +exports.ClientProxyFactory = ClientProxyFactory; diff --git a/lib/microservices/client/client-proxy.d.ts b/lib/microservices/client/client-proxy.d.ts new file mode 100644 index 000000000..8db356af3 --- /dev/null +++ b/lib/microservices/client/client-proxy.d.ts @@ -0,0 +1,26 @@ +import { Observable } from 'rxjs/Observable'; +import { Observer } from 'rxjs/Observer'; +import { + ReadPacket, + PacketId, + WritePacket, + ClientOptions, +} from './../interfaces'; +export abstract class ClientProxy { + abstract close(): any; + protected abstract publish( + packet: ReadPacket, + callback: (packet: WritePacket) => void, + ): any; + send(pattern: any, data: any): Observable; + protected loadPackage(name: string, ctx: string): any; + protected createObserver( + observer: Observer, + ): (packet: WritePacket) => void; + protected assignPacketId(packet: ReadPacket): ReadPacket & PacketId; + protected getOptionsProp< + T extends { + options?; + } + >(obj: ClientOptions, prop: keyof T['options'], defaultValue?: any): any; +} diff --git a/lib/microservices/client/client-proxy.js b/lib/microservices/client/client-proxy.js new file mode 100644 index 000000000..764e28885 --- /dev/null +++ b/lib/microservices/client/client-proxy.js @@ -0,0 +1,46 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const Observable_1 = require("rxjs/Observable"); +const shared_utils_1 = require("@nestjs/common/utils/shared.utils"); +const invalid_message_exception_1 = require("../exceptions/invalid-message.exception"); +const throw_1 = require("rxjs/observable/throw"); +const missing_dependency_exception_1 = require("@nestjs/core/errors/exceptions/missing-dependency.exception"); +class ClientProxy { + send(pattern, data) { + if (shared_utils_1.isNil(pattern) || shared_utils_1.isNil(data)) { + return throw_1._throw(new invalid_message_exception_1.InvalidMessageException()); + } + return new Observable_1.Observable((observer) => { + this.publish({ pattern, data }, this.createObserver(observer)); + }); + } + loadPackage(name, ctx) { + try { + return require(name); + } + catch (e) { + throw new missing_dependency_exception_1.MissingRequiredDependencyException(name, ctx); + } + } + createObserver(observer) { + return ({ err, response, isDisposed }) => { + if (err) { + return observer.error(err); + } + else if (isDisposed) { + return observer.complete(); + } + observer.next(response); + }; + } + assignPacketId(packet) { + const id = Math.random() + .toString(36) + .substr(2, 5) + Date.now(); + return Object.assign(packet, { id }); + } + getOptionsProp(obj, prop, defaultValue = undefined) { + return obj && obj.options ? obj.options[prop] : defaultValue; + } +} +exports.ClientProxy = ClientProxy; diff --git a/lib/microservices/client/client-redis.d.ts b/lib/microservices/client/client-redis.d.ts new file mode 100644 index 000000000..98346fd68 --- /dev/null +++ b/lib/microservices/client/client-redis.d.ts @@ -0,0 +1,25 @@ +import { ClientOpts, RetryStrategyOptions, RedisClient } from 'redis'; +import { ClientProxy } from './client-proxy'; +import { ClientOptions } from '../interfaces/client-metadata.interface'; +import { WritePacket, ReadPacket } from './../interfaces'; +export declare class ClientRedis extends ClientProxy { + private readonly options; + private readonly logger; + private readonly url; + private pubClient; + private subClient; + private isExplicitlyTerminated; + constructor(options: ClientOptions); + protected publish( + partialPacket: ReadPacket, + callback: (packet: WritePacket) => any, + ): Promise<(channel: string, buffer: string) => any>; + getAckPatternName(pattern: string): string; + getResPatternName(pattern: string): string; + close(): void; + init(callback: (...args) => any): void; + createClient(): RedisClient; + handleError(client: RedisClient, callback: (...args) => any): void; + getClientOptions(): Partial; + createRetryStrategy(options: RetryStrategyOptions): undefined | number; +} diff --git a/lib/microservices/client/client-redis.js b/lib/microservices/client/client-redis.js new file mode 100644 index 000000000..db3e2737f --- /dev/null +++ b/lib/microservices/client/client-redis.js @@ -0,0 +1,119 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const client_proxy_1 = require("./client-proxy"); +const logger_service_1 = require("@nestjs/common/services/logger.service"); +const constants_1 = require("./../constants"); +let redisPackage = {}; +class ClientRedis extends client_proxy_1.ClientProxy { + constructor(options) { + super(); + this.options = options; + this.logger = new logger_service_1.Logger(client_proxy_1.ClientProxy.name); + this.isExplicitlyTerminated = false; + this.url = + this.getOptionsProp(options, 'url') || constants_1.REDIS_DEFAULT_URL; + redisPackage = this.loadPackage('redis', ClientRedis.name); + } + publish(partialPacket, callback) { + return __awaiter(this, void 0, void 0, function* () { + if (!this.pubClient || !this.subClient) { + this.init(callback); + } + const packet = this.assignPacketId(partialPacket); + const pattern = JSON.stringify(partialPacket.pattern); + const responseChannel = this.getResPatternName(pattern); + const responseCallback = (channel, buffer) => { + const { err, response, isDisposed, id } = JSON.parse(buffer); + if (id !== packet.id) { + return void 0; + } + if (isDisposed || err) { + callback({ + err, + response: null, + isDisposed: true, + }); + this.subClient.unsubscribe(channel); + this.subClient.removeListener(constants_1.MESSAGE_EVENT, responseCallback); + return; + } + callback({ + err, + response, + }); + }; + this.subClient.on(constants_1.MESSAGE_EVENT, responseCallback); + this.subClient.subscribe(responseChannel); + yield new Promise(resolve => { + const handler = channel => { + if (channel && channel !== responseChannel) { + return void 0; + } + this.subClient.removeListener(constants_1.SUBSCRIBE, handler); + resolve(); + }; + this.subClient.on(constants_1.SUBSCRIBE, handler); + }); + this.pubClient.publish(this.getAckPatternName(pattern), JSON.stringify(packet)); + return responseCallback; + }); + } + getAckPatternName(pattern) { + return `${pattern}_ack`; + } + getResPatternName(pattern) { + return `${pattern}_res`; + } + close() { + this.pubClient && this.pubClient.quit(); + this.subClient && this.subClient.quit(); + this.pubClient = this.subClient = null; + } + init(callback) { + this.pubClient = this.createClient(); + this.subClient = this.createClient(); + this.handleError(this.pubClient, callback); + this.handleError(this.subClient, callback); + } + createClient() { + return redisPackage.createClient(Object.assign({}, this.getClientOptions(), { url: this.url })); + } + handleError(client, callback) { + const errorCallback = err => { + if (err.code === 'ECONNREFUSED') { + callback(err, null); + this.pubClient = this.subClient = null; + } + this.logger.error(err); + }; + client.addListener(constants_1.ERROR_EVENT, errorCallback); + client.on(constants_1.CONNECT_EVENT, () => { + client.removeListener(constants_1.ERROR_EVENT, errorCallback); + client.addListener(constants_1.ERROR_EVENT, err => this.logger.error(err)); + }); + } + getClientOptions() { + const retry_strategy = options => this.createRetryStrategy(options); + return { + retry_strategy, + }; + } + createRetryStrategy(options) { + if (this.isExplicitlyTerminated || + !this.getOptionsProp(this.options, 'retryAttempts') || + options.attempt > + this.getOptionsProp(this.options, 'retryAttempts')) { + return undefined; + } + return this.getOptionsProp(this.options, 'retryDelay') || 0; + } +} +exports.ClientRedis = ClientRedis; diff --git a/lib/microservices/client/client-tcp.d.ts b/lib/microservices/client/client-tcp.d.ts new file mode 100644 index 000000000..aa6a1d93a --- /dev/null +++ b/lib/microservices/client/client-tcp.d.ts @@ -0,0 +1,28 @@ +import * as JsonSocket from 'json-socket'; +import { ClientProxy } from './client-proxy'; +import { ClientOptions } from '../interfaces/client-metadata.interface'; +import { WritePacket, ReadPacket } from './../interfaces'; +export declare class ClientTCP extends ClientProxy { + private readonly logger; + private readonly port; + private readonly host; + private isConnected; + private socket; + constructor(options: ClientOptions); + init(callback: (...args) => any): Promise; + protected publish( + partialPacket: ReadPacket, + callback: (packet: WritePacket) => any, + ): Promise; + handleResponse( + socket: JsonSocket, + callback: (packet: WritePacket) => any, + buffer: WritePacket, + context: Function, + ): any; + createSocket(): JsonSocket; + close(): void; + bindEvents(socket: JsonSocket, callback: (...args) => any): void; + handleError(err: any, callback: (...args) => any): void; + handleClose(): void; +} diff --git a/lib/microservices/client/client-tcp.js b/lib/microservices/client/client-tcp.js new file mode 100644 index 000000000..17b93f32b --- /dev/null +++ b/lib/microservices/client/client-tcp.js @@ -0,0 +1,97 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const net = require("net"); +const JsonSocket = require("json-socket"); +const client_proxy_1 = require("./client-proxy"); +const common_1 = require("@nestjs/common"); +const constants_1 = require("./../constants"); +class ClientTCP extends client_proxy_1.ClientProxy { + constructor(options) { + super(); + this.logger = new common_1.Logger(ClientTCP.name); + this.isConnected = false; + this.port = + this.getOptionsProp(options, 'port') || + constants_1.TCP_DEFAULT_PORT; + this.host = + this.getOptionsProp(options, 'host') || + constants_1.TCP_DEFAULT_HOST; + } + init(callback) { + this.socket = this.createSocket(); + return new Promise(resolve => { + this.bindEvents(this.socket, callback); + this.socket._socket.once(constants_1.CONNECT_EVENT, () => { + this.isConnected = true; + resolve(this.socket); + }); + this.socket.connect(this.port, this.host); + }); + } + publish(partialPacket, callback) { + return __awaiter(this, void 0, void 0, function* () { + const handleRequestResponse = (socket) => { + const packet = this.assignPacketId(partialPacket); + socket.sendMessage(packet); + const listener = (buffer) => { + if (buffer.id !== packet.id) { + return void 0; + } + this.handleResponse(socket, callback, buffer, listener); + }; + socket.on(constants_1.MESSAGE_EVENT, listener); + }; + if (this.isConnected) { + return handleRequestResponse(this.socket); + } + const socket = yield this.init(callback); + handleRequestResponse(socket); + return; + }); + } + handleResponse(socket, callback, buffer, context) { + const { err, response, isDisposed } = buffer; + if (isDisposed || err) { + callback({ + err, + response: null, + isDisposed: true, + }); + return socket._socket.removeListener(constants_1.MESSAGE_EVENT, context); + } + callback({ + err, + response, + }); + } + createSocket() { + return new JsonSocket(new net.Socket()); + } + close() { + this.socket && this.socket.end(); + this.handleClose(); + } + bindEvents(socket, callback) { + socket.on(constants_1.ERROR_EVENT, err => this.handleError(err, callback)); + socket.on(constants_1.CLOSE_EVENT, () => this.handleClose()); + } + handleError(err, callback) { + if (err.code === 'ECONNREFUSED') { + callback(err, null); + } + this.logger.error(err); + } + handleClose() { + this.isConnected = false; + this.socket = null; + } +} +exports.ClientTCP = ClientTCP; diff --git a/lib/microservices/client/index.d.ts b/lib/microservices/client/index.d.ts new file mode 100644 index 000000000..d6867e231 --- /dev/null +++ b/lib/microservices/client/index.d.ts @@ -0,0 +1,2 @@ +export * from './client-proxy'; +export * from './client-proxy-factory'; diff --git a/lib/microservices/client/index.js b/lib/microservices/client/index.js new file mode 100644 index 000000000..2bc15850e --- /dev/null +++ b/lib/microservices/client/index.js @@ -0,0 +1,7 @@ +"use strict"; +function __export(m) { + for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p]; +} +Object.defineProperty(exports, "__esModule", { value: true }); +__export(require("./client-proxy")); +__export(require("./client-proxy-factory")); diff --git a/lib/microservices/constants.d.ts b/lib/microservices/constants.d.ts new file mode 100644 index 000000000..bb9da7ed9 --- /dev/null +++ b/lib/microservices/constants.d.ts @@ -0,0 +1,17 @@ +export declare const TCP_DEFAULT_PORT = 3000; +export declare const TCP_DEFAULT_HOST = 'localhost'; +export declare const REDIS_DEFAULT_URL = 'redis://localhost:6379'; +export declare const NATS_DEFAULT_URL = 'nats://localhost:4222'; +export declare const MQTT_DEFAULT_URL = 'mqtt://localhost:1883'; +export declare const GRPC_DEFAULT_URL = 'localhost:5000'; +export declare const CONNECT_EVENT = 'connect'; +export declare const MESSAGE_EVENT = 'message'; +export declare const ERROR_EVENT = 'error'; +export declare const CLOSE_EVENT = 'close'; +export declare const SUBSCRIBE = 'subscribe'; +export declare const PATTERN_METADATA = 'pattern'; +export declare const CLIENT_CONFIGURATION_METADATA = 'client'; +export declare const CLIENT_METADATA = '__isClient'; +export declare const PATTERN_HANDLER_METADATA = '__isPattern'; +export declare const NO_PATTERN_MESSAGE = + "There's no equivalent message pattern."; diff --git a/lib/microservices/constants.js b/lib/microservices/constants.js new file mode 100644 index 000000000..465ab3fdf --- /dev/null +++ b/lib/microservices/constants.js @@ -0,0 +1,18 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.TCP_DEFAULT_PORT = 3000; +exports.TCP_DEFAULT_HOST = 'localhost'; +exports.REDIS_DEFAULT_URL = 'redis://localhost:6379'; +exports.NATS_DEFAULT_URL = 'nats://localhost:4222'; +exports.MQTT_DEFAULT_URL = 'mqtt://localhost:1883'; +exports.GRPC_DEFAULT_URL = 'localhost:5000'; +exports.CONNECT_EVENT = 'connect'; +exports.MESSAGE_EVENT = 'message'; +exports.ERROR_EVENT = 'error'; +exports.CLOSE_EVENT = 'close'; +exports.SUBSCRIBE = 'subscribe'; +exports.PATTERN_METADATA = 'pattern'; +exports.CLIENT_CONFIGURATION_METADATA = 'client'; +exports.CLIENT_METADATA = '__isClient'; +exports.PATTERN_HANDLER_METADATA = '__isPattern'; +exports.NO_PATTERN_MESSAGE = `There's no equivalent message pattern.`; diff --git a/lib/microservices/container.d.ts b/lib/microservices/container.d.ts new file mode 100644 index 000000000..53380b201 --- /dev/null +++ b/lib/microservices/container.d.ts @@ -0,0 +1,9 @@ +import { ClientProxy } from './index'; +import { Closeable } from './interfaces/closeable.interface'; +export declare type CloseableClient = Closeable & ClientProxy; +export declare class ClientsContainer { + private clients; + getAllClients(): CloseableClient[]; + addClient(client: CloseableClient): void; + clear(): void; +} diff --git a/lib/microservices/container.js b/lib/microservices/container.js new file mode 100644 index 000000000..ca568057f --- /dev/null +++ b/lib/microservices/container.js @@ -0,0 +1,17 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +class ClientsContainer { + constructor() { + this.clients = []; + } + getAllClients() { + return this.clients; + } + addClient(client) { + this.clients.push(client); + } + clear() { + this.clients = []; + } +} +exports.ClientsContainer = ClientsContainer; diff --git a/lib/microservices/context/exception-filters-context.d.ts b/lib/microservices/context/exception-filters-context.d.ts new file mode 100644 index 000000000..d970cc8f8 --- /dev/null +++ b/lib/microservices/context/exception-filters-context.d.ts @@ -0,0 +1,15 @@ +import 'reflect-metadata'; +import { Controller } from '@nestjs/common/interfaces/controllers/controller.interface'; +import { Observable } from 'rxjs/Observable'; +import { RpcExceptionsHandler } from '../exceptions/rpc-exceptions-handler'; +import { BaseExceptionFilterContext } from '@nestjs/core/exceptions/base-exception-filter-context'; +import { ApplicationConfig } from '@nestjs/core/application-config'; +export declare class ExceptionFiltersContext extends BaseExceptionFilterContext { + private readonly config; + constructor(config: ApplicationConfig); + create( + instance: Controller, + callback: (data) => Observable, + ): RpcExceptionsHandler; + getGlobalMetadata(): T; +} diff --git a/lib/microservices/context/exception-filters-context.js b/lib/microservices/context/exception-filters-context.js new file mode 100644 index 000000000..f68b9ccf4 --- /dev/null +++ b/lib/microservices/context/exception-filters-context.js @@ -0,0 +1,26 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +require("reflect-metadata"); +const rpc_exceptions_handler_1 = require("../exceptions/rpc-exceptions-handler"); +const constants_1 = require("@nestjs/common/constants"); +const shared_utils_1 = require("@nestjs/common/utils/shared.utils"); +const base_exception_filter_context_1 = require("@nestjs/core/exceptions/base-exception-filter-context"); +class ExceptionFiltersContext extends base_exception_filter_context_1.BaseExceptionFilterContext { + constructor(config) { + super(); + this.config = config; + } + create(instance, callback) { + const exceptionHandler = new rpc_exceptions_handler_1.RpcExceptionsHandler(); + const filters = this.createContext(instance, callback, constants_1.EXCEPTION_FILTERS_METADATA); + if (shared_utils_1.isEmpty(filters)) { + return exceptionHandler; + } + exceptionHandler.setCustomFilters(filters); + return exceptionHandler; + } + getGlobalMetadata() { + return this.config.getGlobalFilters(); + } +} +exports.ExceptionFiltersContext = ExceptionFiltersContext; diff --git a/lib/microservices/context/rpc-context-creator.d.ts b/lib/microservices/context/rpc-context-creator.d.ts new file mode 100644 index 000000000..681b133a4 --- /dev/null +++ b/lib/microservices/context/rpc-context-creator.d.ts @@ -0,0 +1,40 @@ +import { Observable } from 'rxjs/Observable'; +import { RpcProxy } from './rpc-proxy'; +import { ExceptionFiltersContext } from './exception-filters-context'; +import { Controller } from '@nestjs/common/interfaces'; +import { PipesContextCreator } from '@nestjs/core/pipes/pipes-context-creator'; +import { PipesConsumer } from '@nestjs/core/pipes/pipes-consumer'; +import { GuardsContextCreator } from '@nestjs/core/guards/guards-context-creator'; +import { GuardsConsumer } from '@nestjs/core/guards/guards-consumer'; +import { InterceptorsContextCreator } from '@nestjs/core/interceptors/interceptors-context-creator'; +import { InterceptorsConsumer } from '@nestjs/core/interceptors/interceptors-consumer'; +export declare class RpcContextCreator { + private readonly rpcProxy; + private readonly exceptionFiltersContext; + private readonly pipesCreator; + private readonly pipesConsumer; + private readonly guardsContextCreator; + private readonly guardsConsumer; + private readonly interceptorsContextCreator; + private readonly interceptorsConsumer; + constructor( + rpcProxy: RpcProxy, + exceptionFiltersContext: ExceptionFiltersContext, + pipesCreator: PipesContextCreator, + pipesConsumer: PipesConsumer, + guardsContextCreator: GuardsContextCreator, + guardsConsumer: GuardsConsumer, + interceptorsContextCreator: InterceptorsContextCreator, + interceptorsConsumer: InterceptorsConsumer, + ); + create( + instance: Controller, + callback: (data) => Observable, + module: any, + ): (...args) => Promise>; + reflectCallbackParamtypes( + instance: Controller, + callback: (...args) => any, + ): any[]; + getDataMetatype(instance: any, callback: any): any; +} diff --git a/lib/microservices/context/rpc-context-creator.js b/lib/microservices/context/rpc-context-creator.js new file mode 100644 index 000000000..c3b6e4076 --- /dev/null +++ b/lib/microservices/context/rpc-context-creator.js @@ -0,0 +1,52 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const constants_1 = require("@nestjs/common/constants"); +const constants_2 = require("@nestjs/core/guards/constants"); +const index_1 = require("../index"); +class RpcContextCreator { + constructor(rpcProxy, exceptionFiltersContext, pipesCreator, pipesConsumer, guardsContextCreator, guardsConsumer, interceptorsContextCreator, interceptorsConsumer) { + this.rpcProxy = rpcProxy; + this.exceptionFiltersContext = exceptionFiltersContext; + this.pipesCreator = pipesCreator; + this.pipesConsumer = pipesConsumer; + this.guardsContextCreator = guardsContextCreator; + this.guardsConsumer = guardsConsumer; + this.interceptorsContextCreator = interceptorsContextCreator; + this.interceptorsConsumer = interceptorsConsumer; + } + create(instance, callback, module) { + const exceptionHandler = this.exceptionFiltersContext.create(instance, callback); + const pipes = this.pipesCreator.create(instance, callback); + const guards = this.guardsContextCreator.create(instance, callback, module); + const metatype = this.getDataMetatype(instance, callback); + const interceptors = this.interceptorsContextCreator.create(instance, callback, module); + return this.rpcProxy.create((...args) => __awaiter(this, void 0, void 0, function* () { + const [data, ...params] = args; + const canActivate = yield this.guardsConsumer.tryActivate(guards, args, instance, callback); + if (!canActivate) { + throw new index_1.RpcException(constants_2.FORBIDDEN_MESSAGE); + } + const handler = () => __awaiter(this, void 0, void 0, function* () { + const result = yield this.pipesConsumer.applyPipes(data, { metatype }, pipes); + return callback.call(instance, result, params); + }); + return yield this.interceptorsConsumer.intercept(interceptors, args, instance, callback, handler); + }), exceptionHandler); + } + reflectCallbackParamtypes(instance, callback) { + return Reflect.getMetadata(constants_1.PARAMTYPES_METADATA, instance, callback.name); + } + getDataMetatype(instance, callback) { + const paramtypes = this.reflectCallbackParamtypes(instance, callback); + return paramtypes && paramtypes.length ? paramtypes[0] : null; + } +} +exports.RpcContextCreator = RpcContextCreator; diff --git a/lib/microservices/context/rpc-proxy.d.ts b/lib/microservices/context/rpc-proxy.d.ts new file mode 100644 index 000000000..0db853d8f --- /dev/null +++ b/lib/microservices/context/rpc-proxy.d.ts @@ -0,0 +1,8 @@ +import { Observable } from 'rxjs/Observable'; +import { RpcExceptionsHandler } from '../exceptions/rpc-exceptions-handler'; +export declare class RpcProxy { + create( + targetCallback: (...args) => Promise>, + exceptionsHandler: RpcExceptionsHandler, + ): (...args) => Promise>; +} diff --git a/lib/microservices/context/rpc-proxy.js b/lib/microservices/context/rpc-proxy.js new file mode 100644 index 000000000..526beecf4 --- /dev/null +++ b/lib/microservices/context/rpc-proxy.js @@ -0,0 +1,25 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const execution_context_host_1 = require("@nestjs/core/helpers/execution-context.host"); +class RpcProxy { + create(targetCallback, exceptionsHandler) { + return (...args) => __awaiter(this, void 0, void 0, function* () { + const host = new execution_context_host_1.ExecutionContextHost(args); + try { + return yield targetCallback(...args); + } + catch (e) { + return exceptionsHandler.handle(e, host); + } + }); + } +} +exports.RpcProxy = RpcProxy; diff --git a/lib/microservices/enums/index.d.ts b/lib/microservices/enums/index.d.ts new file mode 100644 index 000000000..cce3c6aee --- /dev/null +++ b/lib/microservices/enums/index.d.ts @@ -0,0 +1 @@ +export * from './transport.enum'; diff --git a/lib/microservices/enums/index.js b/lib/microservices/enums/index.js new file mode 100644 index 000000000..f4f13b4cd --- /dev/null +++ b/lib/microservices/enums/index.js @@ -0,0 +1,6 @@ +"use strict"; +function __export(m) { + for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p]; +} +Object.defineProperty(exports, "__esModule", { value: true }); +__export(require("./transport.enum")); diff --git a/lib/microservices/enums/transport.enum.d.ts b/lib/microservices/enums/transport.enum.d.ts new file mode 100644 index 000000000..46494bc2c --- /dev/null +++ b/lib/microservices/enums/transport.enum.d.ts @@ -0,0 +1,7 @@ +export declare enum Transport { + TCP = 0, + REDIS = 1, + NATS = 2, + MQTT = 3, + GRPC = 4, +} diff --git a/lib/microservices/enums/transport.enum.js b/lib/microservices/enums/transport.enum.js new file mode 100644 index 000000000..56b548893 --- /dev/null +++ b/lib/microservices/enums/transport.enum.js @@ -0,0 +1,10 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var Transport; +(function (Transport) { + Transport[Transport["TCP"] = 0] = "TCP"; + Transport[Transport["REDIS"] = 1] = "REDIS"; + Transport[Transport["NATS"] = 2] = "NATS"; + Transport[Transport["MQTT"] = 3] = "MQTT"; + Transport[Transport["GRPC"] = 4] = "GRPC"; +})(Transport = exports.Transport || (exports.Transport = {})); diff --git a/lib/microservices/exceptions/index.d.ts b/lib/microservices/exceptions/index.d.ts new file mode 100644 index 000000000..b44d5af56 --- /dev/null +++ b/lib/microservices/exceptions/index.d.ts @@ -0,0 +1 @@ +export * from './rpc-exception'; diff --git a/lib/microservices/exceptions/index.js b/lib/microservices/exceptions/index.js new file mode 100644 index 000000000..a406b433c --- /dev/null +++ b/lib/microservices/exceptions/index.js @@ -0,0 +1,6 @@ +"use strict"; +function __export(m) { + for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p]; +} +Object.defineProperty(exports, "__esModule", { value: true }); +__export(require("./rpc-exception")); diff --git a/lib/microservices/exceptions/invalid-grpc-package.exception.d.ts b/lib/microservices/exceptions/invalid-grpc-package.exception.d.ts new file mode 100644 index 000000000..19b34aad4 --- /dev/null +++ b/lib/microservices/exceptions/invalid-grpc-package.exception.d.ts @@ -0,0 +1,4 @@ +import { RuntimeException } from '@nestjs/core/errors/exceptions/runtime.exception'; +export declare class InvalidGrpcPackageException extends RuntimeException { + constructor(); +} diff --git a/lib/microservices/exceptions/invalid-grpc-package.exception.js b/lib/microservices/exceptions/invalid-grpc-package.exception.js new file mode 100644 index 000000000..b75da3fd2 --- /dev/null +++ b/lib/microservices/exceptions/invalid-grpc-package.exception.js @@ -0,0 +1,9 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const runtime_exception_1 = require("@nestjs/core/errors/exceptions/runtime.exception"); +class InvalidGrpcPackageException extends runtime_exception_1.RuntimeException { + constructor() { + super('Invalid gRPC package (not found)'); + } +} +exports.InvalidGrpcPackageException = InvalidGrpcPackageException; diff --git a/lib/microservices/exceptions/invalid-grpc-service.exception.d.ts b/lib/microservices/exceptions/invalid-grpc-service.exception.d.ts new file mode 100644 index 000000000..460792ff7 --- /dev/null +++ b/lib/microservices/exceptions/invalid-grpc-service.exception.d.ts @@ -0,0 +1,4 @@ +import { RuntimeException } from '@nestjs/core/errors/exceptions/runtime.exception'; +export declare class InvalidGrpcServiceException extends RuntimeException { + constructor(); +} diff --git a/lib/microservices/exceptions/invalid-grpc-service.exception.js b/lib/microservices/exceptions/invalid-grpc-service.exception.js new file mode 100644 index 000000000..d85900a36 --- /dev/null +++ b/lib/microservices/exceptions/invalid-grpc-service.exception.js @@ -0,0 +1,9 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const runtime_exception_1 = require("@nestjs/core/errors/exceptions/runtime.exception"); +class InvalidGrpcServiceException extends runtime_exception_1.RuntimeException { + constructor() { + super(`Invalid gRPC service (not found)`); + } +} +exports.InvalidGrpcServiceException = InvalidGrpcServiceException; diff --git a/lib/microservices/exceptions/invalid-message.exception.d.ts b/lib/microservices/exceptions/invalid-message.exception.d.ts new file mode 100644 index 000000000..c139da9e6 --- /dev/null +++ b/lib/microservices/exceptions/invalid-message.exception.d.ts @@ -0,0 +1,4 @@ +import { RuntimeException } from '@nestjs/core/errors/exceptions/runtime.exception'; +export declare class InvalidMessageException extends RuntimeException { + constructor(); +} diff --git a/lib/microservices/exceptions/invalid-message.exception.js b/lib/microservices/exceptions/invalid-message.exception.js new file mode 100644 index 000000000..f0fae3053 --- /dev/null +++ b/lib/microservices/exceptions/invalid-message.exception.js @@ -0,0 +1,9 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const runtime_exception_1 = require("@nestjs/core/errors/exceptions/runtime.exception"); +class InvalidMessageException extends runtime_exception_1.RuntimeException { + constructor() { + super(`Invalid data or message pattern (undefined / null)`); + } +} +exports.InvalidMessageException = InvalidMessageException; diff --git a/lib/microservices/exceptions/invalid-proto-definition.exception.d.ts b/lib/microservices/exceptions/invalid-proto-definition.exception.d.ts new file mode 100644 index 000000000..26b565ece --- /dev/null +++ b/lib/microservices/exceptions/invalid-proto-definition.exception.d.ts @@ -0,0 +1,4 @@ +import { RuntimeException } from '@nestjs/core/errors/exceptions/runtime.exception'; +export declare class InvalidProtoDefinitionException extends RuntimeException { + constructor(); +} diff --git a/lib/microservices/exceptions/invalid-proto-definition.exception.js b/lib/microservices/exceptions/invalid-proto-definition.exception.js new file mode 100644 index 000000000..758bccf98 --- /dev/null +++ b/lib/microservices/exceptions/invalid-proto-definition.exception.js @@ -0,0 +1,9 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const runtime_exception_1 = require("@nestjs/core/errors/exceptions/runtime.exception"); +class InvalidProtoDefinitionException extends runtime_exception_1.RuntimeException { + constructor() { + super('Invalid .proto definition (file not found?)'); + } +} +exports.InvalidProtoDefinitionException = InvalidProtoDefinitionException; diff --git a/lib/microservices/exceptions/rpc-exception.d.ts b/lib/microservices/exceptions/rpc-exception.d.ts new file mode 100644 index 000000000..015ecafdc --- /dev/null +++ b/lib/microservices/exceptions/rpc-exception.d.ts @@ -0,0 +1,6 @@ +export declare class RpcException extends Error { + private readonly error; + readonly message: any; + constructor(error: string | object); + getError(): string | object; +} diff --git a/lib/microservices/exceptions/rpc-exception.js b/lib/microservices/exceptions/rpc-exception.js new file mode 100644 index 000000000..d05fd82a2 --- /dev/null +++ b/lib/microservices/exceptions/rpc-exception.js @@ -0,0 +1,13 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +class RpcException extends Error { + constructor(error) { + super(); + this.error = error; + this.message = error; + } + getError() { + return this.error; + } +} +exports.RpcException = RpcException; diff --git a/lib/microservices/exceptions/rpc-exceptions-handler.d.ts b/lib/microservices/exceptions/rpc-exceptions-handler.d.ts new file mode 100644 index 000000000..89a949e09 --- /dev/null +++ b/lib/microservices/exceptions/rpc-exceptions-handler.d.ts @@ -0,0 +1,17 @@ +import { Observable } from 'rxjs/Observable'; +import { RpcException } from './rpc-exception'; +import { RpcExceptionFilterMetadata } from '@nestjs/common/interfaces/exceptions'; +import { ArgumentsHost } from '@nestjs/common/interfaces/features/arguments-host.interface'; +export declare class RpcExceptionsHandler { + private static readonly logger; + private filters; + handle( + exception: Error | RpcException | any, + host: ArgumentsHost, + ): Observable; + setCustomFilters(filters: RpcExceptionFilterMetadata[]): void; + invokeCustomFilters( + exception: any, + host: ArgumentsHost, + ): Observable | null; +} diff --git a/lib/microservices/exceptions/rpc-exceptions-handler.js b/lib/microservices/exceptions/rpc-exceptions-handler.js new file mode 100644 index 000000000..0f44d63f9 --- /dev/null +++ b/lib/microservices/exceptions/rpc-exceptions-handler.js @@ -0,0 +1,51 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const common_1 = require("@nestjs/common"); +const shared_utils_1 = require("@nestjs/common/utils/shared.utils"); +const invalid_exception_filter_exception_1 = require("@nestjs/core/errors/exceptions/invalid-exception-filter.exception"); +const constants_1 = require("@nestjs/core/constants"); +const rpc_exception_1 = require("./rpc-exception"); +const throw_1 = require("rxjs/observable/throw"); +class RpcExceptionsHandler { + constructor() { + this.filters = []; + } + handle(exception, host) { + const filterResult$ = this.invokeCustomFilters(exception, host); + if (filterResult$) { + return filterResult$; + } + const status = 'error'; + if (!(exception instanceof rpc_exception_1.RpcException)) { + const message = constants_1.messages.UNKNOWN_EXCEPTION_MESSAGE; + const isError = shared_utils_1.isObject(exception) && exception.message; + const loggerArgs = isError + ? [exception.message, exception.stack] + : [exception]; + const logger = RpcExceptionsHandler.logger; + logger.error.apply(logger, loggerArgs); + return throw_1._throw({ status, message }); + } + const res = exception.getError(); + const message = shared_utils_1.isObject(res) ? res : { status, message: res }; + return throw_1._throw(message); + } + setCustomFilters(filters) { + if (!Array.isArray(filters)) { + throw new invalid_exception_filter_exception_1.InvalidExceptionFilterException(); + } + this.filters = filters; + } + invokeCustomFilters(exception, host) { + if (shared_utils_1.isEmpty(this.filters)) + return null; + const filter = this.filters.find(({ exceptionMetatypes, func }) => { + const hasMetatype = !exceptionMetatypes.length || + !!exceptionMetatypes.find(ExceptionMetatype => exception instanceof ExceptionMetatype); + return hasMetatype; + }); + return filter ? filter.func(exception, host) : null; + } +} +RpcExceptionsHandler.logger = new common_1.Logger(RpcExceptionsHandler.name); +exports.RpcExceptionsHandler = RpcExceptionsHandler; diff --git a/lib/microservices/index.d.ts b/lib/microservices/index.d.ts new file mode 100644 index 000000000..6f585b043 --- /dev/null +++ b/lib/microservices/index.d.ts @@ -0,0 +1,7 @@ +export * from './utils'; +export * from './interfaces'; +export * from './client'; +export * from './enums'; +export * from './server'; +export * from './exceptions'; +export * from './nest-microservice'; diff --git a/lib/microservices/index.js b/lib/microservices/index.js new file mode 100644 index 000000000..0d0e26545 --- /dev/null +++ b/lib/microservices/index.js @@ -0,0 +1,17 @@ +"use strict"; +/* + * Nest @microservices + * Copyright(c) 2017 - 2018 Kamil Mysliwiec + * https://nestjs.com + * MIT Licensed + */ +function __export(m) { + for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p]; +} +Object.defineProperty(exports, "__esModule", { value: true }); +__export(require("./utils")); +__export(require("./client")); +__export(require("./enums")); +__export(require("./server")); +__export(require("./exceptions")); +__export(require("./nest-microservice")); diff --git a/lib/microservices/interfaces/client-grpc.interface.d.ts b/lib/microservices/interfaces/client-grpc.interface.d.ts new file mode 100644 index 000000000..5d0600dcb --- /dev/null +++ b/lib/microservices/interfaces/client-grpc.interface.d.ts @@ -0,0 +1,3 @@ +export interface ClientGrpc { + getService(name: string): T; +} diff --git a/lib/microservices/interfaces/client-grpc.interface.js b/lib/microservices/interfaces/client-grpc.interface.js new file mode 100644 index 000000000..c8ad2e549 --- /dev/null +++ b/lib/microservices/interfaces/client-grpc.interface.js @@ -0,0 +1,2 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/lib/microservices/interfaces/client-metadata.interface.d.ts b/lib/microservices/interfaces/client-metadata.interface.d.ts new file mode 100644 index 000000000..78a84274d --- /dev/null +++ b/lib/microservices/interfaces/client-metadata.interface.d.ts @@ -0,0 +1,20 @@ +import { Transport } from './../enums/transport.enum'; +import { + RedisOptions, + NatsOptions, + MqttOptions, + GrpcOptions, +} from './microservice-configuration.interface'; +export declare type ClientOptions = + | RedisOptions + | NatsOptions + | MqttOptions + | GrpcOptions + | TcpClientOptions; +export interface TcpClientOptions { + transport: Transport.TCP; + options?: { + host?: string; + port?: number; + }; +} diff --git a/lib/microservices/interfaces/client-metadata.interface.js b/lib/microservices/interfaces/client-metadata.interface.js new file mode 100644 index 000000000..c8ad2e549 --- /dev/null +++ b/lib/microservices/interfaces/client-metadata.interface.js @@ -0,0 +1,2 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/lib/microservices/interfaces/closeable.interface.d.ts b/lib/microservices/interfaces/closeable.interface.d.ts new file mode 100644 index 000000000..a5cc2c694 --- /dev/null +++ b/lib/microservices/interfaces/closeable.interface.d.ts @@ -0,0 +1,3 @@ +export interface Closeable { + close(): void; +} diff --git a/lib/microservices/interfaces/closeable.interface.js b/lib/microservices/interfaces/closeable.interface.js new file mode 100644 index 000000000..c8ad2e549 --- /dev/null +++ b/lib/microservices/interfaces/closeable.interface.js @@ -0,0 +1,2 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/lib/microservices/interfaces/custom-transport-strategy.interface.d.ts b/lib/microservices/interfaces/custom-transport-strategy.interface.d.ts new file mode 100644 index 000000000..15072dab2 --- /dev/null +++ b/lib/microservices/interfaces/custom-transport-strategy.interface.d.ts @@ -0,0 +1,4 @@ +export interface CustomTransportStrategy { + listen(callback: () => void): any; + close(): any; +} diff --git a/lib/microservices/interfaces/custom-transport-strategy.interface.js b/lib/microservices/interfaces/custom-transport-strategy.interface.js new file mode 100644 index 000000000..c8ad2e549 --- /dev/null +++ b/lib/microservices/interfaces/custom-transport-strategy.interface.js @@ -0,0 +1,2 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/lib/microservices/interfaces/index.d.ts b/lib/microservices/interfaces/index.d.ts new file mode 100644 index 000000000..e87f99357 --- /dev/null +++ b/lib/microservices/interfaces/index.d.ts @@ -0,0 +1,8 @@ +export * from './client-metadata.interface'; +export * from './microservice-configuration.interface'; +export * from './pattern-metadata.interface'; +export * from './custom-transport-strategy.interface'; +export * from './message-handlers.interface'; +export * from './closeable.interface'; +export * from './packet.interface'; +export * from './client-grpc.interface'; diff --git a/lib/microservices/interfaces/index.js b/lib/microservices/interfaces/index.js new file mode 100644 index 000000000..c8ad2e549 --- /dev/null +++ b/lib/microservices/interfaces/index.js @@ -0,0 +1,2 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/lib/microservices/interfaces/message-handlers.interface.d.ts b/lib/microservices/interfaces/message-handlers.interface.d.ts new file mode 100644 index 000000000..60b434f4e --- /dev/null +++ b/lib/microservices/interfaces/message-handlers.interface.d.ts @@ -0,0 +1,4 @@ +import { Observable } from 'rxjs/Observable'; +export interface MessageHandlers { + [pattern: string]: (data) => Promise>; +} diff --git a/lib/microservices/interfaces/message-handlers.interface.js b/lib/microservices/interfaces/message-handlers.interface.js new file mode 100644 index 000000000..c8ad2e549 --- /dev/null +++ b/lib/microservices/interfaces/message-handlers.interface.js @@ -0,0 +1,2 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/lib/microservices/interfaces/microservice-configuration.interface.d.ts b/lib/microservices/interfaces/microservice-configuration.interface.d.ts new file mode 100644 index 000000000..a7b464e15 --- /dev/null +++ b/lib/microservices/interfaces/microservice-configuration.interface.d.ts @@ -0,0 +1,60 @@ +import { Transport } from '../enums/transport.enum'; +import { CustomTransportStrategy } from './custom-transport-strategy.interface'; +import { IClientOptions } from 'mqtt'; +import { ServerCredentials } from 'grpc'; +import { Server } from './../server/server'; +export declare type MicroserviceOptions = + | GrpcOptions + | TcpOptions + | RedisOptions + | NatsOptions + | MqttOptions + | CustomStrategy; +export interface CustomStrategy { + strategy: Server & CustomTransportStrategy; + options?: {}; +} +export interface GrpcOptions { + transport?: Transport.GRPC; + options: { + url?: string; + credentials?: ServerCredentials; + protoPath: string; + package: string; + }; +} +export interface TcpOptions { + transport?: Transport.TCP; + options?: { + host?: string; + port?: number; + retryAttempts?: number; + retryDelay?: number; + }; +} +export interface RedisOptions { + transport?: Transport.REDIS; + options?: { + url?: string; + retryAttempts?: number; + retryDelay?: number; + }; +} +export interface MqttOptions { + transport?: Transport.MQTT; + options?: IClientOptions & { + url?: string; + }; +} +export interface NatsOptions { + transport?: Transport.NATS; + options?: { + url?: string; + name?: string; + pass?: string; + maxReconnectAttempts?: number; + reconnectTimeWait?: number; + servers?: string[]; + tls?: any; + }; +} diff --git a/lib/microservices/interfaces/microservice-configuration.interface.js b/lib/microservices/interfaces/microservice-configuration.interface.js new file mode 100644 index 000000000..c8ad2e549 --- /dev/null +++ b/lib/microservices/interfaces/microservice-configuration.interface.js @@ -0,0 +1,2 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/lib/microservices/interfaces/packet.interface.d.ts b/lib/microservices/interfaces/packet.interface.d.ts new file mode 100644 index 000000000..7c9812e42 --- /dev/null +++ b/lib/microservices/interfaces/packet.interface.d.ts @@ -0,0 +1,12 @@ +export interface PacketId { + id: string; +} +export interface ReadPacket { + pattern: any; + data: T; +} +export interface WritePacket { + err?: any; + response?: T; + isDisposed?: boolean; +} diff --git a/lib/microservices/interfaces/packet.interface.js b/lib/microservices/interfaces/packet.interface.js new file mode 100644 index 000000000..c8ad2e549 --- /dev/null +++ b/lib/microservices/interfaces/packet.interface.js @@ -0,0 +1,2 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/lib/microservices/interfaces/pattern-metadata.interface.d.ts b/lib/microservices/interfaces/pattern-metadata.interface.d.ts new file mode 100644 index 000000000..7c4406345 --- /dev/null +++ b/lib/microservices/interfaces/pattern-metadata.interface.d.ts @@ -0,0 +1,3 @@ +export interface PatternMetadata { + [prop: string]: any; +} diff --git a/lib/microservices/interfaces/pattern-metadata.interface.js b/lib/microservices/interfaces/pattern-metadata.interface.js new file mode 100644 index 000000000..c8ad2e549 --- /dev/null +++ b/lib/microservices/interfaces/pattern-metadata.interface.js @@ -0,0 +1,2 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/lib/microservices/listener-metadata-explorer.d.ts b/lib/microservices/listener-metadata-explorer.d.ts new file mode 100644 index 000000000..df6cec740 --- /dev/null +++ b/lib/microservices/listener-metadata-explorer.d.ts @@ -0,0 +1,23 @@ +import { Controller } from '@nestjs/common/interfaces/controllers/controller.interface'; +import { PatternMetadata } from './interfaces/pattern-metadata.interface'; +import { ClientOptions } from './interfaces/client-metadata.interface'; +import { MetadataScanner } from '@nestjs/core/metadata-scanner'; +export declare class ListenerMetadataExplorer { + private readonly metadataScanner; + constructor(metadataScanner: MetadataScanner); + explore(instance: Controller): PatternProperties[]; + exploreMethodMetadata( + instance: any, + instancePrototype: any, + methodName: string, + ): PatternProperties; + scanForClientHooks(instance: Controller): IterableIterator; +} +export interface ClientProperties { + property: string; + metadata: ClientOptions; +} +export interface PatternProperties { + pattern: PatternMetadata; + targetCallback: (...args) => any; +} diff --git a/lib/microservices/listener-metadata-explorer.js b/lib/microservices/listener-metadata-explorer.js new file mode 100644 index 000000000..109cdda78 --- /dev/null +++ b/lib/microservices/listener-metadata-explorer.js @@ -0,0 +1,38 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const shared_utils_1 = require("@nestjs/common/utils/shared.utils"); +const constants_1 = require("./constants"); +class ListenerMetadataExplorer { + constructor(metadataScanner) { + this.metadataScanner = metadataScanner; + } + explore(instance) { + const instancePrototype = Object.getPrototypeOf(instance); + return this.metadataScanner.scanFromPrototype(instance, instancePrototype, method => this.exploreMethodMetadata(instance, instancePrototype, method)); + } + exploreMethodMetadata(instance, instancePrototype, methodName) { + const targetCallback = instancePrototype[methodName]; + const isPattern = Reflect.getMetadata(constants_1.PATTERN_HANDLER_METADATA, targetCallback); + if (shared_utils_1.isUndefined(isPattern)) { + return null; + } + const pattern = Reflect.getMetadata(constants_1.PATTERN_METADATA, targetCallback); + return { + targetCallback, + pattern, + }; + } + *scanForClientHooks(instance) { + for (const propertyKey in instance) { + if (shared_utils_1.isFunction(propertyKey)) + continue; + const property = String(propertyKey); + const isClient = Reflect.getMetadata(constants_1.CLIENT_METADATA, instance, property); + if (shared_utils_1.isUndefined(isClient)) + continue; + const metadata = Reflect.getMetadata(constants_1.CLIENT_CONFIGURATION_METADATA, instance, property); + yield { property, metadata }; + } + } +} +exports.ListenerMetadataExplorer = ListenerMetadataExplorer; diff --git a/lib/microservices/listeners-controller.d.ts b/lib/microservices/listeners-controller.d.ts new file mode 100644 index 000000000..245e2794d --- /dev/null +++ b/lib/microservices/listeners-controller.d.ts @@ -0,0 +1,21 @@ +import 'reflect-metadata'; +import { Controller } from '@nestjs/common/interfaces/controllers/controller.interface'; +import { Server } from './server/server'; +import { CustomTransportStrategy } from './interfaces'; +import { ClientsContainer } from './container'; +import { RpcContextCreator } from './context/rpc-context-creator'; +export declare class ListenersController { + private readonly clientsContainer; + private readonly contextCreator; + private readonly metadataExplorer; + constructor( + clientsContainer: ClientsContainer, + contextCreator: RpcContextCreator, + ); + bindPatternHandlers( + instance: Controller, + server: Server & CustomTransportStrategy, + module: string, + ): void; + bindClientsToProperties(instance: Controller): void; +} diff --git a/lib/microservices/listeners-controller.js b/lib/microservices/listeners-controller.js new file mode 100644 index 000000000..2e692c66a --- /dev/null +++ b/lib/microservices/listeners-controller.js @@ -0,0 +1,28 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +require("reflect-metadata"); +const listener_metadata_explorer_1 = require("./listener-metadata-explorer"); +const client_proxy_factory_1 = require("./client/client-proxy-factory"); +const metadata_scanner_1 = require("@nestjs/core/metadata-scanner"); +class ListenersController { + constructor(clientsContainer, contextCreator) { + this.clientsContainer = clientsContainer; + this.contextCreator = contextCreator; + this.metadataExplorer = new listener_metadata_explorer_1.ListenerMetadataExplorer(new metadata_scanner_1.MetadataScanner()); + } + bindPatternHandlers(instance, server, module) { + const patternHandlers = this.metadataExplorer.explore(instance); + patternHandlers.forEach(({ pattern, targetCallback }) => { + const proxy = this.contextCreator.create(instance, targetCallback, module); + server.add(pattern, proxy); + }); + } + bindClientsToProperties(instance) { + for (const { property, metadata, } of this.metadataExplorer.scanForClientHooks(instance)) { + const client = client_proxy_factory_1.ClientProxyFactory.create(metadata); + this.clientsContainer.addClient(client); + Reflect.set(instance, property, client); + } + } +} +exports.ListenersController = ListenersController; diff --git a/lib/microservices/microservices-module.d.ts b/lib/microservices/microservices-module.d.ts new file mode 100644 index 000000000..b14d438c4 --- /dev/null +++ b/lib/microservices/microservices-module.d.ts @@ -0,0 +1,21 @@ +import { InstanceWrapper } from '@nestjs/core/injector/container'; +import { Controller } from '@nestjs/common/interfaces/controllers/controller.interface'; +import { CustomTransportStrategy } from './interfaces'; +import { Server } from './server/server'; +export declare class MicroservicesModule { + private readonly clientsContainer; + private listenersController; + register(container: any, config: any): void; + setupListeners( + container: any, + server: Server & CustomTransportStrategy, + ): void; + setupClients(container: any): void; + bindListeners( + controllers: Map>, + server: Server & CustomTransportStrategy, + module: string, + ): void; + bindClients(controllers: Map>): void; + close(): void; +} diff --git a/lib/microservices/microservices-module.js b/lib/microservices/microservices-module.js new file mode 100644 index 000000000..b36e78a9d --- /dev/null +++ b/lib/microservices/microservices-module.js @@ -0,0 +1,57 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const listeners_controller_1 = require("./listeners-controller"); +const container_1 = require("./container"); +const rpc_context_creator_1 = require("./context/rpc-context-creator"); +const rpc_proxy_1 = require("./context/rpc-proxy"); +const exception_filters_context_1 = require("./context/exception-filters-context"); +const pipes_context_creator_1 = require("@nestjs/core/pipes/pipes-context-creator"); +const pipes_consumer_1 = require("@nestjs/core/pipes/pipes-consumer"); +const guards_context_creator_1 = require("@nestjs/core/guards/guards-context-creator"); +const runtime_exception_1 = require("@nestjs/core/errors/exceptions/runtime.exception"); +const guards_consumer_1 = require("@nestjs/core/guards/guards-consumer"); +const interceptors_context_creator_1 = require("@nestjs/core/interceptors/interceptors-context-creator"); +const interceptors_consumer_1 = require("@nestjs/core/interceptors/interceptors-consumer"); +class MicroservicesModule { + constructor() { + this.clientsContainer = new container_1.ClientsContainer(); + } + register(container, config) { + const contextCreator = new rpc_context_creator_1.RpcContextCreator(new rpc_proxy_1.RpcProxy(), new exception_filters_context_1.ExceptionFiltersContext(config), new pipes_context_creator_1.PipesContextCreator(config), new pipes_consumer_1.PipesConsumer(), new guards_context_creator_1.GuardsContextCreator(container, config), new guards_consumer_1.GuardsConsumer(), new interceptors_context_creator_1.InterceptorsContextCreator(container, config), new interceptors_consumer_1.InterceptorsConsumer()); + this.listenersController = new listeners_controller_1.ListenersController(this.clientsContainer, contextCreator); + } + setupListeners(container, server) { + if (!this.listenersController) { + throw new runtime_exception_1.RuntimeException(); + } + const modules = container.getModules(); + modules.forEach(({ routes }, module) => this.bindListeners(routes, server, module)); + } + setupClients(container) { + if (!this.listenersController) { + throw new runtime_exception_1.RuntimeException(); + } + const modules = container.getModules(); + modules.forEach(({ routes, components }) => { + this.bindClients(routes); + this.bindClients(components); + }); + } + bindListeners(controllers, server, module) { + controllers.forEach(({ instance }) => { + this.listenersController.bindPatternHandlers(instance, server, module); + }); + } + bindClients(controllers) { + controllers.forEach(({ instance, isNotMetatype }) => { + !isNotMetatype && + this.listenersController.bindClientsToProperties(instance); + }); + } + close() { + const clients = this.clientsContainer.getAllClients(); + clients.forEach(client => client.close()); + this.clientsContainer.clear(); + } +} +exports.MicroservicesModule = MicroservicesModule; diff --git a/lib/microservices/nest-microservice.d.ts b/lib/microservices/nest-microservice.d.ts new file mode 100644 index 000000000..bc1f33798 --- /dev/null +++ b/lib/microservices/nest-microservice.d.ts @@ -0,0 +1,51 @@ +import { NestContainer } from '@nestjs/core/injector/container'; +import { MicroserviceOptions } from './interfaces/microservice-configuration.interface'; +import { + INestMicroservice, + WebSocketAdapter, + CanActivate, + PipeTransform, + NestInterceptor, + ExceptionFilter, +} from '@nestjs/common'; +import { ApplicationConfig } from '@nestjs/core/application-config'; +import { NestApplicationContext } from '@nestjs/core/nest-application-context'; +export declare class NestMicroservice extends NestApplicationContext + implements INestMicroservice { + private readonly applicationConfig; + private readonly logger; + private readonly microservicesModule; + private readonly socketModule; + private microserviceConfig; + private server; + private isTerminated; + private isInitialized; + private isInitHookCalled; + constructor( + container: NestContainer, + config: MicroserviceOptions, + applicationConfig: ApplicationConfig, + ); + registerWsAdapter(): void; + createServer(config: MicroserviceOptions): void; + registerModules(): void; + registerListeners(): void; + useWebSocketAdapter(adapter: WebSocketAdapter): this; + useGlobalFilters(...filters: ExceptionFilter[]): this; + useGlobalPipes(...pipes: PipeTransform[]): this; + useGlobalInterceptors(...interceptors: NestInterceptor[]): this; + useGlobalGuards(...guards: CanActivate[]): this; + listen(callback: () => void): void; + listenAsync(): Promise; + close(): void; + setIsInitialized(isInitialized: boolean): void; + setIsTerminated(isTerminaed: boolean): void; + setIsInitHookCalled(isInitHookCalled: boolean): void; + private closeApplication(); + private callInitHook(); + private callModuleInitHook(module); + private hasOnModuleInitHook(instance); + private callDestroyHook(); + private callModuleDestroyHook(module); + private hasOnModuleDestroyHook(instance); +} diff --git a/lib/microservices/nest-microservice.js b/lib/microservices/nest-microservice.js new file mode 100644 index 000000000..de82ac691 --- /dev/null +++ b/lib/microservices/nest-microservice.js @@ -0,0 +1,149 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const optional = require("optional"); +const iterare_1 = require("iterare"); +const microservices_module_1 = require("./microservices-module"); +const constants_1 = require("@nestjs/core/constants"); +const logger_service_1 = require("@nestjs/common/services/logger.service"); +const server_factory_1 = require("./server/server-factory"); +const transport_enum_1 = require("./enums/transport.enum"); +const shared_utils_1 = require("@nestjs/common/utils/shared.utils"); +const nest_application_context_1 = require("@nestjs/core/nest-application-context"); +const { SocketModule } = optional('@nestjs/websockets/socket-module') || {}; +const { IoAdapter } = optional('@nestjs/websockets/adapters/io-adapter') || {}; +class NestMicroservice extends nest_application_context_1.NestApplicationContext { + constructor(container, config = {}, applicationConfig) { + super(container, [], null); + this.applicationConfig = applicationConfig; + this.logger = new logger_service_1.Logger(NestMicroservice.name, true); + this.microservicesModule = new microservices_module_1.MicroservicesModule(); + this.socketModule = SocketModule ? new SocketModule() : null; + this.isTerminated = false; + this.isInitialized = false; + this.isInitHookCalled = false; + this.registerWsAdapter(); + this.microservicesModule.register(container, this.applicationConfig); + this.createServer(config); + this.selectContextModule(); + } + registerWsAdapter() { + const ioAdapter = IoAdapter ? new IoAdapter() : null; + this.applicationConfig.setIoAdapter(ioAdapter); + } + createServer(config) { + try { + this.microserviceConfig = Object.assign({ transport: transport_enum_1.Transport.TCP }, config); + const { strategy } = config; + this.server = strategy + ? strategy + : server_factory_1.ServerFactory.create(this.microserviceConfig); + } + catch (e) { + this.logger.error(e); + throw e; + } + } + registerModules() { + this.socketModule && + this.socketModule.register(this.container, this.applicationConfig); + this.microservicesModule.setupClients(this.container); + this.registerListeners(); + this.setIsInitialized(true); + !this.isInitHookCalled && this.callInitHook(); + } + registerListeners() { + this.microservicesModule.setupListeners(this.container, this.server); + } + useWebSocketAdapter(adapter) { + this.applicationConfig.setIoAdapter(adapter); + return this; + } + useGlobalFilters(...filters) { + this.applicationConfig.useGlobalFilters(...filters); + return this; + } + useGlobalPipes(...pipes) { + this.applicationConfig.useGlobalPipes(...pipes); + return this; + } + useGlobalInterceptors(...interceptors) { + this.applicationConfig.useGlobalInterceptors(...interceptors); + return this; + } + useGlobalGuards(...guards) { + this.applicationConfig.useGlobalGuards(...guards); + return this; + } + listen(callback) { + !this.isInitialized && this.registerModules(); + this.logger.log(constants_1.messages.MICROSERVICE_READY); + this.server.listen(callback); + } + listenAsync() { + return __awaiter(this, void 0, void 0, function* () { + return yield new Promise(resolve => this.listen(resolve)); + }); + } + close() { + this.server.close(); + !this.isTerminated && this.closeApplication(); + } + setIsInitialized(isInitialized) { + this.isInitialized = isInitialized; + } + setIsTerminated(isTerminaed) { + this.isTerminated = isTerminaed; + } + setIsInitHookCalled(isInitHookCalled) { + this.isInitHookCalled = isInitHookCalled; + } + closeApplication() { + this.socketModule && this.socketModule.close(); + this.callDestroyHook(); + this.setIsTerminated(true); + } + callInitHook() { + const modules = this.container.getModules(); + modules.forEach(module => { + this.callModuleInitHook(module); + }); + this.setIsInitHookCalled(true); + } + callModuleInitHook(module) { + const components = [...module.routes, ...module.components]; + iterare_1.default(components) + .map(([key, { instance }]) => instance) + .filter(instance => !shared_utils_1.isNil(instance)) + .filter(this.hasOnModuleInitHook) + .forEach(instance => instance.onModuleInit()); + } + hasOnModuleInitHook(instance) { + return !shared_utils_1.isUndefined(instance.onModuleInit); + } + callDestroyHook() { + const modules = this.container.getModules(); + modules.forEach(module => { + this.callModuleDestroyHook(module); + }); + } + callModuleDestroyHook(module) { + const components = [...module.routes, ...module.components]; + iterare_1.default(components) + .map(([key, { instance }]) => instance) + .filter(instance => !shared_utils_1.isNil(instance)) + .filter(this.hasOnModuleDestroyHook) + .forEach(instance => instance.onModuleDestroy()); + } + hasOnModuleDestroyHook(instance) { + return !shared_utils_1.isUndefined(instance.onModuleDestroy); + } +} +exports.NestMicroservice = NestMicroservice; diff --git a/lib/microservices/server/index.d.ts b/lib/microservices/server/index.d.ts new file mode 100644 index 000000000..0ce5251aa --- /dev/null +++ b/lib/microservices/server/index.d.ts @@ -0,0 +1 @@ +export * from './server'; diff --git a/lib/microservices/server/index.js b/lib/microservices/server/index.js new file mode 100644 index 000000000..d380db1dd --- /dev/null +++ b/lib/microservices/server/index.js @@ -0,0 +1,6 @@ +"use strict"; +function __export(m) { + for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p]; +} +Object.defineProperty(exports, "__esModule", { value: true }); +__export(require("./server")); diff --git a/lib/microservices/server/server-factory.d.ts b/lib/microservices/server/server-factory.d.ts new file mode 100644 index 000000000..6d6f57280 --- /dev/null +++ b/lib/microservices/server/server-factory.d.ts @@ -0,0 +1,5 @@ +import { MicroserviceOptions, CustomTransportStrategy } from '../interfaces'; +import { Server } from './server'; +export declare class ServerFactory { + static create(options: MicroserviceOptions): Server & CustomTransportStrategy; +} diff --git a/lib/microservices/server/server-factory.js b/lib/microservices/server/server-factory.js new file mode 100644 index 000000000..8e9ef4f3c --- /dev/null +++ b/lib/microservices/server/server-factory.js @@ -0,0 +1,26 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const server_tcp_1 = require("./server-tcp"); +const server_redis_1 = require("./server-redis"); +const transport_enum_1 = require("../enums/transport.enum"); +const server_nats_1 = require("./server-nats"); +const server_mqtt_1 = require("./server-mqtt"); +const server_grpc_1 = require("./server-grpc"); +class ServerFactory { + static create(options) { + const { transport } = options; + switch (transport) { + case transport_enum_1.Transport.REDIS: + return new server_redis_1.ServerRedis(options); + case transport_enum_1.Transport.NATS: + return new server_nats_1.ServerNats(options); + case transport_enum_1.Transport.MQTT: + return new server_mqtt_1.ServerMqtt(options); + case transport_enum_1.Transport.GRPC: + return new server_grpc_1.ServerGrpc(options); + default: + return new server_tcp_1.ServerTCP(options); + } + } +} +exports.ServerFactory = ServerFactory; diff --git a/lib/microservices/server/server-grpc.d.ts b/lib/microservices/server/server-grpc.d.ts new file mode 100644 index 000000000..d897a3c7a --- /dev/null +++ b/lib/microservices/server/server-grpc.d.ts @@ -0,0 +1,28 @@ +import { GrpcObject } from 'grpc'; +import { Server } from './server'; +import { MicroserviceOptions } from '../interfaces/microservice-configuration.interface'; +import { CustomTransportStrategy } from './../interfaces'; +export declare class ServerGrpc extends Server + implements CustomTransportStrategy { + private readonly options; + private readonly url; + private grpcClient; + constructor(options: MicroserviceOptions); + listen(callback: () => void): Promise; + start(callback?: () => void): Promise; + bindEvents(): Promise; + getServiceNames(grpcPackage: any): string[]; + createService(grpcService: any, name: string): Promise<{}>; + createPattern(service: string, methodName: string): string; + createServiceMethod( + methodHandler: Function, + protoNativeHandler: any, + ): Function; + createUnaryServiceMethod(methodHandler: any): Function; + createStreamServiceMethod(methodHandler: any): Function; + close(): void; + deserialize(obj: any): any; + createClient(): any; + lookupPackage(root: any, packageName: string): any; + loadProto(): GrpcObject; +} diff --git a/lib/microservices/server/server-grpc.js b/lib/microservices/server/server-grpc.js new file mode 100644 index 000000000..12592a198 --- /dev/null +++ b/lib/microservices/server/server-grpc.js @@ -0,0 +1,127 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const server_1 = require("./server"); +const constants_1 = require("./../constants"); +const invalid_grpc_package_exception_1 = require("../exceptions/invalid-grpc-package.exception"); +const invalid_proto_definition_exception_1 = require("../exceptions/invalid-proto-definition.exception"); +let grpcPackage = {}; +class ServerGrpc extends server_1.Server { + constructor(options) { + super(); + this.options = options; + this.url = + this.getOptionsProp(options, 'url') || constants_1.GRPC_DEFAULT_URL; + grpcPackage = this.loadPackage('grpc', ServerGrpc.name); + } + listen(callback) { + return __awaiter(this, void 0, void 0, function* () { + this.grpcClient = this.createClient(); + yield this.start(callback); + }); + } + start(callback) { + return __awaiter(this, void 0, void 0, function* () { + yield this.bindEvents(); + this.grpcClient.start(); + callback(); + }); + } + bindEvents() { + return __awaiter(this, void 0, void 0, function* () { + const grpcContext = this.loadProto(); + const packageName = this.getOptionsProp(this.options, 'package'); + const grpcPkg = this.lookupPackage(grpcContext, packageName); + if (!grpcPkg) { + throw new invalid_grpc_package_exception_1.InvalidGrpcPackageException(); + } + for (const name of this.getServiceNames(grpcPkg)) { + this.grpcClient.addService(grpcPkg[name].service, yield this.createService(grpcPkg[name], name)); + } + }); + } + getServiceNames(grpcPackage) { + return Object.keys(grpcPackage).filter(name => grpcPackage[name].service); + } + createService(grpcService, name) { + return __awaiter(this, void 0, void 0, function* () { + const service = {}; + for (const methodName in grpcService.prototype) { + const methodHandler = this.messageHandlers[this.createPattern(name, methodName)]; + if (!methodHandler) { + continue; + } + service[methodName] = yield this.createServiceMethod(methodHandler, grpcService.prototype[methodName]); + } + return service; + }); + } + createPattern(service, methodName) { + return JSON.stringify({ + service, + rpc: methodName, + }); + } + createServiceMethod(methodHandler, protoNativeHandler) { + return protoNativeHandler.responseStream + ? this.createStreamServiceMethod(methodHandler) + : this.createUnaryServiceMethod(methodHandler); + } + createUnaryServiceMethod(methodHandler) { + return (call, callback) => __awaiter(this, void 0, void 0, function* () { + const handler = methodHandler(call.request); + this.transformToObservable(yield handler).subscribe(data => callback(null, data), err => callback(err)); + }); + } + createStreamServiceMethod(methodHandler) { + return (call, callback) => __awaiter(this, void 0, void 0, function* () { + const handler = methodHandler(call.request); + const result$ = this.transformToObservable(yield handler); + yield result$.forEach(data => call.write(data)); + call.end(); + }); + } + close() { + this.grpcClient && this.grpcClient.forceShutdown(); + this.grpcClient = null; + } + deserialize(obj) { + try { + return JSON.parse(obj); + } + catch (e) { + return obj; + } + } + createClient() { + const server = new grpcPackage.Server(); + const credentials = this.getOptionsProp(this.options, 'credentials'); + server.bind(this.url, credentials || grpcPackage.ServerCredentials.createInsecure()); + return server; + } + lookupPackage(root, packageName) { + /** Reference: https://github.com/kondi/rxjs-grpc */ + let pkg = root; + for (const name of packageName.split(/\./)) { + pkg = pkg[name]; + } + return pkg; + } + loadProto() { + try { + const context = grpcPackage.load(this.getOptionsProp(this.options, 'protoPath')); + return context; + } + catch (e) { + throw new invalid_proto_definition_exception_1.InvalidProtoDefinitionException(); + } + } +} +exports.ServerGrpc = ServerGrpc; diff --git a/lib/microservices/server/server-mqtt.d.ts b/lib/microservices/server/server-mqtt.d.ts new file mode 100644 index 000000000..43f4961c4 --- /dev/null +++ b/lib/microservices/server/server-mqtt.d.ts @@ -0,0 +1,25 @@ +/// +import { MqttClient } from 'mqtt'; +import { Server } from './server'; +import { MicroserviceOptions } from '../interfaces/microservice-configuration.interface'; +import { CustomTransportStrategy, PacketId } from './../interfaces'; +import { ReadPacket } from '@nestjs/microservices'; +export declare class ServerMqtt extends Server + implements CustomTransportStrategy { + private readonly options; + private readonly url; + private mqttClient; + constructor(options: MicroserviceOptions); + listen(callback: () => void): Promise; + start(callback?: () => void): void; + bindEvents(mqttClient: MqttClient): void; + close(): void; + createMqttClient(): MqttClient; + getMessageHandler(pub: MqttClient): any; + handleMessage(channel: string, buffer: Buffer, pub: MqttClient): Promise; + getPublisher(client: MqttClient, pattern: any, id: string): any; + deserialize(content: any): ReadPacket & PacketId; + getAckQueueName(pattern: string): string; + getResQueueName(pattern: string): string; + handleError(stream: any): void; +} diff --git a/lib/microservices/server/server-mqtt.js b/lib/microservices/server/server-mqtt.js new file mode 100644 index 000000000..2327335f1 --- /dev/null +++ b/lib/microservices/server/server-mqtt.js @@ -0,0 +1,83 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const server_1 = require("./server"); +const constants_1 = require("../constants"); +const constants_2 = require("./../constants"); +let mqttPackage = {}; +class ServerMqtt extends server_1.Server { + constructor(options) { + super(); + this.options = options; + this.url = + this.getOptionsProp(options, 'url') || constants_2.MQTT_DEFAULT_URL; + mqttPackage = this.loadPackage('mqtt', ServerMqtt.name); + } + listen(callback) { + return __awaiter(this, void 0, void 0, function* () { + this.mqttClient = this.createMqttClient(); + this.start(callback); + }); + } + start(callback) { + this.handleError(this.mqttClient); + this.bindEvents(this.mqttClient); + this.mqttClient.on(constants_2.CONNECT_EVENT, callback); + } + bindEvents(mqttClient) { + mqttClient.on(constants_2.MESSAGE_EVENT, this.getMessageHandler(mqttClient).bind(this)); + const registeredPatterns = Object.keys(this.messageHandlers); + registeredPatterns.forEach(pattern => mqttClient.subscribe(this.getAckQueueName(pattern))); + } + close() { + this.mqttClient && this.mqttClient.end(); + } + createMqttClient() { + return mqttPackage.connect(this.url, this.options.options); + } + getMessageHandler(pub) { + return (channel, buffer) => __awaiter(this, void 0, void 0, function* () { return yield this.handleMessage(channel, buffer, pub); }); + } + handleMessage(channel, buffer, pub) { + return __awaiter(this, void 0, void 0, function* () { + const packet = this.deserialize(buffer.toString()); + const pattern = channel.replace(/_ack$/, ''); + const publish = this.getPublisher(pub, pattern, packet.id); + const status = 'error'; + if (!this.messageHandlers[pattern]) { + return publish({ id: packet.id, status, err: constants_1.NO_PATTERN_MESSAGE }); + } + const handler = this.messageHandlers[pattern]; + const response$ = this.transformToObservable(yield handler(packet.data)); + response$ && this.send(response$, publish); + }); + } + getPublisher(client, pattern, id) { + return response => client.publish(this.getResQueueName(pattern), JSON.stringify(Object.assign(response, { id }))); + } + deserialize(content) { + try { + return JSON.parse(content); + } + catch (e) { + return content; + } + } + getAckQueueName(pattern) { + return `${pattern}_ack`; + } + getResQueueName(pattern) { + return `${pattern}_res`; + } + handleError(stream) { + stream.on(constants_2.ERROR_EVENT, err => this.logger.error(err)); + } +} +exports.ServerMqtt = ServerMqtt; diff --git a/lib/microservices/server/server-nats.d.ts b/lib/microservices/server/server-nats.d.ts new file mode 100644 index 000000000..fe3c0c09f --- /dev/null +++ b/lib/microservices/server/server-nats.d.ts @@ -0,0 +1,34 @@ +import { Client } from 'nats'; +import { Server } from './server'; +import { MicroserviceOptions } from '../interfaces/microservice-configuration.interface'; +import { CustomTransportStrategy, PacketId } from './../interfaces'; +import { ReadPacket } from './../interfaces/packet.interface'; +export declare class ServerNats extends Server + implements CustomTransportStrategy { + private readonly options; + private readonly url; + private natsClient; + constructor(options: MicroserviceOptions); + listen(callback: () => void): void; + start(callback?: () => void): void; + bindEvents(client: Client): void; + close(): void; + createNatsClient(): Client; + getMessageHandler( + channel: string, + client: Client, + ): (buffer: any) => Promise; + handleMessage( + channel: string, + message: ReadPacket & PacketId, + client: Client, + ): Promise; + getPublisher( + publisher: Client, + pattern: any, + id: string, + ): (response: any) => void; + getAckQueueName(pattern: string): string; + getResQueueName(pattern: string): string; + handleError(stream: any): void; +} diff --git a/lib/microservices/server/server-nats.js b/lib/microservices/server/server-nats.js new file mode 100644 index 000000000..25eab8c28 --- /dev/null +++ b/lib/microservices/server/server-nats.js @@ -0,0 +1,78 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const server_1 = require("./server"); +const constants_1 = require("../constants"); +const constants_2 = require("./../constants"); +let natsPackage = {}; +class ServerNats extends server_1.Server { + constructor(options) { + super(); + this.options = options; + this.url = + this.getOptionsProp(this.options, 'url') || constants_2.NATS_DEFAULT_URL; + natsPackage = this.loadPackage('nats', ServerNats.name); + } + listen(callback) { + this.natsClient = this.createNatsClient(); + this.handleError(this.natsClient); + this.start(callback); + } + start(callback) { + this.bindEvents(this.natsClient); + this.natsClient.on(constants_2.CONNECT_EVENT, callback); + } + bindEvents(client) { + const registeredPatterns = Object.keys(this.messageHandlers); + registeredPatterns.forEach(pattern => { + const channel = this.getAckQueueName(pattern); + client.subscribe(channel, this.getMessageHandler(channel, client).bind(this)); + }); + } + close() { + this.natsClient && this.natsClient.close(); + this.natsClient = null; + } + createNatsClient() { + const options = this.options.options || {}; + return natsPackage.connect(Object.assign({}, options, { url: this.url, json: true })); + } + getMessageHandler(channel, client) { + return (buffer) => __awaiter(this, void 0, void 0, function* () { return yield this.handleMessage(channel, buffer, client); }); + } + handleMessage(channel, message, client) { + return __awaiter(this, void 0, void 0, function* () { + const pattern = channel.replace(/_ack$/, ''); + const publish = this.getPublisher(client, pattern, message.id); + const status = 'error'; + if (!this.messageHandlers[pattern]) { + return publish({ id: message.id, status, err: constants_1.NO_PATTERN_MESSAGE }); + } + const handler = this.messageHandlers[pattern]; + const response$ = this.transformToObservable(yield handler(message.data)); + response$ && this.send(response$, publish); + }); + } + getPublisher(publisher, pattern, id) { + return response => publisher.publish(this.getResQueueName(pattern), Object.assign(response, { + id, + })); + } + getAckQueueName(pattern) { + return `${pattern}_ack`; + } + getResQueueName(pattern) { + return `${pattern}_res`; + } + handleError(stream) { + stream.on(constants_2.ERROR_EVENT, err => this.logger.error(err)); + } +} +exports.ServerNats = ServerNats; diff --git a/lib/microservices/server/server-redis.d.ts b/lib/microservices/server/server-redis.d.ts new file mode 100644 index 000000000..0afacf749 --- /dev/null +++ b/lib/microservices/server/server-redis.d.ts @@ -0,0 +1,38 @@ +import { RedisClient, ClientOpts, RetryStrategyOptions } from 'redis'; +import { Server } from './server'; +import { MicroserviceOptions } from '../interfaces/microservice-configuration.interface'; +import { CustomTransportStrategy, PacketId } from './../interfaces'; +import { ReadPacket } from '@nestjs/microservices'; +export declare class ServerRedis extends Server + implements CustomTransportStrategy { + private readonly options; + private readonly url; + private subClient; + private pubClient; + private isExplicitlyTerminated; + constructor(options: MicroserviceOptions); + listen(callback: () => void): void; + start(callback?: () => void): void; + bindEvents(subClient: RedisClient, pubClient: RedisClient): void; + close(): void; + createRedisClient(): RedisClient; + getMessageHandler( + pub: RedisClient, + ): (channel: any, buffer: any) => Promise; + handleMessage( + channel: any, + buffer: string | any, + pub: RedisClient, + ): Promise; + getPublisher( + pub: RedisClient, + pattern: any, + id: string, + ): (response: any) => boolean; + deserialize(content: any): ReadPacket & PacketId; + getAckQueueName(pattern: string): string; + getResQueueName(pattern: string): string; + handleError(stream: any): void; + getClientOptions(): Partial; + createRetryStrategy(options: RetryStrategyOptions): undefined | number; +} diff --git a/lib/microservices/server/server-redis.js b/lib/microservices/server/server-redis.js new file mode 100644 index 000000000..0fdf35042 --- /dev/null +++ b/lib/microservices/server/server-redis.js @@ -0,0 +1,102 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const server_1 = require("./server"); +const constants_1 = require("../constants"); +const constants_2 = require("./../constants"); +let redisPackage = {}; +class ServerRedis extends server_1.Server { + constructor(options) { + super(); + this.options = options; + this.isExplicitlyTerminated = false; + this.url = + this.getOptionsProp(this.options, 'url') || + constants_2.REDIS_DEFAULT_URL; + redisPackage = this.loadPackage('redis', ServerRedis.name); + } + listen(callback) { + this.subClient = this.createRedisClient(); + this.pubClient = this.createRedisClient(); + this.handleError(this.pubClient); + this.handleError(this.subClient); + this.start(callback); + } + start(callback) { + this.bindEvents(this.subClient, this.pubClient); + this.subClient.on(constants_2.CONNECT_EVENT, callback); + } + bindEvents(subClient, pubClient) { + subClient.on(constants_2.MESSAGE_EVENT, this.getMessageHandler(pubClient).bind(this)); + const subscribePatterns = Object.keys(this.messageHandlers); + subscribePatterns.forEach(pattern => subClient.subscribe(this.getAckQueueName(pattern))); + } + close() { + this.isExplicitlyTerminated = true; + this.pubClient && this.pubClient.quit(); + this.subClient && this.subClient.quit(); + } + createRedisClient() { + return redisPackage.createClient(Object.assign({}, this.getClientOptions(), { url: this.url })); + } + getMessageHandler(pub) { + return (channel, buffer) => __awaiter(this, void 0, void 0, function* () { return yield this.handleMessage(channel, buffer, pub); }); + } + handleMessage(channel, buffer, pub) { + return __awaiter(this, void 0, void 0, function* () { + const packet = this.deserialize(buffer); + const pattern = channel.replace(/_ack$/, ''); + const publish = this.getPublisher(pub, pattern, packet.id); + const status = 'error'; + if (!this.messageHandlers[pattern]) { + return publish({ id: packet.id, status, err: constants_1.NO_PATTERN_MESSAGE }); + } + const handler = this.messageHandlers[pattern]; + const response$ = this.transformToObservable(yield handler(packet.data)); + response$ && this.send(response$, publish); + }); + } + getPublisher(pub, pattern, id) { + return response => pub.publish(this.getResQueueName(pattern), JSON.stringify(Object.assign(response, { id }))); + } + deserialize(content) { + try { + return JSON.parse(content); + } + catch (e) { + return content; + } + } + getAckQueueName(pattern) { + return `${pattern}_ack`; + } + getResQueueName(pattern) { + return `${pattern}_res`; + } + handleError(stream) { + stream.on(constants_2.ERROR_EVENT, err => this.logger.error(err)); + } + getClientOptions() { + const retry_strategy = options => this.createRetryStrategy(options); + return { + retry_strategy, + }; + } + createRetryStrategy(options) { + if (this.isExplicitlyTerminated || + !this.getOptionsProp(this.options, 'retryAttempts') || + options.attempt > + this.getOptionsProp(this.options, 'retryAttempts')) { + return undefined; + } + return this.getOptionsProp(this.options, 'retryDelay') || 0; + } +} +exports.ServerRedis = ServerRedis; diff --git a/lib/microservices/server/server-tcp.d.ts b/lib/microservices/server/server-tcp.d.ts new file mode 100644 index 000000000..b9b51144e --- /dev/null +++ b/lib/microservices/server/server-tcp.d.ts @@ -0,0 +1,21 @@ +/// +import { Server } from './server'; +import { CustomTransportStrategy, ReadPacket } from './../interfaces'; +import { MicroserviceOptions } from '../interfaces/microservice-configuration.interface'; +import { PacketId } from './../interfaces'; +export declare class ServerTCP extends Server + implements CustomTransportStrategy { + private readonly options; + private readonly port; + private server; + private isExplicitlyTerminated; + private retryAttemptsCount; + constructor(options: MicroserviceOptions); + listen(callback: () => void): void; + close(): void; + bindHandler(socket: any): void; + handleMessage(socket: any, packet: ReadPacket & PacketId): Promise; + handleClose(): undefined | number | NodeJS.Timer; + private init(); + private getSocketInstance(socket); +} diff --git a/lib/microservices/server/server-tcp.js b/lib/microservices/server/server-tcp.js new file mode 100644 index 000000000..14f229207 --- /dev/null +++ b/lib/microservices/server/server-tcp.js @@ -0,0 +1,74 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const net = require("net"); +const JsonSocket = require("json-socket"); +const constants_1 = require("../constants"); +const server_1 = require("./server"); +const constants_2 = require("./../constants"); +class ServerTCP extends server_1.Server { + constructor(options) { + super(); + this.options = options; + this.isExplicitlyTerminated = false; + this.retryAttemptsCount = 0; + this.port = + this.getOptionsProp(options, 'port') || + constants_2.TCP_DEFAULT_PORT; + this.init(); + } + listen(callback) { + this.server.listen(this.port, callback); + } + close() { + this.isExplicitlyTerminated = true; + this.server.close(); + } + bindHandler(socket) { + const readSocket = this.getSocketInstance(socket); + readSocket.on(constants_2.MESSAGE_EVENT, (msg) => __awaiter(this, void 0, void 0, function* () { return yield this.handleMessage(readSocket, msg); })); + } + handleMessage(socket, packet) { + return __awaiter(this, void 0, void 0, function* () { + const pattern = JSON.stringify(packet.pattern); + const status = 'error'; + if (!this.messageHandlers[pattern]) { + return socket.sendMessage({ + id: packet.id, + status, + err: constants_1.NO_PATTERN_MESSAGE, + }); + } + const handler = this.messageHandlers[pattern]; + const response$ = this.transformToObservable(yield handler(packet.data)); + response$ && + this.send(response$, data => socket.sendMessage(Object.assign(data, { id: packet.id }))); + }); + } + handleClose() { + if (this.isExplicitlyTerminated || + !this.getOptionsProp(this.options, 'retryAttempts') || + this.retryAttemptsCount >= + this.getOptionsProp(this.options, 'retryAttempts')) { + return undefined; + } + ++this.retryAttemptsCount; + return setTimeout(() => this.server.listen(this.port), this.getOptionsProp(this.options, 'retryDelay') || 0); + } + init() { + this.server = net.createServer(this.bindHandler.bind(this)); + this.server.on(constants_2.ERROR_EVENT, this.handleError.bind(this)); + this.server.on(constants_1.CLOSE_EVENT, this.handleClose.bind(this)); + } + getSocketInstance(socket) { + return new JsonSocket(socket); + } +} +exports.ServerTCP = ServerTCP; diff --git a/lib/microservices/server/server.d.ts b/lib/microservices/server/server.d.ts new file mode 100644 index 000000000..4c207221a --- /dev/null +++ b/lib/microservices/server/server.d.ts @@ -0,0 +1,30 @@ +import { Logger } from '@nestjs/common/services/logger.service'; +import { MessageHandlers } from '../interfaces/message-handlers.interface'; +import { Observable } from 'rxjs/Observable'; +import { Subscription } from 'rxjs/Subscription'; +import { WritePacket, MicroserviceOptions } from './../interfaces'; +export abstract class Server { + protected readonly messageHandlers: MessageHandlers; + protected readonly logger: Logger; + getHandlers(): MessageHandlers; + getHandlerByPattern( + pattern: string, + ): (data) => Promise> | null; + add(pattern: any, callback: (data) => Promise>): void; + send( + stream$: Observable, + respond: (data: WritePacket) => void, + ): Subscription; + transformToObservable(resultOrDeffered: any): Observable; + getOptionsProp< + T extends { + options?; + } + >( + obj: MicroserviceOptions, + prop: keyof T['options'], + defaultValue?: any, + ): any; + protected handleError(error: string): void; + protected loadPackage(name: string, ctx: string): any; +} diff --git a/lib/microservices/server/server.js b/lib/microservices/server/server.js new file mode 100644 index 000000000..f489cd9c0 --- /dev/null +++ b/lib/microservices/server/server.js @@ -0,0 +1,57 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const logger_service_1 = require("@nestjs/common/services/logger.service"); +const shared_utils_1 = require("@nestjs/common/utils/shared.utils"); +const operators_1 = require("rxjs/operators"); +const operators_2 = require("rxjs/operators"); +const empty_1 = require("rxjs/observable/empty"); +const of_1 = require("rxjs/observable/of"); +const fromPromise_1 = require("rxjs/observable/fromPromise"); +const missing_dependency_exception_1 = require("@nestjs/core/errors/exceptions/missing-dependency.exception"); +class Server { + constructor() { + this.messageHandlers = {}; + this.logger = new logger_service_1.Logger(Server.name); + } + getHandlers() { + return this.messageHandlers; + } + getHandlerByPattern(pattern) { + return this.messageHandlers[pattern] ? this.messageHandlers[pattern] : null; + } + add(pattern, callback) { + this.messageHandlers[JSON.stringify(pattern)] = callback; + } + send(stream$, respond) { + return stream$ + .pipe(operators_1.catchError(err => { + respond({ err, response: null }); + return empty_1.empty(); + }), operators_2.finalize(() => respond({ isDisposed: true }))) + .subscribe(response => respond({ err: null, response })); + } + transformToObservable(resultOrDeffered) { + if (resultOrDeffered instanceof Promise) { + return fromPromise_1.fromPromise(resultOrDeffered); + } + else if (!(resultOrDeffered && shared_utils_1.isFunction(resultOrDeffered.subscribe))) { + return of_1.of(resultOrDeffered); + } + return resultOrDeffered; + } + getOptionsProp(obj, prop, defaultValue = undefined) { + return obj && obj.options ? obj.options[prop] : defaultValue; + } + handleError(error) { + this.logger.error(error); + } + loadPackage(name, ctx) { + try { + return require(name); + } + catch (e) { + throw new missing_dependency_exception_1.MissingRequiredDependencyException(name, ctx); + } + } +} +exports.Server = Server; diff --git a/lib/microservices/utils/client.decorator.d.ts b/lib/microservices/utils/client.decorator.d.ts new file mode 100644 index 000000000..275bf7e00 --- /dev/null +++ b/lib/microservices/utils/client.decorator.d.ts @@ -0,0 +1,15 @@ +import 'reflect-metadata'; +import { ClientOptions } from '../interfaces/client-metadata.interface'; +/** + * Attaches the `ClientProxy` instance to the given property + * + * @param {ClientOptions} metadata Optional client metadata + * ``` + * transport?: Transport; + * url?: string; + * port?: number; + * host?: string; + */ +export declare const Client: ( + metadata?: ClientOptions, +) => (target: object, propertyKey: string | symbol) => void; diff --git a/lib/microservices/utils/client.decorator.js b/lib/microservices/utils/client.decorator.js new file mode 100644 index 000000000..8f93aa772 --- /dev/null +++ b/lib/microservices/utils/client.decorator.js @@ -0,0 +1,21 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +require("reflect-metadata"); +const constants_1 = require("../constants"); +/** + * Attaches the `ClientProxy` instance to the given property + * + * @param {ClientOptions} metadata Optional client metadata + * ``` + * transport?: Transport; + * url?: string; + * port?: number; + * host?: string; + */ +exports.Client = (metadata) => { + return (target, propertyKey) => { + Reflect.set(target, propertyKey, null); + Reflect.defineMetadata(constants_1.CLIENT_METADATA, true, target, propertyKey); + Reflect.defineMetadata(constants_1.CLIENT_CONFIGURATION_METADATA, metadata, target, propertyKey); + }; +}; diff --git a/lib/microservices/utils/index.d.ts b/lib/microservices/utils/index.d.ts new file mode 100644 index 000000000..e357597db --- /dev/null +++ b/lib/microservices/utils/index.d.ts @@ -0,0 +1,2 @@ +export * from './client.decorator'; +export * from './pattern.decorator'; diff --git a/lib/microservices/utils/index.js b/lib/microservices/utils/index.js new file mode 100644 index 000000000..f924421a4 --- /dev/null +++ b/lib/microservices/utils/index.js @@ -0,0 +1,7 @@ +"use strict"; +function __export(m) { + for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p]; +} +Object.defineProperty(exports, "__esModule", { value: true }); +__export(require("./client.decorator")); +__export(require("./pattern.decorator")); diff --git a/lib/microservices/utils/pattern.decorator.d.ts b/lib/microservices/utils/pattern.decorator.d.ts new file mode 100644 index 000000000..c8f48a46e --- /dev/null +++ b/lib/microservices/utils/pattern.decorator.d.ts @@ -0,0 +1,15 @@ +import 'reflect-metadata'; +import { PatternMetadata } from '../interfaces/pattern-metadata.interface'; +/** + * Subscribes to incoming messages which fulfils chosen pattern. + */ +export declare const MessagePattern: ( + metadata?: T, +) => MethodDecorator; +/** + * Registers gRPC route handler for specified service. + */ +export declare const GrpcRoute: ( + service: string, + rpc: string, +) => MethodDecorator; diff --git a/lib/microservices/utils/pattern.decorator.js b/lib/microservices/utils/pattern.decorator.js new file mode 100644 index 000000000..fb12ca947 --- /dev/null +++ b/lib/microservices/utils/pattern.decorator.js @@ -0,0 +1,18 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +require("reflect-metadata"); +const constants_1 = require("../constants"); +/** + * Subscribes to incoming messages which fulfils chosen pattern. + */ +exports.MessagePattern = (metadata) => { + return (target, key, descriptor) => { + Reflect.defineMetadata(constants_1.PATTERN_METADATA, metadata, descriptor.value); + Reflect.defineMetadata(constants_1.PATTERN_HANDLER_METADATA, true, descriptor.value); + return descriptor; + }; +}; +/** + * Registers gRPC route handler for specified service. + */ +exports.GrpcRoute = (service, rpc) => exports.MessagePattern({ service, rpc }); diff --git a/lib/testing/index.d.ts b/lib/testing/index.d.ts new file mode 100644 index 000000000..984644bbb --- /dev/null +++ b/lib/testing/index.d.ts @@ -0,0 +1,4 @@ +export * from './interfaces'; +export * from './test'; +export * from './testing-module.builder'; +export * from './testing-module'; diff --git a/lib/testing/index.js b/lib/testing/index.js new file mode 100644 index 000000000..b9a8aa338 --- /dev/null +++ b/lib/testing/index.js @@ -0,0 +1,14 @@ +"use strict"; +/* + * Nest @testing + * Copyright(c) 2017 - 2018 Kamil Mysliwiec + * https://nestjs.com + * MIT Licensed + */ +function __export(m) { + for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p]; +} +Object.defineProperty(exports, "__esModule", { value: true }); +__export(require("./test")); +__export(require("./testing-module.builder")); +__export(require("./testing-module")); diff --git a/lib/testing/interfaces/index.d.ts b/lib/testing/interfaces/index.d.ts new file mode 100644 index 000000000..33f61d966 --- /dev/null +++ b/lib/testing/interfaces/index.d.ts @@ -0,0 +1,2 @@ +export * from './override-by-factory-options.interface'; +export * from './override-by.interface'; diff --git a/lib/testing/interfaces/index.js b/lib/testing/interfaces/index.js new file mode 100644 index 000000000..c8ad2e549 --- /dev/null +++ b/lib/testing/interfaces/index.js @@ -0,0 +1,2 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/lib/testing/interfaces/override-by-factory-options.interface.d.ts b/lib/testing/interfaces/override-by-factory-options.interface.d.ts new file mode 100644 index 000000000..6de326119 --- /dev/null +++ b/lib/testing/interfaces/override-by-factory-options.interface.d.ts @@ -0,0 +1,4 @@ +export interface OverrideByFactoryOptions { + factory: (...args) => any; + inject?: any[]; +} diff --git a/lib/testing/interfaces/override-by-factory-options.interface.js b/lib/testing/interfaces/override-by-factory-options.interface.js new file mode 100644 index 000000000..c8ad2e549 --- /dev/null +++ b/lib/testing/interfaces/override-by-factory-options.interface.js @@ -0,0 +1,2 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/lib/testing/interfaces/override-by.interface.d.ts b/lib/testing/interfaces/override-by.interface.d.ts new file mode 100644 index 000000000..c6620de87 --- /dev/null +++ b/lib/testing/interfaces/override-by.interface.d.ts @@ -0,0 +1,7 @@ +import { OverrideByFactoryOptions } from './override-by-factory-options.interface'; +import { TestingModuleBuilder } from '../testing-module.builder'; +export interface OverrideBy { + useValue: (value) => TestingModuleBuilder; + useFactory: (options: OverrideByFactoryOptions) => TestingModuleBuilder; + useClass: (metatype) => TestingModuleBuilder; +} diff --git a/lib/testing/interfaces/override-by.interface.js b/lib/testing/interfaces/override-by.interface.js new file mode 100644 index 000000000..c8ad2e549 --- /dev/null +++ b/lib/testing/interfaces/override-by.interface.js @@ -0,0 +1,2 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/lib/testing/test.d.ts b/lib/testing/test.d.ts new file mode 100644 index 000000000..8d07f1d6e --- /dev/null +++ b/lib/testing/test.d.ts @@ -0,0 +1,7 @@ +import { ModuleMetadata } from '@nestjs/common/interfaces/modules/module-metadata.interface'; +import { TestingModuleBuilder } from './testing-module.builder'; +export declare class Test { + private static readonly metadataScanner; + static createTestingModule(metadata: ModuleMetadata): TestingModuleBuilder; + private static init(); +} diff --git a/lib/testing/test.js b/lib/testing/test.js new file mode 100644 index 000000000..4da1e7b9d --- /dev/null +++ b/lib/testing/test.js @@ -0,0 +1,17 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const logger_service_1 = require("@nestjs/common/services/logger.service"); +const nest_environment_enum_1 = require("@nestjs/common/enums/nest-environment.enum"); +const metadata_scanner_1 = require("@nestjs/core/metadata-scanner"); +const testing_module_builder_1 = require("./testing-module.builder"); +class Test { + static createTestingModule(metadata) { + this.init(); + return new testing_module_builder_1.TestingModuleBuilder(this.metadataScanner, metadata); + } + static init() { + logger_service_1.Logger.setMode(nest_environment_enum_1.NestEnvironment.TEST); + } +} +Test.metadataScanner = new metadata_scanner_1.MetadataScanner(); +exports.Test = Test; diff --git a/lib/testing/testing-module.builder.d.ts b/lib/testing/testing-module.builder.d.ts new file mode 100644 index 000000000..896da7513 --- /dev/null +++ b/lib/testing/testing-module.builder.d.ts @@ -0,0 +1,22 @@ +import { OverrideBy } from './interfaces'; +import { MetadataScanner } from '@nestjs/core/metadata-scanner'; +import { ModuleMetadata } from '@nestjs/common/interfaces'; +import { TestingModule } from './testing-module'; +export declare class TestingModuleBuilder { + private readonly applicationConfig; + private readonly container; + private readonly overloadsMap; + private readonly scanner; + private readonly instanceLoader; + private readonly module; + constructor(metadataScanner: MetadataScanner, metadata: ModuleMetadata); + overrideGuard(typeOrToken: any): OverrideBy; + overrideInterceptor(typeOrToken: any): OverrideBy; + /** @deprecated */ + overrideComponent(typeOrToken: any): OverrideBy; + overrideProvider(typeOrToken: any): OverrideBy; + compile(): Promise; + private override(typeOrToken, isComponent); + private createOverrideByBuilder(add); + private createModule(metadata); +} diff --git a/lib/testing/testing-module.builder.js b/lib/testing/testing-module.builder.js new file mode 100644 index 000000000..dec44a9ac --- /dev/null +++ b/lib/testing/testing-module.builder.js @@ -0,0 +1,75 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const deprecate = require("deprecate"); +const instance_loader_1 = require("@nestjs/core/injector/instance-loader"); +const container_1 = require("@nestjs/core/injector/container"); +const common_1 = require("@nestjs/common"); +const scanner_1 = require("@nestjs/core/scanner"); +const testing_module_1 = require("./testing-module"); +const application_config_1 = require("@nestjs/core/application-config"); +class TestingModuleBuilder { + constructor(metadataScanner, metadata) { + this.applicationConfig = new application_config_1.ApplicationConfig(); + this.container = new container_1.NestContainer(); + this.overloadsMap = new Map(); + this.instanceLoader = new instance_loader_1.InstanceLoader(this.container); + this.scanner = new scanner_1.DependenciesScanner(this.container, metadataScanner, this.applicationConfig); + this.module = this.createModule(metadata); + this.scanner.scan(this.module); + } + overrideGuard(typeOrToken) { + return this.override(typeOrToken, false); + } + overrideInterceptor(typeOrToken) { + return this.override(typeOrToken, false); + } + /** @deprecated */ + overrideComponent(typeOrToken) { + deprecate('The "overrideComponent()" method is deprecated and will be removed within next major release. Use "overrideProvider()" instead.'); + return this.override(typeOrToken, true); + } + overrideProvider(typeOrToken) { + return this.override(typeOrToken, true); + } + compile() { + return __awaiter(this, void 0, void 0, function* () { + [...this.overloadsMap.entries()].map(([component, options]) => { + this.container.replace(component, options); + }); + yield this.instanceLoader.createInstancesOfDependencies(); + this.scanner.applyApplicationProviders(); + const modules = this.container.getModules().values(); + const root = modules.next().value; + return new testing_module_1.TestingModule(this.container, [], root, this.applicationConfig); + }); + } + override(typeOrToken, isComponent) { + const addOverload = options => { + this.overloadsMap.set(typeOrToken, Object.assign({}, options, { isComponent })); + return this; + }; + return this.createOverrideByBuilder(addOverload); + } + createOverrideByBuilder(add) { + return { + useValue: value => add({ useValue: value }), + useFactory: (options) => add(Object.assign({}, options, { useFactory: options.factory })), + useClass: metatype => add({ useClass: metatype }), + }; + } + createModule(metadata) { + class TestModule { + } + common_1.Module(metadata)(TestModule); + return TestModule; + } +} +exports.TestingModuleBuilder = TestingModuleBuilder; diff --git a/lib/testing/testing-module.d.ts b/lib/testing/testing-module.d.ts new file mode 100644 index 000000000..9fc8fe892 --- /dev/null +++ b/lib/testing/testing-module.d.ts @@ -0,0 +1,30 @@ +import { NestContainer } from '@nestjs/core/injector/container'; +import { NestApplicationContext } from '@nestjs/core'; +import { Type } from '@nestjs/common/interfaces/type.interface'; +import { INestApplication, INestMicroservice } from '@nestjs/common'; +import { MicroserviceOptions } from '@nestjs/common/interfaces/microservices/microservice-configuration.interface'; +import { ApplicationConfig } from '@nestjs/core/application-config'; +import { HttpServer } from '@nestjs/common'; +import { FastifyAdapter } from '@nestjs/core/adapters/fastify-adapter'; +import { NestApplicationOptions } from '@nestjs/common/interfaces/nest-application-options.interface'; +import { INestFastifyApplication } from '@nestjs/common/interfaces/nest-fastify-application.interface'; +import { INestExpressApplication } from '@nestjs/common/interfaces/nest-express-application.interface'; +export declare class TestingModule extends NestApplicationContext { + private readonly applicationConfig; + constructor( + container: NestContainer, + scope: Type[], + contextModule: any, + applicationConfig: ApplicationConfig, + ); + createNestApplication( + httpServer?: FastifyAdapter, + options?: NestApplicationOptions, + ): INestApplication & INestFastifyApplication; + createNestApplication( + httpServer?: HttpServer, + options?: NestApplicationOptions, + ): INestApplication & INestExpressApplication; + createNestMicroservice(options: MicroserviceOptions): INestMicroservice; + private applyExpressAdapter(httpAdapter); +} diff --git a/lib/testing/testing-module.js b/lib/testing/testing-module.js new file mode 100644 index 000000000..bd778a4c2 --- /dev/null +++ b/lib/testing/testing-module.js @@ -0,0 +1,33 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const optional = require("optional"); +const core_1 = require("@nestjs/core"); +const microservices_package_not_found_exception_1 = require("@nestjs/core/errors/exceptions/microservices-package-not-found.exception"); +const express_factory_1 = require("@nestjs/core/adapters/express-factory"); +const express_adapter_1 = require("@nestjs/core/adapters/express-adapter"); +const { NestMicroservice } = optional('@nestjs/microservices/nest-microservice') || {}; +class TestingModule extends core_1.NestApplicationContext { + constructor(container, scope, contextModule, applicationConfig) { + super(container, scope, contextModule); + this.applicationConfig = applicationConfig; + } + createNestApplication(httpServer = express_factory_1.ExpressFactory.create(), options) { + httpServer = this.applyExpressAdapter(httpServer); + this.container.setApplicationRef(httpServer); + return new core_1.NestApplication(this.container, httpServer, this.applicationConfig); + } + createNestMicroservice(options) { + if (!NestMicroservice) { + throw new microservices_package_not_found_exception_1.MicroservicesPackageNotFoundException(); + } + return new NestMicroservice(this.container, options, this.applicationConfig); + } + applyExpressAdapter(httpAdapter) { + const isAdapter = !!httpAdapter.getHttpServer; + if (isAdapter) { + return httpAdapter; + } + return new express_adapter_1.ExpressAdapter(httpAdapter); + } +} +exports.TestingModule = TestingModule; diff --git a/lib/websockets/adapters/index.d.ts b/lib/websockets/adapters/index.d.ts new file mode 100644 index 000000000..0f0c68ef8 --- /dev/null +++ b/lib/websockets/adapters/index.d.ts @@ -0,0 +1 @@ +export * from './ws-adapter'; diff --git a/lib/websockets/adapters/index.js b/lib/websockets/adapters/index.js new file mode 100644 index 000000000..b48cb3b21 --- /dev/null +++ b/lib/websockets/adapters/index.js @@ -0,0 +1,6 @@ +"use strict"; +function __export(m) { + for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p]; +} +Object.defineProperty(exports, "__esModule", { value: true }); +__export(require("./ws-adapter")); diff --git a/lib/websockets/adapters/io-adapter.d.ts b/lib/websockets/adapters/io-adapter.d.ts new file mode 100644 index 000000000..e558e70ac --- /dev/null +++ b/lib/websockets/adapters/io-adapter.d.ts @@ -0,0 +1,26 @@ +/// +import { Server } from 'http'; +import { MessageMappingProperties } from '../gateway-metadata-explorer'; +import { WebSocketAdapter } from '@nestjs/common'; +import { Observable } from 'rxjs/Observable'; +export declare class IoAdapter implements WebSocketAdapter { + private readonly httpServer; + constructor(httpServer?: Server | null); + create( + port: number, + options?: any & { + namespace?: string; + server?: any; + }, + ): any; + createIOServer(port: number, options?: any): any; + bindClientConnect(server: any, callback: (...args) => void): void; + bindClientDisconnect(client: any, callback: (...args) => void): void; + bindMessageHandlers( + client: any, + handlers: MessageMappingProperties[], + process: (data: any) => Observable, + ): void; + bindMiddleware(server: any, middleware: (socket, next) => void): void; + close(server: any): void; +} diff --git a/lib/websockets/adapters/io-adapter.js b/lib/websockets/adapters/io-adapter.js new file mode 100644 index 000000000..39d549d05 --- /dev/null +++ b/lib/websockets/adapters/io-adapter.js @@ -0,0 +1,56 @@ +"use strict"; +var __rest = (this && this.__rest) || function (s, e) { + var t = {}; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) + t[p] = s[p]; + if (s != null && typeof Object.getOwnPropertySymbols === "function") + for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) if (e.indexOf(p[i]) < 0) + t[p[i]] = s[p[i]]; + return t; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const io = require("socket.io"); +const constants_1 = require("../constants"); +const operators_1 = require("rxjs/operators"); +const fromEvent_1 = require("rxjs/observable/fromEvent"); +const shared_utils_1 = require("@nestjs/common/utils/shared.utils"); +class IoAdapter { + constructor(httpServer = null) { + this.httpServer = httpServer; + } + create(port, options) { + if (!options) { + return this.createIOServer(port); + } + const { namespace, server } = options, opt = __rest(options, ["namespace", "server"]); + return server && shared_utils_1.isFunction(server.of) + ? server.of(namespace) + : namespace + ? this.createIOServer(port, opt).of(namespace) + : this.createIOServer(port, opt); + } + createIOServer(port, options) { + if (this.httpServer && port === 0) { + return io(this.httpServer, options); + } + return io(port, options); + } + bindClientConnect(server, callback) { + server.on(constants_1.CONNECTION_EVENT, callback); + } + bindClientDisconnect(client, callback) { + client.on(constants_1.DISCONNECT_EVENT, callback); + } + bindMessageHandlers(client, handlers, process) { + handlers.forEach(({ message, callback }) => fromEvent_1.fromEvent(client, message) + .pipe(operators_1.mergeMap(data => process(callback(data))), operators_1.filter(result => !!result && result.event)) + .subscribe(({ event, data }) => client.emit(event, data))); + } + bindMiddleware(server, middleware) { + server.use(middleware); + } + close(server) { + shared_utils_1.isFunction(server.close) && server.close(); + } +} +exports.IoAdapter = IoAdapter; diff --git a/lib/websockets/adapters/ws-adapter.d.ts b/lib/websockets/adapters/ws-adapter.d.ts new file mode 100644 index 000000000..1d71b7ddf --- /dev/null +++ b/lib/websockets/adapters/ws-adapter.d.ts @@ -0,0 +1,31 @@ +/// +import { Server } from 'http'; +import { MessageMappingProperties } from '../gateway-metadata-explorer'; +import { WebSocketAdapter } from '@nestjs/common'; +import { Observable } from 'rxjs/Observable'; +export declare class WsAdapter implements WebSocketAdapter { + private readonly httpServer; + private readonly logger; + constructor(httpServer?: Server | null); + create( + port: number, + options?: any & { + namespace?: string; + server?: any; + }, + ): any; + bindClientConnect(server: any, callback: (...args) => void): void; + bindClientDisconnect(client: any, callback: (...args) => void): void; + bindMessageHandlers( + client: WebSocket, + handlers: MessageMappingProperties[], + process: (data: any) => Observable, + ): void; + bindMessageHandler( + buffer: any, + handlers: MessageMappingProperties[], + process: (data: any) => Observable, + ): Observable; + close(server: any): void; + bindErrorHandler(server: any): any; +} diff --git a/lib/websockets/adapters/ws-adapter.js b/lib/websockets/adapters/ws-adapter.js new file mode 100644 index 000000000..d8570cfb5 --- /dev/null +++ b/lib/websockets/adapters/ws-adapter.js @@ -0,0 +1,68 @@ +"use strict"; +var __rest = (this && this.__rest) || function (s, e) { + var t = {}; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) + t[p] = s[p]; + if (s != null && typeof Object.getOwnPropertySymbols === "function") + for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) if (e.indexOf(p[i]) < 0) + t[p[i]] = s[p[i]]; + return t; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const constants_1 = require("../constants"); +const common_1 = require("@nestjs/common"); +const operators_1 = require("rxjs/operators"); +const fromEvent_1 = require("rxjs/observable/fromEvent"); +const shared_utils_1 = require("@nestjs/common/utils/shared.utils"); +const empty_1 = require("rxjs/observable/empty"); +const missing_dependency_exception_1 = require("@nestjs/core/errors/exceptions/missing-dependency.exception"); +let wsPackage = {}; +class WsAdapter { + constructor(httpServer = null) { + this.httpServer = httpServer; + this.logger = new common_1.Logger(WsAdapter.name); + try { + wsPackage = require('ws'); + } + catch (e) { + throw new missing_dependency_exception_1.MissingRequiredDependencyException('ws', 'WsAdapter'); + } + } + create(port, options) { + const { server } = options, wsOptions = __rest(options, ["server"]); + if (port === 0 && this.httpServer) { + return this.bindErrorHandler(new wsPackage.Server(Object.assign({ server: this.httpServer }, wsOptions))); + } + return server + ? server + : this.bindErrorHandler(new wsPackage.Server(Object.assign({ port }, wsOptions))); + } + bindClientConnect(server, callback) { + server.on(constants_1.CONNECTION_EVENT, callback); + } + bindClientDisconnect(client, callback) { + client.on(constants_1.CLOSE_EVENT, callback); + } + bindMessageHandlers(client, handlers, process) { + fromEvent_1.fromEvent(client, 'message') + .pipe(operators_1.mergeMap(data => this.bindMessageHandler(data, handlers, process)), operators_1.filter(result => !!result)) + .subscribe(response => client.send(JSON.stringify(response))); + } + bindMessageHandler(buffer, handlers, process) { + const message = JSON.parse(buffer.data); + const messageHandler = handlers.find(handler => handler.message === message.event); + if (!messageHandler) { + return empty_1.empty(); + } + const { callback } = messageHandler; + return process(callback(message.data)); + } + close(server) { + shared_utils_1.isFunction(server.close) && server.close(); + } + bindErrorHandler(server) { + server.on(constants_1.ERROR_EVENT, err => this.logger.error(err)); + return server; + } +} +exports.WsAdapter = WsAdapter; diff --git a/lib/websockets/constants.d.ts b/lib/websockets/constants.d.ts new file mode 100644 index 000000000..f7d8c5b81 --- /dev/null +++ b/lib/websockets/constants.d.ts @@ -0,0 +1,12 @@ +export declare const MESSAGE_MAPPING_METADATA = '__isMessageMapping'; +export declare const MESSAGE_METADATA = 'message'; +export declare const GATEWAY_SERVER_METADATA = '__isSocketServer'; +export declare const GATEWAY_METADATA = '__isGateway'; +export declare const NAMESPACE_METADATA = 'namespace'; +export declare const PORT_METADATA = 'port'; +export declare const GATEWAY_MIDDLEWARES = '__gatewayMiddlewares'; +export declare const GATEWAY_OPTIONS = '__gatewayOptions'; +export declare const CONNECTION_EVENT = 'connection'; +export declare const DISCONNECT_EVENT = 'disconnect'; +export declare const CLOSE_EVENT = 'close'; +export declare const ERROR_EVENT = 'error'; diff --git a/lib/websockets/constants.js b/lib/websockets/constants.js new file mode 100644 index 000000000..cc17cdf0b --- /dev/null +++ b/lib/websockets/constants.js @@ -0,0 +1,14 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.MESSAGE_MAPPING_METADATA = '__isMessageMapping'; +exports.MESSAGE_METADATA = 'message'; +exports.GATEWAY_SERVER_METADATA = '__isSocketServer'; +exports.GATEWAY_METADATA = '__isGateway'; +exports.NAMESPACE_METADATA = 'namespace'; +exports.PORT_METADATA = 'port'; +exports.GATEWAY_MIDDLEWARES = '__gatewayMiddlewares'; +exports.GATEWAY_OPTIONS = '__gatewayOptions'; +exports.CONNECTION_EVENT = 'connection'; +exports.DISCONNECT_EVENT = 'disconnect'; +exports.CLOSE_EVENT = 'close'; +exports.ERROR_EVENT = 'error'; diff --git a/lib/websockets/container.d.ts b/lib/websockets/container.d.ts new file mode 100644 index 000000000..349468cae --- /dev/null +++ b/lib/websockets/container.d.ts @@ -0,0 +1,12 @@ +import { ObservableSocketServer } from './interfaces'; +export declare class SocketsContainer { + private readonly observableServers; + getAllServers(): Map; + getServerByPort(port: number): ObservableSocketServer; + addServer( + namespace: string, + port: number, + server: ObservableSocketServer, + ): void; + clear(): void; +} diff --git a/lib/websockets/container.js b/lib/websockets/container.js new file mode 100644 index 000000000..b4b001621 --- /dev/null +++ b/lib/websockets/container.js @@ -0,0 +1,20 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +class SocketsContainer { + constructor() { + this.observableServers = new Map(); + } + getAllServers() { + return this.observableServers; + } + getServerByPort(port) { + return this.observableServers.get(`${port}`); + } + addServer(namespace, port, server) { + this.observableServers.set(namespace ? `${namespace}:${port}` : `${port}`, server); + } + clear() { + this.observableServers.clear(); + } +} +exports.SocketsContainer = SocketsContainer; diff --git a/lib/websockets/context/exception-filters-context.d.ts b/lib/websockets/context/exception-filters-context.d.ts new file mode 100644 index 000000000..ce9b23c23 --- /dev/null +++ b/lib/websockets/context/exception-filters-context.d.ts @@ -0,0 +1,11 @@ +import 'reflect-metadata'; +import { Controller } from '@nestjs/common/interfaces/controllers/controller.interface'; +import { BaseExceptionFilterContext } from '@nestjs/core/exceptions/base-exception-filter-context'; +import { WsExceptionsHandler } from '../exceptions/ws-exceptions-handler'; +export declare class ExceptionFiltersContext extends BaseExceptionFilterContext { + create( + instance: Controller, + callback: (client, data) => any, + ): WsExceptionsHandler; + getGlobalMetadata(): T; +} diff --git a/lib/websockets/context/exception-filters-context.js b/lib/websockets/context/exception-filters-context.js new file mode 100644 index 000000000..67214a932 --- /dev/null +++ b/lib/websockets/context/exception-filters-context.js @@ -0,0 +1,22 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +require("reflect-metadata"); +const constants_1 = require("@nestjs/common/constants"); +const shared_utils_1 = require("@nestjs/common/utils/shared.utils"); +const base_exception_filter_context_1 = require("@nestjs/core/exceptions/base-exception-filter-context"); +const ws_exceptions_handler_1 = require("../exceptions/ws-exceptions-handler"); +class ExceptionFiltersContext extends base_exception_filter_context_1.BaseExceptionFilterContext { + create(instance, callback) { + const exceptionHandler = new ws_exceptions_handler_1.WsExceptionsHandler(); + const filters = this.createContext(instance, callback, constants_1.EXCEPTION_FILTERS_METADATA); + if (shared_utils_1.isEmpty(filters)) { + return exceptionHandler; + } + exceptionHandler.setCustomFilters(filters); + return exceptionHandler; + } + getGlobalMetadata() { + return []; + } +} +exports.ExceptionFiltersContext = ExceptionFiltersContext; diff --git a/lib/websockets/context/ws-context-creator.d.ts b/lib/websockets/context/ws-context-creator.d.ts new file mode 100644 index 000000000..c054eb1e0 --- /dev/null +++ b/lib/websockets/context/ws-context-creator.d.ts @@ -0,0 +1,39 @@ +import { WsProxy } from './ws-proxy'; +import { ExceptionFiltersContext } from './exception-filters-context'; +import { Controller } from '@nestjs/common/interfaces'; +import { PipesContextCreator } from '@nestjs/core/pipes/pipes-context-creator'; +import { PipesConsumer } from '@nestjs/core/pipes/pipes-consumer'; +import { GuardsContextCreator } from '@nestjs/core/guards/guards-context-creator'; +import { GuardsConsumer } from '@nestjs/core/guards/guards-consumer'; +import { InterceptorsConsumer } from '@nestjs/core/interceptors/interceptors-consumer'; +import { InterceptorsContextCreator } from '@nestjs/core/interceptors/interceptors-context-creator'; +export declare class WsContextCreator { + private readonly wsProxy; + private readonly exceptionFiltersContext; + private readonly pipesCreator; + private readonly pipesConsumer; + private readonly guardsContextCreator; + private readonly guardsConsumer; + private readonly interceptorsContextCreator; + private readonly interceptorsConsumer; + constructor( + wsProxy: WsProxy, + exceptionFiltersContext: ExceptionFiltersContext, + pipesCreator: PipesContextCreator, + pipesConsumer: PipesConsumer, + guardsContextCreator: GuardsContextCreator, + guardsConsumer: GuardsConsumer, + interceptorsContextCreator: InterceptorsContextCreator, + interceptorsConsumer: InterceptorsConsumer, + ); + create( + instance: Controller, + callback: (client, data) => void, + module: any, + ): (client, data) => Promise; + reflectCallbackParamtypes( + instance: Controller, + callback: (...args) => any, + ): any[]; + getDataMetatype(instance: any, callback: any): any; +} diff --git a/lib/websockets/context/ws-context-creator.js b/lib/websockets/context/ws-context-creator.js new file mode 100644 index 000000000..0793622cd --- /dev/null +++ b/lib/websockets/context/ws-context-creator.js @@ -0,0 +1,51 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const constants_1 = require("@nestjs/common/constants"); +const constants_2 = require("@nestjs/core/guards/constants"); +const ws_exception_1 = require("../exceptions/ws-exception"); +class WsContextCreator { + constructor(wsProxy, exceptionFiltersContext, pipesCreator, pipesConsumer, guardsContextCreator, guardsConsumer, interceptorsContextCreator, interceptorsConsumer) { + this.wsProxy = wsProxy; + this.exceptionFiltersContext = exceptionFiltersContext; + this.pipesCreator = pipesCreator; + this.pipesConsumer = pipesConsumer; + this.guardsContextCreator = guardsContextCreator; + this.guardsConsumer = guardsConsumer; + this.interceptorsContextCreator = interceptorsContextCreator; + this.interceptorsConsumer = interceptorsConsumer; + } + create(instance, callback, module) { + const exceptionHandler = this.exceptionFiltersContext.create(instance, callback); + const pipes = this.pipesCreator.create(instance, callback); + const guards = this.guardsContextCreator.create(instance, callback, module); + const metatype = this.getDataMetatype(instance, callback); + const interceptors = this.interceptorsContextCreator.create(instance, callback, module); + return this.wsProxy.create((client, data) => __awaiter(this, void 0, void 0, function* () { + const canActivate = yield this.guardsConsumer.tryActivate(guards, [client, data], instance, callback); + if (!canActivate) { + throw new ws_exception_1.WsException(constants_2.FORBIDDEN_MESSAGE); + } + const handler = () => __awaiter(this, void 0, void 0, function* () { + const result = yield this.pipesConsumer.applyPipes(data, { metatype }, pipes); + return callback.call(instance, client, result); + }); + return yield this.interceptorsConsumer.intercept(interceptors, [client, data], instance, callback, handler); + }), exceptionHandler); + } + reflectCallbackParamtypes(instance, callback) { + return Reflect.getMetadata(constants_1.PARAMTYPES_METADATA, instance, callback.name); + } + getDataMetatype(instance, callback) { + const paramtypes = this.reflectCallbackParamtypes(instance, callback); + return paramtypes && paramtypes.length ? paramtypes[1] : null; + } +} +exports.WsContextCreator = WsContextCreator; diff --git a/lib/websockets/context/ws-proxy.d.ts b/lib/websockets/context/ws-proxy.d.ts new file mode 100644 index 000000000..163fecafd --- /dev/null +++ b/lib/websockets/context/ws-proxy.d.ts @@ -0,0 +1,7 @@ +import { WsExceptionsHandler } from './../exceptions/ws-exceptions-handler'; +export declare class WsProxy { + create( + targetCallback: (client, data) => Promise, + exceptionsHandler: WsExceptionsHandler, + ): (client, data) => Promise; +} diff --git a/lib/websockets/context/ws-proxy.js b/lib/websockets/context/ws-proxy.js new file mode 100644 index 000000000..45b2fd092 --- /dev/null +++ b/lib/websockets/context/ws-proxy.js @@ -0,0 +1,25 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const execution_context_host_1 = require("@nestjs/core/helpers/execution-context.host"); +class WsProxy { + create(targetCallback, exceptionsHandler) { + return (client, data) => __awaiter(this, void 0, void 0, function* () { + const host = new execution_context_host_1.ExecutionContextHost([client, data]); + try { + return yield targetCallback(client, data); + } + catch (e) { + exceptionsHandler.handle(e, host); + } + }); + } +} +exports.WsProxy = WsProxy; diff --git a/lib/websockets/exceptions/invalid-socket-port.exception.d.ts b/lib/websockets/exceptions/invalid-socket-port.exception.d.ts new file mode 100644 index 000000000..9cfacab31 --- /dev/null +++ b/lib/websockets/exceptions/invalid-socket-port.exception.d.ts @@ -0,0 +1,4 @@ +import { RuntimeException } from '@nestjs/core/errors/exceptions/runtime.exception'; +export declare class InvalidSocketPortException extends RuntimeException { + constructor(port: any, type: any); +} diff --git a/lib/websockets/exceptions/invalid-socket-port.exception.js b/lib/websockets/exceptions/invalid-socket-port.exception.js new file mode 100644 index 000000000..136528640 --- /dev/null +++ b/lib/websockets/exceptions/invalid-socket-port.exception.js @@ -0,0 +1,9 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const runtime_exception_1 = require("@nestjs/core/errors/exceptions/runtime.exception"); +class InvalidSocketPortException extends runtime_exception_1.RuntimeException { + constructor(port, type) { + super(`Invalid port (${port}) in Gateway ${type}!`); + } +} +exports.InvalidSocketPortException = InvalidSocketPortException; diff --git a/lib/websockets/exceptions/ws-exception.d.ts b/lib/websockets/exceptions/ws-exception.d.ts new file mode 100644 index 000000000..d8a1a1667 --- /dev/null +++ b/lib/websockets/exceptions/ws-exception.d.ts @@ -0,0 +1,6 @@ +export declare class WsException extends Error { + private readonly error; + readonly message: any; + constructor(error: string | object); + getError(): string | object; +} diff --git a/lib/websockets/exceptions/ws-exception.js b/lib/websockets/exceptions/ws-exception.js new file mode 100644 index 000000000..39ddb4991 --- /dev/null +++ b/lib/websockets/exceptions/ws-exception.js @@ -0,0 +1,13 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +class WsException extends Error { + constructor(error) { + super(); + this.error = error; + this.message = error; + } + getError() { + return this.error; + } +} +exports.WsException = WsException; diff --git a/lib/websockets/exceptions/ws-exceptions-handler.d.ts b/lib/websockets/exceptions/ws-exceptions-handler.d.ts new file mode 100644 index 000000000..03b46c5db --- /dev/null +++ b/lib/websockets/exceptions/ws-exceptions-handler.d.ts @@ -0,0 +1,9 @@ +import { ExceptionFilterMetadata } from '@nestjs/common/interfaces/exceptions/exception-filter-metadata.interface'; +import { WsException } from '../exceptions/ws-exception'; +import { ArgumentsHost } from '@nestjs/common'; +export declare class WsExceptionsHandler { + private filters; + handle(exception: Error | WsException | any, args: ArgumentsHost): any; + setCustomFilters(filters: ExceptionFilterMetadata[]): void; + invokeCustomFilters(exception: any, args: ArgumentsHost): boolean; +} diff --git a/lib/websockets/exceptions/ws-exceptions-handler.js b/lib/websockets/exceptions/ws-exceptions-handler.js new file mode 100644 index 000000000..37bd682eb --- /dev/null +++ b/lib/websockets/exceptions/ws-exceptions-handler.js @@ -0,0 +1,47 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const constants_1 = require("@nestjs/core/constants"); +const shared_utils_1 = require("@nestjs/common/utils/shared.utils"); +const invalid_exception_filter_exception_1 = require("@nestjs/core/errors/exceptions/invalid-exception-filter.exception"); +const ws_exception_1 = require("../exceptions/ws-exception"); +class WsExceptionsHandler { + constructor() { + this.filters = []; + } + handle(exception, args) { + const client = args.switchToWs().getClient(); + if (this.invokeCustomFilters(exception, args) || !client.emit) + return; + const status = 'error'; + if (!(exception instanceof ws_exception_1.WsException)) { + const message = constants_1.messages.UNKNOWN_EXCEPTION_MESSAGE; + return client.emit('exception', { status, message }); + } + const result = exception.getError(); + const message = shared_utils_1.isObject(result) + ? result + : { + status, + message: result, + }; + client.emit('exception', message); + } + setCustomFilters(filters) { + if (!Array.isArray(filters)) { + throw new invalid_exception_filter_exception_1.InvalidExceptionFilterException(); + } + this.filters = filters; + } + invokeCustomFilters(exception, args) { + if (shared_utils_1.isEmpty(this.filters)) + return false; + const filter = this.filters.find(({ exceptionMetatypes, func }) => { + const hasMetatype = !exceptionMetatypes.length || + !!exceptionMetatypes.find(ExceptionMetatype => exception instanceof ExceptionMetatype); + return hasMetatype; + }); + filter && filter.func(exception, args); + return !!filter; + } +} +exports.WsExceptionsHandler = WsExceptionsHandler; diff --git a/lib/websockets/gateway-metadata-explorer.d.ts b/lib/websockets/gateway-metadata-explorer.d.ts new file mode 100644 index 000000000..dba9b4af0 --- /dev/null +++ b/lib/websockets/gateway-metadata-explorer.d.ts @@ -0,0 +1,17 @@ +import { NestGateway } from './interfaces/nest-gateway.interface'; +import { MetadataScanner } from '@nestjs/core/metadata-scanner'; +import { Observable } from 'rxjs/Observable'; +export declare class GatewayMetadataExplorer { + private readonly metadataScanner; + constructor(metadataScanner: MetadataScanner); + explore(instance: NestGateway): MessageMappingProperties[]; + exploreMethodMetadata( + instancePrototype: any, + methodName: string, + ): MessageMappingProperties; + scanForServerHooks(instance: NestGateway): IterableIterator; +} +export interface MessageMappingProperties { + message: any; + callback: (...args) => Observable | Promise | any; +} diff --git a/lib/websockets/gateway-metadata-explorer.js b/lib/websockets/gateway-metadata-explorer.js new file mode 100644 index 000000000..ef825868c --- /dev/null +++ b/lib/websockets/gateway-metadata-explorer.js @@ -0,0 +1,37 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const shared_utils_1 = require("@nestjs/common/utils/shared.utils"); +const constants_1 = require("./constants"); +class GatewayMetadataExplorer { + constructor(metadataScanner) { + this.metadataScanner = metadataScanner; + } + explore(instance) { + const instancePrototype = Object.getPrototypeOf(instance); + return this.metadataScanner.scanFromPrototype(instance, instancePrototype, method => this.exploreMethodMetadata(instancePrototype, method)); + } + exploreMethodMetadata(instancePrototype, methodName) { + const callback = instancePrototype[methodName]; + const isMessageMapping = Reflect.getMetadata(constants_1.MESSAGE_MAPPING_METADATA, callback); + if (shared_utils_1.isUndefined(isMessageMapping)) { + return null; + } + const message = Reflect.getMetadata(constants_1.MESSAGE_METADATA, callback); + return { + callback, + message, + }; + } + *scanForServerHooks(instance) { + for (const propertyKey in instance) { + if (shared_utils_1.isFunction(propertyKey)) + continue; + const property = String(propertyKey); + const isServer = Reflect.getMetadata(constants_1.GATEWAY_SERVER_METADATA, instance, property); + if (shared_utils_1.isUndefined(isServer)) + continue; + yield property; + } + } +} +exports.GatewayMetadataExplorer = GatewayMetadataExplorer; diff --git a/lib/websockets/index.d.ts b/lib/websockets/index.d.ts new file mode 100644 index 000000000..5af7fe701 --- /dev/null +++ b/lib/websockets/index.d.ts @@ -0,0 +1,5 @@ +export * from './adapters/io-adapter'; +export * from './interfaces'; +export * from './exceptions/ws-exception'; +export * from './utils'; +export { MessageMappingProperties } from './gateway-metadata-explorer'; diff --git a/lib/websockets/index.js b/lib/websockets/index.js new file mode 100644 index 000000000..e56d4201f --- /dev/null +++ b/lib/websockets/index.js @@ -0,0 +1,14 @@ +"use strict"; +/* + * Nest @websockets + * Copyright(c) 2017 - 2018 Kamil Mysliwiec + * https://nestjs.com + * MIT Licensed + */ +function __export(m) { + for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p]; +} +Object.defineProperty(exports, "__esModule", { value: true }); +__export(require("./adapters/io-adapter")); +__export(require("./exceptions/ws-exception")); +__export(require("./utils")); diff --git a/lib/websockets/interfaces/gateway-metadata.interface.d.ts b/lib/websockets/interfaces/gateway-metadata.interface.d.ts new file mode 100644 index 000000000..18c6d5c1f --- /dev/null +++ b/lib/websockets/interfaces/gateway-metadata.interface.d.ts @@ -0,0 +1,11 @@ +export interface GatewayMetadata { + namespace?: string; + path?: string; + serveClient?: boolean; + adapter?: any; + origins?: string; + parser?: any; + pingTimeout?: number; + pingInterval?: number; + transports?: string[]; +} diff --git a/lib/websockets/interfaces/gateway-metadata.interface.js b/lib/websockets/interfaces/gateway-metadata.interface.js new file mode 100644 index 000000000..c8ad2e549 --- /dev/null +++ b/lib/websockets/interfaces/gateway-metadata.interface.js @@ -0,0 +1,2 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/lib/websockets/interfaces/gateway-middleware.interface.d.ts b/lib/websockets/interfaces/gateway-middleware.interface.d.ts new file mode 100644 index 000000000..7cf923417 --- /dev/null +++ b/lib/websockets/interfaces/gateway-middleware.interface.d.ts @@ -0,0 +1,3 @@ +export interface GatewayMiddleware { + resolve(): (socket, next) => void; +} diff --git a/lib/websockets/interfaces/gateway-middleware.interface.js b/lib/websockets/interfaces/gateway-middleware.interface.js new file mode 100644 index 000000000..c8ad2e549 --- /dev/null +++ b/lib/websockets/interfaces/gateway-middleware.interface.js @@ -0,0 +1,2 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/lib/websockets/interfaces/index.d.ts b/lib/websockets/interfaces/index.d.ts new file mode 100644 index 000000000..93616cd3c --- /dev/null +++ b/lib/websockets/interfaces/index.d.ts @@ -0,0 +1,9 @@ +export * from './gateway-metadata.interface'; +export * from './nest-gateway.interface'; +export * from './observable-socket-server.interface'; +export * from './web-socket-server.interface'; +export * from './on-gateway-init.interface'; +export * from './on-gateway-connection.interface'; +export * from './on-gateway-disconnect.interface'; +export * from './gateway-middleware.interface'; +export * from './ws-response.interface'; diff --git a/lib/websockets/interfaces/index.js b/lib/websockets/interfaces/index.js new file mode 100644 index 000000000..c8ad2e549 --- /dev/null +++ b/lib/websockets/interfaces/index.js @@ -0,0 +1,2 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/lib/websockets/interfaces/nest-gateway.interface.d.ts b/lib/websockets/interfaces/nest-gateway.interface.d.ts new file mode 100644 index 000000000..07c40bb32 --- /dev/null +++ b/lib/websockets/interfaces/nest-gateway.interface.d.ts @@ -0,0 +1,5 @@ +export interface NestGateway { + afterInit?: (server: any) => void; + handleConnection?: (client: any) => void; + handleDisconnect?: (client: any) => void; +} diff --git a/lib/websockets/interfaces/nest-gateway.interface.js b/lib/websockets/interfaces/nest-gateway.interface.js new file mode 100644 index 000000000..c8ad2e549 --- /dev/null +++ b/lib/websockets/interfaces/nest-gateway.interface.js @@ -0,0 +1,2 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/lib/websockets/interfaces/observable-socket-server.interface.d.ts b/lib/websockets/interfaces/observable-socket-server.interface.d.ts new file mode 100644 index 000000000..cd453280f --- /dev/null +++ b/lib/websockets/interfaces/observable-socket-server.interface.d.ts @@ -0,0 +1,8 @@ +import { ReplaySubject } from 'rxjs/ReplaySubject'; +import { Subject } from 'rxjs/Subject'; +export interface ObservableSocketServer { + server: any; + init: ReplaySubject; + connection: Subject; + disconnect: Subject; +} diff --git a/lib/websockets/interfaces/observable-socket-server.interface.js b/lib/websockets/interfaces/observable-socket-server.interface.js new file mode 100644 index 000000000..c8ad2e549 --- /dev/null +++ b/lib/websockets/interfaces/observable-socket-server.interface.js @@ -0,0 +1,2 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/lib/websockets/interfaces/on-gateway-connection.interface.d.ts b/lib/websockets/interfaces/on-gateway-connection.interface.d.ts new file mode 100644 index 000000000..4c16a7ff1 --- /dev/null +++ b/lib/websockets/interfaces/on-gateway-connection.interface.d.ts @@ -0,0 +1,3 @@ +export interface OnGatewayConnection { + handleConnection(client: T): any; +} diff --git a/lib/websockets/interfaces/on-gateway-connection.interface.js b/lib/websockets/interfaces/on-gateway-connection.interface.js new file mode 100644 index 000000000..c8ad2e549 --- /dev/null +++ b/lib/websockets/interfaces/on-gateway-connection.interface.js @@ -0,0 +1,2 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/lib/websockets/interfaces/on-gateway-disconnect.interface.d.ts b/lib/websockets/interfaces/on-gateway-disconnect.interface.d.ts new file mode 100644 index 000000000..f038c2162 --- /dev/null +++ b/lib/websockets/interfaces/on-gateway-disconnect.interface.d.ts @@ -0,0 +1,3 @@ +export interface OnGatewayDisconnect { + handleDisconnect(client: T): any; +} diff --git a/lib/websockets/interfaces/on-gateway-disconnect.interface.js b/lib/websockets/interfaces/on-gateway-disconnect.interface.js new file mode 100644 index 000000000..c8ad2e549 --- /dev/null +++ b/lib/websockets/interfaces/on-gateway-disconnect.interface.js @@ -0,0 +1,2 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/lib/websockets/interfaces/on-gateway-init.interface.d.ts b/lib/websockets/interfaces/on-gateway-init.interface.d.ts new file mode 100644 index 000000000..81096e55c --- /dev/null +++ b/lib/websockets/interfaces/on-gateway-init.interface.d.ts @@ -0,0 +1,3 @@ +export interface OnGatewayInit { + afterInit(server: T): any; +} diff --git a/lib/websockets/interfaces/on-gateway-init.interface.js b/lib/websockets/interfaces/on-gateway-init.interface.js new file mode 100644 index 000000000..c8ad2e549 --- /dev/null +++ b/lib/websockets/interfaces/on-gateway-init.interface.js @@ -0,0 +1,2 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/lib/websockets/interfaces/web-socket-server.interface.d.ts b/lib/websockets/interfaces/web-socket-server.interface.d.ts new file mode 100644 index 000000000..eacd80be4 --- /dev/null +++ b/lib/websockets/interfaces/web-socket-server.interface.d.ts @@ -0,0 +1,4 @@ +export interface WebSocketServerData { + port: number; + namespace: string; +} diff --git a/lib/websockets/interfaces/web-socket-server.interface.js b/lib/websockets/interfaces/web-socket-server.interface.js new file mode 100644 index 000000000..c8ad2e549 --- /dev/null +++ b/lib/websockets/interfaces/web-socket-server.interface.js @@ -0,0 +1,2 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/lib/websockets/interfaces/ws-response.interface.d.ts b/lib/websockets/interfaces/ws-response.interface.d.ts new file mode 100644 index 000000000..04e815cbf --- /dev/null +++ b/lib/websockets/interfaces/ws-response.interface.d.ts @@ -0,0 +1,4 @@ +export interface WsResponse { + event: string; + data: T; +} diff --git a/lib/websockets/interfaces/ws-response.interface.js b/lib/websockets/interfaces/ws-response.interface.js new file mode 100644 index 000000000..c8ad2e549 --- /dev/null +++ b/lib/websockets/interfaces/ws-response.interface.js @@ -0,0 +1,2 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/lib/websockets/middlewares-injector.d.ts b/lib/websockets/middlewares-injector.d.ts new file mode 100644 index 000000000..fe54f6ecb --- /dev/null +++ b/lib/websockets/middlewares-injector.d.ts @@ -0,0 +1,26 @@ +import 'reflect-metadata'; +import { + NestContainer, + InstanceWrapper, +} from '@nestjs/core/injector/container'; +import { NestGateway } from './index'; +import { Injectable } from '@nestjs/common/interfaces/injectable.interface'; +import { GatewayMiddleware } from './interfaces/gateway-middleware.interface'; +import { ApplicationConfig } from '@nestjs/core/application-config'; +export declare class MiddlewaresInjector { + private readonly container; + private readonly config; + constructor(container: NestContainer, config: ApplicationConfig); + inject(server: any, instance: NestGateway, module: string): void; + reflectMiddlewaresTokens(instance: NestGateway): any[]; + applyMiddlewares( + server: any, + components: Map>, + tokens: any[], + ): void; + bindMiddleware( + token: string, + components: Map>, + ): any; + isGatewayMiddleware(middleware: object): middleware is GatewayMiddleware; +} diff --git a/lib/websockets/middlewares-injector.js b/lib/websockets/middlewares-injector.js new file mode 100644 index 000000000..70ed93574 --- /dev/null +++ b/lib/websockets/middlewares-injector.js @@ -0,0 +1,52 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +require("reflect-metadata"); +const iterare_1 = require("iterare"); +const constants_1 = require("./constants"); +const unknown_module_exception_1 = require("@nestjs/core/errors/exceptions/unknown-module.exception"); +const runtime_exception_1 = require("@nestjs/core/errors/exceptions/runtime.exception"); +const shared_utils_1 = require("@nestjs/common/utils/shared.utils"); +class MiddlewaresInjector { + constructor(container, config) { + this.container = container; + this.config = config; + } + inject(server, instance, module) { + const adapter = this.config.getIoAdapter(); + if (!adapter.bindMiddleware) { + return; + } + const opaqueTokens = this.reflectMiddlewaresTokens(instance); + const modules = this.container.getModules(); + if (!modules.has(module)) { + throw new unknown_module_exception_1.UnknownModuleException(); + } + const { components } = modules.get(module); + this.applyMiddlewares(server, components, opaqueTokens); + } + reflectMiddlewaresTokens(instance) { + const prototype = Object.getPrototypeOf(instance); + return (Reflect.getMetadata(constants_1.GATEWAY_MIDDLEWARES, prototype.constructor) || []); + } + applyMiddlewares(server, components, tokens) { + const adapter = this.config.getIoAdapter(); + iterare_1.default(tokens) + .map(token => this.bindMiddleware(token.name, components)) + .filter(middleware => !shared_utils_1.isNil(middleware)) + .forEach(middleware => adapter.bindMiddleware(server, middleware)); + } + bindMiddleware(token, components) { + if (!components.has(token)) { + throw new runtime_exception_1.RuntimeException(); + } + const { instance } = components.get(token); + if (!this.isGatewayMiddleware(instance)) + return null; + const middleware = instance.resolve(); + return shared_utils_1.isFunction(middleware) ? middleware.bind(instance) : null; + } + isGatewayMiddleware(middleware) { + return !shared_utils_1.isUndefined(middleware.resolve); + } +} +exports.MiddlewaresInjector = MiddlewaresInjector; diff --git a/lib/websockets/observable-socket.d.ts b/lib/websockets/observable-socket.d.ts new file mode 100644 index 000000000..5c674f01b --- /dev/null +++ b/lib/websockets/observable-socket.d.ts @@ -0,0 +1,4 @@ +import { ObservableSocketServer } from './interfaces/observable-socket-server.interface'; +export declare class ObservableSocket { + static create(server: any): ObservableSocketServer; +} diff --git a/lib/websockets/observable-socket.js b/lib/websockets/observable-socket.js new file mode 100644 index 000000000..0c340ade6 --- /dev/null +++ b/lib/websockets/observable-socket.js @@ -0,0 +1,15 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const Subject_1 = require("rxjs/Subject"); +const ReplaySubject_1 = require("rxjs/ReplaySubject"); +class ObservableSocket { + static create(server) { + return { + init: new ReplaySubject_1.ReplaySubject(), + connection: new Subject_1.Subject(), + disconnect: new Subject_1.Subject(), + server, + }; + } +} +exports.ObservableSocket = ObservableSocket; diff --git a/lib/websockets/socket-module.d.ts b/lib/websockets/socket-module.d.ts new file mode 100644 index 000000000..1701005f2 --- /dev/null +++ b/lib/websockets/socket-module.d.ts @@ -0,0 +1,19 @@ +import 'reflect-metadata'; +import { InstanceWrapper } from '@nestjs/core/injector/container'; +import { Injectable } from '@nestjs/common/interfaces/injectable.interface'; +export declare class SocketModule { + private readonly socketsContainer; + private applicationConfig; + private webSocketsController; + register(container: any, config: any): void; + hookGatewaysIntoServers( + components: Map>, + moduleName: string, + ): void; + hookGatewayIntoServer( + wrapper: InstanceWrapper, + moduleName: string, + ): void; + close(): Promise; + private getContextCreator(container); +} diff --git a/lib/websockets/socket-module.js b/lib/websockets/socket-module.js new file mode 100644 index 000000000..1e48fd650 --- /dev/null +++ b/lib/websockets/socket-module.js @@ -0,0 +1,64 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +require("reflect-metadata"); +const container_1 = require("./container"); +const web_sockets_controller_1 = require("./web-sockets-controller"); +const socket_server_provider_1 = require("./socket-server-provider"); +const constants_1 = require("./constants"); +const ws_context_creator_1 = require("./context/ws-context-creator"); +const ws_proxy_1 = require("./context/ws-proxy"); +const exception_filters_context_1 = require("./context/exception-filters-context"); +const pipes_consumer_1 = require("@nestjs/core/pipes/pipes-consumer"); +const pipes_context_creator_1 = require("@nestjs/core/pipes/pipes-context-creator"); +const guards_context_creator_1 = require("@nestjs/core/guards/guards-context-creator"); +const guards_consumer_1 = require("@nestjs/core/guards/guards-consumer"); +const interceptors_context_creator_1 = require("@nestjs/core/interceptors/interceptors-context-creator"); +const interceptors_consumer_1 = require("@nestjs/core/interceptors/interceptors-consumer"); +class SocketModule { + constructor() { + this.socketsContainer = new container_1.SocketsContainer(); + } + register(container, config) { + this.applicationConfig = config; + this.webSocketsController = new web_sockets_controller_1.WebSocketsController(new socket_server_provider_1.SocketServerProvider(this.socketsContainer, config), container, config, this.getContextCreator(container)); + const modules = container.getModules(); + modules.forEach(({ components }, moduleName) => this.hookGatewaysIntoServers(components, moduleName)); + } + hookGatewaysIntoServers(components, moduleName) { + components.forEach(wrapper => this.hookGatewayIntoServer(wrapper, moduleName)); + } + hookGatewayIntoServer(wrapper, moduleName) { + const { instance, metatype, isNotMetatype } = wrapper; + if (isNotMetatype) { + return; + } + const metadataKeys = Reflect.getMetadataKeys(metatype); + if (metadataKeys.indexOf(constants_1.GATEWAY_METADATA) < 0) { + return; + } + this.webSocketsController.hookGatewayIntoServer(instance, metatype, moduleName); + } + close() { + return __awaiter(this, void 0, void 0, function* () { + if (!this.applicationConfig) { + return void 0; + } + const adapter = this.applicationConfig.getIoAdapter(); + const servers = this.socketsContainer.getAllServers(); + servers.forEach(({ server }) => server && adapter.close(server)); + this.socketsContainer.clear(); + }); + } + getContextCreator(container) { + return new ws_context_creator_1.WsContextCreator(new ws_proxy_1.WsProxy(), new exception_filters_context_1.ExceptionFiltersContext(), new pipes_context_creator_1.PipesContextCreator(), new pipes_consumer_1.PipesConsumer(), new guards_context_creator_1.GuardsContextCreator(container), new guards_consumer_1.GuardsConsumer(), new interceptors_context_creator_1.InterceptorsContextCreator(container), new interceptors_consumer_1.InterceptorsConsumer()); + } +} +exports.SocketModule = SocketModule; diff --git a/lib/websockets/socket-server-provider.d.ts b/lib/websockets/socket-server-provider.d.ts new file mode 100644 index 000000000..6e41030c9 --- /dev/null +++ b/lib/websockets/socket-server-provider.d.ts @@ -0,0 +1,16 @@ +import { SocketsContainer } from './container'; +import { ObservableSocketServer } from './interfaces/observable-socket-server.interface'; +import { ApplicationConfig } from '@nestjs/core/application-config'; +export declare class SocketServerProvider { + private readonly socketsContainer; + private readonly applicationConfig; + constructor( + socketsContainer: SocketsContainer, + applicationConfig: ApplicationConfig, + ); + scanForSocketServer(options: any, port: number): ObservableSocketServer; + private createSocketServer(options, port); + private createWithNamespace(options, port, observableSocket); + private getServerOfNamespace(options, port, server); + private validateNamespace(namespace); +} diff --git a/lib/websockets/socket-server-provider.js b/lib/websockets/socket-server-provider.js new file mode 100644 index 000000000..b795a68ca --- /dev/null +++ b/lib/websockets/socket-server-provider.js @@ -0,0 +1,51 @@ +"use strict"; +var __rest = (this && this.__rest) || function (s, e) { + var t = {}; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) + t[p] = s[p]; + if (s != null && typeof Object.getOwnPropertySymbols === "function") + for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) if (e.indexOf(p[i]) < 0) + t[p[i]] = s[p[i]]; + return t; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const observable_socket_1 = require("./observable-socket"); +const shared_utils_1 = require("@nestjs/common/utils/shared.utils"); +class SocketServerProvider { + constructor(socketsContainer, applicationConfig) { + this.socketsContainer = socketsContainer; + this.applicationConfig = applicationConfig; + } + scanForSocketServer(options, port) { + const observableServer = this.socketsContainer.getServerByPort(port); + return observableServer + ? this.createWithNamespace(options, port, observableServer) + : this.createSocketServer(options, port); + } + createSocketServer(options, port) { + const { namespace, server } = options, opt = __rest(options, ["namespace", "server"]); + const adapter = this.applicationConfig.getIoAdapter(); + const ioServer = adapter.create(port, opt); + const observableSocket = observable_socket_1.ObservableSocket.create(ioServer); + this.socketsContainer.addServer(null, port, observableSocket); + return this.createWithNamespace(options, port, observableSocket); + } + createWithNamespace(options, port, observableSocket) { + const { namespace } = options; + if (!namespace) { + return observableSocket; + } + const namespaceServer = this.getServerOfNamespace(options, port, observableSocket.server); + const observableNamespaceSocket = observable_socket_1.ObservableSocket.create(namespaceServer); + this.socketsContainer.addServer(namespace, port, observableNamespaceSocket); + return observableNamespaceSocket; + } + getServerOfNamespace(options, port, server) { + const adapter = this.applicationConfig.getIoAdapter(); + return adapter.create(port, Object.assign({}, options, { namespace: this.validateNamespace(options.namespace || ''), server })); + } + validateNamespace(namespace) { + return shared_utils_1.validatePath(namespace); + } +} +exports.SocketServerProvider = SocketServerProvider; diff --git a/lib/websockets/utils/gateway-server.decorator.d.ts b/lib/websockets/utils/gateway-server.decorator.d.ts new file mode 100644 index 000000000..e3e651824 --- /dev/null +++ b/lib/websockets/utils/gateway-server.decorator.d.ts @@ -0,0 +1,5 @@ +import 'reflect-metadata'; +/** + * Attaches native Web Socket Server to a given property. + */ +export declare const WebSocketServer: () => PropertyDecorator; diff --git a/lib/websockets/utils/gateway-server.decorator.js b/lib/websockets/utils/gateway-server.decorator.js new file mode 100644 index 000000000..c19f3856a --- /dev/null +++ b/lib/websockets/utils/gateway-server.decorator.js @@ -0,0 +1,13 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +require("reflect-metadata"); +const constants_1 = require("../constants"); +/** + * Attaches native Web Socket Server to a given property. + */ +exports.WebSocketServer = () => { + return (target, propertyKey) => { + Reflect.set(target, propertyKey, null); + Reflect.defineMetadata(constants_1.GATEWAY_SERVER_METADATA, true, target, propertyKey); + }; +}; diff --git a/lib/websockets/utils/index.d.ts b/lib/websockets/utils/index.d.ts new file mode 100644 index 000000000..367ddd05d --- /dev/null +++ b/lib/websockets/utils/index.d.ts @@ -0,0 +1,3 @@ +export * from './socket-gateway.decorator'; +export * from './subscribe-message.decorator'; +export * from './gateway-server.decorator'; diff --git a/lib/websockets/utils/index.js b/lib/websockets/utils/index.js new file mode 100644 index 000000000..e7c7fede1 --- /dev/null +++ b/lib/websockets/utils/index.js @@ -0,0 +1,8 @@ +"use strict"; +function __export(m) { + for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p]; +} +Object.defineProperty(exports, "__esModule", { value: true }); +__export(require("./socket-gateway.decorator")); +__export(require("./subscribe-message.decorator")); +__export(require("./gateway-server.decorator")); diff --git a/lib/websockets/utils/socket-gateway.decorator.d.ts b/lib/websockets/utils/socket-gateway.decorator.d.ts new file mode 100644 index 000000000..dcfa7695c --- /dev/null +++ b/lib/websockets/utils/socket-gateway.decorator.d.ts @@ -0,0 +1,12 @@ +import 'reflect-metadata'; +import { GatewayMetadata } from '../interfaces'; +/** + * Defines the Gateway. The gateway is able to inject dependencies through constructor. + * Those dependencies should belong to the same module. Gateway is listening on the specified port. + */ +export declare function WebSocketGateway(port?: number): any; +export declare function WebSocketGateway(options?: GatewayMetadata | any): any; +export declare function WebSocketGateway( + port?: number, + options?: GatewayMetadata | any, +): any; diff --git a/lib/websockets/utils/socket-gateway.decorator.js b/lib/websockets/utils/socket-gateway.decorator.js new file mode 100644 index 000000000..a55b747f0 --- /dev/null +++ b/lib/websockets/utils/socket-gateway.decorator.js @@ -0,0 +1,18 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +require("reflect-metadata"); +const constants_1 = require("../constants"); +function WebSocketGateway(portOrOptions, options) { + const isPortInt = Number.isInteger(portOrOptions); + let [port, opt] = isPortInt + ? [portOrOptions, options] + : [0, portOrOptions]; + opt = opt || {}; + return (target) => { + Reflect.defineMetadata(constants_1.GATEWAY_METADATA, true, target); + Reflect.defineMetadata(constants_1.PORT_METADATA, port, target); + Reflect.defineMetadata(constants_1.GATEWAY_OPTIONS, opt, target); + Reflect.defineMetadata(constants_1.GATEWAY_MIDDLEWARES, opt.middlewares, target); + }; +} +exports.WebSocketGateway = WebSocketGateway; diff --git a/lib/websockets/utils/subscribe-message.decorator.d.ts b/lib/websockets/utils/subscribe-message.decorator.d.ts new file mode 100644 index 000000000..0adf823e7 --- /dev/null +++ b/lib/websockets/utils/subscribe-message.decorator.d.ts @@ -0,0 +1,7 @@ +import 'reflect-metadata'; +/** + * Subscribes to messages that fulfils chosen pattern. + */ +export declare const SubscribeMessage: ( + message: T, +) => MethodDecorator; diff --git a/lib/websockets/utils/subscribe-message.decorator.js b/lib/websockets/utils/subscribe-message.decorator.js new file mode 100644 index 000000000..c90d644b0 --- /dev/null +++ b/lib/websockets/utils/subscribe-message.decorator.js @@ -0,0 +1,14 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +require("reflect-metadata"); +const constants_1 = require("../constants"); +/** + * Subscribes to messages that fulfils chosen pattern. + */ +exports.SubscribeMessage = (message) => { + return (target, key, descriptor) => { + Reflect.defineMetadata(constants_1.MESSAGE_MAPPING_METADATA, true, descriptor.value); + Reflect.defineMetadata(constants_1.MESSAGE_METADATA, message, descriptor.value); + return descriptor; + }; +}; diff --git a/lib/websockets/web-sockets-controller.d.ts b/lib/websockets/web-sockets-controller.d.ts new file mode 100644 index 000000000..bb1437fe2 --- /dev/null +++ b/lib/websockets/web-sockets-controller.d.ts @@ -0,0 +1,67 @@ +import 'reflect-metadata'; +import { NestGateway } from './interfaces/nest-gateway.interface'; +import { ObservableSocketServer } from './interfaces/observable-socket-server.interface'; +import { MessageMappingProperties } from './gateway-metadata-explorer'; +import { Subject } from 'rxjs/Subject'; +import { SocketServerProvider } from './socket-server-provider'; +import { Type } from '@nestjs/common/interfaces/type.interface'; +import { NestContainer } from '@nestjs/core/injector/container'; +import { ApplicationConfig } from '@nestjs/core/application-config'; +import { WsContextCreator } from './context/ws-context-creator'; +import { Observable } from 'rxjs/Observable'; +export declare class WebSocketsController { + private readonly socketServerProvider; + private readonly container; + private readonly config; + private readonly contextCreator; + private readonly metadataExplorer; + private readonly middlewaresInjector; + constructor( + socketServerProvider: SocketServerProvider, + container: NestContainer, + config: ApplicationConfig, + contextCreator: WsContextCreator, + ); + hookGatewayIntoServer( + instance: NestGateway, + metatype: Type, + module: string, + ): void; + subscribeObservableServer( + instance: NestGateway, + options: any, + port: number, + module: string, + ): void; + injectMiddlewares( + { + server, + }: { + server: any; + }, + instance: NestGateway, + module: string, + ): void; + subscribeEvents( + instance: NestGateway, + messageHandlers: MessageMappingProperties[], + observableServer: ObservableSocketServer, + ): void; + getConnectionHandler( + context: WebSocketsController, + instance: NestGateway, + messageHandlers: MessageMappingProperties[], + disconnect: Subject, + connection: Subject, + ): (client: any) => void; + subscribeInitEvent(instance: NestGateway, event: Subject): void; + subscribeConnectionEvent(instance: NestGateway, event: Subject): void; + subscribeDisconnectEvent(instance: NestGateway, event: Subject): void; + subscribeMessages( + messageHandlers: MessageMappingProperties[], + client: any, + instance: NestGateway, + ): void; + pickResult(defferedResult: Promise): Promise>; + private hookServerToProperties(instance, server); +} diff --git a/lib/websockets/web-sockets-controller.js b/lib/websockets/web-sockets-controller.js new file mode 100644 index 000000000..a5878622d --- /dev/null +++ b/lib/websockets/web-sockets-controller.js @@ -0,0 +1,113 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +require("reflect-metadata"); +const invalid_socket_port_exception_1 = require("./exceptions/invalid-socket-port.exception"); +const gateway_metadata_explorer_1 = require("./gateway-metadata-explorer"); +const constants_1 = require("./constants"); +const metadata_scanner_1 = require("@nestjs/core/metadata-scanner"); +const middlewares_injector_1 = require("./middlewares-injector"); +const shared_utils_1 = require("@nestjs/common/utils/shared.utils"); +const fromPromise_1 = require("rxjs/observable/fromPromise"); +const of_1 = require("rxjs/observable/of"); +const operators_1 = require("rxjs/operators"); +class WebSocketsController { + constructor(socketServerProvider, container, config, contextCreator) { + this.socketServerProvider = socketServerProvider; + this.container = container; + this.config = config; + this.contextCreator = contextCreator; + this.metadataExplorer = new gateway_metadata_explorer_1.GatewayMetadataExplorer(new metadata_scanner_1.MetadataScanner()); + this.middlewaresInjector = new middlewares_injector_1.MiddlewaresInjector(container, config); + } + hookGatewayIntoServer(instance, metatype, module) { + const options = Reflect.getMetadata(constants_1.GATEWAY_OPTIONS, metatype) || {}; + const port = Reflect.getMetadata(constants_1.PORT_METADATA, metatype) || 0; + if (!Number.isInteger(port)) { + throw new invalid_socket_port_exception_1.InvalidSocketPortException(port, metatype); + } + this.subscribeObservableServer(instance, options, port, module); + } + subscribeObservableServer(instance, options, port, module) { + const plainMessageHandlers = this.metadataExplorer.explore(instance); + const messageHandlers = plainMessageHandlers.map(({ callback, message }) => ({ + message, + callback: this.contextCreator.create(instance, callback, module), + })); + const observableServer = this.socketServerProvider.scanForSocketServer(options, port); + this.injectMiddlewares(observableServer, instance, module); + this.hookServerToProperties(instance, observableServer.server); + this.subscribeEvents(instance, messageHandlers, observableServer); + } + injectMiddlewares({ server }, instance, module) { + this.middlewaresInjector.inject(server, instance, module); + } + subscribeEvents(instance, messageHandlers, observableServer) { + const { init, disconnect, connection, server } = observableServer; + const adapter = this.config.getIoAdapter(); + this.subscribeInitEvent(instance, init); + this.subscribeConnectionEvent(instance, connection); + this.subscribeDisconnectEvent(instance, disconnect); + init.next(server); + const handler = this.getConnectionHandler(this, instance, messageHandlers, disconnect, connection); + adapter.bindClientConnect(server, handler); + } + getConnectionHandler(context, instance, messageHandlers, disconnect, connection) { + const adapter = this.config.getIoAdapter(); + return client => { + connection.next(client); + context.subscribeMessages(messageHandlers, client, instance); + const disconnectHook = adapter.bindClientDisconnect; + disconnectHook && + disconnectHook.call(adapter, client, socket => disconnect.next(client)); + }; + } + subscribeInitEvent(instance, event) { + if (instance.afterInit) { + event.subscribe(instance.afterInit.bind(instance)); + } + } + subscribeConnectionEvent(instance, event) { + if (instance.handleConnection) { + event.subscribe(instance.handleConnection.bind(instance)); + } + } + subscribeDisconnectEvent(instance, event) { + if (instance.handleDisconnect) { + event.subscribe(instance.handleDisconnect.bind(instance)); + } + } + subscribeMessages(messageHandlers, client, instance) { + const adapter = this.config.getIoAdapter(); + const handlers = messageHandlers.map(({ callback, message }) => ({ + message, + callback: callback.bind(instance, client), + })); + adapter.bindMessageHandlers(client, handlers, data => fromPromise_1.fromPromise(this.pickResult(data)).pipe(operators_1.mergeMap(stream => stream))); + } + pickResult(defferedResult) { + return __awaiter(this, void 0, void 0, function* () { + const result = yield defferedResult; + if (result && shared_utils_1.isFunction(result.subscribe)) { + return result; + } + if (result instanceof Promise) { + return fromPromise_1.fromPromise(result); + } + return of_1.of(result); + }); + } + hookServerToProperties(instance, server) { + for (const propertyKey of this.metadataExplorer.scanForServerHooks(instance)) { + Reflect.set(instance, propertyKey, server); + } + } +} +exports.WebSocketsController = WebSocketsController; diff --git a/packages/common/interfaces/middlewares/middleware-config-proxy.interface.ts b/packages/common/interfaces/middlewares/middleware-config-proxy.interface.ts index de29417c0..1f8becc92 100644 --- a/packages/common/interfaces/middlewares/middleware-config-proxy.interface.ts +++ b/packages/common/interfaces/middlewares/middleware-config-proxy.interface.ts @@ -4,19 +4,19 @@ import { Type } from '../type.interface'; export interface MiddlewareConfigProxy { /** - * Passes custom arguments to `resolve()` method of the middleware + * Passes custom arguments to `resolve()` method of the middleware. * * @param {} ...data - * @returns MiddlewareConfigProxy + * @returns {MiddlewareConfigProxy} */ with(...data: any[]): MiddlewareConfigProxy; /** * Attaches passed either routes (strings) or controllers to the processed middleware(s). - * When you pass Controller class, Nest will attach middleware to every HTTP route handler inside this controller. + * When you pass Controller class Nest will attach middleware to every path defined within this controller. * * @param {} ...routes - * @returns MiddlewaresConsumer + * @returns {MiddlewaresConsumer} */ forRoutes(...routes: (string | Type)[]): MiddlewaresConsumer; } diff --git a/packages/common/interfaces/middlewares/middlewares-consumer.interface.ts b/packages/common/interfaces/middlewares/middlewares-consumer.interface.ts index d2e5a1e1c..29ff418a6 100644 --- a/packages/common/interfaces/middlewares/middlewares-consumer.interface.ts +++ b/packages/common/interfaces/middlewares/middlewares-consumer.interface.ts @@ -6,7 +6,7 @@ export interface MiddlewaresConsumer { * that subsequently could be attached to the passed either routes or controllers. * * @param {any|any[]} middlewares - * @returns MiddlewareConfigProxy + * @returns {MiddlewareConfigProxy} */ apply(middlewares: any | any[]): MiddlewareConfigProxy; } diff --git a/packages/common/interfaces/nest-application-context.interface.ts b/packages/common/interfaces/nest-application-context.interface.ts index 667fd6f99..5426f7048 100644 --- a/packages/common/interfaces/nest-application-context.interface.ts +++ b/packages/common/interfaces/nest-application-context.interface.ts @@ -4,19 +4,19 @@ import { LoggerService } from '../services/logger.service'; export interface INestApplicationContext { /** * Allows navigating through the modules tree, for example, to pull out a specific instance from the selected module. - * @returns INestApplicationContext + * @returns {INestApplicationContext} */ select(module: Type): INestApplicationContext; /** * Retrieves an instance of either injectable or controller available inside the processed module, otherwise, returns null. - * @returns T + * @returns {T} */ get(typeOrToken: Type | string | symbol): T | null; /** * Retrieves an instance of either injectable or controller available inside any module, otherwise, returns null. - * @returns T + * @returns {T} */ find(typeOrToken: Type | string | symbol): T | null; } diff --git a/packages/common/interfaces/nest-application.interface.ts b/packages/common/interfaces/nest-application.interface.ts index 04d52edd0..65adee08a 100644 --- a/packages/common/interfaces/nest-application.interface.ts +++ b/packages/common/interfaces/nest-application.interface.ts @@ -10,7 +10,7 @@ export interface INestApplication extends INestApplicationContext { /** * Initializes application. It is not mandatory to call this method directly. * - * @returns Promise + * @returns {Promise} */ init(): Promise; @@ -18,14 +18,14 @@ export interface INestApplication extends INestApplicationContext { * A wrapper function around HTTP adapter method: `adapter.use()`. * Example `app.use(cors())` * - * @returns void + * @returns {void} */ use(...args): this; /** * Enables CORS (Cross-Origin Resource Sharing) * - * @returns void + * @returns {void} */ enableCors(options?: CorsOptions): this; @@ -35,7 +35,7 @@ export interface INestApplication extends INestApplicationContext { * @param {number} port * @param {string} hostname * @param {Function} callback Optional callback - * @returns Promise + * @returns {Promise} */ listen(port: number | string, callback?: () => void): Promise; listen( @@ -45,19 +45,19 @@ export interface INestApplication extends INestApplicationContext { ): Promise; /** - * Starts the application and can be awaited. + * Starts the application (can be awaited). * * @param {number} port * @param {string} hostname (optional) - * @returns Promise + * @returns {Promise} */ listenAsync(port: number | string, hostname?: string): Promise; /** - * Setups the prefix for the every HTTP route path + * Registers the prefix for the every HTTP route path * * @param {string} prefix The prefix for the every HTTP route path (for example `/v1/api`) - * @returns void + * @returns {void} */ setGlobalPrefix(prefix: string): this; @@ -66,7 +66,7 @@ export interface INestApplication extends INestApplicationContext { * Use, when you want to override default `socket.io` library. * * @param {WebSocketAdapter} adapter - * @returns void + * @returns {void} */ useWebSocketAdapter(adapter: WebSocketAdapter): this; @@ -74,21 +74,21 @@ export interface INestApplication extends INestApplicationContext { * Connects microservice to the NestApplication instance. Transforms application to the hybrid instance. * * @param {MicroserviceOptions} options Microservice options object - * @returns INestMicroservice + * @returns {INestMicroservice} */ connectMicroservice(options: MicroserviceOptions): INestMicroservice; /** - * Returns array of the connected microservices to the NestApplication. + * Returns array of the microservices connected to the NestApplication. * - * @returns INestMicroservice[] + * @returns {INestMicroservice[]} */ getMicroservices(): INestMicroservice[]; /** - * Returns underlying, native HTTP server. + * Returns an underlying, native HTTP server. * - * @returns http.Server + * @returns {http.Server} */ getHttpServer(): any; @@ -96,40 +96,40 @@ export interface INestApplication extends INestApplicationContext { * Starts all connected microservices asynchronously * * @param {Function} callback Optional callback function - * @returns void + * @returns {void} */ startAllMicroservices(callback?: () => void): this; /** * Starts all connected microservices and can be awaited * - * @returns Promise + * @returns {Promise} */ startAllMicroservicesAsync(): Promise; /** - * Setups exception filters as a global filters (will be used within every HTTP route handler) + * Registers exception filters as a global filters (will be used within every HTTP route handler) * * @param {ExceptionFilter[]} ...filters */ useGlobalFilters(...filters: ExceptionFilter[]): this; /** - * Setups pipes as a global pipes (will be used within every HTTP route handler) + * Registers pipes as a global pipes (will be used within every HTTP route handler) * * @param {PipeTransform[]} ...pipes */ useGlobalPipes(...pipes: PipeTransform[]): this; /** - * Setups interceptors as a global interceptors (will be used within every HTTP route handler) + * Registers interceptors as a global interceptors (will be used within every HTTP route handler) * * @param {NestInterceptor[]} ...interceptors */ useGlobalInterceptors(...interceptors: NestInterceptor[]): this; /** - * Setups guards as a global guards (will be used within every HTTP route handler) + * Registers guards as a global guards (will be used within every HTTP route handler) * * @param {CanActivate[]} ...guards */ @@ -138,7 +138,7 @@ export interface INestApplication extends INestApplicationContext { /** * Terminates the application (both NestApplication, Gateways and each connected microservice) * - * @returns void + * @returns {void} */ close(): void; } diff --git a/packages/common/interfaces/nest-express-application.interface.ts b/packages/common/interfaces/nest-express-application.interface.ts index d00b3e40a..2b0cb89c1 100644 --- a/packages/common/interfaces/nest-express-application.interface.ts +++ b/packages/common/interfaces/nest-express-application.interface.ts @@ -6,7 +6,7 @@ export interface INestExpressApplication { * A wrapper function around native `express.set()` method. * Example `app.set('trust proxy', 'loopback')` * - * @returns this + * @returns {this} */ set(...args): this; @@ -14,7 +14,7 @@ export interface INestExpressApplication { * A wrapper function around native `express.engine()` method. * Example `app.engine('mustache', mustacheExpress())` * - * @returns this + * @returns {this} */ engine(...args): this; @@ -22,7 +22,7 @@ export interface INestExpressApplication { * A wrapper function around native `express.enable()` method. * Example `app.enable('x-powered-by')` * - * @returns this + * @returns {this} */ enable(...args): this; @@ -30,7 +30,7 @@ export interface INestExpressApplication { * A wrapper function around native `express.disable()` method. * Example `app.disable('x-powered-by')` * - * @returns this + * @returns {this} */ disable(...args): this; @@ -38,7 +38,7 @@ export interface INestExpressApplication { * Sets a base directory for public assets. * Example `app.useStaticAssets('public') * - * @returns this + * @returns {this} */ useStaticAssets(options: any): this; useStaticAssets(path: string, options?: ServeStaticOptions); @@ -48,7 +48,7 @@ export interface INestExpressApplication { * Sets a base directory for templates (views). * Example `app.setBaseViewsDir('views')` * - * @returns this + * @returns {this} */ setBaseViewsDir(path: string): this; @@ -56,7 +56,7 @@ export interface INestExpressApplication { * Sets a view engine for templates (views). * Example `app.setViewEngine('pug')` * - * @returns this + * @returns {this} */ setViewEngine(engine: string): this; } diff --git a/packages/common/interfaces/nest-fastify-application.interface.ts b/packages/common/interfaces/nest-fastify-application.interface.ts index e1a03bcd4..afa20b8a4 100644 --- a/packages/common/interfaces/nest-fastify-application.interface.ts +++ b/packages/common/interfaces/nest-fastify-application.interface.ts @@ -3,7 +3,7 @@ export interface INestFastifyApplication { * A wrapper function around native `fastify.register()` method. * Example `app.register(require('fastify-formbody'))` * - * @returns this + * @returns {this} */ register(...args): this; @@ -11,7 +11,7 @@ export interface INestFastifyApplication { * Sets a base directory for public assets. * Example `app.useStaticAssets({ root: 'public' })` * - * @returns this + * @returns {this} */ useStaticAssets(options: { root: string; @@ -23,13 +23,13 @@ export interface INestFastifyApplication { /** * Sets a view engine for templates (views), for example: `pug`, `handlebars`, or `ejs`. * - * @returns this + * @returns {this} */ setViewEngine(options: any): this; /** * A wrapper function around native `fastify.inject()` method. - * @returns void + * @returns {void} */ inject(opts: HTTPInjectOptions | string): Promise; } diff --git a/packages/common/interfaces/nest-microservice.interface.ts b/packages/common/interfaces/nest-microservice.interface.ts index 44ab67afc..dd339ad19 100644 --- a/packages/common/interfaces/nest-microservice.interface.ts +++ b/packages/common/interfaces/nest-microservice.interface.ts @@ -10,49 +10,49 @@ export interface INestMicroservice extends INestApplicationContext { * Starts the microservice. * * @param {Function} callback - * @returns Promise + * @returns {Promise} */ listen(callback: () => void); /** - * Starts the microservice and can be awaited. + * Starts the microservice (can be awaited). * - * @returns Promise + * @returns {Promise} */ listenAsync(): Promise; /** - * Setup Ws Adapter which will be used inside Gateways. + * Register Ws Adapter which will be used inside Gateways. * Use, when you want to override default `socket.io` library. * * @param {WebSocketAdapter} adapter - * @returns void + * @returns {void} */ useWebSocketAdapter(adapter: WebSocketAdapter): this; /** - * Setups exception filters as a global filters (will be used within every message pattern handler) + * Registers exception filters as a global filters (will be used within every message pattern handler) * * @param {ExceptionFilter[]} ...filters */ useGlobalFilters(...filters: ExceptionFilter[]): this; /** - * Setups pipes as a global pipes (will be used within every message pattern handler) + * Registers pipes as a global pipes (will be used within every message pattern handler) * * @param {PipeTransform[]} ...pipes */ useGlobalPipes(...pipes: PipeTransform[]): this; /** - * Setups interceptors as a global interceptors (will be used within every message pattern handler) + * Registers interceptors as a global interceptors (will be used within every message pattern handler) * * @param {NestInterceptor[]} ...interceptors */ useGlobalInterceptors(...interceptors: NestInterceptor[]): this; /** - * Setups guards as a global guards (will be used within every message pattern handler) + * Registers guards as a global guards (will be used within every message pattern handler) * * @param {CanActivate[]} ...guards */ @@ -61,7 +61,7 @@ export interface INestMicroservice extends INestApplicationContext { /** * Terminates the application (both NestMicroservice and Gateways) * - * @returns void + * @returns {void} */ close(): void; } diff --git a/packages/core/errors/exceptions/unknown-element.exception.ts b/packages/core/errors/exceptions/unknown-element.exception.ts new file mode 100644 index 000000000..1f44df251 --- /dev/null +++ b/packages/core/errors/exceptions/unknown-element.exception.ts @@ -0,0 +1,9 @@ +import { RuntimeException } from './runtime.exception'; + +export class UnknownElementException extends RuntimeException { + constructor() { + super( + 'Nest cannot find given element (it does not exist in current context)', + ); + } +} diff --git a/packages/core/errors/exceptions/unknown-module.exception.ts b/packages/core/errors/exceptions/unknown-module.exception.ts index 091bad81e..75ef4d294 100644 --- a/packages/core/errors/exceptions/unknown-module.exception.ts +++ b/packages/core/errors/exceptions/unknown-module.exception.ts @@ -2,6 +2,8 @@ import { RuntimeException } from './runtime.exception'; export class UnknownModuleException extends RuntimeException { constructor() { - super(); + super( + 'Nest cannot select given module (it does not exist in current context)', + ); } } diff --git a/packages/core/exceptions/base-exception-filter-context.ts b/packages/core/exceptions/base-exception-filter-context.ts index 876c15038..c5e211735 100644 --- a/packages/core/exceptions/base-exception-filter-context.ts +++ b/packages/core/exceptions/base-exception-filter-context.ts @@ -13,7 +13,6 @@ import { } from '@nestjs/common/utils/shared.utils'; import { Type } from '@nestjs/common/interfaces/index'; import { ExceptionFilterMetadata } from '@nestjs/common/interfaces/exceptions/exception-filter-metadata.interface'; -import { UnknownModuleException } from '../errors/exceptions/unknown-module.exception'; import { ExceptionFilter } from '@nestjs/common/interfaces/exceptions/exception-filter.interface'; import { RouterProxyCallback } from './../router/router-proxy'; import { ContextCreator } from './../helpers/context-creator'; diff --git a/packages/core/nest-application-context.ts b/packages/core/nest-application-context.ts index 58782280e..540ccd5e4 100644 --- a/packages/core/nest-application-context.ts +++ b/packages/core/nest-application-context.ts @@ -1,8 +1,16 @@ +import iterate from 'iterare'; import { ModuleTokenFactory } from './injector/module-token-factory'; import { NestContainer, InstanceWrapper } from './injector/container'; import { Type } from '@nestjs/common/interfaces/type.interface'; -import { isFunction } from '@nestjs/common/utils/shared.utils'; -import { INestApplicationContext } from '@nestjs/common'; +import { + isFunction, + isNil, + isUndefined, +} from '@nestjs/common/utils/shared.utils'; +import { INestApplicationContext, OnModuleInit } from '@nestjs/common'; +import { Module } from './injector/module'; +import { UnknownModuleException } from './errors/exceptions/unknown-module.exception'; +import { UnknownElementException } from './errors/exceptions/unknown-element.exception'; export class NestApplicationContext implements INestApplicationContext { private readonly moduleTokenFactory = new ModuleTokenFactory(); @@ -10,8 +18,11 @@ export class NestApplicationContext implements INestApplicationContext { constructor( protected readonly container: NestContainer, private readonly scope: Type[], - protected contextModule, - ) {} + protected contextModule: Module, + isInitialized = true, + ) { + !isInitialized && this.callInitHook(); + } public selectContextModule() { const modules = this.container.getModules().values(); @@ -25,9 +36,10 @@ export class NestApplicationContext implements INestApplicationContext { const token = this.moduleTokenFactory.create(module as any, scope); const selectedModule = modules.get(token); - return selectedModule - ? new NestApplicationContext(this.container, scope, selectedModule) - : null; + if (!selectedModule) { + throw new UnknownModuleException(); + } + return new NestApplicationContext(this.container, scope, selectedModule); } public get(typeOrToken: Type | string | symbol): T | null { @@ -54,6 +66,26 @@ export class NestApplicationContext implements INestApplicationContext { return this.findInstanceByPrototypeOrToken(typeOrToken, flattenModule); } + protected callInitHook() { + const modules = this.container.getModules(); + modules.forEach(module => { + this.callModuleInitHook(module); + }); + } + + protected callModuleInitHook(module: Module) { + const components = [...module.routes, ...module.components]; + iterate(components) + .map(([key, { instance }]) => instance) + .filter(instance => !isNil(instance)) + .filter(this.hasOnModuleInitHook) + .forEach(instance => (instance as OnModuleInit).onModuleInit()); + } + + protected hasOnModuleInitHook(instance): instance is OnModuleInit { + return !isUndefined((instance as OnModuleInit).onModuleInit); + } + private findInstanceByPrototypeOrToken( metatypeOrToken: Type | string | symbol, contextModule, @@ -67,8 +99,9 @@ export class NestApplicationContext implements INestApplicationContext { ? (metatypeOrToken as any).name : metatypeOrToken; const instanceWrapper = dependencies.get(name); - return instanceWrapper - ? (instanceWrapper as InstanceWrapper).instance - : null; + if (!instanceWrapper) { + throw new UnknownElementException(); + } + return (instanceWrapper as InstanceWrapper).instance; } } diff --git a/packages/core/nest-application.ts b/packages/core/nest-application.ts index 7656e299f..44fa7c573 100644 --- a/packages/core/nest-application.ts +++ b/packages/core/nest-application.ts @@ -394,26 +394,6 @@ export class NestApplication extends NestApplicationContext }); } - private callInitHook() { - const modules = this.container.getModules(); - modules.forEach(module => { - this.callModuleInitHook(module); - }); - } - - private callModuleInitHook(module: Module) { - const components = [...module.routes, ...module.components]; - iterate(components) - .map(([key, { instance }]) => instance) - .filter(instance => !isNil(instance)) - .filter(this.hasOnModuleInitHook) - .forEach(instance => (instance as OnModuleInit).onModuleInit()); - } - - private hasOnModuleInitHook(instance): instance is OnModuleInit { - return !isUndefined((instance as OnModuleInit).onModuleInit); - } - private callDestroyHook() { const modules = this.container.getModules(); modules.forEach(module => { diff --git a/packages/core/nest-factory.ts b/packages/core/nest-factory.ts index 37f1fc29d..b19b4a6eb 100644 --- a/packages/core/nest-factory.ts +++ b/packages/core/nest-factory.ts @@ -34,8 +34,8 @@ const { NestMicroservice } = export class NestFactoryStatic { private readonly logger = new Logger('NestFactory', true); /** - * Creates an instance of the NestApplication (returns Promise) - * @returns an `Promise` of the INestApplication instance + * Creates an instance of the NestApplication + * @returns {Promise} */ public async create( module: any, @@ -78,11 +78,11 @@ export class NestFactoryStatic { } /** - * Creates an instance of the NestMicroservice (returns Promise) + * Creates an instance of the NestMicroservice * * @param {} module Entry (root) application module class * @param {NestMicroserviceOptions & MicroserviceOptions} options Optional microservice configuration - * @returns an `Promise` of the INestMicroservice instance + * @returns {Promise} */ public async createMicroservice( module, @@ -102,11 +102,11 @@ export class NestFactoryStatic { } /** - * Creates an instance of the NestApplicationContext (returns Promise) + * Creates an instance of the NestApplicationContext * * @param {} module Entry (root) application module class * @param {NestApplicationContextOptions} options Optional Nest application configuration - * @returns an `Promise` of the INestApplicationContext instance + * @returns {Promise} */ public async createApplicationContext( module, @@ -120,7 +120,7 @@ export class NestFactoryStatic { const modules = container.getModules().values(); const root = modules.next().value; return this.createNestInstance( - new NestApplicationContext(container, [], root), + new NestApplicationContext(container, [], root, false), ); } diff --git a/packages/core/router/router-exception-filters.ts b/packages/core/router/router-exception-filters.ts index 38ba77305..16c040bc6 100644 --- a/packages/core/router/router-exception-filters.ts +++ b/packages/core/router/router-exception-filters.ts @@ -13,7 +13,6 @@ import { } from '@nestjs/common/utils/shared.utils'; import { Type } from '@nestjs/common/interfaces/index'; import { ExceptionFilterMetadata } from '@nestjs/common/interfaces/exceptions/exception-filter-metadata.interface'; -import { UnknownModuleException } from '../errors/exceptions/unknown-module.exception'; import { ExceptionFilter } from '@nestjs/common/interfaces/exceptions/exception-filter.interface'; import { RouterProxyCallback } from './../router/router-proxy'; import { ApplicationConfig } from './../application-config'; diff --git a/packages/microservices/test/client/client-nats.spec.ts b/packages/microservices/test/client/client-nats.spec.ts index ba7307436..c6f1292dd 100644 --- a/packages/microservices/test/client/client-nats.spec.ts +++ b/packages/microservices/test/client/client-nats.spec.ts @@ -186,8 +186,15 @@ describe('ClientNats', () => { let createClientSpy: sinon.SinonSpy; let handleErrorsSpy: sinon.SinonSpy; + const natsClient = { + addListener: sinon.spy(), + on: sinon.spy(), + }; + beforeEach(async () => { - createClientSpy = sinon.spy(client, 'createClient'); + createClientSpy = sinon + .stub(client, 'createClient') + .callsFake(() => natsClient); handleErrorsSpy = sinon.spy(client, 'handleError'); await client.init(sinon.spy()); }); diff --git a/sample/08-webpack/src/main.ts b/sample/08-webpack/src/main.ts index 03ef141bb..697d59f0a 100644 --- a/sample/08-webpack/src/main.ts +++ b/sample/08-webpack/src/main.ts @@ -1,15 +1,15 @@ import { NestFactory } from '@nestjs/core'; import { ApplicationModule } from './app.module'; -declare var module: any; +declare const module: any; async function bootstrap() { const app = await NestFactory.create(ApplicationModule); await app.listen(3000); - + if (module.hot) { module.hot.accept(); module.hot.dispose(() => app.close()); } -} +} bootstrap(); diff --git a/sample/18-context/.gitignore b/sample/18-context/.gitignore new file mode 100644 index 000000000..b5e5f9755 --- /dev/null +++ b/sample/18-context/.gitignore @@ -0,0 +1,21 @@ +# dependencies +/node_modules + +# IDE +/.idea +/.awcache +/.vscode + +# misc +npm-debug.log + +# example +/quick-start + +# tests +/test +/coverage +/.nyc_output + +# dist +/dist \ No newline at end of file diff --git a/sample/18-context/package.json b/sample/18-context/package.json new file mode 100644 index 000000000..12be03f31 --- /dev/null +++ b/sample/18-context/package.json @@ -0,0 +1,24 @@ +{ + "name": "nest-typescript-starter", + "version": "1.0.0", + "description": "Nest TypeScript starter repository", + "license": "MIT", + "scripts": { + "start": "ts-node src/main" + }, + "dependencies": { + "@nestjs/common": "^4.5.9", + "@nestjs/core": "^4.6.4", + "@nestjs/microservices": "^4.5.8", + "@nestjs/testing": "^4.5.5", + "@nestjs/websockets": "^4.5.8", + "reflect-metadata": "^0.1.12", + "rxjs": "^5.5.6", + "typescript": "^2.6.2" + }, + "devDependencies": { + "@types/node": "^9.3.0", + "ts-loader": "^4.0.0", + "ts-node": "^4.1.0" + } +} diff --git a/sample/18-context/src/app.controller.ts b/sample/18-context/src/app.controller.ts new file mode 100644 index 000000000..95635ee2f --- /dev/null +++ b/sample/18-context/src/app.controller.ts @@ -0,0 +1,12 @@ +import { Get, Controller } from '@nestjs/common'; +import { AppService } from './app.service'; + +@Controller() +export class AppController { + constructor(private readonly appService: AppService) {} + + @Get() + root(): string { + return this.appService.get(); + } +} diff --git a/sample/18-context/src/app.module.ts b/sample/18-context/src/app.module.ts new file mode 100644 index 000000000..d6ab4b66c --- /dev/null +++ b/sample/18-context/src/app.module.ts @@ -0,0 +1,10 @@ +import { Module } from '@nestjs/common'; +import { AppController } from './app.controller'; +import { AppService } from './app.service'; + +@Module({ + imports: [], + controllers: [AppController], + providers: [AppService], +}) +export class ApplicationModule {} diff --git a/sample/18-context/src/app.service.ts b/sample/18-context/src/app.service.ts new file mode 100644 index 000000000..1bf7d9e9d --- /dev/null +++ b/sample/18-context/src/app.service.ts @@ -0,0 +1,8 @@ +import { Injectable } from '@nestjs/common'; + +@Injectable() +export class AppService { + get() { + return 'Hello world!'; + } +} diff --git a/sample/18-context/src/main.ts b/sample/18-context/src/main.ts new file mode 100644 index 000000000..56c441bca --- /dev/null +++ b/sample/18-context/src/main.ts @@ -0,0 +1,10 @@ +import { NestFactory } from '@nestjs/core'; +import { ApplicationModule } from './app.module'; +import { AppService } from './app.service'; + +async function bootstrap() { + const app = await NestFactory.createApplicationContext(ApplicationModule); + const appService = app.find(AppService); + console.log(appService.get()); +} +bootstrap(); diff --git a/sample/18-context/tsconfig.json b/sample/18-context/tsconfig.json new file mode 100644 index 000000000..9339a30cd --- /dev/null +++ b/sample/18-context/tsconfig.json @@ -0,0 +1,17 @@ +{ + "compilerOptions": { + "module": "commonjs", + "declaration": false, + "noImplicitAny": false, + "removeComments": true, + "noLib": false, + "emitDecoratorMetadata": true, + "experimentalDecorators": true, + "target": "es6", + "sourceMap": true, + "allowJs": true, + "outDir": "./dist" + }, + "include": ["src/**/*"], + "exclude": ["node_modules", "**/*.spec.ts"] +} diff --git a/sample/18-context/tslint.json b/sample/18-context/tslint.json new file mode 100644 index 000000000..4c8c3324f --- /dev/null +++ b/sample/18-context/tslint.json @@ -0,0 +1,29 @@ +{ + "defaultSeverity": "error", + "extends": ["tslint:recommended"], + "jsRules": { + "no-unused-expression": true + }, + "rules": { + "eofline": false, + "quotemark": [true, "single"], + "indent": false, + "member-access": [false], + "ordered-imports": [false], + "max-line-length": [150], + "member-ordering": [false], + "curly": false, + "interface-name": [false], + "array-type": [false], + "no-empty-interface": false, + "no-empty": false, + "arrow-parens": false, + "object-literal-sort-keys": false, + "no-unused-expression": false, + "max-classes-per-file": [false], + "variable-name": [false], + "one-line": [false], + "one-variable-per-declaration": [false] + }, + "rulesDirectory": [] +} diff --git a/sample/18-context/yarn.lock b/sample/18-context/yarn.lock new file mode 100644 index 000000000..92c9ba732 --- /dev/null +++ b/sample/18-context/yarn.lock @@ -0,0 +1,5742 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@angular/core@^5.2.3": + version "5.2.6" + resolved "https://registry.yarnpkg.com/@angular/core/-/core-5.2.6.tgz#483fb0b720d563d3ec4d1895878249beafa39b9b" + dependencies: + tslib "^1.7.1" + +"@angular/platform-server@^5.2.3": + version "5.2.6" + resolved "https://registry.yarnpkg.com/@angular/platform-server/-/platform-server-5.2.6.tgz#9a218acabd7a95b215ad8884f2f1d03d6faed024" + dependencies: + domino "^1.0.29" + tslib "^1.7.1" + xhr2 "^0.1.4" + +"@nestjs/common@^4.5.9": + version "4.6.4" + resolved "https://registry.yarnpkg.com/@nestjs/common/-/common-4.6.4.tgz#c71be24117f6d93e7d4494927a9d2267c50af931" + dependencies: + axios "0.17.1" + class-transformer "0.1.8" + class-validator "0.8.1" + cli-color "1.1.0" + +"@nestjs/core@^4.6.4": + version "4.6.4" + resolved "https://registry.yarnpkg.com/@nestjs/core/-/core-4.6.4.tgz#bd9e682f7f51008f4a20d0a1c1e0df2265383d4a" + dependencies: + body-parser "1.17.2" + cors "2.8.4" + express "4.16.2" + iterare "0.0.8" + multer "1.3.0" + optional "0.1.4" + +"@nestjs/microservices@^4.5.8": + version "4.6.4" + resolved "https://registry.yarnpkg.com/@nestjs/microservices/-/microservices-4.6.4.tgz#be9993e037b05c36e88550ddb7100cf6f8726255" + dependencies: + iterare "0.0.8" + json-socket "^0.2.1" + optional "0.1.4" + redis "^2.7.1" + +"@nestjs/testing@^4.5.5": + version "4.6.1" + resolved "https://registry.yarnpkg.com/@nestjs/testing/-/testing-4.6.1.tgz#82b63bfbe7cdadf0d126d0c8b169eef948a8aa17" + dependencies: + optional "0.1.4" + +"@nestjs/websockets@^4.5.8": + version "4.5.8" + resolved "https://registry.yarnpkg.com/@nestjs/websockets/-/websockets-4.5.8.tgz#d271a8f38035c77c44df68591497ca0536c01131" + dependencies: + iterare "0.0.8" + socket.io "^2.0.3" + +"@types/node@^9.3.0": + version "9.4.6" + resolved "https://registry.yarnpkg.com/@types/node/-/node-9.4.6.tgz#d8176d864ee48753d053783e4e463aec86b8d82e" + +"@types/strip-bom@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/strip-bom/-/strip-bom-3.0.0.tgz#14a8ec3956c2e81edb7520790aecf21c290aebd2" + +"@types/strip-json-comments@0.0.30": + version "0.0.30" + resolved "https://registry.yarnpkg.com/@types/strip-json-comments/-/strip-json-comments-0.0.30.tgz#9aa30c04db212a9a0649d6ae6fd50accc40748a1" + +abbrev@1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + +accepts@~1.3.4: + version "1.3.4" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.4.tgz#86246758c7dd6d21a6474ff084a4740ec05eb21f" + dependencies: + mime-types "~2.1.16" + negotiator "0.6.1" + +acorn-dynamic-import@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-3.0.0.tgz#901ceee4c7faaef7e07ad2a47e890675da50a278" + dependencies: + acorn "^5.0.0" + +acorn@^5.0.0: + version "5.4.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.4.1.tgz#fdc58d9d17f4a4e98d102ded826a9b9759125102" + +after@0.8.2: + version "0.8.2" + resolved "https://registry.yarnpkg.com/after/-/after-0.8.2.tgz#fedb394f9f0e02aa9768e702bda23b505fae7e1f" + +ajv-keywords@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.1.0.tgz#ac2b27939c543e95d2c06e7f7f5c27be4aa543be" + +ajv@^4.9.1: + version "4.11.8" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.8.tgz#82ffb02b29e662ae53bdc20af15947706739c536" + dependencies: + co "^4.6.0" + json-stable-stringify "^1.0.1" + +ajv@^6.1.0: + version "6.1.1" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.1.1.tgz#978d597fbc2b7d0e5a5c3ddeb149a682f2abfa0e" + dependencies: + fast-deep-equal "^1.0.0" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.3.0" + +ansi-align@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-2.0.0.tgz#c36aeccba563b89ceb556f3690f0b1d9e3547f7f" + dependencies: + string-width "^2.0.0" + +ansi-escapes@^1.0.0, ansi-escapes@^1.1.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e" + +ansi-escapes@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.0.0.tgz#ec3e8b4e9f8064fc02c3ac9b65f1c275bda8ef92" + +ansi-regex@2, ansi-regex@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + +ansi-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" + +ansi-styles@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" + +ansi-styles@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.0.tgz#c159b8d5be0f9e5a6f346dab94f16ce022161b88" + dependencies: + color-convert "^1.9.0" + +ansi-styles@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-1.0.0.tgz#cb102df1c56f5123eab8b67cd7b98027a0279178" + +anymatch@^1.3.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.2.tgz#553dcb8f91e3c889845dfdba34c77721b90b9d7a" + dependencies: + micromatch "^2.1.5" + normalize-path "^2.0.0" + +anymatch@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" + dependencies: + micromatch "^3.1.4" + normalize-path "^2.1.1" + +append-field@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/append-field/-/append-field-0.1.0.tgz#6ddc58fa083c7bc545d3c5995b2830cc2366d44a" + +aproba@^1.0.3, aproba@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" + +are-we-there-yet@~1.1.2: + version "1.1.4" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz#bb5dca382bb94f05e15194373d16fd3ba1ca110d" + dependencies: + delegates "^1.0.0" + readable-stream "^2.0.6" + +argv@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/argv/-/argv-0.0.2.tgz#ecbd16f8949b157183711b1bda334f37840185ab" + +arr-diff@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" + dependencies: + arr-flatten "^1.0.1" + +arr-diff@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" + +arr-flatten@^1.0.1, arr-flatten@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" + +arr-union@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" + +array-differ@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-1.0.0.tgz#eff52e3758249d33be402b8bb8e564bb2b5d4031" + +array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" + +array-union@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" + dependencies: + array-uniq "^1.0.1" + +array-uniq@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" + +array-unique@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" + +array-unique@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" + +arraybuffer.slice@~0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz#3bbc4275dd584cc1b10809b89d4e8b63a69e7675" + +arrify@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" + +asn1.js@^4.0.0: + version "4.10.1" + resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.10.1.tgz#b9c2bf5805f1e64aadeed6df3a2bfafb5a73f5a0" + dependencies: + bn.js "^4.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + +asn1@~0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86" + +assert-plus@1.0.0, assert-plus@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + +assert-plus@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234" + +assert@^1.1.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/assert/-/assert-1.4.1.tgz#99912d591836b5a6f5b345c0f07eefc08fc65d91" + dependencies: + util "0.10.3" + +assign-symbols@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" + +ast-types@0.10.1: + version "0.10.1" + resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.10.1.tgz#f52fca9715579a14f841d67d7f8d25432ab6a3dd" + +ast-types@0.10.2: + version "0.10.2" + resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.10.2.tgz#aef76a04fde54634976fc94defaad1a67e2eadb0" + +async-each@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" + +async-limiter@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.0.tgz#78faed8c3d074ab81f22b4e985d79e8738f720f8" + +async@^1.5.0: + version "1.5.2" + resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" + +async@^2.0.0, async@^2.1.2: + version "2.6.0" + resolved "https://registry.yarnpkg.com/async/-/async-2.6.0.tgz#61a29abb6fcc026fea77e56d1c6ec53a795951f4" + dependencies: + lodash "^4.14.0" + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + +atob@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/atob/-/atob-2.0.3.tgz#19c7a760473774468f20b2d2d03372ad7d4cbf5d" + +aws-sign2@~0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f" + +aws4@^1.2.1: + version "1.6.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e" + +axios@0.17.1: + version "0.17.1" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.17.1.tgz#2d8e3e5d0bdbd7327f91bc814f5c57660f81824d" + dependencies: + follow-redirects "^1.2.5" + is-buffer "^1.1.5" + +babel-code-frame@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" + dependencies: + chalk "^1.1.3" + esutils "^2.0.2" + js-tokens "^3.0.2" + +babel-core@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.0.tgz#af32f78b31a6fcef119c87b0fd8d9753f03a0bb8" + dependencies: + babel-code-frame "^6.26.0" + babel-generator "^6.26.0" + babel-helpers "^6.24.1" + babel-messages "^6.23.0" + babel-register "^6.26.0" + babel-runtime "^6.26.0" + babel-template "^6.26.0" + babel-traverse "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + convert-source-map "^1.5.0" + debug "^2.6.8" + json5 "^0.5.1" + lodash "^4.17.4" + minimatch "^3.0.4" + path-is-absolute "^1.0.1" + private "^0.1.7" + slash "^1.0.0" + source-map "^0.5.6" + +babel-generator@^6.26.0: + version "6.26.1" + resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90" + dependencies: + babel-messages "^6.23.0" + babel-runtime "^6.26.0" + babel-types "^6.26.0" + detect-indent "^4.0.0" + jsesc "^1.3.0" + lodash "^4.17.4" + source-map "^0.5.7" + trim-right "^1.0.1" + +babel-helper-bindify-decorators@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-bindify-decorators/-/babel-helper-bindify-decorators-6.24.1.tgz#14c19e5f142d7b47f19a52431e52b1ccbc40a330" + dependencies: + babel-runtime "^6.22.0" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-builder-binary-assignment-operator-visitor@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz#cce4517ada356f4220bcae8a02c2b346f9a56664" + dependencies: + babel-helper-explode-assignable-expression "^6.24.1" + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-call-delegate@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d" + dependencies: + babel-helper-hoist-variables "^6.24.1" + babel-runtime "^6.22.0" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-define-map@^6.24.1: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz#a5f56dab41a25f97ecb498c7ebaca9819f95be5f" + dependencies: + babel-helper-function-name "^6.24.1" + babel-runtime "^6.26.0" + babel-types "^6.26.0" + lodash "^4.17.4" + +babel-helper-explode-assignable-expression@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz#f25b82cf7dc10433c55f70592d5746400ac22caa" + dependencies: + babel-runtime "^6.22.0" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-explode-class@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-explode-class/-/babel-helper-explode-class-6.24.1.tgz#7dc2a3910dee007056e1e31d640ced3d54eaa9eb" + dependencies: + babel-helper-bindify-decorators "^6.24.1" + babel-runtime "^6.22.0" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-function-name@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9" + dependencies: + babel-helper-get-function-arity "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-get-function-arity@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz#8f7782aa93407c41d3aa50908f89b031b1b6853d" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-hoist-variables@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz#1ecb27689c9d25513eadbc9914a73f5408be7a76" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-optimise-call-expression@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz#f7a13427ba9f73f8f4fa993c54a97882d1244257" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-regex@^6.24.1: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz#325c59f902f82f24b74faceed0363954f6495e72" + dependencies: + babel-runtime "^6.26.0" + babel-types "^6.26.0" + lodash "^4.17.4" + +babel-helper-remap-async-to-generator@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz#5ec581827ad723fecdd381f1c928390676e4551b" + dependencies: + babel-helper-function-name "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-replace-supers@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz#bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a" + dependencies: + babel-helper-optimise-call-expression "^6.24.1" + babel-messages "^6.23.0" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helpers@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2" + dependencies: + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-messages@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-check-es2015-constants@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz#35157b101426fd2ffd3da3f75c7d1e91835bbf8a" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-syntax-async-functions@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95" + +babel-plugin-syntax-async-generators@^6.5.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-generators/-/babel-plugin-syntax-async-generators-6.13.0.tgz#6bc963ebb16eccbae6b92b596eb7f35c342a8b9a" + +babel-plugin-syntax-class-constructor-call@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-class-constructor-call/-/babel-plugin-syntax-class-constructor-call-6.18.0.tgz#9cb9d39fe43c8600bec8146456ddcbd4e1a76416" + +babel-plugin-syntax-class-properties@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz#d7eb23b79a317f8543962c505b827c7d6cac27de" + +babel-plugin-syntax-decorators@^6.13.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-decorators/-/babel-plugin-syntax-decorators-6.13.0.tgz#312563b4dbde3cc806cee3e416cceeaddd11ac0b" + +babel-plugin-syntax-dynamic-import@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz#8d6a26229c83745a9982a441051572caa179b1da" + +babel-plugin-syntax-exponentiation-operator@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz#9ee7e8337290da95288201a6a57f4170317830de" + +babel-plugin-syntax-export-extensions@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-export-extensions/-/babel-plugin-syntax-export-extensions-6.13.0.tgz#70a1484f0f9089a4e84ad44bac353c95b9b12721" + +babel-plugin-syntax-flow@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz#4c3ab20a2af26aa20cd25995c398c4eb70310c8d" + +babel-plugin-syntax-object-rest-spread@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5" + +babel-plugin-syntax-trailing-function-commas@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz#ba0360937f8d06e40180a43fe0d5616fff532cf3" + +babel-plugin-transform-async-generator-functions@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-generator-functions/-/babel-plugin-transform-async-generator-functions-6.24.1.tgz#f058900145fd3e9907a6ddf28da59f215258a5db" + dependencies: + babel-helper-remap-async-to-generator "^6.24.1" + babel-plugin-syntax-async-generators "^6.5.0" + babel-runtime "^6.22.0" + +babel-plugin-transform-async-to-generator@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz#6536e378aff6cb1d5517ac0e40eb3e9fc8d08761" + dependencies: + babel-helper-remap-async-to-generator "^6.24.1" + babel-plugin-syntax-async-functions "^6.8.0" + babel-runtime "^6.22.0" + +babel-plugin-transform-class-constructor-call@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-class-constructor-call/-/babel-plugin-transform-class-constructor-call-6.24.1.tgz#80dc285505ac067dcb8d6c65e2f6f11ab7765ef9" + dependencies: + babel-plugin-syntax-class-constructor-call "^6.18.0" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-class-properties@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz#6a79763ea61d33d36f37b611aa9def81a81b46ac" + dependencies: + babel-helper-function-name "^6.24.1" + babel-plugin-syntax-class-properties "^6.8.0" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-decorators@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-decorators/-/babel-plugin-transform-decorators-6.24.1.tgz#788013d8f8c6b5222bdf7b344390dfd77569e24d" + dependencies: + babel-helper-explode-class "^6.24.1" + babel-plugin-syntax-decorators "^6.13.0" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-arrow-functions@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz#452692cb711d5f79dc7f85e440ce41b9f244d221" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-block-scoped-functions@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz#bbc51b49f964d70cb8d8e0b94e820246ce3a6141" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-block-scoping@^6.24.1: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz#d70f5299c1308d05c12f463813b0a09e73b1895f" + dependencies: + babel-runtime "^6.26.0" + babel-template "^6.26.0" + babel-traverse "^6.26.0" + babel-types "^6.26.0" + lodash "^4.17.4" + +babel-plugin-transform-es2015-classes@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz#5a4c58a50c9c9461e564b4b2a3bfabc97a2584db" + dependencies: + babel-helper-define-map "^6.24.1" + babel-helper-function-name "^6.24.1" + babel-helper-optimise-call-expression "^6.24.1" + babel-helper-replace-supers "^6.24.1" + babel-messages "^6.23.0" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-computed-properties@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz#6fe2a8d16895d5634f4cd999b6d3480a308159b3" + dependencies: + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-destructuring@^6.22.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz#997bb1f1ab967f682d2b0876fe358d60e765c56d" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-duplicate-keys@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz#73eb3d310ca969e3ef9ec91c53741a6f1576423e" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-for-of@^6.22.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz#f47c95b2b613df1d3ecc2fdb7573623c75248691" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-function-name@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz#834c89853bc36b1af0f3a4c5dbaa94fd8eacaa8b" + dependencies: + babel-helper-function-name "^6.24.1" + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-literals@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz#4f54a02d6cd66cf915280019a31d31925377ca2e" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-modules-amd@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz#3b3e54017239842d6d19c3011c4bd2f00a00d154" + dependencies: + babel-plugin-transform-es2015-modules-commonjs "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-modules-commonjs@^6.24.1: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.0.tgz#0d8394029b7dc6abe1a97ef181e00758dd2e5d8a" + dependencies: + babel-plugin-transform-strict-mode "^6.24.1" + babel-runtime "^6.26.0" + babel-template "^6.26.0" + babel-types "^6.26.0" + +babel-plugin-transform-es2015-modules-systemjs@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz#ff89a142b9119a906195f5f106ecf305d9407d23" + dependencies: + babel-helper-hoist-variables "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-modules-umd@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz#ac997e6285cd18ed6176adb607d602344ad38468" + dependencies: + babel-plugin-transform-es2015-modules-amd "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-object-super@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz#24cef69ae21cb83a7f8603dad021f572eb278f8d" + dependencies: + babel-helper-replace-supers "^6.24.1" + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-parameters@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz#57ac351ab49caf14a97cd13b09f66fdf0a625f2b" + dependencies: + babel-helper-call-delegate "^6.24.1" + babel-helper-get-function-arity "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-shorthand-properties@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz#24f875d6721c87661bbd99a4622e51f14de38aa0" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-spread@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz#d6d68a99f89aedc4536c81a542e8dd9f1746f8d1" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-sticky-regex@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz#00c1cdb1aca71112cdf0cf6126c2ed6b457ccdbc" + dependencies: + babel-helper-regex "^6.24.1" + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-template-literals@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz#a84b3450f7e9f8f1f6839d6d687da84bb1236d8d" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-typeof-symbol@^6.22.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz#dec09f1cddff94b52ac73d505c84df59dcceb372" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-unicode-regex@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz#d38b12f42ea7323f729387f18a7c5ae1faeb35e9" + dependencies: + babel-helper-regex "^6.24.1" + babel-runtime "^6.22.0" + regexpu-core "^2.0.0" + +babel-plugin-transform-exponentiation-operator@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz#2ab0c9c7f3098fa48907772bb813fe41e8de3a0e" + dependencies: + babel-helper-builder-binary-assignment-operator-visitor "^6.24.1" + babel-plugin-syntax-exponentiation-operator "^6.8.0" + babel-runtime "^6.22.0" + +babel-plugin-transform-export-extensions@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-export-extensions/-/babel-plugin-transform-export-extensions-6.22.0.tgz#53738b47e75e8218589eea946cbbd39109bbe653" + dependencies: + babel-plugin-syntax-export-extensions "^6.8.0" + babel-runtime "^6.22.0" + +babel-plugin-transform-flow-strip-types@^6.8.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.22.0.tgz#84cb672935d43714fdc32bce84568d87441cf7cf" + dependencies: + babel-plugin-syntax-flow "^6.18.0" + babel-runtime "^6.22.0" + +babel-plugin-transform-object-rest-spread@^6.22.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz#0f36692d50fef6b7e2d4b3ac1478137a963b7b06" + dependencies: + babel-plugin-syntax-object-rest-spread "^6.8.0" + babel-runtime "^6.26.0" + +babel-plugin-transform-regenerator@^6.24.1: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz#e0703696fbde27f0a3efcacf8b4dca2f7b3a8f2f" + dependencies: + regenerator-transform "^0.10.0" + +babel-plugin-transform-strict-mode@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-preset-es2015@^6.9.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-preset-es2015/-/babel-preset-es2015-6.24.1.tgz#d44050d6bc2c9feea702aaf38d727a0210538939" + dependencies: + babel-plugin-check-es2015-constants "^6.22.0" + babel-plugin-transform-es2015-arrow-functions "^6.22.0" + babel-plugin-transform-es2015-block-scoped-functions "^6.22.0" + babel-plugin-transform-es2015-block-scoping "^6.24.1" + babel-plugin-transform-es2015-classes "^6.24.1" + babel-plugin-transform-es2015-computed-properties "^6.24.1" + babel-plugin-transform-es2015-destructuring "^6.22.0" + babel-plugin-transform-es2015-duplicate-keys "^6.24.1" + babel-plugin-transform-es2015-for-of "^6.22.0" + babel-plugin-transform-es2015-function-name "^6.24.1" + babel-plugin-transform-es2015-literals "^6.22.0" + babel-plugin-transform-es2015-modules-amd "^6.24.1" + babel-plugin-transform-es2015-modules-commonjs "^6.24.1" + babel-plugin-transform-es2015-modules-systemjs "^6.24.1" + babel-plugin-transform-es2015-modules-umd "^6.24.1" + babel-plugin-transform-es2015-object-super "^6.24.1" + babel-plugin-transform-es2015-parameters "^6.24.1" + babel-plugin-transform-es2015-shorthand-properties "^6.24.1" + babel-plugin-transform-es2015-spread "^6.22.0" + babel-plugin-transform-es2015-sticky-regex "^6.24.1" + babel-plugin-transform-es2015-template-literals "^6.22.0" + babel-plugin-transform-es2015-typeof-symbol "^6.22.0" + babel-plugin-transform-es2015-unicode-regex "^6.24.1" + babel-plugin-transform-regenerator "^6.24.1" + +babel-preset-stage-1@^6.5.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-preset-stage-1/-/babel-preset-stage-1-6.24.1.tgz#7692cd7dcd6849907e6ae4a0a85589cfb9e2bfb0" + dependencies: + babel-plugin-transform-class-constructor-call "^6.24.1" + babel-plugin-transform-export-extensions "^6.22.0" + babel-preset-stage-2 "^6.24.1" + +babel-preset-stage-2@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-preset-stage-2/-/babel-preset-stage-2-6.24.1.tgz#d9e2960fb3d71187f0e64eec62bc07767219bdc1" + dependencies: + babel-plugin-syntax-dynamic-import "^6.18.0" + babel-plugin-transform-class-properties "^6.24.1" + babel-plugin-transform-decorators "^6.24.1" + babel-preset-stage-3 "^6.24.1" + +babel-preset-stage-3@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-preset-stage-3/-/babel-preset-stage-3-6.24.1.tgz#836ada0a9e7a7fa37cb138fb9326f87934a48395" + dependencies: + babel-plugin-syntax-trailing-function-commas "^6.22.0" + babel-plugin-transform-async-generator-functions "^6.24.1" + babel-plugin-transform-async-to-generator "^6.24.1" + babel-plugin-transform-exponentiation-operator "^6.24.1" + babel-plugin-transform-object-rest-spread "^6.22.0" + +babel-register@^6.26.0, babel-register@^6.9.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071" + dependencies: + babel-core "^6.26.0" + babel-runtime "^6.26.0" + core-js "^2.5.0" + home-or-tmp "^2.0.0" + lodash "^4.17.4" + mkdirp "^0.5.1" + source-map-support "^0.4.15" + +babel-runtime@^6.18.0, babel-runtime@^6.22.0, babel-runtime@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" + dependencies: + core-js "^2.4.0" + regenerator-runtime "^0.11.0" + +babel-template@^6.24.1, babel-template@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02" + dependencies: + babel-runtime "^6.26.0" + babel-traverse "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + lodash "^4.17.4" + +babel-traverse@^6.24.1, babel-traverse@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" + dependencies: + babel-code-frame "^6.26.0" + babel-messages "^6.23.0" + babel-runtime "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + debug "^2.6.8" + globals "^9.18.0" + invariant "^2.2.2" + lodash "^4.17.4" + +babel-types@^6.19.0, babel-types@^6.24.1, babel-types@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" + dependencies: + babel-runtime "^6.26.0" + esutils "^2.0.2" + lodash "^4.17.4" + to-fast-properties "^1.0.3" + +babylon@^6.17.3, babylon@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" + +backo2@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/backo2/-/backo2-1.0.2.tgz#31ab1ac8b129363463e35b3ebb69f4dfcfba7947" + +balanced-match@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" + +base64-arraybuffer@0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz#73926771923b5a19747ad666aa5cd4bf9c6e9ce8" + +base64-js@^1.0.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.2.3.tgz#fb13668233d9614cf5fb4bce95a9ba4096cdf801" + +base64id@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/base64id/-/base64id-1.0.0.tgz#47688cb99bb6804f0e06d3e763b1c32e57d8e6b6" + +base@^0.11.1: + version "0.11.2" + resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" + dependencies: + cache-base "^1.0.1" + class-utils "^0.3.5" + component-emitter "^1.2.1" + define-property "^1.0.0" + isobject "^3.0.1" + mixin-deep "^1.2.0" + pascalcase "^0.1.1" + +bcrypt-pbkdf@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d" + dependencies: + tweetnacl "^0.14.3" + +better-assert@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/better-assert/-/better-assert-1.0.2.tgz#40866b9e1b9e0b55b481894311e68faffaebc522" + dependencies: + callsite "1.0.0" + +big.js@^3.1.3: + version "3.2.0" + resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.2.0.tgz#a5fc298b81b9e0dca2e458824784b65c52ba588e" + +binary-extensions@^1.0.0: + version "1.11.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.11.0.tgz#46aa1751fb6a2f93ee5e689bb1087d4b14c6c205" + +binaryextensions@2: + version "2.1.1" + resolved "https://registry.yarnpkg.com/binaryextensions/-/binaryextensions-2.1.1.tgz#3209a51ca4a4ad541a3b8d3d6a6d5b83a2485935" + +blob@0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/blob/-/blob-0.0.4.tgz#bcf13052ca54463f30f9fc7e95b9a47630a94921" + +block-stream@*: + version "0.0.9" + resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" + dependencies: + inherits "~2.0.0" + +bluebird@^3.5.1: + version "3.5.1" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.1.tgz#d9551f9de98f1fcda1e683d17ee91a0602ee2eb9" + +bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0: + version "4.11.8" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f" + +body-parser@1.17.2: + version "1.17.2" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.17.2.tgz#f8892abc8f9e627d42aedafbca66bf5ab99104ee" + dependencies: + bytes "2.4.0" + content-type "~1.0.2" + debug "2.6.7" + depd "~1.1.0" + http-errors "~1.6.1" + iconv-lite "0.4.15" + on-finished "~2.3.0" + qs "6.4.0" + raw-body "~2.2.0" + type-is "~1.6.15" + +body-parser@1.18.2: + version "1.18.2" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.18.2.tgz#87678a19d84b47d859b83199bd59bce222b10454" + dependencies: + bytes "3.0.0" + content-type "~1.0.4" + debug "2.6.9" + depd "~1.1.1" + http-errors "~1.6.2" + iconv-lite "0.4.19" + on-finished "~2.3.0" + qs "6.5.1" + raw-body "2.3.2" + type-is "~1.6.15" + +boom@2.x.x: + version "2.10.1" + resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f" + dependencies: + hoek "2.x.x" + +boxen@^1.2.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/boxen/-/boxen-1.3.0.tgz#55c6c39a8ba58d9c61ad22cd877532deb665a20b" + dependencies: + ansi-align "^2.0.0" + camelcase "^4.0.0" + chalk "^2.0.1" + cli-boxes "^1.0.0" + string-width "^2.0.0" + term-size "^1.2.0" + widest-line "^2.0.0" + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^1.8.2: + version "1.8.5" + resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" + dependencies: + expand-range "^1.8.1" + preserve "^0.2.0" + repeat-element "^1.1.2" + +braces@^2.3.0, braces@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.1.tgz#7086c913b4e5a08dbe37ac0ee6a2500c4ba691bb" + dependencies: + arr-flatten "^1.1.0" + array-unique "^0.3.2" + define-property "^1.0.0" + extend-shallow "^2.0.1" + fill-range "^4.0.0" + isobject "^3.0.1" + kind-of "^6.0.2" + repeat-element "^1.1.2" + snapdragon "^0.8.1" + snapdragon-node "^2.0.1" + split-string "^3.0.2" + to-regex "^3.0.1" + +brorand@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" + +browserify-aes@^1.0.0, browserify-aes@^1.0.4: + version "1.1.1" + resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.1.1.tgz#38b7ab55edb806ff2dcda1a7f1620773a477c49f" + dependencies: + buffer-xor "^1.0.3" + cipher-base "^1.0.0" + create-hash "^1.1.0" + evp_bytestokey "^1.0.3" + inherits "^2.0.1" + safe-buffer "^5.0.1" + +browserify-cipher@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.0.tgz#9988244874bf5ed4e28da95666dcd66ac8fc363a" + dependencies: + browserify-aes "^1.0.4" + browserify-des "^1.0.0" + evp_bytestokey "^1.0.0" + +browserify-des@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.0.tgz#daa277717470922ed2fe18594118a175439721dd" + dependencies: + cipher-base "^1.0.1" + des.js "^1.0.0" + inherits "^2.0.1" + +browserify-rsa@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524" + dependencies: + bn.js "^4.1.0" + randombytes "^2.0.1" + +browserify-sign@^4.0.0: + version "4.0.4" + resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.0.4.tgz#aa4eb68e5d7b658baa6bf6a57e630cbd7a93d298" + dependencies: + bn.js "^4.1.1" + browserify-rsa "^4.0.0" + create-hash "^1.1.0" + create-hmac "^1.1.2" + elliptic "^6.0.0" + inherits "^2.0.1" + parse-asn1 "^5.0.0" + +browserify-zlib@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f" + dependencies: + pako "~1.0.5" + +buffer-xor@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" + +buffer@^4.3.0: + version "4.9.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.1.tgz#6d1bb601b07a4efced97094132093027c95bc298" + dependencies: + base64-js "^1.0.2" + ieee754 "^1.1.4" + isarray "^1.0.0" + +builtin-modules@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" + +builtin-status-codes@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" + +busboy@^0.2.11: + version "0.2.14" + resolved "https://registry.yarnpkg.com/busboy/-/busboy-0.2.14.tgz#6c2a622efcf47c57bbbe1e2a9c37ad36c7925453" + dependencies: + dicer "0.2.5" + readable-stream "1.1.x" + +bytes@2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-2.4.0.tgz#7d97196f9d5baf7f6935e25985549edd2a6c2339" + +bytes@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" + +cacache@^10.0.1: + version "10.0.4" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-10.0.4.tgz#6452367999eff9d4188aefd9a14e9d7c6a263460" + dependencies: + bluebird "^3.5.1" + chownr "^1.0.1" + glob "^7.1.2" + graceful-fs "^4.1.11" + lru-cache "^4.1.1" + mississippi "^2.0.0" + mkdirp "^0.5.1" + move-concurrently "^1.0.1" + promise-inflight "^1.0.1" + rimraf "^2.6.2" + ssri "^5.2.4" + unique-filename "^1.1.0" + y18n "^4.0.0" + +cache-base@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" + dependencies: + collection-visit "^1.0.0" + component-emitter "^1.2.1" + get-value "^2.0.6" + has-value "^1.0.0" + isobject "^3.0.1" + set-value "^2.0.0" + to-object-path "^0.3.0" + union-value "^1.0.0" + unset-value "^1.0.0" + +callsite@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/callsite/-/callsite-1.0.0.tgz#280398e5d664bd74038b6f0905153e6e8af1bc20" + +camelcase@^4.0.0, camelcase@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" + +capture-stack-trace@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz#4a6fa07399c26bba47f0b2496b4d0fb408c5550d" + +caseless@~0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + +chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" + dependencies: + ansi-styles "^2.2.1" + escape-string-regexp "^1.0.2" + has-ansi "^2.0.0" + strip-ansi "^3.0.0" + supports-color "^2.0.0" + +chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.3.1.tgz#523fe2678aec7b04e8041909292fe8b17059b796" + dependencies: + ansi-styles "^3.2.0" + escape-string-regexp "^1.0.5" + supports-color "^5.2.0" + +chalk@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-0.4.0.tgz#5199a3ddcd0c1efe23bc08c1b027b06176e0c64f" + dependencies: + ansi-styles "~1.0.0" + has-color "~0.1.0" + strip-ansi "~0.1.0" + +chardet@^0.4.0: + version "0.4.2" + resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.4.2.tgz#b5473b33dc97c424e5d98dc87d55d4d8a29c8bf2" + +chokidar@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468" + dependencies: + anymatch "^1.3.0" + async-each "^1.0.0" + glob-parent "^2.0.0" + inherits "^2.0.1" + is-binary-path "^1.0.0" + is-glob "^2.0.0" + path-is-absolute "^1.0.0" + readdirp "^2.0.0" + optionalDependencies: + fsevents "^1.0.0" + +chokidar@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.0.2.tgz#4dc65139eeb2714977735b6a35d06e97b494dfd7" + dependencies: + anymatch "^2.0.0" + async-each "^1.0.0" + braces "^2.3.0" + glob-parent "^3.1.0" + inherits "^2.0.1" + is-binary-path "^1.0.0" + is-glob "^4.0.0" + normalize-path "^2.1.1" + path-is-absolute "^1.0.0" + readdirp "^2.0.0" + upath "^1.0.0" + optionalDependencies: + fsevents "^1.0.0" + +chownr@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.0.1.tgz#e2a75042a9551908bebd25b8523d5f9769d79181" + +chrome-trace-event@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-0.1.2.tgz#90f36885d5345a50621332f0717b595883d5d982" + +cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +class-transformer@0.1.8: + version "0.1.8" + resolved "https://registry.yarnpkg.com/class-transformer/-/class-transformer-0.1.8.tgz#be04dd2afb7b301e4c8c79c5349fedaac3d5a7e1" + +class-utils@^0.3.5: + version "0.3.6" + resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" + dependencies: + arr-union "^3.1.0" + define-property "^0.2.5" + isobject "^3.0.0" + static-extend "^0.1.1" + +class-validator@0.8.1: + version "0.8.1" + resolved "https://registry.yarnpkg.com/class-validator/-/class-validator-0.8.1.tgz#f5efd5c613927e3c2f68692e8f14d53a2644fb2f" + dependencies: + validator "9.2.0" + +cli-boxes@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143" + +cli-color@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/cli-color/-/cli-color-1.1.0.tgz#de188cdc4929d83b67aea04110fbed40fdbf6775" + dependencies: + ansi-regex "2" + d "^0.1.1" + es5-ext "^0.10.8" + es6-iterator "2" + memoizee "^0.3.9" + timers-ext "0.1" + +cli-cursor@^1.0.1, cli-cursor@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-1.0.2.tgz#64da3f7d56a54412e59794bd62dc35295e8f2987" + dependencies: + restore-cursor "^1.0.1" + +cli-cursor@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" + dependencies: + restore-cursor "^2.0.0" + +cli-spinners@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-0.1.2.tgz#bb764d88e185fb9e1e6a2a1f19772318f605e31c" + +cli-table@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/cli-table/-/cli-table-0.3.1.tgz#f53b05266a8b1a0b934b3d0821e6e2dc5914ae23" + dependencies: + colors "1.0.3" + +cli-truncate@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-0.2.1.tgz#9f15cfbb0705005369216c626ac7d05ab90dd574" + dependencies: + slice-ansi "0.0.4" + string-width "^1.0.1" + +cli-width@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" + +cliui@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" + dependencies: + string-width "^1.0.1" + strip-ansi "^3.0.1" + wrap-ansi "^2.0.0" + +clone-buffer@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/clone-buffer/-/clone-buffer-1.0.0.tgz#e3e25b207ac4e701af721e2cb5a16792cac3dc58" + +clone-stats@^0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/clone-stats/-/clone-stats-0.0.1.tgz#b88f94a82cf38b8791d58046ea4029ad88ca99d1" + +clone-stats@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/clone-stats/-/clone-stats-1.0.0.tgz#b3782dff8bb5474e18b9b6bf0fdfe782f8777680" + +clone@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.3.tgz#298d7e2231660f40c003c2ed3140decf3f53085f" + +clone@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.1.tgz#d217d1e961118e3ac9a4b8bba3285553bf647cdb" + +cloneable-readable@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/cloneable-readable/-/cloneable-readable-1.0.0.tgz#a6290d413f217a61232f95e458ff38418cfb0117" + dependencies: + inherits "^2.0.1" + process-nextick-args "^1.0.6" + through2 "^2.0.1" + +co@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + +code-point-at@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" + +codecov@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/codecov/-/codecov-3.0.0.tgz#c273b8c4f12945723e8dc9d25803d89343e5f28e" + dependencies: + argv "0.0.2" + request "2.81.0" + urlgrey "0.4.4" + +collection-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" + dependencies: + map-visit "^1.0.0" + object-visit "^1.0.0" + +color-convert@^1.9.0: + version "1.9.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.1.tgz#c1261107aeb2f294ebffec9ed9ecad529a6097ed" + dependencies: + color-name "^1.1.1" + +color-name@^1.1.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + +colors@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b" + +colors@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63" + +combined-stream@^1.0.5, combined-stream@~1.0.5: + version "1.0.6" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.6.tgz#723e7df6e801ac5613113a7e445a9b69cb632818" + dependencies: + delayed-stream "~1.0.0" + +commander@~2.13.0: + version "2.13.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.13.0.tgz#6964bca67685df7c1f1430c584f07d7597885b9c" + +commondir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" + +component-bind@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/component-bind/-/component-bind-1.0.0.tgz#00c608ab7dcd93897c0009651b1d3a8e1e73bbd1" + +component-emitter@1.2.1, component-emitter@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" + +component-inherit@0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/component-inherit/-/component-inherit-0.0.3.tgz#645fc4adf58b72b649d5cae65135619db26ff143" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + +concat-stream@^1.4.7, concat-stream@^1.5.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.0.tgz#0aac662fd52be78964d5532f694784e70110acf7" + dependencies: + inherits "^2.0.3" + readable-stream "^2.2.2" + typedarray "^0.0.6" + +configstore@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/configstore/-/configstore-3.1.1.tgz#094ee662ab83fad9917678de114faaea8fcdca90" + dependencies: + dot-prop "^4.1.0" + graceful-fs "^4.1.2" + make-dir "^1.0.0" + unique-string "^1.0.0" + write-file-atomic "^2.0.0" + xdg-basedir "^3.0.0" + +console-browserify@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.1.0.tgz#f0241c45730a9fc6323b206dbf38edc741d0bb10" + dependencies: + date-now "^0.1.4" + +console-control-strings@^1.0.0, console-control-strings@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" + +constants-browserify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" + +content-disposition@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4" + +content-type@~1.0.2, content-type@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" + +convert-source-map@^1.5.0: + version "1.5.1" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.1.tgz#b8278097b9bc229365de5c62cf5fcaed8b5599e5" + +cookie-signature@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + +cookie@0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb" + +copy-concurrently@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0" + dependencies: + aproba "^1.1.1" + fs-write-stream-atomic "^1.0.8" + iferr "^0.1.5" + mkdirp "^0.5.1" + rimraf "^2.5.4" + run-queue "^1.0.0" + +copy-descriptor@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" + +core-js@^2.4.0, core-js@^2.4.1, core-js@^2.5.0: + version "2.5.3" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.3.tgz#8acc38345824f16d8365b7c9b4259168e8ed603e" + +core-util-is@1.0.2, core-util-is@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + +cors@2.8.4, cors@^2.8.4: + version "2.8.4" + resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.4.tgz#2bd381f2eb201020105cd50ea59da63090694686" + dependencies: + object-assign "^4" + vary "^1" + +create-ecdh@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.0.tgz#888c723596cdf7612f6498233eebd7a35301737d" + dependencies: + bn.js "^4.1.0" + elliptic "^6.0.0" + +create-error-class@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/create-error-class/-/create-error-class-3.0.2.tgz#06be7abef947a3f14a30fd610671d401bca8b7b6" + dependencies: + capture-stack-trace "^1.0.0" + +create-hash@^1.1.0, create-hash@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.1.3.tgz#606042ac8b9262750f483caddab0f5819172d8fd" + dependencies: + cipher-base "^1.0.1" + inherits "^2.0.1" + ripemd160 "^2.0.0" + sha.js "^2.4.0" + +create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4: + version "1.1.6" + resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.6.tgz#acb9e221a4e17bdb076e90657c42b93e3726cf06" + dependencies: + cipher-base "^1.0.3" + create-hash "^1.1.0" + inherits "^2.0.1" + ripemd160 "^2.0.0" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +cross-spawn@^5.0.1, cross-spawn@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" + dependencies: + lru-cache "^4.0.1" + shebang-command "^1.2.0" + which "^1.2.9" + +cryptiles@2.x.x: + version "2.0.5" + resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8" + dependencies: + boom "2.x.x" + +crypto-browserify@^3.11.0: + version "3.12.0" + resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" + dependencies: + browserify-cipher "^1.0.0" + browserify-sign "^4.0.0" + create-ecdh "^4.0.0" + create-hash "^1.1.0" + create-hmac "^1.1.0" + diffie-hellman "^5.0.0" + inherits "^2.0.1" + pbkdf2 "^3.0.3" + public-encrypt "^4.0.0" + randombytes "^2.0.0" + randomfill "^1.0.3" + +crypto-random-string@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e" + +cyclist@~0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-0.2.2.tgz#1b33792e11e914a2fd6d6ed6447464444e5fa640" + +d@1: + version "1.0.0" + resolved "https://registry.yarnpkg.com/d/-/d-1.0.0.tgz#754bb5bfe55451da69a58b94d45f4c5b0462d58f" + dependencies: + es5-ext "^0.10.9" + +d@^0.1.1, d@~0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/d/-/d-0.1.1.tgz#da184c535d18d8ee7ba2aa229b914009fae11309" + dependencies: + es5-ext "~0.10.2" + +dargs@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/dargs/-/dargs-5.1.0.tgz#ec7ea50c78564cd36c9d5ec18f66329fade27829" + +dashdash@^1.12.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + dependencies: + assert-plus "^1.0.0" + +date-fns@^1.27.2: + version "1.29.0" + resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-1.29.0.tgz#12e609cdcb935127311d04d33334e2960a2a54e6" + +date-now@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b" + +dateformat@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-2.2.0.tgz#4065e2013cf9fb916ddfd82efb506ad4c6769062" + +debug@2.6.7: + version "2.6.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.7.tgz#92bad1f6d05bbb6bba22cca88bcd0ec894c2861e" + dependencies: + ms "2.0.0" + +debug@2.6.9, debug@^2.0.0, debug@^2.1.0, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8, debug@~2.6.4, debug@~2.6.6: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + dependencies: + ms "2.0.0" + +debug@^3.1.0, debug@~3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" + dependencies: + ms "2.0.0" + +decamelize@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + +decode-uri-component@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" + +decompress-response@^3.2.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3" + dependencies: + mimic-response "^1.0.0" + +deep-extend@^0.4.0, deep-extend@~0.4.0: + version "0.4.2" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.2.tgz#48b699c27e334bf89f10892be432f6e4c7d34a7f" + +define-property@^0.2.5: + version "0.2.5" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" + dependencies: + is-descriptor "^0.1.0" + +define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" + dependencies: + is-descriptor "^1.0.0" + +define-property@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" + dependencies: + is-descriptor "^1.0.2" + isobject "^3.0.1" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + +delegates@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + +depd@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.1.tgz#5783b4e1c459f06fa5ca27f991f3d06e7a310359" + +depd@~1.1.0, depd@~1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" + +deprecate@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/deprecate/-/deprecate-1.0.0.tgz#661490ed2428916a6c8883d8834e5646f4e4a4a8" + +des.js@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.0.tgz#c074d2e2aa6a8a9a07dbd61f9a15c2cd83ec8ecc" + dependencies: + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + +destroy@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" + +detect-conflict@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/detect-conflict/-/detect-conflict-1.0.1.tgz#088657a66a961c05019db7c4230883b1c6b4176e" + +detect-indent@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" + dependencies: + repeating "^2.0.0" + +detect-libc@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" + +dicer@0.2.5: + version "0.2.5" + resolved "https://registry.yarnpkg.com/dicer/-/dicer-0.2.5.tgz#5996c086bb33218c812c090bddc09cd12facb70f" + dependencies: + readable-stream "1.1.x" + streamsearch "0.1.2" + +diff@^2.1.2: + version "2.2.3" + resolved "https://registry.yarnpkg.com/diff/-/diff-2.2.3.tgz#60eafd0d28ee906e4e8ff0a52c1229521033bf99" + +diff@^3.1.0, diff@^3.3.0, diff@^3.3.1: + version "3.4.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-3.4.0.tgz#b1d85507daf3964828de54b37d0d73ba67dda56c" + +diffie-hellman@^5.0.0: + version "5.0.2" + resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.2.tgz#b5835739270cfe26acf632099fded2a07f209e5e" + dependencies: + bn.js "^4.1.0" + miller-rabin "^4.0.0" + randombytes "^2.0.0" + +dom-walk@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.1.tgz#672226dc74c8f799ad35307df936aba11acd6018" + +domain-browser@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" + +domino@^1.0.29: + version "1.0.30" + resolved "https://registry.yarnpkg.com/domino/-/domino-1.0.30.tgz#54a4154ecae968616680f8feba3cedff355c71f4" + +domino@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/domino/-/domino-2.0.1.tgz#9e1d63215d0fe8dcb8202bff07effa1a216db504" + +dot-prop@^4.1.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.0.tgz#1f19e0c2e1aa0e32797c49799f2837ac6af69c57" + dependencies: + is-obj "^1.0.0" + +double-ended-queue@^2.1.0-0: + version "2.1.0-0" + resolved "https://registry.yarnpkg.com/double-ended-queue/-/double-ended-queue-2.1.0-0.tgz#103d3527fd31528f40188130c841efdd78264e5c" + +duplexer3@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" + +duplexer@~0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1" + +duplexify@^3.4.2, duplexify@^3.5.3: + version "3.5.3" + resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.5.3.tgz#8b5818800df92fd0125b27ab896491912858243e" + dependencies: + end-of-stream "^1.0.0" + inherits "^2.0.1" + readable-stream "^2.0.0" + stream-shift "^1.0.0" + +ecc-jsbn@~0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505" + dependencies: + jsbn "~0.1.0" + +editions@^1.3.3: + version "1.3.4" + resolved "https://registry.yarnpkg.com/editions/-/editions-1.3.4.tgz#3662cb592347c3168eb8e498a0ff73271d67f50b" + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + +ejs@^2.3.1: + version "2.5.7" + resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.5.7.tgz#cc872c168880ae3c7189762fd5ffc00896c9518a" + +elegant-spinner@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/elegant-spinner/-/elegant-spinner-1.0.1.tgz#db043521c95d7e303fd8f345bedc3349cfb0729e" + +elliptic@^6.0.0: + version "6.4.0" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.4.0.tgz#cac9af8762c85836187003c8dfe193e5e2eae5df" + dependencies: + bn.js "^4.4.0" + brorand "^1.0.1" + hash.js "^1.0.0" + hmac-drbg "^1.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.0" + +emojis-list@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" + +encodeurl@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + +end-of-stream@^1.0.0, end-of-stream@^1.1.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.1.tgz#ed29634d19baba463b6ce6b80a37213eab71ec43" + dependencies: + once "^1.4.0" + +engine.io-client@~3.1.0: + version "3.1.5" + resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-3.1.5.tgz#85de17666560327ef1817978f6e3f8101ded2c47" + dependencies: + component-emitter "1.2.1" + component-inherit "0.0.3" + debug "~3.1.0" + engine.io-parser "~2.1.1" + has-cors "1.1.0" + indexof "0.0.1" + parseqs "0.0.5" + parseuri "0.0.5" + ws "~3.3.1" + xmlhttprequest-ssl "~1.5.4" + yeast "0.1.2" + +engine.io-parser@~2.1.0, engine.io-parser@~2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-2.1.2.tgz#4c0f4cff79aaeecbbdcfdea66a823c6085409196" + dependencies: + after "0.8.2" + arraybuffer.slice "~0.0.7" + base64-arraybuffer "0.1.5" + blob "0.0.4" + has-binary2 "~1.0.2" + +engine.io@~3.1.0: + version "3.1.5" + resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-3.1.5.tgz#0e7ef9d690eb0b35597f1d4ad02a26ca2dba3845" + dependencies: + accepts "~1.3.4" + base64id "1.0.0" + cookie "0.3.1" + debug "~3.1.0" + engine.io-parser "~2.1.0" + ws "~3.3.1" + optionalDependencies: + uws "~9.14.0" + +enhanced-resolve@^3.4.1: + version "3.4.1" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz#0421e339fd71419b3da13d129b3979040230476e" + dependencies: + graceful-fs "^4.1.2" + memory-fs "^0.4.0" + object-assign "^4.0.1" + tapable "^0.2.7" + +enhanced-resolve@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.0.0.tgz#e34a6eaa790f62fccd71d93959f56b2b432db10a" + dependencies: + graceful-fs "^4.1.2" + memory-fs "^0.4.0" + tapable "^1.0.0" + +errno@^0.1.3, errno@^0.1.4: + version "0.1.7" + resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618" + dependencies: + prr "~1.0.1" + +error-ex@^1.2.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.1.tgz#f855a86ce61adc4e8621c3cda21e7a7612c3a8dc" + dependencies: + is-arrayish "^0.2.1" + +error@^7.0.2: + version "7.0.2" + resolved "https://registry.yarnpkg.com/error/-/error-7.0.2.tgz#a5f75fff4d9926126ddac0ea5dc38e689153cb02" + dependencies: + string-template "~0.2.1" + xtend "~4.0.0" + +es5-ext@^0.10.35, es5-ext@^0.10.8, es5-ext@^0.10.9, es5-ext@~0.10.11, es5-ext@~0.10.14, es5-ext@~0.10.2, es5-ext@~0.10.5, es5-ext@~0.10.6: + version "0.10.39" + resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.39.tgz#fca21b67559277ca4ac1a1ed7048b107b6f76d87" + dependencies: + es6-iterator "~2.0.3" + es6-symbol "~3.1.1" + +es6-iterator@2, es6-iterator@~2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" + dependencies: + d "1" + es5-ext "^0.10.35" + es6-symbol "^3.1.1" + +es6-iterator@~0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-0.1.3.tgz#d6f58b8c4fc413c249b4baa19768f8e4d7c8944e" + dependencies: + d "~0.1.1" + es5-ext "~0.10.5" + es6-symbol "~2.0.1" + +es6-symbol@^3.1.1, es6-symbol@~3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.1.tgz#bf00ef4fdab6ba1b46ecb7b629b4c7ed5715cc77" + dependencies: + d "1" + es5-ext "~0.10.14" + +es6-symbol@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-2.0.1.tgz#761b5c67cfd4f1d18afb234f691d678682cb3bf3" + dependencies: + d "~0.1.1" + es5-ext "~0.10.5" + +es6-weak-map@~0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-0.1.4.tgz#706cef9e99aa236ba7766c239c8b9e286ea7d228" + dependencies: + d "~0.1.1" + es5-ext "~0.10.6" + es6-iterator "~0.1.3" + es6-symbol "~2.0.1" + +escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + +escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + +eslint-scope@^3.7.1: + version "3.7.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-3.7.1.tgz#3d63c3edfda02e06e01a452ad88caacc7cdcb6e8" + dependencies: + esrecurse "^4.1.0" + estraverse "^4.1.1" + +esprima@~4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.0.tgz#4499eddcd1110e0b218bacf2fa7f7f59f55ca804" + +esrecurse@^4.1.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.0.tgz#fa9568d98d3823f9a41d91e902dcab9ea6e5b163" + dependencies: + estraverse "^4.1.0" + object-assign "^4.0.1" + +estraverse@^4.1.0, estraverse@^4.1.1: + version "4.2.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" + +esutils@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" + +etag@~1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + +event-emitter@~0.3.4: + version "0.3.5" + resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39" + dependencies: + d "1" + es5-ext "~0.10.14" + +event-stream@~3.3.0: + version "3.3.4" + resolved "https://registry.yarnpkg.com/event-stream/-/event-stream-3.3.4.tgz#4ab4c9a0f5a54db9338b4c34d86bfce8f4b35571" + dependencies: + duplexer "~0.1.1" + from "~0" + map-stream "~0.1.0" + pause-stream "0.0.11" + split "0.3" + stream-combiner "~0.0.4" + through "~2.3.1" + +events@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924" + +evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" + dependencies: + md5.js "^1.3.4" + safe-buffer "^5.1.1" + +execa@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" + dependencies: + cross-spawn "^5.0.1" + get-stream "^3.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + +exit-hook@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/exit-hook/-/exit-hook-1.1.1.tgz#f05ca233b48c05d54fff07765df8507e95c02ff8" + +expand-brackets@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" + dependencies: + is-posix-bracket "^0.1.0" + +expand-brackets@^2.1.4: + version "2.1.4" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" + dependencies: + debug "^2.3.3" + define-property "^0.2.5" + extend-shallow "^2.0.1" + posix-character-classes "^0.1.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +expand-range@^1.8.1: + version "1.8.2" + resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" + dependencies: + fill-range "^2.1.0" + +expand-tilde@^2.0.0, expand-tilde@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502" + dependencies: + homedir-polyfill "^1.0.1" + +express@4.16.2: + version "4.16.2" + resolved "https://registry.yarnpkg.com/express/-/express-4.16.2.tgz#e35c6dfe2d64b7dca0a5cd4f21781be3299e076c" + dependencies: + accepts "~1.3.4" + array-flatten "1.1.1" + body-parser "1.18.2" + content-disposition "0.5.2" + content-type "~1.0.4" + cookie "0.3.1" + cookie-signature "1.0.6" + debug "2.6.9" + depd "~1.1.1" + encodeurl "~1.0.1" + escape-html "~1.0.3" + etag "~1.8.1" + finalhandler "1.1.0" + fresh "0.5.2" + merge-descriptors "1.0.1" + methods "~1.1.2" + on-finished "~2.3.0" + parseurl "~1.3.2" + path-to-regexp "0.1.7" + proxy-addr "~2.0.2" + qs "6.5.1" + range-parser "~1.2.0" + safe-buffer "5.1.1" + send "0.16.1" + serve-static "1.13.1" + setprototypeof "1.1.0" + statuses "~1.3.1" + type-is "~1.6.15" + utils-merge "1.0.1" + vary "~1.1.2" + +extend-shallow@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" + dependencies: + is-extendable "^0.1.0" + +extend-shallow@^3.0.0, extend-shallow@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" + dependencies: + assign-symbols "^1.0.0" + is-extendable "^1.0.1" + +extend@^3.0.0, extend@~3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" + +external-editor@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-1.1.1.tgz#12d7b0db850f7ff7e7081baf4005700060c4600b" + dependencies: + extend "^3.0.0" + spawn-sync "^1.0.15" + tmp "^0.0.29" + +external-editor@^2.0.4: + version "2.1.0" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.1.0.tgz#3d026a21b7f95b5726387d4200ac160d372c3b48" + dependencies: + chardet "^0.4.0" + iconv-lite "^0.4.17" + tmp "^0.0.33" + +extglob@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" + dependencies: + is-extglob "^1.0.0" + +extglob@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" + dependencies: + array-unique "^0.3.2" + define-property "^1.0.0" + expand-brackets "^2.1.4" + extend-shallow "^2.0.1" + fragment-cache "^0.2.1" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +extsprintf@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" + +extsprintf@^1.2.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" + +fast-deep-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz#96256a3bc975595eb36d82e9929d060d893439ff" + +fast-json-stable-stringify@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" + +figures@^1.3.5, figures@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e" + dependencies: + escape-string-regexp "^1.0.5" + object-assign "^4.1.0" + +figures@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" + dependencies: + escape-string-regexp "^1.0.5" + +filename-regex@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" + +fill-range@^2.1.0: + version "2.2.3" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.3.tgz#50b77dfd7e469bc7492470963699fe7a8485a723" + dependencies: + is-number "^2.1.0" + isobject "^2.0.0" + randomatic "^1.1.3" + repeat-element "^1.1.2" + repeat-string "^1.5.2" + +fill-range@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" + dependencies: + extend-shallow "^2.0.1" + is-number "^3.0.0" + repeat-string "^1.6.1" + to-regex-range "^2.1.0" + +finalhandler@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.0.tgz#ce0b6855b45853e791b2fcc680046d88253dd7f5" + dependencies: + debug "2.6.9" + encodeurl "~1.0.1" + escape-html "~1.0.3" + on-finished "~2.3.0" + parseurl "~1.3.2" + statuses "~1.3.1" + unpipe "~1.0.0" + +find-cache-dir@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-1.0.0.tgz#9288e3e9e3cc3748717d39eade17cf71fc30ee6f" + dependencies: + commondir "^1.0.1" + make-dir "^1.0.0" + pkg-dir "^2.0.0" + +find-up@^2.0.0, find-up@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" + dependencies: + locate-path "^2.0.0" + +first-chunk-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/first-chunk-stream/-/first-chunk-stream-2.0.0.tgz#1bdecdb8e083c0664b91945581577a43a9f31d70" + dependencies: + readable-stream "^2.0.2" + +flow-parser@^0.*: + version "0.66.0" + resolved "https://registry.yarnpkg.com/flow-parser/-/flow-parser-0.66.0.tgz#be583fefb01192aa5164415d31a6241b35718983" + +flush-write-stream@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.0.2.tgz#c81b90d8746766f1a609a46809946c45dd8ae417" + dependencies: + inherits "^2.0.1" + readable-stream "^2.0.4" + +follow-redirects@^1.2.5: + version "1.4.1" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.4.1.tgz#d8120f4518190f55aac65bb6fc7b85fcd666d6aa" + dependencies: + debug "^3.1.0" + +for-in@^1.0.1, for-in@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" + +for-own@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" + dependencies: + for-in "^1.0.1" + +forever-agent@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + +form-data@~2.1.1: + version "2.1.4" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.1.4.tgz#33c183acf193276ecaa98143a69e94bfee1750d1" + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.5" + mime-types "^2.1.12" + +forwarded@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" + +fragment-cache@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" + dependencies: + map-cache "^0.2.2" + +fresh@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + +from2@^2.1.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" + dependencies: + inherits "^2.0.1" + readable-stream "^2.0.0" + +from@~0: + version "0.1.7" + resolved "https://registry.yarnpkg.com/from/-/from-0.1.7.tgz#83c60afc58b9c56997007ed1a768b3ab303a44fe" + +fs-write-stream-atomic@^1.0.8: + version "1.0.10" + resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9" + dependencies: + graceful-fs "^4.1.2" + iferr "^0.1.5" + imurmurhash "^0.1.4" + readable-stream "1 || 2" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + +fsevents@^1.0.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.1.3.tgz#11f82318f5fe7bb2cd22965a108e9306208216d8" + dependencies: + nan "^2.3.0" + node-pre-gyp "^0.6.39" + +fstream-ignore@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/fstream-ignore/-/fstream-ignore-1.0.5.tgz#9c31dae34767018fe1d249b24dada67d092da105" + dependencies: + fstream "^1.0.0" + inherits "2" + minimatch "^3.0.0" + +fstream@^1.0.0, fstream@^1.0.10, fstream@^1.0.2: + version "1.0.11" + resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.11.tgz#5c1fb1f117477114f0632a0eb4b71b3cb0fd3171" + dependencies: + graceful-fs "^4.1.2" + inherits "~2.0.0" + mkdirp ">=0.5 0" + rimraf "2" + +gauge@~2.7.3: + version "2.7.4" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" + dependencies: + aproba "^1.0.3" + console-control-strings "^1.0.0" + has-unicode "^2.0.0" + object-assign "^4.1.0" + signal-exit "^3.0.0" + string-width "^1.0.1" + strip-ansi "^3.0.1" + wide-align "^1.1.0" + +get-caller-file@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.2.tgz#f702e63127e7e231c160a80c1554acb70d5047e5" + +get-stream@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" + +get-value@^2.0.3, get-value@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" + +getpass@^0.1.1: + version "0.1.7" + resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" + dependencies: + assert-plus "^1.0.0" + +gh-got@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/gh-got/-/gh-got-6.0.0.tgz#d74353004c6ec466647520a10bd46f7299d268d0" + dependencies: + got "^7.0.0" + is-plain-obj "^1.1.0" + +github-username@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/github-username/-/github-username-4.1.0.tgz#cbe280041883206da4212ae9e4b5f169c30bf417" + dependencies: + gh-got "^6.0.0" + +glob-all@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/glob-all/-/glob-all-3.1.0.tgz#8913ddfb5ee1ac7812656241b03d5217c64b02ab" + dependencies: + glob "^7.0.5" + yargs "~1.2.6" + +glob-base@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" + dependencies: + glob-parent "^2.0.0" + is-glob "^2.0.0" + +glob-parent@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" + dependencies: + is-glob "^2.0.0" + +glob-parent@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" + dependencies: + is-glob "^3.1.0" + path-dirname "^1.0.0" + +glob@^6.0.1: + version "6.0.4" + resolved "https://registry.yarnpkg.com/glob/-/glob-6.0.4.tgz#0f08860f6a155127b2fadd4f9ce24b1aab6e4d22" + dependencies: + inflight "^1.0.4" + inherits "2" + minimatch "2 || 3" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.1.2: + version "7.1.2" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +global-dirs@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-0.1.1.tgz#b319c0dd4607f353f3be9cca4c72fc148c49f445" + dependencies: + ini "^1.3.4" + +global-modules@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-1.0.0.tgz#6d770f0eb523ac78164d72b5e71a8877265cc3ea" + dependencies: + global-prefix "^1.0.1" + is-windows "^1.0.1" + resolve-dir "^1.0.0" + +global-prefix@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-1.0.2.tgz#dbf743c6c14992593c655568cb66ed32c0122ebe" + dependencies: + expand-tilde "^2.0.2" + homedir-polyfill "^1.0.1" + ini "^1.3.4" + is-windows "^1.0.1" + which "^1.2.14" + +global@^4.3.2: + version "4.3.2" + resolved "https://registry.yarnpkg.com/global/-/global-4.3.2.tgz#e76989268a6c74c38908b1305b10fc0e394e9d0f" + dependencies: + min-document "^2.19.0" + process "~0.5.1" + +globals@^9.18.0: + version "9.18.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" + +globby@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-4.1.0.tgz#080f54549ec1b82a6c60e631fc82e1211dbe95f8" + dependencies: + array-union "^1.0.1" + arrify "^1.0.0" + glob "^6.0.1" + object-assign "^4.0.1" + pify "^2.0.0" + pinkie-promise "^2.0.0" + +globby@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c" + dependencies: + array-union "^1.0.1" + glob "^7.0.3" + object-assign "^4.0.1" + pify "^2.0.0" + pinkie-promise "^2.0.0" + +got@^6.7.1: + version "6.7.1" + resolved "https://registry.yarnpkg.com/got/-/got-6.7.1.tgz#240cd05785a9a18e561dc1b44b41c763ef1e8db0" + dependencies: + create-error-class "^3.0.0" + duplexer3 "^0.1.4" + get-stream "^3.0.0" + is-redirect "^1.0.0" + is-retry-allowed "^1.0.0" + is-stream "^1.0.0" + lowercase-keys "^1.0.0" + safe-buffer "^5.0.1" + timed-out "^4.0.0" + unzip-response "^2.0.1" + url-parse-lax "^1.0.0" + +got@^7.0.0, got@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/got/-/got-7.1.0.tgz#05450fd84094e6bbea56f451a43a9c289166385a" + dependencies: + decompress-response "^3.2.0" + duplexer3 "^0.1.4" + get-stream "^3.0.0" + is-plain-obj "^1.1.0" + is-retry-allowed "^1.0.0" + is-stream "^1.0.0" + isurl "^1.0.0-alpha5" + lowercase-keys "^1.0.0" + p-cancelable "^0.3.0" + p-timeout "^1.1.1" + safe-buffer "^5.0.1" + timed-out "^4.0.0" + url-parse-lax "^1.0.0" + url-to-options "^1.0.1" + +graceful-fs@^4.1.11, graceful-fs@^4.1.2: + version "4.1.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" + +grouped-queue@^0.3.0, grouped-queue@^0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/grouped-queue/-/grouped-queue-0.3.3.tgz#c167d2a5319c5a0e0964ef6a25b7c2df8996c85c" + dependencies: + lodash "^4.17.2" + +har-schema@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-1.0.5.tgz#d263135f43307c02c602afc8fe95970c0151369e" + +har-validator@~4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-4.2.1.tgz#33481d0f1bbff600dd203d75812a6a5fba002e2a" + dependencies: + ajv "^4.9.1" + har-schema "^1.0.5" + +has-ansi@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" + dependencies: + ansi-regex "^2.0.0" + +has-binary2@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-binary2/-/has-binary2-1.0.2.tgz#e83dba49f0b9be4d026d27365350d9f03f54be98" + dependencies: + isarray "2.0.1" + +has-color@~0.1.0: + version "0.1.7" + resolved "https://registry.yarnpkg.com/has-color/-/has-color-0.1.7.tgz#67144a5260c34fc3cca677d041daf52fe7b78b2f" + +has-cors@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/has-cors/-/has-cors-1.1.0.tgz#5e474793f7ea9843d1bb99c23eef49ff126fff39" + +has-flag@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51" + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + +has-symbol-support-x@^1.4.1: + version "1.4.2" + resolved "https://registry.yarnpkg.com/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz#1409f98bc00247da45da67cee0a36f282ff26455" + +has-to-string-tag-x@^1.2.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz#a045ab383d7b4b2012a00148ab0aa5f290044d4d" + dependencies: + has-symbol-support-x "^1.4.1" + +has-unicode@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + +has-value@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" + dependencies: + get-value "^2.0.3" + has-values "^0.1.4" + isobject "^2.0.0" + +has-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" + dependencies: + get-value "^2.0.6" + has-values "^1.0.0" + isobject "^3.0.0" + +has-values@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" + +has-values@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" + dependencies: + is-number "^3.0.0" + kind-of "^4.0.0" + +hash-base@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-2.0.2.tgz#66ea1d856db4e8a5470cadf6fce23ae5244ef2e1" + dependencies: + inherits "^2.0.1" + +hash-base@^3.0.0: + version "3.0.4" + resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.0.4.tgz#5fc8686847ecd73499403319a6b0a3f3f6ae4918" + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +hash.js@^1.0.0, hash.js@^1.0.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.3.tgz#340dedbe6290187151c1ea1d777a3448935df846" + dependencies: + inherits "^2.0.3" + minimalistic-assert "^1.0.0" + +hawk@3.1.3, hawk@~3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4" + dependencies: + boom "2.x.x" + cryptiles "2.x.x" + hoek "2.x.x" + sntp "1.x.x" + +hmac-drbg@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" + dependencies: + hash.js "^1.0.3" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.1" + +hoek@2.x.x: + version "2.16.3" + resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed" + +home-or-tmp@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.1" + +homedir-polyfill@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz#4c2bbc8a758998feebf5ed68580f76d46768b4bc" + dependencies: + parse-passwd "^1.0.0" + +hosted-git-info@^2.1.4: + version "2.5.0" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.5.0.tgz#6d60e34b3abbc8313062c3b798ef8d901a07af3c" + +http-errors@1.6.2, http-errors@~1.6.1, http-errors@~1.6.2: + version "1.6.2" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.2.tgz#0a002cc85707192a7e7946ceedc11155f60ec736" + dependencies: + depd "1.1.1" + inherits "2.0.3" + setprototypeof "1.0.3" + statuses ">= 1.3.1 < 2" + +http-signature@~1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf" + dependencies: + assert-plus "^0.2.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + +https-browserify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" + +iconv-lite@0.4.15: + version "0.4.15" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.15.tgz#fe265a218ac6a57cfe854927e9d04c19825eddeb" + +iconv-lite@0.4.19, iconv-lite@^0.4.17: + version "0.4.19" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b" + +ieee754@^1.1.4: + version "1.1.8" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.8.tgz#be33d40ac10ef1926701f6f08a2d86fbfd1ad3e4" + +iferr@^0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" + +ignore-by-default@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09" + +import-lazy@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + +indent-string@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" + dependencies: + repeating "^2.0.0" + +indent-string@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-3.2.0.tgz#4a5fd6d27cc332f37e5419a504dbb837105c9289" + +indexof@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d" + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + +inherits@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" + +ini@^1.3.4, ini@~1.3.0: + version "1.3.5" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" + +inquirer@^1.0.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-1.2.3.tgz#4dec6f32f37ef7bb0b2ed3f1d1a5c3f545074918" + dependencies: + ansi-escapes "^1.1.0" + chalk "^1.0.0" + cli-cursor "^1.0.1" + cli-width "^2.0.0" + external-editor "^1.1.0" + figures "^1.3.5" + lodash "^4.3.0" + mute-stream "0.0.6" + pinkie-promise "^2.0.0" + run-async "^2.2.0" + rx "^4.1.0" + string-width "^1.0.1" + strip-ansi "^3.0.0" + through "^2.3.6" + +inquirer@^3.2.0, inquirer@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.3.0.tgz#9dd2f2ad765dcab1ff0443b491442a20ba227dc9" + dependencies: + ansi-escapes "^3.0.0" + chalk "^2.0.0" + cli-cursor "^2.1.0" + cli-width "^2.0.0" + external-editor "^2.0.4" + figures "^2.0.0" + lodash "^4.3.0" + mute-stream "0.0.7" + run-async "^2.2.0" + rx-lite "^4.0.8" + rx-lite-aggregates "^4.0.8" + string-width "^2.1.0" + strip-ansi "^4.0.0" + through "^2.3.6" + +interpret@^1.0.0, interpret@^1.0.4: + version "1.1.0" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.1.0.tgz#7ed1b1410c6a0e0f78cf95d3b8440c63f78b8614" + +invariant@^2.2.2: + version "2.2.3" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.3.tgz#1a827dfde7dcbd7c323f0ca826be8fa7c5e9d688" + dependencies: + loose-envify "^1.0.0" + +invert-kv@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" + +ipaddr.js@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.6.0.tgz#e3fa357b773da619f26e95f049d055c72796f86b" + +is-accessor-descriptor@^0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" + dependencies: + kind-of "^3.0.2" + +is-accessor-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" + dependencies: + kind-of "^6.0.0" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + +is-binary-path@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" + dependencies: + binary-extensions "^1.0.0" + +is-buffer@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + +is-builtin-module@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe" + dependencies: + builtin-modules "^1.0.0" + +is-data-descriptor@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" + dependencies: + kind-of "^3.0.2" + +is-data-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" + dependencies: + kind-of "^6.0.0" + +is-descriptor@^0.1.0: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" + dependencies: + is-accessor-descriptor "^0.1.6" + is-data-descriptor "^0.1.4" + kind-of "^5.0.0" + +is-descriptor@^1.0.0, is-descriptor@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" + dependencies: + is-accessor-descriptor "^1.0.0" + is-data-descriptor "^1.0.0" + kind-of "^6.0.2" + +is-dotfile@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1" + +is-equal-shallow@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" + dependencies: + is-primitive "^2.0.0" + +is-extendable@^0.1.0, is-extendable@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + +is-extendable@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" + dependencies: + is-plain-object "^2.0.4" + +is-extglob@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" + +is-extglob@^2.1.0, is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + +is-finite@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" + dependencies: + number-is-nan "^1.0.0" + +is-fullwidth-code-point@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" + dependencies: + number-is-nan "^1.0.0" + +is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + +is-glob@^2.0.0, is-glob@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" + dependencies: + is-extglob "^1.0.0" + +is-glob@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" + dependencies: + is-extglob "^2.1.0" + +is-glob@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.0.tgz#9521c76845cc2610a85203ddf080a958c2ffabc0" + dependencies: + is-extglob "^2.1.1" + +is-installed-globally@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.1.0.tgz#0dfd98f5a9111716dd535dda6492f67bf3d25a80" + dependencies: + global-dirs "^0.1.0" + is-path-inside "^1.0.0" + +is-npm@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-1.0.0.tgz#f2fb63a65e4905b406c86072765a1a4dc793b9f4" + +is-number@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" + dependencies: + kind-of "^3.0.2" + +is-number@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" + dependencies: + kind-of "^3.0.2" + +is-number@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-4.0.0.tgz#0026e37f5454d73e356dfe6564699867c6a7f0ff" + +is-obj@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" + +is-object@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-object/-/is-object-1.0.1.tgz#8952688c5ec2ffd6b03ecc85e769e02903083470" + +is-odd@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-odd/-/is-odd-2.0.0.tgz#7646624671fd7ea558ccd9a2795182f2958f1b24" + dependencies: + is-number "^4.0.0" + +is-path-inside@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036" + dependencies: + path-is-inside "^1.0.1" + +is-plain-obj@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" + +is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + dependencies: + isobject "^3.0.1" + +is-posix-bracket@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" + +is-primitive@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" + +is-promise@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" + +is-redirect@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24" + +is-retry-allowed@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz#11a060568b67339444033d0125a61a20d564fb34" + +is-scoped@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-scoped/-/is-scoped-1.0.0.tgz#449ca98299e713038256289ecb2b540dc437cb30" + dependencies: + scoped-regex "^1.0.0" + +is-stream@^1.0.0, is-stream@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + +is-typedarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + +is-utf8@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" + +is-windows@^1.0.1, is-windows@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" + +isarray@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" + +isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + +isarray@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.1.tgz#a37d94ed9cda2d59865c9f76fe596ee1f338741e" + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + +isobject@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + dependencies: + isarray "1.0.0" + +isobject@^3.0.0, isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + +isstream@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + +istextorbinary@^2.1.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/istextorbinary/-/istextorbinary-2.2.1.tgz#a5231a08ef6dd22b268d0895084cf8d58b5bec53" + dependencies: + binaryextensions "2" + editions "^1.3.3" + textextensions "2" + +isurl@^1.0.0-alpha5: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isurl/-/isurl-1.0.0.tgz#b27f4f49f3cdaa3ea44a0a5b7f3462e6edc39d67" + dependencies: + has-to-string-tag-x "^1.2.0" + is-object "^1.0.1" + +iterare@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/iterare/-/iterare-0.0.8.tgz#a969a80a1fbff6b78f28776594d7bc2bdfab6aad" + +js-tokens@^3.0.0, js-tokens@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" + +jsbn@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + +jscodeshift@^0.4.0: + version "0.4.1" + resolved "https://registry.yarnpkg.com/jscodeshift/-/jscodeshift-0.4.1.tgz#da91a1c2eccfa03a3387a21d39948e251ced444a" + dependencies: + async "^1.5.0" + babel-plugin-transform-flow-strip-types "^6.8.0" + babel-preset-es2015 "^6.9.0" + babel-preset-stage-1 "^6.5.0" + babel-register "^6.9.0" + babylon "^6.17.3" + colors "^1.1.2" + flow-parser "^0.*" + lodash "^4.13.1" + micromatch "^2.3.7" + node-dir "0.1.8" + nomnom "^1.8.1" + recast "^0.12.5" + temp "^0.8.1" + write-file-atomic "^1.2.0" + +jsesc@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" + +jsesc@~0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + +json-schema-traverse@^0.3.0: + version "0.3.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340" + +json-schema@0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" + +json-socket@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/json-socket/-/json-socket-0.2.1.tgz#26e7ed8cc131f17aa0136c32068f473b5dbefb22" + +json-stable-stringify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" + dependencies: + jsonify "~0.0.0" + +json-stringify-safe@~5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + +json5@^0.5.0, json5@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" + +jsonify@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" + +jsprim@^1.2.2: + version "1.4.1" + resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" + dependencies: + assert-plus "1.0.0" + extsprintf "1.3.0" + json-schema "0.2.3" + verror "1.10.0" + +kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: + version "3.2.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" + dependencies: + is-buffer "^1.1.5" + +kind-of@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" + dependencies: + is-buffer "^1.1.5" + +kind-of@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" + +kind-of@^6.0.0, kind-of@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" + +latest-version@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-3.1.0.tgz#a205383fea322b33b5ae3b18abee0dc2f356ee15" + dependencies: + package-json "^4.0.0" + +lazy-cache@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-2.0.2.tgz#b9190a4f913354694840859f8a8f7084d8822264" + dependencies: + set-getter "^0.1.0" + +lcid@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" + dependencies: + invert-kv "^1.0.0" + +listr-silent-renderer@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/listr-silent-renderer/-/listr-silent-renderer-1.1.1.tgz#924b5a3757153770bf1a8e3fbf74b8bbf3f9242e" + +listr-update-renderer@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/listr-update-renderer/-/listr-update-renderer-0.2.0.tgz#ca80e1779b4e70266807e8eed1ad6abe398550f9" + dependencies: + chalk "^1.1.3" + cli-truncate "^0.2.1" + elegant-spinner "^1.0.1" + figures "^1.7.0" + indent-string "^3.0.0" + log-symbols "^1.0.2" + log-update "^1.0.2" + strip-ansi "^3.0.1" + +listr-verbose-renderer@^0.4.0: + version "0.4.1" + resolved "https://registry.yarnpkg.com/listr-verbose-renderer/-/listr-verbose-renderer-0.4.1.tgz#8206f4cf6d52ddc5827e5fd14989e0e965933a35" + dependencies: + chalk "^1.1.3" + cli-cursor "^1.0.2" + date-fns "^1.27.2" + figures "^1.7.0" + +listr@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/listr/-/listr-0.12.0.tgz#6bce2c0f5603fa49580ea17cd6a00cc0e5fa451a" + dependencies: + chalk "^1.1.3" + cli-truncate "^0.2.1" + figures "^1.7.0" + indent-string "^2.1.0" + is-promise "^2.1.0" + is-stream "^1.1.0" + listr-silent-renderer "^1.1.1" + listr-update-renderer "^0.2.0" + listr-verbose-renderer "^0.4.0" + log-symbols "^1.0.2" + log-update "^1.0.2" + ora "^0.2.3" + p-map "^1.1.1" + rxjs "^5.0.0-beta.11" + stream-to-observable "^0.1.0" + strip-ansi "^3.0.1" + +load-json-file@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" + dependencies: + graceful-fs "^4.1.2" + parse-json "^2.2.0" + pify "^2.0.0" + strip-bom "^3.0.0" + +loader-runner@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.3.0.tgz#f482aea82d543e07921700d5a46ef26fdac6b8a2" + +loader-utils@^1.0.2, loader-utils@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.1.0.tgz#c98aef488bcceda2ffb5e2de646d6a754429f5cd" + dependencies: + big.js "^3.1.3" + emojis-list "^2.0.0" + json5 "^0.5.0" + +locate-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" + dependencies: + p-locate "^2.0.0" + path-exists "^3.0.0" + +lodash.endswith@^4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/lodash.endswith/-/lodash.endswith-4.2.1.tgz#fed59ac1738ed3e236edd7064ec456448b37bc09" + +lodash.isfunction@^3.0.8: + version "3.0.9" + resolved "https://registry.yarnpkg.com/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz#06de25df4db327ac931981d1bdb067e5af68d051" + +lodash.isstring@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451" + +lodash.startswith@^4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/lodash.startswith/-/lodash.startswith-4.2.1.tgz#c598c4adce188a27e53145731cdc6c0e7177600c" + +lodash@^4.11.1, lodash@^4.13.1, lodash@^4.14.0, lodash@^4.17.2, lodash@^4.17.4, lodash@^4.3.0: + version "4.17.5" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.5.tgz#99a92d65c0272debe8c96b6057bc8fbfa3bed511" + +log-symbols@2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.1.0.tgz#f35fa60e278832b538dc4dddcbb478a45d3e3be6" + dependencies: + chalk "^2.0.1" + +log-symbols@^1.0.1, log-symbols@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-1.0.2.tgz#376ff7b58ea3086a0f09facc74617eca501e1a18" + dependencies: + chalk "^1.0.0" + +log-symbols@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a" + dependencies: + chalk "^2.0.1" + +log-update@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/log-update/-/log-update-1.0.2.tgz#19929f64c4093d2d2e7075a1dad8af59c296b8d1" + dependencies: + ansi-escapes "^1.0.0" + cli-cursor "^1.0.2" + +loose-envify@^1.0.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848" + dependencies: + js-tokens "^3.0.0" + +lowercase-keys@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.0.tgz#4e3366b39e7f5457e35f1324bdf6f88d0bfc7306" + +lru-cache@^4.0.1, lru-cache@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.1.tgz#622e32e82488b49279114a4f9ecf45e7cd6bba55" + dependencies: + pseudomap "^1.0.2" + yallist "^2.1.2" + +lru-queue@0.1: + version "0.1.0" + resolved "https://registry.yarnpkg.com/lru-queue/-/lru-queue-0.1.0.tgz#2738bd9f0d3cf4f84490c5736c48699ac632cda3" + dependencies: + es5-ext "~0.10.2" + +make-dir@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.2.0.tgz#6d6a49eead4aae296c53bbf3a1a008bd6c89469b" + dependencies: + pify "^3.0.0" + +make-error@^1.1.1: + version "1.3.4" + resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.4.tgz#19978ed575f9e9545d2ff8c13e33b5d18a67d535" + +map-cache@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" + +map-stream@~0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/map-stream/-/map-stream-0.1.0.tgz#e56aa94c4c8055a16404a0674b78f215f7c8e194" + +map-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" + dependencies: + object-visit "^1.0.0" + +md5.js@^1.3.4: + version "1.3.4" + resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.4.tgz#e9bdbde94a20a5ac18b04340fc5764d5b09d901d" + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + +mem-fs-editor@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/mem-fs-editor/-/mem-fs-editor-3.0.2.tgz#dd0a6eaf2bb8a6b37740067aa549eb530105af9f" + dependencies: + commondir "^1.0.1" + deep-extend "^0.4.0" + ejs "^2.3.1" + glob "^7.0.3" + globby "^6.1.0" + mkdirp "^0.5.0" + multimatch "^2.0.0" + rimraf "^2.2.8" + through2 "^2.0.0" + vinyl "^2.0.1" + +mem-fs@^1.1.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/mem-fs/-/mem-fs-1.1.3.tgz#b8ae8d2e3fcb6f5d3f9165c12d4551a065d989cc" + dependencies: + through2 "^2.0.0" + vinyl "^1.1.0" + vinyl-file "^2.0.0" + +mem@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/mem/-/mem-1.1.0.tgz#5edd52b485ca1d900fe64895505399a0dfa45f76" + dependencies: + mimic-fn "^1.0.0" + +memoizee@^0.3.9: + version "0.3.10" + resolved "https://registry.yarnpkg.com/memoizee/-/memoizee-0.3.10.tgz#4eca0d8aed39ec9d017f4c5c2f2f6432f42e5c8f" + dependencies: + d "~0.1.1" + es5-ext "~0.10.11" + es6-weak-map "~0.1.4" + event-emitter "~0.3.4" + lru-queue "0.1" + next-tick "~0.2.2" + timers-ext "0.1" + +memory-fs@^0.4.0, memory-fs@~0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" + dependencies: + errno "^0.1.3" + readable-stream "^2.0.1" + +merge-descriptors@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" + +methods@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + +micromatch@^2.1.5, micromatch@^2.3.7: + version "2.3.11" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" + dependencies: + arr-diff "^2.0.0" + array-unique "^0.2.1" + braces "^1.8.2" + expand-brackets "^0.1.4" + extglob "^0.3.1" + filename-regex "^2.0.0" + is-extglob "^1.0.0" + is-glob "^2.0.1" + kind-of "^3.0.2" + normalize-path "^2.0.1" + object.omit "^2.0.0" + parse-glob "^3.0.4" + regex-cache "^0.4.2" + +micromatch@^3.1.4, micromatch@^3.1.8: + version "3.1.9" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.9.tgz#15dc93175ae39e52e93087847096effc73efcf89" + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + braces "^2.3.1" + define-property "^2.0.2" + extend-shallow "^3.0.2" + extglob "^2.0.4" + fragment-cache "^0.2.1" + kind-of "^6.0.2" + nanomatch "^1.2.9" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +miller-rabin@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" + dependencies: + bn.js "^4.0.0" + brorand "^1.0.1" + +mime-db@~1.33.0: + version "1.33.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.33.0.tgz#a3492050a5cb9b63450541e39d9788d2272783db" + +mime-types@^2.1.12, mime-types@~2.1.16, mime-types@~2.1.18, mime-types@~2.1.7: + version "2.1.18" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.18.tgz#6f323f60a83d11146f831ff11fd66e2fe5503bb8" + dependencies: + mime-db "~1.33.0" + +mime@1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6" + +mimic-fn@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" + +mimic-response@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.0.tgz#df3d3652a73fded6b9b0b24146e6fd052353458e" + +min-document@^2.19.0: + version "2.19.0" + resolved "https://registry.yarnpkg.com/min-document/-/min-document-2.19.0.tgz#7bd282e3f5842ed295bb748cdd9f1ffa2c824685" + dependencies: + dom-walk "^0.1.0" + +minimalistic-assert@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz#702be2dda6b37f4836bcb3f5db56641b64a1d3d3" + +minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" + +"minimatch@2 || 3", minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + dependencies: + brace-expansion "^1.1.7" + +minimist@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" + +minimist@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.1.0.tgz#99df657a52574c21c9057497df742790b2b4c0de" + +minimist@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" + +mississippi@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-2.0.0.tgz#3442a508fafc28500486feea99409676e4ee5a6f" + dependencies: + concat-stream "^1.5.0" + duplexify "^3.4.2" + end-of-stream "^1.1.0" + flush-write-stream "^1.0.0" + from2 "^2.1.0" + parallel-transform "^1.1.0" + pump "^2.0.1" + pumpify "^1.3.3" + stream-each "^1.1.0" + through2 "^2.0.0" + +mixin-deep@^1.2.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.1.tgz#a49e7268dce1a0d9698e45326c5626df3543d0fe" + dependencies: + for-in "^1.0.2" + is-extendable "^1.0.1" + +"mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0: + version "0.5.1" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" + dependencies: + minimist "0.0.8" + +move-concurrently@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92" + dependencies: + aproba "^1.1.1" + copy-concurrently "^1.0.0" + fs-write-stream-atomic "^1.0.8" + mkdirp "^0.5.1" + rimraf "^2.5.4" + run-queue "^1.0.3" + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + +multer@1.3.0, multer@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/multer/-/multer-1.3.0.tgz#092b2670f6846fa4914965efc8cf94c20fec6cd2" + dependencies: + append-field "^0.1.0" + busboy "^0.2.11" + concat-stream "^1.5.0" + mkdirp "^0.5.1" + object-assign "^3.0.0" + on-finished "^2.3.0" + type-is "^1.6.4" + xtend "^4.0.0" + +multimatch@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/multimatch/-/multimatch-2.1.0.tgz#9c7906a22fb4c02919e2f5f75161b4cdbd4b2a2b" + dependencies: + array-differ "^1.0.0" + array-union "^1.0.1" + arrify "^1.0.0" + minimatch "^3.0.0" + +mute-stream@0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.6.tgz#48962b19e169fd1dfc240b3f1e7317627bbc47db" + +mute-stream@0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" + +nan@^2.3.0: + version "2.9.2" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.9.2.tgz#f564d75f5f8f36a6d9456cca7a6c4fe488ab7866" + +nanomatch@^1.2.9: + version "1.2.9" + resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.9.tgz#879f7150cb2dab7a471259066c104eee6e0fa7c2" + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + define-property "^2.0.2" + extend-shallow "^3.0.2" + fragment-cache "^0.2.1" + is-odd "^2.0.0" + is-windows "^1.0.2" + kind-of "^6.0.2" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +negotiator@0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9" + +neo-async@^2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.5.0.tgz#76b1c823130cca26acfbaccc8fbaf0a2fa33b18f" + +next-tick@1: + version "1.0.0" + resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c" + +next-tick@~0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-0.2.2.tgz#75da4a927ee5887e39065880065b7336413b310d" + +node-dir@0.1.8: + version "0.1.8" + resolved "https://registry.yarnpkg.com/node-dir/-/node-dir-0.1.8.tgz#55fb8deb699070707fb67f91a460f0448294c77d" + +node-libs-browser@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.1.0.tgz#5f94263d404f6e44767d726901fff05478d600df" + dependencies: + assert "^1.1.1" + browserify-zlib "^0.2.0" + buffer "^4.3.0" + console-browserify "^1.1.0" + constants-browserify "^1.0.0" + crypto-browserify "^3.11.0" + domain-browser "^1.1.1" + events "^1.0.0" + https-browserify "^1.0.0" + os-browserify "^0.3.0" + path-browserify "0.0.0" + process "^0.11.10" + punycode "^1.2.4" + querystring-es3 "^0.2.0" + readable-stream "^2.3.3" + stream-browserify "^2.0.1" + stream-http "^2.7.2" + string_decoder "^1.0.0" + timers-browserify "^2.0.4" + tty-browserify "0.0.0" + url "^0.11.0" + util "^0.10.3" + vm-browserify "0.0.4" + +node-pre-gyp@^0.6.39: + version "0.6.39" + resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.39.tgz#c00e96860b23c0e1420ac7befc5044e1d78d8649" + dependencies: + detect-libc "^1.0.2" + hawk "3.1.3" + mkdirp "^0.5.1" + nopt "^4.0.1" + npmlog "^4.0.2" + rc "^1.1.7" + request "2.81.0" + rimraf "^2.6.1" + semver "^5.3.0" + tar "^2.2.1" + tar-pack "^3.4.0" + +nodemon@^1.14.1: + version "1.15.1" + resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-1.15.1.tgz#54daa72443d8d5a548f130866b92e65cded0ed58" + dependencies: + chokidar "^2.0.2" + debug "^3.1.0" + ignore-by-default "^1.0.1" + minimatch "^3.0.4" + pstree.remy "^1.1.0" + semver "^5.4.1" + touch "^3.1.0" + undefsafe "^2.0.1" + update-notifier "^2.3.0" + +nomnom@^1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/nomnom/-/nomnom-1.8.1.tgz#2151f722472ba79e50a76fc125bb8c8f2e4dc2a7" + dependencies: + chalk "~0.4.0" + underscore "~1.6.0" + +nopt@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" + dependencies: + abbrev "1" + osenv "^0.1.4" + +nopt@~1.0.10: + version "1.0.10" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-1.0.10.tgz#6ddd21bd2a31417b92727dd585f8a6f37608ebee" + dependencies: + abbrev "1" + +normalize-package-data@^2.3.2: + version "2.4.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f" + dependencies: + hosted-git-info "^2.1.4" + is-builtin-module "^1.0.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.0.1" + +normalize-path@^2.0.0, normalize-path@^2.0.1, normalize-path@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" + dependencies: + remove-trailing-separator "^1.0.1" + +npm-run-path@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" + dependencies: + path-key "^2.0.0" + +npmlog@^4.0.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" + dependencies: + are-we-there-yet "~1.1.2" + console-control-strings "~1.1.0" + gauge "~2.7.3" + set-blocking "~2.0.0" + +number-is-nan@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" + +oauth-sign@~0.8.1: + version "0.8.2" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" + +object-assign@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-3.0.0.tgz#9bedd5ca0897949bca47e7ff408062d549f587f2" + +object-assign@^4, object-assign@^4.0.1, object-assign@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + +object-component@0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/object-component/-/object-component-0.0.3.tgz#f0c69aa50efc95b866c186f400a33769cb2f1291" + +object-copy@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" + dependencies: + copy-descriptor "^0.1.0" + define-property "^0.2.5" + kind-of "^3.0.3" + +object-visit@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" + dependencies: + isobject "^3.0.0" + +object.omit@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" + dependencies: + for-own "^0.1.4" + is-extendable "^0.1.1" + +object.pick@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" + dependencies: + isobject "^3.0.1" + +on-finished@^2.3.0, on-finished@~2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" + dependencies: + ee-first "1.1.1" + +once@^1.3.0, once@^1.3.1, once@^1.3.3, once@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + dependencies: + wrappy "1" + +onetime@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-1.1.0.tgz#a1f7838f8314c516f05ecefcbc4ccfe04b4ed789" + +onetime@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" + dependencies: + mimic-fn "^1.0.0" + +optional@0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/optional/-/optional-0.1.4.tgz#cdb1a9bedc737d2025f690ceeb50e049444fd5b3" + +ora@^0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/ora/-/ora-0.2.3.tgz#37527d220adcd53c39b73571d754156d5db657a4" + dependencies: + chalk "^1.1.1" + cli-cursor "^1.0.2" + cli-spinners "^0.1.2" + object-assign "^4.0.1" + +os-browserify@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" + +os-homedir@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" + +os-locale@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-2.1.0.tgz#42bc2900a6b5b8bd17376c8e882b65afccf24bf2" + dependencies: + execa "^0.7.0" + lcid "^1.0.0" + mem "^1.1.0" + +os-shim@^0.1.2: + version "0.1.3" + resolved "https://registry.yarnpkg.com/os-shim/-/os-shim-0.1.3.tgz#6b62c3791cf7909ea35ed46e17658bb417cb3917" + +os-tmpdir@^1.0.0, os-tmpdir@^1.0.1, os-tmpdir@~1.0.1, os-tmpdir@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + +osenv@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.0" + +p-cancelable@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-0.3.0.tgz#b9e123800bcebb7ac13a479be195b507b98d30fa" + +p-each-series@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-each-series/-/p-each-series-1.0.0.tgz#930f3d12dd1f50e7434457a22cd6f04ac6ad7f71" + dependencies: + p-reduce "^1.0.0" + +p-finally@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + +p-lazy@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-lazy/-/p-lazy-1.0.0.tgz#ec53c802f2ee3ac28f166cc82d0b2b02de27a835" + +p-limit@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.2.0.tgz#0e92b6bedcb59f022c13d0f1949dc82d15909f1c" + dependencies: + p-try "^1.0.0" + +p-locate@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" + dependencies: + p-limit "^1.1.0" + +p-map@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-1.2.0.tgz#e4e94f311eabbc8633a1e79908165fca26241b6b" + +p-reduce@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-reduce/-/p-reduce-1.0.0.tgz#18c2b0dd936a4690a529f8231f58a0fdb6a47dfa" + +p-timeout@^1.1.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-1.2.1.tgz#5eb3b353b7fce99f101a1038880bb054ebbea386" + dependencies: + p-finally "^1.0.0" + +p-try@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" + +package-json@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/package-json/-/package-json-4.0.1.tgz#8869a0401253661c4c4ca3da6c2121ed555f5eed" + dependencies: + got "^6.7.1" + registry-auth-token "^3.0.1" + registry-url "^3.0.3" + semver "^5.1.0" + +pako@~1.0.5: + version "1.0.6" + resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.6.tgz#0101211baa70c4bca4a0f63f2206e97b7dfaf258" + +parallel-transform@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.1.0.tgz#d410f065b05da23081fcd10f28854c29bda33b06" + dependencies: + cyclist "~0.2.2" + inherits "^2.0.3" + readable-stream "^2.1.5" + +parse-asn1@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.0.tgz#37c4f9b7ed3ab65c74817b5f2480937fbf97c712" + dependencies: + asn1.js "^4.0.0" + browserify-aes "^1.0.0" + create-hash "^1.1.0" + evp_bytestokey "^1.0.0" + pbkdf2 "^3.0.3" + +parse-glob@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" + dependencies: + glob-base "^0.3.0" + is-dotfile "^1.0.0" + is-extglob "^1.0.0" + is-glob "^2.0.0" + +parse-json@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" + dependencies: + error-ex "^1.2.0" + +parse-passwd@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" + +parseqs@0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/parseqs/-/parseqs-0.0.5.tgz#d5208a3738e46766e291ba2ea173684921a8b89d" + dependencies: + better-assert "~1.0.0" + +parseuri@0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/parseuri/-/parseuri-0.0.5.tgz#80204a50d4dbb779bfdc6ebe2778d90e4bce320a" + dependencies: + better-assert "~1.0.0" + +parseurl@~1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.2.tgz#fc289d4ed8993119460c156253262cdc8de65bf3" + +pascalcase@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" + +path-browserify@0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.0.tgz#a0b870729aae214005b7d5032ec2cbbb0fb4451a" + +path-dirname@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" + +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + +path-is-absolute@^1.0.0, path-is-absolute@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + +path-is-inside@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" + +path-key@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" + +path-parse@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1" + +path-to-regexp@0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" + +path-type@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" + dependencies: + pify "^2.0.0" + +pause-stream@0.0.11: + version "0.0.11" + resolved "https://registry.yarnpkg.com/pause-stream/-/pause-stream-0.0.11.tgz#fe5a34b0cbce12b5aa6a2b403ee2e73b602f1445" + dependencies: + through "~2.3" + +pbkdf2@^3.0.3: + version "3.0.14" + resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.14.tgz#a35e13c64799b06ce15320f459c230e68e73bade" + dependencies: + create-hash "^1.1.2" + create-hmac "^1.1.4" + ripemd160 "^2.0.1" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +performance-now@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d91b56d8f2555e5" + +pify@^2.0.0, pify@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + +pify@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" + +pinkie-promise@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" + dependencies: + pinkie "^2.0.0" + +pinkie@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" + +pkg-dir@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b" + dependencies: + find-up "^2.1.0" + +posix-character-classes@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" + +prepend-http@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" + +preserve@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" + +prettier@^1.5.3: + version "1.10.2" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.10.2.tgz#1af8356d1842276a99a5b5529c82dd9e9ad3cc93" + +pretty-bytes@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-4.0.2.tgz#b2bf82e7350d65c6c33aa95aaa5a4f6327f61cd9" + +private@^0.1.6, private@^0.1.7, private@~0.1.5: + version "0.1.8" + resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" + +process-nextick-args@^1.0.6: + version "1.0.7" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" + +process-nextick-args@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" + +process@^0.11.10: + version "0.11.10" + resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" + +process@~0.5.1: + version "0.5.2" + resolved "https://registry.yarnpkg.com/process/-/process-0.5.2.tgz#1638d8a8e34c2f440a91db95ab9aeb677fc185cf" + +promise-inflight@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" + +proxy-addr@~2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.3.tgz#355f262505a621646b3130a728eb647e22055341" + dependencies: + forwarded "~0.1.2" + ipaddr.js "1.6.0" + +prr@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" + +ps-tree@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/ps-tree/-/ps-tree-1.1.0.tgz#b421b24140d6203f1ed3c76996b4427b08e8c014" + dependencies: + event-stream "~3.3.0" + +pseudomap@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" + +pstree.remy@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/pstree.remy/-/pstree.remy-1.1.0.tgz#f2af27265bd3e5b32bbfcc10e80bac55ba78688b" + dependencies: + ps-tree "^1.1.0" + +public-encrypt@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.0.tgz#39f699f3a46560dd5ebacbca693caf7c65c18cc6" + dependencies: + bn.js "^4.1.0" + browserify-rsa "^4.0.0" + create-hash "^1.1.0" + parse-asn1 "^5.0.0" + randombytes "^2.0.1" + +pump@^2.0.0, pump@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909" + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +pumpify@^1.3.3: + version "1.4.0" + resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.4.0.tgz#80b7c5df7e24153d03f0e7ac8a05a5d068bd07fb" + dependencies: + duplexify "^3.5.3" + inherits "^2.0.3" + pump "^2.0.0" + +punycode@1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" + +punycode@^1.2.4, punycode@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + +qs@6.4.0, qs@~6.4.0: + version "6.4.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233" + +qs@6.5.1: + version "6.5.1" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.1.tgz#349cdf6eef89ec45c12d7d5eb3fc0c870343a6d8" + +querystring-es3@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" + +querystring@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" + +randomatic@^1.1.3: + version "1.1.7" + resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.7.tgz#c7abe9cc8b87c0baa876b19fde83fd464797e38c" + dependencies: + is-number "^3.0.0" + kind-of "^4.0.0" + +randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5: + version "2.0.6" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.0.6.tgz#d302c522948588848a8d300c932b44c24231da80" + dependencies: + safe-buffer "^5.1.0" + +randomfill@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458" + dependencies: + randombytes "^2.0.5" + safe-buffer "^5.1.0" + +range-parser@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" + +raw-body@2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.3.2.tgz#bcd60c77d3eb93cde0050295c3f379389bc88f89" + dependencies: + bytes "3.0.0" + http-errors "1.6.2" + iconv-lite "0.4.19" + unpipe "1.0.0" + +raw-body@~2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.2.0.tgz#994976cf6a5096a41162840492f0bdc5d6e7fb96" + dependencies: + bytes "2.4.0" + iconv-lite "0.4.15" + unpipe "1.0.0" + +rc@^1.0.1, rc@^1.1.6, rc@^1.1.7: + version "1.2.5" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.5.tgz#275cd687f6e3b36cc756baa26dfee80a790301fd" + dependencies: + deep-extend "~0.4.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~2.0.1" + +read-chunk@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/read-chunk/-/read-chunk-2.1.0.tgz#6a04c0928005ed9d42e1a6ac5600e19cbc7ff655" + dependencies: + pify "^3.0.0" + safe-buffer "^5.1.1" + +read-pkg-up@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" + dependencies: + find-up "^2.0.0" + read-pkg "^2.0.0" + +read-pkg@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" + dependencies: + load-json-file "^2.0.0" + normalize-package-data "^2.3.2" + path-type "^2.0.0" + +"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.4, readable-stream@^2.0.6, readable-stream@^2.1.4, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3: + version "2.3.4" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.4.tgz#c946c3f47fa7d8eabc0b6150f4a12f69a4574071" + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.0.3" + util-deprecate "~1.0.1" + +readable-stream@1.1.x: + version "1.1.14" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "0.0.1" + string_decoder "~0.10.x" + +readdirp@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78" + dependencies: + graceful-fs "^4.1.2" + minimatch "^3.0.2" + readable-stream "^2.0.2" + set-immediate-shim "^1.0.1" + +recast@^0.12.5: + version "0.12.9" + resolved "https://registry.yarnpkg.com/recast/-/recast-0.12.9.tgz#e8e52bdb9691af462ccbd7c15d5a5113647a15f1" + dependencies: + ast-types "0.10.1" + core-js "^2.4.1" + esprima "~4.0.0" + private "~0.1.5" + source-map "~0.6.1" + +recast@^0.13.0: + version "0.13.2" + resolved "https://registry.yarnpkg.com/recast/-/recast-0.13.2.tgz#919e7e856d5154f13284142ed1797753c6756137" + dependencies: + ast-types "0.10.2" + esprima "~4.0.0" + private "~0.1.5" + source-map "~0.6.1" + +rechoir@^0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" + dependencies: + resolve "^1.1.6" + +redis-commands@^1.2.0: + version "1.3.3" + resolved "https://registry.yarnpkg.com/redis-commands/-/redis-commands-1.3.3.tgz#6fa6034d23bae1b65e0a196fed9d9a9fe6eb3c13" + +redis-parser@^2.6.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/redis-parser/-/redis-parser-2.6.0.tgz#52ed09dacac108f1a631c07e9b69941e7a19504b" + +redis@^2.7.1: + version "2.8.0" + resolved "https://registry.yarnpkg.com/redis/-/redis-2.8.0.tgz#202288e3f58c49f6079d97af7a10e1303ae14b02" + dependencies: + double-ended-queue "^2.1.0-0" + redis-commands "^1.2.0" + redis-parser "^2.6.0" + +reflect-metadata@^0.1.12: + version "0.1.12" + resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.1.12.tgz#311bf0c6b63cd782f228a81abe146a2bfa9c56f2" + +regenerate@^1.2.1: + version "1.3.3" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.3.3.tgz#0c336d3980553d755c39b586ae3b20aa49c82b7f" + +regenerator-runtime@^0.11.0: + version "0.11.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" + +regenerator-transform@^0.10.0: + version "0.10.1" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.10.1.tgz#1e4996837231da8b7f3cf4114d71b5691a0680dd" + dependencies: + babel-runtime "^6.18.0" + babel-types "^6.19.0" + private "^0.1.6" + +regex-cache@^0.4.2: + version "0.4.4" + resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd" + dependencies: + is-equal-shallow "^0.1.3" + +regex-not@^1.0.0, regex-not@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" + dependencies: + extend-shallow "^3.0.2" + safe-regex "^1.1.0" + +regexpu-core@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240" + dependencies: + regenerate "^1.2.1" + regjsgen "^0.2.0" + regjsparser "^0.1.4" + +registry-auth-token@^3.0.1: + version "3.3.2" + resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-3.3.2.tgz#851fd49038eecb586911115af845260eec983f20" + dependencies: + rc "^1.1.6" + safe-buffer "^5.0.1" + +registry-url@^3.0.3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-3.1.0.tgz#3d4ef870f73dde1d77f0cf9a381432444e174942" + dependencies: + rc "^1.0.1" + +regjsgen@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" + +regjsparser@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c" + dependencies: + jsesc "~0.5.0" + +remove-trailing-separator@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" + +repeat-element@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a" + +repeat-string@^1.5.2, repeat-string@^1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + +repeating@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" + dependencies: + is-finite "^1.0.0" + +replace-ext@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-0.0.1.tgz#29bbd92078a739f0bcce2b4ee41e837953522924" + +replace-ext@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-1.0.0.tgz#de63128373fcbf7c3ccfa4de5a480c45a67958eb" + +request@2.81.0: + version "2.81.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.81.0.tgz#c6928946a0e06c5f8d6f8a9333469ffda46298a0" + dependencies: + aws-sign2 "~0.6.0" + aws4 "^1.2.1" + caseless "~0.12.0" + combined-stream "~1.0.5" + extend "~3.0.0" + forever-agent "~0.6.1" + form-data "~2.1.1" + har-validator "~4.2.1" + hawk "~3.1.3" + http-signature "~1.1.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.7" + oauth-sign "~0.8.1" + performance-now "^0.2.0" + qs "~6.4.0" + safe-buffer "^5.0.1" + stringstream "~0.0.4" + tough-cookie "~2.3.0" + tunnel-agent "^0.6.0" + uuid "^3.0.0" + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + +require-main-filename@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" + +resolve-cwd@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a" + dependencies: + resolve-from "^3.0.0" + +resolve-dir@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-1.0.1.tgz#79a40644c362be82f26effe739c9bb5382046f43" + dependencies: + expand-tilde "^2.0.0" + global-modules "^1.0.0" + +resolve-from@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" + +resolve-url@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" + +resolve@^1.1.6: + version "1.5.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.5.0.tgz#1f09acce796c9a762579f31b2c1cc4c3cddf9f36" + dependencies: + path-parse "^1.0.5" + +restore-cursor@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-1.0.1.tgz#34661f46886327fed2991479152252df92daa541" + dependencies: + exit-hook "^1.0.0" + onetime "^1.0.0" + +restore-cursor@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" + dependencies: + onetime "^2.0.0" + signal-exit "^3.0.2" + +ret@~0.1.10: + version "0.1.15" + resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" + +rimraf@2, rimraf@^2.2.0, rimraf@^2.2.8, rimraf@^2.5.1, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2: + version "2.6.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" + dependencies: + glob "^7.0.5" + +rimraf@~2.2.6: + version "2.2.8" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.2.8.tgz#e439be2aaee327321952730f99a8929e4fc50582" + +ripemd160@^2.0.0, ripemd160@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.1.tgz#0f4584295c53a3628af7e6d79aca21ce57d1c6e7" + dependencies: + hash-base "^2.0.0" + inherits "^2.0.1" + +run-async@^2.0.0, run-async@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" + dependencies: + is-promise "^2.1.0" + +run-queue@^1.0.0, run-queue@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47" + dependencies: + aproba "^1.1.1" + +rx-lite-aggregates@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz#753b87a89a11c95467c4ac1626c4efc4e05c67be" + dependencies: + rx-lite "*" + +rx-lite@*, rx-lite@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-4.0.8.tgz#0b1e11af8bc44836f04a6407e92da42467b79444" + +rx@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/rx/-/rx-4.1.0.tgz#a5f13ff79ef3b740fe30aa803fb09f98805d4782" + +rxjs@^5.0.0-beta.11, rxjs@^5.5.6: + version "5.5.6" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-5.5.6.tgz#e31fb96d6fd2ff1fd84bcea8ae9c02d007179c02" + dependencies: + symbol-observable "1.0.1" + +safe-buffer@5.1.1, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" + +safe-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" + dependencies: + ret "~0.1.10" + +schema-utils@^0.4.2: + version "0.4.5" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-0.4.5.tgz#21836f0608aac17b78f9e3e24daff14a5ca13a3e" + dependencies: + ajv "^6.1.0" + ajv-keywords "^3.1.0" + +scoped-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/scoped-regex/-/scoped-regex-1.0.0.tgz#a346bb1acd4207ae70bd7c0c7ca9e566b6baddb8" + +semver-diff@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-2.1.0.tgz#4bbb8437c8d37e4b0cf1a68fd726ec6d645d6d36" + dependencies: + semver "^5.0.3" + +"semver@2 || 3 || 4 || 5", semver@^5.0.1, semver@^5.0.3, semver@^5.1.0, semver@^5.3.0, semver@^5.4.1: + version "5.5.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab" + +send@0.16.1: + version "0.16.1" + resolved "https://registry.yarnpkg.com/send/-/send-0.16.1.tgz#a70e1ca21d1382c11d0d9f6231deb281080d7ab3" + dependencies: + debug "2.6.9" + depd "~1.1.1" + destroy "~1.0.4" + encodeurl "~1.0.1" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "~1.6.2" + mime "1.4.1" + ms "2.0.0" + on-finished "~2.3.0" + range-parser "~1.2.0" + statuses "~1.3.1" + +serialize-javascript@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-1.4.0.tgz#7c958514db6ac2443a8abc062dc9f7886a7f6005" + +serve-static@1.13.1: + version "1.13.1" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.13.1.tgz#4c57d53404a761d8f2e7c1e8a18a47dbf278a719" + dependencies: + encodeurl "~1.0.1" + escape-html "~1.0.3" + parseurl "~1.3.2" + send "0.16.1" + +set-blocking@^2.0.0, set-blocking@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + +set-getter@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/set-getter/-/set-getter-0.1.0.tgz#d769c182c9d5a51f409145f2fba82e5e86e80376" + dependencies: + to-object-path "^0.3.0" + +set-immediate-shim@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" + +set-value@^0.4.3: + version "0.4.3" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-0.4.3.tgz#7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1" + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.1" + to-object-path "^0.3.0" + +set-value@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.0.tgz#71ae4a88f0feefbbf52d1ea604f3fb315ebb6274" + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.3" + split-string "^3.0.1" + +setimmediate@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + +setprototypeof@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.0.3.tgz#66567e37043eeb4f04d91bd658c0cbefb55b8e04" + +setprototypeof@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" + +sha.js@^2.4.0, sha.js@^2.4.8: + version "2.4.10" + resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.10.tgz#b1fde5cd7d11a5626638a07c604ab909cfa31f9b" + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +shebang-command@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + dependencies: + shebang-regex "^1.0.0" + +shebang-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + +shelljs@^0.7.0: + version "0.7.8" + resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.7.8.tgz#decbcf874b0d1e5fb72e14b164a9683048e9acb3" + dependencies: + glob "^7.0.0" + interpret "^1.0.0" + rechoir "^0.6.2" + +signal-exit@^3.0.0, signal-exit@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" + +slash@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" + +slice-ansi@0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-0.0.4.tgz#edbf8903f66f7ce2f8eafd6ceed65e264c831b35" + +slide@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707" + +snapdragon-node@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" + dependencies: + define-property "^1.0.0" + isobject "^3.0.0" + snapdragon-util "^3.0.1" + +snapdragon-util@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" + dependencies: + kind-of "^3.2.0" + +snapdragon@^0.8.1: + version "0.8.1" + resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.1.tgz#e12b5487faded3e3dea0ac91e9400bf75b401370" + dependencies: + base "^0.11.1" + debug "^2.2.0" + define-property "^0.2.5" + extend-shallow "^2.0.1" + map-cache "^0.2.2" + source-map "^0.5.6" + source-map-resolve "^0.5.0" + use "^2.0.0" + +sntp@1.x.x: + version "1.0.9" + resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198" + dependencies: + hoek "2.x.x" + +socket.io-adapter@~1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-1.1.1.tgz#2a805e8a14d6372124dd9159ad4502f8cb07f06b" + +socket.io-client@2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-2.0.4.tgz#0918a552406dc5e540b380dcd97afc4a64332f8e" + dependencies: + backo2 "1.0.2" + base64-arraybuffer "0.1.5" + component-bind "1.0.0" + component-emitter "1.2.1" + debug "~2.6.4" + engine.io-client "~3.1.0" + has-cors "1.1.0" + indexof "0.0.1" + object-component "0.0.3" + parseqs "0.0.5" + parseuri "0.0.5" + socket.io-parser "~3.1.1" + to-array "0.1.4" + +socket.io-parser@~3.1.1: + version "3.1.3" + resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-3.1.3.tgz#ed2da5ee79f10955036e3da413bfd7f1e4d86c8e" + dependencies: + component-emitter "1.2.1" + debug "~3.1.0" + has-binary2 "~1.0.2" + isarray "2.0.1" + +socket.io@^2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-2.0.4.tgz#c1a4590ceff87ecf13c72652f046f716b29e6014" + dependencies: + debug "~2.6.6" + engine.io "~3.1.0" + socket.io-adapter "~1.1.0" + socket.io-client "2.0.4" + socket.io-parser "~3.1.1" + +source-list-map@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.0.tgz#aaa47403f7b245a92fbc97ea08f250d6087ed085" + +source-map-resolve@^0.5.0: + version "0.5.1" + resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.1.tgz#7ad0f593f2281598e854df80f19aae4b92d7a11a" + dependencies: + atob "^2.0.0" + decode-uri-component "^0.2.0" + resolve-url "^0.2.1" + source-map-url "^0.4.0" + urix "^0.1.0" + +source-map-support@^0.4.15: + version "0.4.18" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f" + dependencies: + source-map "^0.5.6" + +source-map-support@^0.5.0: + version "0.5.3" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.3.tgz#2b3d5fff298cfa4d1afd7d4352d569e9a0158e76" + dependencies: + source-map "^0.6.0" + +source-map-url@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" + +source-map@^0.5.6, source-map@^0.5.7: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + +source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + +spawn-sync@^1.0.15: + version "1.0.15" + resolved "https://registry.yarnpkg.com/spawn-sync/-/spawn-sync-1.0.15.tgz#b00799557eb7fb0c8376c29d44e8a1ea67e57476" + dependencies: + concat-stream "^1.4.7" + os-shim "^0.1.2" + +spdx-correct@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-1.0.2.tgz#4b3073d933ff51f3912f03ac5519498a4150db40" + dependencies: + spdx-license-ids "^1.0.2" + +spdx-expression-parse@~1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz#9bdf2f20e1f40ed447fbe273266191fced51626c" + +spdx-license-ids@^1.0.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz#c9df7a3424594ade6bd11900d596696dc06bac57" + +split-string@^3.0.1, split-string@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" + dependencies: + extend-shallow "^3.0.0" + +split@0.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/split/-/split-0.3.3.tgz#cd0eea5e63a211dfff7eb0f091c4133e2d0dd28f" + dependencies: + through "2" + +sshpk@^1.7.0: + version "1.13.1" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.13.1.tgz#512df6da6287144316dc4c18fe1cf1d940739be3" + dependencies: + asn1 "~0.2.3" + assert-plus "^1.0.0" + dashdash "^1.12.0" + getpass "^0.1.1" + optionalDependencies: + bcrypt-pbkdf "^1.0.0" + ecc-jsbn "~0.1.1" + jsbn "~0.1.0" + tweetnacl "~0.14.0" + +ssri@^5.2.4: + version "5.2.4" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-5.2.4.tgz#9985e14041e65fc397af96542be35724ac11da52" + dependencies: + safe-buffer "^5.1.1" + +static-extend@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" + dependencies: + define-property "^0.2.5" + object-copy "^0.1.0" + +"statuses@>= 1.3.1 < 2": + version "1.4.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087" + +statuses@~1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.3.1.tgz#faf51b9eb74aaef3b3acf4ad5f61abf24cb7b93e" + +stream-browserify@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.1.tgz#66266ee5f9bdb9940a4e4514cafb43bb71e5c9db" + dependencies: + inherits "~2.0.1" + readable-stream "^2.0.2" + +stream-combiner@~0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/stream-combiner/-/stream-combiner-0.0.4.tgz#4d5e433c185261dde623ca3f44c586bcf5c4ad14" + dependencies: + duplexer "~0.1.1" + +stream-each@^1.1.0: + version "1.2.2" + resolved "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.2.tgz#8e8c463f91da8991778765873fe4d960d8f616bd" + dependencies: + end-of-stream "^1.1.0" + stream-shift "^1.0.0" + +stream-http@^2.7.2: + version "2.8.0" + resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.0.tgz#fd86546dac9b1c91aff8fc5d287b98fafb41bc10" + dependencies: + builtin-status-codes "^3.0.0" + inherits "^2.0.1" + readable-stream "^2.3.3" + to-arraybuffer "^1.0.0" + xtend "^4.0.0" + +stream-shift@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.0.tgz#d5c752825e5367e786f78e18e445ea223a155952" + +stream-to-observable@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/stream-to-observable/-/stream-to-observable-0.1.0.tgz#45bf1d9f2d7dc09bed81f1c307c430e68b84cffe" + +streamsearch@0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-0.1.2.tgz#808b9d0e56fc273d809ba57338e929919a1a9f1a" + +string-template@~0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/string-template/-/string-template-0.2.1.tgz#42932e598a352d01fc22ec3367d9d84eec6c9add" + +string-width@^1.0.1, string-width@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" + dependencies: + code-point-at "^1.0.0" + is-fullwidth-code-point "^1.0.0" + strip-ansi "^3.0.0" + +string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" + dependencies: + is-fullwidth-code-point "^2.0.0" + strip-ansi "^4.0.0" + +string_decoder@^1.0.0, string_decoder@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.3.tgz#0fc67d7c141825de94282dd536bec6b9bce860ab" + dependencies: + safe-buffer "~5.1.0" + +string_decoder@~0.10.x: + version "0.10.31" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" + +stringstream@~0.0.4: + version "0.0.5" + resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" + +strip-ansi@^3.0.0, strip-ansi@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + dependencies: + ansi-regex "^2.0.0" + +strip-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + dependencies: + ansi-regex "^3.0.0" + +strip-ansi@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-0.1.1.tgz#39e8a98d044d150660abe4a6808acf70bb7bc991" + +strip-bom-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-bom-stream/-/strip-bom-stream-2.0.0.tgz#f87db5ef2613f6968aa545abfe1ec728b6a829ca" + dependencies: + first-chunk-stream "^2.0.0" + strip-bom "^2.0.0" + +strip-bom@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" + dependencies: + is-utf8 "^0.2.0" + +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + +strip-eof@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" + +strip-json-comments@^2.0.0, strip-json-comments@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + +supports-color@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" + +supports-color@^4.4.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.5.0.tgz#be7a0de484dec5c5cddf8b3d59125044912f635b" + dependencies: + has-flag "^2.0.0" + +supports-color@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.2.0.tgz#b0d5333b1184dd3666cbe5aa0b45c5ac7ac17a4a" + dependencies: + has-flag "^3.0.0" + +symbol-observable@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.0.1.tgz#8340fc4702c3122df5d22288f88283f513d3fdd4" + +tapable@^0.2.7: + version "0.2.8" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-0.2.8.tgz#99372a5c999bf2df160afc0d74bed4f47948cd22" + +tapable@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.0.0.tgz#cbb639d9002eed9c6b5975eb20598d7936f1f9f2" + +tar-pack@^3.4.0: + version "3.4.1" + resolved "https://registry.yarnpkg.com/tar-pack/-/tar-pack-3.4.1.tgz#e1dbc03a9b9d3ba07e896ad027317eb679a10a1f" + dependencies: + debug "^2.2.0" + fstream "^1.0.10" + fstream-ignore "^1.0.5" + once "^1.3.3" + readable-stream "^2.1.4" + rimraf "^2.5.1" + tar "^2.2.1" + uid-number "^0.0.6" + +tar@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1" + dependencies: + block-stream "*" + fstream "^1.0.2" + inherits "2" + +temp@^0.8.1: + version "0.8.3" + resolved "https://registry.yarnpkg.com/temp/-/temp-0.8.3.tgz#e0c6bc4d26b903124410e4fed81103014dfc1f59" + dependencies: + os-tmpdir "^1.0.0" + rimraf "~2.2.6" + +term-size@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/term-size/-/term-size-1.2.0.tgz#458b83887f288fc56d6fffbfad262e26638efa69" + dependencies: + execa "^0.7.0" + +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + +textextensions@2: + version "2.2.0" + resolved "https://registry.yarnpkg.com/textextensions/-/textextensions-2.2.0.tgz#38ac676151285b658654581987a0ce1a4490d286" + +through2@^2.0.0, through2@^2.0.1: + version "2.0.3" + resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be" + dependencies: + readable-stream "^2.1.5" + xtend "~4.0.1" + +through@2, through@^2.3.6, through@~2.3, through@~2.3.1: + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + +timed-out@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" + +timers-browserify@^2.0.4: + version "2.0.6" + resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.6.tgz#241e76927d9ca05f4d959819022f5b3664b64bae" + dependencies: + setimmediate "^1.0.4" + +timers-ext@0.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/timers-ext/-/timers-ext-0.1.2.tgz#61cc47a76c1abd3195f14527f978d58ae94c5204" + dependencies: + es5-ext "~0.10.14" + next-tick "1" + +tmp@^0.0.29: + version "0.0.29" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.29.tgz#f25125ff0dd9da3ccb0c2dd371ee1288bb9128c0" + dependencies: + os-tmpdir "~1.0.1" + +tmp@^0.0.33: + version "0.0.33" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + dependencies: + os-tmpdir "~1.0.2" + +to-array@0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/to-array/-/to-array-0.1.4.tgz#17e6c11f73dd4f3d74cda7a4ff3238e9ad9bf890" + +to-arraybuffer@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" + +to-fast-properties@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" + +to-object-path@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" + dependencies: + kind-of "^3.0.2" + +to-regex-range@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" + dependencies: + is-number "^3.0.0" + repeat-string "^1.6.1" + +to-regex@^3.0.1: + version "3.0.2" + resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" + dependencies: + define-property "^2.0.2" + extend-shallow "^3.0.2" + regex-not "^1.0.2" + safe-regex "^1.1.0" + +touch@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/touch/-/touch-3.1.0.tgz#fe365f5f75ec9ed4e56825e0bb76d24ab74af83b" + dependencies: + nopt "~1.0.10" + +tough-cookie@~2.3.0: + version "2.3.3" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.3.tgz#0b618a5565b6dea90bf3425d04d55edc475a7561" + dependencies: + punycode "^1.4.1" + +trim-right@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" + +ts-loader@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-4.0.0.tgz#1d79f777e4f09de88a60697d8d4a96e55164caa9" + dependencies: + chalk "^2.3.0" + enhanced-resolve "^4.0.0" + loader-utils "^1.0.2" + micromatch "^3.1.4" + semver "^5.0.1" + +ts-node@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-4.1.0.tgz#36d9529c7b90bb993306c408cd07f7743de20712" + dependencies: + arrify "^1.0.0" + chalk "^2.3.0" + diff "^3.1.0" + make-error "^1.1.1" + minimist "^1.2.0" + mkdirp "^0.5.1" + source-map-support "^0.5.0" + tsconfig "^7.0.0" + v8flags "^3.0.0" + yn "^2.0.0" + +tsconfig@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/tsconfig/-/tsconfig-7.0.0.tgz#84538875a4dc216e5c4a5432b3a4dec3d54e91b7" + dependencies: + "@types/strip-bom" "^3.0.0" + "@types/strip-json-comments" "0.0.30" + strip-bom "^3.0.0" + strip-json-comments "^2.0.0" + +tslib@^1.7.1: + version "1.9.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.0.tgz#e37a86fda8cbbaf23a057f473c9f4dc64e5fc2e8" + +tty-browserify@0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" + +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + dependencies: + safe-buffer "^5.0.1" + +tweetnacl@^0.14.3, tweetnacl@~0.14.0: + version "0.14.5" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + +type-is@^1.6.4, type-is@~1.6.15: + version "1.6.16" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.16.tgz#f89ce341541c672b25ee7ae3c73dee3b2be50194" + dependencies: + media-typer "0.3.0" + mime-types "~2.1.18" + +typedarray@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" + +typescript@^2.6.2: + version "2.7.2" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.7.2.tgz#2d615a1ef4aee4f574425cdff7026edf81919836" + +uglify-es@^3.3.4: + version "3.3.9" + resolved "https://registry.yarnpkg.com/uglify-es/-/uglify-es-3.3.9.tgz#0c1c4f0700bed8dbc124cdb304d2592ca203e677" + dependencies: + commander "~2.13.0" + source-map "~0.6.1" + +uglifyjs-webpack-plugin@^1.1.1, uglifyjs-webpack-plugin@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-1.2.2.tgz#e7516d4367afdb715c3847841eb46f94c45ca2b9" + dependencies: + cacache "^10.0.1" + find-cache-dir "^1.0.0" + schema-utils "^0.4.2" + serialize-javascript "^1.4.0" + source-map "^0.6.1" + uglify-es "^3.3.4" + webpack-sources "^1.1.0" + worker-farm "^1.5.2" + +uid-number@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" + +ultron@~1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.1.1.tgz#9fe1536a10a664a65266a1e3ccf85fd36302bc9c" + +undefsafe@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/undefsafe/-/undefsafe-2.0.2.tgz#225f6b9e0337663e0d8e7cfd686fc2836ccace76" + dependencies: + debug "^2.2.0" + +underscore@~1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.6.0.tgz#8b38b10cacdef63337b8b24e4ff86d45aea529a8" + +union-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4" + dependencies: + arr-union "^3.1.0" + get-value "^2.0.6" + is-extendable "^0.1.1" + set-value "^0.4.3" + +unique-filename@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.0.tgz#d05f2fe4032560871f30e93cbe735eea201514f3" + dependencies: + unique-slug "^2.0.0" + +unique-slug@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.0.tgz#db6676e7c7cc0629878ff196097c78855ae9f4ab" + dependencies: + imurmurhash "^0.1.4" + +unique-string@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-1.0.0.tgz#9e1057cca851abb93398f8b33ae187b99caec11a" + dependencies: + crypto-random-string "^1.0.0" + +unpipe@1.0.0, unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + +unset-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" + dependencies: + has-value "^0.3.1" + isobject "^3.0.0" + +untildify@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/untildify/-/untildify-2.1.0.tgz#17eb2807987f76952e9c0485fc311d06a826a2e0" + dependencies: + os-homedir "^1.0.0" + +untildify@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/untildify/-/untildify-3.0.2.tgz#7f1f302055b3fea0f3e81dc78eb36766cb65e3f1" + +unzip-response@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-2.0.1.tgz#d2f0f737d16b0615e72a6935ed04214572d56f97" + +upath@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/upath/-/upath-1.0.2.tgz#80aaae5395abc5fd402933ae2f58694f0860204c" + dependencies: + lodash.endswith "^4.2.1" + lodash.isfunction "^3.0.8" + lodash.isstring "^4.0.1" + lodash.startswith "^4.2.1" + +update-notifier@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-2.3.0.tgz#4e8827a6bb915140ab093559d7014e3ebb837451" + dependencies: + boxen "^1.2.1" + chalk "^2.0.1" + configstore "^3.0.0" + import-lazy "^2.1.0" + is-installed-globally "^0.1.0" + is-npm "^1.0.0" + latest-version "^3.0.0" + semver-diff "^2.0.0" + xdg-basedir "^3.0.0" + +urix@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" + +url-parse-lax@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73" + dependencies: + prepend-http "^1.0.1" + +url-to-options@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/url-to-options/-/url-to-options-1.0.1.tgz#1505a03a289a48cbd7a434efbaeec5055f5633a9" + +url@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" + dependencies: + punycode "1.3.2" + querystring "0.2.0" + +urlgrey@0.4.4: + version "0.4.4" + resolved "https://registry.yarnpkg.com/urlgrey/-/urlgrey-0.4.4.tgz#892fe95960805e85519f1cd4389f2cb4cbb7652f" + +use@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/use/-/use-2.0.2.tgz#ae28a0d72f93bf22422a18a2e379993112dec8e8" + dependencies: + define-property "^0.2.5" + isobject "^3.0.0" + lazy-cache "^2.0.2" + +util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + +util@0.10.3, util@^0.10.3: + version "0.10.3" + resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" + dependencies: + inherits "2.0.1" + +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + +uuid@^3.0.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.2.1.tgz#12c528bb9d58d0b9265d9a2f6f0fe8be17ff1f14" + +uws@~9.14.0: + version "9.14.0" + resolved "https://registry.yarnpkg.com/uws/-/uws-9.14.0.tgz#fac8386befc33a7a3705cbd58dc47b430ca4dd95" + +v8-compile-cache@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-1.1.2.tgz#8d32e4f16974654657e676e0e467a348e89b0dc4" + +v8flags@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-3.0.1.tgz#dce8fc379c17d9f2c9e9ed78d89ce00052b1b76b" + dependencies: + homedir-polyfill "^1.0.1" + +validate-npm-package-license@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz#2804babe712ad3379459acfbe24746ab2c303fbc" + dependencies: + spdx-correct "~1.0.0" + spdx-expression-parse "~1.0.0" + +validator@9.2.0: + version "9.2.0" + resolved "https://registry.yarnpkg.com/validator/-/validator-9.2.0.tgz#ad216eed5f37cac31a6fe00ceab1f6b88bded03e" + +vary@^1, vary@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + +verror@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" + dependencies: + assert-plus "^1.0.0" + core-util-is "1.0.2" + extsprintf "^1.2.0" + +vinyl-file@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/vinyl-file/-/vinyl-file-2.0.0.tgz#a7ebf5ffbefda1b7d18d140fcb07b223efb6751a" + dependencies: + graceful-fs "^4.1.2" + pify "^2.3.0" + pinkie-promise "^2.0.0" + strip-bom "^2.0.0" + strip-bom-stream "^2.0.0" + vinyl "^1.1.0" + +vinyl@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-1.2.0.tgz#5c88036cf565e5df05558bfc911f8656df218884" + dependencies: + clone "^1.0.0" + clone-stats "^0.0.1" + replace-ext "0.0.1" + +vinyl@^2.0.1: + version "2.1.0" + resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-2.1.0.tgz#021f9c2cf951d6b939943c89eb5ee5add4fd924c" + dependencies: + clone "^2.1.1" + clone-buffer "^1.0.0" + clone-stats "^1.0.0" + cloneable-readable "^1.0.0" + remove-trailing-separator "^1.0.1" + replace-ext "^1.0.0" + +vm-browserify@0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-0.0.4.tgz#5d7ea45bbef9e4a6ff65f95438e0a87c357d5a73" + dependencies: + indexof "0.0.1" + +watchpack@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.4.0.tgz#4a1472bcbb952bd0a9bb4036801f954dfb39faac" + dependencies: + async "^2.1.2" + chokidar "^1.7.0" + graceful-fs "^4.1.2" + +webpack-addons@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/webpack-addons/-/webpack-addons-1.1.5.tgz#2b178dfe873fb6e75e40a819fa5c26e4a9bc837a" + dependencies: + jscodeshift "^0.4.0" + +webpack-cli@^2.0.8: + version "2.0.8" + resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-2.0.8.tgz#c6220c1429d0901e1dba36f81f7e44c642d317d0" + dependencies: + chalk "^2.0.1" + codecov "^3.0.0" + cross-spawn "^5.1.0" + diff "^3.3.0" + enhanced-resolve "^3.4.1" + glob-all "^3.1.0" + global "^4.3.2" + global-modules "^1.0.0" + got "^7.1.0" + inquirer "^3.2.0" + interpret "^1.0.4" + jscodeshift "^0.4.0" + listr "^0.12.0" + loader-utils "^1.1.0" + lodash "^4.17.4" + log-symbols "2.1.0" + mkdirp "^0.5.1" + p-each-series "^1.0.0" + p-lazy "^1.0.0" + prettier "^1.5.3" + recast "^0.13.0" + resolve-cwd "^2.0.0" + supports-color "^4.4.0" + uglifyjs-webpack-plugin "^1.2.2" + v8-compile-cache "^1.1.0" + webpack-addons "^1.1.5" + webpack-fork-yeoman-generator "^1.1.1" + yargs "9.0.1" + yeoman-environment "^2.0.0" + +webpack-fork-yeoman-generator@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/webpack-fork-yeoman-generator/-/webpack-fork-yeoman-generator-1.1.1.tgz#c92b454aba7df9ea392669188aa0330964acf76f" + dependencies: + async "^2.0.0" + chalk "^1.0.0" + cli-table "^0.3.1" + cross-spawn "^5.0.1" + dargs "^5.1.0" + dateformat "^2.0.0" + debug "^2.1.0" + detect-conflict "^1.0.0" + error "^7.0.2" + find-up "^2.1.0" + github-username "^4.0.0" + istextorbinary "^2.1.0" + lodash "^4.11.1" + mem-fs-editor "^3.0.0" + minimist "^1.2.0" + mkdirp "^0.5.0" + pretty-bytes "^4.0.2" + read-chunk "^2.0.0" + read-pkg-up "^2.0.0" + rimraf "^2.2.0" + run-async "^2.0.0" + shelljs "^0.7.0" + text-table "^0.2.0" + through2 "^2.0.0" + yeoman-environment "^1.1.0" + +webpack-node-externals@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/webpack-node-externals/-/webpack-node-externals-1.6.0.tgz#232c62ec6092b100635a3d29d83c1747128df9bd" + +webpack-sources@^1.0.1, webpack-sources@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.1.0.tgz#a101ebae59d6507354d71d8013950a3a8b7a5a54" + dependencies: + source-list-map "^2.0.0" + source-map "~0.6.1" + +webpack@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.0.0.tgz#423c2d27cb050e7655c6ea25ce27bfcbfcb56731" + dependencies: + acorn "^5.0.0" + acorn-dynamic-import "^3.0.0" + ajv "^6.1.0" + ajv-keywords "^3.1.0" + chrome-trace-event "^0.1.1" + enhanced-resolve "^4.0.0" + eslint-scope "^3.7.1" + loader-runner "^2.3.0" + loader-utils "^1.1.0" + memory-fs "~0.4.1" + micromatch "^3.1.8" + mkdirp "~0.5.0" + neo-async "^2.5.0" + node-libs-browser "^2.0.0" + schema-utils "^0.4.2" + tapable "^1.0.0" + uglifyjs-webpack-plugin "^1.1.1" + watchpack "^1.4.0" + webpack-sources "^1.0.1" + +which-module@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" + +which@^1.2.14, which@^1.2.9: + version "1.3.0" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.0.tgz#ff04bdfc010ee547d780bec38e1ac1c2777d253a" + dependencies: + isexe "^2.0.0" + +wide-align@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.2.tgz#571e0f1b0604636ebc0dfc21b0339bbe31341710" + dependencies: + string-width "^1.0.2" + +widest-line@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-2.0.0.tgz#0142a4e8a243f8882c0233aa0e0281aa76152273" + dependencies: + string-width "^2.1.1" + +worker-farm@^1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.5.2.tgz#32b312e5dc3d5d45d79ef44acc2587491cd729ae" + dependencies: + errno "^0.1.4" + xtend "^4.0.1" + +wrap-ansi@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" + dependencies: + string-width "^1.0.1" + strip-ansi "^3.0.1" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + +write-file-atomic@^1.2.0: + version "1.3.4" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-1.3.4.tgz#f807a4f0b1d9e913ae7a48112e6cc3af1991b45f" + dependencies: + graceful-fs "^4.1.11" + imurmurhash "^0.1.4" + slide "^1.1.5" + +write-file-atomic@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.3.0.tgz#1ff61575c2e2a4e8e510d6fa4e243cce183999ab" + dependencies: + graceful-fs "^4.1.11" + imurmurhash "^0.1.4" + signal-exit "^3.0.2" + +ws@~3.3.1: + version "3.3.3" + resolved "https://registry.yarnpkg.com/ws/-/ws-3.3.3.tgz#f1cf84fe2d5e901ebce94efaece785f187a228f2" + dependencies: + async-limiter "~1.0.0" + safe-buffer "~5.1.0" + ultron "~1.1.0" + +xdg-basedir@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4" + +xhr2@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/xhr2/-/xhr2-0.1.4.tgz#7f87658847716db5026323812f818cadab387a5f" + +xmlhttprequest-ssl@~1.5.4: + version "1.5.5" + resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz#c2876b06168aadc40e57d97e81191ac8f4398b3e" + +xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.0, xtend@~4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" + +y18n@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" + +y18n@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" + +yallist@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" + +yargs-parser@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-7.0.0.tgz#8d0ac42f16ea55debd332caf4c4038b3e3f5dfd9" + dependencies: + camelcase "^4.1.0" + +yargs@9.0.1: + version "9.0.1" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-9.0.1.tgz#52acc23feecac34042078ee78c0c007f5085db4c" + dependencies: + camelcase "^4.1.0" + cliui "^3.2.0" + decamelize "^1.1.1" + get-caller-file "^1.0.1" + os-locale "^2.0.0" + read-pkg-up "^2.0.0" + require-directory "^2.1.1" + require-main-filename "^1.0.1" + set-blocking "^2.0.0" + string-width "^2.0.0" + which-module "^2.0.0" + y18n "^3.2.1" + yargs-parser "^7.0.0" + +yargs@~1.2.6: + version "1.2.6" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-1.2.6.tgz#9c7b4a82fd5d595b2bf17ab6dcc43135432fe34b" + dependencies: + minimist "^0.1.0" + +yeast@0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/yeast/-/yeast-0.1.2.tgz#008e06d8094320c372dbc2f8ed76a0ca6c8ac419" + +yeoman-environment@^1.1.0: + version "1.6.6" + resolved "https://registry.yarnpkg.com/yeoman-environment/-/yeoman-environment-1.6.6.tgz#cd85fa67d156060e440d7807d7ef7cf0d2d1d671" + dependencies: + chalk "^1.0.0" + debug "^2.0.0" + diff "^2.1.2" + escape-string-regexp "^1.0.2" + globby "^4.0.0" + grouped-queue "^0.3.0" + inquirer "^1.0.2" + lodash "^4.11.1" + log-symbols "^1.0.1" + mem-fs "^1.1.0" + text-table "^0.2.0" + untildify "^2.0.0" + +yeoman-environment@^2.0.0: + version "2.0.5" + resolved "https://registry.yarnpkg.com/yeoman-environment/-/yeoman-environment-2.0.5.tgz#84f22bafa84088971fe99ea85f654a3a3dd2b693" + dependencies: + chalk "^2.1.0" + debug "^3.1.0" + diff "^3.3.1" + escape-string-regexp "^1.0.2" + globby "^6.1.0" + grouped-queue "^0.3.3" + inquirer "^3.3.0" + is-scoped "^1.0.0" + lodash "^4.17.4" + log-symbols "^2.1.0" + mem-fs "^1.1.0" + text-table "^0.2.0" + untildify "^3.0.2" + +yn@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/yn/-/yn-2.0.0.tgz#e5adabc8acf408f6385fc76495684c88e6af689a" + +zone.js@^0.8.20: + version "0.8.20" + resolved "https://registry.yarnpkg.com/zone.js/-/zone.js-0.8.20.tgz#a218c48db09464b19ff6fc8f0d4bb5b1046e185d"