jac-client 0.2.4__py3-none-any.whl → 0.2.5__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/src/app.jac +841 -0
- jac_client/examples/all-in-one/src/button.jac +7 -0
- jac_client/examples/all-in-one/src/components/button.jac +7 -0
- jac_client/examples/asset-serving/css-with-image/src/app.jac +88 -0
- jac_client/examples/asset-serving/image-asset/src/app.jac +55 -0
- jac_client/examples/asset-serving/import-alias/src/app.jac +111 -0
- jac_client/examples/basic/src/app.jac +21 -0
- jac_client/examples/basic-auth/src/app.jac +377 -0
- jac_client/examples/basic-auth-with-router/src/app.jac +464 -0
- jac_client/examples/basic-full-stack/src/app.jac +365 -0
- jac_client/examples/css-styling/js-styling/src/app.jac +84 -0
- jac_client/examples/css-styling/material-ui/src/app.jac +122 -0
- jac_client/examples/css-styling/pure-css/src/app.jac +64 -0
- jac_client/examples/css-styling/sass-example/src/app.jac +64 -0
- jac_client/examples/css-styling/styled-components/src/app.jac +71 -0
- jac_client/examples/css-styling/tailwind-example/src/app.jac +63 -0
- jac_client/examples/full-stack-with-auth/src/app.jac +722 -0
- jac_client/examples/little-x/src/app.jac +719 -0
- jac_client/examples/little-x/src/submit-button.jac +16 -0
- jac_client/examples/nested-folders/nested-advance/src/ButtonRoot.jac +11 -0
- jac_client/examples/nested-folders/nested-advance/src/app.jac +35 -0
- jac_client/examples/nested-folders/nested-advance/src/level1/ButtonSecondL.jac +19 -0
- jac_client/examples/nested-folders/nested-advance/src/level1/Card.jac +43 -0
- jac_client/examples/nested-folders/nested-advance/src/level1/level2/ButtonThirdL.jac +25 -0
- jac_client/examples/nested-folders/nested-basic/src/app.jac +13 -0
- jac_client/examples/nested-folders/nested-basic/src/button.jac +7 -0
- jac_client/examples/nested-folders/nested-basic/src/components/button.jac +7 -0
- jac_client/examples/ts-support/src/app.jac +35 -0
- jac_client/examples/with-router/src/app.jac +323 -0
- jac_client/plugin/cli.jac +547 -0
- jac_client/plugin/client.jac +52 -0
- jac_client/plugin/client_runtime.cl.jac +38 -0
- jac_client/plugin/impl/client.impl.jac +134 -0
- jac_client/plugin/impl/client_runtime.impl.jac +177 -0
- jac_client/plugin/impl/vite_client_bundle.impl.jac +72 -0
- jac_client/plugin/plugin_config.jac +195 -0
- jac_client/plugin/src/__init__.jac +20 -0
- jac_client/plugin/src/asset_processor.jac +33 -0
- jac_client/plugin/src/babel_processor.jac +18 -0
- jac_client/plugin/src/compiler.jac +66 -0
- jac_client/plugin/src/config_loader.jac +32 -0
- jac_client/plugin/src/impl/asset_processor.impl.jac +127 -0
- jac_client/plugin/src/impl/babel_processor.impl.jac +84 -0
- jac_client/plugin/src/impl/compiler.impl.jac +251 -0
- jac_client/plugin/src/impl/config_loader.impl.jac +119 -0
- jac_client/plugin/src/impl/import_processor.impl.jac +33 -0
- jac_client/plugin/src/impl/jac_to_js.impl.jac +41 -0
- jac_client/plugin/src/impl/package_installer.impl.jac +105 -0
- jac_client/plugin/src/impl/vite_bundler.impl.jac +513 -0
- jac_client/plugin/src/import_processor.jac +19 -0
- jac_client/plugin/src/jac_to_js.jac +35 -0
- jac_client/plugin/src/package_installer.jac +26 -0
- jac_client/plugin/src/vite_bundler.jac +36 -0
- jac_client/plugin/vite_client_bundle.jac +31 -0
- jac_client/tests/fixtures/basic-app/app.jac +23 -0
- jac_client/tests/fixtures/cl_file/app.cl.jac +48 -0
- jac_client/tests/fixtures/cl_file/app.jac +15 -0
- jac_client/tests/fixtures/client_app_with_antd/app.jac +34 -0
- jac_client/tests/fixtures/js_import/app.jac +34 -0
- jac_client/tests/fixtures/relative_import/app.jac +11 -0
- jac_client/tests/fixtures/relative_import/button.jac +7 -0
- jac_client/tests/fixtures/spawn_test/app.jac +129 -0
- jac_client/tests/fixtures/test_fragments_spread/app.jac +67 -0
- jac_client/tests/fixtures/with-ts/app.jac +35 -0
- {jac_client-0.2.4.dist-info → jac_client-0.2.5.dist-info}/METADATA +2 -2
- jac_client-0.2.5.dist-info/RECORD +74 -0
- jac_client-0.2.4.dist-info/RECORD +0 -10
- {jac_client-0.2.4.dist-info → jac_client-0.2.5.dist-info}/WHEEL +0 -0
- {jac_client-0.2.4.dist-info → jac_client-0.2.5.dist-info}/entry_points.txt +0 -0
- {jac_client-0.2.4.dist-info → jac_client-0.2.5.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"""Check if an import should be processed (compiled/copied) vs left for Vite."""
|
|
2
|
+
|
|
3
|
+
impl ImportProcessor.should_process_import(
|
|
4
|
+
self: ImportProcessor, import_path: Path
|
|
5
|
+
) -> bool {
|
|
6
|
+
return (import_path.suffix in {'.jac','.js'});
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
"""Process client imports for Vite bundling."""
|
|
10
|
+
impl ImportProcessor.process_vite_imports(
|
|
11
|
+
self: ImportProcessor, manifest: (ClientManifest | None), module_path: Path
|
|
12
|
+
) -> list[(Path | None)] {
|
|
13
|
+
imported_js_modules: list[(Path | None)] = [];
|
|
14
|
+
if (manifest and manifest.imports) {
|
|
15
|
+
for (_, import_path) in manifest.imports.items() {
|
|
16
|
+
import_path_obj = Path(import_path);
|
|
17
|
+
if (import_path_obj.suffix == '.js') {
|
|
18
|
+
try {
|
|
19
|
+
imported_js_modules.append(import_path_obj);
|
|
20
|
+
} except FileNotFoundError {
|
|
21
|
+
imported_js_modules.append(None);
|
|
22
|
+
}
|
|
23
|
+
} elif (import_path_obj.suffix == '.jac') {
|
|
24
|
+
try {
|
|
25
|
+
imported_js_modules.append(import_path_obj);
|
|
26
|
+
} except ClientBundleError {
|
|
27
|
+
imported_js_modules.append(None);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return imported_js_modules;
|
|
33
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"""Add runtime imports to compiled JS code."""
|
|
2
|
+
|
|
3
|
+
impl JacToJSCompiler.add_runtime_imports(self: JacToJSCompiler, js_code: str) -> str {
|
|
4
|
+
jac_jsx_import = 'import {__jacJsx, __jacSpawn} from "@jac-client/utils";';
|
|
5
|
+
return f"{jac_jsx_import}\n{js_code}";
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
"""Extract client globals from manifest and module."""
|
|
9
|
+
impl JacToJSCompiler.extract_globals(
|
|
10
|
+
self: JacToJSCompiler, manifest: (ClientManifest | None), module: ModuleType
|
|
11
|
+
) -> dict[str, Any] {
|
|
12
|
+
return self._extract_client_globals(manifest, module);
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
"""Extract client exports from manifest."""
|
|
16
|
+
impl JacToJSCompiler.extract_exports(
|
|
17
|
+
self: JacToJSCompiler, manifest: (ClientManifest | None)
|
|
18
|
+
) -> list[str] {
|
|
19
|
+
return self._extract_client_exports(manifest);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
"""Compile a Jac module to JavaScript."""
|
|
23
|
+
impl JacToJSCompiler.compile_module(
|
|
24
|
+
self: JacToJSCompiler, module_path: Path
|
|
25
|
+
) -> tuple[str, (ModuleType | None), (ClientManifest | None)] {
|
|
26
|
+
(module_js, mod) = self._compile_to_js(module_path);
|
|
27
|
+
manifest = mod.gen.client_manifest if mod else None;
|
|
28
|
+
return (module_js, mod, manifest);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
"""Initialize the Jac to JS compiler."""
|
|
32
|
+
impl JacToJSCompiler.init(
|
|
33
|
+
self: JacToJSCompiler,
|
|
34
|
+
compile_to_js_func: Callable[([Path], tuple[(str, (ModuleType | None))])],
|
|
35
|
+
extract_exports_func: Callable[([Any], list[str])],
|
|
36
|
+
extract_globals_func: Callable[([Any, ModuleType], dict[(str, Any)])]
|
|
37
|
+
) {
|
|
38
|
+
self._compile_to_js = compile_to_js_func;
|
|
39
|
+
self._extract_client_exports = extract_exports_func;
|
|
40
|
+
self._extract_client_globals = extract_globals_func;
|
|
41
|
+
}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
"""List all installed packages from jac.toml."""
|
|
2
|
+
|
|
3
|
+
impl PackageInstaller.list_packages(
|
|
4
|
+
self: PackageInstaller
|
|
5
|
+
) -> dict[str, dict[str, str]] {
|
|
6
|
+
if not self.config_file.exists() {
|
|
7
|
+
raise ClientBundleError(
|
|
8
|
+
f'jac.toml not found at {self.config_file}. Run "jac init" first.'
|
|
9
|
+
) ;
|
|
10
|
+
}
|
|
11
|
+
config = self.config_loader.load();
|
|
12
|
+
package_config = config.get('package', {});
|
|
13
|
+
return {
|
|
14
|
+
'dependencies': package_config.get('dependencies', {}),
|
|
15
|
+
'devDependencies': package_config.get('devDependencies', {})
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
"""Uninstall a package by removing it from jac.toml."""
|
|
20
|
+
impl PackageInstaller.uninstall_package(
|
|
21
|
+
self: PackageInstaller, package_name: str, is_dev: bool = False
|
|
22
|
+
) -> None {
|
|
23
|
+
if not self.config_file.exists() {
|
|
24
|
+
raise ClientBundleError(
|
|
25
|
+
f'jac.toml not found at {self.config_file}. Run "jac init" first.'
|
|
26
|
+
) ;
|
|
27
|
+
}
|
|
28
|
+
# Remove the dependency using JacClientConfig
|
|
29
|
+
result = self.config_loader.remove_dependency(package_name, is_dev);
|
|
30
|
+
if not result {
|
|
31
|
+
deps_key = 'dev-dependencies' if is_dev else 'dependencies';
|
|
32
|
+
raise ClientBundleError(f'Package "{package_name}" not found in {deps_key}') ;
|
|
33
|
+
}
|
|
34
|
+
# Save the updated config
|
|
35
|
+
self.config_loader.save();
|
|
36
|
+
# Regenerate package.json and run npm install to actually remove the package
|
|
37
|
+
self._regenerate_and_install();
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
"""Regenerate package.json from jac.toml and run npm install."""
|
|
41
|
+
impl PackageInstaller._regenerate_and_install(self: PackageInstaller) -> None {
|
|
42
|
+
# Regenerate package.json from updated jac.toml
|
|
43
|
+
bundler = ViteBundler(self.project_dir);
|
|
44
|
+
bundler.create_package_json();
|
|
45
|
+
# Ensure root package.json exists temporarily for npm commands
|
|
46
|
+
bundler._ensure_root_package_json();
|
|
47
|
+
try {
|
|
48
|
+
# Run npm install to actually install the packages
|
|
49
|
+
subprocess.run(
|
|
50
|
+
['npm', 'install'],
|
|
51
|
+
cwd=self.project_dir,
|
|
52
|
+
check=True,
|
|
53
|
+
capture_output=True,
|
|
54
|
+
text=True
|
|
55
|
+
);
|
|
56
|
+
} except subprocess.CalledProcessError as e {
|
|
57
|
+
raise ClientBundleError(f'Failed to install npm packages: {e.stderr}') from e ;
|
|
58
|
+
} except FileNotFoundError {
|
|
59
|
+
raise ClientBundleError(
|
|
60
|
+
'npm command not found. Ensure Node.js and npm are installed.'
|
|
61
|
+
) from None ;
|
|
62
|
+
} finally {
|
|
63
|
+
# Always clean up root package.json and move package-lock.json
|
|
64
|
+
bundler._cleanup_root_package_files();
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
"""Install all packages from jac.toml (regenerate package.json and run npm install)."""
|
|
69
|
+
impl PackageInstaller.install_all(self: PackageInstaller) -> None {
|
|
70
|
+
if not self.config_file.exists() {
|
|
71
|
+
raise ClientBundleError(
|
|
72
|
+
f'jac.toml not found at {self.config_file}. Run "jac init" first.'
|
|
73
|
+
) ;
|
|
74
|
+
}
|
|
75
|
+
self._regenerate_and_install();
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
"""Install a package by adding it to jac.toml."""
|
|
79
|
+
impl PackageInstaller.install_package(
|
|
80
|
+
self: PackageInstaller,
|
|
81
|
+
package_name: str,
|
|
82
|
+
version: (str | None) = None,
|
|
83
|
+
is_dev: bool = False
|
|
84
|
+
) -> None {
|
|
85
|
+
if not self.config_file.exists() {
|
|
86
|
+
raise ClientBundleError(
|
|
87
|
+
f'jac.toml not found at {self.config_file}. Run "jac init" first.'
|
|
88
|
+
) ;
|
|
89
|
+
}
|
|
90
|
+
# Add package with version (default to latest if not specified)
|
|
91
|
+
package_version = version or 'latest';
|
|
92
|
+
# Use JacClientConfig to add the dependency
|
|
93
|
+
self.config_loader.add_dependency(package_name, package_version, is_dev);
|
|
94
|
+
# Save the updated config
|
|
95
|
+
self.config_loader.save();
|
|
96
|
+
# Regenerate package.json and install the package via npm
|
|
97
|
+
self._regenerate_and_install();
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
"""Handles installing npm packages by updating jac.toml."""
|
|
101
|
+
impl PackageInstaller.init(self: PackageInstaller, project_dir: Path) {
|
|
102
|
+
self.project_dir = project_dir;
|
|
103
|
+
self.config_loader = JacClientConfig(project_dir);
|
|
104
|
+
self.config_file = project_dir / 'jac.toml';
|
|
105
|
+
}
|