goscript 0.1.0 → 0.1.1

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 (327) hide show
  1. package/README.md +267 -255
  2. package/cmd/goscript/cmd-test.go +193 -0
  3. package/cmd/goscript/cmd-test_test.go +76 -0
  4. package/cmd/goscript/main.go +1 -0
  5. package/compiler/build-flags.go +38 -0
  6. package/compiler/compile-request.go +2 -0
  7. package/compiler/compliance_test.go +0 -8
  8. package/compiler/gotest/owner.go +24 -0
  9. package/compiler/gotest/package-result.go +67 -0
  10. package/compiler/gotest/request.go +145 -0
  11. package/compiler/gotest/result.go +28 -0
  12. package/compiler/gotest/runner.go +588 -0
  13. package/compiler/gotest/runner_test.go +627 -0
  14. package/compiler/gotest/test.go +9 -0
  15. package/compiler/index.test.ts +1 -1
  16. package/compiler/lowered-program.go +71 -19
  17. package/compiler/lowering.go +5065 -569
  18. package/compiler/override-facts.go +307 -0
  19. package/compiler/override-registry.go +50 -189
  20. package/compiler/override-registry_test.go +47 -0
  21. package/compiler/package-graph.go +50 -27
  22. package/compiler/package-graph_test.go +37 -2
  23. package/compiler/package-test-function.go +9 -0
  24. package/compiler/package-test-graph-package.go +40 -0
  25. package/compiler/package-test-graph-variant.go +105 -0
  26. package/compiler/package-test-graph.go +117 -0
  27. package/compiler/package-test-graph_test.go +144 -0
  28. package/compiler/runtime-contract.go +189 -29
  29. package/compiler/runtime-contract_test.go +44 -30
  30. package/compiler/semantic-model-types.go +9 -6
  31. package/compiler/semantic-model.go +538 -38
  32. package/compiler/semantic-model_test.go +55 -0
  33. package/compiler/service.go +1 -1
  34. package/compiler/skeleton_test.go +679 -49
  35. package/compiler/tsworkspace/owner.go +334 -0
  36. package/compiler/tsworkspace/owner_test.go +93 -0
  37. package/compiler/tsworkspace/result.go +17 -0
  38. package/compiler/typescript-emitter.go +459 -82
  39. package/compiler/wasm/compile.go +1 -1
  40. package/compiler/wasm/compile_test.go +61 -11
  41. package/compiler/wasm_api.go +172 -7
  42. package/dist/gs/builtin/builtin.d.ts +20 -2
  43. package/dist/gs/builtin/builtin.js +194 -6
  44. package/dist/gs/builtin/builtin.js.map +1 -1
  45. package/dist/gs/builtin/channel.d.ts +8 -0
  46. package/dist/gs/builtin/channel.js +12 -0
  47. package/dist/gs/builtin/channel.js.map +1 -1
  48. package/dist/gs/builtin/slice.d.ts +22 -2
  49. package/dist/gs/builtin/slice.js +216 -44
  50. package/dist/gs/builtin/slice.js.map +1 -1
  51. package/dist/gs/builtin/type.d.ts +5 -2
  52. package/dist/gs/builtin/type.js +83 -24
  53. package/dist/gs/builtin/type.js.map +1 -1
  54. package/dist/gs/builtin/varRef.d.ts +5 -0
  55. package/dist/gs/builtin/varRef.js +23 -0
  56. package/dist/gs/builtin/varRef.js.map +1 -1
  57. package/dist/gs/bytes/buffer.gs.js +48 -44
  58. package/dist/gs/bytes/buffer.gs.js.map +1 -1
  59. package/dist/gs/bytes/reader.gs.js +20 -18
  60. package/dist/gs/bytes/reader.gs.js.map +1 -1
  61. package/dist/gs/context/context.d.ts +5 -4
  62. package/dist/gs/context/context.js +10 -10
  63. package/dist/gs/context/context.js.map +1 -1
  64. package/dist/gs/crypto/internal/fips140deps/byteorder/index.d.ts +1 -0
  65. package/dist/gs/crypto/internal/fips140deps/byteorder/index.js +2 -0
  66. package/dist/gs/crypto/internal/fips140deps/byteorder/index.js.map +1 -0
  67. package/dist/gs/crypto/internal/fips140deps/godebug/index.d.ts +1 -0
  68. package/dist/gs/crypto/internal/fips140deps/godebug/index.js +2 -0
  69. package/dist/gs/crypto/internal/fips140deps/godebug/index.js.map +1 -0
  70. package/dist/gs/embed/index.d.ts +7 -0
  71. package/dist/gs/embed/index.js +16 -0
  72. package/dist/gs/embed/index.js.map +1 -0
  73. package/dist/gs/encoding/json/index.d.ts +1 -0
  74. package/dist/gs/encoding/json/index.js +18 -0
  75. package/dist/gs/encoding/json/index.js.map +1 -1
  76. package/dist/gs/errors/errors.d.ts +4 -0
  77. package/dist/gs/errors/errors.js +81 -0
  78. package/dist/gs/errors/errors.js.map +1 -1
  79. package/dist/gs/fmt/fmt.d.ts +4 -4
  80. package/dist/gs/fmt/fmt.js +42 -11
  81. package/dist/gs/fmt/fmt.js.map +1 -1
  82. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.d.ts +35 -0
  83. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.js +211 -1
  84. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.js.map +1 -1
  85. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.d.ts +189 -0
  86. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.js +825 -0
  87. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.js.map +1 -0
  88. package/dist/gs/github.com/aperturerobotics/starpc/srpc/index.d.ts +163 -0
  89. package/dist/gs/github.com/aperturerobotics/starpc/srpc/index.js +449 -0
  90. package/dist/gs/github.com/aperturerobotics/starpc/srpc/index.js.map +1 -0
  91. package/dist/gs/github.com/klauspost/compress/internal/le/index.d.ts +9 -0
  92. package/dist/gs/github.com/klauspost/compress/internal/le/index.js +71 -0
  93. package/dist/gs/github.com/klauspost/compress/internal/le/index.js.map +1 -0
  94. package/dist/gs/go/internal/scannerhooks/index.d.ts +3 -0
  95. package/dist/gs/go/internal/scannerhooks/index.js +5 -0
  96. package/dist/gs/go/internal/scannerhooks/index.js.map +1 -0
  97. package/dist/gs/go/scanner/index.d.ts +13 -0
  98. package/dist/gs/go/scanner/index.js +35 -0
  99. package/dist/gs/go/scanner/index.js.map +1 -1
  100. package/dist/gs/go/token/index.d.ts +156 -0
  101. package/dist/gs/go/token/index.js +500 -4
  102. package/dist/gs/go/token/index.js.map +1 -1
  103. package/dist/gs/internal/abi/index.d.ts +4 -0
  104. package/dist/gs/internal/abi/index.js +10 -0
  105. package/dist/gs/internal/abi/index.js.map +1 -1
  106. package/dist/gs/internal/bytealg/index.d.ts +2 -0
  107. package/dist/gs/internal/bytealg/index.js +14 -0
  108. package/dist/gs/internal/bytealg/index.js.map +1 -1
  109. package/dist/gs/internal/byteorder/index.d.ts +8 -2
  110. package/dist/gs/internal/byteorder/index.js +56 -25
  111. package/dist/gs/internal/byteorder/index.js.map +1 -1
  112. package/dist/gs/internal/godebug/index.d.ts +12 -0
  113. package/dist/gs/internal/godebug/index.js +30 -0
  114. package/dist/gs/internal/godebug/index.js.map +1 -0
  115. package/dist/gs/io/fs/index.d.ts +1 -0
  116. package/dist/gs/io/fs/index.js +1 -0
  117. package/dist/gs/io/fs/index.js.map +1 -1
  118. package/dist/gs/io/fs/readlink.d.ts +8 -0
  119. package/dist/gs/io/fs/readlink.js +64 -0
  120. package/dist/gs/io/fs/readlink.js.map +1 -0
  121. package/dist/gs/io/fs/walk.d.ts +3 -3
  122. package/dist/gs/io/fs/walk.js +7 -7
  123. package/dist/gs/io/fs/walk.js.map +1 -1
  124. package/dist/gs/io/io.d.ts +40 -6
  125. package/dist/gs/io/io.js +151 -26
  126. package/dist/gs/io/io.js.map +1 -1
  127. package/dist/gs/maps/iter.d.ts +3 -3
  128. package/dist/gs/maps/iter.js +3 -3
  129. package/dist/gs/maps/iter.js.map +1 -1
  130. package/dist/gs/maps/maps.d.ts +2 -2
  131. package/dist/gs/maps/maps.js +1 -1
  132. package/dist/gs/maps/maps.js.map +1 -1
  133. package/dist/gs/math/bits/index.d.ts +13 -4
  134. package/dist/gs/math/bits/index.js +66 -34
  135. package/dist/gs/math/bits/index.js.map +1 -1
  136. package/dist/gs/math/const.gs.d.ts +5 -5
  137. package/dist/gs/math/const.gs.js +4 -4
  138. package/dist/gs/math/const.gs.js.map +1 -1
  139. package/dist/gs/mime/index.d.ts +1 -0
  140. package/dist/gs/mime/index.js +50 -0
  141. package/dist/gs/mime/index.js.map +1 -0
  142. package/dist/gs/net/http/httptest/index.d.ts +11 -0
  143. package/dist/gs/net/http/httptest/index.js +21 -0
  144. package/dist/gs/net/http/httptest/index.js.map +1 -0
  145. package/dist/gs/net/http/index.d.ts +27 -0
  146. package/dist/gs/net/http/index.js +61 -0
  147. package/dist/gs/net/http/index.js.map +1 -0
  148. package/dist/gs/os/dir_unix.gs.js +2 -2
  149. package/dist/gs/os/dir_unix.gs.js.map +1 -1
  150. package/dist/gs/os/types_js.gs.js.map +1 -1
  151. package/dist/gs/path/filepath/match.js +165 -3
  152. package/dist/gs/path/filepath/match.js.map +1 -1
  153. package/dist/gs/path/filepath/path.d.ts +3 -1
  154. package/dist/gs/path/filepath/path.js +133 -4
  155. package/dist/gs/path/filepath/path.js.map +1 -1
  156. package/dist/gs/path/path.d.ts +4 -1
  157. package/dist/gs/path/path.js +16 -4
  158. package/dist/gs/path/path.js.map +1 -1
  159. package/dist/gs/reflect/index.d.ts +1 -1
  160. package/dist/gs/reflect/index.js +1 -1
  161. package/dist/gs/reflect/index.js.map +1 -1
  162. package/dist/gs/reflect/map.js +3 -0
  163. package/dist/gs/reflect/map.js.map +1 -1
  164. package/dist/gs/reflect/type.d.ts +7 -4
  165. package/dist/gs/reflect/type.js +148 -7
  166. package/dist/gs/reflect/type.js.map +1 -1
  167. package/dist/gs/runtime/debug/index.d.ts +2 -0
  168. package/dist/gs/runtime/debug/index.js +8 -0
  169. package/dist/gs/runtime/debug/index.js.map +1 -0
  170. package/dist/gs/runtime/runtime.d.ts +35 -3
  171. package/dist/gs/runtime/runtime.js +72 -0
  172. package/dist/gs/runtime/runtime.js.map +1 -1
  173. package/dist/gs/slices/slices.d.ts +24 -5
  174. package/dist/gs/slices/slices.js +214 -5
  175. package/dist/gs/slices/slices.js.map +1 -1
  176. package/dist/gs/sort/slice.gs.d.ts +3 -3
  177. package/dist/gs/sort/slice.gs.js +6 -6
  178. package/dist/gs/sort/slice.gs.js.map +1 -1
  179. package/dist/gs/sort/sort.gs.d.ts +4 -4
  180. package/dist/gs/sort/sort.gs.js +11 -8
  181. package/dist/gs/sort/sort.gs.js.map +1 -1
  182. package/dist/gs/strings/builder.d.ts +1 -1
  183. package/dist/gs/strings/builder.js +3 -2
  184. package/dist/gs/strings/builder.js.map +1 -1
  185. package/dist/gs/sync/atomic/type.gs.d.ts +9 -8
  186. package/dist/gs/sync/atomic/type.gs.js +0 -2
  187. package/dist/gs/sync/atomic/type.gs.js.map +1 -1
  188. package/dist/gs/sync/sync.d.ts +2 -0
  189. package/dist/gs/sync/sync.js +27 -0
  190. package/dist/gs/sync/sync.js.map +1 -1
  191. package/dist/gs/syscall/constants.d.ts +36 -24
  192. package/dist/gs/syscall/constants.js +12 -0
  193. package/dist/gs/syscall/constants.js.map +1 -1
  194. package/dist/gs/syscall/errors.d.ts +2 -0
  195. package/dist/gs/syscall/errors.js +8 -0
  196. package/dist/gs/syscall/errors.js.map +1 -1
  197. package/dist/gs/syscall/fs.d.ts +43 -0
  198. package/dist/gs/syscall/fs.js +102 -0
  199. package/dist/gs/syscall/fs.js.map +1 -1
  200. package/dist/gs/syscall/js/index.d.ts +90 -0
  201. package/dist/gs/syscall/js/index.js +375 -0
  202. package/dist/gs/syscall/js/index.js.map +1 -0
  203. package/dist/gs/syscall/types.d.ts +22 -0
  204. package/dist/gs/syscall/types.js +45 -1
  205. package/dist/gs/syscall/types.js.map +1 -1
  206. package/dist/gs/testing/index.d.ts +1 -0
  207. package/dist/gs/testing/index.js +2 -0
  208. package/dist/gs/testing/index.js.map +1 -0
  209. package/dist/gs/testing/testing.d.ts +77 -0
  210. package/dist/gs/testing/testing.js +301 -0
  211. package/dist/gs/testing/testing.js.map +1 -0
  212. package/dist/gs/time/time.d.ts +41 -4
  213. package/dist/gs/time/time.js +205 -36
  214. package/dist/gs/time/time.js.map +1 -1
  215. package/dist/gs/unicode/unicode.d.ts +23 -1
  216. package/dist/gs/unicode/unicode.js +79 -10
  217. package/dist/gs/unicode/unicode.js.map +1 -1
  218. package/dist/gs/unicode/utf8/utf8.d.ts +4 -4
  219. package/dist/gs/unicode/utf8/utf8.js +24 -11
  220. package/dist/gs/unicode/utf8/utf8.js.map +1 -1
  221. package/dist/gs/unique/index.d.ts +11 -0
  222. package/dist/gs/unique/index.js +71 -0
  223. package/dist/gs/unique/index.js.map +1 -0
  224. package/go.sum +9 -0
  225. package/gs/builtin/builtin.ts +239 -8
  226. package/gs/builtin/channel.ts +22 -0
  227. package/gs/builtin/runtime-contract.test.ts +126 -0
  228. package/gs/builtin/slice.ts +259 -50
  229. package/gs/builtin/type.ts +109 -34
  230. package/gs/builtin/varRef.ts +38 -1
  231. package/gs/bytes/buffer.gs.ts +48 -44
  232. package/gs/bytes/meta.json +8 -3
  233. package/gs/bytes/reader.gs.ts +20 -19
  234. package/gs/context/context.test.ts +41 -0
  235. package/gs/context/context.ts +22 -26
  236. package/gs/crypto/internal/fips140deps/byteorder/index.ts +1 -0
  237. package/gs/crypto/internal/fips140deps/godebug/index.ts +1 -0
  238. package/gs/embed/index.ts +20 -0
  239. package/gs/embed/meta.json +5 -0
  240. package/gs/encoding/json/index.test.ts +15 -1
  241. package/gs/encoding/json/index.ts +24 -0
  242. package/gs/errors/errors.test.ts +82 -0
  243. package/gs/errors/errors.ts +104 -0
  244. package/gs/fmt/fmt.ts +56 -16
  245. package/gs/github.com/aperturerobotics/protobuf-go-lite/index.test.ts +73 -1
  246. package/gs/github.com/aperturerobotics/protobuf-go-lite/index.ts +297 -1
  247. package/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.test.ts +159 -0
  248. package/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.ts +1005 -0
  249. package/gs/github.com/aperturerobotics/starpc/srpc/index.ts +719 -0
  250. package/gs/github.com/aperturerobotics/starpc/srpc/meta.json +40 -0
  251. package/gs/github.com/klauspost/compress/internal/le/index.test.ts +36 -0
  252. package/gs/github.com/klauspost/compress/internal/le/index.ts +114 -0
  253. package/gs/go/internal/scannerhooks/index.test.ts +14 -0
  254. package/gs/go/internal/scannerhooks/index.ts +9 -0
  255. package/gs/go/scanner/index.test.ts +22 -0
  256. package/gs/go/scanner/index.ts +47 -0
  257. package/gs/go/token/index.test.ts +47 -1
  258. package/gs/go/token/index.ts +570 -4
  259. package/gs/internal/abi/index.test.ts +18 -0
  260. package/gs/internal/abi/index.ts +14 -0
  261. package/gs/internal/bytealg/index.test.ts +18 -0
  262. package/gs/internal/bytealg/index.ts +16 -0
  263. package/gs/internal/byteorder/index.test.ts +39 -0
  264. package/gs/internal/byteorder/index.ts +100 -27
  265. package/gs/internal/godebug/index.test.ts +16 -0
  266. package/gs/internal/godebug/index.ts +35 -0
  267. package/gs/io/fs/index.ts +1 -0
  268. package/gs/io/fs/meta.json +5 -0
  269. package/gs/io/fs/readlink.test.ts +43 -0
  270. package/gs/io/fs/readlink.ts +77 -0
  271. package/gs/io/fs/walk.test.ts +61 -0
  272. package/gs/io/fs/walk.ts +9 -9
  273. package/gs/io/io.ts +174 -31
  274. package/gs/io/meta.json +10 -2
  275. package/gs/maps/iter.ts +12 -6
  276. package/gs/maps/maps.ts +8 -6
  277. package/gs/math/bits/index.ts +103 -47
  278. package/gs/math/const.gs.test.ts +11 -5
  279. package/gs/math/const.gs.ts +5 -6
  280. package/gs/mime/index.ts +54 -0
  281. package/gs/net/http/httptest/index.ts +25 -0
  282. package/gs/net/http/index.test.ts +20 -0
  283. package/gs/net/http/index.ts +81 -0
  284. package/gs/os/dir_unix.gs.ts +2 -3
  285. package/gs/os/types_js.gs.ts +2 -2
  286. package/gs/path/filepath/match.test.ts +31 -12
  287. package/gs/path/filepath/match.ts +178 -3
  288. package/gs/path/filepath/path.test.ts +25 -0
  289. package/gs/path/filepath/path.ts +159 -5
  290. package/gs/path/path.ts +20 -5
  291. package/gs/reflect/index.ts +1 -0
  292. package/gs/reflect/map.test.ts +19 -0
  293. package/gs/reflect/map.ts +4 -0
  294. package/gs/reflect/type.ts +197 -17
  295. package/gs/runtime/debug/index.test.ts +24 -0
  296. package/gs/runtime/debug/index.ts +8 -0
  297. package/gs/runtime/runtime.test.ts +19 -0
  298. package/gs/runtime/runtime.ts +98 -3
  299. package/gs/slices/slices.test.ts +94 -0
  300. package/gs/slices/slices.ts +245 -5
  301. package/gs/sort/meta.json +7 -0
  302. package/gs/sort/slice.gs.ts +16 -7
  303. package/gs/sort/sort.gs.ts +16 -13
  304. package/gs/strings/builder.ts +4 -3
  305. package/gs/sync/atomic/type.gs.ts +13 -14
  306. package/gs/sync/meta.json +3 -1
  307. package/gs/sync/sync.test.ts +13 -1
  308. package/gs/sync/sync.ts +27 -0
  309. package/gs/syscall/constants.ts +39 -24
  310. package/gs/syscall/errors.ts +10 -0
  311. package/gs/syscall/fs.ts +195 -0
  312. package/gs/syscall/js/index.ts +458 -0
  313. package/gs/syscall/js/meta.json +4 -0
  314. package/gs/syscall/net.test.ts +85 -0
  315. package/gs/syscall/types.ts +56 -0
  316. package/gs/testing/index.ts +1 -0
  317. package/gs/testing/meta.json +5 -0
  318. package/gs/testing/testing.test.ts +90 -0
  319. package/gs/testing/testing.ts +382 -0
  320. package/gs/time/time.test.ts +106 -0
  321. package/gs/time/time.ts +278 -57
  322. package/gs/unicode/unicode.test.ts +25 -0
  323. package/gs/unicode/unicode.ts +119 -9
  324. package/gs/unicode/utf8/utf8.test.ts +13 -0
  325. package/gs/unicode/utf8/utf8.ts +28 -16
  326. package/gs/unique/index.ts +91 -0
  327. package/package.json +2 -1
@@ -1,28 +1,30 @@
1
1
  import * as $ from '@goscript/builtin/index.js'
2
2
 
3
- // Stub implementations for internal/byteorder package
4
3
  export function LittleEndian(): boolean {
5
- return true // Assume little endian for JS
4
+ return true
6
5
  }
7
6
 
8
- // Big Endian byte order functions
9
7
  export function BEUint16(b: $.Bytes): number {
10
8
  return (b![0] << 8) | b![1]
11
9
  }
12
10
 
13
11
  export function BEUint32(b: $.Bytes): number {
14
- return (b![0] << 24) | (b![1] << 16) | (b![2] << 8) | b![3]
12
+ return (((b![0] << 24) >>> 0) | (b![1] << 16) | (b![2] << 8) | b![3]) >>> 0
15
13
  }
16
14
 
17
15
  export function BEUint64(b: $.Bytes): number {
18
- // JavaScript numbers are 64-bit floats, so we'll lose precision for very large integers
19
- // For our stub purposes, this should be sufficient
20
- let high = BEUint32(b)
21
- let low = BEUint32($.goSlice(b, 4, undefined))
22
- return high * 0x100000000 + low
16
+ return Number(
17
+ (BigInt(b![0]) << 56n) |
18
+ (BigInt(b![1]) << 48n) |
19
+ (BigInt(b![2]) << 40n) |
20
+ (BigInt(b![3]) << 32n) |
21
+ (BigInt(b![4]) << 24n) |
22
+ (BigInt(b![5]) << 16n) |
23
+ (BigInt(b![6]) << 8n) |
24
+ BigInt(b![7]),
25
+ )
23
26
  }
24
27
 
25
- // Little Endian byte order functions
26
28
  export function LEUint16(b: $.Bytes): number {
27
29
  return b![0] | (b![1] << 8)
28
30
  }
@@ -32,14 +34,18 @@ export function LEUint32(b: $.Bytes): number {
32
34
  }
33
35
 
34
36
  export function LEUint64(b: $.Bytes): number {
35
- // JavaScript numbers are 64-bit floats, so we'll lose precision for very large integers
36
- // For our stub purposes, this should be sufficient
37
- let low = LEUint32(b)
38
- let high = LEUint32($.goSlice(b, 4, undefined))
39
- return low + high * 0x100000000
37
+ return Number(
38
+ BigInt(b![0]) |
39
+ (BigInt(b![1]) << 8n) |
40
+ (BigInt(b![2]) << 16n) |
41
+ (BigInt(b![3]) << 24n) |
42
+ (BigInt(b![4]) << 32n) |
43
+ (BigInt(b![5]) << 40n) |
44
+ (BigInt(b![6]) << 48n) |
45
+ (BigInt(b![7]) << 56n),
46
+ )
40
47
  }
41
48
 
42
- // Big Endian Put functions
43
49
  export function BEPutUint16(b: $.Bytes, v: number): void {
44
50
  b![0] = (v >> 8) & 0xff
45
51
  b![1] = v & 0xff
@@ -52,14 +58,18 @@ export function BEPutUint32(b: $.Bytes, v: number): void {
52
58
  b![3] = v & 0xff
53
59
  }
54
60
 
55
- export function BEPutUint64(b: $.Bytes, v: number): void {
56
- const high = Math.floor(v / 0x100000000)
57
- const low = v >>> 0
58
- BEPutUint32(b, high)
59
- BEPutUint32($.goSlice(b, 4, undefined), low)
61
+ export function BEPutUint64(b: $.Bytes, v: bigint | number): void {
62
+ const x = BigInt(v) & ((1n << 64n) - 1n)
63
+ b![0] = Number((x >> 56n) & 0xffn)
64
+ b![1] = Number((x >> 48n) & 0xffn)
65
+ b![2] = Number((x >> 40n) & 0xffn)
66
+ b![3] = Number((x >> 32n) & 0xffn)
67
+ b![4] = Number((x >> 24n) & 0xffn)
68
+ b![5] = Number((x >> 16n) & 0xffn)
69
+ b![6] = Number((x >> 8n) & 0xffn)
70
+ b![7] = Number(x & 0xffn)
60
71
  }
61
72
 
62
- // Little Endian Put functions
63
73
  export function LEPutUint16(b: $.Bytes, v: number): void {
64
74
  b![0] = v & 0xff
65
75
  b![1] = (v >> 8) & 0xff
@@ -72,9 +82,72 @@ export function LEPutUint32(b: $.Bytes, v: number): void {
72
82
  b![3] = (v >> 24) & 0xff
73
83
  }
74
84
 
75
- export function LEPutUint64(b: $.Bytes, v: number): void {
76
- const low = v >>> 0
77
- const high = Math.floor(v / 0x100000000)
78
- LEPutUint32(b, low)
79
- LEPutUint32($.goSlice(b, 4, undefined), high)
85
+ export function LEPutUint64(b: $.Bytes, v: bigint | number): void {
86
+ const x = BigInt(v) & ((1n << 64n) - 1n)
87
+ b![0] = Number(x & 0xffn)
88
+ b![1] = Number((x >> 8n) & 0xffn)
89
+ b![2] = Number((x >> 16n) & 0xffn)
90
+ b![3] = Number((x >> 24n) & 0xffn)
91
+ b![4] = Number((x >> 32n) & 0xffn)
92
+ b![5] = Number((x >> 40n) & 0xffn)
93
+ b![6] = Number((x >> 48n) & 0xffn)
94
+ b![7] = Number((x >> 56n) & 0xffn)
95
+ }
96
+
97
+ export function BEAppendUint16(b: $.Bytes | null, v: number): $.Bytes {
98
+ return $.append(b, (v >> 8) & 0xff, v & 0xff) as $.Bytes
99
+ }
100
+
101
+ export function BEAppendUint32(b: $.Bytes | null, v: number): $.Bytes {
102
+ return $.append(
103
+ b,
104
+ (v >> 24) & 0xff,
105
+ (v >> 16) & 0xff,
106
+ (v >> 8) & 0xff,
107
+ v & 0xff,
108
+ ) as $.Bytes
109
+ }
110
+
111
+ export function BEAppendUint64(b: $.Bytes | null, v: bigint | number): $.Bytes {
112
+ const x = BigInt(v) & ((1n << 64n) - 1n)
113
+ return $.append(
114
+ b,
115
+ Number((x >> 56n) & 0xffn),
116
+ Number((x >> 48n) & 0xffn),
117
+ Number((x >> 40n) & 0xffn),
118
+ Number((x >> 32n) & 0xffn),
119
+ Number((x >> 24n) & 0xffn),
120
+ Number((x >> 16n) & 0xffn),
121
+ Number((x >> 8n) & 0xffn),
122
+ Number(x & 0xffn),
123
+ ) as $.Bytes
124
+ }
125
+
126
+ export function LEAppendUint16(b: $.Bytes | null, v: number): $.Bytes {
127
+ return $.append(b, v & 0xff, (v >> 8) & 0xff) as $.Bytes
128
+ }
129
+
130
+ export function LEAppendUint32(b: $.Bytes | null, v: number): $.Bytes {
131
+ return $.append(
132
+ b,
133
+ v & 0xff,
134
+ (v >> 8) & 0xff,
135
+ (v >> 16) & 0xff,
136
+ (v >> 24) & 0xff,
137
+ ) as $.Bytes
138
+ }
139
+
140
+ export function LEAppendUint64(b: $.Bytes | null, v: bigint | number): $.Bytes {
141
+ const x = BigInt(v) & ((1n << 64n) - 1n)
142
+ return $.append(
143
+ b,
144
+ Number(x & 0xffn),
145
+ Number((x >> 8n) & 0xffn),
146
+ Number((x >> 16n) & 0xffn),
147
+ Number((x >> 24n) & 0xffn),
148
+ Number((x >> 32n) & 0xffn),
149
+ Number((x >> 40n) & 0xffn),
150
+ Number((x >> 48n) & 0xffn),
151
+ Number((x >> 56n) & 0xffn),
152
+ ) as $.Bytes
80
153
  }
@@ -0,0 +1,16 @@
1
+ import { describe, expect, it } from 'vitest'
2
+
3
+ import { New, Setting, Value } from './index.js'
4
+
5
+ describe('internal/godebug override', () => {
6
+ it('returns stable setting values', () => {
7
+ const setting = New('#fips140')
8
+
9
+ expect(setting).toBeInstanceOf(Setting)
10
+ expect(setting.Name()).toBe('fips140')
11
+ expect(setting.Undocumented()).toBe(true)
12
+ expect(setting.Value()).toBe('')
13
+ expect(setting.String()).toBe('fips140=')
14
+ expect(Value('fips140')).toBe('')
15
+ })
16
+ })
@@ -0,0 +1,35 @@
1
+ import * as $ from '@goscript/builtin/index.js'
2
+
3
+ export class Setting {
4
+ constructor(public name = '') {}
5
+
6
+ public IncNonDefault(): void {}
7
+
8
+ public Name(): string {
9
+ return this.name.startsWith('#') ? this.name.slice(1) : this.name
10
+ }
11
+
12
+ public String(): string {
13
+ return `${this.Name()}=${this.Value()}`
14
+ }
15
+
16
+ public Undocumented(): boolean {
17
+ return this.name.startsWith('#')
18
+ }
19
+
20
+ public Value(): string {
21
+ return ''
22
+ }
23
+
24
+ public clone(): Setting {
25
+ return new Setting(this.name)
26
+ }
27
+ }
28
+
29
+ export function New(name: string): Setting {
30
+ return $.markAsStructValue(new Setting(name))
31
+ }
32
+
33
+ export function Value(name: string): string {
34
+ return New(name).Value()
35
+ }
package/gs/io/fs/index.ts CHANGED
@@ -3,6 +3,7 @@ export * from './fs.js'
3
3
  export * from './glob.js'
4
4
  export * from './readdir.js'
5
5
  export * from './readfile.js'
6
+ export * from './readlink.js'
6
7
  export * from './stat.js'
7
8
  export * from './sub.js'
8
9
  export * from './walk.js'
@@ -0,0 +1,5 @@
1
+ {
2
+ "asyncFunctions": {
3
+ "WalkDir": true
4
+ }
5
+ }
@@ -0,0 +1,43 @@
1
+ import { describe, expect, it } from 'vitest'
2
+
3
+ import type { File, FileInfo } from './fs.js'
4
+ import { ErrInvalid } from './fs.js'
5
+ import { Lstat, ReadLink } from './readlink.js'
6
+
7
+ class linkFS {
8
+ Open(_name: string): [File, Error | null] {
9
+ return [null, ErrInvalid]
10
+ }
11
+
12
+ ReadLink(_name: string): [string, Error | null] {
13
+ return ['target.txt', null]
14
+ }
15
+
16
+ Lstat(_name: string): [FileInfo, Error | null] {
17
+ return [null, ErrInvalid]
18
+ }
19
+ }
20
+
21
+ class basicFS {
22
+ Open(_name: string): [File, Error | null] {
23
+ return [null, ErrInvalid]
24
+ }
25
+ }
26
+
27
+ describe('io/fs ReadLink', () => {
28
+ it('delegates to ReadLinkFS implementations', () => {
29
+ expect(ReadLink(new linkFS(), 'link')).toEqual(['target.txt', null])
30
+ })
31
+
32
+ it('returns readlink PathError when unsupported', () => {
33
+ const [, err] = ReadLink(new basicFS(), 'link')
34
+
35
+ expect(err?.Error()).toBe('readlink link: invalid argument')
36
+ })
37
+
38
+ it('uses Lstat from ReadLinkFS implementations', () => {
39
+ const [, err] = Lstat(new linkFS(), 'link')
40
+
41
+ expect(err).toBe(ErrInvalid)
42
+ })
43
+ })
@@ -0,0 +1,77 @@
1
+ import * as $ from '@goscript/builtin/index.js'
2
+ import { ErrInvalid, FileInfo, FS, PathError } from './fs.js'
3
+ import { Stat } from './stat.js'
4
+
5
+ export type ReadLinkFS =
6
+ | null
7
+ | ({
8
+ ReadLink(name: string): [string, $.GoError]
9
+ Lstat(name: string): [FileInfo, $.GoError]
10
+ } & FS)
11
+
12
+ $.registerInterfaceType(
13
+ 'ReadLinkFS',
14
+ null,
15
+ [
16
+ {
17
+ name: 'ReadLink',
18
+ args: [
19
+ { name: 'name', type: { kind: $.TypeKind.Basic, name: 'string' } },
20
+ ],
21
+ returns: [
22
+ { type: { kind: $.TypeKind.Basic, name: 'string' } },
23
+ {
24
+ type: {
25
+ kind: $.TypeKind.Interface,
26
+ name: 'GoError',
27
+ methods: [
28
+ {
29
+ name: 'Error',
30
+ args: [],
31
+ returns: [{ type: { kind: $.TypeKind.Basic, name: 'string' } }],
32
+ },
33
+ ],
34
+ },
35
+ },
36
+ ],
37
+ },
38
+ {
39
+ name: 'Lstat',
40
+ args: [
41
+ { name: 'name', type: { kind: $.TypeKind.Basic, name: 'string' } },
42
+ ],
43
+ returns: [
44
+ { type: 'FileInfo' },
45
+ {
46
+ type: {
47
+ kind: $.TypeKind.Interface,
48
+ name: 'GoError',
49
+ methods: [
50
+ {
51
+ name: 'Error',
52
+ args: [],
53
+ returns: [{ type: { kind: $.TypeKind.Basic, name: 'string' } }],
54
+ },
55
+ ],
56
+ },
57
+ },
58
+ ],
59
+ },
60
+ ],
61
+ )
62
+
63
+ export function ReadLink(fsys: FS, name: string): [string, $.GoError] {
64
+ const { value: sym, ok } = $.typeAssert<ReadLinkFS>(fsys, 'ReadLinkFS')
65
+ if (!ok) {
66
+ return ['', new PathError({ Err: ErrInvalid, Op: 'readlink', Path: name })]
67
+ }
68
+ return sym!.ReadLink(name)
69
+ }
70
+
71
+ export function Lstat(fsys: FS, name: string): [FileInfo, $.GoError] {
72
+ const { value: sym, ok } = $.typeAssert<ReadLinkFS>(fsys, 'ReadLinkFS')
73
+ if (!ok) {
74
+ return Stat(fsys, name)
75
+ }
76
+ return sym!.Lstat(name)
77
+ }
@@ -0,0 +1,61 @@
1
+ import { describe, expect, it } from 'vitest'
2
+
3
+ import type { File, FileInfo } from './fs.js'
4
+ import { ModeDir } from './fs.js'
5
+ import { WalkDir } from './walk.js'
6
+
7
+ class info implements FileInfo {
8
+ constructor(
9
+ private name: string,
10
+ private dir: boolean,
11
+ ) {}
12
+
13
+ IsDir(): boolean {
14
+ return this.dir
15
+ }
16
+
17
+ ModTime(): any {
18
+ return null
19
+ }
20
+
21
+ Mode(): number {
22
+ return this.dir ? ModeDir : 0
23
+ }
24
+
25
+ Name(): string {
26
+ return this.name
27
+ }
28
+
29
+ Size(): number {
30
+ return 0
31
+ }
32
+
33
+ Sys(): null {
34
+ return null
35
+ }
36
+ }
37
+
38
+ class singleFileFS {
39
+ Open(_name: string): [File, Error | null] {
40
+ return [null, new Error('unused')]
41
+ }
42
+
43
+ Stat(name: string): [FileInfo, Error | null] {
44
+ return [new info(name, false), null]
45
+ }
46
+ }
47
+
48
+ describe('io/fs WalkDir', () => {
49
+ it('awaits async walk callbacks', async () => {
50
+ const visited: string[] = []
51
+
52
+ const err = await WalkDir(new singleFileFS(), 'root.txt', async (name) => {
53
+ await Promise.resolve()
54
+ visited.push(name)
55
+ return null
56
+ })
57
+
58
+ expect(err).toBeNull()
59
+ expect(visited).toEqual(['root.txt'])
60
+ })
61
+ })
package/gs/io/fs/walk.ts CHANGED
@@ -12,19 +12,19 @@ export let SkipDir: $.GoError = errors.New('skip this directory')
12
12
  export let SkipAll: $.GoError = errors.New('skip everything and stop the walk')
13
13
 
14
14
  export type WalkDirFunc =
15
- | ((path: string, d: DirEntry, err: $.GoError) => $.GoError)
15
+ | ((path: string, d: DirEntry, err: $.GoError) => $.GoError | Promise<$.GoError>)
16
16
  | null
17
17
 
18
18
  // walkDir recursively descends path, calling walkDirFn.
19
- export function walkDir(
19
+ export async function walkDir(
20
20
  fsys: FS,
21
21
  name: string,
22
22
  d: DirEntry,
23
23
  walkDirFn: WalkDirFunc,
24
- ): $.GoError {
24
+ ): Promise<$.GoError> {
25
25
  // Successfully skipped directory.
26
26
  {
27
- let err = walkDirFn!(name, d, null)
27
+ let err = await walkDirFn!(name, d, null)
28
28
  if (err != null || !d!.IsDir()) {
29
29
  // Successfully skipped directory.
30
30
  if (err == SkipDir && d!.IsDir()) {
@@ -40,7 +40,7 @@ export function walkDir(
40
40
  // Second call, to report ReadDir error.
41
41
  if (err != null) {
42
42
  // Second call, to report ReadDir error.
43
- err = walkDirFn!(name, d, err)
43
+ err = await walkDirFn!(name, d, err)
44
44
  if (err != null) {
45
45
  if (err == SkipDir && d!.IsDir()) {
46
46
  err = null
@@ -54,7 +54,7 @@ export function walkDir(
54
54
  {
55
55
  let name1 = path.Join(name, d1!.Name())
56
56
  {
57
- let err = walkDir(fsys, name1, d1, walkDirFn)
57
+ let err = await walkDir(fsys, name1, d1, walkDirFn)
58
58
  if (err != null) {
59
59
  if (err == SkipDir) {
60
60
  break
@@ -79,12 +79,12 @@ export function walkDir(
79
79
  //
80
80
  // WalkDir does not follow symbolic links found in directories,
81
81
  // but if root itself is a symbolic link, its target will be walked.
82
- export function WalkDir(fsys: FS, root: string, fn: WalkDirFunc): $.GoError {
82
+ export async function WalkDir(fsys: FS, root: string, fn: WalkDirFunc): Promise<$.GoError> {
83
83
  let [info, err] = Stat(fsys, root)
84
84
  if (err != null) {
85
- err = fn!(root, null, err)
85
+ err = await fn!(root, null, err)
86
86
  } else {
87
- err = walkDir(fsys, root, FileInfoToDirEntry(info), fn)
87
+ err = await walkDir(fsys, root, FileInfoToDirEntry(info), fn)
88
88
  }
89
89
  if (err == SkipDir || err == SkipAll) {
90
90
  return null