py2ecma 0.0.2__tar.gz → 0.0.2.post9.dev0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (170) hide show
  1. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/.gitignore +1 -0
  2. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/PKG-INFO +1 -1
  3. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/pyproject.toml +5 -1
  4. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/scripts/build.sh +1 -1
  5. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/scripts/install.sh +1 -1
  6. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/src/py2ecma/arguments.py +6 -0
  7. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/src/py2ecma/codegenerator/nintermediate/comprehensions.py +10 -0
  8. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/src/py2ecma/codegenerator/nintermediate/node.py +1 -1
  9. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/src/py2ecma/codegenerator/parser.py +2 -0
  10. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/src/py2ecma/conf.py +3 -0
  11. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/src/py2ecma/dependency/getdeps.py +1 -1
  12. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/src/py2ecma/javascript/builtins.js +1 -0
  13. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/src/py2ecma/javascript/comprehensions.js +25 -0
  14. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/src/py2ecma/linker/jsloader.py +3 -1
  15. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/src/py2ecma/linker/packager.py +4 -2
  16. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/src/py2ecma/modules/dataclasses.py +5 -9
  17. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/src/py2ecma/modules/types.py +1 -0
  18. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/src/py2ecma/transpiler.py +3 -1
  19. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/tests/helpers.py +6 -1
  20. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/uv.lock +0 -505
  21. py2ecma-0.0.2.post9.dev0/variables.env +1 -0
  22. py2ecma-0.0.2/variables.env +0 -1
  23. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/.coveragerc +0 -0
  24. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/.envrc +0 -0
  25. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/.gitlab-ci.yml +0 -0
  26. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/Dockerfile +0 -0
  27. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/LICENSE-2.0.txt +0 -0
  28. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/Makefile +0 -0
  29. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/README.md +0 -0
  30. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/conftest.py +0 -0
  31. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/docs/Makefile +0 -0
  32. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/docs/source/api/modules.rst +0 -0
  33. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/docs/source/api/py2ecma.codegenerator.rst +0 -0
  34. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/docs/source/api/py2ecma.dependency.rst +0 -0
  35. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/docs/source/api/py2ecma.lexer.rst +0 -0
  36. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/docs/source/api/py2ecma.linker.rst +0 -0
  37. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/docs/source/api/py2ecma.modules.rst +0 -0
  38. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/docs/source/api/py2ecma.rst +0 -0
  39. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/docs/source/api/py2ecma.watcher.rst +0 -0
  40. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/docs/source/conf.py +0 -0
  41. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/docs/source/index.rst +0 -0
  42. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/py.typed +0 -0
  43. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/run.sh +0 -0
  44. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/scripts/README.md +0 -0
  45. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/scripts/check.sh +0 -0
  46. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/scripts/deploy.sh +0 -0
  47. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/scripts/format.sh +0 -0
  48. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/scripts/install_ci.sh +0 -0
  49. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/scripts/install_from_requirements.sh +0 -0
  50. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/scripts/install_pkg.sh +0 -0
  51. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/scripts/install_runtime.sh +0 -0
  52. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/scripts/release.sh +0 -0
  53. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/scripts/tests-cov.sh +0 -0
  54. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/scripts/tests.sh +0 -0
  55. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/scripts/verify.sh +0 -0
  56. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/scripts/version.sh +0 -0
  57. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/scripts/version_patch.sh +0 -0
  58. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/scripts/version_sanitized.sh +0 -0
  59. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/src/py2ecma/__init__.py +0 -0
  60. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/src/py2ecma/__main__.py +0 -0
  61. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/src/py2ecma/codegenerator/__init__.py +0 -0
  62. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/src/py2ecma/codegenerator/enums.py +0 -0
  63. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/src/py2ecma/codegenerator/nameconverter.py +0 -0
  64. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/src/py2ecma/codegenerator/nintermediate/__init__.py +0 -0
  65. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/src/py2ecma/codegenerator/nintermediate/asyncs.py +0 -0
  66. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/src/py2ecma/codegenerator/nintermediate/classes.py +0 -0
  67. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/src/py2ecma/codegenerator/nintermediate/controlflow.py +0 -0
  68. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/src/py2ecma/codegenerator/nintermediate/expressions.py +0 -0
  69. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/src/py2ecma/codegenerator/nintermediate/functions.py +0 -0
  70. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/src/py2ecma/codegenerator/nintermediate/imports.py +0 -0
  71. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/src/py2ecma/codegenerator/nintermediate/literals.py +0 -0
  72. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/src/py2ecma/codegenerator/nintermediate/module.py +0 -0
  73. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/src/py2ecma/codegenerator/nintermediate/statements.py +0 -0
  74. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/src/py2ecma/codegenerator/nintermediate/subscripting.py +0 -0
  75. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/src/py2ecma/codegenerator/nintermediate/variables.py +0 -0
  76. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/src/py2ecma/codegenerator/optimizer.py +0 -0
  77. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/src/py2ecma/codegenerator/specialcases.py +0 -0
  78. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/src/py2ecma/codegenerator/traversers.py +0 -0
  79. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/src/py2ecma/dependency/__init__.py +0 -0
  80. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/src/py2ecma/dependency/excludes.py +0 -0
  81. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/src/py2ecma/dependency/sortedset.py +0 -0
  82. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/src/py2ecma/dependency/spec.py +0 -0
  83. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/src/py2ecma/filesystem.py +0 -0
  84. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/src/py2ecma/get_logger.py +0 -0
  85. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/src/py2ecma/javascript/base.js +0 -0
  86. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/src/py2ecma/javascript/classes.js +0 -0
  87. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/src/py2ecma/javascript/dict.js +0 -0
  88. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/src/py2ecma/javascript/exceptions.js +0 -0
  89. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/src/py2ecma/javascript/list.js +0 -0
  90. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/src/py2ecma/javascript/set.js +0 -0
  91. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/src/py2ecma/javascript/strings.js +0 -0
  92. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/src/py2ecma/lexer/__init__.py +0 -0
  93. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/src/py2ecma/lexer/syntaxtree.py +0 -0
  94. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/src/py2ecma/linker/__init__.py +0 -0
  95. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/src/py2ecma/main.py +0 -0
  96. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/src/py2ecma/minimizer/__init__.py +0 -0
  97. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/src/py2ecma/minimizer/closure.py +0 -0
  98. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/src/py2ecma/modules/__init__.py +0 -0
  99. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/src/py2ecma/modules/codecs.py +0 -0
  100. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/src/py2ecma/modules/collections.py +0 -0
  101. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/src/py2ecma/modules/copy.py +0 -0
  102. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/src/py2ecma/modules/datetime.py +0 -0
  103. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/src/py2ecma/modules/enum.py +0 -0
  104. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/src/py2ecma/modules/functools.py +0 -0
  105. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/src/py2ecma/modules/json.py +0 -0
  106. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/src/py2ecma/modules/keyword.py +0 -0
  107. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/src/py2ecma/modules/math.py +0 -0
  108. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/src/py2ecma/modules/operator.py +0 -0
  109. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/src/py2ecma/modules/re.py +0 -0
  110. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/src/py2ecma/modules/re_/__init__.py +0 -0
  111. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/src/py2ecma/modules/re_/translate.py +0 -0
  112. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/src/py2ecma/modules/sre_compile.py +0 -0
  113. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/src/py2ecma/modules/sre_constants.py +0 -0
  114. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/src/py2ecma/modules/sre_parse.py +0 -0
  115. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/src/py2ecma/modules/stubs.py +0 -0
  116. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/src/py2ecma/modules/sys.py +0 -0
  117. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/src/py2ecma/modules/time.py +0 -0
  118. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/src/py2ecma/progress.py +0 -0
  119. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/src/py2ecma/py.typed +0 -0
  120. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/src/py2ecma/watcher/__init__.py +0 -0
  121. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/src/py2ecma/watcher/autocompile.py +0 -0
  122. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/tests/__init__.py +0 -0
  123. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/tests/advanced/macros.py +0 -0
  124. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/tests/advanced/test_getters.py +0 -0
  125. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/tests/advanced/test_setters.py +0 -0
  126. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/tests/imports/__init__.py +0 -0
  127. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/tests/imports/resources/module/__init__.py +0 -0
  128. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/tests/imports/resources/module/testthis.py +0 -0
  129. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/tests/imports/resources/relative/__init__.py +0 -0
  130. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/tests/imports/resources/relative/rel.py +0 -0
  131. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/tests/imports/resources/relative/sec.py +0 -0
  132. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/tests/imports/resources/shared/__init__.py +0 -0
  133. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/tests/imports/resources/shared/sharedlib.py +0 -0
  134. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/tests/imports/resources/src/sharedt.py +0 -0
  135. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/tests/imports/resources/src/simple.py +0 -0
  136. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/tests/imports/resources/src/test.py +0 -0
  137. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/tests/imports/resources/test.py +0 -0
  138. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/tests/imports/simple.py +0 -0
  139. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/tests/imports/test.py +0 -0
  140. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/tests/imports/test_imports.py +0 -0
  141. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/tests/regression/__init__.py +0 -0
  142. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/tests/regression/test_asserts.py +0 -0
  143. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/tests/regression/test_boolean.py +0 -0
  144. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/tests/regression/test_builtins.py +0 -0
  145. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/tests/regression/test_classes.py +0 -0
  146. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/tests/regression/test_decorators.py +0 -0
  147. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/tests/regression/test_dicts.py +0 -0
  148. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/tests/regression/test_exceptions.py +0 -0
  149. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/tests/regression/test_flow.py +0 -0
  150. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/tests/regression/test_for.py +0 -0
  151. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/tests/regression/test_functions.py +0 -0
  152. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/tests/regression/test_inheritance.py +0 -0
  153. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/tests/regression/test_lambda.py +0 -0
  154. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/tests/regression/test_lists.py +0 -0
  155. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/tests/regression/test_methods.py +0 -0
  156. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/tests/regression/test_nummerical.py +0 -0
  157. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/tests/regression/test_sets.py +0 -0
  158. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/tests/regression/test_strings.py +0 -0
  159. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/tests/regression/test_tuple.py +0 -0
  160. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/tests/regression/test_variables.py +0 -0
  161. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/tests/regression/test_while.py +0 -0
  162. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/tests/resources/jsload.js +0 -0
  163. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/tests/simple.html +0 -0
  164. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/tests/simple.py +0 -0
  165. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/tests/stdlib/test_copy.py +0 -0
  166. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/tests/stdlib/test_json.py +0 -0
  167. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/tests/stdlib/test_math.py +0 -0
  168. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/tests/stdlib/test_re.py +0 -0
  169. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/tests/stdlib/test_time.py +0 -0
  170. {py2ecma-0.0.2 → py2ecma-0.0.2.post9.dev0}/version.txt +0 -0
@@ -154,6 +154,7 @@ fabric.properties
154
154
  # Sonarlint plugin
155
155
 
156
156
  ### Python ###
157
+ report.xml
157
158
  # Byte-compiled / optimized / DLL files
158
159
  __pycache__/
159
160
  *.py[cod]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: py2ecma
3
- Version: 0.0.2
3
+ Version: 0.0.2.post9.dev0
4
4
  Summary: # py2ecma
5
5
  Author-email: "Morten B. Rasmussen" <mbr@bitekspressen.dk>
6
6
  License-File: LICENSE-2.0.txt
@@ -19,6 +19,9 @@ dependencies = [
19
19
  ]
20
20
  dynamic = ["version"]
21
21
 
22
+ [project.scripts]
23
+ py2ecma = "py2ecma.main:main"
24
+
22
25
  [tool.hatch.version]
23
26
  source = "uv-dynamic-versioning"
24
27
 
@@ -29,6 +32,8 @@ local_scheme = "no-local-version"
29
32
  vcs = "git"
30
33
  style = "pep440"
31
34
  local_scheme = "no-local-version"
35
+ metadata = false
36
+ dirty = false
32
37
 
33
38
  [project.readme]
34
39
  file = "README.md"
@@ -81,5 +86,4 @@ dev = [
81
86
  "pyfakefs>=6.0.0",
82
87
  "pytest>=9.0.2",
83
88
  "twine>=6.2.0",
84
- "visast>=1.0.1",
85
89
  ]
@@ -1,5 +1,5 @@
1
1
  #!/bin/sh
2
2
 
3
3
  # Build python package and place it in dist/
4
-
4
+ rm -rf dist/ || true
5
5
  uv build
@@ -7,4 +7,4 @@
7
7
 
8
8
  pyenv exec pip install uv
9
9
  uv venv --python 3.14.2
10
- uv sync
10
+ uv sync --dev
@@ -56,6 +56,12 @@ def arg_parser() -> argparse.ArgumentParser:
56
56
  " the current directory.",
57
57
  metavar="dir",
58
58
  )
59
+ parser.add_argument(
60
+ "--imports",
61
+ dest="imports",
62
+ metavar="output.js",
63
+ help="List of imports that can be injected at the top of the bundle file",
64
+ )
59
65
  parser.add_argument(
60
66
  "-c",
61
67
  "--clean",
@@ -25,6 +25,16 @@ class SetComp(Node):
25
25
  elt: Node
26
26
  generators: List[Node]
27
27
 
28
+ def code(self):
29
+ yield "__set_comprehension__("
30
+ yield "("
31
+ yield self.generators[-1].target
32
+ yield ") => ("
33
+ yield self.elt
34
+ yield "), ["
35
+ yield self.join(", ", self.generators)
36
+ yield "])"
37
+
28
38
 
29
39
  @dataclass
30
40
  class GeneratorComp(Node):
@@ -8,7 +8,7 @@ class Node:
8
8
  def code(self):
9
9
  raise NotImplementedError(
10
10
  "Itermediate node type '{}'".format(self.__class__.__name__)
11
- + " is missing the code() method override"
11
+ + f" is missing the code() method override, issue is present in {self.__file__}"
12
12
  )
13
13
 
14
14
  @staticmethod
@@ -600,6 +600,8 @@ def class_body(tree, name, module, file_):
600
600
 
601
601
  def visit_FunctionDef(self, node):
602
602
  decorators = [n.id for n in node.decorator_list]
603
+ print("====================================================")
604
+ print(self.file)
603
605
  return CD.Method(
604
606
  __file__=self.file,
605
607
  name=node.name,
@@ -8,6 +8,7 @@ class TranspilerConfig:
8
8
  input_file: Path
9
9
  output_file: Path
10
10
  build_dir: Path
11
+ imports: Path | None
11
12
 
12
13
  clean_build: bool
13
14
  recursive: bool
@@ -22,6 +23,8 @@ class TranspilerConfig:
22
23
  self.input_file = Path(argparser.input)
23
24
  self.output_file = Path(argparser.output_file)
24
25
  self.build_dir = Path(argparser.build_dir)
26
+ self.imports = Path(argparser.imports) \
27
+ if argparser.imports is not None else None
25
28
 
26
29
  self.clean_build = argparser.clean
27
30
  self.recursive = argparser.recursive
@@ -76,7 +76,7 @@ def getdeps(filename):
76
76
  continue
77
77
  path = find_import_src(mod, filename)
78
78
  if path is None:
79
- logger.error("Could not find origin of module({})".format(mod))
79
+ logger.error(f"Could not find origin of module({mod}) for file {filename}")
80
80
  raise ImportError("Could not find: {}".format(mod))
81
81
  logger.info('dependency found: "{}"'.format(path))
82
82
  filepaths.append(path)
@@ -337,3 +337,4 @@ function __attribute__(cls, attr, value) {
337
337
  function __super__(t, o) {
338
338
 
339
339
  }
340
+ var Union = type(()=>{})
@@ -28,6 +28,31 @@ var __list_comprehension__ = (elt, generators, li) => {
28
28
  return li;
29
29
  }
30
30
 
31
+
32
+ var __set_comprehension__ = (elt, generators, li) => {
33
+ if (li === undefined) {
34
+ li = set();
35
+ }
36
+ if (generators.length > 1) {
37
+ var generator = generators[0];
38
+ for (let el of __Iterator__(generator.iter)) {
39
+ if (generator.ifs(el)) {
40
+ var tail = generators.slice(1);
41
+ tail[0].iter = el;
42
+ __set_comprehension__(elt, tail, li);
43
+ }
44
+ }
45
+ } else {
46
+ var generator = generators[0];
47
+ for (let el of __Iterator__(generator.iter)) {
48
+ if (generator.ifs(el)) {
49
+ li.add(elt(el));
50
+ }
51
+ }
52
+ }
53
+ return li;
54
+ }
55
+
31
56
  var __dict_comprehension__ = (elt, val, generators, li) => {
32
57
  if (li === undefined) {
33
58
  var li = dict();
@@ -1,4 +1,5 @@
1
1
  import os
2
+ from pathlib import Path
2
3
 
3
4
  from ..filesystem import loadsrc
4
5
 
@@ -50,10 +51,11 @@ def src_strings():
50
51
  return loadsrc(filepath)
51
52
 
52
53
 
53
- def jssources() -> str:
54
+ def jssources(imports: str | Path | None = None) -> str:
54
55
  return "\n".join(
55
56
  [
56
57
  src_base(),
58
+ loadsrc(str(imports)) if imports else "",
57
59
  src_exceptions(),
58
60
  src_builtins(),
59
61
  src_classes(),
@@ -1,10 +1,12 @@
1
1
  import ast
2
+ from pathlib import Path
2
3
 
3
4
  from .jsloader import jssources
4
5
 
5
6
 
6
- def package(cache):
7
- all = jssources() + "var __exports__ = {};\n"
7
+ def package(cache, imports: Path | None):
8
+
9
+ all = jssources(imports) + "var __exports__ = {};\n"
8
10
  for dep, src in cache.items():
9
11
  dep = dep.replace(".__init__", "")
10
12
  wsrc = wrap_iife(src)
@@ -1,8 +1,6 @@
1
- import _thread
2
- import builtins
1
+ #import _thread
3
2
  import copy
4
3
  import functools
5
- import inspect
6
4
  import keyword
7
5
  import re
8
6
  import sys
@@ -375,7 +373,7 @@ def _recursive_repr(user_function):
375
373
 
376
374
  @functools.wraps(user_function)
377
375
  def wrapper(self):
378
- key = id(self), _thread.get_ident()
376
+ key = id(self)
379
377
  if key in repr_running:
380
378
  return "..."
381
379
  repr_running.add(key)
@@ -397,8 +395,6 @@ def _create_fn(name, args, body, *, globals=None, locals=None, return_type=MISSI
397
395
  # __builtins__ may be the "builtins" module or
398
396
  # the value of its "__dict__",
399
397
  # so make sure "__builtins__" is the module.
400
- if globals is not None and "__builtins__" not in globals:
401
- globals["__builtins__"] = builtins
402
398
  return_annotation = ""
403
399
  if return_type is not MISSING:
404
400
  locals["_return_type"] = return_type
@@ -1005,9 +1001,9 @@ def _process_class(cls, init, repr, eq, order, unsafe_hash, frozen):
1005
1001
  # we're here the overwriting is unconditional.
1006
1002
  cls.__hash__ = hash_action(cls, field_list)
1007
1003
 
1008
- if not getattr(cls, "__doc__"):
1009
- # Create a class doc-string.
1010
- cls.__doc__ = cls.__name__ + str(inspect.signature(cls)).replace(" -> None", "")
1004
+ #if not getattr(cls, "__doc__"):
1005
+ # # Create a class doc-string.
1006
+ # cls.__doc__ = cls.__name__ + str(inspect.signature(cls)).replace(" -> None", "")
1011
1007
 
1012
1008
  return cls
1013
1009
 
@@ -26,6 +26,7 @@ def _g():
26
26
 
27
27
 
28
28
  GeneratorType = type(_g())
29
+ Union = type(_g())
29
30
 
30
31
 
31
32
  def _c():
@@ -47,6 +47,7 @@ def transpiler(
47
47
  input_file: Path,
48
48
  output_file: Path,
49
49
  build_dir: Path,
50
+ imports: Path | None,
50
51
  clean_build: bool = False,
51
52
  minimize: bool = False,
52
53
  recursive: bool = True,
@@ -126,7 +127,7 @@ def transpiler(
126
127
  return __inner__
127
128
 
128
129
  def bundler(src_cache, output_file):
129
- bundle = package(src_cache)
130
+ bundle = package(src_cache, imports)
130
131
  if not minimize:
131
132
  import jsbeautifier # type: ignore
132
133
 
@@ -166,6 +167,7 @@ class Transpiler:
166
167
  input_file=self.config.input_file,
167
168
  output_file=self.config.output_file,
168
169
  build_dir=self.config.build_dir,
170
+ imports=self.config.imports,
169
171
  clean_build=self.config.clean_build,
170
172
  minimize=self.config.minimize,
171
173
  recursive=self.config.recursive,
@@ -317,7 +317,12 @@ def jsfstest(data_dir, cwd="", py_path=""):
317
317
  f.write(py_src)
318
318
 
319
319
  py_result = func()
320
- transpiler(main_file, "bundle.js", build_dir="build", clean_build=True)
320
+ transpiler(
321
+ Path(main_file),
322
+ Path("bundle.js"),
323
+ build_dir=Path("build"),
324
+ clean_build=True,
325
+ imports=None)
321
326
  with open("bundle.js") as f:
322
327
  js_body = f.read()
323
328
  js_src = (