[IMP] tools: adds the dependencies in the odoo.define

After this commit, the transpiler will add the dependencies of a file
to the second argument of the odoo.define(...).

For example:
odoo.define("@test/test", ['@test/dep1', '@test/dep2'], async function (require)

With this change, the code for the module system in the browser will get
directly the dependencies instead of having to stringify the function
defining a module, and grep inside for the "require" words.

closes odoo/odoo#105651

Taskid: 3062390
Related: odoo/enterprise#34895
Signed-off-by: Géry Debongnie <ged@odoo.com>
This commit is contained in:
FrancoisGe
2022-12-15 16:47:05 +01:00
parent e34712d7b5
commit 8e3de77042
2 changed files with 78 additions and 24 deletions
@@ -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;
});
"""
+17 -10
View File
@@ -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<quote>["'`])([^@"'`]+)(?P=quote)\) # require("some/path")
""", re.VERBOSE)
^[^/*\n]*require\((?P<quote>[\"'`])([^\"'`]+)(?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