|
@@ -1,8 +1,12 @@
|
|
import inspect
|
|
import inspect
|
|
|
|
+import os.path
|
|
from functools import wraps
|
|
from functools import wraps
|
|
|
|
+from typing import List
|
|
|
|
|
|
|
|
+import justpy as jp
|
|
from starlette import requests, routing
|
|
from starlette import requests, routing
|
|
-from starlette.routing import BaseRoute, Mount
|
|
|
|
|
|
+from starlette.responses import FileResponse
|
|
|
|
+from starlette.routing import BaseRoute, Mount, Route
|
|
from starlette.staticfiles import StaticFiles
|
|
from starlette.staticfiles import StaticFiles
|
|
|
|
|
|
from . import globals
|
|
from . import globals
|
|
@@ -53,3 +57,27 @@ def get(self, path: str):
|
|
self.add_route(routing.Route(path, decorated))
|
|
self.add_route(routing.Route(path, decorated))
|
|
return decorated
|
|
return decorated
|
|
return decorator
|
|
return decorator
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+def add_dependencies(py_filepath: str, dependencies: List[str] = []) -> None:
|
|
|
|
+ globals.dependencies[py_filepath] = dependencies
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+def serve_dependencies() -> None:
|
|
|
|
+ for py_filepath, dependencies in globals.dependencies.items():
|
|
|
|
+ vue_filepath = os.path.splitext(os.path.realpath(py_filepath))[0] + '.js'
|
|
|
|
+
|
|
|
|
+ for dependency in dependencies:
|
|
|
|
+ is_remote = dependency.startswith('http://') or dependency.startswith('https://')
|
|
|
|
+ src = dependency if is_remote else f'lib/{dependency}'
|
|
|
|
+ if src not in jp.component_file_list:
|
|
|
|
+ jp.component_file_list += [src]
|
|
|
|
+ if not is_remote:
|
|
|
|
+ filepath = f'{os.path.dirname(vue_filepath)}/{src}'
|
|
|
|
+ route = Route(f'/{src}', lambda _, filepath=filepath: FileResponse(filepath))
|
|
|
|
+ jp.app.routes.insert(0, route)
|
|
|
|
+
|
|
|
|
+ if vue_filepath not in jp.component_file_list:
|
|
|
|
+ filename = os.path.basename(vue_filepath)
|
|
|
|
+ jp.app.routes.insert(0, Route(f'/{filename}', lambda _: FileResponse(vue_filepath)))
|
|
|
|
+ jp.component_file_list += [filename]
|