gajus / gajus/flow-runtime

Runtime types generated when not used

Open
#239 4 comments 0 reactions 0 assignees View on GitHub
Dominant language
JavaScript
Stars
797
Forks
49
PR merge metrics
No merged PRs in 30d

Description

This is a:

- [x] Bug Report
- [ ] Feature Request
- [ ] Question
- [ ] Other

Which concerns:

- [ ] flow-runtime
- [x] babel-plugin-flow-runtime
- [ ] flow-runtime-validators
- [ ] flow-runtime-mobx
- [ ] flow-config-parser
- [ ] The documentation website

Relates to #202.

---

### What is the current behaviour?

Transforming a barebones file that imports types from a dependency causes that dependency to get imported, even if the types aren't used - and the runtime types aren't available.

In this particular case, I'm passing the `annotate: false` option to `babel-plugin-flow-runtime` to try and work around #202.

```js
import type { APIGatewayEvent, Context, ProxyResult } from 'flow-aws-lambda';

import { load } from './load';

export function handle(evt: APIGatewayEvent, ctx: Context): Promise {
return load(evt, ctx);
}
```

Babel generates the following from the above file, which imports the `flow-aws-lambda` package; this package exports types, but does not export runtime types. I could try and use `@babel/register` to work around this, but for my purposes I'd like to have babel spit out code that's directly executed by `node`, for auditing and deployment purposes.

```js
"use strict";

exports.handle = handle;

var _flowAwsLambda = require("flow-aws-lambda");

var _load = require("./load");

var _flowRuntime = _interopRequireDefault(require("flow-runtime"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

const APIGatewayEvent = _flowRuntime.default.tdz(() => _flowAwsLambda.APIGatewayEvent);

const Context = _flowRuntime.default.tdz(() => _flowAwsLambda.Context);

const ProxyResult = _flowRuntime.default.tdz(() => _flowAwsLambda.ProxyResult);

function handle(evt, ctx) {
return (0, _load.load)(evt, ctx);
}
```

---

### What is the expected behaviour?

Generate only those runtime types that actually get used (in this case, none), and omit the associated imports if any:

```patch
--- dist/index.js
+++ dist/index.js
@@ -1,8 +1,6 @@
"use strict";

exports.handle = handle;
-
-var _flowAwsLambda = require("flow-aws-lambda");

var _load = require("./load");

@@ -10,12 +8,6 @@

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

-const APIGatewayEvent = _flowRuntime.default.tdz(() => _flowAwsLambda.APIGatewayEvent);
-
-const Context = _flowRuntime.default.tdz(() => _flowAwsLambda.Context);
-
-const ProxyResult = _flowRuntime.default.tdz(() => _flowAwsLambda.ProxyResult);
-
function handle(evt, ctx) {
return (0, _load.load)(evt, ctx);
}
```

Along these lines, it'd also be nice to be able to disable annotations for a specific function, but I think for now disabling annotations just for specific files in babel's rc file will suffice.

---

### Which package versions are you using?

- `flow-runtime@0.17.0`
- `babel-plugin-flow-runtime@0.19.0`

Contributor guide

No contributing guide indexed for this repository

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.