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.
Files changed (202) hide show
  1. jac_client/examples/all-in-one/assets/workers/worker.py +5 -0
  2. jac_client/examples/all-in-one/src/app.jac +841 -0
  3. jac_client/examples/all-in-one/{button.jac → src/button.jac} +1 -1
  4. jac_client/examples/all-in-one/{components → src/components}/button.jac +1 -1
  5. jac_client/examples/asset-serving/css-with-image/{app.jac → src/app.jac} +2 -2
  6. jac_client/examples/asset-serving/image-asset/{app.jac → src/app.jac} +2 -2
  7. jac_client/examples/asset-serving/import-alias/{app.jac → src/app.jac} +3 -3
  8. jac_client/examples/basic/{app.jac → src/app.jac} +2 -2
  9. jac_client/examples/basic-auth/src/app.jac +377 -0
  10. jac_client/examples/basic-auth-with-router/{app.jac → src/app.jac} +18 -18
  11. jac_client/examples/basic-full-stack/{app.jac → src/app.jac} +175 -130
  12. jac_client/examples/css-styling/js-styling/{app.jac → src/app.jac} +6 -6
  13. jac_client/examples/css-styling/material-ui/{app.jac → src/app.jac} +5 -5
  14. jac_client/examples/css-styling/pure-css/{app.jac → src/app.jac} +6 -6
  15. jac_client/examples/css-styling/sass-example/{app.jac → src/app.jac} +6 -6
  16. jac_client/examples/css-styling/styled-components/{app.jac → src/app.jac} +5 -5
  17. jac_client/examples/css-styling/tailwind-example/{app.jac → src/app.jac} +6 -6
  18. jac_client/examples/full-stack-with-auth/{app.jac → src/app.jac} +37 -37
  19. jac_client/examples/little-x/{app.jac → src/app.jac} +27 -32
  20. jac_client/examples/little-x/src/submit-button.jac +16 -0
  21. jac_client/examples/nested-folders/nested-advance/{ButtonRoot.jac → src/ButtonRoot.jac} +1 -1
  22. jac_client/examples/nested-folders/nested-advance/{app.jac → src/app.jac} +1 -1
  23. jac_client/examples/nested-folders/nested-advance/{level1 → src/level1}/ButtonSecondL.jac +1 -1
  24. jac_client/examples/nested-folders/nested-advance/{level1 → src/level1}/Card.jac +1 -1
  25. jac_client/examples/nested-folders/nested-advance/{level1 → src/level1}/level2/ButtonThirdL.jac +1 -1
  26. jac_client/examples/nested-folders/nested-basic/{app.jac → src/app.jac} +2 -2
  27. jac_client/examples/nested-folders/nested-basic/{button.jac → src/button.jac} +1 -1
  28. jac_client/examples/nested-folders/nested-basic/{components → src/components}/button.jac +1 -1
  29. jac_client/examples/ts-support/src/app.jac +35 -0
  30. jac_client/examples/with-router/{app.jac → src/app.jac} +11 -11
  31. jac_client/plugin/cli.jac +547 -0
  32. jac_client/plugin/client.jac +52 -0
  33. jac_client/plugin/client_runtime.cl.jac +38 -0
  34. jac_client/plugin/impl/client.impl.jac +134 -0
  35. jac_client/plugin/impl/client_runtime.impl.jac +177 -0
  36. jac_client/plugin/impl/vite_client_bundle.impl.jac +72 -0
  37. jac_client/plugin/plugin_config.jac +195 -0
  38. jac_client/plugin/src/__init__.jac +20 -0
  39. jac_client/plugin/src/asset_processor.jac +33 -0
  40. jac_client/plugin/src/babel_processor.jac +18 -0
  41. jac_client/plugin/src/compiler.jac +66 -0
  42. jac_client/plugin/src/config_loader.jac +32 -0
  43. jac_client/plugin/src/impl/asset_processor.impl.jac +127 -0
  44. jac_client/plugin/src/impl/babel_processor.impl.jac +84 -0
  45. jac_client/plugin/src/impl/compiler.impl.jac +251 -0
  46. jac_client/plugin/src/impl/config_loader.impl.jac +119 -0
  47. jac_client/plugin/src/impl/import_processor.impl.jac +33 -0
  48. jac_client/plugin/src/impl/jac_to_js.impl.jac +41 -0
  49. jac_client/plugin/src/impl/package_installer.impl.jac +105 -0
  50. jac_client/plugin/src/impl/vite_bundler.impl.jac +513 -0
  51. jac_client/plugin/src/import_processor.jac +19 -0
  52. jac_client/plugin/src/jac_to_js.jac +35 -0
  53. jac_client/plugin/src/package_installer.jac +26 -0
  54. jac_client/plugin/src/vite_bundler.jac +36 -0
  55. jac_client/plugin/vite_client_bundle.jac +31 -0
  56. jac_client/tests/conftest.py +281 -0
  57. jac_client/tests/fixtures/basic-app/app.jac +2 -2
  58. jac_client/tests/fixtures/cl_file/app.cl.jac +2 -2
  59. jac_client/tests/fixtures/client_app_with_antd/app.jac +1 -1
  60. jac_client/tests/fixtures/js_import/app.jac +5 -5
  61. jac_client/tests/fixtures/spawn_test/app.jac +7 -7
  62. jac_client/tests/fixtures/with-ts/app.jac +35 -0
  63. jac_client/tests/test_cli.py +755 -0
  64. jac_client/tests/test_it.py +347 -67
  65. {jac_client-0.2.3.dist-info → jac_client-0.2.5.dist-info}/METADATA +28 -30
  66. jac_client-0.2.5.dist-info/RECORD +74 -0
  67. {jac_client-0.2.3.dist-info → jac_client-0.2.5.dist-info}/WHEEL +2 -1
  68. jac_client-0.2.5.dist-info/entry_points.txt +4 -0
  69. jac_client-0.2.5.dist-info/top_level.txt +1 -0
  70. jac_client/docs/README.md +0 -689
  71. jac_client/docs/advanced-state.md +0 -1265
  72. jac_client/docs/asset-serving/intro.md +0 -209
  73. jac_client/docs/assets/pipe_line-v2.svg +0 -32
  74. jac_client/docs/assets/pipe_line.png +0 -0
  75. jac_client/docs/file-system/app.jac.md +0 -121
  76. jac_client/docs/file-system/backend-frontend.md +0 -217
  77. jac_client/docs/file-system/intro.md +0 -72
  78. jac_client/docs/file-system/nested-imports.md +0 -348
  79. jac_client/docs/guide-example/intro.md +0 -115
  80. jac_client/docs/guide-example/step-01-setup.md +0 -270
  81. jac_client/docs/guide-example/step-02-components.md +0 -416
  82. jac_client/docs/guide-example/step-03-styling.md +0 -478
  83. jac_client/docs/guide-example/step-04-todo-ui.md +0 -477
  84. jac_client/docs/guide-example/step-05-local-state.md +0 -530
  85. jac_client/docs/guide-example/step-06-events.md +0 -749
  86. jac_client/docs/guide-example/step-07-effects.md +0 -468
  87. jac_client/docs/guide-example/step-08-walkers.md +0 -534
  88. jac_client/docs/guide-example/step-09-authentication.md +0 -586
  89. jac_client/docs/guide-example/step-10-routing.md +0 -539
  90. jac_client/docs/guide-example/step-11-final.md +0 -963
  91. jac_client/docs/imports.md +0 -1141
  92. jac_client/docs/lifecycle-hooks.md +0 -773
  93. jac_client/docs/routing.md +0 -659
  94. jac_client/docs/styling/intro.md +0 -249
  95. jac_client/docs/styling/js-styling.md +0 -367
  96. jac_client/docs/styling/material-ui.md +0 -341
  97. jac_client/docs/styling/pure-css.md +0 -299
  98. jac_client/docs/styling/sass.md +0 -403
  99. jac_client/docs/styling/styled-components.md +0 -395
  100. jac_client/docs/styling/tailwind.md +0 -298
  101. jac_client/examples/all-in-one/.babelrc +0 -9
  102. jac_client/examples/all-in-one/README.md +0 -16
  103. jac_client/examples/all-in-one/app.jac +0 -426
  104. jac_client/examples/all-in-one/assets/burger.png +0 -0
  105. jac_client/examples/all-in-one/package.json +0 -29
  106. jac_client/examples/all-in-one/styles.css +0 -26
  107. jac_client/examples/all-in-one/vite.config.js +0 -28
  108. jac_client/examples/asset-serving/css-with-image/.babelrc +0 -9
  109. jac_client/examples/asset-serving/css-with-image/README.md +0 -91
  110. jac_client/examples/asset-serving/css-with-image/assets/burger.png +0 -0
  111. jac_client/examples/asset-serving/css-with-image/package.json +0 -28
  112. jac_client/examples/asset-serving/css-with-image/styles.css +0 -26
  113. jac_client/examples/asset-serving/css-with-image/vite.config.js +0 -28
  114. jac_client/examples/asset-serving/image-asset/.babelrc +0 -9
  115. jac_client/examples/asset-serving/image-asset/README.md +0 -119
  116. jac_client/examples/asset-serving/image-asset/assets/burger.png +0 -0
  117. jac_client/examples/asset-serving/image-asset/package.json +0 -28
  118. jac_client/examples/asset-serving/image-asset/styles.css +0 -26
  119. jac_client/examples/asset-serving/image-asset/vite.config.js +0 -28
  120. jac_client/examples/asset-serving/import-alias/.babelrc +0 -9
  121. jac_client/examples/asset-serving/import-alias/README.md +0 -83
  122. jac_client/examples/asset-serving/import-alias/assets/burger.png +0 -0
  123. jac_client/examples/asset-serving/import-alias/package.json +0 -28
  124. jac_client/examples/asset-serving/import-alias/vite.config.js +0 -28
  125. jac_client/examples/basic/.babelrc +0 -9
  126. jac_client/examples/basic/README.md +0 -16
  127. jac_client/examples/basic/package.json +0 -27
  128. jac_client/examples/basic/vite.config.js +0 -27
  129. jac_client/examples/basic-auth/.babelrc +0 -9
  130. jac_client/examples/basic-auth/README.md +0 -16
  131. jac_client/examples/basic-auth/app.jac +0 -308
  132. jac_client/examples/basic-auth/package.json +0 -27
  133. jac_client/examples/basic-auth/vite.config.js +0 -27
  134. jac_client/examples/basic-auth-with-router/.babelrc +0 -9
  135. jac_client/examples/basic-auth-with-router/README.md +0 -60
  136. jac_client/examples/basic-auth-with-router/package.json +0 -28
  137. jac_client/examples/basic-auth-with-router/vite.config.js +0 -27
  138. jac_client/examples/basic-full-stack/.babelrc +0 -9
  139. jac_client/examples/basic-full-stack/README.md +0 -18
  140. jac_client/examples/basic-full-stack/package.json +0 -28
  141. jac_client/examples/basic-full-stack/vite.config.js +0 -27
  142. jac_client/examples/css-styling/js-styling/.babelrc +0 -9
  143. jac_client/examples/css-styling/js-styling/README.md +0 -183
  144. jac_client/examples/css-styling/js-styling/package.json +0 -28
  145. jac_client/examples/css-styling/js-styling/styles.js +0 -100
  146. jac_client/examples/css-styling/js-styling/vite.config.js +0 -27
  147. jac_client/examples/css-styling/material-ui/.babelrc +0 -9
  148. jac_client/examples/css-styling/material-ui/README.md +0 -16
  149. jac_client/examples/css-styling/material-ui/package.json +0 -32
  150. jac_client/examples/css-styling/material-ui/vite.config.js +0 -27
  151. jac_client/examples/css-styling/pure-css/.babelrc +0 -9
  152. jac_client/examples/css-styling/pure-css/README.md +0 -16
  153. jac_client/examples/css-styling/pure-css/package.json +0 -28
  154. jac_client/examples/css-styling/pure-css/styles.css +0 -111
  155. jac_client/examples/css-styling/pure-css/vite.config.js +0 -27
  156. jac_client/examples/css-styling/sass-example/.babelrc +0 -9
  157. jac_client/examples/css-styling/sass-example/README.md +0 -16
  158. jac_client/examples/css-styling/sass-example/package.json +0 -29
  159. jac_client/examples/css-styling/sass-example/styles.scss +0 -153
  160. jac_client/examples/css-styling/sass-example/vite.config.js +0 -27
  161. jac_client/examples/css-styling/styled-components/.babelrc +0 -9
  162. jac_client/examples/css-styling/styled-components/README.md +0 -16
  163. jac_client/examples/css-styling/styled-components/package.json +0 -29
  164. jac_client/examples/css-styling/styled-components/styled.js +0 -90
  165. jac_client/examples/css-styling/styled-components/vite.config.js +0 -27
  166. jac_client/examples/css-styling/tailwind-example/.babelrc +0 -9
  167. jac_client/examples/css-styling/tailwind-example/README.md +0 -16
  168. jac_client/examples/css-styling/tailwind-example/global.css +0 -1
  169. jac_client/examples/css-styling/tailwind-example/package.json +0 -30
  170. jac_client/examples/css-styling/tailwind-example/vite.config.js +0 -29
  171. jac_client/examples/full-stack-with-auth/.babelrc +0 -9
  172. jac_client/examples/full-stack-with-auth/README.md +0 -16
  173. jac_client/examples/full-stack-with-auth/package.json +0 -28
  174. jac_client/examples/full-stack-with-auth/vite.config.js +0 -29
  175. jac_client/examples/little-x/package.json +0 -23
  176. jac_client/examples/little-x/submit-button.jac +0 -8
  177. jac_client/examples/nested-folders/nested-advance/.babelrc +0 -9
  178. jac_client/examples/nested-folders/nested-advance/README.md +0 -77
  179. jac_client/examples/nested-folders/nested-advance/package.json +0 -29
  180. jac_client/examples/nested-folders/nested-advance/vite.config.js +0 -28
  181. jac_client/examples/nested-folders/nested-basic/.babelrc +0 -9
  182. jac_client/examples/nested-folders/nested-basic/README.md +0 -183
  183. jac_client/examples/nested-folders/nested-basic/app.js +0 -7
  184. jac_client/examples/nested-folders/nested-basic/package.json +0 -28
  185. jac_client/examples/nested-folders/nested-basic/vite.config.js +0 -27
  186. jac_client/examples/with-router/.babelrc +0 -9
  187. jac_client/examples/with-router/README.md +0 -17
  188. jac_client/examples/with-router/package.json +0 -28
  189. jac_client/examples/with-router/vite.config.js +0 -27
  190. jac_client/plugin/cli.py +0 -244
  191. jac_client/plugin/client.py +0 -152
  192. jac_client/plugin/client_runtime.jac +0 -234
  193. jac_client/plugin/vite_client_bundle.py +0 -503
  194. jac_client/tests/fixtures/js_import/utils.js +0 -21
  195. jac_client/tests/fixtures/package-lock.json +0 -329
  196. jac_client/tests/fixtures/package.json +0 -11
  197. jac_client/tests/test_asset_examples.py +0 -322
  198. jac_client/tests/test_cl.py +0 -530
  199. jac_client/tests/test_create_jac_app.py +0 -131
  200. jac_client/tests/test_nested_file.py +0 -374
  201. jac_client-0.2.3.dist-info/RECORD +0 -171
  202. 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,9 +0,0 @@
1
-
2
- {
3
- "presets": [[
4
- "@babel/preset-env",
5
- {
6
- "modules": false
7
- }
8
- ], "@babel/preset-react"]
9
- }
@@ -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,7 +0,0 @@
1
- import { CustomButton } from "./components/button.js";
2
- function RelativeImport() {
3
- return __jacJsx("div", {}, [__jacJsx(CustomButton, {}, [])]);
4
- }
5
- function app() {
6
- return __jacJsx(RelativeImport, {}, []);
7
- }
@@ -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,9 +0,0 @@
1
-
2
- {
3
- "presets": [[
4
- "@babel/preset-env",
5
- {
6
- "modules": false
7
- }
8
- ], "@babel/preset-react"]
9
- }
@@ -1,17 +0,0 @@
1
- # my-app
2
-
3
- make sure node modules are installed:
4
- ```bash
5
- npm install
6
- ```
7
-
8
-
9
- ## Running Jac Code
10
-
11
- To run your Jac code, use the Jac CLI:
12
-
13
- ```bash
14
- jac serve app.jac
15
- ```
16
-
17
- Happy coding with Jac!
@@ -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)