vue.py 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. from pathlib import Path
  2. from typing import Dict, List, Tuple
  3. import vbuild
  4. from . import globals
  5. vue_components: Dict[str, Path] = {}
  6. js_components: Dict[str, Path] = {}
  7. js_dependencies: Dict[str, List[Path]] = {}
  8. def register_component(name: str, py_filepath: str, component_filepath: str, dependencies: List[str] = []) -> None:
  9. suffix = Path(component_filepath).suffix.lower()
  10. assert suffix in ['.vue', '.js'], 'Only VUE and JS components are supported.'
  11. if suffix == '.vue':
  12. assert name not in vue_components, f'Duplicate VUE component name {name}'
  13. vue_components[name] = Path(py_filepath).parent / component_filepath
  14. elif suffix == '.js':
  15. assert name not in js_components, f'Duplicate JS component name {name}'
  16. js_components[name] = Path(py_filepath).parent / component_filepath
  17. js_dependencies[name] = []
  18. for dependency in dependencies:
  19. assert Path(dependency).suffix == '.js', 'Only JS dependencies are supported.'
  20. js_dependencies[name].append(Path(py_filepath).parent / dependency)
  21. def generate_vue_content() -> Tuple[str]:
  22. builds = [
  23. vbuild.VBuild(name, path.read_text())
  24. for name, path in vue_components.items()
  25. if name not in globals.excludes
  26. ]
  27. return (
  28. '\n'.join(v.html for v in builds),
  29. '<style>' + '\n'.join(v.style for v in builds) + '</style>',
  30. '\n'.join(v.script.replace('Vue.component', 'app.component', 1) for v in builds),
  31. )
  32. def generate_js_imports(prefix: str) -> str:
  33. result = ''
  34. for name in vue_components:
  35. if name in globals.excludes:
  36. continue
  37. for path in js_dependencies[name]:
  38. result += f'import "{prefix}/_vue/dependencies/{path}";\n'
  39. for name in js_components:
  40. if name in globals.excludes:
  41. continue
  42. for path in js_dependencies[name]:
  43. result += f'import "{prefix}/_vue/dependencies/{path}";\n'
  44. result += f'import {{ default as {name} }} from "{prefix}/_vue/components/{name}";\n'
  45. result += f'app.component("{name}", {name});\n'
  46. return result
  47. def is_js_dependency(path: Path) -> bool:
  48. return any(path in js_dependencies[name] for name in vue_components) or \
  49. any(path in js_dependencies[name] for name in js_components)