goscript 0.1.3 → 0.2.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 (330) hide show
  1. package/README.md +5 -2
  2. package/cmd/go_js_wasm_exec/main.go +201 -0
  3. package/cmd/go_js_wasm_exec/main_test.go +83 -0
  4. package/cmd/goscript/{cmd_compile.go → cmd-compile.go} +35 -8
  5. package/cmd/goscript/cmd-test.go +14 -0
  6. package/cmd/goscript/cmd-test_test.go +1 -1
  7. package/cmd/goscript/cmd_compile_test.go +105 -6
  8. package/compiler/build-flags.go +9 -10
  9. package/compiler/compile-request.go +12 -9
  10. package/compiler/compliance_test.go +0 -1
  11. package/compiler/config.go +2 -0
  12. package/compiler/gotest/request.go +28 -0
  13. package/compiler/gotest/runner.go +353 -27
  14. package/compiler/gotest/runner_test.go +400 -1
  15. package/compiler/gotest/testdata/browserapi/browserapi_test.go +20 -0
  16. package/compiler/gotest/testdata/browserapi/go.mod +3 -0
  17. package/compiler/lowered-program.go +24 -17
  18. package/compiler/lowering.go +988 -263
  19. package/compiler/lowering_bench_test.go +364 -0
  20. package/compiler/override-facts.go +15 -0
  21. package/compiler/override-parity-verifier.go +450 -0
  22. package/compiler/override-parity.go +122 -0
  23. package/compiler/override-registry_test.go +559 -0
  24. package/compiler/package-graph.go +61 -4
  25. package/compiler/package-graph_test.go +30 -0
  26. package/compiler/protobuf-ts-binding.go +514 -0
  27. package/compiler/protobuf-ts-binding_test.go +172 -0
  28. package/compiler/semantic-model-types.go +17 -4
  29. package/compiler/semantic-model.go +709 -72
  30. package/compiler/semantic-model_test.go +219 -0
  31. package/compiler/service.go +20 -1
  32. package/compiler/skeleton_test.go +1008 -20
  33. package/compiler/typescript-emitter.go +147 -15
  34. package/dist/gs/builtin/builtin.d.ts +2 -2
  35. package/dist/gs/builtin/builtin.js +20 -0
  36. package/dist/gs/builtin/builtin.js.map +1 -1
  37. package/dist/gs/builtin/slice.d.ts +2 -1
  38. package/dist/gs/builtin/slice.js +34 -4
  39. package/dist/gs/builtin/slice.js.map +1 -1
  40. package/dist/gs/builtin/type.d.ts +14 -6
  41. package/dist/gs/builtin/type.js +224 -64
  42. package/dist/gs/builtin/type.js.map +1 -1
  43. package/dist/gs/builtin/varRef.d.ts +11 -0
  44. package/dist/gs/builtin/varRef.js +57 -2
  45. package/dist/gs/builtin/varRef.js.map +1 -1
  46. package/dist/gs/bytes/buffer.gs.js +1 -1
  47. package/dist/gs/bytes/buffer.gs.js.map +1 -1
  48. package/dist/gs/bytes/reader.gs.js +1 -1
  49. package/dist/gs/bytes/reader.gs.js.map +1 -1
  50. package/dist/gs/compress/zlib/index.d.ts +13 -6
  51. package/dist/gs/compress/zlib/index.js +131 -35
  52. package/dist/gs/compress/zlib/index.js.map +1 -1
  53. package/dist/gs/crypto/sha1/index.js +2 -5
  54. package/dist/gs/crypto/sha1/index.js.map +1 -1
  55. package/dist/gs/crypto/sha256/index.js +2 -5
  56. package/dist/gs/crypto/sha256/index.js.map +1 -1
  57. package/dist/gs/crypto/sha512/index.js +2 -5
  58. package/dist/gs/crypto/sha512/index.js.map +1 -1
  59. package/dist/gs/embed/index.d.ts +6 -0
  60. package/dist/gs/embed/index.js +210 -5
  61. package/dist/gs/embed/index.js.map +1 -1
  62. package/dist/gs/encoding/json/index.d.ts +114 -0
  63. package/dist/gs/encoding/json/index.js +544 -36
  64. package/dist/gs/encoding/json/index.js.map +1 -1
  65. package/dist/gs/fmt/fmt.d.ts +3 -3
  66. package/dist/gs/fmt/fmt.js +29 -16
  67. package/dist/gs/fmt/fmt.js.map +1 -1
  68. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.d.ts +100 -0
  69. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.js +564 -0
  70. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.js.map +1 -1
  71. package/dist/gs/github.com/go-git/go-billy/v6/osfs/index.d.ts +45 -0
  72. package/dist/gs/github.com/go-git/go-billy/v6/osfs/index.js +229 -0
  73. package/dist/gs/github.com/go-git/go-billy/v6/osfs/index.js.map +1 -0
  74. package/dist/gs/github.com/pkg/errors/errors.js +54 -30
  75. package/dist/gs/github.com/pkg/errors/errors.js.map +1 -1
  76. package/dist/gs/go/scanner/index.d.ts +2 -0
  77. package/dist/gs/go/scanner/index.js +29 -5
  78. package/dist/gs/go/scanner/index.js.map +1 -1
  79. package/dist/gs/go/token/index.js +22 -6
  80. package/dist/gs/go/token/index.js.map +1 -1
  81. package/dist/gs/hash/index.d.ts +6 -0
  82. package/dist/gs/hash/index.js +20 -0
  83. package/dist/gs/hash/index.js.map +1 -1
  84. package/dist/gs/internal/goarch/index.d.ts +43 -3
  85. package/dist/gs/internal/goarch/index.js +42 -10
  86. package/dist/gs/internal/goarch/index.js.map +1 -1
  87. package/dist/gs/io/fs/fs.js +26 -14
  88. package/dist/gs/io/fs/fs.js.map +1 -1
  89. package/dist/gs/io/fs/readdir.js +8 -4
  90. package/dist/gs/io/fs/readdir.js.map +1 -1
  91. package/dist/gs/io/fs/sub.js +8 -1
  92. package/dist/gs/io/fs/sub.js.map +1 -1
  93. package/dist/gs/io/io.d.ts +12 -6
  94. package/dist/gs/io/io.js +87 -42
  95. package/dist/gs/io/io.js.map +1 -1
  96. package/dist/gs/math/bits/index.d.ts +31 -5
  97. package/dist/gs/math/bits/index.js +29 -28
  98. package/dist/gs/math/bits/index.js.map +1 -1
  99. package/dist/gs/mime/index.d.ts +16 -0
  100. package/dist/gs/mime/index.js +315 -6
  101. package/dist/gs/mime/index.js.map +1 -1
  102. package/dist/gs/net/http/httptest/index.d.ts +12 -0
  103. package/dist/gs/net/http/httptest/index.js +85 -6
  104. package/dist/gs/net/http/httptest/index.js.map +1 -1
  105. package/dist/gs/net/http/index.d.ts +303 -6
  106. package/dist/gs/net/http/index.js +1615 -58
  107. package/dist/gs/net/http/index.js.map +1 -1
  108. package/dist/gs/os/dir_unix.gs.js +1 -1
  109. package/dist/gs/os/dir_unix.gs.js.map +1 -1
  110. package/dist/gs/os/error.gs.js +1 -1
  111. package/dist/gs/os/error.gs.js.map +1 -1
  112. package/dist/gs/os/exec.gs.d.ts +1 -0
  113. package/dist/gs/os/exec.gs.js +4 -8
  114. package/dist/gs/os/exec.gs.js.map +1 -1
  115. package/dist/gs/os/exec_posix.gs.js +1 -1
  116. package/dist/gs/os/exec_posix.gs.js.map +1 -1
  117. package/dist/gs/os/index.d.ts +1 -1
  118. package/dist/gs/os/index.js +1 -1
  119. package/dist/gs/os/index.js.map +1 -1
  120. package/dist/gs/os/proc.gs.d.ts +4 -0
  121. package/dist/gs/os/proc.gs.js +12 -6
  122. package/dist/gs/os/proc.gs.js.map +1 -1
  123. package/dist/gs/os/root_js.gs.js +1 -1
  124. package/dist/gs/os/root_js.gs.js.map +1 -1
  125. package/dist/gs/os/types.gs.js +1 -1
  126. package/dist/gs/os/types.gs.js.map +1 -1
  127. package/dist/gs/os/types_js.gs.d.ts +6 -2
  128. package/dist/gs/os/types_js.gs.js +170 -9
  129. package/dist/gs/os/types_js.gs.js.map +1 -1
  130. package/dist/gs/os/types_unix.gs.js +1 -1
  131. package/dist/gs/os/types_unix.gs.js.map +1 -1
  132. package/dist/gs/path/path.js +11 -7
  133. package/dist/gs/path/path.js.map +1 -1
  134. package/dist/gs/reflect/index.d.ts +5 -4
  135. package/dist/gs/reflect/index.js +4 -3
  136. package/dist/gs/reflect/index.js.map +1 -1
  137. package/dist/gs/reflect/map.js +15 -0
  138. package/dist/gs/reflect/map.js.map +1 -1
  139. package/dist/gs/reflect/type.d.ts +26 -6
  140. package/dist/gs/reflect/type.js +1498 -279
  141. package/dist/gs/reflect/type.js.map +1 -1
  142. package/dist/gs/reflect/types.d.ts +14 -6
  143. package/dist/gs/reflect/types.js +35 -1
  144. package/dist/gs/reflect/types.js.map +1 -1
  145. package/dist/gs/reflect/value.d.ts +1 -0
  146. package/dist/gs/reflect/value.js +83 -41
  147. package/dist/gs/reflect/value.js.map +1 -1
  148. package/dist/gs/reflect/visiblefields.js +4 -140
  149. package/dist/gs/reflect/visiblefields.js.map +1 -1
  150. package/dist/gs/runtime/pprof/index.d.ts +8 -2
  151. package/dist/gs/runtime/pprof/index.js +50 -30
  152. package/dist/gs/runtime/pprof/index.js.map +1 -1
  153. package/dist/gs/runtime/runtime.js +5 -4
  154. package/dist/gs/runtime/runtime.js.map +1 -1
  155. package/dist/gs/runtime/trace/index.js +5 -19
  156. package/dist/gs/runtime/trace/index.js.map +1 -1
  157. package/dist/gs/strconv/atoi.gs.js +1 -1
  158. package/dist/gs/strconv/atoi.gs.js.map +1 -1
  159. package/dist/gs/strconv/complex.gs.d.ts +3 -0
  160. package/dist/gs/strconv/complex.gs.js +148 -0
  161. package/dist/gs/strconv/complex.gs.js.map +1 -0
  162. package/dist/gs/strconv/index.d.ts +1 -0
  163. package/dist/gs/strconv/index.js +1 -0
  164. package/dist/gs/strconv/index.js.map +1 -1
  165. package/dist/gs/strings/builder.js +1 -1
  166. package/dist/gs/strings/reader.d.ts +1 -1
  167. package/dist/gs/strings/reader.js +11 -7
  168. package/dist/gs/strings/reader.js.map +1 -1
  169. package/dist/gs/strings/replace.js +15 -7
  170. package/dist/gs/strings/replace.js.map +1 -1
  171. package/dist/gs/strings/strings.d.ts +5 -0
  172. package/dist/gs/strings/strings.js +57 -5
  173. package/dist/gs/strings/strings.js.map +1 -1
  174. package/dist/gs/sync/atomic/type.gs.js +9 -9
  175. package/dist/gs/sync/atomic/type.gs.js.map +1 -1
  176. package/dist/gs/sync/atomic/value.gs.js +2 -2
  177. package/dist/gs/sync/atomic/value.gs.js.map +1 -1
  178. package/dist/gs/sync/sync.d.ts +2 -1
  179. package/dist/gs/sync/sync.js +37 -16
  180. package/dist/gs/sync/sync.js.map +1 -1
  181. package/dist/gs/syscall/env.js +22 -14
  182. package/dist/gs/syscall/env.js.map +1 -1
  183. package/dist/gs/syscall/js/index.js +9 -0
  184. package/dist/gs/syscall/js/index.js.map +1 -1
  185. package/dist/gs/testing/testing.js +59 -15
  186. package/dist/gs/testing/testing.js.map +1 -1
  187. package/dist/gs/time/time.d.ts +24 -1
  188. package/dist/gs/time/time.js +43 -3
  189. package/dist/gs/time/time.js.map +1 -1
  190. package/dist/gs/unique/index.js +7 -1
  191. package/dist/gs/unique/index.js.map +1 -1
  192. package/go.mod +3 -3
  193. package/go.sum +16 -0
  194. package/gs/builtin/builtin.ts +25 -2
  195. package/gs/builtin/runtime-contract.test.ts +260 -18
  196. package/gs/builtin/slice.ts +51 -4
  197. package/gs/builtin/type.ts +310 -63
  198. package/gs/builtin/varRef.ts +85 -2
  199. package/gs/bytes/buffer.gs.ts +1 -1
  200. package/gs/bytes/reader.gs.ts +1 -1
  201. package/gs/compress/zlib/index.test.ts +159 -1
  202. package/gs/compress/zlib/index.ts +164 -37
  203. package/gs/compress/zlib/meta.json +4 -1
  204. package/gs/compress/zlib/parity.json +51 -0
  205. package/gs/crypto/sha1/index.test.ts +19 -2
  206. package/gs/crypto/sha1/index.ts +3 -6
  207. package/gs/crypto/sha256/index.test.ts +14 -2
  208. package/gs/crypto/sha256/index.ts +3 -6
  209. package/gs/crypto/sha512/index.test.ts +17 -2
  210. package/gs/crypto/sha512/index.ts +3 -6
  211. package/gs/embed/index.test.ts +87 -0
  212. package/gs/embed/index.ts +229 -5
  213. package/gs/encoding/json/index.test.ts +360 -6
  214. package/gs/encoding/json/index.ts +679 -38
  215. package/gs/encoding/json/parity.json +81 -0
  216. package/gs/fmt/fmt.test.ts +41 -3
  217. package/gs/fmt/fmt.ts +40 -17
  218. package/gs/fmt/meta.json +6 -1
  219. package/gs/github.com/aperturerobotics/protobuf-go-lite/index.test.ts +211 -3
  220. package/gs/github.com/aperturerobotics/protobuf-go-lite/index.ts +857 -1
  221. package/gs/github.com/go-git/go-billy/v6/osfs/index.test.ts +110 -0
  222. package/gs/github.com/go-git/go-billy/v6/osfs/index.ts +280 -0
  223. package/gs/github.com/go-git/go-billy/v6/osfs/meta.json +8 -0
  224. package/gs/github.com/pkg/errors/errors.ts +54 -30
  225. package/gs/go/scanner/index.test.ts +39 -56
  226. package/gs/go/scanner/index.ts +33 -5
  227. package/gs/go/scanner/parity.json +27 -0
  228. package/gs/go/token/index.ts +22 -6
  229. package/gs/hash/index.test.ts +20 -33
  230. package/gs/hash/index.ts +28 -0
  231. package/gs/hash/parity.json +21 -0
  232. package/gs/internal/goarch/index.test.ts +32 -0
  233. package/gs/internal/goarch/index.ts +45 -13
  234. package/gs/internal/goarch/parity.json +144 -0
  235. package/gs/io/fs/fs.ts +26 -14
  236. package/gs/io/fs/readdir.test.ts +38 -0
  237. package/gs/io/fs/readdir.ts +8 -4
  238. package/gs/io/fs/sub.ts +8 -1
  239. package/gs/io/io.test.ts +77 -6
  240. package/gs/io/io.ts +115 -52
  241. package/gs/io/meta.json +7 -1
  242. package/gs/io/parity.json +162 -0
  243. package/gs/math/bits/index.test.ts +14 -1
  244. package/gs/math/bits/index.ts +75 -32
  245. package/gs/math/bits/parity.json +156 -0
  246. package/gs/mime/index.test.ts +90 -0
  247. package/gs/mime/index.ts +369 -6
  248. package/gs/mime/parity.json +36 -0
  249. package/gs/net/http/httptest/index.test.ts +98 -2
  250. package/gs/net/http/httptest/index.ts +101 -6
  251. package/gs/net/http/httptest/parity.json +15 -0
  252. package/gs/net/http/index.test.ts +797 -12
  253. package/gs/net/http/index.ts +1874 -136
  254. package/gs/net/http/meta.json +16 -1
  255. package/gs/net/http/parity.json +193 -0
  256. package/gs/os/dir_unix.gs.ts +1 -1
  257. package/gs/os/error.gs.ts +1 -1
  258. package/gs/os/exec.gs.ts +4 -8
  259. package/gs/os/exec_posix.gs.ts +1 -1
  260. package/gs/os/file_unix_js.test.ts +52 -0
  261. package/gs/os/index.test.ts +9 -0
  262. package/gs/os/index.ts +1 -0
  263. package/gs/os/meta.json +4 -0
  264. package/gs/os/parity.json +9 -0
  265. package/gs/os/proc.gs.ts +18 -5
  266. package/gs/os/proc.test.ts +26 -0
  267. package/gs/os/readdir.test.ts +56 -0
  268. package/gs/os/root_js.gs.ts +1 -1
  269. package/gs/os/types.gs.ts +1 -1
  270. package/gs/os/types_js.gs.ts +170 -9
  271. package/gs/os/types_unix.gs.ts +1 -1
  272. package/gs/path/path.ts +11 -7
  273. package/gs/reflect/deepequal.test.ts +10 -1
  274. package/gs/reflect/field.test.ts +37 -15
  275. package/gs/reflect/function-types.test.ts +518 -22
  276. package/gs/reflect/index.ts +8 -6
  277. package/gs/reflect/map.ts +20 -0
  278. package/gs/reflect/meta.json +6 -4
  279. package/gs/reflect/parity.json +234 -0
  280. package/gs/reflect/sliceat.test.ts +156 -0
  281. package/gs/reflect/structof.test.ts +401 -0
  282. package/gs/reflect/type.ts +1980 -365
  283. package/gs/reflect/typefor.test.ts +540 -10
  284. package/gs/reflect/types.ts +43 -18
  285. package/gs/reflect/value.ts +105 -45
  286. package/gs/reflect/visiblefields.ts +5 -168
  287. package/gs/runtime/parity.json +24 -0
  288. package/gs/runtime/pprof/index.test.ts +29 -7
  289. package/gs/runtime/pprof/index.ts +56 -30
  290. package/gs/runtime/pprof/parity.json +27 -0
  291. package/gs/runtime/runtime.test.ts +3 -1
  292. package/gs/runtime/runtime.ts +4 -3
  293. package/gs/runtime/trace/index.test.ts +5 -3
  294. package/gs/runtime/trace/index.ts +8 -20
  295. package/gs/runtime/trace/parity.json +36 -0
  296. package/gs/strconv/atoi.gs.ts +1 -1
  297. package/gs/strconv/complex.gs.ts +174 -0
  298. package/gs/strconv/complex.test.ts +65 -0
  299. package/gs/strconv/index.ts +1 -0
  300. package/gs/strconv/parity.json +120 -0
  301. package/gs/strings/builder.ts +1 -1
  302. package/gs/strings/meta.json +5 -2
  303. package/gs/strings/parity.json +186 -0
  304. package/gs/strings/reader.test.ts +2 -2
  305. package/gs/strings/reader.ts +11 -7
  306. package/gs/strings/replace.ts +15 -7
  307. package/gs/strings/strings.test.ts +22 -2
  308. package/gs/strings/strings.ts +64 -6
  309. package/gs/sync/atomic/type.gs.ts +9 -9
  310. package/gs/sync/atomic/value.gs.ts +2 -2
  311. package/gs/sync/meta.json +1 -0
  312. package/gs/sync/sync.test.ts +41 -1
  313. package/gs/sync/sync.ts +41 -16
  314. package/gs/syscall/env.ts +29 -14
  315. package/gs/syscall/js/index.test.ts +18 -0
  316. package/gs/syscall/js/index.ts +12 -0
  317. package/gs/testing/testing.test.ts +99 -3
  318. package/gs/testing/testing.ts +95 -24
  319. package/gs/time/parity.json +225 -0
  320. package/gs/time/time.test.ts +20 -2
  321. package/gs/time/time.ts +49 -7
  322. package/gs/unique/index.ts +7 -1
  323. package/package.json +4 -2
  324. package/dist/gs/github.com/aperturerobotics/starpc/srpc/index.d.ts +0 -217
  325. package/dist/gs/github.com/aperturerobotics/starpc/srpc/index.js +0 -814
  326. package/dist/gs/github.com/aperturerobotics/starpc/srpc/index.js.map +0 -1
  327. package/gs/github.com/aperturerobotics/starpc/srpc/index.test.ts +0 -31
  328. package/gs/github.com/aperturerobotics/starpc/srpc/index.ts +0 -1233
  329. package/gs/github.com/aperturerobotics/starpc/srpc/meta.json +0 -46
  330. /package/compiler/{wasm_api.go → wasm-api.go} +0 -0
@@ -2,7 +2,7 @@
2
2
  // This replaces the auto-generated version that has TypeScript syntax errors
3
3
 
4
4
  // UintSize is the size of a uint in bits
5
- export const UintSize = 32 // Assuming 32-bit for JavaScript numbers
5
+ export const UintSize = 64
6
6
 
7
7
  type Word64 = number | bigint
8
8
 
@@ -22,9 +22,13 @@ function word64Result(value: bigint, useBigInt: boolean): Word64 {
22
22
  : Number(value)
23
23
  }
24
24
 
25
+ function rotateCount(k: number, n: number): number {
26
+ return ((k % n) + n) % n
27
+ }
28
+
25
29
  // --- Leading zeros ---
26
- export function LeadingZeros(x: number): number {
27
- return Math.clz32(x >>> 0)
30
+ export function LeadingZeros(x: Word64): number {
31
+ return LeadingZeros64(x)
28
32
  }
29
33
 
30
34
  export function LeadingZeros8(x: number): number {
@@ -53,9 +57,8 @@ export function LeadingZeros64(x: Word64): number {
53
57
  }
54
58
 
55
59
  // --- Trailing zeros ---
56
- export function TrailingZeros(x: number): number {
57
- if (x === 0) return UintSize
58
- return TrailingZeros32(x)
60
+ export function TrailingZeros(x: Word64): number {
61
+ return TrailingZeros64(x)
59
62
  }
60
63
 
61
64
  export function TrailingZeros8(x: number): number {
@@ -90,8 +93,8 @@ export function TrailingZeros64(x: Word64): number {
90
93
  }
91
94
 
92
95
  // --- Ones count ---
93
- export function OnesCount(x: number): number {
94
- return OnesCount32(x)
96
+ export function OnesCount(x: Word64): number {
97
+ return OnesCount64(x)
95
98
  }
96
99
 
97
100
  export function OnesCount8(x: number): number {
@@ -124,36 +127,40 @@ export function OnesCount64(x: Word64): number {
124
127
  }
125
128
 
126
129
  // --- Rotate left ---
127
- export function RotateLeft(x: number, k: number): number {
128
- return RotateLeft32(x, k)
130
+ export function RotateLeft(x: number, k: number): number
131
+ export function RotateLeft(x: bigint, k: number): bigint
132
+ export function RotateLeft(x: Word64, k: number): number
133
+ export function RotateLeft(x: Word64, k: number): Word64 {
134
+ return RotateLeft64(x, k)
129
135
  }
130
136
 
131
137
  export function RotateLeft8(x: number, k: number): number {
132
138
  const n = 8
133
- k = k % n
139
+ k = rotateCount(k, n)
134
140
  x = x & 0xff
135
141
  return ((x << k) | (x >> (n - k))) & 0xff
136
142
  }
137
143
 
138
144
  export function RotateLeft16(x: number, k: number): number {
139
145
  const n = 16
140
- k = k % n
146
+ k = rotateCount(k, n)
141
147
  x = x & 0xffff
142
148
  return ((x << k) | (x >> (n - k))) & 0xffff
143
149
  }
144
150
 
145
151
  export function RotateLeft32(x: number, k: number): number {
146
152
  const n = 32
147
- k = k % n
153
+ k = rotateCount(k, n)
148
154
  x = x >>> 0 // Ensure unsigned
149
155
  return ((x << k) | (x >>> (n - k))) >>> 0
150
156
  }
151
157
 
152
158
  export function RotateLeft64(x: number, k: number): number
153
159
  export function RotateLeft64(x: bigint, k: number): bigint
160
+ export function RotateLeft64(x: Word64, k: number): number
154
161
  export function RotateLeft64(x: Word64, k: number): Word64 {
155
162
  const n = 64
156
- k = k % n
163
+ k = rotateCount(k, n)
157
164
  const useBigInt = useBigIntResult(x)
158
165
  const word = toUint64(x)
159
166
  return word64Result(
@@ -163,8 +170,11 @@ export function RotateLeft64(x: Word64, k: number): Word64 {
163
170
  }
164
171
 
165
172
  // --- Reverse ---
166
- export function Reverse(x: number): number {
167
- return Reverse32(x)
173
+ export function Reverse(x: number): number
174
+ export function Reverse(x: bigint): bigint
175
+ export function Reverse(x: Word64): number
176
+ export function Reverse(x: Word64): Word64 {
177
+ return Reverse64(x)
168
178
  }
169
179
 
170
180
  export function Reverse8(x: number): number {
@@ -196,6 +206,7 @@ export function Reverse32(x: number): number {
196
206
 
197
207
  export function Reverse64(x: number): number
198
208
  export function Reverse64(x: bigint): bigint
209
+ export function Reverse64(x: Word64): number
199
210
  export function Reverse64(x: Word64): Word64 {
200
211
  // Implement 64-bit reverse using similar bit manipulation
201
212
  const useBigInt = useBigIntResult(x)
@@ -226,8 +237,11 @@ export function Reverse64(x: Word64): Word64 {
226
237
  }
227
238
 
228
239
  // --- ReverseBytes ---
229
- export function ReverseBytes(x: number): number {
230
- return ReverseBytes32(x)
240
+ export function ReverseBytes(x: number): number
241
+ export function ReverseBytes(x: bigint): bigint
242
+ export function ReverseBytes(x: Word64): number
243
+ export function ReverseBytes(x: Word64): Word64 {
244
+ return ReverseBytes64(x)
231
245
  }
232
246
 
233
247
  export function ReverseBytes16(x: number): number {
@@ -247,6 +261,7 @@ export function ReverseBytes32(x: number): number {
247
261
 
248
262
  export function ReverseBytes64(x: number): number
249
263
  export function ReverseBytes64(x: bigint): bigint
264
+ export function ReverseBytes64(x: Word64): number
250
265
  export function ReverseBytes64(x: Word64): Word64 {
251
266
  const useBigInt = useBigIntResult(x)
252
267
  const word = toUint64(x)
@@ -266,8 +281,8 @@ export function ReverseBytes64(x: Word64): Word64 {
266
281
  }
267
282
 
268
283
  // --- Len ---
269
- export function Len(x: number): number {
270
- return Len32(x)
284
+ export function Len(x: Word64): number {
285
+ return Len64(x)
271
286
  }
272
287
 
273
288
  export function Len8(x: number): number {
@@ -287,8 +302,11 @@ export function Len64(x: Word64): number {
287
302
  }
288
303
 
289
304
  // --- Multiplication functions ---
290
- export function Mul(x: number, y: number): [number, number] {
291
- return Mul32(x, y)
305
+ export function Mul(x: number, y: number): [number, number]
306
+ export function Mul(x: bigint, y: bigint): [bigint, bigint]
307
+ export function Mul(x: Word64, y: Word64): [number, number]
308
+ export function Mul(x: Word64, y: Word64): [Word64, Word64] {
309
+ return Mul64(x, y)
292
310
  }
293
311
 
294
312
  export function Mul32(x: number, y: number): [number, number] {
@@ -301,6 +319,7 @@ export function Mul32(x: number, y: number): [number, number] {
301
319
 
302
320
  export function Mul64(x: number, y: number): [number, number]
303
321
  export function Mul64(x: bigint, y: bigint): [bigint, bigint]
322
+ export function Mul64(x: Word64, y: Word64): [number, number]
304
323
  export function Mul64(x: Word64, y: Word64): [Word64, Word64] {
305
324
  const useBigInt = useBigIntResult(x, y)
306
325
  x = toUint64(x)
@@ -309,15 +328,15 @@ export function Mul64(x: Word64, y: Word64): [Word64, Word64] {
309
328
  const lo = product & uint64Mask
310
329
  const hi = product >> 64n
311
330
 
312
- return [
313
- word64Result(hi & uint64Mask, useBigInt),
314
- word64Result(lo, useBigInt),
315
- ]
331
+ return [word64Result(hi & uint64Mask, useBigInt), word64Result(lo, useBigInt)]
316
332
  }
317
333
 
318
334
  // --- Division functions ---
319
- export function Div(hi: number, lo: number, y: number): [number, number] {
320
- return Div32(hi, lo, y)
335
+ export function Div(hi: number, lo: number, y: number): [number, number]
336
+ export function Div(hi: bigint, lo: bigint, y: bigint): [bigint, bigint]
337
+ export function Div(hi: Word64, lo: Word64, y: Word64): [number, number]
338
+ export function Div(hi: Word64, lo: Word64, y: Word64): [Word64, Word64] {
339
+ return Div64(hi, lo, y)
321
340
  }
322
341
 
323
342
  export function Div32(hi: number, lo: number, y: number): [number, number] {
@@ -337,6 +356,7 @@ export function Div32(hi: number, lo: number, y: number): [number, number] {
337
356
 
338
357
  export function Div64(hi: number, lo: number, y: number): [number, number]
339
358
  export function Div64(hi: bigint, lo: bigint, y: bigint): [bigint, bigint]
359
+ export function Div64(hi: Word64, lo: Word64, y: Word64): [number, number]
340
360
  export function Div64(hi: Word64, lo: Word64, y: Word64): [Word64, Word64] {
341
361
  const useBigInt = useBigIntResult(hi, lo, y)
342
362
  hi = toUint64(hi)
@@ -355,9 +375,27 @@ export function Div64(hi: Word64, lo: Word64, y: Word64): [Word64, Word64] {
355
375
  return [word64Result(quotient, useBigInt), word64Result(remainder, useBigInt)]
356
376
  }
357
377
 
378
+ export function Rem(hi: Word64, lo: Word64, y: Word64): Word64 {
379
+ return Div(hi, lo, y)[1]
380
+ }
381
+
382
+ export function Rem32(hi: number, lo: number, y: number): number {
383
+ return Div32(hi, lo, y)[1]
384
+ }
385
+
386
+ export function Rem64(hi: number, lo: number, y: number): number
387
+ export function Rem64(hi: bigint, lo: bigint, y: bigint): bigint
388
+ export function Rem64(hi: Word64, lo: Word64, y: Word64): number
389
+ export function Rem64(hi: Word64, lo: Word64, y: Word64): Word64 {
390
+ return Div64(hi, lo, y)[1]
391
+ }
392
+
358
393
  // --- Add and Sub with carry ---
359
- export function Add(x: number, y: number, carry: number): [number, number] {
360
- return Add32(x, y, carry)
394
+ export function Add(x: number, y: number, carry: number): [number, number]
395
+ export function Add(x: bigint, y: bigint, carry: bigint): [bigint, bigint]
396
+ export function Add(x: Word64, y: Word64, carry: Word64): [number, number]
397
+ export function Add(x: Word64, y: Word64, carry: Word64): [Word64, Word64] {
398
+ return Add64(x, y, carry)
361
399
  }
362
400
 
363
401
  export function Add32(x: number, y: number, carry: number): [number, number] {
@@ -369,6 +407,7 @@ export function Add32(x: number, y: number, carry: number): [number, number] {
369
407
 
370
408
  export function Add64(x: number, y: number, carry: number): [number, number]
371
409
  export function Add64(x: bigint, y: bigint, carry: bigint): [bigint, bigint]
410
+ export function Add64(x: Word64, y: Word64, carry: Word64): [number, number]
372
411
  export function Add64(x: Word64, y: Word64, carry: Word64): [Word64, Word64] {
373
412
  const useBigInt = useBigIntResult(x, y, carry)
374
413
  const sum = toUint64(x) + toUint64(y) + toUint64(carry)
@@ -377,8 +416,11 @@ export function Add64(x: Word64, y: Word64, carry: Word64): [Word64, Word64] {
377
416
  return [word64Result(result, useBigInt), word64Result(carryOut, useBigInt)]
378
417
  }
379
418
 
380
- export function Sub(x: number, y: number, borrow: number): [number, number] {
381
- return Sub32(x, y, borrow)
419
+ export function Sub(x: number, y: number, borrow: number): [number, number]
420
+ export function Sub(x: bigint, y: bigint, borrow: bigint): [bigint, bigint]
421
+ export function Sub(x: Word64, y: Word64, borrow: Word64): [number, number]
422
+ export function Sub(x: Word64, y: Word64, borrow: Word64): [Word64, Word64] {
423
+ return Sub64(x, y, borrow)
382
424
  }
383
425
 
384
426
  export function Sub32(x: number, y: number, borrow: number): [number, number] {
@@ -390,6 +432,7 @@ export function Sub32(x: number, y: number, borrow: number): [number, number] {
390
432
 
391
433
  export function Sub64(x: number, y: number, borrow: number): [number, number]
392
434
  export function Sub64(x: bigint, y: bigint, borrow: bigint): [bigint, bigint]
435
+ export function Sub64(x: Word64, y: Word64, borrow: Word64): [number, number]
393
436
  export function Sub64(x: Word64, y: Word64, borrow: Word64): [Word64, Word64] {
394
437
  const useBigInt = useBigIntResult(x, y, borrow)
395
438
  const diff = toUint64(x) - toUint64(y) - toUint64(borrow)
@@ -0,0 +1,156 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "strict": true,
4
+ "symbols": {
5
+ "Add": {
6
+ "status": "real"
7
+ },
8
+ "Add32": {
9
+ "status": "real"
10
+ },
11
+ "Add64": {
12
+ "status": "real"
13
+ },
14
+ "Div": {
15
+ "status": "real"
16
+ },
17
+ "Div32": {
18
+ "status": "real"
19
+ },
20
+ "Div64": {
21
+ "status": "real"
22
+ },
23
+ "LeadingZeros": {
24
+ "status": "real"
25
+ },
26
+ "LeadingZeros16": {
27
+ "status": "real"
28
+ },
29
+ "LeadingZeros32": {
30
+ "status": "real"
31
+ },
32
+ "LeadingZeros64": {
33
+ "status": "real"
34
+ },
35
+ "LeadingZeros8": {
36
+ "status": "real"
37
+ },
38
+ "Len": {
39
+ "status": "real"
40
+ },
41
+ "Len16": {
42
+ "status": "real"
43
+ },
44
+ "Len32": {
45
+ "status": "real"
46
+ },
47
+ "Len64": {
48
+ "status": "real"
49
+ },
50
+ "Len8": {
51
+ "status": "real"
52
+ },
53
+ "Mul": {
54
+ "status": "real"
55
+ },
56
+ "Mul32": {
57
+ "status": "real"
58
+ },
59
+ "Mul64": {
60
+ "status": "real"
61
+ },
62
+ "OnesCount": {
63
+ "status": "real"
64
+ },
65
+ "OnesCount16": {
66
+ "status": "real"
67
+ },
68
+ "OnesCount32": {
69
+ "status": "real"
70
+ },
71
+ "OnesCount64": {
72
+ "status": "real"
73
+ },
74
+ "OnesCount8": {
75
+ "status": "real"
76
+ },
77
+ "Rem": {
78
+ "status": "real"
79
+ },
80
+ "Rem32": {
81
+ "status": "real"
82
+ },
83
+ "Rem64": {
84
+ "status": "real"
85
+ },
86
+ "Reverse": {
87
+ "status": "real"
88
+ },
89
+ "Reverse16": {
90
+ "status": "real"
91
+ },
92
+ "Reverse32": {
93
+ "status": "real"
94
+ },
95
+ "Reverse64": {
96
+ "status": "real"
97
+ },
98
+ "Reverse8": {
99
+ "status": "real"
100
+ },
101
+ "ReverseBytes": {
102
+ "status": "real"
103
+ },
104
+ "ReverseBytes16": {
105
+ "status": "real"
106
+ },
107
+ "ReverseBytes32": {
108
+ "status": "real"
109
+ },
110
+ "ReverseBytes64": {
111
+ "status": "real"
112
+ },
113
+ "RotateLeft": {
114
+ "status": "real"
115
+ },
116
+ "RotateLeft16": {
117
+ "status": "real"
118
+ },
119
+ "RotateLeft32": {
120
+ "status": "real"
121
+ },
122
+ "RotateLeft64": {
123
+ "status": "real"
124
+ },
125
+ "RotateLeft8": {
126
+ "status": "real"
127
+ },
128
+ "Sub": {
129
+ "status": "real"
130
+ },
131
+ "Sub32": {
132
+ "status": "real"
133
+ },
134
+ "Sub64": {
135
+ "status": "real"
136
+ },
137
+ "TrailingZeros": {
138
+ "status": "real"
139
+ },
140
+ "TrailingZeros16": {
141
+ "status": "real"
142
+ },
143
+ "TrailingZeros32": {
144
+ "status": "real"
145
+ },
146
+ "TrailingZeros64": {
147
+ "status": "real"
148
+ },
149
+ "TrailingZeros8": {
150
+ "status": "real"
151
+ },
152
+ "UintSize": {
153
+ "status": "real"
154
+ }
155
+ }
156
+ }
@@ -0,0 +1,90 @@
1
+ import { describe, expect, it } from 'vitest'
2
+
3
+ import {
4
+ AddExtensionType,
5
+ BEncoding,
6
+ ErrInvalidMediaParameter,
7
+ ExtensionsByType,
8
+ FormatMediaType,
9
+ ParseMediaType,
10
+ QEncoding,
11
+ TypeByExtension,
12
+ WordDecoder,
13
+ WordEncoder_Encode,
14
+ } from './index.js'
15
+
16
+ describe('mime override', () => {
17
+ it('parses, formats, and looks up media types', () => {
18
+ const [mediaType, params, err] = ParseMediaType(
19
+ 'Text/Plain; Charset="utf-8"; format=flowed',
20
+ )
21
+ expect(err).toBeNull()
22
+ expect(mediaType).toBe('text/plain')
23
+ expect(params.get('charset')).toBe('utf-8')
24
+ expect(params.get('format')).toBe('flowed')
25
+ const [trailingMediaType, trailingParams, trailingErr] = ParseMediaType('text/plain;')
26
+ expect(trailingErr).toBeNull()
27
+ expect(trailingMediaType).toBe('text/plain')
28
+ expect(trailingParams.size).toBe(0)
29
+
30
+ expect(
31
+ FormatMediaType('text/plain', new Map([['charset', 'utf-8']])),
32
+ ).toBe('text/plain; charset=utf-8')
33
+ expect(
34
+ FormatMediaType('Attachment', new Map([['FileName', 'hello.txt']])),
35
+ ).toBe('attachment; filename=hello.txt')
36
+ expect(
37
+ FormatMediaType('attachment', new Map([['filename', 'foo bar.txt']])),
38
+ ).toBe('attachment; filename="foo bar.txt"')
39
+ expect(
40
+ FormatMediaType('text/plain', new Map([
41
+ ['z', 'last'],
42
+ ['a', 'first'],
43
+ ])),
44
+ ).toBe('text/plain; a=first; z=last')
45
+
46
+ const encoded = FormatMediaType(
47
+ 'attachment',
48
+ new Map([['filename', 'résumé.txt']]),
49
+ )
50
+ expect(encoded).toBe("attachment; filename*=utf-8''r%C3%A9sum%C3%A9.txt")
51
+ const [, encodedParams, encodedErr] = ParseMediaType(encoded)
52
+ expect(encodedErr).toBeNull()
53
+ expect(encodedParams.get('filename')).toBe('résumé.txt')
54
+ const [, pathParams, pathErr] = ParseMediaType('form-data; filename="C:\\dev\\go.txt"; quoted="a\\"b"')
55
+ expect(pathErr).toBeNull()
56
+ expect(pathParams.get('filename')).toBe('C:\\dev\\go.txt')
57
+ expect(pathParams.get('quoted')).toBe('a"b')
58
+
59
+ expect(TypeByExtension('.json')).toBe('application/json')
60
+ expect(AddExtensionType('.goscript', 'text/plain; charset=utf-8')).toBeNull()
61
+ const [extensions, extensionErr] = ExtensionsByType('text/plain')
62
+ expect(extensionErr).toBeNull()
63
+ expect(extensions).toContain('.goscript')
64
+ })
65
+
66
+ it('reports invalid media parameters', () => {
67
+ const [, , err] = ParseMediaType('text/plain; broken')
68
+ expect(err).toBe(ErrInvalidMediaParameter)
69
+ expect(ParseMediaType('text/plain; filename=foo bar')[2]).toBe(ErrInvalidMediaParameter)
70
+ expect(ParseMediaType('text/plain; filename="unterminated')[2]).toBe(ErrInvalidMediaParameter)
71
+ expect(ParseMediaType('text/plain; x=1; x=2')[2]).toBe(ErrInvalidMediaParameter)
72
+ expect(ParseMediaType('text/plain; bad[]=x')[2]).toBe(ErrInvalidMediaParameter)
73
+ expect(ParseMediaType('text/plain; bad{}=x')[1].get('bad{}')).toBe('x')
74
+ })
75
+
76
+ it('encodes and decodes RFC 2047 words', () => {
77
+ expect(WordEncoder_Encode(BEncoding, 'utf-8', 'hello')).toBe('hello')
78
+
79
+ const bWord = WordEncoder_Encode(BEncoding, 'utf-8', 'héllo')
80
+ expect(new WordDecoder().Decode(bWord)).toEqual(['héllo', null])
81
+
82
+ const qWord = WordEncoder_Encode(QEncoding, 'utf-8', 'hello world')
83
+ expect(qWord).toBe('hello world')
84
+
85
+ const encodedQWord = WordEncoder_Encode(QEncoding, 'utf-8', 'héllo world')
86
+ const [header, err] = new WordDecoder().DecodeHeader(`subject ${encodedQWord}`)
87
+ expect(err).toBeNull()
88
+ expect(header).toBe('subject héllo world')
89
+ })
90
+ })