TranscryptOrg / Transcrypt

Python 3.9 to JavaScript compiler - Lean, fast, open!
https://www.transcrypt.org
Apache License 2.0
2.86k stars 215 forks source link

Compile plainly without imports or module definition #676

Open Tails opened 5 years ago

Tails commented 5 years ago

I'm trying to compile a single function for use as argument into Browserless, a headless Chrome instance.

# Python src
async def action():
    def resolver(resolve, reject):
        totalHeight = 0
        distance = 100

        def scroller():
            scrollHeight = document.body.scrollHeight
            window.scrollBy(0, distance)
            totalHeight += distance

            if totalHeight >= scrollHeight:
                clearInterval(timer)
                resolve()

        timer = setInterval(scroller, 100)

    await __new__ (Promise(resolver))

Compiles to:

// Transcrypt'ed from Python, 2019-09-20 11:52:53
import {AssertionError, AttributeError, BaseException, DeprecationWarning, Exception, IndexError, IterableError, KeyError, NotImplementedError, RuntimeWarning, StopIteration, UserWarning, ValueError, Warning, __JsIterator__, __PyIterator__, __Terminal__, __add__, __and__, __call__, __class__, __envir__, __eq__, __floordiv__, __ge__, __get__, __getcm__, __getitem__, __getslice__, __getsm__, __gt__, __i__, __iadd__, __iand__, __idiv__, __ijsmod__, __ilshift__, __imatmul__, __imod__, __imul__, __in__, __init__, __ior__, __ipow__, __irshift__, __isub__, __ixor__, __jsUsePyNext__, __jsmod__, __k__, __kwargtrans__, __le__, __lshift__, __lt__, __matmul__, __mergefields__, __mergekwargtrans__, __mod__, __mul__, __ne__, __neg__, __nest__, __or__, __pow__, __pragma__, __proxy__, __pyUseJsNext__, __rshift__, __setitem__, __setproperty__, __setslice__, __sort__, __specialattrib__, __sub__, __super__, __t__, __terminal__, __truediv__, __withblock__, __xor__, abs, all, any, assert, bool, bytearray, bytes, callable, chr, copy, deepcopy, delattr, dict, dir, divmod, enumerate, filter, float, getattr, hasattr, input, int, isinstance, issubclass, len, list, map, max, min, object, ord, pow, print, property, py_TypeError, py_iter, py_metatype, py_next, py_reversed, py_typeof, range, repr, round, set, setattr, sorted, str, sum, tuple, zip} from './org.transcrypt.__runtime__.js';
var __name__ = '__main__';
export var action = async function () {
    var resolver = function (resolve, reject) {
        var totalHeight = 0;
        var distance = 100;
        var scroller = function () {
            var scrollHeight = document.body.scrollHeight;
            window.scrollBy (0, distance);
            totalHeight += distance;
            if (totalHeight >= scrollHeight) {
                clearInterval (timer);
                resolve ();
            }
        };
        var timer = setInterval (scroller, 100);
    };
    await new Promise (resolver);
};

//# sourceMappingURL=scrolltobottom.map

But I am hoping to be able to generate a non-module version. Like this:

// ideal plain non-module JS
async function () {
    var resolver = function (resolve, reject) {
        var totalHeight = 0;
        var distance = 100;
        var scroller = function () {
            var scrollHeight = document.body.scrollHeight;
            window.scrollBy (0, distance);
            totalHeight += distance;
            if (totalHeight >= scrollHeight) {
                clearInterval (timer);
                resolve ();
            }
        };
        var timer = setInterval (scroller, 100);
    };
    await new Promise (resolver);
};

Is there an option available that makes this possible?

Tails commented 5 years ago

Somewhat related: https://github.com/QQuick/Transcrypt/issues/665

Andrei-Pozolotin commented 5 years ago

I also would like to see a compiler option which would make builtin name space an explicit required import