annotate libervia/web/server/tasks/implicit/task_js_modules.py @ 1598:86c7a3a625d5

server: always start a new session on connection: The session was kept when a user was connecting from service profile (but not from other profiles), this was leading to session fixation vulnerability (an attacker on the same machine could get service profile session cookie, and use it when a victim would log-in). This patch fixes it by always starting a new session on connection. fix 443
author Goffi <goffi@goffi.org>
date Fri, 23 Feb 2024 13:35:24 +0100
parents 038d4bfdd967
children d07838fc9d99
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1254
780dbc2f4853 server (tasks): new `js_modules` implicit task:
Goffi <goffi@goffi.org>
parents:
diff changeset
1 #!/ur/bin/env python3
780dbc2f4853 server (tasks): new `js_modules` implicit task:
Goffi <goffi@goffi.org>
parents:
diff changeset
2
780dbc2f4853 server (tasks): new `js_modules` implicit task:
Goffi <goffi@goffi.org>
parents:
diff changeset
3 import json
780dbc2f4853 server (tasks): new `js_modules` implicit task:
Goffi <goffi@goffi.org>
parents:
diff changeset
4 from pathlib import Path
1518
eb00d593801d refactoring: rename `libervia` to `libervia.web` + update imports following backend changes
Goffi <goffi@goffi.org>
parents: 1509
diff changeset
5 from libervia.backend.core.i18n import _
eb00d593801d refactoring: rename `libervia` to `libervia.web` + update imports following backend changes
Goffi <goffi@goffi.org>
parents: 1509
diff changeset
6 from libervia.backend.core.log import getLogger
eb00d593801d refactoring: rename `libervia` to `libervia.web` + update imports following backend changes
Goffi <goffi@goffi.org>
parents: 1509
diff changeset
7 from libervia.backend.core import exceptions
eb00d593801d refactoring: rename `libervia` to `libervia.web` + update imports following backend changes
Goffi <goffi@goffi.org>
parents: 1509
diff changeset
8 from libervia.web.server.constants import Const as C
eb00d593801d refactoring: rename `libervia` to `libervia.web` + update imports following backend changes
Goffi <goffi@goffi.org>
parents: 1509
diff changeset
9 from libervia.web.server.tasks import task
1254
780dbc2f4853 server (tasks): new `js_modules` implicit task:
Goffi <goffi@goffi.org>
parents:
diff changeset
10
780dbc2f4853 server (tasks): new `js_modules` implicit task:
Goffi <goffi@goffi.org>
parents:
diff changeset
11
780dbc2f4853 server (tasks): new `js_modules` implicit task:
Goffi <goffi@goffi.org>
parents:
diff changeset
12 log = getLogger(__name__)
780dbc2f4853 server (tasks): new `js_modules` implicit task:
Goffi <goffi@goffi.org>
parents:
diff changeset
13
780dbc2f4853 server (tasks): new `js_modules` implicit task:
Goffi <goffi@goffi.org>
parents:
diff changeset
14
780dbc2f4853 server (tasks): new `js_modules` implicit task:
Goffi <goffi@goffi.org>
parents:
diff changeset
15 class Task(task.Task):
780dbc2f4853 server (tasks): new `js_modules` implicit task:
Goffi <goffi@goffi.org>
parents:
diff changeset
16
780dbc2f4853 server (tasks): new `js_modules` implicit task:
Goffi <goffi@goffi.org>
parents:
diff changeset
17 async def prepare(self):
780dbc2f4853 server (tasks): new `js_modules` implicit task:
Goffi <goffi@goffi.org>
parents:
diff changeset
18 if "js" not in self.resource.browser_modules:
1434
2f6dac783c8e tasks(js_modules, sass): remove support for `npm`:
Goffi <goffi@goffi.org>
parents: 1273
diff changeset
19 raise exceptions.CancelError("No JS module needed")
1254
780dbc2f4853 server (tasks): new `js_modules` implicit task:
Goffi <goffi@goffi.org>
parents:
diff changeset
20
780dbc2f4853 server (tasks): new `js_modules` implicit task:
Goffi <goffi@goffi.org>
parents:
diff changeset
21 async def start(self):
780dbc2f4853 server (tasks): new `js_modules` implicit task:
Goffi <goffi@goffi.org>
parents:
diff changeset
22 js_data = self.resource.browser_modules['js']
780dbc2f4853 server (tasks): new `js_modules` implicit task:
Goffi <goffi@goffi.org>
parents:
diff changeset
23 package = js_data.get('package', {})
780dbc2f4853 server (tasks): new `js_modules` implicit task:
Goffi <goffi@goffi.org>
parents:
diff changeset
24 package_path = self.build_path / 'package.json'
780dbc2f4853 server (tasks): new `js_modules` implicit task:
Goffi <goffi@goffi.org>
parents:
diff changeset
25 with package_path.open('w') as f:
780dbc2f4853 server (tasks): new `js_modules` implicit task:
Goffi <goffi@goffi.org>
parents:
diff changeset
26 json.dump(package, f)
780dbc2f4853 server (tasks): new `js_modules` implicit task:
Goffi <goffi@goffi.org>
parents:
diff changeset
27
1509
106bae41f5c8 massive refactoring from camelCase -> snake_case. See backend commit log for more details
Goffi <goffi@goffi.org>
parents: 1434
diff changeset
28 cmd = self.find_command('yarnpkg', 'yarn')
1254
780dbc2f4853 server (tasks): new `js_modules` implicit task:
Goffi <goffi@goffi.org>
parents:
diff changeset
29 await self.runCommand(cmd, 'install', path=str(self.build_path))
780dbc2f4853 server (tasks): new `js_modules` implicit task:
Goffi <goffi@goffi.org>
parents:
diff changeset
30
780dbc2f4853 server (tasks): new `js_modules` implicit task:
Goffi <goffi@goffi.org>
parents:
diff changeset
31 try:
780dbc2f4853 server (tasks): new `js_modules` implicit task:
Goffi <goffi@goffi.org>
parents:
diff changeset
32 brython_map = js_data['brython_map']
780dbc2f4853 server (tasks): new `js_modules` implicit task:
Goffi <goffi@goffi.org>
parents:
diff changeset
33 except KeyError:
780dbc2f4853 server (tasks): new `js_modules` implicit task:
Goffi <goffi@goffi.org>
parents:
diff changeset
34 pass
780dbc2f4853 server (tasks): new `js_modules` implicit task:
Goffi <goffi@goffi.org>
parents:
diff changeset
35 else:
780dbc2f4853 server (tasks): new `js_modules` implicit task:
Goffi <goffi@goffi.org>
parents:
diff changeset
36 log.info(_("creating JS modules mapping for Brython"))
780dbc2f4853 server (tasks): new `js_modules` implicit task:
Goffi <goffi@goffi.org>
parents:
diff changeset
37 js_modules_path = self.build_path / 'js_modules'
780dbc2f4853 server (tasks): new `js_modules` implicit task:
Goffi <goffi@goffi.org>
parents:
diff changeset
38 js_modules_path.mkdir(exist_ok=True)
780dbc2f4853 server (tasks): new `js_modules` implicit task:
Goffi <goffi@goffi.org>
parents:
diff changeset
39 init_path = js_modules_path / '__init__.py'
780dbc2f4853 server (tasks): new `js_modules` implicit task:
Goffi <goffi@goffi.org>
parents:
diff changeset
40 init_path.touch()
780dbc2f4853 server (tasks): new `js_modules` implicit task:
Goffi <goffi@goffi.org>
parents:
diff changeset
41
780dbc2f4853 server (tasks): new `js_modules` implicit task:
Goffi <goffi@goffi.org>
parents:
diff changeset
42 for module_name, module_data in brython_map.items():
780dbc2f4853 server (tasks): new `js_modules` implicit task:
Goffi <goffi@goffi.org>
parents:
diff changeset
43 log.debug(f"generating mapping for {module_name}")
780dbc2f4853 server (tasks): new `js_modules` implicit task:
Goffi <goffi@goffi.org>
parents:
diff changeset
44 if ' ' in module_name:
780dbc2f4853 server (tasks): new `js_modules` implicit task:
Goffi <goffi@goffi.org>
parents:
diff changeset
45 raise ValueError(
780dbc2f4853 server (tasks): new `js_modules` implicit task:
Goffi <goffi@goffi.org>
parents:
diff changeset
46 f"module {module_name!r} has space(s), it must not!")
1570
038d4bfdd967 server (tasks/JS modules): add new way to generate modules + support of CSS files
Goffi <goffi@goffi.org>
parents: 1518
diff changeset
47 module_python_name = module_name.replace(".", "_").replace("-", "_")
038d4bfdd967 server (tasks/JS modules): add new way to generate modules + support of CSS files
Goffi <goffi@goffi.org>
parents: 1518
diff changeset
48 if module_python_name != module_name:
038d4bfdd967 server (tasks/JS modules): add new way to generate modules + support of CSS files
Goffi <goffi@goffi.org>
parents: 1518
diff changeset
49 log.info("{module_python_name!r} will be used as python module name")
038d4bfdd967 server (tasks/JS modules): add new way to generate modules + support of CSS files
Goffi <goffi@goffi.org>
parents: 1518
diff changeset
50 module_path = js_modules_path / f"{module_python_name}.py"
1254
780dbc2f4853 server (tasks): new `js_modules` implicit task:
Goffi <goffi@goffi.org>
parents:
diff changeset
51 if isinstance(module_data, str):
1570
038d4bfdd967 server (tasks/JS modules): add new way to generate modules + support of CSS files
Goffi <goffi@goffi.org>
parents: 1518
diff changeset
52 module_data = {'path': [module_data]}
1254
780dbc2f4853 server (tasks): new `js_modules` implicit task:
Goffi <goffi@goffi.org>
parents:
diff changeset
53 try:
1570
038d4bfdd967 server (tasks/JS modules): add new way to generate modules + support of CSS files
Goffi <goffi@goffi.org>
parents: 1518
diff changeset
54 js_paths = module_data.pop('path')
1254
780dbc2f4853 server (tasks): new `js_modules` implicit task:
Goffi <goffi@goffi.org>
parents:
diff changeset
55 except KeyError:
780dbc2f4853 server (tasks): new `js_modules` implicit task:
Goffi <goffi@goffi.org>
parents:
diff changeset
56 raise ValueError(
780dbc2f4853 server (tasks): new `js_modules` implicit task:
Goffi <goffi@goffi.org>
parents:
diff changeset
57 f'module data for {module_name} must have a "path" key')
1570
038d4bfdd967 server (tasks/JS modules): add new way to generate modules + support of CSS files
Goffi <goffi@goffi.org>
parents: 1518
diff changeset
58 if isinstance(js_paths, str):
038d4bfdd967 server (tasks/JS modules): add new way to generate modules + support of CSS files
Goffi <goffi@goffi.org>
parents: 1518
diff changeset
59 js_paths = [js_paths]
038d4bfdd967 server (tasks/JS modules): add new way to generate modules + support of CSS files
Goffi <goffi@goffi.org>
parents: 1518
diff changeset
60 module_data['path'] = [
038d4bfdd967 server (tasks/JS modules): add new way to generate modules + support of CSS files
Goffi <goffi@goffi.org>
parents: 1518
diff changeset
61 Path('node_modules') / js_path.strip(' /') for js_path in js_paths
038d4bfdd967 server (tasks/JS modules): add new way to generate modules + support of CSS files
Goffi <goffi@goffi.org>
parents: 1518
diff changeset
62 ]
038d4bfdd967 server (tasks/JS modules): add new way to generate modules + support of CSS files
Goffi <goffi@goffi.org>
parents: 1518
diff changeset
63 to_export = module_data.get("export", [module_name])
038d4bfdd967 server (tasks/JS modules): add new way to generate modules + support of CSS files
Goffi <goffi@goffi.org>
parents: 1518
diff changeset
64 if isinstance(to_export, str):
038d4bfdd967 server (tasks/JS modules): add new way to generate modules + support of CSS files
Goffi <goffi@goffi.org>
parents: 1518
diff changeset
65 to_export = to_export.split(",")
038d4bfdd967 server (tasks/JS modules): add new way to generate modules + support of CSS files
Goffi <goffi@goffi.org>
parents: 1518
diff changeset
66 to_export = [e.strip() for e in to_export]
038d4bfdd967 server (tasks/JS modules): add new way to generate modules + support of CSS files
Goffi <goffi@goffi.org>
parents: 1518
diff changeset
67
038d4bfdd967 server (tasks/JS modules): add new way to generate modules + support of CSS files
Goffi <goffi@goffi.org>
parents: 1518
diff changeset
68 init_code = []
038d4bfdd967 server (tasks/JS modules): add new way to generate modules + support of CSS files
Goffi <goffi@goffi.org>
parents: 1518
diff changeset
69
038d4bfdd967 server (tasks/JS modules): add new way to generate modules + support of CSS files
Goffi <goffi@goffi.org>
parents: 1518
diff changeset
70 # CSS if any
038d4bfdd967 server (tasks/JS modules): add new way to generate modules + support of CSS files
Goffi <goffi@goffi.org>
parents: 1518
diff changeset
71 css_to_load = module_data.get("css")
038d4bfdd967 server (tasks/JS modules): add new way to generate modules + support of CSS files
Goffi <goffi@goffi.org>
parents: 1518
diff changeset
72 if css_to_load:
038d4bfdd967 server (tasks/JS modules): add new way to generate modules + support of CSS files
Goffi <goffi@goffi.org>
parents: 1518
diff changeset
73 if isinstance(css_to_load, str):
038d4bfdd967 server (tasks/JS modules): add new way to generate modules + support of CSS files
Goffi <goffi@goffi.org>
parents: 1518
diff changeset
74 css_to_load = [css_to_load]
038d4bfdd967 server (tasks/JS modules): add new way to generate modules + support of CSS files
Goffi <goffi@goffi.org>
parents: 1518
diff changeset
75
038d4bfdd967 server (tasks/JS modules): add new way to generate modules + support of CSS files
Goffi <goffi@goffi.org>
parents: 1518
diff changeset
76 add_styles_lines = []
038d4bfdd967 server (tasks/JS modules): add new way to generate modules + support of CSS files
Goffi <goffi@goffi.org>
parents: 1518
diff changeset
77 for css_path in css_to_load:
038d4bfdd967 server (tasks/JS modules): add new way to generate modules + support of CSS files
Goffi <goffi@goffi.org>
parents: 1518
diff changeset
78 normalized_css_path = Path("node_modules") / css_path.strip(" /")
038d4bfdd967 server (tasks/JS modules): add new way to generate modules + support of CSS files
Goffi <goffi@goffi.org>
parents: 1518
diff changeset
79 css_href = Path("/").joinpath(C.BUILD_DIR, normalized_css_path)
038d4bfdd967 server (tasks/JS modules): add new way to generate modules + support of CSS files
Goffi <goffi@goffi.org>
parents: 1518
diff changeset
80 style_tag = (
038d4bfdd967 server (tasks/JS modules): add new way to generate modules + support of CSS files
Goffi <goffi@goffi.org>
parents: 1518
diff changeset
81 f'<link rel="stylesheet" type="text/css" href="{css_href}">'
038d4bfdd967 server (tasks/JS modules): add new way to generate modules + support of CSS files
Goffi <goffi@goffi.org>
parents: 1518
diff changeset
82 )
038d4bfdd967 server (tasks/JS modules): add new way to generate modules + support of CSS files
Goffi <goffi@goffi.org>
parents: 1518
diff changeset
83 add_style_code = (
038d4bfdd967 server (tasks/JS modules): add new way to generate modules + support of CSS files
Goffi <goffi@goffi.org>
parents: 1518
diff changeset
84 'document.head.insertAdjacentHTML('
038d4bfdd967 server (tasks/JS modules): add new way to generate modules + support of CSS files
Goffi <goffi@goffi.org>
parents: 1518
diff changeset
85 '"beforeend", '
038d4bfdd967 server (tasks/JS modules): add new way to generate modules + support of CSS files
Goffi <goffi@goffi.org>
parents: 1518
diff changeset
86 f"'{style_tag}')"
038d4bfdd967 server (tasks/JS modules): add new way to generate modules + support of CSS files
Goffi <goffi@goffi.org>
parents: 1518
diff changeset
87 )
038d4bfdd967 server (tasks/JS modules): add new way to generate modules + support of CSS files
Goffi <goffi@goffi.org>
parents: 1518
diff changeset
88 add_styles_lines.append(add_style_code)
038d4bfdd967 server (tasks/JS modules): add new way to generate modules + support of CSS files
Goffi <goffi@goffi.org>
parents: 1518
diff changeset
89
038d4bfdd967 server (tasks/JS modules): add new way to generate modules + support of CSS files
Goffi <goffi@goffi.org>
parents: 1518
diff changeset
90 add_styles = "\n".join(add_styles_lines)
038d4bfdd967 server (tasks/JS modules): add new way to generate modules + support of CSS files
Goffi <goffi@goffi.org>
parents: 1518
diff changeset
91 else:
038d4bfdd967 server (tasks/JS modules): add new way to generate modules + support of CSS files
Goffi <goffi@goffi.org>
parents: 1518
diff changeset
92 add_styles = ""
1254
780dbc2f4853 server (tasks): new `js_modules` implicit task:
Goffi <goffi@goffi.org>
parents:
diff changeset
93
780dbc2f4853 server (tasks): new `js_modules` implicit task:
Goffi <goffi@goffi.org>
parents:
diff changeset
94 with module_path.open('w') as f:
1570
038d4bfdd967 server (tasks/JS modules): add new way to generate modules + support of CSS files
Goffi <goffi@goffi.org>
parents: 1518
diff changeset
95 browser_imports = ["aio", "document"]
038d4bfdd967 server (tasks/JS modules): add new way to generate modules + support of CSS files
Goffi <goffi@goffi.org>
parents: 1518
diff changeset
96 modules_import = []
038d4bfdd967 server (tasks/JS modules): add new way to generate modules + support of CSS files
Goffi <goffi@goffi.org>
parents: 1518
diff changeset
97 script_paths = [
038d4bfdd967 server (tasks/JS modules): add new way to generate modules + support of CSS files
Goffi <goffi@goffi.org>
parents: 1518
diff changeset
98 str(Path('/').joinpath(C.BUILD_DIR, path))
038d4bfdd967 server (tasks/JS modules): add new way to generate modules + support of CSS files
Goffi <goffi@goffi.org>
parents: 1518
diff changeset
99 for path in module_data["path"]
038d4bfdd967 server (tasks/JS modules): add new way to generate modules + support of CSS files
Goffi <goffi@goffi.org>
parents: 1518
diff changeset
100 ]
038d4bfdd967 server (tasks/JS modules): add new way to generate modules + support of CSS files
Goffi <goffi@goffi.org>
parents: 1518
diff changeset
101 import_type = module_data.get('import_type', "load")
038d4bfdd967 server (tasks/JS modules): add new way to generate modules + support of CSS files
Goffi <goffi@goffi.org>
parents: 1518
diff changeset
102 if import_type == 'module':
038d4bfdd967 server (tasks/JS modules): add new way to generate modules + support of CSS files
Goffi <goffi@goffi.org>
parents: 1518
diff changeset
103 modules_import.append('javascript')
038d4bfdd967 server (tasks/JS modules): add new way to generate modules + support of CSS files
Goffi <goffi@goffi.org>
parents: 1518
diff changeset
104 modules_import.append('proxy')
038d4bfdd967 server (tasks/JS modules): add new way to generate modules + support of CSS files
Goffi <goffi@goffi.org>
parents: 1518
diff changeset
105 callback_function_name = f"on_{module_python_name}_loaded"
038d4bfdd967 server (tasks/JS modules): add new way to generate modules + support of CSS files
Goffi <goffi@goffi.org>
parents: 1518
diff changeset
106 declare_obj = "\n".join(f"{e} = proxy.JSProxy()" for e in to_export)
038d4bfdd967 server (tasks/JS modules): add new way to generate modules + support of CSS files
Goffi <goffi@goffi.org>
parents: 1518
diff changeset
107 export_str = "\n ".join(f"{e}.js_module=module.{e}" for e in to_export)
038d4bfdd967 server (tasks/JS modules): add new way to generate modules + support of CSS files
Goffi <goffi@goffi.org>
parents: 1518
diff changeset
108 load_js_libraries = (
038d4bfdd967 server (tasks/JS modules): add new way to generate modules + support of CSS files
Goffi <goffi@goffi.org>
parents: 1518
diff changeset
109 f"\n{declare_obj}\n\n"
038d4bfdd967 server (tasks/JS modules): add new way to generate modules + support of CSS files
Goffi <goffi@goffi.org>
parents: 1518
diff changeset
110 f"def {callback_function_name}(module):\n"
038d4bfdd967 server (tasks/JS modules): add new way to generate modules + support of CSS files
Goffi <goffi@goffi.org>
parents: 1518
diff changeset
111 f" {export_str}\n"
038d4bfdd967 server (tasks/JS modules): add new way to generate modules + support of CSS files
Goffi <goffi@goffi.org>
parents: 1518
diff changeset
112 f" loaded.set_result(True)\n\n"
038d4bfdd967 server (tasks/JS modules): add new way to generate modules + support of CSS files
Goffi <goffi@goffi.org>
parents: 1518
diff changeset
113 f"javascript.import_modules({script_paths}, {callback_function_name})\n"
038d4bfdd967 server (tasks/JS modules): add new way to generate modules + support of CSS files
Goffi <goffi@goffi.org>
parents: 1518
diff changeset
114 )
038d4bfdd967 server (tasks/JS modules): add new way to generate modules + support of CSS files
Goffi <goffi@goffi.org>
parents: 1518
diff changeset
115 elif import_type == 'script':
038d4bfdd967 server (tasks/JS modules): add new way to generate modules + support of CSS files
Goffi <goffi@goffi.org>
parents: 1518
diff changeset
116 browser_imports.append("window")
038d4bfdd967 server (tasks/JS modules): add new way to generate modules + support of CSS files
Goffi <goffi@goffi.org>
parents: 1518
diff changeset
117 script_tags = [
038d4bfdd967 server (tasks/JS modules): add new way to generate modules + support of CSS files
Goffi <goffi@goffi.org>
parents: 1518
diff changeset
118 f"<script src='{src}'></script>" for src in script_paths
038d4bfdd967 server (tasks/JS modules): add new way to generate modules + support of CSS files
Goffi <goffi@goffi.org>
parents: 1518
diff changeset
119 ]
038d4bfdd967 server (tasks/JS modules): add new way to generate modules + support of CSS files
Goffi <goffi@goffi.org>
parents: 1518
diff changeset
120 load_js_libraries = "\n".join(
038d4bfdd967 server (tasks/JS modules): add new way to generate modules + support of CSS files
Goffi <goffi@goffi.org>
parents: 1518
diff changeset
121 f'document.head.insertAdjacentHTML("beforeend", "{tag}")'
038d4bfdd967 server (tasks/JS modules): add new way to generate modules + support of CSS files
Goffi <goffi@goffi.org>
parents: 1518
diff changeset
122 for tag in script_tags
038d4bfdd967 server (tasks/JS modules): add new way to generate modules + support of CSS files
Goffi <goffi@goffi.org>
parents: 1518
diff changeset
123 )
038d4bfdd967 server (tasks/JS modules): add new way to generate modules + support of CSS files
Goffi <goffi@goffi.org>
parents: 1518
diff changeset
124 init_code.append('\n'.join(f'{e} = window.{e}' for e in to_export))
038d4bfdd967 server (tasks/JS modules): add new way to generate modules + support of CSS files
Goffi <goffi@goffi.org>
parents: 1518
diff changeset
125 init_code.append("loaded.set_result(True)")
038d4bfdd967 server (tasks/JS modules): add new way to generate modules + support of CSS files
Goffi <goffi@goffi.org>
parents: 1518
diff changeset
126 elif import_type == "load":
038d4bfdd967 server (tasks/JS modules): add new way to generate modules + support of CSS files
Goffi <goffi@goffi.org>
parents: 1518
diff changeset
127 browser_imports.append("load")
038d4bfdd967 server (tasks/JS modules): add new way to generate modules + support of CSS files
Goffi <goffi@goffi.org>
parents: 1518
diff changeset
128 browser_imports.append("window")
038d4bfdd967 server (tasks/JS modules): add new way to generate modules + support of CSS files
Goffi <goffi@goffi.org>
parents: 1518
diff changeset
129 load_calls = [f'load("{src}")' for src in script_paths]
038d4bfdd967 server (tasks/JS modules): add new way to generate modules + support of CSS files
Goffi <goffi@goffi.org>
parents: 1518
diff changeset
130 load_js_libraries = "\n".join(load_calls)
038d4bfdd967 server (tasks/JS modules): add new way to generate modules + support of CSS files
Goffi <goffi@goffi.org>
parents: 1518
diff changeset
131 init_code.append('\n'.join(f'{e} = window.{e}' for e in to_export))
038d4bfdd967 server (tasks/JS modules): add new way to generate modules + support of CSS files
Goffi <goffi@goffi.org>
parents: 1518
diff changeset
132 init_code.append("loaded.set_result(True)")
038d4bfdd967 server (tasks/JS modules): add new way to generate modules + support of CSS files
Goffi <goffi@goffi.org>
parents: 1518
diff changeset
133 else:
038d4bfdd967 server (tasks/JS modules): add new way to generate modules + support of CSS files
Goffi <goffi@goffi.org>
parents: 1518
diff changeset
134 raise ValueError("Invalid import type: {import_type!r}")
1254
780dbc2f4853 server (tasks): new `js_modules` implicit task:
Goffi <goffi@goffi.org>
parents:
diff changeset
135
1570
038d4bfdd967 server (tasks/JS modules): add new way to generate modules + support of CSS files
Goffi <goffi@goffi.org>
parents: 1518
diff changeset
136 extra_init = module_data.get("extra_init")
038d4bfdd967 server (tasks/JS modules): add new way to generate modules + support of CSS files
Goffi <goffi@goffi.org>
parents: 1518
diff changeset
137 if extra_init is not None:
038d4bfdd967 server (tasks/JS modules): add new way to generate modules + support of CSS files
Goffi <goffi@goffi.org>
parents: 1518
diff changeset
138 if not isinstance(extra_init, str):
038d4bfdd967 server (tasks/JS modules): add new way to generate modules + support of CSS files
Goffi <goffi@goffi.org>
parents: 1518
diff changeset
139 raise ValueError(f"Invalid extra_init: {extra_init!r}")
038d4bfdd967 server (tasks/JS modules): add new way to generate modules + support of CSS files
Goffi <goffi@goffi.org>
parents: 1518
diff changeset
140 init_code.append(
038d4bfdd967 server (tasks/JS modules): add new way to generate modules + support of CSS files
Goffi <goffi@goffi.org>
parents: 1518
diff changeset
141 extra_init.format(
038d4bfdd967 server (tasks/JS modules): add new way to generate modules + support of CSS files
Goffi <goffi@goffi.org>
parents: 1518
diff changeset
142 build_dir = C.BUILD_DIR
038d4bfdd967 server (tasks/JS modules): add new way to generate modules + support of CSS files
Goffi <goffi@goffi.org>
parents: 1518
diff changeset
143 )
038d4bfdd967 server (tasks/JS modules): add new way to generate modules + support of CSS files
Goffi <goffi@goffi.org>
parents: 1518
diff changeset
144 )
038d4bfdd967 server (tasks/JS modules): add new way to generate modules + support of CSS files
Goffi <goffi@goffi.org>
parents: 1518
diff changeset
145
038d4bfdd967 server (tasks/JS modules): add new way to generate modules + support of CSS files
Goffi <goffi@goffi.org>
parents: 1518
diff changeset
146 init_code_str = "\n".join(init_code)
038d4bfdd967 server (tasks/JS modules): add new way to generate modules + support of CSS files
Goffi <goffi@goffi.org>
parents: 1518
diff changeset
147 imports = [f"from browser import {', '.join(browser_imports)}"]
038d4bfdd967 server (tasks/JS modules): add new way to generate modules + support of CSS files
Goffi <goffi@goffi.org>
parents: 1518
diff changeset
148 for module in modules_import:
038d4bfdd967 server (tasks/JS modules): add new way to generate modules + support of CSS files
Goffi <goffi@goffi.org>
parents: 1518
diff changeset
149 imports.append(f"import {module}")
038d4bfdd967 server (tasks/JS modules): add new way to generate modules + support of CSS files
Goffi <goffi@goffi.org>
parents: 1518
diff changeset
150 imports_str = "\n".join(imports)
038d4bfdd967 server (tasks/JS modules): add new way to generate modules + support of CSS files
Goffi <goffi@goffi.org>
parents: 1518
diff changeset
151
038d4bfdd967 server (tasks/JS modules): add new way to generate modules + support of CSS files
Goffi <goffi@goffi.org>
parents: 1518
diff changeset
152 f.write(
038d4bfdd967 server (tasks/JS modules): add new way to generate modules + support of CSS files
Goffi <goffi@goffi.org>
parents: 1518
diff changeset
153 "#!/usr/bin/env python3\n"
038d4bfdd967 server (tasks/JS modules): add new way to generate modules + support of CSS files
Goffi <goffi@goffi.org>
parents: 1518
diff changeset
154 f"{imports_str}\n\n"
038d4bfdd967 server (tasks/JS modules): add new way to generate modules + support of CSS files
Goffi <goffi@goffi.org>
parents: 1518
diff changeset
155 f"loaded = aio.Future()\n"
038d4bfdd967 server (tasks/JS modules): add new way to generate modules + support of CSS files
Goffi <goffi@goffi.org>
parents: 1518
diff changeset
156 f"{add_styles}\n"
038d4bfdd967 server (tasks/JS modules): add new way to generate modules + support of CSS files
Goffi <goffi@goffi.org>
parents: 1518
diff changeset
157 f"{load_js_libraries}\n"
038d4bfdd967 server (tasks/JS modules): add new way to generate modules + support of CSS files
Goffi <goffi@goffi.org>
parents: 1518
diff changeset
158 f"{init_code_str}"
038d4bfdd967 server (tasks/JS modules): add new way to generate modules + support of CSS files
Goffi <goffi@goffi.org>
parents: 1518
diff changeset
159 )