[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:
@@ -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
@@ -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
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user