134 lines
3.8 KiB
Python
134 lines
3.8 KiB
Python
|
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
||
|
import argparse
|
||
|
import glob
|
||
|
import json
|
||
|
import os
|
||
|
import re
|
||
|
import sys
|
||
|
from pathlib import Path
|
||
|
|
||
|
from . import Command
|
||
|
from odoo.modules.module import MANIFEST_NAMES
|
||
|
|
||
|
|
||
|
class TSConfig(Command):
|
||
|
""" Generates tsconfig files for javascript code """
|
||
|
|
||
|
def get_module_list(self, path):
|
||
|
return [
|
||
|
mod.split(os.path.sep)[-2]
|
||
|
for mname in MANIFEST_NAMES
|
||
|
for mod in glob.glob(os.path.join(path, f'*/{mname}'))
|
||
|
]
|
||
|
|
||
|
def clean_path(self, path):
|
||
|
return re.sub(r"/{2,}", "/", path)
|
||
|
|
||
|
def prefix_suffix_path(self, path, prefix, suffix):
|
||
|
return self.clean_path(f"{prefix}/{path}/{suffix}")
|
||
|
|
||
|
def remove_(self, modules, module):
|
||
|
for name, path in modules:
|
||
|
if module == name:
|
||
|
modules.remove((name, path))
|
||
|
|
||
|
def run(self, cmdargs):
|
||
|
parser = argparse.ArgumentParser(
|
||
|
prog=f'{Path(sys.argv[0]).name} {self.name}',
|
||
|
description=self.__doc__.strip()
|
||
|
)
|
||
|
parser.add_argument('--addons-path', type=str, nargs=1, dest="paths")
|
||
|
args = parser.parse_args(args=cmdargs)
|
||
|
|
||
|
paths = list(map(self.clean_path, args.paths[0].split(',')))
|
||
|
modules = {}
|
||
|
owl_path = ""
|
||
|
for path in paths:
|
||
|
for module in self.get_module_list(path):
|
||
|
modules[module] = self.prefix_suffix_path(module, path, "/static/src/*")
|
||
|
if module == "web":
|
||
|
owl_path = self.prefix_suffix_path(module, path, "/static/lib/owl/owl.js")
|
||
|
|
||
|
content = self.generate_file_content(modules, paths)
|
||
|
content["compilerOptions"]["paths"]["@odoo/owl"] = [owl_path]
|
||
|
# pylint: disable=bad-builtin
|
||
|
print(json.dumps(content, indent=2))
|
||
|
|
||
|
def generate_imports(self, modules):
|
||
|
return {
|
||
|
f'@{module}/*': [path]
|
||
|
for module, path in modules.items()
|
||
|
}
|
||
|
|
||
|
def generate_file_content(self, modules, paths):
|
||
|
return {
|
||
|
'compilerOptions': {
|
||
|
"baseUrl": ".",
|
||
|
"target": "es2019",
|
||
|
"checkJs": True,
|
||
|
"allowJs": True,
|
||
|
"noEmit": True,
|
||
|
"typeRoots": list(map(lambda p: p + "/web/tooling/types", paths)),
|
||
|
"paths": self.generate_imports(modules)
|
||
|
}, "exclude": self.generate_excludes()
|
||
|
}
|
||
|
|
||
|
def generate_excludes(self):
|
||
|
return [
|
||
|
"/**/*.po",
|
||
|
"/**/*.py",
|
||
|
"/**/*.pyc",
|
||
|
"/**/*.xml",
|
||
|
"/**/*.png",
|
||
|
"/**/*.md",
|
||
|
"/**/*.dat",
|
||
|
"/**/*.scss",
|
||
|
"/**/*.jpg",
|
||
|
"/**/*.svg",
|
||
|
"/**/*.pot",
|
||
|
"/**/*.csv",
|
||
|
"/**/*.mo",
|
||
|
"/**/*.txt",
|
||
|
"/**/*.less",
|
||
|
"/**/*.bcmap",
|
||
|
"/**/*.properties",
|
||
|
"/**/*.html",
|
||
|
"/**/*.ttf",
|
||
|
"/**/*.rst",
|
||
|
"/**/*.css",
|
||
|
"/**/*.pack",
|
||
|
"/**/*.idx",
|
||
|
"/**/*.h",
|
||
|
"/**/*.map",
|
||
|
"/**/*.gif",
|
||
|
"/**/*.sample",
|
||
|
"/**/*.doctree",
|
||
|
"/**/*.so",
|
||
|
"/**/*.pdf",
|
||
|
"/**/*.xslt",
|
||
|
"/**/*.conf",
|
||
|
"/**/*.woff",
|
||
|
"/**/*.xsd",
|
||
|
"/**/*.eot",
|
||
|
"/**/*.jst",
|
||
|
"/**/*.flow",
|
||
|
"/**/*.sh",
|
||
|
"/**/*.yml",
|
||
|
"/**/*.pfb",
|
||
|
"/**/*.jpeg",
|
||
|
"/**/*.crt",
|
||
|
"/**/*.template",
|
||
|
"/**/*.pxd",
|
||
|
"/**/*.dylib",
|
||
|
"/**/*.pem",
|
||
|
"/**/*.rng",
|
||
|
"/**/*.xsl",
|
||
|
"/**/*.xls",
|
||
|
"/**/*.cfg",
|
||
|
"/**/*.pyi",
|
||
|
"/**/*.pth",
|
||
|
"/**/*.markdown",
|
||
|
"/**/*.key",
|
||
|
"/**/*.ico",
|
||
|
]
|