Skip to content

Runtime types generated when not used #239

@skeggse

Description

@skeggse

This is a:

  • Bug Report
  • Feature Request
  • Question
  • Other

Which concerns:

  • flow-runtime
  • 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.

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

import { load } from './load';

export function handle(evt: APIGatewayEvent<any>, ctx: Context): Promise<ProxyResult> {
  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.

"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:

--- 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

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions