jac-client 0.2.12__py3-none-any.whl → 0.2.14__py3-none-any.whl
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.
- jac_client/examples/all-in-one/components/Header.jac +1 -1
- jac_client/examples/all-in-one/components/ProfitOverview.jac +1 -1
- jac_client/examples/all-in-one/components/Summary.jac +1 -1
- jac_client/examples/all-in-one/components/TransactionList.jac +2 -2
- jac_client/examples/all-in-one/components/navigation.jac +3 -9
- jac_client/examples/all-in-one/context/BudgetContext.jac +1 -1
- jac_client/examples/all-in-one/main.jac +5 -386
- jac_client/examples/all-in-one/pages/(auth)/index.jac +299 -0
- jac_client/examples/all-in-one/pages/{nestedDemo.jac → (auth)/nested.jac} +3 -13
- jac_client/examples/all-in-one/pages/{loginPage.jac → (public)/login.jac} +1 -1
- jac_client/examples/all-in-one/pages/{signupPage.jac → (public)/signup.jac} +1 -1
- jac_client/examples/all-in-one/pages/{notFound.jac → [...notFound].jac} +2 -1
- jac_client/examples/all-in-one/pages/budget.jac +11 -0
- jac_client/examples/all-in-one/pages/budget_planner_ui.cl.jac +1 -1
- jac_client/examples/all-in-one/pages/features.jac +8 -0
- jac_client/examples/all-in-one/pages/features_test_ui.cl.jac +7 -7
- jac_client/examples/all-in-one/pages/{LandingPage.jac → landing.jac} +4 -9
- jac_client/examples/all-in-one/pages/layout.jac +20 -0
- jac_client/examples/nested-folders/nested-advance/src/ButtonRoot.jac +1 -1
- jac_client/examples/nested-folders/nested-advance/src/level1/ButtonSecondL.jac +1 -1
- jac_client/examples/nested-folders/nested-advance/src/level1/level2/ButtonThirdL.jac +1 -1
- jac_client/plugin/cli.jac +3 -3
- jac_client/plugin/client_runtime.cl.jac +7 -4
- jac_client/plugin/impl/client_runtime.impl.jac +29 -7
- jac_client/plugin/plugin_config.jac +4 -11
- jac_client/plugin/src/compiler.jac +19 -1
- jac_client/plugin/src/config_loader.jac +1 -0
- jac_client/plugin/src/impl/compiler.impl.jac +232 -62
- jac_client/plugin/src/impl/config_loader.impl.jac +8 -0
- jac_client/plugin/src/impl/package_installer.impl.jac +3 -2
- jac_client/plugin/src/impl/route_scanner.impl.jac +201 -0
- jac_client/plugin/src/impl/vite_bundler.impl.jac +54 -15
- jac_client/plugin/src/route_scanner.jac +44 -0
- jac_client/plugin/src/targets/desktop/sidecar/main.py +42 -23
- jac_client/plugin/src/targets/desktop_target.jac +4 -2
- jac_client/plugin/src/targets/impl/desktop_target.impl.jac +324 -112
- jac_client/plugin/src/vite_bundler.jac +18 -3
- jac_client/plugin/utils/impl/bun_installer.impl.jac +16 -19
- jac_client/plugin/utils/impl/client_deps.impl.jac +12 -16
- jac_client/templates/fullstack.jacpack +3 -2
- jac_client/tests/test_cli.py +74 -0
- jac_client/tests/test_desktop_api_url.py +854 -0
- jac_client/tests/test_e2e.py +31 -40
- jac_client/tests/test_it.py +209 -11
- {jac_client-0.2.12.dist-info → jac_client-0.2.14.dist-info}/METADATA +2 -2
- {jac_client-0.2.12.dist-info → jac_client-0.2.14.dist-info}/RECORD +49 -44
- jac_client/examples/all-in-one/pages/BudgetPlanner.jac +0 -140
- jac_client/examples/all-in-one/pages/FeaturesTest.jac +0 -157
- {jac_client-0.2.12.dist-info → jac_client-0.2.14.dist-info}/WHEEL +0 -0
- {jac_client-0.2.12.dist-info → jac_client-0.2.14.dist-info}/entry_points.txt +0 -0
- {jac_client-0.2.12.dist-info → jac_client-0.2.14.dist-info}/top_level.txt +0 -0
jac_client/tests/test_e2e.py
CHANGED
|
@@ -4,10 +4,9 @@ from __future__ import annotations
|
|
|
4
4
|
|
|
5
5
|
import gc
|
|
6
6
|
import os
|
|
7
|
-
import shutil
|
|
8
7
|
import tempfile
|
|
9
8
|
import time
|
|
10
|
-
from subprocess import
|
|
9
|
+
from subprocess import Popen, run
|
|
11
10
|
|
|
12
11
|
import pytest
|
|
13
12
|
|
|
@@ -27,6 +26,8 @@ from .test_helpers import (
|
|
|
27
26
|
def running_server():
|
|
28
27
|
"""Start the all-in-one jac server for the test module and yield its URL.
|
|
29
28
|
|
|
29
|
+
Uses jacpack to bundle and extract the all-in-one example.
|
|
30
|
+
|
|
30
31
|
Yields a dict with keys `port` and `url`.
|
|
31
32
|
"""
|
|
32
33
|
tests_dir = os.path.dirname(__file__)
|
|
@@ -44,43 +45,33 @@ def running_server():
|
|
|
44
45
|
original_cwd = os.getcwd()
|
|
45
46
|
try:
|
|
46
47
|
os.chdir(temp_dir)
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
48
|
+
|
|
49
|
+
# Create jacpack file from all-in-one example
|
|
50
|
+
jacpack_path = os.path.join(temp_dir, "all-in-one.jacpack")
|
|
51
|
+
pack_result = run(
|
|
52
|
+
[*jac_cmd, "jacpack", "pack", all_in_one_path, "-o", jacpack_path],
|
|
53
|
+
capture_output=True,
|
|
52
54
|
text=True,
|
|
53
55
|
env=env,
|
|
54
56
|
)
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
pytest.fail(f"jac create --use client failed: {stderr}")
|
|
58
|
-
|
|
59
|
-
project_path = os.path.join(temp_dir, app_name)
|
|
57
|
+
if pack_result.returncode != 0:
|
|
58
|
+
pytest.fail(f"jac jacpack pack failed: {pack_result.stderr}")
|
|
60
59
|
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
src = os.path.join(all_in_one_path, entry)
|
|
65
|
-
dst = os.path.join(project_path, entry)
|
|
66
|
-
if os.path.isdir(src):
|
|
67
|
-
shutil.copytree(src, dst, dirs_exist_ok=True)
|
|
68
|
-
else:
|
|
69
|
-
shutil.copy2(src, dst)
|
|
70
|
-
|
|
71
|
-
jac_add_result = run(
|
|
72
|
-
[*jac_cmd, "add", "--npm"],
|
|
73
|
-
cwd=project_path,
|
|
60
|
+
# Create project from jacpack file
|
|
61
|
+
create_result = run(
|
|
62
|
+
[*jac_cmd, "create", app_name, "--use", jacpack_path],
|
|
74
63
|
capture_output=True,
|
|
75
64
|
text=True,
|
|
76
65
|
env=env,
|
|
77
66
|
)
|
|
78
|
-
if
|
|
79
|
-
pytest.fail(f"jac
|
|
67
|
+
if create_result.returncode != 0:
|
|
68
|
+
pytest.fail(f"jac create --use jacpack failed: {create_result.stderr}")
|
|
69
|
+
|
|
70
|
+
project_path = os.path.join(temp_dir, app_name)
|
|
80
71
|
|
|
81
72
|
server_port = get_free_port()
|
|
82
73
|
server = Popen(
|
|
83
|
-
[*jac_cmd, "start", "
|
|
74
|
+
[*jac_cmd, "start", "-p", str(server_port)],
|
|
84
75
|
cwd=project_path,
|
|
85
76
|
env=env,
|
|
86
77
|
)
|
|
@@ -144,14 +135,14 @@ class TestAuthenticationE2E:
|
|
|
144
135
|
|
|
145
136
|
def _signup(self, page: Page, base_url: str, username: str, password: str) -> None:
|
|
146
137
|
"""Navigate to signup, fill form, and submit."""
|
|
147
|
-
page.goto(f"{base_url}
|
|
138
|
+
page.goto(f"{base_url}/signup", wait_until="networkidle", timeout=60000)
|
|
148
139
|
page.wait_for_selector('input[type="text"]', timeout=30000)
|
|
149
140
|
self._fill_auth_form(page, username, password)
|
|
150
141
|
self._submit_form(page)
|
|
151
142
|
|
|
152
143
|
def _login(self, page: Page, base_url: str, username: str, password: str) -> None:
|
|
153
144
|
"""Navigate to login, fill form, and submit."""
|
|
154
|
-
page.goto(f"{base_url}
|
|
145
|
+
page.goto(f"{base_url}/login", wait_until="networkidle", timeout=30000)
|
|
155
146
|
page.wait_for_selector('input[type="text"]', timeout=30000)
|
|
156
147
|
self._fill_auth_form(page, username, password)
|
|
157
148
|
self._submit_form(page)
|
|
@@ -166,10 +157,10 @@ class TestAuthenticationE2E:
|
|
|
166
157
|
def test_navigate_without_auth(self, running_server: dict, page: Page) -> None:
|
|
167
158
|
"""Visiting protected route without auth should redirect to login."""
|
|
168
159
|
page.goto(
|
|
169
|
-
f"{running_server['url']}
|
|
160
|
+
f"{running_server['url']}/nested", wait_until="networkidle", timeout=60000
|
|
170
161
|
)
|
|
171
162
|
page.wait_for_timeout(2000)
|
|
172
|
-
assert "
|
|
163
|
+
assert "/login" in page.url.lower()
|
|
173
164
|
|
|
174
165
|
def test_signup_form_submission(self, running_server: dict, page: Page) -> None:
|
|
175
166
|
"""Signup via UI should redirect away from signup page on success."""
|
|
@@ -179,7 +170,7 @@ class TestAuthenticationE2E:
|
|
|
179
170
|
f"e2e_signup_{int(time.time())}",
|
|
180
171
|
"test_pass_123",
|
|
181
172
|
)
|
|
182
|
-
assert "
|
|
173
|
+
assert "/signup" not in page.url.lower()
|
|
183
174
|
|
|
184
175
|
def test_login_with_valid_credentials(
|
|
185
176
|
self, running_server: dict, page: Page
|
|
@@ -192,7 +183,7 @@ class TestAuthenticationE2E:
|
|
|
192
183
|
self._logout(page)
|
|
193
184
|
self._login(page, base_url, username, password)
|
|
194
185
|
|
|
195
|
-
assert "
|
|
186
|
+
assert "/login" not in page.url.lower() and "/signup" not in page.url.lower()
|
|
196
187
|
|
|
197
188
|
def test_login_with_invalid_credentials(
|
|
198
189
|
self, running_server: dict, page: Page
|
|
@@ -200,7 +191,7 @@ class TestAuthenticationE2E:
|
|
|
200
191
|
"""Verify login fails for invalid credentials (stays or shows error)."""
|
|
201
192
|
self._login(page, running_server["url"], "nonexistent_999", "wrong_pass")
|
|
202
193
|
|
|
203
|
-
assert "
|
|
194
|
+
assert "/login" in page.url.lower()
|
|
204
195
|
assert page.locator("text=/Invalid credentials/i").first.is_visible()
|
|
205
196
|
|
|
206
197
|
def test_logout_functionality(self, running_server: dict, page: Page) -> None:
|
|
@@ -214,7 +205,7 @@ class TestAuthenticationE2E:
|
|
|
214
205
|
logout_btn.click()
|
|
215
206
|
page.wait_for_timeout(1500)
|
|
216
207
|
|
|
217
|
-
assert "
|
|
208
|
+
assert "/login" in page.url.lower() and not logout_btn.is_visible(timeout=5000)
|
|
218
209
|
|
|
219
210
|
def test_complete_auth_flow(self, running_server: dict, page: Page) -> None:
|
|
220
211
|
"""Integration: signup -> logout -> login -> access protected route."""
|
|
@@ -222,11 +213,11 @@ class TestAuthenticationE2E:
|
|
|
222
213
|
username, password = f"e2e_complete_{int(time.time())}", "complete_pass_123"
|
|
223
214
|
|
|
224
215
|
self._signup(page, base_url, username, password)
|
|
225
|
-
assert "
|
|
216
|
+
assert "/signup" not in page.url.lower()
|
|
226
217
|
|
|
227
218
|
self._logout(page)
|
|
228
219
|
self._login(page, base_url, username, password)
|
|
229
|
-
assert "
|
|
220
|
+
assert "/login" not in page.url.lower()
|
|
230
221
|
|
|
231
|
-
page.goto(f"{base_url}
|
|
232
|
-
assert "
|
|
222
|
+
page.goto(f"{base_url}/nested", wait_until="networkidle", timeout=30000)
|
|
223
|
+
assert "/nested" in page.url.lower()
|
jac_client/tests/test_it.py
CHANGED
|
@@ -247,29 +247,28 @@ def test_all_in_one_app_endpoints() -> None:
|
|
|
247
247
|
print(f"[DEBUG] Error while requesting /cl/app endpoint: {exc}")
|
|
248
248
|
pytest.fail(f"Failed to GET /cl/app endpoint: {exc}")
|
|
249
249
|
|
|
250
|
-
# "/
|
|
251
|
-
# (hash fragment is client-side only but server should still serve the app shell)
|
|
250
|
+
# "/nested" – SPA catch-all serves app shell for client-side routing
|
|
252
251
|
try:
|
|
253
|
-
print(
|
|
252
|
+
print(
|
|
253
|
+
"[DEBUG] Sending GET request to /nested endpoint (SPA catch-all)"
|
|
254
|
+
)
|
|
254
255
|
with urlopen(
|
|
255
|
-
f"http://127.0.0.1:{server_port}/
|
|
256
|
+
f"http://127.0.0.1:{server_port}/nested",
|
|
256
257
|
timeout=200,
|
|
257
258
|
) as resp_nested:
|
|
258
259
|
nested_body = resp_nested.read().decode(
|
|
259
260
|
"utf-8", errors="ignore"
|
|
260
261
|
)
|
|
261
262
|
print(
|
|
262
|
-
"[DEBUG] Received response from /
|
|
263
|
+
"[DEBUG] Received response from /nested endpoint\n"
|
|
263
264
|
f"Status: {resp_nested.status}\n"
|
|
264
265
|
f"Body (truncated to 500 chars):\n{nested_body[:500]}"
|
|
265
266
|
)
|
|
266
267
|
assert resp_nested.status == 200
|
|
267
268
|
assert "<html" in nested_body.lower()
|
|
268
269
|
except (URLError, HTTPError) as exc:
|
|
269
|
-
print(
|
|
270
|
-
|
|
271
|
-
)
|
|
272
|
-
pytest.fail("Failed to GET /cl/app#/nested endpoint")
|
|
270
|
+
print(f"[DEBUG] Error while requesting /nested endpoint: {exc}")
|
|
271
|
+
pytest.fail("Failed to GET /nested endpoint (SPA catch-all)")
|
|
273
272
|
|
|
274
273
|
# Note: CSS serving is tested separately in test_css_with_image
|
|
275
274
|
# The CSS is bundled into client.js so no separate /static/styles.css endpoint
|
|
@@ -521,10 +520,10 @@ def test_all_in_one_app_endpoints() -> None:
|
|
|
521
520
|
print(f"[DEBUG] Error verifying TypeScript component: {exc}")
|
|
522
521
|
pytest.fail("Failed to verify TypeScript component integration")
|
|
523
522
|
|
|
524
|
-
# Verify nested folder imports are working - /
|
|
523
|
+
# Verify nested folder imports are working - /nested route (SPA catch-all)
|
|
525
524
|
# This route uses nested folder imports (components.button and button)
|
|
526
525
|
try:
|
|
527
|
-
print("[DEBUG] Verifying nested folder imports via /
|
|
526
|
+
print("[DEBUG] Verifying nested folder imports via /nested")
|
|
528
527
|
# The nested route should load successfully (already tested above)
|
|
529
528
|
# Nested imports are compiled and included in the bundle
|
|
530
529
|
assert "<html" in nested_body.lower(), (
|
|
@@ -778,3 +777,202 @@ def test_default_client_app_renders() -> None:
|
|
|
778
777
|
print(f"[DEBUG] Restoring working directory to {original_cwd}")
|
|
779
778
|
os.chdir(original_cwd)
|
|
780
779
|
gc.collect()
|
|
780
|
+
|
|
781
|
+
|
|
782
|
+
def test_configurable_api_base_url_in_bundle() -> None:
|
|
783
|
+
"""Test that [plugins.client.api] base_url is baked into the served JS bundle.
|
|
784
|
+
|
|
785
|
+
End-to-end verification of the configurable API base URL feature:
|
|
786
|
+
1. Creates a client app using the all-in-one example (which uses walkers/auth)
|
|
787
|
+
2. Injects [plugins.client.api] base_url into jac.toml
|
|
788
|
+
3. Starts the server and waits for the bundle to build
|
|
789
|
+
4. Fetches the served JS bundle
|
|
790
|
+
5. Asserts the configured URL appears in the bundled JavaScript
|
|
791
|
+
"""
|
|
792
|
+
import re
|
|
793
|
+
import tomllib
|
|
794
|
+
|
|
795
|
+
print("[DEBUG] Starting test_configurable_api_base_url_in_bundle")
|
|
796
|
+
|
|
797
|
+
# Resolve the all-in-one example (uses walkers/auth so base URL won't be tree-shaken)
|
|
798
|
+
tests_dir = os.path.dirname(__file__)
|
|
799
|
+
jac_client_root = os.path.dirname(tests_dir)
|
|
800
|
+
all_in_one_path = os.path.join(jac_client_root, "examples", "all-in-one")
|
|
801
|
+
|
|
802
|
+
print(f"[DEBUG] Resolved all-in-one source path: {all_in_one_path}")
|
|
803
|
+
assert os.path.isdir(all_in_one_path), "all-in-one example directory missing"
|
|
804
|
+
|
|
805
|
+
app_name = "e2e-api-base-url"
|
|
806
|
+
configured_base_url = "http://my-custom-backend:9000"
|
|
807
|
+
|
|
808
|
+
with tempfile.TemporaryDirectory() as temp_dir:
|
|
809
|
+
print(f"[DEBUG] Created temporary directory at {temp_dir}")
|
|
810
|
+
original_cwd = os.getcwd()
|
|
811
|
+
try:
|
|
812
|
+
os.chdir(temp_dir)
|
|
813
|
+
|
|
814
|
+
# 1. Create a client app and copy all-in-one into it
|
|
815
|
+
jac_cmd = get_jac_command()
|
|
816
|
+
env = get_env_with_npm()
|
|
817
|
+
print(f"[DEBUG] Running 'jac create --use client {app_name}'")
|
|
818
|
+
process = Popen(
|
|
819
|
+
[*jac_cmd, "create", "--use", "client", app_name],
|
|
820
|
+
stdin=PIPE,
|
|
821
|
+
stdout=PIPE,
|
|
822
|
+
stderr=PIPE,
|
|
823
|
+
text=True,
|
|
824
|
+
env=env,
|
|
825
|
+
)
|
|
826
|
+
stdout, stderr = process.communicate()
|
|
827
|
+
returncode = process.returncode
|
|
828
|
+
|
|
829
|
+
print(
|
|
830
|
+
f"[DEBUG] 'jac create --use client' completed returncode={returncode}\n"
|
|
831
|
+
f"STDOUT:\n{stdout}\n"
|
|
832
|
+
f"STDERR:\n{stderr}\n"
|
|
833
|
+
)
|
|
834
|
+
|
|
835
|
+
if returncode != 0 and "unrecognized arguments: --use" in stderr:
|
|
836
|
+
pytest.fail(
|
|
837
|
+
"Test failed: installed `jac` CLI does not support `create --use client`."
|
|
838
|
+
)
|
|
839
|
+
|
|
840
|
+
assert returncode == 0, (
|
|
841
|
+
f"jac create --use client failed\nSTDOUT:\n{stdout}\nSTDERR:\n{stderr}\n"
|
|
842
|
+
)
|
|
843
|
+
|
|
844
|
+
project_path = os.path.join(temp_dir, app_name)
|
|
845
|
+
assert os.path.isdir(project_path)
|
|
846
|
+
|
|
847
|
+
# Copy all-in-one contents (which uses walkers, auth, etc.)
|
|
848
|
+
print("[DEBUG] Copying @all-in-one contents into created Jac app")
|
|
849
|
+
for entry in os.listdir(all_in_one_path):
|
|
850
|
+
src = os.path.join(all_in_one_path, entry)
|
|
851
|
+
dst = os.path.join(project_path, entry)
|
|
852
|
+
if entry in {"node_modules", "build", "dist", ".pytest_cache"}:
|
|
853
|
+
continue
|
|
854
|
+
if os.path.isdir(src):
|
|
855
|
+
shutil.copytree(src, dst, dirs_exist_ok=True)
|
|
856
|
+
else:
|
|
857
|
+
shutil.copy2(src, dst)
|
|
858
|
+
|
|
859
|
+
# 2. Inject [plugins.client.api] base_url into jac.toml
|
|
860
|
+
jac_toml_path = os.path.join(project_path, "jac.toml")
|
|
861
|
+
assert os.path.isfile(jac_toml_path), "jac.toml should exist"
|
|
862
|
+
|
|
863
|
+
with open(jac_toml_path, "rb") as f:
|
|
864
|
+
original_config = tomllib.load(f)
|
|
865
|
+
print(f"[DEBUG] Original jac.toml keys: {list(original_config.keys())}")
|
|
866
|
+
|
|
867
|
+
# Append api config (the all-in-one jac.toml may already have [plugins.client])
|
|
868
|
+
with open(jac_toml_path, "a") as f:
|
|
869
|
+
f.write(f'\n[plugins.client.api]\nbase_url = "{configured_base_url}"\n')
|
|
870
|
+
|
|
871
|
+
with open(jac_toml_path, "rb") as f:
|
|
872
|
+
updated_config = tomllib.load(f)
|
|
873
|
+
api_base = (
|
|
874
|
+
updated_config.get("plugins", {})
|
|
875
|
+
.get("client", {})
|
|
876
|
+
.get("api", {})
|
|
877
|
+
.get("base_url", "")
|
|
878
|
+
)
|
|
879
|
+
print(f"[DEBUG] Verified jac.toml base_url = {api_base!r}")
|
|
880
|
+
assert api_base == configured_base_url
|
|
881
|
+
|
|
882
|
+
# 3. Install packages
|
|
883
|
+
print("[DEBUG] Running 'jac add --npm' to install packages")
|
|
884
|
+
jac_add_result = run(
|
|
885
|
+
[*jac_cmd, "add", "--npm"],
|
|
886
|
+
cwd=project_path,
|
|
887
|
+
capture_output=True,
|
|
888
|
+
text=True,
|
|
889
|
+
env=env,
|
|
890
|
+
)
|
|
891
|
+
print(
|
|
892
|
+
f"[DEBUG] 'jac add --npm' returncode={jac_add_result.returncode}\n"
|
|
893
|
+
f"STDOUT (truncated):\n{jac_add_result.stdout[:1000]}\n"
|
|
894
|
+
f"STDERR (truncated):\n{jac_add_result.stderr[:1000]}\n"
|
|
895
|
+
)
|
|
896
|
+
if jac_add_result.returncode != 0:
|
|
897
|
+
pytest.fail(
|
|
898
|
+
f"jac add --npm failed\n"
|
|
899
|
+
f"STDOUT:\n{jac_add_result.stdout}\n"
|
|
900
|
+
f"STDERR:\n{jac_add_result.stderr}\n"
|
|
901
|
+
)
|
|
902
|
+
|
|
903
|
+
# 4. Start the server
|
|
904
|
+
server: Popen[bytes] | None = None
|
|
905
|
+
server_port = get_free_port()
|
|
906
|
+
try:
|
|
907
|
+
print(
|
|
908
|
+
f"[DEBUG] Starting server with 'jac start main.jac -p {server_port}'"
|
|
909
|
+
)
|
|
910
|
+
server = Popen(
|
|
911
|
+
[*jac_cmd, "start", "main.jac", "-p", str(server_port)],
|
|
912
|
+
cwd=project_path,
|
|
913
|
+
env=env,
|
|
914
|
+
)
|
|
915
|
+
|
|
916
|
+
print(f"[DEBUG] Waiting for server on 127.0.0.1:{server_port}")
|
|
917
|
+
wait_for_port("127.0.0.1", server_port, timeout=90.0)
|
|
918
|
+
print(
|
|
919
|
+
f"[DEBUG] Server is accepting connections on 127.0.0.1:{server_port}"
|
|
920
|
+
)
|
|
921
|
+
|
|
922
|
+
# 5. Fetch root HTML to find the JS bundle path
|
|
923
|
+
try:
|
|
924
|
+
root_bytes = _wait_for_endpoint(
|
|
925
|
+
f"http://127.0.0.1:{server_port}",
|
|
926
|
+
timeout=120.0,
|
|
927
|
+
poll_interval=2.0,
|
|
928
|
+
request_timeout=30.0,
|
|
929
|
+
)
|
|
930
|
+
root_body = root_bytes.decode("utf-8", errors="ignore")
|
|
931
|
+
print(f"[DEBUG] Root response (truncated):\n{root_body[:500]}")
|
|
932
|
+
assert "<html" in root_body.lower(), "Root should return HTML"
|
|
933
|
+
except (URLError, HTTPError, TimeoutError) as exc:
|
|
934
|
+
pytest.fail(f"Failed to GET root endpoint: {exc}")
|
|
935
|
+
|
|
936
|
+
# 6. Extract JS bundle path and fetch it
|
|
937
|
+
# URL format is /static/client.js?hash=... or /static/client.HASH.js
|
|
938
|
+
script_match = re.search(r'src="(/static/client[^"]+)"', root_body)
|
|
939
|
+
assert script_match, (
|
|
940
|
+
f"Could not find client JS bundle path in HTML:\n{root_body[:1000]}"
|
|
941
|
+
)
|
|
942
|
+
|
|
943
|
+
js_path = script_match.group(1)
|
|
944
|
+
js_url = f"http://127.0.0.1:{server_port}{js_path}"
|
|
945
|
+
print(f"[DEBUG] Fetching JS bundle from {js_url}")
|
|
946
|
+
|
|
947
|
+
with urlopen(js_url, timeout=30) as resp:
|
|
948
|
+
js_body = resp.read().decode("utf-8", errors="ignore")
|
|
949
|
+
assert resp.status == 200, "JS bundle should return 200"
|
|
950
|
+
assert len(js_body) > 0, "JS bundle should not be empty"
|
|
951
|
+
print(f"[DEBUG] JS bundle fetched ({len(js_body)} bytes)")
|
|
952
|
+
|
|
953
|
+
# 7. Assert the configured base URL is baked into the bundle
|
|
954
|
+
assert configured_base_url in js_body, (
|
|
955
|
+
f"Expected configured base_url '{configured_base_url}' to appear "
|
|
956
|
+
f"in the bundled JavaScript, but it was not found.\n"
|
|
957
|
+
f"Bundle size: {len(js_body)} bytes"
|
|
958
|
+
)
|
|
959
|
+
print(f"[DEBUG] Confirmed '{configured_base_url}' found in JS bundle")
|
|
960
|
+
|
|
961
|
+
finally:
|
|
962
|
+
if server is not None:
|
|
963
|
+
print("[DEBUG] Terminating server process")
|
|
964
|
+
server.terminate()
|
|
965
|
+
try:
|
|
966
|
+
server.wait(timeout=15)
|
|
967
|
+
print("[DEBUG] Server terminated cleanly")
|
|
968
|
+
except Exception:
|
|
969
|
+
print("[DEBUG] Server did not terminate cleanly, killing")
|
|
970
|
+
server.kill()
|
|
971
|
+
server.wait(timeout=5)
|
|
972
|
+
time.sleep(1)
|
|
973
|
+
gc.collect()
|
|
974
|
+
|
|
975
|
+
finally:
|
|
976
|
+
print(f"[DEBUG] Restoring working directory to {original_cwd}")
|
|
977
|
+
os.chdir(original_cwd)
|
|
978
|
+
gc.collect()
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: jac-client
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.14
|
|
4
4
|
Summary: Build full-stack web applications with Jac - one language for frontend and backend.
|
|
5
5
|
Author-email: Jason Mars <jason@mars.ninja>
|
|
6
6
|
Maintainer-email: Jason Mars <jason@mars.ninja>
|
|
@@ -11,7 +11,7 @@ Project-URL: Documentation, https://jac-lang.org
|
|
|
11
11
|
Keywords: jac,jaclang,jaseci,frontend,full-stack,web-development
|
|
12
12
|
Requires-Python: >=3.12
|
|
13
13
|
Description-Content-Type: text/markdown
|
|
14
|
-
Requires-Dist: jaclang>=0.9.
|
|
14
|
+
Requires-Dist: jaclang>=0.9.14
|
|
15
15
|
Provides-Extra: dev
|
|
16
16
|
Requires-Dist: python-dotenv==1.0.1; extra == "dev"
|
|
17
17
|
Requires-Dist: pytest==8.3.5; extra == "dev"
|
|
@@ -1,29 +1,31 @@
|
|
|
1
1
|
jac_client/examples/all-in-one/button.jac,sha256=KzMM8B8kjPMZmNXImmi8QwNSKhNLBP38kLmX_NQyz20,142
|
|
2
|
-
jac_client/examples/all-in-one/main.jac,sha256=
|
|
2
|
+
jac_client/examples/all-in-one/main.jac,sha256=FlpzztN1J7dOMdBvwBZuPlvnDTuzrrZFg584wVAp7t8,3853
|
|
3
3
|
jac_client/examples/all-in-one/assets/workers/worker.py,sha256=erXICb1WvDKYlReUIzgZf9v0Pey6pmWDbvAm9vtGQmg,131
|
|
4
4
|
jac_client/examples/all-in-one/components/CategoryFilter.jac,sha256=YQh1OqqZf89lZxKOKum-fK8ep5h8itNcQC0rbaAlMl4,1838
|
|
5
|
-
jac_client/examples/all-in-one/components/Header.jac,sha256=
|
|
6
|
-
jac_client/examples/all-in-one/components/ProfitOverview.jac,sha256=
|
|
7
|
-
jac_client/examples/all-in-one/components/Summary.jac,sha256=
|
|
5
|
+
jac_client/examples/all-in-one/components/Header.jac,sha256=TCgz6XBEB9rAkzFSurTOIiFB3NV_I2nmuS7Zdy2PXV8,510
|
|
6
|
+
jac_client/examples/all-in-one/components/ProfitOverview.jac,sha256=MItkmvvaXi8-fcCUen1Pz0tFYwOjmL4_yGamBYeVD14,2539
|
|
7
|
+
jac_client/examples/all-in-one/components/Summary.jac,sha256=C0cxF-aXnp6PEFveik4Oqmv7Jrv20YCqfZ7Cv7vv44c,3022
|
|
8
8
|
jac_client/examples/all-in-one/components/TransactionForm.jac,sha256=g7tbmUSX5gw2hobhTvMhCAshC4YbIyJ6yTs937iuPsc,7553
|
|
9
9
|
jac_client/examples/all-in-one/components/TransactionItem.jac,sha256=OJmdWgYTOa8SsBIfUEEdUWkFRWQT_Cfczdm8O8f-vDY,2133
|
|
10
|
-
jac_client/examples/all-in-one/components/TransactionList.jac,sha256=
|
|
10
|
+
jac_client/examples/all-in-one/components/TransactionList.jac,sha256=__H-RDBtyYDrMDVMT8dxgQYsRb43IsiKqQhg-pcTnsM,1574
|
|
11
11
|
jac_client/examples/all-in-one/components/button.jac,sha256=uev3QkRyZSe1iBIc0RC-8evbMrStAbTJHP0_4h4R1Mg,140
|
|
12
|
-
jac_client/examples/all-in-one/components/navigation.jac,sha256=
|
|
12
|
+
jac_client/examples/all-in-one/components/navigation.jac,sha256=k9dwIGLiNWA5Scep9dFPIKfIYfyO7gu3t8A1fbd-v24,4027
|
|
13
13
|
jac_client/examples/all-in-one/constants/categories.jac,sha256=5HrX2JN4OhcQpoJg6ylcE1lzuWaSIaJAn8Ebo9DeYzo,1092
|
|
14
14
|
jac_client/examples/all-in-one/constants/clients.jac,sha256=8M4AhooSTsxEeC2QTn6UwrNHkLitXUWczCaOwQxrbtw,316
|
|
15
|
-
jac_client/examples/all-in-one/context/BudgetContext.jac,sha256=
|
|
15
|
+
jac_client/examples/all-in-one/context/BudgetContext.jac,sha256=pva1ZSKD4EPbZXICld-g771NMu4-dLjqZnsnVMlBqD4,897
|
|
16
16
|
jac_client/examples/all-in-one/hooks/useBudget.jac,sha256=TmidLwmJUhX_mqD0gKSAXfikwkCKXOfhm9P96LpHbqM,4026
|
|
17
17
|
jac_client/examples/all-in-one/hooks/useLocalStorage.jac,sha256=3DElBqJvpQhbZNyAfScuZGOXhZM73YPqqF5NzPrvNWo,1196
|
|
18
|
-
jac_client/examples/all-in-one/pages/
|
|
19
|
-
jac_client/examples/all-in-one/pages/
|
|
20
|
-
jac_client/examples/all-in-one/pages/
|
|
21
|
-
jac_client/examples/all-in-one/pages/
|
|
22
|
-
jac_client/examples/all-in-one/pages/features_test_ui.cl.jac,sha256=
|
|
23
|
-
jac_client/examples/all-in-one/pages/
|
|
24
|
-
jac_client/examples/all-in-one/pages/
|
|
25
|
-
jac_client/examples/all-in-one/pages/
|
|
26
|
-
jac_client/examples/all-in-one/pages/
|
|
18
|
+
jac_client/examples/all-in-one/pages/[...notFound].jac,sha256=7Em5HP2UVCUncwjKDXDTIGjEV10wmoQGWaLdzietsf0,510
|
|
19
|
+
jac_client/examples/all-in-one/pages/budget.jac,sha256=e1f7zehStW4RYpQue5pCQ0Ltn1_3kdhcVBL50gVJ-Sk,289
|
|
20
|
+
jac_client/examples/all-in-one/pages/budget_planner_ui.cl.jac,sha256=kgi4LyUkJmvSO14TuRKDIejzg0nq84isUBPEzVR_D1g,2257
|
|
21
|
+
jac_client/examples/all-in-one/pages/features.jac,sha256=pthjFEgI-vgA4SfvKlExgOYRfAiDMc_4ZYrge3Wm7L0,163
|
|
22
|
+
jac_client/examples/all-in-one/pages/features_test_ui.cl.jac,sha256=DlPS5vvcvffA2GvjU-KBRJQk8i03l1rDzQbTEr0V3vQ,26144
|
|
23
|
+
jac_client/examples/all-in-one/pages/landing.jac,sha256=jxnH_keYDrSVTDUBjo14cOst8-8Ty120DQnTDYrlR14,5259
|
|
24
|
+
jac_client/examples/all-in-one/pages/layout.jac,sha256=z6OAulH9O1cnBNJUrJrs3n0U390QIJHhQlVDpnNx0tA,510
|
|
25
|
+
jac_client/examples/all-in-one/pages/(auth)/index.jac,sha256=eUMqTonmLKOtXLWmp71lcgWhi3aZ9zUsvBRetBU6d8w,11132
|
|
26
|
+
jac_client/examples/all-in-one/pages/(auth)/nested.jac,sha256=0DYTalcZ71T2inB3LhVPVvMnJ08oIK4Sj_dBivwheg8,1405
|
|
27
|
+
jac_client/examples/all-in-one/pages/(public)/login.jac,sha256=YIyXhBu-TgrDMits6JJMXsTl1PExb-zAOdiOC11v4Dc,4501
|
|
28
|
+
jac_client/examples/all-in-one/pages/(public)/signup.jac,sha256=s155Arbc0iLVyIQukflGn_rjUy96RtBuKcGzu8qod8Q,4549
|
|
27
29
|
jac_client/examples/all-in-one/utils/formatters.jac,sha256=QfOdGgFf2PWcg6ALbHKk5bAO0P4zqBLoM_2nJltCXGY,1544
|
|
28
30
|
jac_client/examples/asset-serving/css-with-image/main.jac,sha256=eSYYyyY7S5BcioeVtEoGKTOAINAck2oycOEKD3kq_3E,3140
|
|
29
31
|
jac_client/examples/asset-serving/image-asset/main.jac,sha256=r4FgBiO_Tg4MRxvXVbbpmrY8x_tqr9YUtYcPgNJmQI4,1764
|
|
@@ -42,61 +44,64 @@ jac_client/examples/full-stack-with-auth/main.jac,sha256=16n-w20Uf3R2RsD5WLPxjKP
|
|
|
42
44
|
jac_client/examples/little-x/main.jac,sha256=XQiFsuzMYPIr3nky0pDtesylDzMjoA7gokVLI1eDZEA,19704
|
|
43
45
|
jac_client/examples/little-x/src/submit-button.jac,sha256=2FUBiTkZwvZpPQA1YFcjtso4bpvLniit35vliT5rrXY,430
|
|
44
46
|
jac_client/examples/nested-folders/nested-advance/main.jac,sha256=EvkJeEkCX2lGTSC_VlD6I7He5IwZe4aoyCa6opb5P_M,775
|
|
45
|
-
jac_client/examples/nested-folders/nested-advance/src/ButtonRoot.jac,sha256=
|
|
46
|
-
jac_client/examples/nested-folders/nested-advance/src/level1/ButtonSecondL.jac,sha256=
|
|
47
|
+
jac_client/examples/nested-folders/nested-advance/src/ButtonRoot.jac,sha256=OljvOh5mXxeYtv8cw2E2EzYp78DIEgyVKdLpmKi4vEI,197
|
|
48
|
+
jac_client/examples/nested-folders/nested-advance/src/level1/ButtonSecondL.jac,sha256=5o9czFZ245wKLN_ts0RavF_np1K3LwbYaJ6qOqQ59pE,414
|
|
47
49
|
jac_client/examples/nested-folders/nested-advance/src/level1/Card.jac,sha256=GWsVPHPpF5gxlkhB4rSPOxaLRT-usEjs0ELoHVvKL9g,1076
|
|
48
|
-
jac_client/examples/nested-folders/nested-advance/src/level1/level2/ButtonThirdL.jac,sha256=
|
|
50
|
+
jac_client/examples/nested-folders/nested-advance/src/level1/level2/ButtonThirdL.jac,sha256=bAnL52jkE87U7zxGTrYhpn3JhWett2FBI_4iPoelNc8,583
|
|
49
51
|
jac_client/examples/nested-folders/nested-basic/main.jac,sha256=fV3UymEAORR_1RsU5z2JeNZ4yFr7B9MmlolQ2MhpIgw,298
|
|
50
52
|
jac_client/examples/nested-folders/nested-basic/src/button.jac,sha256=BUaKr2Pm6RsgQCRVTZXojMfY8HoIB4S3YiItEpjoxCs,139
|
|
51
53
|
jac_client/examples/nested-folders/nested-basic/src/components/button.jac,sha256=mvAbsu5Q6DQY4Jfo375k3dBm0rMmKAk6E-o3m5-YmNc,135
|
|
52
54
|
jac_client/examples/ts-support/main.jac,sha256=KcNOi0fZj7tBhWJvusbZ_q3z0cHjlYYfDd_0Mjf6E-k,983
|
|
53
55
|
jac_client/examples/with-router/main.jac,sha256=Aanl3a880KQ-ki8SfskRu8QJRvvm-_pQIvxcfOHB52k,8460
|
|
54
|
-
jac_client/plugin/cli.jac,sha256=
|
|
56
|
+
jac_client/plugin/cli.jac,sha256=54qGU_7WOKIlE9ltY-0V33Yfu1LkBFs4SSJwCsgQstg,20161
|
|
55
57
|
jac_client/plugin/client.jac,sha256=WVn8IwQO2Kgr8XLDI8D4FSVj9kdewBXB3Mgi9ifCVTI,2095
|
|
56
|
-
jac_client/plugin/client_runtime.cl.jac,sha256=
|
|
57
|
-
jac_client/plugin/plugin_config.jac,sha256=
|
|
58
|
+
jac_client/plugin/client_runtime.cl.jac,sha256=njf4m86QGS1uZNFuHGg1Carj7cumzt2Ex57_fS5HGXs,2109
|
|
59
|
+
jac_client/plugin/plugin_config.jac,sha256=el5h0z2cTfqg0WUhTuyZw0BHJncvUPa2rNXrW2iQ4HM,13185
|
|
58
60
|
jac_client/plugin/vite_client_bundle.jac,sha256=l8EY8O2sdsqhtO8I32Of01dgShRQBfMBNWXyl-y-vtY,1016
|
|
59
61
|
jac_client/plugin/impl/client.impl.jac,sha256=UOmY3Pzi00Cvqdze_BnoIX1QS5_QWEPDQATNp5VDh4k,8956
|
|
60
|
-
jac_client/plugin/impl/client_runtime.impl.jac,sha256
|
|
62
|
+
jac_client/plugin/impl/client_runtime.impl.jac,sha256=_YlTwJd3cd4sqHwkYgn_ujFWEDg4N7TPYpKODj46n1Y,11524
|
|
61
63
|
jac_client/plugin/impl/vite_client_bundle.impl.jac,sha256=KXFqXSZaa08Z6CrEqebfdjo7TvdakTNJHVnGOhj4e0s,2620
|
|
62
64
|
jac_client/plugin/src/__init__.jac,sha256=pdkHciVYLG1UnE-Pez1X4SULUG2ACMYrUYwWq-CZ3Sw,727
|
|
63
65
|
jac_client/plugin/src/asset_processor.jac,sha256=Qpm1a174PPJl32nH_eDZYR-6vx59V2NEWfj0knUMwXY,961
|
|
64
|
-
jac_client/plugin/src/compiler.jac,sha256=
|
|
65
|
-
jac_client/plugin/src/config_loader.jac,sha256
|
|
66
|
+
jac_client/plugin/src/compiler.jac,sha256=cH6rd8DCbHSeHc8iNwRAkBvwDBL3YZTyeC1mJthVJUA,3059
|
|
67
|
+
jac_client/plugin/src/config_loader.jac,sha256=kgVpeiQdEzMs5vgdHyfAR08N55AJjOobJonaotRaJdU,1367
|
|
66
68
|
jac_client/plugin/src/desktop_config.jac,sha256=bFGW5lnLeUZgjbjd1BMHvf38Qbsb8VZ0YcbUf78LZ1Q,1249
|
|
67
69
|
jac_client/plugin/src/import_processor.jac,sha256=wYg8bD5qHxpvFyXkQxNpqUIV3ei5aMoevA2bWyq9VG8,589
|
|
68
70
|
jac_client/plugin/src/jac_to_js.jac,sha256=U2_v95tdsbw1oMPGPY0HOhDcAsHg3uQIcGWzLmFdWyc,1115
|
|
69
71
|
jac_client/plugin/src/package_installer.jac,sha256=5maePqEe3xIys9Ufn54m423tAr54z-urtXc84Ki3bIY,850
|
|
70
|
-
jac_client/plugin/src/
|
|
72
|
+
jac_client/plugin/src/route_scanner.jac,sha256=UtMYbXzR7YF-DMQEGnzdinsZn_cHox22QccqOP1YAiI,1472
|
|
73
|
+
jac_client/plugin/src/vite_bundler.jac,sha256=3Xk6mesoOp76d31qG_xQJfB_a8wI6xydM-rBsSIzdqU,2390
|
|
71
74
|
jac_client/plugin/src/impl/asset_processor.impl.jac,sha256=-ljWYzKLKyAdfJybr8sjJlYSK57KzueeNvTo_WjAFAY,4256
|
|
72
|
-
jac_client/plugin/src/impl/compiler.impl.jac,sha256=
|
|
73
|
-
jac_client/plugin/src/impl/config_loader.impl.jac,sha256=
|
|
75
|
+
jac_client/plugin/src/impl/compiler.impl.jac,sha256=gLd2VeLgHhDIDiRq081DYlRU-3Y2tW43MvFRU5S1wIg,19458
|
|
76
|
+
jac_client/plugin/src/impl/config_loader.impl.jac,sha256=F-blKeVWtuh382cazxrMdmpA8lpDFjVawkZBhKRtMhI,4731
|
|
74
77
|
jac_client/plugin/src/impl/desktop_config.impl.jac,sha256=mitiS3RfHjMstUqPJs2OnB6lFk27GGSrKXCrJK5Sceg,6758
|
|
75
78
|
jac_client/plugin/src/impl/import_processor.impl.jac,sha256=BMkkZXlF-6jbC-r3tuFj8PDFvDZrbfzuhnaw8qraWIQ,1214
|
|
76
79
|
jac_client/plugin/src/impl/jac_to_js.impl.jac,sha256=KHblc0PloMJqsX2DRdp3tyJ0k5d39ArPxBLKXsw7mjA,1692
|
|
77
|
-
jac_client/plugin/src/impl/package_installer.impl.jac,sha256=
|
|
78
|
-
jac_client/plugin/src/impl/
|
|
79
|
-
jac_client/plugin/src/
|
|
80
|
+
jac_client/plugin/src/impl/package_installer.impl.jac,sha256=rnY4uCzLTMMJ1LvCwGEZyyin4eJOeHDFM-aCqFggWjw,4060
|
|
81
|
+
jac_client/plugin/src/impl/route_scanner.impl.jac,sha256=iRKp819wq303Bnawc_9DW37Xyj7YCMlFJ0w51AgwWSs,7088
|
|
82
|
+
jac_client/plugin/src/impl/vite_bundler.impl.jac,sha256=ivmt1Cs-LLsUsCcWKSSdbY2lc4Xa5VXUqWt8hK4ejpU,30888
|
|
83
|
+
jac_client/plugin/src/targets/desktop_target.jac,sha256=dtfVf6ZirIi4ghTON3Touv_0LGcH2-6-IJP1xzTb_ug,1344
|
|
80
84
|
jac_client/plugin/src/targets/register.jac,sha256=tiHmOKEgOWlYdY5DYko6M0Ktp2kZr7TZFWKq18Tmp24,835
|
|
81
85
|
jac_client/plugin/src/targets/registry.jac,sha256=wl1QJEWAyI7KAfTSjIw3PdxpYgtUCpaj7D0c09jZxFM,2664
|
|
82
86
|
jac_client/plugin/src/targets/web_target.jac,sha256=jstJZEHE0YERW_e5LiHeVZurB9WsuPnm5HMWWdQP3f0,1135
|
|
83
|
-
jac_client/plugin/src/targets/desktop/sidecar/main.py,sha256=
|
|
84
|
-
jac_client/plugin/src/targets/impl/desktop_target.impl.jac,sha256=
|
|
87
|
+
jac_client/plugin/src/targets/desktop/sidecar/main.py,sha256=JWHqzUlKmUCBypA6A3U9SLflBWtIogO4HpQhf6YwsD4,5371
|
|
88
|
+
jac_client/plugin/src/targets/impl/desktop_target.impl.jac,sha256=5N1izThX5i81YksYzd_D3oRJZ_sBaIWkjrfbZwG3NXI,91361
|
|
85
89
|
jac_client/plugin/src/targets/impl/registry.impl.jac,sha256=2PUw_cZ9Us6PJRxO9o4aSOwYW_5_VEi6WXbIVS_6fN8,1691
|
|
86
90
|
jac_client/plugin/src/targets/impl/web_target.impl.jac,sha256=fQQ1zahAnvsD4BFr8JrbF52xZxSJL_K3yE0litbJdBg,5110
|
|
87
91
|
jac_client/plugin/utils/__init__.jac,sha256=u_rH9sxR8EgLUsbaNpv0tgYmt5sLlrb41LhPRk0w0g4,166
|
|
88
92
|
jac_client/plugin/utils/bun_installer.jac,sha256=irvOnt2WF6sB_aOH5v6L9Jde-NoP39JDjysXB2V0nv0,473
|
|
89
93
|
jac_client/plugin/utils/client_deps.jac,sha256=BLJ7UaBi2aC-V-Vl4IsfGYfnRI75QtaO1JNYo_ut0UI,569
|
|
90
|
-
jac_client/plugin/utils/impl/bun_installer.impl.jac,sha256=
|
|
91
|
-
jac_client/plugin/utils/impl/client_deps.impl.jac,sha256=
|
|
94
|
+
jac_client/plugin/utils/impl/bun_installer.impl.jac,sha256=AdO65jsrdndbD5ru8xUG_IOQRtSG_N8mnq4Xu7fIPiY,3379
|
|
95
|
+
jac_client/plugin/utils/impl/client_deps.impl.jac,sha256=bcxnv6h8QO6hVdZaoIaTxB4LgaVSp0GwIlQgR_GV4g8,2697
|
|
92
96
|
jac_client/templates/client.jacpack,sha256=o3aVPZTI1T52gvLHv5bGK0czX8cAx0GgWfMjQP5yA3w,4187
|
|
93
|
-
jac_client/templates/fullstack.jacpack,sha256=
|
|
97
|
+
jac_client/templates/fullstack.jacpack,sha256=XjyEO5WJtgWSvZssD680SFrZORDR-Wy9FCRSAHLeoFs,23279
|
|
94
98
|
jac_client/tests/__init__.py,sha256=HSr78dvKyvNmP7bLmAssfYItAn4puFwAe1oWnV8l7pA,36
|
|
95
99
|
jac_client/tests/conftest.py,sha256=PU-eYPagFRXSKeXaGadES3s2LlNjzy5VSsXuUPse8_4,11136
|
|
96
|
-
jac_client/tests/test_cli.py,sha256=
|
|
97
|
-
jac_client/tests/
|
|
100
|
+
jac_client/tests/test_cli.py,sha256=YtpFzdQca264ZIXO9RBfvV6LVBGaeZ2B5iKFsvVMx4E,37995
|
|
101
|
+
jac_client/tests/test_desktop_api_url.py,sha256=x81jMYxSnIFheU2dvDyqqfoKnm3i0LxY5BBY8lObxfU,32513
|
|
102
|
+
jac_client/tests/test_e2e.py,sha256=icRlO6LYBdsS7p7HqaPQj9n6C2TMviggdiv7wmvrmvw,7874
|
|
98
103
|
jac_client/tests/test_helpers.py,sha256=UqXYIl0Vi_8IDJ1efsJh1BcaJPudINfpLojhwDxxtNg,1615
|
|
99
|
-
jac_client/tests/test_it.py,sha256=
|
|
104
|
+
jac_client/tests/test_it.py,sha256=p8840vOmvhzS56BQIiAvpcK6gkavENoI5pxhFwDd5Ns,46381
|
|
100
105
|
jac_client/tests/test_it_desktop.py,sha256=mzaDfFFhmN762FrFH1WEXQh99cq5bS-eZqwmI-ousvM,32143
|
|
101
106
|
jac_client/tests/fixtures/basic-app/app.jac,sha256=sDup4PmtUm93oVOxIz874SSZfMimPv4Qn683iXm43TI,489
|
|
102
107
|
jac_client/tests/fixtures/cl_file/app.cl.jac,sha256=fHJvjKWLhX5uVdZl12mPwcNRgMVFrCz8oY3oMoCWeuM,1157
|
|
@@ -108,8 +113,8 @@ jac_client/tests/fixtures/relative_import/button.jac,sha256=kCDNaHEcxMEFdezfnecy
|
|
|
108
113
|
jac_client/tests/fixtures/spawn_test/app.jac,sha256=cooYrB7xhHMk9xWOZ6MIiY4I6kmodW2v-nyVnd1RR74,3863
|
|
109
114
|
jac_client/tests/fixtures/test_fragments_spread/app.jac,sha256=CMzAz4Ydx_5eAV82-io8sJdy8_xy-mR7YOVc7FcozlU,1277
|
|
110
115
|
jac_client/tests/fixtures/with-ts/app.jac,sha256=1j1IH_4mfgLtgPq2Xc5PrGHBvmLQl6U0ddbb2L5KwuA,981
|
|
111
|
-
jac_client-0.2.
|
|
112
|
-
jac_client-0.2.
|
|
113
|
-
jac_client-0.2.
|
|
114
|
-
jac_client-0.2.
|
|
115
|
-
jac_client-0.2.
|
|
116
|
+
jac_client-0.2.14.dist-info/METADATA,sha256=ypYp-09-em17YgPMvusfREm-870m3IH_UWDzt3nwPfo,5552
|
|
117
|
+
jac_client-0.2.14.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
|
|
118
|
+
jac_client-0.2.14.dist-info/entry_points.txt,sha256=fVrlaJKcSa2DK2hcfR6bNaQDB9mszMpZeEa6pitMdt4,154
|
|
119
|
+
jac_client-0.2.14.dist-info/top_level.txt,sha256=u1VEBfiqwRrZEopKraIh-Ym55qSnDZR3Q5xdw2HinhU,11
|
|
120
|
+
jac_client-0.2.14.dist-info/RECORD,,
|