Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ESM build targets ES5 resulting in polyfills for await #2471

Closed
1 of 2 tasks
Flarna opened this issue Sep 14, 2021 · 5 comments · Fixed by #2765
Closed
1 of 2 tasks

ESM build targets ES5 resulting in polyfills for await #2471

Flarna opened this issue Sep 14, 2021 · 5 comments · Fixed by #2765
Labels

Comments

@Flarna
Copy link
Member

Flarna commented Sep 14, 2021

  • This only affects the JavaScript OpenTelemetry library
  • This may affect other libraries, but I would like to get opinions here first

The ESM typescript build targets ES5 currently for everything.
see

"extends": "./tsconfig.es5.json",

and
"target": "es5"

As a result typescript generates quite heavy polyfills for e.g. await like this extracted from transpiled Meter.ts file:

Is this intended? In special for NodeJs users this doesn't make much sense as ESM is only supported by newer NodeJs versions which support await out of the box.

The current ESM support was done for browsers as far as I remember. Are there any browsers supporting ESM but not await?

var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
    return new (P || (P = Promise))(function (resolve, reject) {
        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
        step((generator = generator.apply(thisArg, _arguments || [])).next());
    });
};
var __generator = (this && this.__generator) || function (thisArg, body) {
    var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
    return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
    function verb(n) { return function (v) { return step([n, v]); }; }
    function step(op) {
        if (f) throw new TypeError("Generator is already executing.");
        while (_) try {
            if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
            if (y = 0, t) op = [op[0] & 2, t.value];
            switch (op[0]) {
                case 0: case 1: t = op; break;
                case 4: _.label++; return { value: op[1], done: false };
                case 5: _.label++; y = op[1]; op = [0]; continue;
                case 7: op = _.ops.pop(); _.trys.pop(); continue;
                default:
                    if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
                    if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
                    if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
                    if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
                    if (t[2]) _.ops.pop();
                    _.trys.pop(); continue;
            }
            op = body.call(thisArg, _);
        } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
        if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
    }
};
@legendecas
Copy link
Member

legendecas commented Sep 14, 2021

ESM is available since ECMAScript 2015 (aka. es5 edit: es6, sorry). So it doesn't make sense to targeting es5 when building esm targets.

@Flarna
Copy link
Member Author

Flarna commented Sep 14, 2021

as far as I remember ECMAScript 2015 is es6.
to avoid the await polyfills completly target ES2017 is needed but using target ES2015 (or ES6) already removes quite some of it

@legendecas
Copy link
Member

legendecas commented Sep 14, 2021

as far as I remember ECMAScript 2015 is es6.

@Flarna sorry, a typo.

tsconfig.base.json is already targeting es2017. That's default language version that we are publishing.

A naive investigation on feature matrix of modern browsers:

_ await import statement
Chrome 55 61
Firefox 52 60
Edge 14 16

So I'm a bit confident that we can safely switch to tsconfig.base.json for tsconfig.esm.json's base config.

@github-actions
Copy link

This issue is stale because it has been open 60 days with no activity. Remove stale label or comment or this will be closed in 14 days.

@github-actions github-actions bot added the stale label Nov 15, 2021
@github-actions
Copy link

This issue was closed because it has been stale for 14 days with no activity.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
2 participants