jac-client 0.2.11__py3-none-any.whl → 0.2.13__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/plugin/cli.jac +3 -3
- jac_client/plugin/client_runtime.cl.jac +3 -2
- jac_client/plugin/impl/client_runtime.impl.jac +17 -6
- jac_client/plugin/src/compiler.jac +4 -0
- jac_client/plugin/src/config_loader.jac +1 -0
- jac_client/plugin/src/impl/compiler.impl.jac +16 -39
- jac_client/plugin/src/impl/config_loader.impl.jac +8 -0
- jac_client/plugin/src/impl/vite_bundler.impl.jac +74 -23
- 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/__init__.jac +1 -0
- jac_client/plugin/utils/client_deps.jac +14 -0
- jac_client/plugin/utils/impl/client_deps.impl.jac +73 -0
- jac_client/templates/client.jacpack +0 -4
- jac_client/templates/fullstack.jacpack +0 -4
- jac_client/tests/test_cli.py +142 -0
- jac_client/tests/test_desktop_api_url.py +854 -0
- jac_client/tests/test_e2e.py +12 -12
- jac_client/tests/test_it.py +209 -11
- {jac_client-0.2.11.dist-info → jac_client-0.2.13.dist-info}/METADATA +2 -2
- {jac_client-0.2.11.dist-info → jac_client-0.2.13.dist-info}/RECORD +26 -23
- {jac_client-0.2.11.dist-info → jac_client-0.2.13.dist-info}/WHEEL +0 -0
- {jac_client-0.2.11.dist-info → jac_client-0.2.13.dist-info}/entry_points.txt +0 -0
- {jac_client-0.2.11.dist-info → jac_client-0.2.13.dist-info}/top_level.txt +0 -0
jac_client/tests/test_e2e.py
CHANGED
|
@@ -144,14 +144,14 @@ class TestAuthenticationE2E:
|
|
|
144
144
|
|
|
145
145
|
def _signup(self, page: Page, base_url: str, username: str, password: str) -> None:
|
|
146
146
|
"""Navigate to signup, fill form, and submit."""
|
|
147
|
-
page.goto(f"{base_url}
|
|
147
|
+
page.goto(f"{base_url}/signup", wait_until="networkidle", timeout=60000)
|
|
148
148
|
page.wait_for_selector('input[type="text"]', timeout=30000)
|
|
149
149
|
self._fill_auth_form(page, username, password)
|
|
150
150
|
self._submit_form(page)
|
|
151
151
|
|
|
152
152
|
def _login(self, page: Page, base_url: str, username: str, password: str) -> None:
|
|
153
153
|
"""Navigate to login, fill form, and submit."""
|
|
154
|
-
page.goto(f"{base_url}
|
|
154
|
+
page.goto(f"{base_url}/login", wait_until="networkidle", timeout=30000)
|
|
155
155
|
page.wait_for_selector('input[type="text"]', timeout=30000)
|
|
156
156
|
self._fill_auth_form(page, username, password)
|
|
157
157
|
self._submit_form(page)
|
|
@@ -166,10 +166,10 @@ class TestAuthenticationE2E:
|
|
|
166
166
|
def test_navigate_without_auth(self, running_server: dict, page: Page) -> None:
|
|
167
167
|
"""Visiting protected route without auth should redirect to login."""
|
|
168
168
|
page.goto(
|
|
169
|
-
f"{running_server['url']}
|
|
169
|
+
f"{running_server['url']}/nested", wait_until="networkidle", timeout=60000
|
|
170
170
|
)
|
|
171
171
|
page.wait_for_timeout(2000)
|
|
172
|
-
assert "
|
|
172
|
+
assert "/login" in page.url.lower()
|
|
173
173
|
|
|
174
174
|
def test_signup_form_submission(self, running_server: dict, page: Page) -> None:
|
|
175
175
|
"""Signup via UI should redirect away from signup page on success."""
|
|
@@ -179,7 +179,7 @@ class TestAuthenticationE2E:
|
|
|
179
179
|
f"e2e_signup_{int(time.time())}",
|
|
180
180
|
"test_pass_123",
|
|
181
181
|
)
|
|
182
|
-
assert "
|
|
182
|
+
assert "/signup" not in page.url.lower()
|
|
183
183
|
|
|
184
184
|
def test_login_with_valid_credentials(
|
|
185
185
|
self, running_server: dict, page: Page
|
|
@@ -192,7 +192,7 @@ class TestAuthenticationE2E:
|
|
|
192
192
|
self._logout(page)
|
|
193
193
|
self._login(page, base_url, username, password)
|
|
194
194
|
|
|
195
|
-
assert "
|
|
195
|
+
assert "/login" not in page.url.lower() and "/signup" not in page.url.lower()
|
|
196
196
|
|
|
197
197
|
def test_login_with_invalid_credentials(
|
|
198
198
|
self, running_server: dict, page: Page
|
|
@@ -200,7 +200,7 @@ class TestAuthenticationE2E:
|
|
|
200
200
|
"""Verify login fails for invalid credentials (stays or shows error)."""
|
|
201
201
|
self._login(page, running_server["url"], "nonexistent_999", "wrong_pass")
|
|
202
202
|
|
|
203
|
-
assert "
|
|
203
|
+
assert "/login" in page.url.lower()
|
|
204
204
|
assert page.locator("text=/Invalid credentials/i").first.is_visible()
|
|
205
205
|
|
|
206
206
|
def test_logout_functionality(self, running_server: dict, page: Page) -> None:
|
|
@@ -214,7 +214,7 @@ class TestAuthenticationE2E:
|
|
|
214
214
|
logout_btn.click()
|
|
215
215
|
page.wait_for_timeout(1500)
|
|
216
216
|
|
|
217
|
-
assert "
|
|
217
|
+
assert "/login" in page.url.lower() and not logout_btn.is_visible(timeout=5000)
|
|
218
218
|
|
|
219
219
|
def test_complete_auth_flow(self, running_server: dict, page: Page) -> None:
|
|
220
220
|
"""Integration: signup -> logout -> login -> access protected route."""
|
|
@@ -222,11 +222,11 @@ class TestAuthenticationE2E:
|
|
|
222
222
|
username, password = f"e2e_complete_{int(time.time())}", "complete_pass_123"
|
|
223
223
|
|
|
224
224
|
self._signup(page, base_url, username, password)
|
|
225
|
-
assert "
|
|
225
|
+
assert "/signup" not in page.url.lower()
|
|
226
226
|
|
|
227
227
|
self._logout(page)
|
|
228
228
|
self._login(page, base_url, username, password)
|
|
229
|
-
assert "
|
|
229
|
+
assert "/login" not in page.url.lower()
|
|
230
230
|
|
|
231
|
-
page.goto(f"{base_url}
|
|
232
|
-
assert "
|
|
231
|
+
page.goto(f"{base_url}/nested", wait_until="networkidle", timeout=30000)
|
|
232
|
+
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.13
|
|
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.13
|
|
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"
|
|
@@ -51,50 +51,53 @@ jac_client/examples/nested-folders/nested-basic/src/button.jac,sha256=BUaKr2Pm6R
|
|
|
51
51
|
jac_client/examples/nested-folders/nested-basic/src/components/button.jac,sha256=mvAbsu5Q6DQY4Jfo375k3dBm0rMmKAk6E-o3m5-YmNc,135
|
|
52
52
|
jac_client/examples/ts-support/main.jac,sha256=KcNOi0fZj7tBhWJvusbZ_q3z0cHjlYYfDd_0Mjf6E-k,983
|
|
53
53
|
jac_client/examples/with-router/main.jac,sha256=Aanl3a880KQ-ki8SfskRu8QJRvvm-_pQIvxcfOHB52k,8460
|
|
54
|
-
jac_client/plugin/cli.jac,sha256=
|
|
54
|
+
jac_client/plugin/cli.jac,sha256=54qGU_7WOKIlE9ltY-0V33Yfu1LkBFs4SSJwCsgQstg,20161
|
|
55
55
|
jac_client/plugin/client.jac,sha256=WVn8IwQO2Kgr8XLDI8D4FSVj9kdewBXB3Mgi9ifCVTI,2095
|
|
56
|
-
jac_client/plugin/client_runtime.cl.jac,sha256=
|
|
56
|
+
jac_client/plugin/client_runtime.cl.jac,sha256=K8u-XwGr998XO2o-dm0OkistqH_odY5GGzcua0VZUW0,2010
|
|
57
57
|
jac_client/plugin/plugin_config.jac,sha256=sijvX5C7-5c2T8VWgbGW6G6IYi1k6AP_bdbagfd9jNc,13308
|
|
58
58
|
jac_client/plugin/vite_client_bundle.jac,sha256=l8EY8O2sdsqhtO8I32Of01dgShRQBfMBNWXyl-y-vtY,1016
|
|
59
59
|
jac_client/plugin/impl/client.impl.jac,sha256=UOmY3Pzi00Cvqdze_BnoIX1QS5_QWEPDQATNp5VDh4k,8956
|
|
60
|
-
jac_client/plugin/impl/client_runtime.impl.jac,sha256
|
|
60
|
+
jac_client/plugin/impl/client_runtime.impl.jac,sha256=FhBo_GrnjVBLmFw2-DFz4UwBiHDmQLbIWAHQ_qHbxww,11181
|
|
61
61
|
jac_client/plugin/impl/vite_client_bundle.impl.jac,sha256=KXFqXSZaa08Z6CrEqebfdjo7TvdakTNJHVnGOhj4e0s,2620
|
|
62
62
|
jac_client/plugin/src/__init__.jac,sha256=pdkHciVYLG1UnE-Pez1X4SULUG2ACMYrUYwWq-CZ3Sw,727
|
|
63
63
|
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
|
|
64
|
+
jac_client/plugin/src/compiler.jac,sha256=vTkxjjFwykhWMvfGF9jY6XC5KHXJ-LjHUc6EsRqSjjs,2441
|
|
65
|
+
jac_client/plugin/src/config_loader.jac,sha256=kgVpeiQdEzMs5vgdHyfAR08N55AJjOobJonaotRaJdU,1367
|
|
66
66
|
jac_client/plugin/src/desktop_config.jac,sha256=bFGW5lnLeUZgjbjd1BMHvf38Qbsb8VZ0YcbUf78LZ1Q,1249
|
|
67
67
|
jac_client/plugin/src/import_processor.jac,sha256=wYg8bD5qHxpvFyXkQxNpqUIV3ei5aMoevA2bWyq9VG8,589
|
|
68
68
|
jac_client/plugin/src/jac_to_js.jac,sha256=U2_v95tdsbw1oMPGPY0HOhDcAsHg3uQIcGWzLmFdWyc,1115
|
|
69
69
|
jac_client/plugin/src/package_installer.jac,sha256=5maePqEe3xIys9Ufn54m423tAr54z-urtXc84Ki3bIY,850
|
|
70
|
-
jac_client/plugin/src/vite_bundler.jac,sha256=
|
|
70
|
+
jac_client/plugin/src/vite_bundler.jac,sha256=3Xk6mesoOp76d31qG_xQJfB_a8wI6xydM-rBsSIzdqU,2390
|
|
71
71
|
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=
|
|
72
|
+
jac_client/plugin/src/impl/compiler.impl.jac,sha256=QPKV5UoBcScC6oSOceFM7Y9gsiID-pw_vkKeJXLs080,12054
|
|
73
|
+
jac_client/plugin/src/impl/config_loader.impl.jac,sha256=F-blKeVWtuh382cazxrMdmpA8lpDFjVawkZBhKRtMhI,4731
|
|
74
74
|
jac_client/plugin/src/impl/desktop_config.impl.jac,sha256=mitiS3RfHjMstUqPJs2OnB6lFk27GGSrKXCrJK5Sceg,6758
|
|
75
75
|
jac_client/plugin/src/impl/import_processor.impl.jac,sha256=BMkkZXlF-6jbC-r3tuFj8PDFvDZrbfzuhnaw8qraWIQ,1214
|
|
76
76
|
jac_client/plugin/src/impl/jac_to_js.impl.jac,sha256=KHblc0PloMJqsX2DRdp3tyJ0k5d39ArPxBLKXsw7mjA,1692
|
|
77
77
|
jac_client/plugin/src/impl/package_installer.impl.jac,sha256=YbXlzqmrzNtNSyfDcVY3-975Pqbc9H9wxQ1LQxO6ypE,4020
|
|
78
|
-
jac_client/plugin/src/impl/vite_bundler.impl.jac,sha256=
|
|
79
|
-
jac_client/plugin/src/targets/desktop_target.jac,sha256=
|
|
78
|
+
jac_client/plugin/src/impl/vite_bundler.impl.jac,sha256=ANywKi6hQWYcFyXbEKovy05gaHCjEtzaf4VXRdUP8D4,30700
|
|
79
|
+
jac_client/plugin/src/targets/desktop_target.jac,sha256=dtfVf6ZirIi4ghTON3Touv_0LGcH2-6-IJP1xzTb_ug,1344
|
|
80
80
|
jac_client/plugin/src/targets/register.jac,sha256=tiHmOKEgOWlYdY5DYko6M0Ktp2kZr7TZFWKq18Tmp24,835
|
|
81
81
|
jac_client/plugin/src/targets/registry.jac,sha256=wl1QJEWAyI7KAfTSjIw3PdxpYgtUCpaj7D0c09jZxFM,2664
|
|
82
82
|
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=
|
|
83
|
+
jac_client/plugin/src/targets/desktop/sidecar/main.py,sha256=JWHqzUlKmUCBypA6A3U9SLflBWtIogO4HpQhf6YwsD4,5371
|
|
84
|
+
jac_client/plugin/src/targets/impl/desktop_target.impl.jac,sha256=5N1izThX5i81YksYzd_D3oRJZ_sBaIWkjrfbZwG3NXI,91361
|
|
85
85
|
jac_client/plugin/src/targets/impl/registry.impl.jac,sha256=2PUw_cZ9Us6PJRxO9o4aSOwYW_5_VEi6WXbIVS_6fN8,1691
|
|
86
86
|
jac_client/plugin/src/targets/impl/web_target.impl.jac,sha256=fQQ1zahAnvsD4BFr8JrbF52xZxSJL_K3yE0litbJdBg,5110
|
|
87
|
-
jac_client/plugin/utils/__init__.jac,sha256=
|
|
87
|
+
jac_client/plugin/utils/__init__.jac,sha256=u_rH9sxR8EgLUsbaNpv0tgYmt5sLlrb41LhPRk0w0g4,166
|
|
88
88
|
jac_client/plugin/utils/bun_installer.jac,sha256=irvOnt2WF6sB_aOH5v6L9Jde-NoP39JDjysXB2V0nv0,473
|
|
89
|
+
jac_client/plugin/utils/client_deps.jac,sha256=BLJ7UaBi2aC-V-Vl4IsfGYfnRI75QtaO1JNYo_ut0UI,569
|
|
89
90
|
jac_client/plugin/utils/impl/bun_installer.impl.jac,sha256=S6yqaxNvQ6HYgSfO7bRu8NiNsYvG8mvK8j4d1_Vf_FM,3483
|
|
90
|
-
jac_client/
|
|
91
|
-
jac_client/templates/
|
|
91
|
+
jac_client/plugin/utils/impl/client_deps.impl.jac,sha256=u2APi7hYTTCzDuiG2wTlsM4Dfi1QPY9FNO6xAIq_gPw,2774
|
|
92
|
+
jac_client/templates/client.jacpack,sha256=o3aVPZTI1T52gvLHv5bGK0czX8cAx0GgWfMjQP5yA3w,4187
|
|
93
|
+
jac_client/templates/fullstack.jacpack,sha256=qS5vlhHjpInxVFkAD8T0FftqWFVW6hAbexl9LufW0eE,23109
|
|
92
94
|
jac_client/tests/__init__.py,sha256=HSr78dvKyvNmP7bLmAssfYItAn4puFwAe1oWnV8l7pA,36
|
|
93
95
|
jac_client/tests/conftest.py,sha256=PU-eYPagFRXSKeXaGadES3s2LlNjzy5VSsXuUPse8_4,11136
|
|
94
|
-
jac_client/tests/test_cli.py,sha256=
|
|
95
|
-
jac_client/tests/
|
|
96
|
+
jac_client/tests/test_cli.py,sha256=YtpFzdQca264ZIXO9RBfvV6LVBGaeZ2B5iKFsvVMx4E,37995
|
|
97
|
+
jac_client/tests/test_desktop_api_url.py,sha256=x81jMYxSnIFheU2dvDyqqfoKnm3i0LxY5BBY8lObxfU,32513
|
|
98
|
+
jac_client/tests/test_e2e.py,sha256=QNVKkgwLY1WDmc6EKJ9Vznuu0Q2A64HZAfzDZe0dEaQ,8184
|
|
96
99
|
jac_client/tests/test_helpers.py,sha256=UqXYIl0Vi_8IDJ1efsJh1BcaJPudINfpLojhwDxxtNg,1615
|
|
97
|
-
jac_client/tests/test_it.py,sha256=
|
|
100
|
+
jac_client/tests/test_it.py,sha256=p8840vOmvhzS56BQIiAvpcK6gkavENoI5pxhFwDd5Ns,46381
|
|
98
101
|
jac_client/tests/test_it_desktop.py,sha256=mzaDfFFhmN762FrFH1WEXQh99cq5bS-eZqwmI-ousvM,32143
|
|
99
102
|
jac_client/tests/fixtures/basic-app/app.jac,sha256=sDup4PmtUm93oVOxIz874SSZfMimPv4Qn683iXm43TI,489
|
|
100
103
|
jac_client/tests/fixtures/cl_file/app.cl.jac,sha256=fHJvjKWLhX5uVdZl12mPwcNRgMVFrCz8oY3oMoCWeuM,1157
|
|
@@ -106,8 +109,8 @@ jac_client/tests/fixtures/relative_import/button.jac,sha256=kCDNaHEcxMEFdezfnecy
|
|
|
106
109
|
jac_client/tests/fixtures/spawn_test/app.jac,sha256=cooYrB7xhHMk9xWOZ6MIiY4I6kmodW2v-nyVnd1RR74,3863
|
|
107
110
|
jac_client/tests/fixtures/test_fragments_spread/app.jac,sha256=CMzAz4Ydx_5eAV82-io8sJdy8_xy-mR7YOVc7FcozlU,1277
|
|
108
111
|
jac_client/tests/fixtures/with-ts/app.jac,sha256=1j1IH_4mfgLtgPq2Xc5PrGHBvmLQl6U0ddbb2L5KwuA,981
|
|
109
|
-
jac_client-0.2.
|
|
110
|
-
jac_client-0.2.
|
|
111
|
-
jac_client-0.2.
|
|
112
|
-
jac_client-0.2.
|
|
113
|
-
jac_client-0.2.
|
|
112
|
+
jac_client-0.2.13.dist-info/METADATA,sha256=husYWbw76gE444kA_UzCcenhK8FfAkFY0UeX_YFMpXs,5552
|
|
113
|
+
jac_client-0.2.13.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
|
|
114
|
+
jac_client-0.2.13.dist-info/entry_points.txt,sha256=fVrlaJKcSa2DK2hcfR6bNaQDB9mszMpZeEa6pitMdt4,154
|
|
115
|
+
jac_client-0.2.13.dist-info/top_level.txt,sha256=u1VEBfiqwRrZEopKraIh-Ym55qSnDZR3Q5xdw2HinhU,11
|
|
116
|
+
jac_client-0.2.13.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|