Runtime types generated when not used
- 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.