gofront 1.7.0 → 1.8.0

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 (128) hide show
  1. package/README.md +13 -13
  2. package/package.json +8 -37
  3. package/src/backend/js/expressions.js +1341 -148
  4. package/src/backend/js/fmt-runtime.js +573 -0
  5. package/src/backend/js/index.js +375 -57
  6. package/src/backend/js/runtime.js +1460 -133
  7. package/src/backend/js/statements.js +900 -86
  8. package/src/backend/js/stdlib/bits.js +87 -14
  9. package/src/backend/js/stdlib/builder.js +41 -6
  10. package/src/backend/js/stdlib/bytes.js +253 -7
  11. package/src/backend/js/stdlib/errors.js +2 -1
  12. package/src/backend/js/stdlib/fmt.js +349 -10
  13. package/src/backend/js/stdlib/index.js +8 -3
  14. package/src/backend/js/stdlib/json.js +247 -52
  15. package/src/backend/js/stdlib/maps.js +0 -8
  16. package/src/backend/js/stdlib/math.js +17 -1
  17. package/src/backend/js/stdlib/simd.js +10 -0
  18. package/src/backend/js/stdlib/slices.js +36 -6
  19. package/src/backend/js/stdlib/strconv.js +10 -5
  20. package/src/backend/js/stdlib/strings.js +83 -4
  21. package/src/backend/js/stdlib/testing.js +7 -0
  22. package/src/backend/js/stdlib/time.js +79 -55
  23. package/src/backend/js/stdlib/unicode.js +1 -1
  24. package/src/backend/js/stdlib/utf8.js +1 -1
  25. package/src/backend/js/templ.js +38 -76
  26. package/src/backend/js/type-info.js +272 -0
  27. package/src/backend/shared/fmt-types.js +188 -0
  28. package/src/backend/wasm/boundary.js +436 -80
  29. package/src/backend/wasm/emit-builtins.js +303 -13
  30. package/src/backend/wasm/emit-exprs.js +1397 -203
  31. package/src/backend/wasm/emit-maps.js +61 -13
  32. package/src/backend/wasm/emit-stmts.js +1359 -164
  33. package/src/backend/wasm/emit.js +512 -77
  34. package/src/backend/wasm/encode.js +43 -13
  35. package/src/backend/wasm/globals.js +452 -0
  36. package/src/backend/wasm/index.js +194 -2489
  37. package/src/backend/wasm/method-expr.js +381 -0
  38. package/src/backend/wasm/module-emitter.js +2240 -0
  39. package/src/backend/wasm/monomorph.js +62 -4
  40. package/src/backend/wasm/prescan.js +397 -0
  41. package/src/backend/wasm/stdlib/bytes.js +1804 -127
  42. package/src/backend/wasm/stdlib/core.js +1574 -199
  43. package/src/backend/wasm/stdlib/index.js +0 -5
  44. package/src/backend/wasm/stdlib/io.js +1567 -150
  45. package/src/backend/wasm/stdlib/packages.js +2 -0
  46. package/src/backend/wasm/stdlib/simd.js +293 -28
  47. package/src/backend/wasm/stdlib/time.js +1041 -12
  48. package/src/backend/wasm/types.js +200 -15
  49. package/src/backend/wasm/variadic.js +93 -0
  50. package/src/backend/wasm/wat.js +47 -20
  51. package/src/{cli-core.js → cli/cli-core.js} +236 -10
  52. package/src/{test-runner.js → cli/test-runner.js} +332 -39
  53. package/src/{vendor.js → cli/vendor.js} +3 -4
  54. package/src/compiler.js +107 -269
  55. package/src/index.js +15 -169
  56. package/src/{lexer.js → lexer/lexer.js} +102 -55
  57. package/src/{tokens.js → lexer/tokens.js} +1 -0
  58. package/src/link/sourcemap.js +97 -0
  59. package/src/link/stdlib.js +515 -0
  60. package/src/link/wasm.js +294 -0
  61. package/src/lower/bounds.js +394 -0
  62. package/src/lower/boxing.js +1 -1
  63. package/src/lower/captures.js +176 -32
  64. package/src/lower/index.js +26 -18
  65. package/src/lower/json-codecs.js +1398 -0
  66. package/src/lower/ownership.js +22 -1
  67. package/src/lower/range.js +86 -1
  68. package/src/lower/reachability.js +132 -0
  69. package/src/parser/declarations.js +58 -13
  70. package/src/parser/expressions.js +29 -7
  71. package/src/parser/index.js +2 -1
  72. package/src/parser/statements.js +37 -22
  73. package/src/{templ-parser.js → parser/templ.js} +138 -15
  74. package/src/parser/types.js +69 -9
  75. package/src/resolver.js +22 -1
  76. package/src/typechecker/assignability.js +176 -17
  77. package/src/typechecker/const-fold.js +356 -0
  78. package/src/typechecker/constants.js +256 -0
  79. package/src/typechecker/expressions.js +931 -122
  80. package/src/typechecker/index.js +459 -67
  81. package/src/typechecker/init-order.js +330 -0
  82. package/src/typechecker/resolve.js +451 -56
  83. package/src/typechecker/statements.js +90 -9
  84. package/src/typechecker/stdlib/core.js +333 -55
  85. package/src/typechecker/stdlib/excluded.js +898 -0
  86. package/src/typechecker/stdlib/extended.js +322 -26
  87. package/src/typechecker/{stdlib.js → stdlib/index.js} +5 -5
  88. package/src/typechecker/stdlib/simd.js +65 -15
  89. package/src/typechecker/termination.js +1 -1
  90. package/src/typechecker/types.js +149 -25
  91. package/stdlib/bytes/iter.go +192 -0
  92. package/stdlib/bytes/search.go +240 -0
  93. package/stdlib/bytes/split.go +218 -0
  94. package/stdlib/cmp/cmp.go +65 -0
  95. package/stdlib/encoding/json/errors.go +31 -0
  96. package/stdlib/encoding/json/indent.go +71 -0
  97. package/stdlib/encoding/json/number.go +12 -0
  98. package/stdlib/encoding/json/stream.go +173 -0
  99. package/stdlib/errors/overlay.go +12 -0
  100. package/stdlib/hash/hash.go +53 -0
  101. package/stdlib/internal/jsonrt/dec.go +738 -0
  102. package/stdlib/internal/jsonrt/enc.go +366 -0
  103. package/stdlib/internal/jsonrt/indent.go +135 -0
  104. package/stdlib/internal/jsonrt/number.go +27 -0
  105. package/stdlib/internal/jsonrt/reader.go +73 -0
  106. package/stdlib/internal/jsonrt/scanner.go +649 -0
  107. package/stdlib/io/io.go +346 -0
  108. package/stdlib/iter/iter.go +18 -0
  109. package/stdlib/maps/iter.go +65 -0
  110. package/stdlib/math/extra.go +270 -0
  111. package/stdlib/slices/extra.go +73 -0
  112. package/stdlib/slices/iter.go +113 -0
  113. package/stdlib/sort/sort.go +561 -0
  114. package/stdlib/strconv/quote.go +341 -0
  115. package/stdlib/strings/extra.go +35 -0
  116. package/stdlib/strings/iter.go +122 -0
  117. package/stdlib/sync/extra.go +105 -0
  118. package/stdlib/unicode/unicode.go +112 -0
  119. package/stdlib/unicode/utf8/bytes.go +239 -0
  120. package/src/backend/wasm/const-fold.js +0 -205
  121. package/src/backend/wasm/emit-stdlib.js +0 -13
  122. /package/src/{asset-manager.js → cli/asset-manager.js} +0 -0
  123. /package/src/{colors.js → cli/colors.js} +0 -0
  124. /package/src/{dev-server.js → cli/dev-server.js} +0 -0
  125. /package/src/{minifier.js → cli/minifier.js} +0 -0
  126. /package/src/{project-config.js → cli/project-config.js} +0 -0
  127. /package/src/{pwa.js → cli/pwa.js} +0 -0
  128. /package/src/{templ-lexer.js → lexer/templ-lexer.js} +0 -0
package/README.md CHANGED
@@ -228,6 +228,7 @@ Key syntax features:
228
228
  - `@Component(args)` — call another templ component and mount it as a child
229
229
  - `if cond { } else if cond { } else { }` — conditional rendering (arbitrary depth)
230
230
  - `for _, v := range slice { }` — loop rendering inside template bodies
231
+ - Go expressions in template bodies are type-checked like the rest of the package
231
232
  - `switch expr { case v: ... default: ... }` — switch rendering inside template bodies
232
233
  - `@templ.Raw(htmlStr)` — inject raw/trusted HTML (uses `insertAdjacentHTML`)
233
234
  - `ref="name"` — capture the element at mount time into an optional `refs map[string]any`
@@ -329,11 +330,17 @@ example/hybrid/
329
330
 
330
331
  ### Build and run
331
332
 
333
+ The examples are not committed pre-built. Build them once, then serve an example's
334
+ directory and open it in a browser:
335
+
332
336
  ```sh
333
337
  npm run build # compile all example applications
334
- # open the respective index.html in a browser
338
+ npx serve example/simple # then open the printed address
335
339
  ```
336
340
 
341
+ `example/preact/vendor.js` is the exception: it is committed, and
342
+ `node src/index.js prep example/preact` regenerates it.
343
+
337
344
  ---
338
345
 
339
346
  ## The Hybrid Architecture: JS + WasmGC
@@ -398,7 +405,7 @@ The compiler analyzes both sides of the boundary and synthesizes a facade into `
398
405
  - **Slices & Arrays:** Slices and arrays copy element-wise in both directions; TypedArrays (`Float32Array`, `Int32Array`, etc.) are natively accepted.
399
406
  - **Closures & Interfaces:** Function values, callbacks, and named non-empty interfaces cross the boundary transparently.
400
407
  - **Shared Linear-Memory Buffers:** `gofront/shared` (`shared.NewFloat32`, etc.) exposes zero-copy TypedArray views over linear memory for bulk per-frame data.
401
- - **WASM SIMD (`gofront/simd`):** Experimental 4-wide float vector type (`simd.F32x4`) compiling directly to native `v128` instructions with zero GC overhead, including `simd.LoadF32x4`/`StoreF32x4` for direct linear-memory access.
408
+ - **WASM SIMD (`gofront/simd`, experimental):** 4-wide float vector type (`simd.F32x4`) compiling directly to native `v128` instructions with zero GC overhead, including `simd.LoadF32x4`/`StoreF32x4` for direct linear-memory access (about 1.6× faster than a scalar loop on a particle-integration benchmark).
402
409
  - **WASM Loader:** The generated JS bundle automatically fetches `app.wasm` relative to `app.js` (`import.meta.url`, customizable via `globalThis.__GOFRONT_WASM_URL` or `globalThis.__GOFRONT_WASM_BYTES`).
403
410
  - **WAT Inspection:** Passing `--emit-wat` writes human-readable `app.wat` alongside the binary module.
404
411
  - **Binaryen Optimization:** Passing `--release` or `--wasm-opt` optimizes `app.wasm` via Binaryen (`-O3` + GUFA), achieving ~23% smaller binaries and generating `app.wasm.map` source maps.
@@ -447,26 +454,19 @@ For detailed command flags, project configuration (`gofront.json`), multi-file p
447
454
  * [Go to JS Mapping](docs/compilation-mapping.md) — what each construct compiles to
448
455
  * [Go Compatibility Differences](docs/go-compatibility.md) — where GoFront deliberately differs from Go
449
456
  * [Compiler Architecture & Internals](docs/architecture.md) — pipeline stages and source layout
450
-
451
- ---
452
-
453
- ## Roadmap
454
-
455
- See [`docs/roadmap.md`](docs/roadmap.md) for the full roadmap and release history.
456
- Design documents for planned features are organised by release under `docs/v*/`
457
- (e.g. [`docs/v0.0.8/`](docs/v0.0.8/), [`docs/v1.2.0/`](docs/v1.2.0/), [`docs/v1.3.0/`](docs/v1.3.0/), [`docs/v1.6.0/`](docs/v1.6.0/)).
457
+ * [Changelog](CHANGELOG.md) — release history and upgrade notes
458
458
 
459
459
  ---
460
460
 
461
461
  ## Tests
462
462
 
463
463
  ```sh
464
- npm test # unit, zero-alloc perf, and example tests (~1,920+ tests, no browser required)
464
+ npm test # unit, zero-alloc perf, and example tests (~2,900 tests, no browser required)
465
465
  npm run test:e2e # E2E browser tests (Playwright, headless Chromium)
466
- npm run bench # Möller–Trumbore raycast benchmark comparing pure JS vs hybrid WASM
466
+ npm run bench # Raycast, JSON, and SIMD particle benchmarks (pure JS vs hybrid WASM)
467
467
  ```
468
468
 
469
- **Unit tests** (~1,920+) cover language features, type errors, edge cases, DOM (jsdom),
469
+ **Unit tests** (~2,900) cover language features, type errors, edge cases, DOM (jsdom),
470
470
  external `.d.ts`, npm resolver, TypeScript tuple return signatures, multi-file compilation,
471
471
  embedded structs, string formatting, compile-time `encoding/json` serialization with struct tags,
472
472
  map iteration order, integer overflow semantics, unused variable detection,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gofront",
3
- "version": "1.7.0",
3
+ "version": "1.8.0",
4
4
  "author": "Luuk van Venrooij",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -28,19 +28,21 @@
28
28
  },
29
29
  "type": "module",
30
30
  "files": [
31
- "src/"
31
+ "src/",
32
+ "stdlib/"
32
33
  ],
33
34
  "bin": {
34
35
  "gofront": "src/index.js"
35
36
  },
36
37
  "scripts": {
37
- "build": "node src/index.js example/simple/src -o example/simple/app.js && node src/index.js example/preact/src -o example/preact/app.js && node src/index.js example/gom/src -o example/gom/app.js && node src/index.js example/templ/src -o example/templ/app.js && node src/index.js example/webgl/src -o example/webgl/app.js && node src/index.js example/hybrid/src -o example/hybrid/app.js",
38
- "test": "node test/unit/run.js && node test/e2e/perf/zero-alloc.js && node src/index.js test --dom example/...",
38
+ "build": "node scripts/build-examples.js",
39
+ "test": "node test/unit/run.js && node test/perf/zero-alloc.js && node test/perf/bce-mathx.js && node src/index.js test --dom example/...",
39
40
  "test:e2e": "playwright test",
40
41
  "test:coverage": "c8 --include='src/**' --reporter=text --reporter=lcov node test/unit/run.js",
41
- "bench": "node --expose-gc test/e2e/perf/raycast-bench.js",
42
+ "bench": "node --expose-gc test/perf/raycast-bench.js && node test/perf/json-bench.js && node --expose-gc test/perf/particle-bench.js",
43
+ "check:layers": "node scripts/check-layers.js",
42
44
  "format": "biome format --write .",
43
- "check": "biome check . && sentrux check && sentrux gate && node src/index.js check example/...",
45
+ "check": "biome check . && node scripts/check-layers.js && sentrux check && sentrux gate && node src/index.js check example/...",
44
46
  "prepare": "lefthook install"
45
47
  },
46
48
  "devDependencies": {
@@ -55,36 +57,5 @@
55
57
  },
56
58
  "optionalDependencies": {
57
59
  "binaryen": "^132.0.0"
58
- },
59
- "gofront": {
60
- "vendor": {
61
- "dest": "example/preact/vendor.js",
62
- "packages": [
63
- "preact",
64
- "preact/hooks"
65
- ],
66
- "globals": {
67
- "preact": "preact",
68
- "preact/hooks": [
69
- "preact/hooks",
70
- "preact_hooks"
71
- ]
72
- },
73
- "namedExports": {
74
- "preact": [
75
- "h",
76
- "render",
77
- "Component"
78
- ],
79
- "preact/hooks": [
80
- "useState",
81
- "useEffect",
82
- "useRef",
83
- "useMemo",
84
- "useCallback",
85
- "useReducer"
86
- ]
87
- }
88
- }
89
60
  }
90
61
  }