Skip to content

Runtime types generated when not used #239

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

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

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