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?

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