Middy: [TypeScript] Definitions prevent importing middy

Created on 10 Jul 2018  路  9Comments  路  Source: middyjs/middy

Using middy 0.15.7 and Typescript 2.8.3.

import middy from 'middy' results in module node_modules/middy/index has no default export.

import { middy } from 'middy' results in has no exported member middy, did you mean IMiddy? IMiddy is just an interface and can not be used as a value though.

Changing export = middy; to export default middy in https://github.com/middyjs/middy/blob/master/index.d.ts#L41 fixes this issue

type-systems

All 9 comments

import * as middy from 'middy' is what you want

@aequasi while that may work, it results in:

ERROR in /project/node_modules/middy/middlewares.d.ts
(4,8): error TS1192: Module '"/project/node_modules/middy/index"' has no default export.

When using middlewares.

The line is middleware.d.ts#L4 which also expects it to be export default middy rather than export = middy.

Is there a reason why a default export is not used in this situation? It's just a bit weird not being able to import middy from 'middy', which I would say is the default most would expect.

What i posted is meant to solve the "no default export". I'm using it now with no issue.

Default exports are a typescript thing. The are the equiv of doing module.exports.default = SomeModule. For non typescript projects, that forces you to require with const SomeModule = require('some-module').default;

And, if this type definition was generated automatically (which i'd assume), it wont get a default export

I see, aren't default exports are a ES6 thing and not ts specific though?

But middleware.d.ts#L4 is not compatible with the type definitions for middy either way you chose to import- it will fail every time as soon as you use any middleware, I'm not quite sure how you got it to work since just checking out middy in a blank project gives the typescript compiler error in regards to this!

image

No, they are ts specific

import {IMiddy} from 'middy';
import * as jsonBodyParser from 'middy/src/middlewares/jsonBodyParser';
import * as httpErrorHandler from 'middy/src/middlewares/httpErrorHandler';

The above works perfect for me, and has the added benefit of not including the other middleware when not necessary.

You can ALSO do:

import {IMidd} from 'middy';
import {jsonBodyParser, httpErrorHandler} from 'middy/middlewares'

@aequasi Sorry, typescript newbie here

import * as cors from 'middy/src/middlewares/js'; 

results in error

Could not find a declaration file for module 'middy/src/middlewares/cors'. '/home/lakshmi/Work/src/hearout/hearout-app/node_modules/middy/src/middlewares/cors.js' implicitly has an 'any' type.
  Try `npm install @types/middy` if it exists or add a new declaration (.d.ts) file containing `declare module 'middy/src/middlewares/cors';`ts(7016)
Submodule import paths from this package are disallowed; import from the root instead (no-submodule-imports)

whereas

import { cors } from 'middy/middlewares';

results in

Submodule import paths from this package are disallowed; import from the root instead (no-submodule-imports)

Typescript: 3.5.3.

tsconfig.json https://gist.github.com/lakshmi-kannan/b5161d3291efaa99f2d62e6566e56271
tslint.json https://gist.github.com/lakshmi-kannan/127e05fca2c74c4bcb0be6ceb8177d24

Any ideas?

When using: import { cors } from 'middy/middlewares'; I'm getting:

<--- Last few GCs --->

[38700:0x102654000]    28343 ms: Scavenge 1383.2 (1423.1) -> 1382.5 (1423.6) MB, 3.6 / 0.0 ms  (average mu = 0.191, current mu = 0.127) allocation failure 
[38700:0x102654000]    28351 ms: Scavenge 1383.2 (1423.6) -> 1382.6 (1424.1) MB, 3.4 / 0.0 ms  (average mu = 0.191, current mu = 0.127) allocation failure 
[38700:0x102654000]    28358 ms: Scavenge 1383.5 (1424.1) -> 1383.1 (1425.6) MB, 4.1 / 0.0 ms  (average mu = 0.191, current mu = 0.127) allocation failure 


<--- JS stacktrace --->

==== JS stack trace =========================================

    0: ExitFrame [pc: 0x9ea5715be3d]
    1: StubFrame [pc: 0x9ea571110cb]
Security context: 0x30f7d469e6e9 <JSObject>
    2: scanJsDocToken [0x30f76cd5b389] [/Users/carlos.cortes/Documents/dev/wps-serverless/node_modules/typescript/lib/typescript.js:~8580] [pc=0x9ea571e51f2](this=0x30f76cd4e5d1 <Object map = 0x30f7cc7cb319>)
    3: /* anonymous */(aka /* anonymous */) [0x30f7dff246a1] [/Users/carlos.cortes/Documents/dev/wps-serverless/nod...

FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory
 1: 0x10003c597 node::Abort() [/Users/carlos.cortes/.nvm/versions/node/v10.15.3/bin/node]
 2: 0x10003c7a1 node::OnFatalError(char const*, char const*) [/Users/carlos.cortes/.nvm/versions/node/v10.15.3/bin/node]
 3: 0x1001ad575 v8::internal::V8::FatalProcessOutOfMemory(v8::internal::Isolate*, char const*, bool) [/Users/carlos.cortes/.nvm/versions/node/v10.15.3/bin/node]
 4: 0x100579242 v8::internal::Heap::FatalProcessOutOfMemory(char const*) [/Users/carlos.cortes/.nvm/versions/node/v10.15.3/bin/node]
 5: 0x10057bd15 v8::internal::Heap::CheckIneffectiveMarkCompact(unsigned long, double) [/Users/carlos.cortes/.nvm/versions/node/v10.15.3/bin/node]
 6: 0x100577bbf v8::internal::Heap::PerformGarbageCollection(v8::internal::GarbageCollector, v8::GCCallbackFlags) [/Users/carlos.cortes/.nvm/versions/node/v10.15.3/bin/node]
 7: 0x100575d94 v8::internal::Heap::CollectGarbage(v8::internal::AllocationSpace, v8::internal::GarbageCollectionReason, v8::GCCallbackFlags) [/Users/carlos.cortes/.nvm/versions/node/v10.15.3/bin/node]
 8: 0x10058262c v8::internal::Heap::AllocateRawWithLigthRetry(int, v8::internal::AllocationSpace, v8::internal::AllocationAlignment) [/Users/carlos.cortes/.nvm/versions/node/v10.15.3/bin/node]
 9: 0x1005826af v8::internal::Heap::AllocateRawWithRetryOrFail(int, v8::internal::AllocationSpace, v8::internal::AllocationAlignment) [/Users/carlos.cortes/.nvm/versions/node/v10.15.3/bin/node]
10: 0x100551ff4 v8::internal::Factory::NewFillerObject(int, bool, v8::internal::AllocationSpace) [/Users/carlos.cortes/.nvm/versions/node/v10.15.3/bin/node]
11: 0x1007da044 v8::internal::Runtime_AllocateInNewSpace(int, v8::internal::Object**, v8::internal::Isolate*) [/Users/carlos.cortes/.nvm/versions/node/v10.15.3/bin/node]
12: 0x9ea5715be3d 
13: 0x9ea571110cb 
14: 0x9ea571e51f2 
15: 0x9ea57ba0265 

I'm using:

  • Middy 0.30.4
  • Typescript 3.6.4
{
  "compilerOptions": {
    "forceConsistentCasingInFileNames": true,
    "lib": ["es2015", "es2016"],
    "module": "commonjs",
    "moduleResolution": "node",
    "noImplicitAny": true,
    "noImplicitReturns": true,
    "noImplicitThis": true,
    "noUnusedLocals": true,
    "outDir": ".build",
    "plugins": [
      { "name": "typescript-tslint-plugin" }
    ],
    "preserveConstEnums": true,
    "rootDir": "./",
    "sourceMap": true,
    "strict": true,
    "strictNullChecks": true,
    "target": "es6",
    "esModuleInterop": true
  },
  "exclude": ["node_modules"]
}

I'm going to close for now. All ts definitions will be redone in middy v2. I will need help, as I don't know TS, please post on https://github.com/middyjs/middy/pull/587 if you can.

Was this page helpful?
0 / 5 - 0 ratings