diff --git a/odoo/addons/test_assetsbundle/tests/test_js_transpiler.py b/odoo/addons/test_assetsbundle/tests/test_js_transpiler.py index eae41e97ddb..9c946b32170 100644 --- a/odoo/addons/test_assetsbundle/tests/test_js_transpiler.py +++ b/odoo/addons/test_assetsbundle/tests/test_js_transpiler.py @@ -14,7 +14,7 @@ class TestJsTranspiler(TransactionCase): input_content = """/** @odoo-module alias=test_assetsbundle.Alias **/""" result = transpile_javascript("/test_assetsbundle/static/src/alias.js", input_content) - expected_result = """odoo.define('@test_assetsbundle/alias', async function (require) { + expected_result = """odoo.define('@test_assetsbundle/alias', [], async function (require) { 'use strict'; let __exports = {}; /** @odoo-module alias=test_assetsbundle.Alias **/ @@ -32,7 +32,7 @@ odoo.define(`test_assetsbundle.Alias`, async function(require) { input_content = """/** @odoo-module alias=test_assetsbundle.Alias default=False **/""" result = transpile_javascript("/test_assetsbundle/static/src/alias.js", input_content) - expected_result = """odoo.define('@test_assetsbundle/alias', async function (require) { + expected_result = """odoo.define('@test_assetsbundle/alias', [], async function (require) { 'use strict'; let __exports = {}; /** @odoo-module alias=test_assetsbundle.Alias default=False **/ @@ -49,7 +49,7 @@ odoo.define(`test_assetsbundle.Alias`, async function(require) { input_content = """/** @odoo-module alias=test_assetsbundle.Alias default=0 **/""" result = transpile_javascript("/test_assetsbundle/static/src/alias.js", input_content) - expected_result = """odoo.define('@test_assetsbundle/alias', async function (require) { + expected_result = """odoo.define('@test_assetsbundle/alias', [], async function (require) { 'use strict'; let __exports = {}; /** @odoo-module alias=test_assetsbundle.Alias default=0 **/ @@ -66,7 +66,7 @@ odoo.define(`test_assetsbundle.Alias`, async function(require) { input_content = """/** @odoo-module alias=test_assetsbundle.Alias default=false **/""" result = transpile_javascript("/test_assetsbundle/static/src/alias.js", input_content) - expected_result = """odoo.define('@test_assetsbundle/alias', async function (require) { + expected_result = """odoo.define('@test_assetsbundle/alias', [], async function (require) { 'use strict'; let __exports = {}; /** @odoo-module alias=test_assetsbundle.Alias default=false **/ @@ -93,7 +93,7 @@ export const Ferrari = class Ferrari extends Car {}; """ result = transpile_javascript("/test_assetsbundle/static/src/classes.js", input_content) - expected_result = """odoo.define('@test_assetsbundle/classes', async function (require) { + expected_result = """odoo.define('@test_assetsbundle/classes', [], async function (require) { 'use strict'; let __exports = {}; const Nice = __exports[Symbol.for("default")] = class Nice {} @@ -146,7 +146,7 @@ const aaa = "keep!"; """ result = transpile_javascript("/test_assetsbundle/static/src/comments.js", input_content) - expected_result = """odoo.define('@test_assetsbundle/comments', async function (require) { + expected_result = """odoo.define('@test_assetsbundle/comments', [], async function (require) { 'use strict'; let __exports = {}; /** @@ -206,7 +206,7 @@ export default function sayHelloDefault() { """ result = transpile_javascript("/test_assetsbundle/static/src/functions.js", input_content) - expected_result = """odoo.define('@test_assetsbundle/functions', async function (require) { + expected_result = """odoo.define('@test_assetsbundle/functions', [], async function (require) { 'use strict'; let __exports = {}; __exports.sayHello = sayHello; function sayHello() { @@ -268,7 +268,7 @@ import Line16 from "test.Dialog.error"; """ result = transpile_javascript("/test_assetsbundle/static/src/import.js", input_content) - expected_result = """odoo.define('@test_assetsbundle/import', async function (require) { + expected_result = """odoo.define('@test_assetsbundle/import', ['@test_assetsbundle/Dialog', 'Dialog', '@tests/Dialog', 'test.Dialog', 'test.Dialog2', 'legacy.module', '@new_module/file', '@test.Dialog', 'test/Dialog', 'test.Dialog.error'], async function (require) { 'use strict'; let __exports = {}; /** @@ -322,7 +322,7 @@ import c from "@tests/dir/index/"; import d from "@tests";""" result = transpile_javascript("/test_assetsbundle/static/src/index.js", input_content) - expected_result = """odoo.define('@test_assetsbundle', async function (require) { + expected_result = """odoo.define('@test_assetsbundle', ['@tests/dir', '@tests'], async function (require) { 'use strict'; let __exports = {}; const a = __exports.a = 5; @@ -364,7 +364,7 @@ export * from "@tests/Dialog"; """ result = transpile_javascript("/test_assetsbundle/static/src/list.js", input_content) - expected_result = """odoo.define('@test_assetsbundle/list', async function (require) { + expected_result = """odoo.define('@test_assetsbundle/list', ['@tests/Dialog', '@test_assetsbundle/Dialog'], async function (require) { 'use strict'; let __exports = {}; Object.assign(__exports, {a, b}); @@ -411,7 +411,7 @@ export default a; """ result = transpile_javascript("/test_assetsbundle/static/src/variables.js", input_content) - expected_result = """odoo.define('@test_assetsbundle/variables', async function (require) { + expected_result = """odoo.define('@test_assetsbundle/variables', [], async function (require) { 'use strict'; let __exports = {}; const v = __exports.v = 5; @@ -436,7 +436,7 @@ return __exports; result = transpile_javascript("/test_assetsbundle/static/tests/alias.js", input_content) - expected_result = """odoo.define('@test_assetsbundle/../tests/alias', async function (require) { + expected_result = """odoo.define('@test_assetsbundle/../tests/alias', [], async function (require) { 'use strict'; let __exports = {}; QUnit.module("test_assetsbundle", function() {QUnit.test("Tests", async function (assert) {{}})}); @@ -451,7 +451,7 @@ return __exports; result = transpile_javascript("/test_assetsbundle/static/tests/alias.js", input_content) - expected_result = """odoo.define('@test_assetsbundle/../tests/alias', async function (require) { + expected_result = """odoo.define('@test_assetsbundle/../tests/alias', [], async function (require) { 'use strict'; let __exports = {}; QUnit.module("test_assetsbundle", function() {QUnit.debug("Tests", async function (assert) {{}})}); @@ -466,10 +466,57 @@ return __exports; result = transpile_javascript("/test_assetsbundle/static/tests/alias.js", input_content) - expected_result = """odoo.define('@test_assetsbundle/../tests/alias', async function (require) { + expected_result = """odoo.define('@test_assetsbundle/../tests/alias', [], async function (require) { 'use strict'; let __exports = {}; let a = 1 + 1; +return __exports; +}); +""" + + self.assertEqual(result, expected_result) + + def test_13_require_comment(self): + input_content = """ +require("@test/Dialog") +const dialog = require("@test/Dialog2") + +// require("@test/Comment") +// const comment = require("@test/Comment") + +/*require("@test/Comment")*/ +/* const comment = require("@test/Comment") */ + +/** +*require("@test/Comment") +*/ +/** +* const comment = require("@test/Comment") +*/ +""" + + result = transpile_javascript("/test_assetsbundle/static/src/alias.js", input_content) + + expected_result = """odoo.define('@test_assetsbundle/alias', ['@test/Dialog', '@test/Dialog2'], async function (require) { +'use strict'; +let __exports = {}; + +require("@test/Dialog") +const dialog = require("@test/Dialog2") + +// require("@test/Comment") +// const comment = require("@test/Comment") + +/*require("@test/Comment")*/ +/* const comment = require("@test/Comment") */ + +/** +*require("@test/Comment") +*/ +/** +* const comment = require("@test/Comment") +*/ + return __exports; }); """ diff --git a/odoo/tools/js_transpiler.py b/odoo/tools/js_transpiler.py index 572ee86ccc3..19d26a62333 100644 --- a/odoo/tools/js_transpiler.py +++ b/odoo/tools/js_transpiler.py @@ -15,6 +15,8 @@ import re import logging from functools import partial +from odoo.tools.misc import OrderedSet + _logger = logging.getLogger(__name__) def transpile_javascript(url, content): @@ -27,7 +29,7 @@ def transpile_javascript(url, content): """ module_path = url_to_module_path(url) legacy_odoo_define = get_aliased_odoo_define_content(module_path, content) - + dependencies = OrderedSet() # The order of the operations does sometimes matter. steps = [ convert_legacy_default_import, @@ -39,15 +41,15 @@ def transpile_javascript(url, content): convert_unnamed_relative_import, convert_from_export, convert_star_from_export, - partial(convert_relative_require, url), remove_index, + partial(convert_relative_require, url, dependencies), convert_export_function, convert_export_class, convert_variable_export, convert_object_export, convert_default_export, partial(wrap_with_qunit_module, url), - partial(wrap_with_odoo_define, module_path), + partial(wrap_with_odoo_define, module_path, dependencies), ] for s in steps: content = s(content) @@ -105,12 +107,13 @@ def wrap_with_qunit_module(url, content): else: return content -def wrap_with_odoo_define(module_path, content): +def wrap_with_odoo_define(module_path, dependencies, content): """ Wraps the current content (source code) with the odoo.define call. + It adds as a second argument the list of dependencies. Should logically be called once all other operations have been performed. """ - return f"""odoo.define({module_path!r}, async function (require) {{ + return f"""odoo.define({module_path!r}, {list(dependencies)}, async function (require) {{ 'use strict'; let __exports = {{}}; {content} @@ -513,14 +516,15 @@ def convert_default_and_named_import(content): RELATIVE_REQUIRE_RE = re.compile(r""" - require\((?P["'`])([^@"'`]+)(?P=quote)\) # require("some/path") - """, re.VERBOSE) + ^[^/*\n]*require\((?P[\"'`])([^\"'`]+)(?P=quote)\) # require("some/path") + """, re.MULTILINE | re.VERBOSE) -def convert_relative_require(url, content): +def convert_relative_require(url, dependencies, content): """ Convert the relative path contained in a 'require()' - to the new path system (@module/path) + to the new path system (@module/path). + Adds all modules path to dependencies. .. code-block:: javascript // Relative path: @@ -537,10 +541,13 @@ def convert_relative_require(url, content): """ new_content = content for quote, path in RELATIVE_REQUIRE_RE.findall(new_content): + module_path = path if path.startswith(".") and "/" in path: pattern = rf"require\({quote}{path}{quote}\)" - repl = f'require("{relative_path_to_module_path(url, path)}")' + module_path = relative_path_to_module_path(url, path) + repl = f'require("{module_path}")' new_content = re.sub(pattern, repl, new_content) + dependencies.add(module_path) return new_content