jac-client 0.2.3__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/assets/workers/worker.py +5 -0
- jac_client/examples/all-in-one/src/app.jac +841 -0
- jac_client/examples/all-in-one/{button.jac → src/button.jac} +1 -1
- jac_client/examples/all-in-one/{components → src/components}/button.jac +1 -1
- jac_client/examples/asset-serving/css-with-image/{app.jac → src/app.jac} +2 -2
- jac_client/examples/asset-serving/image-asset/{app.jac → src/app.jac} +2 -2
- jac_client/examples/asset-serving/import-alias/{app.jac → src/app.jac} +3 -3
- jac_client/examples/basic/{app.jac → src/app.jac} +2 -2
- jac_client/examples/basic-auth/src/app.jac +377 -0
- jac_client/examples/basic-auth-with-router/{app.jac → src/app.jac} +18 -18
- jac_client/examples/basic-full-stack/{app.jac → src/app.jac} +175 -130
- jac_client/examples/css-styling/js-styling/{app.jac → src/app.jac} +6 -6
- jac_client/examples/css-styling/material-ui/{app.jac → src/app.jac} +5 -5
- jac_client/examples/css-styling/pure-css/{app.jac → src/app.jac} +6 -6
- jac_client/examples/css-styling/sass-example/{app.jac → src/app.jac} +6 -6
- jac_client/examples/css-styling/styled-components/{app.jac → src/app.jac} +5 -5
- jac_client/examples/css-styling/tailwind-example/{app.jac → src/app.jac} +6 -6
- jac_client/examples/full-stack-with-auth/{app.jac → src/app.jac} +37 -37
- jac_client/examples/little-x/{app.jac → src/app.jac} +27 -32
- jac_client/examples/little-x/src/submit-button.jac +16 -0
- jac_client/examples/nested-folders/nested-advance/{ButtonRoot.jac → src/ButtonRoot.jac} +1 -1
- jac_client/examples/nested-folders/nested-advance/{app.jac → src/app.jac} +1 -1
- jac_client/examples/nested-folders/nested-advance/{level1 → src/level1}/ButtonSecondL.jac +1 -1
- jac_client/examples/nested-folders/nested-advance/{level1 → src/level1}/Card.jac +1 -1
- jac_client/examples/nested-folders/nested-advance/{level1 → src/level1}/level2/ButtonThirdL.jac +1 -1
- jac_client/examples/nested-folders/nested-basic/{app.jac → src/app.jac} +2 -2
- jac_client/examples/nested-folders/nested-basic/{button.jac → src/button.jac} +1 -1
- jac_client/examples/nested-folders/nested-basic/{components → src/components}/button.jac +1 -1
- jac_client/examples/ts-support/src/app.jac +35 -0
- jac_client/examples/with-router/{app.jac → src/app.jac} +11 -11
- 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/conftest.py +281 -0
- jac_client/tests/fixtures/basic-app/app.jac +2 -2
- jac_client/tests/fixtures/cl_file/app.cl.jac +2 -2
- jac_client/tests/fixtures/client_app_with_antd/app.jac +1 -1
- jac_client/tests/fixtures/js_import/app.jac +5 -5
- jac_client/tests/fixtures/spawn_test/app.jac +7 -7
- jac_client/tests/fixtures/with-ts/app.jac +35 -0
- jac_client/tests/test_cli.py +755 -0
- jac_client/tests/test_it.py +347 -67
- {jac_client-0.2.3.dist-info → jac_client-0.2.5.dist-info}/METADATA +28 -30
- jac_client-0.2.5.dist-info/RECORD +74 -0
- {jac_client-0.2.3.dist-info → jac_client-0.2.5.dist-info}/WHEEL +2 -1
- jac_client-0.2.5.dist-info/entry_points.txt +4 -0
- jac_client-0.2.5.dist-info/top_level.txt +1 -0
- jac_client/docs/README.md +0 -689
- jac_client/docs/advanced-state.md +0 -1265
- jac_client/docs/asset-serving/intro.md +0 -209
- jac_client/docs/assets/pipe_line-v2.svg +0 -32
- jac_client/docs/assets/pipe_line.png +0 -0
- jac_client/docs/file-system/app.jac.md +0 -121
- jac_client/docs/file-system/backend-frontend.md +0 -217
- jac_client/docs/file-system/intro.md +0 -72
- jac_client/docs/file-system/nested-imports.md +0 -348
- jac_client/docs/guide-example/intro.md +0 -115
- jac_client/docs/guide-example/step-01-setup.md +0 -270
- jac_client/docs/guide-example/step-02-components.md +0 -416
- jac_client/docs/guide-example/step-03-styling.md +0 -478
- jac_client/docs/guide-example/step-04-todo-ui.md +0 -477
- jac_client/docs/guide-example/step-05-local-state.md +0 -530
- jac_client/docs/guide-example/step-06-events.md +0 -749
- jac_client/docs/guide-example/step-07-effects.md +0 -468
- jac_client/docs/guide-example/step-08-walkers.md +0 -534
- jac_client/docs/guide-example/step-09-authentication.md +0 -586
- jac_client/docs/guide-example/step-10-routing.md +0 -539
- jac_client/docs/guide-example/step-11-final.md +0 -963
- jac_client/docs/imports.md +0 -1141
- jac_client/docs/lifecycle-hooks.md +0 -773
- jac_client/docs/routing.md +0 -659
- jac_client/docs/styling/intro.md +0 -249
- jac_client/docs/styling/js-styling.md +0 -367
- jac_client/docs/styling/material-ui.md +0 -341
- jac_client/docs/styling/pure-css.md +0 -299
- jac_client/docs/styling/sass.md +0 -403
- jac_client/docs/styling/styled-components.md +0 -395
- jac_client/docs/styling/tailwind.md +0 -298
- jac_client/examples/all-in-one/.babelrc +0 -9
- jac_client/examples/all-in-one/README.md +0 -16
- jac_client/examples/all-in-one/app.jac +0 -426
- jac_client/examples/all-in-one/assets/burger.png +0 -0
- jac_client/examples/all-in-one/package.json +0 -29
- jac_client/examples/all-in-one/styles.css +0 -26
- jac_client/examples/all-in-one/vite.config.js +0 -28
- jac_client/examples/asset-serving/css-with-image/.babelrc +0 -9
- jac_client/examples/asset-serving/css-with-image/README.md +0 -91
- jac_client/examples/asset-serving/css-with-image/assets/burger.png +0 -0
- jac_client/examples/asset-serving/css-with-image/package.json +0 -28
- jac_client/examples/asset-serving/css-with-image/styles.css +0 -26
- jac_client/examples/asset-serving/css-with-image/vite.config.js +0 -28
- jac_client/examples/asset-serving/image-asset/.babelrc +0 -9
- jac_client/examples/asset-serving/image-asset/README.md +0 -119
- jac_client/examples/asset-serving/image-asset/assets/burger.png +0 -0
- jac_client/examples/asset-serving/image-asset/package.json +0 -28
- jac_client/examples/asset-serving/image-asset/styles.css +0 -26
- jac_client/examples/asset-serving/image-asset/vite.config.js +0 -28
- jac_client/examples/asset-serving/import-alias/.babelrc +0 -9
- jac_client/examples/asset-serving/import-alias/README.md +0 -83
- jac_client/examples/asset-serving/import-alias/assets/burger.png +0 -0
- jac_client/examples/asset-serving/import-alias/package.json +0 -28
- jac_client/examples/asset-serving/import-alias/vite.config.js +0 -28
- jac_client/examples/basic/.babelrc +0 -9
- jac_client/examples/basic/README.md +0 -16
- jac_client/examples/basic/package.json +0 -27
- jac_client/examples/basic/vite.config.js +0 -27
- jac_client/examples/basic-auth/.babelrc +0 -9
- jac_client/examples/basic-auth/README.md +0 -16
- jac_client/examples/basic-auth/app.jac +0 -308
- jac_client/examples/basic-auth/package.json +0 -27
- jac_client/examples/basic-auth/vite.config.js +0 -27
- jac_client/examples/basic-auth-with-router/.babelrc +0 -9
- jac_client/examples/basic-auth-with-router/README.md +0 -60
- jac_client/examples/basic-auth-with-router/package.json +0 -28
- jac_client/examples/basic-auth-with-router/vite.config.js +0 -27
- jac_client/examples/basic-full-stack/.babelrc +0 -9
- jac_client/examples/basic-full-stack/README.md +0 -18
- jac_client/examples/basic-full-stack/package.json +0 -28
- jac_client/examples/basic-full-stack/vite.config.js +0 -27
- jac_client/examples/css-styling/js-styling/.babelrc +0 -9
- jac_client/examples/css-styling/js-styling/README.md +0 -183
- jac_client/examples/css-styling/js-styling/package.json +0 -28
- jac_client/examples/css-styling/js-styling/styles.js +0 -100
- jac_client/examples/css-styling/js-styling/vite.config.js +0 -27
- jac_client/examples/css-styling/material-ui/.babelrc +0 -9
- jac_client/examples/css-styling/material-ui/README.md +0 -16
- jac_client/examples/css-styling/material-ui/package.json +0 -32
- jac_client/examples/css-styling/material-ui/vite.config.js +0 -27
- jac_client/examples/css-styling/pure-css/.babelrc +0 -9
- jac_client/examples/css-styling/pure-css/README.md +0 -16
- jac_client/examples/css-styling/pure-css/package.json +0 -28
- jac_client/examples/css-styling/pure-css/styles.css +0 -111
- jac_client/examples/css-styling/pure-css/vite.config.js +0 -27
- jac_client/examples/css-styling/sass-example/.babelrc +0 -9
- jac_client/examples/css-styling/sass-example/README.md +0 -16
- jac_client/examples/css-styling/sass-example/package.json +0 -29
- jac_client/examples/css-styling/sass-example/styles.scss +0 -153
- jac_client/examples/css-styling/sass-example/vite.config.js +0 -27
- jac_client/examples/css-styling/styled-components/.babelrc +0 -9
- jac_client/examples/css-styling/styled-components/README.md +0 -16
- jac_client/examples/css-styling/styled-components/package.json +0 -29
- jac_client/examples/css-styling/styled-components/styled.js +0 -90
- jac_client/examples/css-styling/styled-components/vite.config.js +0 -27
- jac_client/examples/css-styling/tailwind-example/.babelrc +0 -9
- jac_client/examples/css-styling/tailwind-example/README.md +0 -16
- jac_client/examples/css-styling/tailwind-example/global.css +0 -1
- jac_client/examples/css-styling/tailwind-example/package.json +0 -30
- jac_client/examples/css-styling/tailwind-example/vite.config.js +0 -29
- jac_client/examples/full-stack-with-auth/.babelrc +0 -9
- jac_client/examples/full-stack-with-auth/README.md +0 -16
- jac_client/examples/full-stack-with-auth/package.json +0 -28
- jac_client/examples/full-stack-with-auth/vite.config.js +0 -29
- jac_client/examples/little-x/package.json +0 -23
- jac_client/examples/little-x/submit-button.jac +0 -8
- jac_client/examples/nested-folders/nested-advance/.babelrc +0 -9
- jac_client/examples/nested-folders/nested-advance/README.md +0 -77
- jac_client/examples/nested-folders/nested-advance/package.json +0 -29
- jac_client/examples/nested-folders/nested-advance/vite.config.js +0 -28
- jac_client/examples/nested-folders/nested-basic/.babelrc +0 -9
- jac_client/examples/nested-folders/nested-basic/README.md +0 -183
- jac_client/examples/nested-folders/nested-basic/app.js +0 -7
- jac_client/examples/nested-folders/nested-basic/package.json +0 -28
- jac_client/examples/nested-folders/nested-basic/vite.config.js +0 -27
- jac_client/examples/with-router/.babelrc +0 -9
- jac_client/examples/with-router/README.md +0 -17
- jac_client/examples/with-router/package.json +0 -28
- jac_client/examples/with-router/vite.config.js +0 -27
- jac_client/plugin/cli.py +0 -244
- jac_client/plugin/client.py +0 -152
- jac_client/plugin/client_runtime.jac +0 -234
- jac_client/plugin/vite_client_bundle.py +0 -503
- jac_client/tests/fixtures/js_import/utils.js +0 -21
- jac_client/tests/fixtures/package-lock.json +0 -329
- jac_client/tests/fixtures/package.json +0 -11
- jac_client/tests/test_asset_examples.py +0 -322
- jac_client/tests/test_cl.py +0 -530
- jac_client/tests/test_create_jac_app.py +0 -131
- jac_client/tests/test_nested_file.py +0 -374
- jac_client-0.2.3.dist-info/RECORD +0 -171
- jac_client-0.2.3.dist-info/entry_points.txt +0 -4
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
import { defineConfig } from "vite";
|
|
3
|
-
import path from "path";
|
|
4
|
-
import { fileURLToPath } from "url";
|
|
5
|
-
|
|
6
|
-
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
7
|
-
|
|
8
|
-
export default defineConfig({
|
|
9
|
-
root: ".", // base folder
|
|
10
|
-
build: {
|
|
11
|
-
rollupOptions: {
|
|
12
|
-
input: "build/main.js", // your compiled entry file
|
|
13
|
-
output: {
|
|
14
|
-
entryFileNames: "client.[hash].js", // name of the final js file
|
|
15
|
-
assetFileNames: "[name].[ext]",
|
|
16
|
-
},
|
|
17
|
-
},
|
|
18
|
-
outDir: "dist", // final bundled output
|
|
19
|
-
emptyOutDir: true,
|
|
20
|
-
},
|
|
21
|
-
publicDir: false,
|
|
22
|
-
resolve: {
|
|
23
|
-
alias: {
|
|
24
|
-
"@jac-client/utils": path.resolve(__dirname, "src/client_runtime.js"),
|
|
25
|
-
"@jac-client/assets": path.resolve(__dirname, "src/assets"),
|
|
26
|
-
},
|
|
27
|
-
},
|
|
28
|
-
});
|
|
@@ -1,183 +0,0 @@
|
|
|
1
|
-
# JavaScript Styling Example
|
|
2
|
-
|
|
3
|
-
This example demonstrates styling a Jac application using JavaScript objects for inline styles.
|
|
4
|
-
|
|
5
|
-
## Overview
|
|
6
|
-
|
|
7
|
-
JavaScript styling uses JavaScript objects to define styles, which are then applied via the `style` prop. This approach is perfect for:
|
|
8
|
-
- Dynamic styling based on state
|
|
9
|
-
- Programmatic style generation
|
|
10
|
-
- Component-scoped styles without CSS files
|
|
11
|
-
- React-style inline styling
|
|
12
|
-
|
|
13
|
-
## Project Structure
|
|
14
|
-
|
|
15
|
-
```
|
|
16
|
-
js-styling/
|
|
17
|
-
├── app.jac # Main application component
|
|
18
|
-
├── styles.js # Style objects exported as default
|
|
19
|
-
├── package.json # Dependencies
|
|
20
|
-
└── vite.config.js # Vite configuration
|
|
21
|
-
```
|
|
22
|
-
|
|
23
|
-
## Setup
|
|
24
|
-
|
|
25
|
-
1. Install dependencies:
|
|
26
|
-
```bash
|
|
27
|
-
npm install
|
|
28
|
-
```
|
|
29
|
-
|
|
30
|
-
2. Run the application:
|
|
31
|
-
```bash
|
|
32
|
-
jac serve app.jac
|
|
33
|
-
```
|
|
34
|
-
|
|
35
|
-
## How It Works
|
|
36
|
-
|
|
37
|
-
### 1. Define Style Objects
|
|
38
|
-
|
|
39
|
-
In `styles.js`, export a default object with all styles:
|
|
40
|
-
|
|
41
|
-
```javascript
|
|
42
|
-
const countDisplay = {
|
|
43
|
-
fontSize: "3.75rem",
|
|
44
|
-
fontWeight: "bold",
|
|
45
|
-
transition: "color 0.3s ease"
|
|
46
|
-
};
|
|
47
|
-
|
|
48
|
-
export default {
|
|
49
|
-
container: {
|
|
50
|
-
minHeight: "100vh",
|
|
51
|
-
background: "linear-gradient(to bottom right, #dbeafe, #e0e7ff)",
|
|
52
|
-
display: "flex",
|
|
53
|
-
alignItems: "center",
|
|
54
|
-
justifyContent: "center",
|
|
55
|
-
padding: "1rem"
|
|
56
|
-
},
|
|
57
|
-
card: {
|
|
58
|
-
backgroundColor: "#ffffff",
|
|
59
|
-
borderRadius: "1rem",
|
|
60
|
-
boxShadow: "0 25px 50px -12px rgba(0, 0, 0, 0.25)",
|
|
61
|
-
padding: "2rem",
|
|
62
|
-
maxWidth: "28rem",
|
|
63
|
-
width: "100%"
|
|
64
|
-
},
|
|
65
|
-
countDisplayZero: {
|
|
66
|
-
...countDisplay,
|
|
67
|
-
color: "#1f2937"
|
|
68
|
-
},
|
|
69
|
-
countDisplayPositive: {
|
|
70
|
-
...countDisplay,
|
|
71
|
-
color: "#16a34a"
|
|
72
|
-
},
|
|
73
|
-
// ... more styles
|
|
74
|
-
};
|
|
75
|
-
```
|
|
76
|
-
|
|
77
|
-
### 2. Import Styles
|
|
78
|
-
|
|
79
|
-
In your Jac file:
|
|
80
|
-
|
|
81
|
-
```jac
|
|
82
|
-
cl import from .styles { default as styles }
|
|
83
|
-
```
|
|
84
|
-
|
|
85
|
-
### 3. Apply Styles
|
|
86
|
-
|
|
87
|
-
Use the `style` prop with style objects:
|
|
88
|
-
|
|
89
|
-
```jac
|
|
90
|
-
return <div style={styles.container}>
|
|
91
|
-
<div style={styles.card}>
|
|
92
|
-
<h1 style={styles.title}>Counter Application</h1>
|
|
93
|
-
</div>
|
|
94
|
-
</div>;
|
|
95
|
-
```
|
|
96
|
-
|
|
97
|
-
### 4. Dynamic Styles
|
|
98
|
-
|
|
99
|
-
Select styles based on state:
|
|
100
|
-
|
|
101
|
-
```jac
|
|
102
|
-
let countStyle = styles.countDisplayZero if count == 0 else (styles.countDisplayPositive if count > 0 else styles.countDisplayNegative);
|
|
103
|
-
|
|
104
|
-
return <div style={countStyle}>{count}</div>;
|
|
105
|
-
```
|
|
106
|
-
|
|
107
|
-
## Style Object Format
|
|
108
|
-
|
|
109
|
-
JavaScript style objects use camelCase property names (React convention):
|
|
110
|
-
|
|
111
|
-
```javascript
|
|
112
|
-
{
|
|
113
|
-
backgroundColor: "#ffffff", // not background-color
|
|
114
|
-
fontSize: "1.5rem", // not font-size
|
|
115
|
-
marginTop: "10px", // not margin-top
|
|
116
|
-
zIndex: 1 // not z-index
|
|
117
|
-
}
|
|
118
|
-
```
|
|
119
|
-
|
|
120
|
-
## Best Practices
|
|
121
|
-
|
|
122
|
-
1. **Use object spread**: Share common styles with spread operator
|
|
123
|
-
2. **Organize by component**: Group related styles together
|
|
124
|
-
3. **Use constants**: Define reusable values at the top
|
|
125
|
-
4. **CamelCase properties**: Follow React naming convention
|
|
126
|
-
5. **Extract complex logic**: Move style calculations to functions
|
|
127
|
-
|
|
128
|
-
## Advantages
|
|
129
|
-
|
|
130
|
-
- ✅ Dynamic styling based on props/state
|
|
131
|
-
- ✅ No CSS file needed
|
|
132
|
-
- ✅ Type-safe (with TypeScript)
|
|
133
|
-
- ✅ Component-scoped by default
|
|
134
|
-
- ✅ Programmatic style generation
|
|
135
|
-
|
|
136
|
-
## Limitations
|
|
137
|
-
|
|
138
|
-
- ❌ No pseudo-classes (hover, focus, etc.)
|
|
139
|
-
- ❌ No media queries
|
|
140
|
-
- ❌ No CSS animations (use JavaScript)
|
|
141
|
-
- ❌ Verbose for complex styles
|
|
142
|
-
- ❌ No CSS preprocessor features
|
|
143
|
-
|
|
144
|
-
## When to Use
|
|
145
|
-
|
|
146
|
-
Choose JavaScript Styling when:
|
|
147
|
-
- You need dynamic styles based on state
|
|
148
|
-
- You want programmatic style generation
|
|
149
|
-
- You prefer keeping styles in JavaScript
|
|
150
|
-
- You're building component libraries
|
|
151
|
-
- You need runtime style calculations
|
|
152
|
-
|
|
153
|
-
## Advanced Patterns
|
|
154
|
-
|
|
155
|
-
### Style Functions
|
|
156
|
-
|
|
157
|
-
Create functions that return styles:
|
|
158
|
-
|
|
159
|
-
```javascript
|
|
160
|
-
export const getButtonStyle = (variant) => ({
|
|
161
|
-
...buttonBase,
|
|
162
|
-
backgroundColor: variant === 'primary' ? '#007bff' : '#6c757d'
|
|
163
|
-
});
|
|
164
|
-
```
|
|
165
|
-
|
|
166
|
-
### Conditional Styles
|
|
167
|
-
|
|
168
|
-
Use ternary operators for conditional styles:
|
|
169
|
-
|
|
170
|
-
```javascript
|
|
171
|
-
export default {
|
|
172
|
-
button: {
|
|
173
|
-
backgroundColor: isActive ? '#007bff' : '#6c757d',
|
|
174
|
-
opacity: isDisabled ? 0.5 : 1,
|
|
175
|
-
}
|
|
176
|
-
};
|
|
177
|
-
```
|
|
178
|
-
|
|
179
|
-
## Next Steps
|
|
180
|
-
|
|
181
|
-
- Explore [Styled Components](../styled-components/) for CSS-in-JS with more features
|
|
182
|
-
- Check out [Emotion](../emotion-example/) for similar CSS-in-JS approach (coming soon)
|
|
183
|
-
- Learn about [CSS Modules](../css-modules/) for scoped CSS (coming soon)
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "bootstrap-example",
|
|
3
|
-
"version": "1.0.0",
|
|
4
|
-
"main": "index.js",
|
|
5
|
-
"scripts": {
|
|
6
|
-
"build": "npm run compile && vite build",
|
|
7
|
-
"dev": "vite dev",
|
|
8
|
-
"preview": "vite preview",
|
|
9
|
-
"compile": "babel src --out-dir build --extensions \".jsx,.js\" --out-file-extension .js"
|
|
10
|
-
},
|
|
11
|
-
"keywords": [],
|
|
12
|
-
"author": "",
|
|
13
|
-
"license": "ISC",
|
|
14
|
-
"description": "Jac application: bootstrap-example",
|
|
15
|
-
"type": "module",
|
|
16
|
-
"devDependencies": {
|
|
17
|
-
"@babel/cli": "^7.28.3",
|
|
18
|
-
"@babel/core": "^7.28.5",
|
|
19
|
-
"@babel/preset-env": "^7.28.5",
|
|
20
|
-
"@babel/preset-react": "^7.28.5",
|
|
21
|
-
"vite": "^6.4.1"
|
|
22
|
-
},
|
|
23
|
-
"dependencies": {
|
|
24
|
-
"react": "^19.2.0",
|
|
25
|
-
"react-dom": "^19.2.0",
|
|
26
|
-
"react-router-dom": "^6.30.1"
|
|
27
|
-
}
|
|
28
|
-
}
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
import { defineConfig } from "vite";
|
|
3
|
-
import path from "path";
|
|
4
|
-
import { fileURLToPath } from "url";
|
|
5
|
-
|
|
6
|
-
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
7
|
-
|
|
8
|
-
export default defineConfig({
|
|
9
|
-
root: ".", // base folder
|
|
10
|
-
build: {
|
|
11
|
-
rollupOptions: {
|
|
12
|
-
input: "build/main.js", // your compiled entry file
|
|
13
|
-
output: {
|
|
14
|
-
entryFileNames: "client.[hash].js", // name of the final js file
|
|
15
|
-
assetFileNames: "[name].[ext]",
|
|
16
|
-
},
|
|
17
|
-
},
|
|
18
|
-
outDir: "dist", // final bundled output
|
|
19
|
-
emptyOutDir: true,
|
|
20
|
-
},
|
|
21
|
-
publicDir: false,
|
|
22
|
-
resolve: {
|
|
23
|
-
alias: {
|
|
24
|
-
"@jac-client/utils": path.resolve(__dirname, "src/client_runtime.js"),
|
|
25
|
-
},
|
|
26
|
-
},
|
|
27
|
-
});
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "my-app",
|
|
3
|
-
"version": "1.0.0",
|
|
4
|
-
"main": "index.js",
|
|
5
|
-
"scripts": {
|
|
6
|
-
"build": "npm run compile && vite build",
|
|
7
|
-
"dev": "vite dev",
|
|
8
|
-
"preview": "vite preview",
|
|
9
|
-
"compile": "babel src --out-dir build --extensions \".jsx,.js\" --out-file-extension .js"
|
|
10
|
-
},
|
|
11
|
-
"keywords": [],
|
|
12
|
-
"author": "",
|
|
13
|
-
"license": "ISC",
|
|
14
|
-
"description": "Jac application: my-app",
|
|
15
|
-
"type": "module",
|
|
16
|
-
"devDependencies": {
|
|
17
|
-
"vite": "^6.4.1",
|
|
18
|
-
"@babel/cli": "^7.28.3",
|
|
19
|
-
"@babel/core": "^7.28.5",
|
|
20
|
-
"@babel/preset-env": "^7.28.5",
|
|
21
|
-
"@babel/preset-react": "^7.28.5"
|
|
22
|
-
},
|
|
23
|
-
"dependencies": {
|
|
24
|
-
"react": "^19.2.0",
|
|
25
|
-
"react-dom": "^19.2.0",
|
|
26
|
-
"react-router-dom": "^6.30.1"
|
|
27
|
-
}
|
|
28
|
-
}
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
import { defineConfig } from "vite";
|
|
3
|
-
import path from "path";
|
|
4
|
-
import { fileURLToPath } from "url";
|
|
5
|
-
|
|
6
|
-
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
7
|
-
|
|
8
|
-
export default defineConfig({
|
|
9
|
-
root: ".", // base folder
|
|
10
|
-
build: {
|
|
11
|
-
rollupOptions: {
|
|
12
|
-
input: "build/main.js", // your compiled entry file
|
|
13
|
-
output: {
|
|
14
|
-
entryFileNames: "client.[hash].js", // name of the final js file
|
|
15
|
-
assetFileNames: "[name].[ext]",
|
|
16
|
-
},
|
|
17
|
-
},
|
|
18
|
-
outDir: "dist", // final bundled output
|
|
19
|
-
emptyOutDir: true,
|
|
20
|
-
},
|
|
21
|
-
publicDir: false,
|
|
22
|
-
resolve: {
|
|
23
|
-
alias: {
|
|
24
|
-
"@jac-client/utils": path.resolve(__dirname, "src/client_runtime.js"),
|
|
25
|
-
},
|
|
26
|
-
},
|
|
27
|
-
});
|
jac_client/plugin/cli.py
DELETED
|
@@ -1,244 +0,0 @@
|
|
|
1
|
-
"""Command line interface tool for the Jac Client."""
|
|
2
|
-
|
|
3
|
-
import json
|
|
4
|
-
import os
|
|
5
|
-
import re
|
|
6
|
-
import subprocess
|
|
7
|
-
import sys
|
|
8
|
-
|
|
9
|
-
from jaclang.cli.cmdreg import cmd_registry
|
|
10
|
-
from jaclang.runtimelib.runtime import hookimpl
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
class JacCmd:
|
|
14
|
-
"""Jac CLI."""
|
|
15
|
-
|
|
16
|
-
@staticmethod
|
|
17
|
-
@hookimpl
|
|
18
|
-
def create_cmd() -> None:
|
|
19
|
-
"""Create Jac CLI cmds."""
|
|
20
|
-
|
|
21
|
-
@cmd_registry.register
|
|
22
|
-
def create_jac_app(name: str) -> None:
|
|
23
|
-
"""Create a new Jac application with npm and Vite setup.
|
|
24
|
-
|
|
25
|
-
Bootstraps a new Jac project by creating a temporary directory, initializing
|
|
26
|
-
npm, installing Vite, and setting up the basic project structure.
|
|
27
|
-
|
|
28
|
-
Args:
|
|
29
|
-
name: Name of the project to create
|
|
30
|
-
|
|
31
|
-
Examples:
|
|
32
|
-
jac create_jac_app my-app
|
|
33
|
-
jac create_jac_app my-jac-project
|
|
34
|
-
"""
|
|
35
|
-
if not name:
|
|
36
|
-
print(
|
|
37
|
-
"Error: Project name is required. Use --name=your-project-name",
|
|
38
|
-
file=sys.stderr,
|
|
39
|
-
)
|
|
40
|
-
exit(1)
|
|
41
|
-
|
|
42
|
-
# Validate project name (basic npm package name validation)
|
|
43
|
-
if not re.match(r"^[a-zA-Z0-9_-]+$", name):
|
|
44
|
-
print(
|
|
45
|
-
"Error: Project name must contain only letters, numbers, hyphens, and underscores",
|
|
46
|
-
file=sys.stderr,
|
|
47
|
-
)
|
|
48
|
-
exit(1)
|
|
49
|
-
|
|
50
|
-
print(f"Creating new Jac application: {name}")
|
|
51
|
-
|
|
52
|
-
# Create project directory in current working directory
|
|
53
|
-
project_path = os.path.join(os.getcwd(), name)
|
|
54
|
-
|
|
55
|
-
if os.path.exists(project_path):
|
|
56
|
-
print(
|
|
57
|
-
f"Error: Directory '{name}' already exists in current location",
|
|
58
|
-
file=sys.stderr,
|
|
59
|
-
)
|
|
60
|
-
exit(1)
|
|
61
|
-
|
|
62
|
-
os.makedirs(project_path, exist_ok=True)
|
|
63
|
-
|
|
64
|
-
try:
|
|
65
|
-
# Change to project directory
|
|
66
|
-
original_cwd = os.getcwd()
|
|
67
|
-
os.chdir(project_path)
|
|
68
|
-
|
|
69
|
-
# Initialize npm package
|
|
70
|
-
print("Initializing npm package...")
|
|
71
|
-
npm_init_cmd = ["npm", "init", "-y"]
|
|
72
|
-
subprocess.run(npm_init_cmd, capture_output=True, text=True, check=True)
|
|
73
|
-
|
|
74
|
-
# Read the generated package.json
|
|
75
|
-
package_json_path = os.path.join(project_path, "package.json")
|
|
76
|
-
with open(package_json_path) as f:
|
|
77
|
-
package_data = json.load(f)
|
|
78
|
-
|
|
79
|
-
# create temp folder
|
|
80
|
-
src_folder = os.path.join(project_path, "src")
|
|
81
|
-
os.makedirs(src_folder, exist_ok=True)
|
|
82
|
-
|
|
83
|
-
# create build folder
|
|
84
|
-
build_folder = os.path.join(project_path, "build")
|
|
85
|
-
os.makedirs(build_folder, exist_ok=True)
|
|
86
|
-
|
|
87
|
-
# create assets folder for static assets (images, fonts, etc.)
|
|
88
|
-
assets_folder = os.path.join(project_path, "assets")
|
|
89
|
-
os.makedirs(assets_folder, exist_ok=True)
|
|
90
|
-
|
|
91
|
-
# Update package.json with Jac-specific configuration
|
|
92
|
-
package_data.update(
|
|
93
|
-
{
|
|
94
|
-
"name": name,
|
|
95
|
-
"description": f"Jac application: {name}",
|
|
96
|
-
"type": "module",
|
|
97
|
-
"scripts": {
|
|
98
|
-
"build": "npm run compile && vite build",
|
|
99
|
-
"dev": "vite dev",
|
|
100
|
-
"preview": "vite preview",
|
|
101
|
-
"compile": 'babel src --out-dir build --extensions ".jsx,.js" --out-file-extension .js',
|
|
102
|
-
},
|
|
103
|
-
"devDependencies": {
|
|
104
|
-
"vite": "^6.4.1",
|
|
105
|
-
"@babel/cli": "^7.28.3",
|
|
106
|
-
"@babel/core": "^7.28.5",
|
|
107
|
-
"@babel/preset-env": "^7.28.5",
|
|
108
|
-
"@babel/preset-react": "^7.28.5",
|
|
109
|
-
},
|
|
110
|
-
"dependencies": {
|
|
111
|
-
"react": "^19.2.0",
|
|
112
|
-
"react-dom": "^19.2.0",
|
|
113
|
-
"react-router-dom": "^6.30.1",
|
|
114
|
-
},
|
|
115
|
-
}
|
|
116
|
-
)
|
|
117
|
-
|
|
118
|
-
# Write updated package.json
|
|
119
|
-
with open(package_json_path, "w") as f:
|
|
120
|
-
json.dump(package_data, f, indent=2)
|
|
121
|
-
|
|
122
|
-
print("Installing Vite...")
|
|
123
|
-
# Install Vite
|
|
124
|
-
npm_install_cmd = ["npm", "install"]
|
|
125
|
-
subprocess.run(
|
|
126
|
-
npm_install_cmd, capture_output=True, text=True, check=True
|
|
127
|
-
)
|
|
128
|
-
|
|
129
|
-
# Create basic project structure
|
|
130
|
-
print("Setting up project structure...")
|
|
131
|
-
|
|
132
|
-
# Create a basic Jac file
|
|
133
|
-
main_jac_content = """
|
|
134
|
-
# Pages
|
|
135
|
-
cl import from react {useState, useEffect}
|
|
136
|
-
cl {
|
|
137
|
-
def app() -> any {
|
|
138
|
-
let [count, setCount] = useState(0);
|
|
139
|
-
useEffect(lambda -> None {
|
|
140
|
-
console.log("Count: ", count);
|
|
141
|
-
}, [count]);
|
|
142
|
-
return <div>
|
|
143
|
-
<h1>Hello, World!</h1>
|
|
144
|
-
<p>Count: {count}</p>
|
|
145
|
-
<button onClick={lambda e: any -> None {setCount(count + 1);}}>Increment</button>
|
|
146
|
-
</div>;
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
"""
|
|
150
|
-
|
|
151
|
-
with open(os.path.join(project_path, "app.jac"), "w") as f:
|
|
152
|
-
f.write(main_jac_content)
|
|
153
|
-
|
|
154
|
-
# create .babelrc file
|
|
155
|
-
babel_config_content = """
|
|
156
|
-
{
|
|
157
|
-
"presets": [[
|
|
158
|
-
"@babel/preset-env",
|
|
159
|
-
{
|
|
160
|
-
"modules": false
|
|
161
|
-
}
|
|
162
|
-
], "@babel/preset-react"]
|
|
163
|
-
}
|
|
164
|
-
"""
|
|
165
|
-
with open(os.path.join(project_path, ".babelrc"), "w") as f:
|
|
166
|
-
f.write(babel_config_content)
|
|
167
|
-
|
|
168
|
-
# create vite.config.js file
|
|
169
|
-
vite_config_content = """
|
|
170
|
-
import { defineConfig } from "vite";
|
|
171
|
-
import path from "path";
|
|
172
|
-
import { fileURLToPath } from "url";
|
|
173
|
-
|
|
174
|
-
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
175
|
-
|
|
176
|
-
export default defineConfig({
|
|
177
|
-
root: ".", // base folder
|
|
178
|
-
build: {
|
|
179
|
-
rollupOptions: {
|
|
180
|
-
input: "build/main.js", // your compiled entry file
|
|
181
|
-
output: {
|
|
182
|
-
entryFileNames: "client.[hash].js", // name of the final js file
|
|
183
|
-
assetFileNames: "[name].[ext]",
|
|
184
|
-
},
|
|
185
|
-
},
|
|
186
|
-
outDir: "dist", // final bundled output
|
|
187
|
-
emptyOutDir: true,
|
|
188
|
-
},
|
|
189
|
-
publicDir: false,
|
|
190
|
-
resolve: {
|
|
191
|
-
alias: {
|
|
192
|
-
"@jac-client/utils": path.resolve(__dirname, "src/client_runtime.js"),
|
|
193
|
-
"@jac-client/assets": path.resolve(__dirname, "src/assets"),
|
|
194
|
-
},
|
|
195
|
-
},
|
|
196
|
-
});
|
|
197
|
-
|
|
198
|
-
"""
|
|
199
|
-
with open(os.path.join(project_path, "vite.config.js"), "w") as f:
|
|
200
|
-
f.write(vite_config_content)
|
|
201
|
-
|
|
202
|
-
# Create README.md
|
|
203
|
-
readme_content = f"""# {name}
|
|
204
|
-
|
|
205
|
-
## Running Jac Code
|
|
206
|
-
|
|
207
|
-
make sure node modules are installed:
|
|
208
|
-
```bash
|
|
209
|
-
npm install
|
|
210
|
-
```
|
|
211
|
-
|
|
212
|
-
To run your Jac code, use the Jac CLI:
|
|
213
|
-
|
|
214
|
-
```bash
|
|
215
|
-
jac serve app.jac
|
|
216
|
-
```
|
|
217
|
-
|
|
218
|
-
Happy coding with Jac!
|
|
219
|
-
"""
|
|
220
|
-
|
|
221
|
-
with open(os.path.join(project_path, "README.md"), "w") as f:
|
|
222
|
-
f.write(readme_content)
|
|
223
|
-
|
|
224
|
-
# Return to original directory
|
|
225
|
-
os.chdir(original_cwd)
|
|
226
|
-
|
|
227
|
-
print(f"✅ Successfully created Jac application '{name}'!")
|
|
228
|
-
print(f"📁 Project location: {os.path.abspath(project_path)}")
|
|
229
|
-
print("\nNext steps:")
|
|
230
|
-
print(f" cd {name}")
|
|
231
|
-
print(" jac serve app.jac")
|
|
232
|
-
|
|
233
|
-
except subprocess.CalledProcessError as e:
|
|
234
|
-
# Return to original directory on error
|
|
235
|
-
os.chdir(original_cwd)
|
|
236
|
-
print(f"Error running npm command: {e}", file=sys.stderr)
|
|
237
|
-
print(f"Command output: {e.stdout}", file=sys.stderr)
|
|
238
|
-
print(f"Command error: {e.stderr}", file=sys.stderr)
|
|
239
|
-
exit(1)
|
|
240
|
-
except Exception as e:
|
|
241
|
-
# Return to original directory on error
|
|
242
|
-
os.chdir(original_cwd)
|
|
243
|
-
print(f"Error creating project: {e}", file=sys.stderr)
|
|
244
|
-
exit(1)
|