frontend-hamroun 1.2.74 → 1.2.77

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 (194) hide show
  1. package/dist/Counter.d.ts +0 -0
  2. package/dist/batch/package.json +16 -0
  3. package/dist/client-router/package.json +16 -0
  4. package/dist/component/package.json +16 -0
  5. package/dist/context/package.json +16 -0
  6. package/dist/event-bus/package.json +16 -0
  7. package/dist/forms/package.json +16 -0
  8. package/dist/hooks/package.json +16 -0
  9. package/dist/hooks-0728361a.cjs +1 -0
  10. package/dist/hooks-b58f947c.js +133 -0
  11. package/dist/hooks.js +1 -0
  12. package/dist/hooks.mjs +13 -0
  13. package/dist/index.js +1 -384
  14. package/dist/index.mjs +130 -374
  15. package/dist/jsx-runtime/package.json +16 -0
  16. package/dist/jsx-runtime.js +1 -0
  17. package/dist/jsx-runtime.mjs +64 -0
  18. package/dist/lifecycle-events/package.json +16 -0
  19. package/dist/package.json +71 -0
  20. package/dist/render-component/package.json +16 -0
  21. package/dist/renderer/package.json +16 -0
  22. package/dist/renderer.js +1 -0
  23. package/dist/renderer.mjs +27 -0
  24. package/dist/router/package.json +16 -0
  25. package/dist/server/package.json +17 -0
  26. package/dist/server/src/batch.d.ts +3 -0
  27. package/dist/server/src/batch.js +23 -0
  28. package/dist/server/src/batch.js.map +1 -0
  29. package/dist/server/src/client-router.d.ts +60 -0
  30. package/dist/server/src/client-router.js +210 -0
  31. package/dist/server/src/client-router.js.map +1 -0
  32. package/dist/server/src/component.d.ts +14 -0
  33. package/dist/server/src/component.js +106 -0
  34. package/dist/server/src/component.js.map +1 -0
  35. package/dist/server/src/context.d.ts +13 -0
  36. package/dist/server/src/context.js +21 -0
  37. package/dist/server/src/context.js.map +1 -0
  38. package/dist/server/src/event-bus.d.ts +23 -0
  39. package/dist/server/src/event-bus.js +75 -0
  40. package/dist/server/src/event-bus.js.map +1 -0
  41. package/dist/server/src/forms.d.ts +40 -0
  42. package/dist/server/src/forms.js +148 -0
  43. package/dist/server/src/forms.js.map +1 -0
  44. package/dist/server/src/hooks.d.ts +12 -0
  45. package/dist/server/src/hooks.js +170 -0
  46. package/dist/server/src/hooks.js.map +1 -0
  47. package/dist/server/src/index.client.d.ts +12 -0
  48. package/dist/server/src/index.client.js +14 -0
  49. package/dist/server/src/index.client.js.map +1 -0
  50. package/dist/server/src/index.d.ts +88 -0
  51. package/dist/server/src/index.js +78 -0
  52. package/dist/server/src/index.js.map +1 -0
  53. package/dist/server/src/jsx-runtime/jsx-dev-runtime.d.ts +1 -0
  54. package/dist/server/src/jsx-runtime/jsx-dev-runtime.js +2 -0
  55. package/dist/server/src/jsx-runtime/jsx-dev-runtime.js.map +1 -0
  56. package/dist/server/src/jsx-runtime/jsx-runtime.d.ts +4 -0
  57. package/dist/server/src/jsx-runtime/jsx-runtime.js +41 -0
  58. package/dist/server/src/jsx-runtime/jsx-runtime.js.map +1 -0
  59. package/dist/server/src/jsx-runtime.d.ts +20 -0
  60. package/dist/server/src/jsx-runtime.js +105 -0
  61. package/dist/server/src/jsx-runtime.js.map +1 -0
  62. package/dist/server/src/lifecycle-events.d.ts +108 -0
  63. package/dist/server/src/lifecycle-events.js +177 -0
  64. package/dist/server/src/lifecycle-events.js.map +1 -0
  65. package/dist/server/src/renderComponent.d.ts +14 -0
  66. package/dist/server/src/renderComponent.js +25 -0
  67. package/dist/server/src/renderComponent.js.map +1 -0
  68. package/dist/server/src/renderer.d.ts +2 -0
  69. package/dist/server/src/renderer.js +31 -0
  70. package/dist/server/src/renderer.js.map +1 -0
  71. package/dist/server/src/router.d.ts +55 -0
  72. package/dist/server/src/router.js +166 -0
  73. package/dist/server/src/router.js.map +1 -0
  74. package/dist/server/src/server/api-router.d.ts +15 -0
  75. package/dist/server/src/server/api-router.js +111 -0
  76. package/dist/server/src/server/api-router.js.map +1 -0
  77. package/dist/server/src/server/auth.d.ts +32 -0
  78. package/dist/server/src/server/auth.js +80 -0
  79. package/dist/server/src/server/auth.js.map +1 -0
  80. package/dist/server/src/server/database.d.ts +24 -0
  81. package/dist/server/src/server/database.js +135 -0
  82. package/dist/server/src/server/database.js.map +1 -0
  83. package/dist/server/src/server/index.d.ts +127 -0
  84. package/dist/server/src/server/index.js +388 -0
  85. package/dist/server/src/server/index.js.map +1 -0
  86. package/dist/server/src/server/middleware.d.ts +11 -0
  87. package/dist/server/src/server/middleware.js +46 -0
  88. package/dist/server/src/server/middleware.js.map +1 -0
  89. package/dist/server/src/server/server.d.ts +9 -0
  90. package/dist/server/src/server/server.js +87 -0
  91. package/dist/server/src/server/server.js.map +1 -0
  92. package/dist/server/src/server/templates.d.ts +28 -0
  93. package/dist/server/src/server/templates.js +204 -0
  94. package/dist/server/src/server/templates.js.map +1 -0
  95. package/dist/server/src/server/types.d.ts +38 -0
  96. package/dist/server/src/server/types.js +4 -0
  97. package/dist/server/src/server/types.js.map +1 -0
  98. package/dist/server/src/server/utils.d.ts +70 -0
  99. package/dist/server/src/server/utils.js +156 -0
  100. package/dist/server/src/server/utils.js.map +1 -0
  101. package/dist/server/src/server/wasm.d.ts +9 -0
  102. package/dist/server/src/server/wasm.js +117 -0
  103. package/dist/server/src/server/wasm.js.map +1 -0
  104. package/dist/server/src/server-renderer.d.ts +5 -0
  105. package/dist/server/src/server-renderer.js +106 -0
  106. package/dist/server/src/server-renderer.js.map +1 -0
  107. package/dist/server/src/server-types.d.ts +42 -0
  108. package/dist/server/src/server-types.js +6 -0
  109. package/dist/server/src/server-types.js.map +1 -0
  110. package/dist/server/src/store.d.ts +41 -0
  111. package/dist/server/src/store.js +99 -0
  112. package/dist/server/src/store.js.map +1 -0
  113. package/dist/server/src/types.d.ts +19 -0
  114. package/dist/server/src/types.js +2 -0
  115. package/dist/server/src/types.js.map +1 -0
  116. package/dist/server/src/utils.d.ts +46 -0
  117. package/dist/server/src/utils.js +144 -0
  118. package/dist/server/src/utils.js.map +1 -0
  119. package/dist/server/src/vdom.d.ts +8 -0
  120. package/dist/server/src/vdom.js +22 -0
  121. package/dist/server/src/vdom.js.map +1 -0
  122. package/dist/server/src/wasm.d.ts +36 -0
  123. package/dist/server/src/wasm.js +159 -0
  124. package/dist/server/src/wasm.js.map +1 -0
  125. package/dist/server/tsconfig.server.tsbuildinfo +1 -0
  126. package/dist/server-renderer/package.json +16 -0
  127. package/dist/server-renderer.js +1 -0
  128. package/dist/server-renderer.mjs +64 -0
  129. package/dist/store/package.json +16 -0
  130. package/dist/types/package.json +16 -0
  131. package/dist/utils/package.json +16 -0
  132. package/dist/vdom/package.json +16 -0
  133. package/dist/wasm/package.json +16 -0
  134. package/dist/wasm.js +1 -0
  135. package/dist/wasm.mjs +103 -0
  136. package/package.json +14 -13
  137. package/templates/complete-app/build.js +284 -0
  138. package/templates/complete-app/package.json +40 -0
  139. package/templates/complete-app/public/styles.css +345 -0
  140. package/templates/complete-app/src/api/index.js +31 -0
  141. package/templates/complete-app/src/client.js +93 -0
  142. package/templates/complete-app/src/components/App.js +66 -0
  143. package/templates/complete-app/src/components/Footer.js +19 -0
  144. package/templates/complete-app/src/components/Header.js +38 -0
  145. package/templates/complete-app/src/pages/About.js +59 -0
  146. package/templates/complete-app/src/pages/Home.js +54 -0
  147. package/templates/complete-app/src/pages/WasmDemo.js +136 -0
  148. package/templates/complete-app/src/server.js +186 -0
  149. package/templates/complete-app/src/wasm/build.bat +16 -0
  150. package/templates/complete-app/src/wasm/build.sh +16 -0
  151. package/templates/complete-app/src/wasm/example.go +101 -0
  152. package/templates/fullstack-app/build/main.css +225 -15
  153. package/templates/fullstack-app/build/main.css.map +2 -2
  154. package/templates/fullstack-app/build/main.js +657 -372
  155. package/templates/fullstack-app/build/main.js.map +4 -4
  156. package/templates/fullstack-app/build.ts +3 -4
  157. package/templates/fullstack-app/public/styles.css +222 -15
  158. package/templates/fullstack-app/server.ts +46 -12
  159. package/templates/fullstack-app/src/components/ClientHome.tsx +0 -0
  160. package/templates/fullstack-app/src/components/ErrorBoundary.tsx +36 -0
  161. package/templates/fullstack-app/src/components/Layout.tsx +23 -26
  162. package/templates/fullstack-app/src/components/StateDemo.tsx +207 -0
  163. package/templates/fullstack-app/src/components/UserList.tsx +30 -13
  164. package/templates/fullstack-app/src/data/api.ts +173 -38
  165. package/templates/fullstack-app/src/main.tsx +88 -154
  166. package/templates/fullstack-app/src/middleware.ts +28 -0
  167. package/templates/fullstack-app/src/pages/404.tsx +28 -0
  168. package/templates/fullstack-app/src/pages/[id].tsx +0 -0
  169. package/templates/fullstack-app/src/pages/_app.tsx +11 -0
  170. package/templates/fullstack-app/src/pages/_document.tsx +25 -0
  171. package/templates/fullstack-app/src/pages/_error.tsx +45 -0
  172. package/templates/fullstack-app/src/pages/about.tsx +71 -0
  173. package/templates/fullstack-app/src/pages/api/users/[id].ts +73 -0
  174. package/templates/fullstack-app/src/pages/api/users/index.ts +43 -0
  175. package/templates/fullstack-app/src/pages/index.tsx +97 -20
  176. package/templates/fullstack-app/src/pages/users/[id].tsx +153 -0
  177. package/templates/fullstack-app/src/pages/wasm-demo.tsx +1 -0
  178. package/templates/go/build.sh +43 -43
  179. package/templates/go/example.go +99 -86
  180. package/templates/go-wasm-app/babel.config.js +8 -2
  181. package/templates/go-wasm-app/build-wasm.js +84 -84
  182. package/templates/go-wasm-app/build.config.js +62 -0
  183. package/templates/go-wasm-app/build.js +218 -0
  184. package/templates/go-wasm-app/package.json +21 -11
  185. package/templates/go-wasm-app/public/index.html +49 -53
  186. package/templates/go-wasm-app/server.js +56 -695
  187. package/templates/go-wasm-app/src/app.js +173 -0
  188. package/templates/go-wasm-app/vite.config.js +16 -5
  189. package/templates/ssr-template/client.js +54 -26
  190. package/templates/ssr-template/server.js +5 -28
  191. package/templates/ssr-template/vite.config.js +21 -5
  192. package/dist/index.d.ts +0 -1
  193. package/dist/index.js.map +0 -1
  194. package/dist/index.mjs.map +0 -1
@@ -32,86 +32,7 @@ function ensureDir(dir) {
32
32
  }
33
33
  }
34
34
 
35
- // Build a single Go file to WASM
36
- export async function buildGoFile(goFilePath, wasmFilePath) {
37
- try {
38
- if (!fs.existsSync(goFilePath)) {
39
- throw new Error(`Go file not found: ${goFilePath}`);
40
- }
41
-
42
- console.log(`Building ${goFilePath} to ${wasmFilePath}`);
43
-
44
- // Create a unique temporary directory with timestamp
45
- const timestamp = Date.now();
46
- const tempDir = join(os.tmpdir(), `go-wasm-build-${timestamp}`);
47
-
48
- // Ensure the directory is clean
49
- if (fs.existsSync(tempDir)) {
50
- if (isWindows) {
51
- execSync(`rmdir /s /q "${tempDir}"`, { shell: true });
52
- } else {
53
- fs.rmSync(tempDir, { recursive: true, force: true });
54
- }
55
- }
56
-
57
- // Create the temporary directory
58
- ensureDir(tempDir);
59
-
60
- // Copy the Go file to the temp directory
61
- const goFileName = goFilePath.split(/[/\\]/).pop();
62
- const tempGoFile = join(tempDir, goFileName);
63
- fs.copyFileSync(goFilePath, tempGoFile);
64
-
65
- // Initialize Go module
66
- console.log(`Initializing Go module in ${tempDir}`);
67
- execSync(`go mod init wasmapp`, { cwd: tempDir });
68
-
69
- // Build the WASM module with OS-specific command
70
- if (isWindows) {
71
- // Windows-specific environment variable setting
72
- execSync(`go build -o "${wasmFilePath}" "${tempGoFile}"`, {
73
- cwd: tempDir,
74
- env: {
75
- ...process.env,
76
- GOOS: 'js',
77
- GOARCH: 'wasm'
78
- }
79
- });
80
- } else {
81
- // Unix/Linux/Mac command
82
- execSync(`GOOS=js GOARCH=wasm go build -o "${wasmFilePath}" "${tempGoFile}"`, {
83
- cwd: tempDir
84
- });
85
- }
86
-
87
- // Clean up temporary directory
88
- try {
89
- if (isWindows) {
90
- execSync(`rmdir /s /q "${tempDir}"`, { shell: true });
91
- } else {
92
- fs.rmSync(tempDir, { recursive: true, force: true });
93
- }
94
- } catch (cleanupError) {
95
- console.warn(`Warning: Failed to clean up temp directory ${tempDir}:`, cleanupError);
96
- }
97
-
98
- console.log(`✓ Successfully built ${goFileName} to WASM`);
99
- return {
100
- success: true,
101
- wasmPath: wasmFilePath,
102
- goFile: goFilePath
103
- };
104
- } catch (error) {
105
- console.error(`✗ Error building ${goFilePath}:`, error);
106
- return {
107
- success: false,
108
- error: error.message,
109
- goFile: goFilePath
110
- };
111
- }
112
- }
113
-
114
- // Build all Go WASM modules
35
+ // Build Go WASM modules
115
36
  async function buildWasmModules() {
116
37
  // Check if Go is installed
117
38
  if (!checkGoInstallation()) {
@@ -144,13 +65,92 @@ async function buildWasmModules() {
144
65
  console.log(`Copying ${wasmExecNodeJsPath} to ${wasmExecNodeJsDest}`);
145
66
  fs.copyFileSync(wasmExecNodeJsPath, wasmExecNodeJsDest);
146
67
 
147
- // Generate a default example.go file if no Go files exist
148
- const goFiles = fs.existsSync(goSourceDir) ?
149
- fs.readdirSync(goSourceDir).filter(file => file.endsWith('.go')) : [];
68
+ // Build all Go files in the WASM directory
69
+ const goFiles = fs.readdirSync(goSourceDir).filter(file => file.endsWith('.go'));
150
70
 
151
71
  if (goFiles.length === 0) {
152
- console.log('No Go files found. Creating example.go...');
72
+ console.log('No Go files found in src/wasm');
73
+
74
+ // Create an example Go file
75
+ const exampleGoFile = join(goSourceDir, 'example.go');
76
+ const exampleGoContent = `//go:build js && wasm
77
+ // +build js,wasm
78
+
79
+ package main
80
+
81
+ import (
82
+ "encoding/json"
83
+ "fmt"
84
+ "syscall/js"
85
+ )
86
+
87
+ // Example Go function to be called from JavaScript
88
+ func add(this js.Value, args []js.Value) interface{} {
89
+ if len(args) != 2 {
90
+ return js.ValueOf("Error: Expected two arguments")
91
+ }
92
+
93
+ a := args[0].Int()
94
+ b := args[1].Int()
95
+ return js.ValueOf(a + b)
96
+ }
97
+
98
+ // Process complex data in Go
99
+ func processData(this js.Value, args []js.Value) interface{} {
100
+ if len(args) == 0 {
101
+ return js.ValueOf("Error: Expected at least one argument")
102
+ }
103
+
104
+ // Get input data
105
+ data := args[0]
106
+ if data.Type() != js.TypeObject {
107
+ return js.ValueOf("Error: Expected JSON object")
108
+ }
109
+
110
+ // Convert JS object to Go map
111
+ jsonStr := js.Global().Get("JSON").Call("stringify", data).String()
112
+ var inputMap map[string]interface{}
113
+ if err := json.Unmarshal([]byte(jsonStr), &inputMap); err != nil {
114
+ return js.ValueOf(fmt.Sprintf("Error parsing JSON: %s", err.Error()))
115
+ }
116
+
117
+ // Add new fields
118
+ inputMap["processed"] = true
119
+ inputMap["processor"] = "Go WASM"
120
+
121
+ // Add some computed fields
122
+ if values, ok := inputMap["values"].([]interface{}); ok {
123
+ sum := 0.0
124
+ for _, v := range values {
125
+ if num, ok := v.(float64); ok {
126
+ sum += num
127
+ }
128
+ }
129
+ inputMap["sum"] = sum
130
+ }
131
+
132
+ // Convert back to JS
133
+ resultJSON, err := json.Marshal(inputMap)
134
+ if err != nil {
135
+ return js.ValueOf(fmt.Sprintf("Error generating JSON: %s", err.Error()))
136
+ }
137
+
138
+ return js.ValueOf(string(resultJSON))
139
+ }
140
+
141
+ func main() {
142
+ fmt.Println("Go WASM Module initialized")
143
+
144
+ // Register functions to be callable from JavaScript
145
+ js.Global().Set("goAdd", js.FuncOf(add))
146
+ js.Global().Set("goProcessData", js.FuncOf(processData))
147
+
148
+ // Keep the program running
149
+ <-make(chan bool)
150
+ }
151
+ `;
153
152
 
153
+ fs.writeFileSync(exampleGoFile, exampleGoContent);
154
154
  console.log(`Created example Go file at ${exampleGoFile}`);
155
155
 
156
156
  // Add the new file to the list
@@ -0,0 +1,62 @@
1
+ // CommonJS/ESM compatible build configuration
2
+ const buildConfig = {
3
+ /**
4
+ * Determines if we should build for dual module support
5
+ */
6
+ dualModuleSupport: true,
7
+
8
+ /**
9
+ * Entry points for both client and server
10
+ */
11
+ entryPoints: {
12
+ client: 'src/client.js',
13
+ server: 'src/server.js'
14
+ },
15
+
16
+ /**
17
+ * Output formats to generate
18
+ */
19
+ outputFormats: ['esm', 'cjs'],
20
+
21
+ /**
22
+ * Output directory configuration
23
+ */
24
+ output: {
25
+ dir: 'dist',
26
+ client: {
27
+ esm: 'assets/[name].mjs',
28
+ cjs: 'assets/[name].js'
29
+ },
30
+ server: {
31
+ esm: 'server/[name].mjs',
32
+ cjs: 'server/[name].js'
33
+ }
34
+ },
35
+
36
+ /**
37
+ * WebAssembly configuration
38
+ */
39
+ wasm: {
40
+ enabled: true,
41
+ goBinaryPath: 'go',
42
+ sourceDir: 'src/wasm',
43
+ outputDir: 'public/wasm',
44
+ copyGoRuntime: true
45
+ },
46
+
47
+ /**
48
+ * Additional build options
49
+ */
50
+ options: {
51
+ minify: process.env.NODE_ENV === 'production',
52
+ sourcemap: true,
53
+ target: 'es2020'
54
+ }
55
+ };
56
+
57
+ // Make it work in both ESM and CommonJS environments
58
+ if (typeof module !== 'undefined' && module.exports) {
59
+ module.exports = buildConfig;
60
+ }
61
+
62
+ export default buildConfig;
@@ -0,0 +1,218 @@
1
+ // Support both ESM and CommonJS imports
2
+ const path = require('path');
3
+ const fs = require('fs');
4
+ const esbuild = require('esbuild');
5
+ const { execSync } = require('child_process');
6
+ const config = require('./build.config.js');
7
+
8
+ // Define colors for console output
9
+ const colors = {
10
+ reset: "\x1b[0m",
11
+ bright: "\x1b[1m",
12
+ dim: "\x1b[2m",
13
+ underscore: "\x1b[4m",
14
+ blink: "\x1b[5m",
15
+ cyan: "\x1b[36m",
16
+ green: "\x1b[32m",
17
+ yellow: "\x1b[33m",
18
+ red: "\x1b[31m"
19
+ };
20
+
21
+ // Helper for formatted console logs
22
+ function log(message, type = 'info') {
23
+ const timestamp = new Date().toISOString().split('T')[1].split('.')[0];
24
+ const prefix = {
25
+ info: `${colors.bright}${colors.cyan}[INFO]${colors.reset}`,
26
+ success: `${colors.bright}${colors.green}[SUCCESS]${colors.reset}`,
27
+ warning: `${colors.bright}${colors.yellow}[WARNING]${colors.reset}`,
28
+ error: `${colors.bright}${colors.red}[ERROR]${colors.reset}`
29
+ };
30
+
31
+ console.log(`${colors.dim}[${timestamp}]${colors.reset} ${prefix[type] || prefix.info} ${message}`);
32
+ }
33
+
34
+ // Main build function
35
+ async function build() {
36
+ try {
37
+ log(`Starting build process (${process.env.NODE_ENV || 'development'} mode)`);
38
+
39
+ // Ensure output directories
40
+ ensureDir(path.join(__dirname, 'dist'));
41
+ ensureDir(path.join(__dirname, 'dist/server'));
42
+ ensureDir(path.join(__dirname, 'dist/assets'));
43
+ ensureDir(path.join(__dirname, 'public/wasm'));
44
+
45
+ // Build the WASM modules if enabled
46
+ if (config.wasm.enabled) {
47
+ await buildWasmModules();
48
+ }
49
+
50
+ // Build the client code
51
+ await buildClient();
52
+
53
+ // Build the server code if it exists
54
+ if (fs.existsSync(path.join(__dirname, config.entryPoints.server))) {
55
+ await buildServer();
56
+ }
57
+
58
+ log('Build completed successfully', 'success');
59
+ } catch (error) {
60
+ log(`Build failed: ${error.message}`, 'error');
61
+ console.error(error);
62
+ process.exit(1);
63
+ }
64
+ }
65
+
66
+ // Build WebAssembly modules
67
+ async function buildWasmModules() {
68
+ const sourceDir = path.join(__dirname, config.wasm.sourceDir);
69
+ const outputDir = path.join(__dirname, config.wasm.outputDir);
70
+
71
+ if (!fs.existsSync(sourceDir)) {
72
+ log(`WASM source directory not found: ${sourceDir}`, 'warning');
73
+ return;
74
+ }
75
+
76
+ log('Building WebAssembly modules...');
77
+
78
+ // Get all .go files that need to be compiled
79
+ const goFiles = fs.readdirSync(sourceDir)
80
+ .filter(file => file.endsWith('.go'));
81
+
82
+ if (goFiles.length === 0) {
83
+ log('No Go files found to compile', 'warning');
84
+ return;
85
+ }
86
+
87
+ // Compile each Go file to WASM
88
+ for (const goFile of goFiles) {
89
+ const goFilePath = path.join(sourceDir, goFile);
90
+ const wasmFileName = goFile.replace('.go', '.wasm');
91
+ const wasmFilePath = path.join(outputDir, wasmFileName);
92
+
93
+ log(`Compiling ${goFile} to WebAssembly...`);
94
+
95
+ try {
96
+ // Set environment variables for Go WASM compilation
97
+ const env = {
98
+ ...process.env,
99
+ GOOS: 'js',
100
+ GOARCH: 'wasm'
101
+ };
102
+
103
+ // Compile Go to WASM
104
+ execSync(`${config.wasm.goBinaryPath} build -o "${wasmFilePath}" "${goFilePath}"`, {
105
+ env,
106
+ stdio: 'inherit'
107
+ });
108
+
109
+ log(`Successfully compiled ${goFile} to ${wasmFileName}`, 'success');
110
+ } catch (error) {
111
+ log(`Failed to compile ${goFile}: ${error.message}`, 'error');
112
+ throw error;
113
+ }
114
+ }
115
+
116
+ // Copy wasm_exec.js from Go installation to public folder
117
+ if (config.wasm.copyGoRuntime) {
118
+ try {
119
+ const goRoot = execSync(`${config.wasm.goBinaryPath} env GOROOT`, { encoding: 'utf8' }).trim();
120
+ const wasmExecSrc = path.join(goRoot, 'misc', 'wasm', 'wasm_exec.js');
121
+ const wasmExecDest = path.join(outputDir, 'wasm_exec.js');
122
+
123
+ fs.copyFileSync(wasmExecSrc, wasmExecDest);
124
+ log('Copied wasm_exec.js runtime to public folder', 'success');
125
+ } catch (error) {
126
+ log(`Failed to copy wasm_exec.js: ${error.message}`, 'warning');
127
+ }
128
+ }
129
+ }
130
+
131
+ // Build client code with esbuild
132
+ async function buildClient() {
133
+ const formats = config.dualModuleSupport ? config.outputFormats : ['esm'];
134
+
135
+ for (const format of formats) {
136
+ const outfile = path.join(
137
+ __dirname,
138
+ 'dist',
139
+ config.output.client[format].replace('[name]', 'client')
140
+ );
141
+
142
+ log(`Building client bundle (${format})...`);
143
+
144
+ await esbuild.build({
145
+ entryPoints: [path.join(__dirname, config.entryPoints.client)],
146
+ bundle: true,
147
+ outfile,
148
+ format,
149
+ platform: 'browser',
150
+ target: config.options.target,
151
+ minify: config.options.minify,
152
+ sourcemap: config.options.sourcemap,
153
+ define: {
154
+ 'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV || 'development'),
155
+ '__ESM__': format === 'esm' ? 'true' : 'false'
156
+ },
157
+ jsxFactory: 'jsx',
158
+ jsxFragment: 'Fragment',
159
+ banner: {
160
+ js: format === 'esm'
161
+ ? `import { jsx, Fragment } from 'frontend-hamroun/jsx-runtime';`
162
+ : `const { jsx, Fragment } = require('frontend-hamroun/jsx-runtime');`
163
+ }
164
+ });
165
+ }
166
+
167
+ log('Client build completed', 'success');
168
+ }
169
+
170
+ // Build server code with esbuild
171
+ async function buildServer() {
172
+ const formats = config.dualModuleSupport ? config.outputFormats : ['cjs'];
173
+
174
+ for (const format of formats) {
175
+ const outfile = path.join(
176
+ __dirname,
177
+ 'dist',
178
+ config.output.server[format].replace('[name]', 'server')
179
+ );
180
+
181
+ log(`Building server bundle (${format})...`);
182
+
183
+ await esbuild.build({
184
+ entryPoints: [path.join(__dirname, config.entryPoints.server)],
185
+ bundle: true,
186
+ outfile,
187
+ format,
188
+ platform: 'node',
189
+ target: config.options.target,
190
+ minify: config.options.minify,
191
+ sourcemap: config.options.sourcemap,
192
+ external: ['express', 'cors', 'path', 'fs', 'frontend-hamroun', 'frontend-hamroun/*'],
193
+ define: {
194
+ 'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV || 'development'),
195
+ '__ESM__': format === 'esm' ? 'true' : 'false'
196
+ }
197
+ });
198
+ }
199
+
200
+ log('Server build completed', 'success');
201
+ }
202
+
203
+ // Utility to ensure directory exists
204
+ function ensureDir(dir) {
205
+ if (!fs.existsSync(dir)) {
206
+ fs.mkdirSync(dir, { recursive: true });
207
+ }
208
+ }
209
+
210
+ // Execute the build
211
+ build();
212
+
213
+ // Support both CommonJS and ESM
214
+ if (typeof module !== 'undefined' && module.exports) {
215
+ module.exports = { build };
216
+ }
217
+
218
+ export { build };
@@ -1,22 +1,32 @@
1
1
  {
2
2
  "name": "go-wasm-app",
3
3
  "version": "1.0.0",
4
- "description": "WebAssembly integration with Go for Frontend Hamroun with SSR",
5
- "type": "module",
6
- "main": "server.js",
4
+ "type": "commonjs",
5
+ "description": "Frontend Hamroun app with Go WebAssembly integration",
7
6
  "scripts": {
8
- "build:dirs": "node -e \"const fs=require('fs');const dirs=['public/wasm','src/wasm','dist'];dirs.forEach(d=>!fs.existsSync(d)&&fs.mkdirSync(d,{recursive:true}))\"",
9
- "build:wasm": "node build-wasm.js",
10
- "dev": "npm run build:dirs && npm run build:wasm && node --watch server.js",
11
- "build": "npm run build:dirs && npm run build:wasm && node -e \"require('fs-extra').copySync('public', 'dist')\"",
12
- "start": "cross-env NODE_ENV=production node server.js"
7
+ "dev": "cross-env NODE_ENV=development node server.js",
8
+ "build": "cross-env NODE_ENV=production node build.js",
9
+ "build:wasm": "node build.js --wasm-only",
10
+ "start": "cross-env NODE_ENV=production node dist/server/server.js",
11
+ "test": "vitest run"
13
12
  },
14
13
  "dependencies": {
15
14
  "express": "^4.18.2",
16
- "frontend-hamroun": "^1.2.72",
17
- "fs-extra": "^11.1.1"
15
+ "frontend-hamroun": "latest"
18
16
  },
19
17
  "devDependencies": {
20
- "cross-env": "^7.0.3"
18
+ "cross-env": "^7.0.3",
19
+ "esbuild": "^0.19.5",
20
+ "nodemon": "^3.0.1",
21
+ "vitest": "^0.34.6"
22
+ },
23
+ "engines": {
24
+ "node": ">=16.0.0"
25
+ },
26
+ "exports": {
27
+ ".": {
28
+ "import": "./dist/assets/client.mjs",
29
+ "require": "./dist/assets/client.js"
30
+ }
21
31
  }
22
32
  }
@@ -21,12 +21,12 @@
21
21
  }
22
22
 
23
23
  body {
24
- font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
25
- background-color: var(--background);
26
- color: var(--text-color);
27
- margin: 0;
28
- padding: 0;
24
+ font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
25
+ max-width: 800px;
26
+ margin: 0 auto;
27
+ padding: 2rem;
29
28
  line-height: 1.6;
29
+ color: #333;
30
30
  }
31
31
 
32
32
  .app {
@@ -45,25 +45,8 @@
45
45
  color: var(--primary-color);
46
46
  }
47
47
 
48
- .rendering-info {
49
- display: flex;
50
- gap: 10px;
51
- justify-content: center;
52
- margin-top: 10px;
53
- }
54
-
55
- .badge {
56
- display: inline-block;
57
- padding: 4px 8px;
58
- border-radius: 4px;
59
- background-color: #eaeaea;
48
+ header p {
60
49
  color: #666;
61
- font-size: 0.8rem;
62
- }
63
-
64
- .badge.active {
65
- background-color: var(--success-color);
66
- color: white;
67
50
  }
68
51
 
69
52
  .card {
@@ -75,23 +58,11 @@
75
58
  box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05);
76
59
  }
77
60
 
78
- .result {
79
- background-color: #f0f7ff;
61
+ pre {
62
+ background-color: #f5f5f5;
80
63
  padding: 1rem;
81
64
  border-radius: 4px;
82
- margin-top: 1rem;
83
- white-space: pre-wrap;
84
65
  overflow-x: auto;
85
- font-family: monospace;
86
- font-size: 0.9rem;
87
- }
88
-
89
- .error {
90
- background-color: #ffebee;
91
- color: #c62828;
92
- padding: 0.75rem;
93
- border-radius: 4px;
94
- margin-top: 0.5rem;
95
66
  }
96
67
 
97
68
  footer {
@@ -102,31 +73,56 @@
102
73
  border-top: 1px solid var(--border-color);
103
74
  }
104
75
 
105
- footer a {
106
- color: var(--primary-color);
107
- text-decoration: none;
76
+ .warning {
77
+ display: none;
78
+ background-color: #fff3cd;
79
+ border: 1px solid #ffecb5;
80
+ color: #856404;
81
+ padding: 1rem;
82
+ border-radius: 4px;
83
+ margin-bottom: 1rem;
108
84
  }
109
85
 
110
- @media (max-width: 768px) {
111
- .app {
112
- padding: 10px;
113
- }
114
-
115
- .card {
116
- padding: 1rem;
117
- }
86
+ code {
87
+ background-color: #f5f5f5;
88
+ padding: 0.2rem 0.4rem;
89
+ border-radius: 3px;
90
+ }
91
+
92
+ .loading {
93
+ text-align: center;
94
+ padding: 3rem 1rem;
95
+ color: #666;
118
96
  }
119
97
  </style>
120
- <!-- WASM runtime will be loaded by server -->
121
- <script src="/wasm/wasm_exec.js"></script>
98
+ <script src="/wasm/wasm_exec.js" defer></script>
122
99
  </head>
123
100
  <body>
124
101
  <div id="root">
125
- <!-- Server-rendered content will replace this -->
126
- <div class="loading" style="text-align:center;padding:3rem;">
102
+ <!-- Server-rendered content will be inserted here -->
103
+ <div class="loading">
127
104
  <h2>Loading...</h2>
128
- <p>Please wait while the application initializes.</p>
105
+ <p>Please wait while the server starts.</p>
106
+ <p>If this message persists, there might be an issue with the server.</p>
129
107
  </div>
130
108
  </div>
109
+ <script type="module" src="/src/client.js"></script>
110
+ <script>
111
+ // The server should replace this entire page with server-rendered content
112
+ // If you're seeing this, something is wrong with the server-side rendering
113
+ setTimeout(() => {
114
+ if (document.querySelector('.loading')) {
115
+ document.querySelector('#root').innerHTML = `
116
+ <div class="warning" style="display:block; background-color: #fff3cd; border: 1px solid #ffecb5; color: #856404; padding: 1rem; border-radius: 4px; margin-bottom: 1rem;">
117
+ <h2>Server Not Responding</h2>
118
+ <p>The server is not responding with the expected server-rendered content.</p>
119
+ <p>Please make sure the server is running properly with:</p>
120
+ <code>npm run dev</code>
121
+ <p>This static HTML file should be replaced by server-rendered content.</p>
122
+ </div>
123
+ `;
124
+ }
125
+ }, 2000);
126
+ </script>
131
127
  </body>
132
128
  </html>