Skip to content

Commit 2fa5ce3

Browse files
authored
Merge pull request #3 from gaarutyunov/claude/guix-calculator-example-017bKEZWpuT9azWTm9aKBW4y
Add calculator example with channel-based state management
2 parents 112918f + d92d5fb commit 2fa5ce3

42 files changed

Lines changed: 7288 additions & 187 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/e2e.yml

Lines changed: 57 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ jobs:
3030

3131
- name: Generate and build counter example
3232
run: |
33-
./guix generate -p examples/counter
33+
./guix generate -p examples/counter --verbose-logs
3434
cd examples/counter
3535
# Copy wasm_exec.js from Go installation
3636
GOROOT="$(go env GOROOT)"
@@ -65,3 +65,59 @@ jobs:
6565
name: playwright-results
6666
path: examples/counter/test-results/
6767
retention-days: 7
68+
69+
calculator:
70+
name: Calculator E2E Tests
71+
runs-on: ubuntu-latest
72+
steps:
73+
- uses: actions/checkout@v4
74+
75+
- name: Set up Go
76+
uses: actions/setup-go@v5
77+
with:
78+
go-version: '1.25'
79+
80+
- name: Set up Node.js
81+
uses: actions/setup-node@v4
82+
with:
83+
node-version: '20'
84+
85+
- name: Build CLI
86+
run: go build -o guix ./cmd/guix
87+
88+
- name: Generate and build calculator example
89+
run: |
90+
./guix generate -p examples/calculator --verbose-logs
91+
cd examples/calculator
92+
93+
# Copy wasm_exec.js from Go installation
94+
GOROOT="$(go env GOROOT)"
95+
if [ -f "$GOROOT/lib/wasm/wasm_exec.js" ]; then
96+
cp "$GOROOT/lib/wasm/wasm_exec.js" .
97+
elif [ -f "$GOROOT/misc/wasm/wasm_exec.js" ]; then
98+
cp "$GOROOT/misc/wasm/wasm_exec.js" .
99+
else
100+
echo "wasm_exec.js not found in GOROOT, downloading from GitHub"
101+
curl -o wasm_exec.js https://raw.githubusercontent.com/golang/go/go1.25.0/lib/wasm/wasm_exec.js
102+
fi
103+
GOOS=js GOARCH=wasm go build -o main.wasm .
104+
echo "Files after build:"
105+
ls -lah *.{html,js,wasm} 2>/dev/null || ls -lah
106+
107+
- name: Install Playwright
108+
working-directory: examples/calculator
109+
run: |
110+
npm install
111+
npx playwright install --with-deps chromium
112+
113+
- name: Run Playwright tests
114+
working-directory: examples/calculator
115+
run: npx playwright test
116+
117+
- name: Upload test results
118+
if: always()
119+
uses: actions/upload-artifact@v4
120+
with:
121+
name: calculator-playwright-results
122+
path: examples/calculator/test-results/
123+
retention-days: 7

.gitignore

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,6 @@ go.work
1616
wasm_exec.js
1717
main.wasm
1818

19-
# Generated files
20-
*_gen.go
21-
2219
# Cache
2320
.guix/
2421
*.cache

cmd/guix/main.go

Lines changed: 22 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,10 @@ func main() {
5252
Name: "verbose",
5353
Usage: "Verbose output",
5454
},
55+
&cli.BoolFlag{
56+
Name: "verbose-logs",
57+
Usage: "Generate verbose logging statements in code (for debugging)",
58+
},
5559
},
5660
Action: runGenerate,
5761
},
@@ -77,7 +81,10 @@ func main() {
7781
}
7882

7983
func generateHelpersFile(root string) error {
80-
helpersContent := `// Code generated by guix. DO NOT EDIT.
84+
helpersContent := `//go:build js && wasm
85+
// +build js,wasm
86+
87+
// Code generated by guix. DO NOT EDIT.
8188
8289
package main
8390
@@ -115,6 +122,7 @@ func runGenerate(c *cli.Context) error {
115122
watchMode := c.Bool("watch")
116123
lazy := c.Bool("lazy")
117124
verbose := c.Bool("verbose")
125+
verboseLogs := c.Bool("verbose-logs")
118126

119127
// Load or create cache
120128
var genCache *cache.Cache
@@ -127,13 +135,15 @@ func runGenerate(c *cli.Context) error {
127135
}
128136
}
129137

130-
// Generate helpers file first
131-
if err := generateHelpersFile(path); err != nil {
132-
return fmt.Errorf("failed to generate helpers: %w", err)
138+
// Generate helpers file first (only if verbose logs are enabled)
139+
if verboseLogs {
140+
if err := generateHelpersFile(path); err != nil {
141+
return fmt.Errorf("failed to generate helpers: %w", err)
142+
}
133143
}
134144

135145
// Generate all files initially
136-
if err := generateAll(path, genCache, verbose); err != nil {
146+
if err := generateAll(path, genCache, verbose, verboseLogs); err != nil {
137147
return err
138148
}
139149

@@ -146,13 +156,13 @@ func runGenerate(c *cli.Context) error {
146156

147157
// Watch mode
148158
if watchMode {
149-
return watchFiles(path, genCache, verbose, lazy)
159+
return watchFiles(path, genCache, verbose, verboseLogs, lazy)
150160
}
151161

152162
return nil
153163
}
154164

155-
func generateAll(root string, genCache *cache.Cache, verbose bool) error {
165+
func generateAll(root string, genCache *cache.Cache, verbose bool, verboseLogs bool) error {
156166
p, err := parser.New()
157167
if err != nil {
158168
return fmt.Errorf("failed to create parser: %w", err)
@@ -191,7 +201,7 @@ func generateAll(root string, genCache *cache.Cache, verbose bool) error {
191201
}
192202
}
193203

194-
if err := generateFile(path, p, verbose); err != nil {
204+
if err := generateFile(path, p, verbose, verboseLogs); err != nil {
195205
return fmt.Errorf("failed to generate %s: %w", path, err)
196206
}
197207

@@ -231,7 +241,7 @@ func formatFile(path string) error {
231241
return nil
232242
}
233243

234-
func generateFile(srcPath string, p *parser.Parser, verbose bool) error {
244+
func generateFile(srcPath string, p *parser.Parser, verbose bool, verboseLogs bool) error {
235245
if verbose {
236246
log.Printf("Generating %s", srcPath)
237247
}
@@ -255,6 +265,7 @@ func generateFile(srcPath string, p *parser.Parser, verbose bool) error {
255265

256266
// Generate Go code
257267
gen := codegen.New(file.Package)
268+
gen.SetVerbose(verboseLogs)
258269
output, err := gen.Generate(file)
259270
if err != nil {
260271
return err
@@ -278,7 +289,7 @@ func generateFile(srcPath string, p *parser.Parser, verbose bool) error {
278289
return nil
279290
}
280291

281-
func watchFiles(root string, genCache *cache.Cache, verbose bool, lazy bool) error {
292+
func watchFiles(root string, genCache *cache.Cache, verbose bool, verboseLogs bool, lazy bool) error {
282293
watcher, err := fsnotify.NewWatcher()
283294
if err != nil {
284295
return fmt.Errorf("failed to create watcher: %w", err)
@@ -346,7 +357,7 @@ func watchFiles(root string, genCache *cache.Cache, verbose bool, lazy bool) err
346357

347358
log.Printf("File changed: %s", event.Name)
348359

349-
if err := generateFile(event.Name, p, verbose); err != nil {
360+
if err := generateFile(event.Name, p, verbose, verboseLogs); err != nil {
350361
log.Printf("Error generating %s: %v", event.Name, err)
351362
} else {
352363
log.Printf("Successfully regenerated %s", event.Name)

0 commit comments

Comments
 (0)