litestar-vite 0.10.0__tar.gz → 0.11.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of litestar-vite might be problematic. Click here for more details.

Files changed (71) hide show
  1. {litestar_vite-0.10.0 → litestar_vite-0.11.1}/PKG-INFO +1 -1
  2. {litestar_vite-0.10.0 → litestar_vite-0.11.1}/pyproject.toml +2 -2
  3. {litestar_vite-0.10.0 → litestar_vite-0.11.1}/src/py/litestar_vite/cli.py +1 -1
  4. {litestar_vite-0.10.0 → litestar_vite-0.11.1}/src/py/litestar_vite/commands.py +1 -1
  5. {litestar_vite-0.10.0 → litestar_vite-0.11.1}/src/py/litestar_vite/plugin.py +69 -20
  6. {litestar_vite-0.10.0 → litestar_vite-0.11.1}/.gitignore +0 -0
  7. {litestar_vite-0.10.0 → litestar_vite-0.11.1}/LICENSE +0 -0
  8. {litestar_vite-0.10.0 → litestar_vite-0.11.1}/README.md +0 -0
  9. {litestar_vite-0.10.0 → litestar_vite-0.11.1}/src/js/LICENSE +0 -0
  10. {litestar_vite-0.10.0 → litestar_vite-0.11.1}/src/js/Makefile +0 -0
  11. {litestar_vite-0.10.0 → litestar_vite-0.11.1}/src/js/NOTICE +0 -0
  12. {litestar_vite-0.10.0 → litestar_vite-0.11.1}/src/js/README.md +0 -0
  13. {litestar_vite-0.10.0 → litestar_vite-0.11.1}/src/js/src/dev-server-index.html +0 -0
  14. {litestar_vite-0.10.0 → litestar_vite-0.11.1}/src/js/src/index.ts +0 -0
  15. {litestar_vite-0.10.0 → litestar_vite-0.11.1}/src/js/src/inertia-helpers/index.ts +0 -0
  16. {litestar_vite-0.10.0 → litestar_vite-0.11.1}/src/js/tests/__data__/dummy.ts +0 -0
  17. {litestar_vite-0.10.0 → litestar_vite-0.11.1}/src/js/tests/index.test.ts +0 -0
  18. {litestar_vite-0.10.0 → litestar_vite-0.11.1}/src/js/tsconfig.inertia-helpers.json +0 -0
  19. {litestar_vite-0.10.0 → litestar_vite-0.11.1}/src/js/tsconfig.json +0 -0
  20. {litestar_vite-0.10.0 → litestar_vite-0.11.1}/src/js/vitest.config.ts +0 -0
  21. {litestar_vite-0.10.0 → litestar_vite-0.11.1}/src/js/vitest.workspace.ts +0 -0
  22. {litestar_vite-0.10.0 → litestar_vite-0.11.1}/src/py/litestar_vite/__init__.py +0 -0
  23. {litestar_vite-0.10.0 → litestar_vite-0.11.1}/src/py/litestar_vite/__metadata__.py +0 -0
  24. {litestar_vite-0.10.0 → litestar_vite-0.11.1}/src/py/litestar_vite/config.py +0 -0
  25. {litestar_vite-0.10.0 → litestar_vite-0.11.1}/src/py/litestar_vite/inertia/__init__.py +0 -0
  26. {litestar_vite-0.10.0 → litestar_vite-0.11.1}/src/py/litestar_vite/inertia/_utils.py +0 -0
  27. {litestar_vite-0.10.0 → litestar_vite-0.11.1}/src/py/litestar_vite/inertia/config.py +0 -0
  28. {litestar_vite-0.10.0 → litestar_vite-0.11.1}/src/py/litestar_vite/inertia/exception_handler.py +0 -0
  29. {litestar_vite-0.10.0 → litestar_vite-0.11.1}/src/py/litestar_vite/inertia/middleware.py +0 -0
  30. {litestar_vite-0.10.0 → litestar_vite-0.11.1}/src/py/litestar_vite/inertia/plugin.py +0 -0
  31. {litestar_vite-0.10.0 → litestar_vite-0.11.1}/src/py/litestar_vite/inertia/request.py +0 -0
  32. {litestar_vite-0.10.0 → litestar_vite-0.11.1}/src/py/litestar_vite/inertia/response.py +0 -0
  33. {litestar_vite-0.10.0 → litestar_vite-0.11.1}/src/py/litestar_vite/inertia/routes.py +0 -0
  34. {litestar_vite-0.10.0 → litestar_vite-0.11.1}/src/py/litestar_vite/inertia/types.py +0 -0
  35. {litestar_vite-0.10.0 → litestar_vite-0.11.1}/src/py/litestar_vite/loader.py +0 -0
  36. {litestar_vite-0.10.0 → litestar_vite-0.11.1}/src/py/litestar_vite/py.typed +0 -0
  37. {litestar_vite-0.10.0 → litestar_vite-0.11.1}/src/py/litestar_vite/templates/__init__.py +0 -0
  38. {litestar_vite-0.10.0 → litestar_vite-0.11.1}/src/py/litestar_vite/templates/index.html.j2 +0 -0
  39. {litestar_vite-0.10.0 → litestar_vite-0.11.1}/src/py/litestar_vite/templates/main.ts.j2 +0 -0
  40. {litestar_vite-0.10.0 → litestar_vite-0.11.1}/src/py/litestar_vite/templates/package.json.j2 +0 -0
  41. {litestar_vite-0.10.0 → litestar_vite-0.11.1}/src/py/litestar_vite/templates/styles.css.j2 +0 -0
  42. {litestar_vite-0.10.0 → litestar_vite-0.11.1}/src/py/litestar_vite/templates/tsconfig.json.j2 +0 -0
  43. {litestar_vite-0.10.0 → litestar_vite-0.11.1}/src/py/litestar_vite/templates/vite.config.ts.j2 +0 -0
  44. {litestar_vite-0.10.0 → litestar_vite-0.11.1}/src/py/tests/__init__.py +0 -0
  45. {litestar_vite-0.10.0 → litestar_vite-0.11.1}/src/py/tests/conftest.py +0 -0
  46. {litestar_vite-0.10.0 → litestar_vite-0.11.1}/src/py/tests/templates/__init__.py +0 -0
  47. {litestar_vite-0.10.0 → litestar_vite-0.11.1}/src/py/tests/templates/index.html.j2 +0 -0
  48. {litestar_vite-0.10.0 → litestar_vite-0.11.1}/src/py/tests/test_app/__init__.py +0 -0
  49. {litestar_vite-0.10.0 → litestar_vite-0.11.1}/src/py/tests/test_app/app.py +0 -0
  50. {litestar_vite-0.10.0 → litestar_vite-0.11.1}/src/py/tests/test_app/web/__init__.py +0 -0
  51. {litestar_vite-0.10.0 → litestar_vite-0.11.1}/src/py/tests/test_app/web/public/.gitkeep +0 -0
  52. {litestar_vite-0.10.0 → litestar_vite-0.11.1}/src/py/tests/test_app/web/public/assets/main-l0sNRNKZ.js +0 -0
  53. {litestar_vite-0.10.0 → litestar_vite-0.11.1}/src/py/tests/test_app/web/public/assets/styles-l0sNRNKZ.js +0 -0
  54. {litestar_vite-0.10.0 → litestar_vite-0.11.1}/src/py/tests/test_app/web/public/manifest.json +0 -0
  55. {litestar_vite-0.10.0 → litestar_vite-0.11.1}/src/py/tests/test_app/web/resources/.gitkeep +0 -0
  56. {litestar_vite-0.10.0 → litestar_vite-0.11.1}/src/py/tests/test_app/web/resources/main.ts +0 -0
  57. {litestar_vite-0.10.0 → litestar_vite-0.11.1}/src/py/tests/test_app/web/resources/styles.css +0 -0
  58. {litestar_vite-0.10.0 → litestar_vite-0.11.1}/src/py/tests/test_app/web/templates/.gitkeep +0 -0
  59. {litestar_vite-0.10.0 → litestar_vite-0.11.1}/src/py/tests/test_app/web/templates/index.html +0 -0
  60. {litestar_vite-0.10.0 → litestar_vite-0.11.1}/src/py/tests/test_asset_loader.py +0 -0
  61. {litestar_vite-0.10.0 → litestar_vite-0.11.1}/src/py/tests/test_cli/__init__.py +0 -0
  62. {litestar_vite-0.10.0 → litestar_vite-0.11.1}/src/py/tests/test_cli/conftest.py +0 -0
  63. {litestar_vite-0.10.0 → litestar_vite-0.11.1}/src/py/tests/test_cli/test_init.py +0 -0
  64. {litestar_vite-0.10.0 → litestar_vite-0.11.1}/src/py/tests/test_commands.py +0 -0
  65. {litestar_vite-0.10.0 → litestar_vite-0.11.1}/src/py/tests/test_config.py +0 -0
  66. {litestar_vite-0.10.0 → litestar_vite-0.11.1}/src/py/tests/test_inertia/__init__.py +0 -0
  67. {litestar_vite-0.10.0 → litestar_vite-0.11.1}/src/py/tests/test_inertia/conftest.py +0 -0
  68. {litestar_vite-0.10.0 → litestar_vite-0.11.1}/src/py/tests/test_inertia/templates/index.html.j2 +0 -0
  69. {litestar_vite-0.10.0 → litestar_vite-0.11.1}/src/py/tests/test_inertia/test_inertia_request.py +0 -0
  70. {litestar_vite-0.10.0 → litestar_vite-0.11.1}/src/py/tests/test_inertia/test_inertia_response.py +0 -0
  71. {litestar_vite-0.10.0 → litestar_vite-0.11.1}/src/py/tests/test_inertia/test_routes.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: litestar-vite
3
- Version: 0.10.0
3
+ Version: 0.11.1
4
4
  Summary: Vite plugin for Litestar
5
5
  Project-URL: Changelog, https://cofin.github.io/litestar-vite/latest/changelog
6
6
  Project-URL: Discord, https://discord.gg/X3FJqy8d2j
@@ -25,7 +25,7 @@ license = { text = "MIT" }
25
25
  name = "litestar-vite"
26
26
  readme = "README.md"
27
27
  requires-python = ">=3.8"
28
- version = "0.10.0"
28
+ version = "0.11.1"
29
29
 
30
30
  [project.urls]
31
31
  Changelog = "https://cofin.github.io/litestar-vite/latest/changelog"
@@ -85,7 +85,7 @@ test = [
85
85
  allow_dirty = true
86
86
  commit = true
87
87
  commit_args = "--no-verify"
88
- current_version = "0.10.0"
88
+ current_version = "0.11.1"
89
89
  ignore_missing_files = false
90
90
  ignore_missing_version = false
91
91
  message = "chore(release): bump to v{new_version}"
@@ -113,8 +113,8 @@ def vite_init(
113
113
  )
114
114
  from rich.prompt import Confirm
115
115
 
116
+ from litestar_vite import VitePlugin
116
117
  from litestar_vite.commands import execute_command, init_vite
117
- from litestar_vite.plugin import VitePlugin
118
118
 
119
119
  if callable(ctx.obj):
120
120
  ctx.obj = ctx.obj()
@@ -14,7 +14,7 @@ DEFAULT_RESOURCES: set[str] = {"styles.css.j2", "main.ts.j2"}
14
14
  DEFAULT_DEV_DEPENDENCIES: dict[str, str] = {
15
15
  "typescript": "^5.7.2",
16
16
  "vite": "^6.0.3",
17
- "litestar-vite-plugin": "^0.10.0",
17
+ "litestar-vite-plugin": "^0.11.1",
18
18
  "@types/node": "^22.10.1",
19
19
  }
20
20
  DEFAULT_DEPENDENCIES: dict[str, str] = {"axios": "^1.7.2"}
@@ -1,23 +1,28 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  import os
4
+ import platform
5
+ import signal
6
+ import subprocess
7
+ import threading
4
8
  from contextlib import contextmanager
5
9
  from pathlib import Path
6
10
  from typing import TYPE_CHECKING, Iterator, cast
7
11
 
12
+ from litestar.cli._utils import console
8
13
  from litestar.contrib.jinja import JinjaTemplateEngine
9
14
  from litestar.exceptions import ImproperlyConfiguredException
10
15
  from litestar.plugins import CLIPlugin, InitPluginProtocol
11
16
  from litestar.static_files import create_static_files_router # pyright: ignore[reportUnknownVariableType]
12
17
 
13
- from litestar_vite.config import ViteConfig
14
- from litestar_vite.loader import ViteAssetLoader, render_asset_tag, render_hmr_client
15
-
16
18
  if TYPE_CHECKING:
17
19
  from click import Group
18
20
  from litestar import Litestar
19
21
  from litestar.config.app import AppConfig
20
22
 
23
+ from litestar_vite.config import ViteConfig
24
+ from litestar_vite.loader import ViteAssetLoader
25
+
21
26
 
22
27
  def set_environment(config: ViteConfig) -> None:
23
28
  """Configure environment for easier integration"""
@@ -31,11 +36,57 @@ def set_environment(config: ViteConfig) -> None:
31
36
  os.environ.setdefault("VITE_DEV_MODE", str(config.dev_mode))
32
37
 
33
38
 
39
+ class ViteProcess:
40
+ """Manages the Vite process."""
41
+
42
+ def __init__(self) -> None:
43
+ self.process: subprocess.Popen | None = None # pyright: ignore[reportUnknownMemberType,reportMissingTypeArgument]
44
+ self._lock = threading.Lock()
45
+
46
+ def start(self, command: list[str], cwd: Path | str | None) -> None:
47
+ """Start the Vite process."""
48
+
49
+ try:
50
+ with self._lock:
51
+ if self.process and self.process.poll() is None: # pyright: ignore[reportUnknownMemberType]
52
+ return
53
+
54
+ console.print(f"Starting Vite process with command: {command}")
55
+ self.process = subprocess.Popen(
56
+ command,
57
+ cwd=cwd,
58
+ shell=platform.system() == "Windows",
59
+ )
60
+ except Exception as e:
61
+ console.print(f"[red]Failed to start Vite process: {e!s}[/]")
62
+ raise
63
+
64
+ def stop(self, timeout: float = 5.0) -> None:
65
+ """Stop the Vite process."""
66
+
67
+ try:
68
+ with self._lock:
69
+ if self.process and self.process.poll() is None: # pyright: ignore[reportUnknownMemberType]
70
+ # Send SIGTERM to child process
71
+ if hasattr(signal, "SIGTERM"):
72
+ self.process.terminate() # pyright: ignore[reportUnknownMemberType]
73
+ try:
74
+ self.process.wait(timeout=timeout) # pyright: ignore[reportUnknownMemberType]
75
+ except subprocess.TimeoutExpired:
76
+ # Force kill if still alive
77
+ if hasattr(signal, "SIGKILL"):
78
+ self.process.kill() # pyright: ignore[reportUnknownMemberType]
79
+ self.process.wait(timeout=1.0) # pyright: ignore[reportUnknownMemberType]
80
+ console.print("Stopping Vite process")
81
+ except Exception as e:
82
+ console.print(f"[red]Failed to stop Vite process: {e!s}[/]")
83
+ raise
84
+
85
+
34
86
  class VitePlugin(InitPluginProtocol, CLIPlugin):
35
87
  """Vite plugin."""
36
88
 
37
- __slots__ = ("_asset_loader", "_config")
38
- _asset_loader: ViteAssetLoader | None
89
+ __slots__ = ("_asset_loader", "_config", "_vite_process")
39
90
 
40
91
  def __init__(self, config: ViteConfig | None = None, asset_loader: ViteAssetLoader | None = None) -> None:
41
92
  """Initialize ``Vite``.
@@ -44,10 +95,13 @@ class VitePlugin(InitPluginProtocol, CLIPlugin):
44
95
  config: configuration to use for starting Vite. The default configuration will be used if it is not provided.
45
96
  asset_loader: an initialized asset loader to use for rendering asset tags.
46
97
  """
98
+ from litestar_vite.config import ViteConfig
99
+
47
100
  if config is None:
48
101
  config = ViteConfig()
49
102
  self._config = config
50
103
  self._asset_loader = asset_loader
104
+ self._vite_process = ViteProcess()
51
105
 
52
106
  @property
53
107
  def config(self) -> ViteConfig:
@@ -55,6 +109,8 @@ class VitePlugin(InitPluginProtocol, CLIPlugin):
55
109
 
56
110
  @property
57
111
  def asset_loader(self) -> ViteAssetLoader:
112
+ from litestar_vite.loader import ViteAssetLoader
113
+
58
114
  if self._asset_loader is None:
59
115
  self._asset_loader = ViteAssetLoader.initialize_loader(config=self._config)
60
116
  return self._asset_loader
@@ -70,6 +126,8 @@ class VitePlugin(InitPluginProtocol, CLIPlugin):
70
126
  Args:
71
127
  app_config: The :class:`AppConfig <litestar.config.app.AppConfig>` instance.
72
128
  """
129
+ from litestar_vite.loader import render_asset_tag, render_hmr_client
130
+
73
131
  if app_config.template_config is None: # pyright: ignore[reportUnknownMemberType]
74
132
  msg = "A template configuration is required for Vite."
75
133
  raise ImproperlyConfiguredException(msg)
@@ -105,34 +163,25 @@ class VitePlugin(InitPluginProtocol, CLIPlugin):
105
163
 
106
164
  @contextmanager
107
165
  def server_lifespan(self, app: Litestar) -> Iterator[None]:
108
- import threading
109
-
110
- from litestar.cli._utils import console
111
-
112
- from litestar_vite.commands import execute_command
166
+ """Manage Vite server process lifecycle."""
113
167
 
114
168
  if self._config.use_server_lifespan and self._config.dev_mode:
115
169
  command_to_run = self._config.run_command if self._config.hot_reload else self._config.build_watch_command
170
+
116
171
  if self.config.hot_reload:
117
172
  console.rule("[yellow]Starting Vite process with HMR Enabled[/]", align="left")
118
173
  else:
119
174
  console.rule("[yellow]Starting Vite watch and build process[/]", align="left")
175
+
120
176
  if self._config.set_environment:
121
177
  set_environment(config=self._config)
122
- vite_thread = threading.Thread(
123
- name="vite",
124
- target=execute_command,
125
- args=[],
126
- kwargs={"command_to_run": command_to_run, "cwd": self._config.root_dir},
127
- )
178
+
128
179
  try:
129
- vite_thread.start()
180
+ self._vite_process.start(command_to_run, self._config.root_dir)
130
181
  yield
131
182
  finally:
132
- if vite_thread.is_alive():
133
- vite_thread.join(timeout=5)
183
+ self._vite_process.stop()
134
184
  console.print("[yellow]Vite process stopped.[/]")
135
-
136
185
  else:
137
186
  manifest_path = Path(f"{self._config.bundle_dir}/{self._config.manifest_name}")
138
187
  if manifest_path.exists():
File without changes
File without changes