Skip to content

es7.promise.finally polyfill definition gets nuked by es6.promise polyfill #9705

@konpikwastaken

Description

@konpikwastaken

Bug Report

Current Behavior
Using latest @babel/core, and @babel/transform-runtime (7.3.4) with useBuiltIns: 'usage' set. It appears the the correct polyfills are being applied, however due to the order in which the require statements get generated, the polyfill definition for es7.promise.finally gets nuked by the es6.promise definition.

Expected behavior/code
es7.promise.finally seems to extend native promise but loading es6.promise nukes the extension which then throws error in .finally() usage.

Babel Configuration (.babelrc, package.json, cli command)

Relevant config:

{
    presets: [
        [('@babel/preset-env'),
        {
            debug: true,
            modules: false,
            targets: {
                ie: '11'
            },
            useBuiltIns: 'usage'
        }],
        '@babel/preset-react'
    ],
        plugins: [
            ['@babel/plugin-transform-runtime',
                {
                    useESModules: true,
                    helpers: true
                }
            ]
        ]
}

Environment

  • Babel version(s): 7.3.4
  • Node/npm version: 10.x LTS
  • How you are using Babel: webpack + babel-loader with babel.config.js

Possible Solution
Unclear from my searching if there is a way to order the polyfills. I've tried explicitly using "include" and passing in es6.promise followed by es7.promise.finally but seems to make no difference. Current workaround is to add the following to exclude and add them manually, in proper order to my entry point, e.g.

babel.config.js

...
 [('@babel/preset-env'),
        {
            debug: true,
            modules: false,
            exclude: ['es7.promise.finally', 'es6.promise'],
            targets: {
                ie: '11'
            },
            useBuiltIns: 'usage'
        }],
...

entry.js

import 'core-js/modules/es6.promise';
import 'core-js/modules/es7.promise.finally';
...

/edit:
Adding sample section of generated imports as they appear in final output in "incorrect" order

// EXTERNAL MODULE: [omitted]/node_modules/core-js/modules/es7.promise.finally.js
var es7_promise_finally = __webpack_require__("../../node_modules/core-js/modules/es7.promise.finally.js");

// EXTERNAL MODULE: [omitted]/node_modules/@babel/runtime/helpers/esm/typeof.js
var esm_typeof = __webpack_require__("../../node_modules/@babel/runtime/helpers/esm/typeof.js");

// EXTERNAL MODULE: [omitted]/node_modules/tslib/tslib.es6.js
var tslib_es6 = __webpack_require__("../../node_modules/tslib/tslib.es6.js");

// EXTERNAL MODULE: [omitted]/node_modules/core-js/modules/es6.array.iterator.js
var es6_array_iterator = __webpack_require__("../../node_modules/core-js/modules/es6.array.iterator.js");

// EXTERNAL MODULE: [omitted]/node_modules/core-js/modules/es6.string.iterator.js
var es6_string_iterator = __webpack_require__("../../node_modules/core-js/modules/es6.string.iterator.js");

// EXTERNAL MODULE: [omitted]/node_modules/core-js/modules/web.dom.iterable.js
var web_dom_iterable = __webpack_require__("../../node_modules/core-js/modules/web.dom.iterable.js");

// EXTERNAL MODULE: [omitted]/node_modules/@babel/runtime/regenerator/index.js
var regenerator = __webpack_require__("../../node_modules/@babel/runtime/regenerator/index.js");
var regenerator_default = /*#__PURE__*/__webpack_require__.n(regenerator);

// EXTERNAL MODULE: [omitted]/node_modules/core-js/modules/es6.promise.js
var es6_promise = __webpack_require__("../../node_modules/core-js/modules/es6.promise.js");

Metadata

Metadata

Assignees

No one assigned

    Labels

    i: needs triageoutdatedA closed issue/PR that is archived due to age. Recommended to make a new issue

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions