wexample-wex-addon-dev-javascript 7.10.10__tar.gz → 7.11.0__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.
Files changed (35) hide show
  1. {wexample_wex_addon_dev_javascript-7.10.10 → wexample_wex_addon_dev_javascript-7.11.0}/PKG-INFO +8 -4
  2. {wexample_wex_addon_dev_javascript-7.10.10 → wexample_wex_addon_dev_javascript-7.11.0}/README.md +4 -2
  3. {wexample_wex_addon_dev_javascript-7.10.10 → wexample_wex_addon_dev_javascript-7.11.0}/pyproject.toml +4 -2
  4. {wexample_wex_addon_dev_javascript-7.10.10/src/wexample_wex_addon_dev_javascript/config_value → wexample_wex_addon_dev_javascript-7.11.0/src/wexample_wex_addon_dev_javascript/common}/__init__.py +0 -0
  5. wexample_wex_addon_dev_javascript-7.11.0/src/wexample_wex_addon_dev_javascript/common/npm_registry_gateway.py +44 -0
  6. {wexample_wex_addon_dev_javascript-7.10.10/src/wexample_wex_addon_dev_javascript/services/node → wexample_wex_addon_dev_javascript-7.11.0/src/wexample_wex_addon_dev_javascript/const}/__init__.py +0 -0
  7. wexample_wex_addon_dev_javascript-7.11.0/src/wexample_wex_addon_dev_javascript/const/tags.py +11 -0
  8. wexample_wex_addon_dev_javascript-7.11.0/src/wexample_wex_addon_dev_javascript/services/vite/commands/service/__init__.py +0 -0
  9. {wexample_wex_addon_dev_javascript-7.10.10 → wexample_wex_addon_dev_javascript-7.11.0}/src/wexample_wex_addon_dev_javascript/services/vite/commands/service/install.py +12 -0
  10. {wexample_wex_addon_dev_javascript-7.10.10 → wexample_wex_addon_dev_javascript-7.11.0}/src/wexample_wex_addon_dev_javascript/services/vite/commands/service/ready.py +17 -1
  11. wexample_wex_addon_dev_javascript-7.11.0/src/wexample_wex_addon_dev_javascript/workdir/__init__.py +0 -0
  12. {wexample_wex_addon_dev_javascript-7.10.10 → wexample_wex_addon_dev_javascript-7.11.0}/src/wexample_wex_addon_dev_javascript/workdir/javascript_package_workdir.py +17 -27
  13. {wexample_wex_addon_dev_javascript-7.10.10 → wexample_wex_addon_dev_javascript-7.11.0}/src/wexample_wex_addon_dev_javascript/workdir/javascript_packages_suite_workdir.py +2 -0
  14. {wexample_wex_addon_dev_javascript-7.10.10 → wexample_wex_addon_dev_javascript-7.11.0}/src/wexample_wex_addon_dev_javascript/workdir/javascript_workdir.py +8 -1
  15. {wexample_wex_addon_dev_javascript-7.10.10 → wexample_wex_addon_dev_javascript-7.11.0}/src/wexample_wex_addon_dev_javascript/__init__.py +0 -0
  16. {wexample_wex_addon_dev_javascript-7.10.10 → wexample_wex_addon_dev_javascript-7.11.0}/src/wexample_wex_addon_dev_javascript/__pycache__/__init__.py +0 -0
  17. {wexample_wex_addon_dev_javascript-7.10.10/src/wexample_wex_addon_dev_javascript/services → wexample_wex_addon_dev_javascript-7.11.0/src/wexample_wex_addon_dev_javascript/config_value}/__init__.py +0 -0
  18. {wexample_wex_addon_dev_javascript-7.10.10 → wexample_wex_addon_dev_javascript-7.11.0}/src/wexample_wex_addon_dev_javascript/config_value/javascript_package_readme_config_value.py +0 -0
  19. {wexample_wex_addon_dev_javascript-7.10.10 → wexample_wex_addon_dev_javascript-7.11.0}/src/wexample_wex_addon_dev_javascript/file/__init__.py +0 -0
  20. {wexample_wex_addon_dev_javascript-7.10.10 → wexample_wex_addon_dev_javascript-7.11.0}/src/wexample_wex_addon_dev_javascript/file/javascript_package_json_file.py +0 -0
  21. {wexample_wex_addon_dev_javascript-7.10.10 → wexample_wex_addon_dev_javascript-7.11.0}/src/wexample_wex_addon_dev_javascript/file/javascript_tsconfig_json_file.py +0 -0
  22. {wexample_wex_addon_dev_javascript-7.10.10 → wexample_wex_addon_dev_javascript-7.11.0}/src/wexample_wex_addon_dev_javascript/javascript_addon_manager.py +0 -0
  23. {wexample_wex_addon_dev_javascript-7.10.10 → wexample_wex_addon_dev_javascript-7.11.0}/src/wexample_wex_addon_dev_javascript/py.typed +0 -0
  24. {wexample_wex_addon_dev_javascript-7.10.10 → wexample_wex_addon_dev_javascript-7.11.0}/src/wexample_wex_addon_dev_javascript/resources/.wex.yml +0 -0
  25. {wexample_wex_addon_dev_javascript-7.10.10 → wexample_wex_addon_dev_javascript-7.11.0}/src/wexample_wex_addon_dev_javascript/resources/package_publish.yml +0 -0
  26. {wexample_wex_addon_dev_javascript-7.10.10/src/wexample_wex_addon_dev_javascript/services/vite → wexample_wex_addon_dev_javascript-7.11.0/src/wexample_wex_addon_dev_javascript/services}/__init__.py +0 -0
  27. {wexample_wex_addon_dev_javascript-7.10.10/src/wexample_wex_addon_dev_javascript/services/vite/commands → wexample_wex_addon_dev_javascript-7.11.0/src/wexample_wex_addon_dev_javascript/services/node}/__init__.py +0 -0
  28. {wexample_wex_addon_dev_javascript-7.10.10 → wexample_wex_addon_dev_javascript-7.11.0}/src/wexample_wex_addon_dev_javascript/services/node/docker/.wex.yml +0 -0
  29. {wexample_wex_addon_dev_javascript-7.10.10 → wexample_wex_addon_dev_javascript-7.11.0}/src/wexample_wex_addon_dev_javascript/services/node/docker/docker-compose.yml +0 -0
  30. {wexample_wex_addon_dev_javascript-7.10.10 → wexample_wex_addon_dev_javascript-7.11.0}/src/wexample_wex_addon_dev_javascript/services/node/service.yml +0 -0
  31. {wexample_wex_addon_dev_javascript-7.10.10/src/wexample_wex_addon_dev_javascript/services/vite/commands/service → wexample_wex_addon_dev_javascript-7.11.0/src/wexample_wex_addon_dev_javascript/services/vite}/__init__.py +0 -0
  32. {wexample_wex_addon_dev_javascript-7.10.10/src/wexample_wex_addon_dev_javascript/workdir → wexample_wex_addon_dev_javascript-7.11.0/src/wexample_wex_addon_dev_javascript/services/vite/commands}/__init__.py +0 -0
  33. {wexample_wex_addon_dev_javascript-7.10.10 → wexample_wex_addon_dev_javascript-7.11.0}/src/wexample_wex_addon_dev_javascript/services/vite/docker/.wex.yml +0 -0
  34. {wexample_wex_addon_dev_javascript-7.10.10 → wexample_wex_addon_dev_javascript-7.11.0}/src/wexample_wex_addon_dev_javascript/services/vite/docker/docker-compose.yml +0 -0
  35. {wexample_wex_addon_dev_javascript-7.10.10 → wexample_wex_addon_dev_javascript-7.11.0}/src/wexample_wex_addon_dev_javascript/services/vite/service.yml +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: wexample-wex-addon-dev-javascript
3
- Version: 7.10.10
3
+ Version: 7.11.0
4
4
  Summary: Python dev addon for wex
5
5
  Author-Email: weeger <contact@wexample.com>
6
6
  License: MIT
@@ -11,8 +11,10 @@ Project-URL: homepage, https://github.com/wexample/python-wex-dev-python
11
11
  Requires-Python: >=3.10
12
12
  Requires-Dist: attrs>=23.1.0
13
13
  Requires-Dist: cattrs>=23.1.0
14
+ Requires-Dist: wexample-api>=6.2.0
14
15
  Requires-Dist: wexample-filestate-javascript>=6.3.0
15
- Requires-Dist: wexample-wex-addon-app>=22.0.0
16
+ Requires-Dist: wexample-wex-addon-ai>=8.0.0
17
+ Requires-Dist: wexample-wex-addon-app>=23.0.0
16
18
  Provides-Extra: dev
17
19
  Requires-Dist: pytest; extra == "dev"
18
20
  Requires-Dist: pytest-cov; extra == "dev"
@@ -20,7 +22,7 @@ Description-Content-Type: text/markdown
20
22
 
21
23
  # wex_addon_dev_javascript
22
24
 
23
- Version: 7.10.10
25
+ Version: 7.11.0
24
26
 
25
27
  Python dev addon for wex
26
28
 
@@ -102,8 +104,10 @@ Visit the [Wexample Suite documentation](https://docs.wexample.com) for the comp
102
104
 
103
105
  - attrs: >=23.1.0
104
106
  - cattrs: >=23.1.0
107
+ - wexample-api: >=6.2.0
105
108
  - wexample-filestate-javascript: >=6.3.0
106
- - wexample-wex-addon-app: >=22.0.0
109
+ - wexample-wex-addon-ai: >=8.0.0
110
+ - wexample-wex-addon-app: >=23.0.0
107
111
 
108
112
  ## Versioning & Compatibility Policy
109
113
 
@@ -1,6 +1,6 @@
1
1
  # wex_addon_dev_javascript
2
2
 
3
- Version: 7.10.10
3
+ Version: 7.11.0
4
4
 
5
5
  Python dev addon for wex
6
6
 
@@ -82,8 +82,10 @@ Visit the [Wexample Suite documentation](https://docs.wexample.com) for the comp
82
82
 
83
83
  - attrs: >=23.1.0
84
84
  - cattrs: >=23.1.0
85
+ - wexample-api: >=6.2.0
85
86
  - wexample-filestate-javascript: >=6.3.0
86
- - wexample-wex-addon-app: >=22.0.0
87
+ - wexample-wex-addon-ai: >=8.0.0
88
+ - wexample-wex-addon-app: >=23.0.0
87
89
 
88
90
  ## Versioning & Compatibility Policy
89
91
 
@@ -6,7 +6,7 @@ build-backend = "pdm.backend"
6
6
 
7
7
  [project]
8
8
  name = "wexample-wex-addon-dev-javascript"
9
- version = "7.10.10"
9
+ version = "7.11.0"
10
10
  description = "Python dev addon for wex"
11
11
  authors = [
12
12
  { name = "weeger", email = "contact@wexample.com" },
@@ -20,8 +20,10 @@ classifiers = [
20
20
  dependencies = [
21
21
  "attrs>=23.1.0",
22
22
  "cattrs>=23.1.0",
23
+ "wexample-api>=6.2.0",
23
24
  "wexample-filestate-javascript>=6.3.0",
24
- "wexample-wex-addon-app>=22.0.0",
25
+ "wexample-wex-addon-ai>=8.0.0",
26
+ "wexample-wex-addon-app>=23.0.0",
25
27
  ]
26
28
 
27
29
  [project.readme]
@@ -0,0 +1,44 @@
1
+ from __future__ import annotations
2
+
3
+ from wexample_api.common.abstract_gateway import AbstractGateway
4
+ from wexample_helpers.classes.field import public_field
5
+ from wexample_helpers.decorator.base_class import base_class
6
+
7
+
8
+ @base_class
9
+ class NpmRegistryGateway(AbstractGateway):
10
+ """Thin HTTP gateway over an npm registry JSON API.
11
+
12
+ Targets public npm (`https://registry.npmjs.org`) and private registries
13
+ that expose the same package-manifest layout (e.g. GitLab npm registry).
14
+ Optional Bearer auth via `token`.
15
+ """
16
+
17
+ token: str | None = public_field(
18
+ default=None,
19
+ description="Optional Bearer token for private registries.",
20
+ )
21
+
22
+ def __attrs_post_init__(self) -> None:
23
+ super().__attrs_post_init__()
24
+ if self.token:
25
+ self.default_headers["Authorization"] = f"Bearer {self.token}"
26
+
27
+ def has_version(self, package: str, version: str) -> bool:
28
+ """Return True iff `package@version` is published on this registry.
29
+
30
+ Fetches the package manifest and looks up the version in the
31
+ `versions` map — works for both public npm and private (GitLab)
32
+ registries that don't expose per-version URLs. Returns False on
33
+ 404 (unknown package or version not yet propagated).
34
+ """
35
+ encoded = package.replace("/", "%2F")
36
+ response = self.make_request(
37
+ endpoint=encoded,
38
+ expected_status_codes=[200, 404],
39
+ fatal_if_unexpected=False,
40
+ quiet=True,
41
+ )
42
+ if response is None or response.status_code != 200:
43
+ return False
44
+ return version in (response.json().get("versions") or {})
@@ -0,0 +1,11 @@
1
+ """Domain tags exposed by this addon — one entry per `domain:*` value its commands use."""
2
+
3
+ from __future__ import annotations
4
+
5
+
6
+ class DomainTag:
7
+ """Functional domain this addon's commands touch."""
8
+
9
+ DEV_SERVER = "domain:dev-server"
10
+ FRONTEND = "domain:frontend"
11
+ SERVICE = "domain:service"
@@ -2,9 +2,12 @@ from __future__ import annotations
2
2
 
3
3
  from typing import TYPE_CHECKING
4
4
 
5
+ from wexample_cli.const.tags import AudienceTag, EffectTag, ScopeTag
5
6
  from wexample_cli.decorator.command import command
6
7
  from wexample_wex_core.const.globals import COMMAND_TYPE_SERVICE
7
8
 
9
+ from wexample_wex_addon_dev_javascript.const.tags import DomainTag
10
+
8
11
  if TYPE_CHECKING:
9
12
  from wexample_cli.context.execution_context import ExecutionContext
10
13
  from wexample_wex_addon_app.service.app_service import AppService
@@ -13,6 +16,15 @@ if TYPE_CHECKING:
13
16
  @command(
14
17
  type=COMMAND_TYPE_SERVICE,
15
18
  description="Patch vite.config.ts to allow all hosts (needed behind a reverse proxy)",
19
+ tags=[
20
+ DomainTag.DEV_SERVER,
21
+ DomainTag.FRONTEND,
22
+ DomainTag.SERVICE,
23
+ EffectTag.WRITE,
24
+ AudienceTag.AGENT_SAFE,
25
+ ScopeTag.APP,
26
+ ScopeTag.LOCAL,
27
+ ],
16
28
  )
17
29
  def vite__service__install(
18
30
  context: ExecutionContext,
@@ -2,9 +2,12 @@ from __future__ import annotations
2
2
 
3
3
  from typing import TYPE_CHECKING
4
4
 
5
+ from wexample_cli.const.tags import AudienceTag, EffectTag, ScopeTag
5
6
  from wexample_cli.decorator.command import command
6
7
  from wexample_wex_core.const.globals import COMMAND_TYPE_SERVICE
7
8
 
9
+ from wexample_wex_addon_dev_javascript.const.tags import DomainTag
10
+
8
11
  if TYPE_CHECKING:
9
12
  from wexample_app.response.boolean_response import BooleanResponse
10
13
  from wexample_cli.context.execution_context import ExecutionContext
@@ -12,7 +15,20 @@ if TYPE_CHECKING:
12
15
 
13
16
 
14
17
  @command(
15
- type=COMMAND_TYPE_SERVICE, description="Check if the Vite dev server is responding"
18
+ type=COMMAND_TYPE_SERVICE,
19
+ description="Check if the Vite dev server is responding",
20
+ tags=[
21
+ DomainTag.DEV_SERVER,
22
+ DomainTag.FRONTEND,
23
+ DomainTag.SERVICE,
24
+ EffectTag.IDEMPOTENT,
25
+ EffectTag.NETWORK_CALL,
26
+ EffectTag.READ_ONLY,
27
+ EffectTag.SUBPROCESS_SPAWN,
28
+ AudienceTag.AGENT_SAFE,
29
+ ScopeTag.APP,
30
+ ScopeTag.LOCAL,
31
+ ],
16
32
  )
17
33
  def vite__service__ready(
18
34
  context: ExecutionContext,
@@ -2,6 +2,7 @@ from __future__ import annotations
2
2
 
3
3
  from typing import TYPE_CHECKING
4
4
 
5
+ from wexample_helpers.decorator.base_class import base_class
5
6
  from wexample_helpers.helpers.string import string_to_kebab_case
6
7
  from wexample_helpers_git.helpers.git import (
7
8
  git_tag_annotated,
@@ -22,6 +23,7 @@ if TYPE_CHECKING:
22
23
  )
23
24
 
24
25
 
26
+ @base_class
25
27
  class JavascriptPackageWorkdir(JavascriptWorkdir):
26
28
  def get_package_dependency_name(self) -> str:
27
29
  return self.get_package_import_name()
@@ -155,45 +157,33 @@ class JavascriptPackageWorkdir(JavascriptWorkdir):
155
157
  def _wait_for_registry(self) -> None:
156
158
  """Poll the configured npm registry until the current version is available (max 20 min).
157
159
 
158
- Fetches the package manifest and checks for the version in 'versions' — compatible
159
- with both public npm and private registries (e.g. GitLab) that don't expose
160
- per-version URLs.
160
+ Works for both public npm and private registries (e.g. GitLab) that
161
+ don't expose per-version URLs relies on the package manifest's
162
+ `versions` map.
161
163
  """
162
- import json
163
- import urllib.error
164
- import urllib.request
165
-
166
164
  from wexample_helpers.helpers.polling_callback_manager import (
167
165
  PollingCallbackManager,
168
166
  )
169
167
 
168
+ from wexample_wex_addon_dev_javascript.common.npm_registry_gateway import (
169
+ NpmRegistryGateway,
170
+ )
171
+
170
172
  package = self.get_project_name()
171
173
  version = self.get_setup_version()
172
174
 
173
175
  registry_base = (
174
176
  self.get_runtime_config().search("npm.registry_url").get_str_or_none()
177
+ or "https://registry.npmjs.org"
175
178
  )
176
179
  token = self.get_runtime_config().search("npm.api_token").get_str_or_none()
177
180
 
178
- encoded = package.replace("/", "%2F")
179
- url = f"{(registry_base or 'https://registry.npmjs.org').rstrip('/')}/{encoded}"
180
-
181
- def check_available() -> bool | None:
182
- try:
183
- req = urllib.request.Request(url)
184
- if token:
185
- req.add_header("Authorization", f"Bearer {token}")
186
- with urllib.request.urlopen(req, timeout=10) as resp:
187
- if resp.status == 200:
188
- data = json.loads(resp.read())
189
- if version in data.get("versions", {}):
190
- return True
191
- except urllib.error.HTTPError as e:
192
- if e.code != 404:
193
- raise
194
- except Exception:
195
- pass
196
- return None
181
+ gateway = NpmRegistryGateway(
182
+ base_url=registry_base,
183
+ token=token,
184
+ io=self.io,
185
+ timeout=10,
186
+ )
197
187
 
198
188
  max_attempts = 40
199
189
  delay_seconds = 30
@@ -206,7 +196,7 @@ class JavascriptPackageWorkdir(JavascriptWorkdir):
206
196
  )
207
197
 
208
198
  PollingCallbackManager(
209
- callback=check_available,
199
+ callback=lambda: True if gateway.has_version(package, version) else None,
210
200
  max_attempts=max_attempts,
211
201
  delay_seconds_callback=lambda _attempt: delay_seconds,
212
202
  on_retry_callback=on_retry,
@@ -2,6 +2,7 @@ from __future__ import annotations
2
2
 
3
3
  from typing import TYPE_CHECKING
4
4
 
5
+ from wexample_helpers.decorator.base_class import base_class
5
6
  from wexample_wex_addon_app.workdir.framework_packages_suite_workdir import (
6
7
  FrameworkPackageSuiteWorkdir,
7
8
  )
@@ -12,6 +13,7 @@ if TYPE_CHECKING:
12
13
  from wexample_wex_addon_app.workdir.code_base_workdir import CodeBaseWorkdir
13
14
 
14
15
 
16
+ @base_class
15
17
  class JavascriptPackagesSuiteWorkdir(FrameworkPackageSuiteWorkdir):
16
18
  def _child_is_package_directory(self, entry: Path) -> bool:
17
19
  return entry.is_dir() and (entry / "package.json").is_file()
@@ -5,6 +5,10 @@ from typing import TYPE_CHECKING
5
5
  from wexample_config.options_provider.abstract_options_provider import (
6
6
  AbstractOptionsProvider,
7
7
  )
8
+ from wexample_helpers.decorator.base_class import base_class
9
+ from wexample_wex_addon_ai.workdir.mixin.with_ai_workdir_mixin import (
10
+ WithAiWorkdirMixin,
11
+ )
8
12
  from wexample_wex_addon_app.workdir.code_base_workdir import CodeBaseWorkdir
9
13
 
10
14
  if TYPE_CHECKING:
@@ -18,7 +22,8 @@ if TYPE_CHECKING:
18
22
  )
19
23
 
20
24
 
21
- class JavascriptWorkdir(CodeBaseWorkdir):
25
+ @base_class
26
+ class JavascriptWorkdir(WithAiWorkdirMixin, CodeBaseWorkdir):
22
27
  def get_app_config_file(self, reload: bool = True) -> JavascriptPackageJsonFile:
23
28
  from wexample_wex_addon_dev_javascript.file.javascript_package_json_file import (
24
29
  JavascriptPackageJsonFile,
@@ -63,6 +68,8 @@ class JavascriptWorkdir(CodeBaseWorkdir):
63
68
 
64
69
  raw_value = super().prepare_value(raw_value=raw_value)
65
70
 
71
+ self.append_agents(config=raw_value)
72
+
66
73
  # Ensure a package.json file exists for any JavaScript package project
67
74
  children = raw_value["children"]
68
75