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
@@ -47,10 +47,10 @@ export let SmallestNonzeroFloat64: number = Number.MIN_VALUE
47
47
  let intSize: number = (32 << ((~(0 as number) >> 63)))
48
48
 
49
49
  // MaxInt32 or MaxInt64 depending on intSize.
50
- export let MaxInt: bigint = 9223372036854775807n
50
+ export let MaxInt: number = 9223372036854775807
51
51
 
52
52
  // MinInt32 or MinInt64 depending on intSize.
53
- export let MinInt: bigint = -9223372036854775808n
53
+ export let MinInt: number = -9223372036854775808
54
54
 
55
55
  // 127
56
56
  export let MaxInt8: number = 127
@@ -71,10 +71,10 @@ export let MaxInt32: number = 2147483647
71
71
  export let MinInt32: number = -2147483648
72
72
 
73
73
  // 9223372036854775807
74
- export let MaxInt64: bigint = 9223372036854775807n
74
+ export let MaxInt64: number = 9223372036854775807
75
75
 
76
76
  // -9223372036854775808
77
- export let MinInt64: bigint = -9223372036854775808n
77
+ export let MinInt64: number = -9223372036854775808
78
78
 
79
79
  // MaxUint32 or MaxUint64 depending on intSize.
80
80
  export let MaxUint: bigint = 0xFFFFFFFFFFFFFFFFn
@@ -89,5 +89,4 @@ export let MaxUint16: number = 65535
89
89
  export let MaxUint32: number = 4294967295
90
90
 
91
91
  // 18446744073709551615
92
- export let MaxUint64: bigint = 0xFFFFFFFFFFFFFFFFn
93
-
92
+ export let MaxUint64: number | bigint = 0xFFFFFFFFFFFFFFFFn
@@ -0,0 +1,54 @@
1
+ export function FormatMediaType(t: string, param: Map<string, string> | Record<string, string> | null): string {
2
+ if (!isToken(t)) {
3
+ return ''
4
+ }
5
+ let out = t
6
+ const entries = param instanceof Map ? Array.from(param.entries()) : Object.entries(param ?? {})
7
+ entries.sort(([a], [b]) => a.localeCompare(b))
8
+ for (const [key, value] of entries) {
9
+ if (!isToken(key)) {
10
+ return ''
11
+ }
12
+ out += formatParam(key, String(value))
13
+ }
14
+ return out
15
+ }
16
+
17
+ function formatParam(key: string, value: string): string {
18
+ if (isToken(value)) {
19
+ return `; ${key}=${value}`
20
+ }
21
+ return `; ${key}*=utf-8''${percentEncode(value)}`
22
+ }
23
+
24
+ function isToken(value: string): boolean {
25
+ return /^[!#$%&'*+\-.^_`|~0-9A-Za-z]+$/.test(value)
26
+ }
27
+
28
+ function percentEncode(value: string): string {
29
+ let out = ''
30
+ for (const byte of new TextEncoder().encode(value)) {
31
+ if (
32
+ (byte >= 0x30 && byte <= 0x39) ||
33
+ (byte >= 0x41 && byte <= 0x5a) ||
34
+ (byte >= 0x61 && byte <= 0x7a) ||
35
+ byte === 0x21 ||
36
+ byte === 0x23 ||
37
+ byte === 0x24 ||
38
+ byte === 0x26 ||
39
+ byte === 0x2b ||
40
+ byte === 0x2d ||
41
+ byte === 0x2e ||
42
+ byte === 0x5e ||
43
+ byte === 0x5f ||
44
+ byte === 0x60 ||
45
+ byte === 0x7c ||
46
+ byte === 0x7e
47
+ ) {
48
+ out += String.fromCharCode(byte)
49
+ continue
50
+ }
51
+ out += `%${byte.toString(16).toUpperCase().padStart(2, '0')}`
52
+ }
53
+ return out
54
+ }
@@ -0,0 +1,25 @@
1
+ import * as $ from '@goscript/builtin/index.js'
2
+ import * as http from '@goscript/net/http/index.js'
3
+
4
+ export class ResponseRecorder implements http.ResponseWriter {
5
+ public Code = 200
6
+ public Body: $.Slice<number> = null
7
+ private headerMap = new http.Header()
8
+
9
+ public Header(): http.Header {
10
+ return this.headerMap
11
+ }
12
+
13
+ public Write(p: $.Slice<number>): [number, $.GoError] {
14
+ this.Body = $.append(this.Body, p)
15
+ return [$.len(p), null]
16
+ }
17
+
18
+ public WriteHeader(statusCode: number): void {
19
+ this.Code = statusCode
20
+ }
21
+ }
22
+
23
+ export function NewRecorder(): ResponseRecorder {
24
+ return new ResponseRecorder()
25
+ }
@@ -0,0 +1,20 @@
1
+ import { describe, expect, it } from 'vitest'
2
+
3
+ import { Get, Response, StatusOK, StatusText } from './index.js'
4
+
5
+ describe('net/http override', () => {
6
+ it('exports response status helpers', () => {
7
+ const resp = new Response({ StatusCode: StatusOK })
8
+
9
+ expect(resp.StatusCode).toBe(200)
10
+ expect(StatusText(resp.StatusCode)).toBe('OK')
11
+ expect(StatusText(599)).toBe('')
12
+ })
13
+
14
+ it('returns an explicit unsupported error for Get', () => {
15
+ const [resp, err] = Get('https://example.invalid')
16
+
17
+ expect(resp).toBeNull()
18
+ expect(err?.Error()).toBe('net/http: Get is not implemented in GoScript')
19
+ })
20
+ })
@@ -0,0 +1,81 @@
1
+ import * as $ from '@goscript/builtin/index.js'
2
+ import * as errors from '@goscript/errors/index.js'
3
+ import * as io from '@goscript/io/index.js'
4
+
5
+ export const StatusOK = 200
6
+
7
+ export function StatusText(code: number): string {
8
+ switch (code) {
9
+ case StatusOK:
10
+ return 'OK'
11
+ default:
12
+ return ''
13
+ }
14
+ }
15
+
16
+ export class Header extends Map<string, $.Slice<string>> {
17
+ public Add(key: string, value: string): void {
18
+ const values = Array.from(this.get(key) ?? [])
19
+ values.push(value)
20
+ this.set(key, $.arrayToSlice(values))
21
+ }
22
+
23
+ public Del(key: string): void {
24
+ this.delete(key)
25
+ }
26
+
27
+ public Get(key: string): string {
28
+ const values = this.get(key)
29
+ return values == null || values.length === 0 ? '' : String(values[0])
30
+ }
31
+
32
+ public Set(key: string, value: string): void {
33
+ this.set(key, $.arrayToSlice([value]))
34
+ }
35
+ }
36
+
37
+ export function Header_Add(h: Header, key: string, value: string): void {
38
+ h.Add(key, value)
39
+ }
40
+
41
+ export function Header_Del(h: Header, key: string): void {
42
+ h.Del(key)
43
+ }
44
+
45
+ export function Header_Get(h: Header, key: string): string {
46
+ return h.Get(key)
47
+ }
48
+
49
+ export function Header_Set(h: Header, key: string, value: string): void {
50
+ h.Set(key, value)
51
+ }
52
+
53
+ export interface ResponseWriter {
54
+ Header(): Header
55
+ Write(p: $.Slice<number>): [number, $.GoError]
56
+ WriteHeader(statusCode: number): void
57
+ }
58
+
59
+ export class Response {
60
+ public StatusCode: number
61
+ public Body: io.ReadCloser | null
62
+ public Header: Header
63
+
64
+ constructor(init?: Partial<Response>) {
65
+ this.StatusCode = init?.StatusCode ?? 0
66
+ this.Body = init?.Body ?? null
67
+ this.Header = init?.Header ?? new Header()
68
+ }
69
+
70
+ public clone(): Response {
71
+ return new Response({
72
+ Body: this.Body,
73
+ Header: this.Header,
74
+ StatusCode: this.StatusCode,
75
+ })
76
+ }
77
+ }
78
+
79
+ export function Get(_url: string): [Response | null, $.GoError] {
80
+ return [null, errors.New('net/http: Get is not implemented in GoScript')]
81
+ }
@@ -130,7 +130,7 @@ export function readIntBE(b: $.Bytes, size: uintptr): number {
130
130
  case 4:
131
131
  return (byteorder.BEUint32(b) as number)
132
132
  case 8:
133
- return (byteorder.BEUint64(b) as number)
133
+ return Number(byteorder.BEUint64(b))
134
134
  default:
135
135
  $.panic("syscall: readInt with unsupported size")
136
136
  return 0 // This line will never be reached due to panic, but satisfies TypeScript
@@ -146,10 +146,9 @@ export function readIntLE(b: $.Bytes, size: uintptr): number {
146
146
  case 4:
147
147
  return (byteorder.LEUint32(b) as number)
148
148
  case 8:
149
- return (byteorder.LEUint64(b) as number)
149
+ return Number(byteorder.LEUint64(b))
150
150
  default:
151
151
  $.panic("syscall: readInt with unsupported size")
152
152
  return 0 // This line will never be reached due to panic, but satisfies TypeScript
153
153
  }
154
154
  }
155
-
@@ -312,7 +312,7 @@ export class File {
312
312
  if (this.closed) {
313
313
  return [0, ErrClosed]
314
314
  }
315
- return io.Copy(this, r)
315
+ return io.Copy(this, r) as any
316
316
  }
317
317
 
318
318
  public Write(b: $.Bytes): [number, $.GoError] {
@@ -349,7 +349,7 @@ export class File {
349
349
  if (this.closed) {
350
350
  return [0, ErrClosed]
351
351
  }
352
- return io.Copy(w, this)
352
+ return io.Copy(w, this) as any
353
353
  }
354
354
 
355
355
  public Seek(offset: number, whence: number): [number, $.GoError] {
@@ -1,4 +1,7 @@
1
1
  import { describe, it, expect } from 'vitest'
2
+ import { mkdirSync, mkdtempSync, rmSync } from 'node:fs'
3
+ import { tmpdir } from 'node:os'
4
+ import { join } from 'node:path'
2
5
  import { Match, Glob, ErrBadPattern } from './match.js'
3
6
 
4
7
  describe('path/filepath - Pattern matching functions', () => {
@@ -216,20 +219,36 @@ describe('path/filepath - Pattern matching functions', () => {
216
219
  })
217
220
 
218
221
  describe('Glob', () => {
219
- it('should validate patterns but return empty results (no filesystem)', () => {
220
- // Valid patterns should not error
221
- const [files1, err1] = Glob('*.txt')
222
- expect(err1).toBeNull()
223
- expect(files1).toEqual([])
222
+ it('should read host filesystem matches', () => {
223
+ const root = mkdtempSync(join(tmpdir(), 'goscript-filepath-glob-'))
224
+ const oldwd = process.cwd()
225
+ try {
226
+ mkdirSync(join(root, 'a', 'b', 'c.d', 'e.f'), { recursive: true })
227
+ process.chdir(root)
228
+
229
+ const [files1, err1] = Glob('./*/*/*.d')
230
+ expect(err1).toBeNull()
231
+ expect(files1).toEqual(['a/b/c.d'])
224
232
 
225
- const [files2, err2] = Glob('dir/*')
226
- expect(err2).toBeNull()
227
- expect(files2).toEqual([])
233
+ const [files2, err2] = Glob('a/b/c.d/e.*')
234
+ expect(err2).toBeNull()
235
+ expect(files2).toEqual(['a/b/c.d/e.f'])
236
+ } finally {
237
+ process.chdir(oldwd)
238
+ rmSync(root, { force: true, recursive: true })
239
+ }
240
+ })
228
241
 
229
- // Invalid patterns should error
230
- const [files3, err3] = Glob('[unclosed')
231
- expect(err3).toBe(ErrBadPattern)
232
- expect(files3).toEqual([])
242
+ it('should validate bad patterns', () => {
243
+ const [files1, err1] = Glob('[unclosed')
244
+ expect(err1).toBe(ErrBadPattern)
245
+ expect(files1).toEqual([])
246
+ })
247
+
248
+ it('should return empty results for unmatched valid patterns', () => {
249
+ const [files1, err1] = Glob('missing-*.txt')
250
+ expect(err1).toBeNull()
251
+ expect(files1).toEqual([])
233
252
  })
234
253
  })
235
254
 
@@ -1,4 +1,5 @@
1
1
  import * as $ from '@goscript/builtin/index.js'
2
+ import { getHostRuntime, type NodeFSModule } from '@goscript/builtin/hostio.js'
2
3
 
3
4
  export const ErrBadPattern = $.newError('syntax error in pattern')
4
5
 
@@ -238,12 +239,186 @@ function matchCharClass(
238
239
  // The only possible returned error is ErrBadPattern, when pattern is malformed.
239
240
  export function Glob(pattern: string): [string[], $.GoError] {
240
241
  try {
241
- // Validate the pattern using the same logic as Match
242
242
  validatePattern(pattern)
243
- // We don't have filesystem access, so return empty array
244
- return [[], null]
243
+ return [globHost(pattern), null]
245
244
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
246
245
  } catch (err) {
247
246
  return [[], ErrBadPattern]
248
247
  }
249
248
  }
249
+
250
+ function hasMeta(path: string): boolean {
251
+ return /[*?[\\]/.test(path)
252
+ }
253
+
254
+ function splitPattern(pattern: string): { absolute: boolean; segments: string[] } {
255
+ const absolute = pattern.startsWith('/')
256
+ const segments = pattern.split('/').filter((segment, index) => {
257
+ if (index === 0 && segment === '') {
258
+ return false
259
+ }
260
+ return segment !== '' && segment !== '.'
261
+ })
262
+ return { absolute, segments }
263
+ }
264
+
265
+ function cleanMatch(path: string): string {
266
+ const absolute = path.startsWith('/')
267
+ const parts: string[] = []
268
+ for (const part of path.split('/')) {
269
+ if (part === '' || part === '.') {
270
+ continue
271
+ }
272
+ if (part === '..') {
273
+ if (parts.length > 0 && parts[parts.length - 1] !== '..') {
274
+ parts.pop()
275
+ } else if (!absolute) {
276
+ parts.push(part)
277
+ }
278
+ continue
279
+ }
280
+ parts.push(part)
281
+ }
282
+ const out = parts.join('/')
283
+ if (absolute) {
284
+ return '/' + out
285
+ }
286
+ return out === '' ? '.' : out
287
+ }
288
+
289
+ function joinPath(dir: string, name: string): string {
290
+ if (dir === '' || dir === '.') {
291
+ return name
292
+ }
293
+ if (dir === '/') {
294
+ return '/' + name
295
+ }
296
+ return dir.replace(/\/+$/, '') + '/' + name
297
+ }
298
+
299
+ type HostDirEntry = { name: string; isDir: boolean }
300
+
301
+ function readDir(path: string): HostDirEntry[] | null {
302
+ const runtime = getHostRuntime()
303
+ const denoObj = runtime.deno
304
+ if (denoObj?.readDirSync) {
305
+ try {
306
+ const entries: HostDirEntry[] = []
307
+ for (const entry of denoObj.readDirSync(path)) {
308
+ entries.push({ name: entry.name, isDir: !!entry.isDirectory })
309
+ }
310
+ entries.sort((a, b) => a.name.localeCompare(b.name))
311
+ return entries
312
+ } catch {
313
+ return null
314
+ }
315
+ }
316
+
317
+ const nodeFS = runtime.nodeFS
318
+ if (nodeFS?.readdirSync) {
319
+ try {
320
+ const entries = nodeFS
321
+ .readdirSync(path, { withFileTypes: true })
322
+ .map((entry: any) => ({
323
+ name: String(entry.name),
324
+ isDir:
325
+ typeof entry.isDirectory === 'function' ?
326
+ entry.isDirectory()
327
+ : false,
328
+ }))
329
+ entries.sort((a, b) => a.name.localeCompare(b.name))
330
+ return entries
331
+ } catch {
332
+ return null
333
+ }
334
+ }
335
+
336
+ return null
337
+ }
338
+
339
+ function exists(path: string): boolean {
340
+ const runtime = getHostRuntime()
341
+ if (runtime.deno?.statSync) {
342
+ try {
343
+ runtime.deno.statSync(path)
344
+ return true
345
+ } catch {
346
+ return false
347
+ }
348
+ }
349
+
350
+ const nodeFS = runtime.nodeFS
351
+ if (nodeFS?.statSync) {
352
+ try {
353
+ nodeFS.statSync(path)
354
+ return true
355
+ } catch {
356
+ return false
357
+ }
358
+ }
359
+
360
+ return false
361
+ }
362
+
363
+ function isDir(path: string, nodeFS?: NodeFSModule | null): boolean {
364
+ const runtime = getHostRuntime()
365
+ if (runtime.deno?.statSync) {
366
+ try {
367
+ return !!runtime.deno.statSync(path).isDirectory
368
+ } catch {
369
+ return false
370
+ }
371
+ }
372
+
373
+ const fs = nodeFS ?? runtime.nodeFS
374
+ if (fs?.statSync) {
375
+ try {
376
+ const stat = fs.statSync(path)
377
+ return typeof stat.isDirectory === 'function' ? stat.isDirectory() : false
378
+ } catch {
379
+ return false
380
+ }
381
+ }
382
+
383
+ return false
384
+ }
385
+
386
+ function globHost(pattern: string): string[] {
387
+ const { absolute, segments } = splitPattern(pattern)
388
+ if (!hasMeta(pattern)) {
389
+ return exists(pattern) ? [cleanMatch(pattern)] : []
390
+ }
391
+
392
+ let prefixes = [absolute ? '/' : '.']
393
+ for (const [index, segment] of segments.entries()) {
394
+ const next: string[] = []
395
+ const last = index === segments.length - 1
396
+ const segmentHasMeta = hasMeta(segment)
397
+ for (const prefix of prefixes) {
398
+ if (!segmentHasMeta) {
399
+ const candidate = joinPath(prefix, segment)
400
+ if (last || isDir(candidate)) {
401
+ next.push(candidate)
402
+ }
403
+ continue
404
+ }
405
+
406
+ const entries = readDir(prefix)
407
+ if (entries === null) {
408
+ continue
409
+ }
410
+ for (const entry of entries) {
411
+ const [matched, err] = Match(segment, entry.name)
412
+ if (err !== null || !matched) {
413
+ continue
414
+ }
415
+ if (last || entry.isDir) {
416
+ next.push(joinPath(prefix, entry.name))
417
+ }
418
+ }
419
+ }
420
+ prefixes = next
421
+ }
422
+
423
+ return prefixes.map(cleanMatch).sort()
424
+ }
@@ -1,4 +1,7 @@
1
1
  import { describe, it, expect } from 'vitest'
2
+ import { mkdirSync, mkdtempSync, rmSync, writeFileSync } from 'node:fs'
3
+ import { tmpdir } from 'node:os'
4
+ import { join } from 'node:path'
2
5
  import {
3
6
  Base,
4
7
  Dir,
@@ -16,6 +19,7 @@ import {
16
19
  Abs,
17
20
  Rel,
18
21
  EvalSymlinks,
22
+ Walk,
19
23
  Separator,
20
24
  ListSeparator,
21
25
  } from './path.js'
@@ -201,6 +205,27 @@ describe('path/filepath - Path manipulation functions', () => {
201
205
  })
202
206
  })
203
207
 
208
+ describe('Walk', () => {
209
+ it('should visit host filesystem paths in lexical order', () => {
210
+ const root = mkdtempSync(join(tmpdir(), 'goscript-filepath-walk-'))
211
+ try {
212
+ mkdirSync(join(root, 'a', 'b'), { recursive: true })
213
+ writeFileSync(join(root, 'a', 'b', 'file.txt'), 'ok')
214
+
215
+ const visited: string[] = []
216
+ const err = Walk(root, (path) => {
217
+ visited.push(path.slice(root.length).replace(/^\/?/, '') || '.')
218
+ return null
219
+ })
220
+
221
+ expect(err).toBeNull()
222
+ expect(visited).toEqual(['.', 'a', 'a/b', 'a/b/file.txt'])
223
+ } finally {
224
+ rmSync(root, { force: true, recursive: true })
225
+ }
226
+ })
227
+ })
228
+
204
229
  describe('Constants', () => {
205
230
  it('should have correct separator constants', () => {
206
231
  expect(Separator).toBe(47)