goscript 0.1.4 → 0.2.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 (295) 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} +7 -0
  5. package/cmd/goscript/cmd-test.go +14 -0
  6. package/cmd/goscript/cmd-test_test.go +1 -1
  7. package/cmd/goscript-wasm/main.go +38 -6
  8. package/compiler/compile-request.go +12 -9
  9. package/compiler/compliance_test.go +0 -1
  10. package/compiler/config.go +2 -0
  11. package/compiler/diagnostic.go +104 -12
  12. package/compiler/diagnostic_test.go +106 -0
  13. package/compiler/gotest/request.go +28 -0
  14. package/compiler/gotest/runner.go +354 -44
  15. package/compiler/gotest/runner_test.go +293 -1
  16. package/compiler/gotest/testdata/browserapi/browserapi_test.go +20 -0
  17. package/compiler/gotest/testdata/browserapi/go.mod +3 -0
  18. package/compiler/index.test.ts +23 -0
  19. package/compiler/lowered-program.go +33 -24
  20. package/compiler/lowering.go +746 -194
  21. package/compiler/lowering_bench_test.go +42 -27
  22. package/compiler/lowering_internal_test.go +18 -0
  23. package/compiler/override-facts.go +15 -0
  24. package/compiler/override-parity-verifier.go +450 -0
  25. package/compiler/override-parity.go +122 -0
  26. package/compiler/override-registry_test.go +559 -0
  27. package/compiler/protobuf-ts-binding.go +567 -0
  28. package/compiler/protobuf-ts-binding_test.go +402 -0
  29. package/compiler/runtime-contract.go +4 -0
  30. package/compiler/runtime-contract_test.go +2 -0
  31. package/compiler/semantic-model-types.go +9 -4
  32. package/compiler/semantic-model.go +282 -70
  33. package/compiler/semantic-model_test.go +82 -1
  34. package/compiler/service.go +21 -1
  35. package/compiler/skeleton_test.go +118 -10
  36. package/compiler/typescript-emitter.go +128 -13
  37. package/compiler/wasm/compile_test.go +37 -4
  38. package/compiler/{wasm_api.go → wasm-api.go} +57 -7
  39. package/dist/gs/builtin/hostio.js +5 -0
  40. package/dist/gs/builtin/hostio.js.map +1 -1
  41. package/dist/gs/builtin/slice.d.ts +13 -2
  42. package/dist/gs/builtin/slice.js +187 -6
  43. package/dist/gs/builtin/slice.js.map +1 -1
  44. package/dist/gs/builtin/type.d.ts +13 -5
  45. package/dist/gs/builtin/type.js +153 -60
  46. package/dist/gs/builtin/type.js.map +1 -1
  47. package/dist/gs/builtin/varRef.d.ts +11 -0
  48. package/dist/gs/builtin/varRef.js +57 -2
  49. package/dist/gs/builtin/varRef.js.map +1 -1
  50. package/dist/gs/bytes/buffer.gs.js +1 -1
  51. package/dist/gs/bytes/buffer.gs.js.map +1 -1
  52. package/dist/gs/bytes/reader.gs.js +1 -1
  53. package/dist/gs/bytes/reader.gs.js.map +1 -1
  54. package/dist/gs/compress/zlib/index.d.ts +10 -3
  55. package/dist/gs/compress/zlib/index.js +50 -16
  56. package/dist/gs/compress/zlib/index.js.map +1 -1
  57. package/dist/gs/encoding/json/index.d.ts +114 -0
  58. package/dist/gs/encoding/json/index.js +544 -36
  59. package/dist/gs/encoding/json/index.js.map +1 -1
  60. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.d.ts +101 -0
  61. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.js +589 -0
  62. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.js.map +1 -1
  63. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.d.ts +1 -0
  64. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.js +17 -11
  65. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.js.map +1 -1
  66. package/dist/gs/github.com/pkg/errors/errors.js +54 -30
  67. package/dist/gs/github.com/pkg/errors/errors.js.map +1 -1
  68. package/dist/gs/go/scanner/index.d.ts +2 -0
  69. package/dist/gs/go/scanner/index.js +29 -5
  70. package/dist/gs/go/scanner/index.js.map +1 -1
  71. package/dist/gs/go/token/index.js +22 -6
  72. package/dist/gs/go/token/index.js.map +1 -1
  73. package/dist/gs/hash/index.d.ts +6 -0
  74. package/dist/gs/hash/index.js +20 -0
  75. package/dist/gs/hash/index.js.map +1 -1
  76. package/dist/gs/internal/byteorder/index.js +2 -2
  77. package/dist/gs/internal/byteorder/index.js.map +1 -1
  78. package/dist/gs/internal/goarch/index.d.ts +43 -3
  79. package/dist/gs/internal/goarch/index.js +42 -10
  80. package/dist/gs/internal/goarch/index.js.map +1 -1
  81. package/dist/gs/io/fs/fs.js +26 -14
  82. package/dist/gs/io/fs/fs.js.map +1 -1
  83. package/dist/gs/io/fs/readdir.js +4 -2
  84. package/dist/gs/io/fs/readdir.js.map +1 -1
  85. package/dist/gs/io/fs/sub.js +8 -1
  86. package/dist/gs/io/fs/sub.js.map +1 -1
  87. package/dist/gs/io/io.d.ts +2 -0
  88. package/dist/gs/io/io.js.map +1 -1
  89. package/dist/gs/math/bits/index.d.ts +5 -0
  90. package/dist/gs/math/bits/index.js +16 -4
  91. package/dist/gs/math/bits/index.js.map +1 -1
  92. package/dist/gs/mime/index.d.ts +16 -0
  93. package/dist/gs/mime/index.js +315 -6
  94. package/dist/gs/mime/index.js.map +1 -1
  95. package/dist/gs/net/http/httptest/index.d.ts +12 -0
  96. package/dist/gs/net/http/httptest/index.js +85 -6
  97. package/dist/gs/net/http/httptest/index.js.map +1 -1
  98. package/dist/gs/net/http/index.d.ts +300 -5
  99. package/dist/gs/net/http/index.js +1598 -58
  100. package/dist/gs/net/http/index.js.map +1 -1
  101. package/dist/gs/os/dir_unix.gs.js +1 -1
  102. package/dist/gs/os/dir_unix.gs.js.map +1 -1
  103. package/dist/gs/os/error.gs.js +1 -1
  104. package/dist/gs/os/error.gs.js.map +1 -1
  105. package/dist/gs/os/exec.gs.d.ts +1 -0
  106. package/dist/gs/os/exec.gs.js +4 -8
  107. package/dist/gs/os/exec.gs.js.map +1 -1
  108. package/dist/gs/os/exec_posix.gs.js +1 -1
  109. package/dist/gs/os/exec_posix.gs.js.map +1 -1
  110. package/dist/gs/os/index.d.ts +1 -1
  111. package/dist/gs/os/index.js +1 -1
  112. package/dist/gs/os/index.js.map +1 -1
  113. package/dist/gs/os/proc.gs.d.ts +4 -0
  114. package/dist/gs/os/proc.gs.js +12 -6
  115. package/dist/gs/os/proc.gs.js.map +1 -1
  116. package/dist/gs/os/root_js.gs.js +1 -1
  117. package/dist/gs/os/root_js.gs.js.map +1 -1
  118. package/dist/gs/os/types.gs.js +1 -1
  119. package/dist/gs/os/types.gs.js.map +1 -1
  120. package/dist/gs/os/types_js.gs.js +1 -1
  121. package/dist/gs/os/types_js.gs.js.map +1 -1
  122. package/dist/gs/os/types_unix.gs.js +1 -1
  123. package/dist/gs/os/types_unix.gs.js.map +1 -1
  124. package/dist/gs/path/path.js +11 -7
  125. package/dist/gs/path/path.js.map +1 -1
  126. package/dist/gs/reflect/index.d.ts +5 -4
  127. package/dist/gs/reflect/index.js +4 -3
  128. package/dist/gs/reflect/index.js.map +1 -1
  129. package/dist/gs/reflect/map.js +15 -0
  130. package/dist/gs/reflect/map.js.map +1 -1
  131. package/dist/gs/reflect/type.d.ts +25 -6
  132. package/dist/gs/reflect/type.js +1475 -228
  133. package/dist/gs/reflect/type.js.map +1 -1
  134. package/dist/gs/reflect/types.d.ts +14 -6
  135. package/dist/gs/reflect/types.js +35 -1
  136. package/dist/gs/reflect/types.js.map +1 -1
  137. package/dist/gs/reflect/value.d.ts +1 -0
  138. package/dist/gs/reflect/value.js +83 -41
  139. package/dist/gs/reflect/value.js.map +1 -1
  140. package/dist/gs/reflect/visiblefields.js +4 -140
  141. package/dist/gs/reflect/visiblefields.js.map +1 -1
  142. package/dist/gs/runtime/pprof/index.d.ts +8 -2
  143. package/dist/gs/runtime/pprof/index.js +50 -30
  144. package/dist/gs/runtime/pprof/index.js.map +1 -1
  145. package/dist/gs/runtime/runtime.js +5 -4
  146. package/dist/gs/runtime/runtime.js.map +1 -1
  147. package/dist/gs/runtime/trace/index.js +5 -19
  148. package/dist/gs/runtime/trace/index.js.map +1 -1
  149. package/dist/gs/strconv/atoi.gs.js +1 -1
  150. package/dist/gs/strconv/atoi.gs.js.map +1 -1
  151. package/dist/gs/strconv/complex.gs.d.ts +3 -0
  152. package/dist/gs/strconv/complex.gs.js +148 -0
  153. package/dist/gs/strconv/complex.gs.js.map +1 -0
  154. package/dist/gs/strconv/index.d.ts +1 -0
  155. package/dist/gs/strconv/index.js +1 -0
  156. package/dist/gs/strconv/index.js.map +1 -1
  157. package/dist/gs/strings/builder.js +1 -1
  158. package/dist/gs/strings/reader.js +9 -5
  159. package/dist/gs/strings/reader.js.map +1 -1
  160. package/dist/gs/strings/replace.js +15 -7
  161. package/dist/gs/strings/replace.js.map +1 -1
  162. package/dist/gs/strings/strings.d.ts +5 -0
  163. package/dist/gs/strings/strings.js +57 -5
  164. package/dist/gs/strings/strings.js.map +1 -1
  165. package/dist/gs/sync/atomic/doc_64.gs.js +7 -6
  166. package/dist/gs/sync/atomic/doc_64.gs.js.map +1 -1
  167. package/dist/gs/sync/atomic/type.gs.js +9 -9
  168. package/dist/gs/sync/atomic/type.gs.js.map +1 -1
  169. package/dist/gs/sync/atomic/value.gs.js +2 -2
  170. package/dist/gs/sync/atomic/value.gs.js.map +1 -1
  171. package/dist/gs/syscall/env.js +22 -14
  172. package/dist/gs/syscall/env.js.map +1 -1
  173. package/dist/gs/testing/testing.js +55 -13
  174. package/dist/gs/testing/testing.js.map +1 -1
  175. package/dist/gs/time/time.d.ts +24 -1
  176. package/dist/gs/time/time.js +43 -3
  177. package/dist/gs/time/time.js.map +1 -1
  178. package/dist/gs/unique/index.js +7 -1
  179. package/dist/gs/unique/index.js.map +1 -1
  180. package/go.mod +3 -3
  181. package/go.sum +16 -0
  182. package/gs/builtin/hostio.test.ts +16 -0
  183. package/gs/builtin/hostio.ts +7 -0
  184. package/gs/builtin/runtime-contract.test.ts +246 -21
  185. package/gs/builtin/slice.ts +269 -24
  186. package/gs/builtin/type.ts +226 -59
  187. package/gs/builtin/varRef.ts +85 -2
  188. package/gs/bytes/buffer.gs.ts +1 -1
  189. package/gs/bytes/reader.gs.ts +1 -1
  190. package/gs/compress/zlib/index.test.ts +62 -1
  191. package/gs/compress/zlib/index.ts +53 -16
  192. package/gs/compress/zlib/parity.json +51 -0
  193. package/gs/encoding/json/index.test.ts +360 -6
  194. package/gs/encoding/json/index.ts +679 -38
  195. package/gs/encoding/json/parity.json +81 -0
  196. package/gs/github.com/aperturerobotics/protobuf-go-lite/index.test.ts +373 -3
  197. package/gs/github.com/aperturerobotics/protobuf-go-lite/index.ts +893 -1
  198. package/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.test.ts +18 -0
  199. package/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.ts +17 -11
  200. package/gs/github.com/pkg/errors/errors.ts +54 -30
  201. package/gs/go/scanner/index.test.ts +39 -56
  202. package/gs/go/scanner/index.ts +33 -5
  203. package/gs/go/scanner/parity.json +27 -0
  204. package/gs/go/token/index.ts +22 -6
  205. package/gs/hash/index.test.ts +20 -33
  206. package/gs/hash/index.ts +28 -0
  207. package/gs/hash/parity.json +21 -0
  208. package/gs/internal/byteorder/index.test.ts +2 -2
  209. package/gs/internal/byteorder/index.ts +2 -2
  210. package/gs/internal/goarch/index.test.ts +32 -0
  211. package/gs/internal/goarch/index.ts +45 -13
  212. package/gs/internal/goarch/parity.json +144 -0
  213. package/gs/io/fs/fs.ts +26 -14
  214. package/gs/io/fs/readdir.ts +4 -4
  215. package/gs/io/fs/sub.ts +8 -1
  216. package/gs/io/io.ts +1 -0
  217. package/gs/io/parity.json +162 -0
  218. package/gs/math/bits/index.test.ts +14 -1
  219. package/gs/math/bits/index.ts +23 -4
  220. package/gs/math/bits/parity.json +156 -0
  221. package/gs/mime/index.test.ts +90 -0
  222. package/gs/mime/index.ts +369 -6
  223. package/gs/mime/parity.json +36 -0
  224. package/gs/net/http/httptest/index.test.ts +98 -2
  225. package/gs/net/http/httptest/index.ts +101 -6
  226. package/gs/net/http/httptest/parity.json +15 -0
  227. package/gs/net/http/index.test.ts +781 -12
  228. package/gs/net/http/index.ts +1860 -139
  229. package/gs/net/http/meta.json +16 -1
  230. package/gs/net/http/parity.json +193 -0
  231. package/gs/os/dir_unix.gs.ts +1 -1
  232. package/gs/os/error.gs.ts +1 -1
  233. package/gs/os/exec.gs.ts +4 -8
  234. package/gs/os/exec_posix.gs.ts +1 -1
  235. package/gs/os/index.test.ts +9 -0
  236. package/gs/os/index.ts +1 -0
  237. package/gs/os/parity.json +9 -0
  238. package/gs/os/proc.gs.ts +18 -5
  239. package/gs/os/proc.test.ts +26 -0
  240. package/gs/os/root_js.gs.ts +1 -1
  241. package/gs/os/types.gs.ts +1 -1
  242. package/gs/os/types_js.gs.ts +1 -1
  243. package/gs/os/types_unix.gs.ts +1 -1
  244. package/gs/path/path.ts +11 -7
  245. package/gs/reflect/field.test.ts +37 -15
  246. package/gs/reflect/function-types.test.ts +518 -22
  247. package/gs/reflect/index.ts +8 -6
  248. package/gs/reflect/map.ts +20 -0
  249. package/gs/reflect/meta.json +6 -4
  250. package/gs/reflect/parity.json +234 -0
  251. package/gs/reflect/sliceat.test.ts +156 -0
  252. package/gs/reflect/structof.test.ts +401 -0
  253. package/gs/reflect/type.ts +1961 -317
  254. package/gs/reflect/typefor.test.ts +530 -10
  255. package/gs/reflect/types.ts +43 -18
  256. package/gs/reflect/value.ts +105 -45
  257. package/gs/reflect/visiblefields.ts +5 -168
  258. package/gs/runtime/parity.json +24 -0
  259. package/gs/runtime/pprof/index.test.ts +29 -7
  260. package/gs/runtime/pprof/index.ts +56 -30
  261. package/gs/runtime/pprof/parity.json +27 -0
  262. package/gs/runtime/runtime.test.ts +3 -1
  263. package/gs/runtime/runtime.ts +4 -3
  264. package/gs/runtime/trace/index.test.ts +5 -3
  265. package/gs/runtime/trace/index.ts +8 -20
  266. package/gs/runtime/trace/parity.json +36 -0
  267. package/gs/strconv/atoi.gs.ts +1 -1
  268. package/gs/strconv/complex.gs.ts +174 -0
  269. package/gs/strconv/complex.test.ts +65 -0
  270. package/gs/strconv/index.ts +1 -0
  271. package/gs/strconv/parity.json +120 -0
  272. package/gs/strings/builder.ts +1 -1
  273. package/gs/strings/parity.json +186 -0
  274. package/gs/strings/reader.ts +9 -5
  275. package/gs/strings/replace.ts +15 -7
  276. package/gs/strings/strings.test.ts +22 -2
  277. package/gs/strings/strings.ts +64 -6
  278. package/gs/sync/atomic/doc_64.gs.ts +6 -7
  279. package/gs/sync/atomic/doc_64.test.ts +43 -0
  280. package/gs/sync/atomic/type.gs.ts +9 -9
  281. package/gs/sync/atomic/value.gs.ts +2 -2
  282. package/gs/syscall/env.ts +29 -14
  283. package/gs/testing/testing.test.ts +67 -0
  284. package/gs/testing/testing.ts +87 -19
  285. package/gs/time/parity.json +225 -0
  286. package/gs/time/time.test.ts +20 -2
  287. package/gs/time/time.ts +49 -7
  288. package/gs/unique/index.ts +7 -1
  289. package/package.json +4 -2
  290. package/dist/gs/github.com/aperturerobotics/starpc/srpc/index.d.ts +0 -217
  291. package/dist/gs/github.com/aperturerobotics/starpc/srpc/index.js +0 -926
  292. package/dist/gs/github.com/aperturerobotics/starpc/srpc/index.js.map +0 -1
  293. package/gs/github.com/aperturerobotics/starpc/srpc/index.test.ts +0 -38
  294. package/gs/github.com/aperturerobotics/starpc/srpc/index.ts +0 -1361
  295. package/gs/github.com/aperturerobotics/starpc/srpc/meta.json +0 -46
@@ -1,7 +1,3 @@
1
- import * as nodeFS from 'node:fs'
2
- import { tmpdir } from 'node:os'
3
- import { join } from 'node:path'
4
-
5
1
  import * as context from '@goscript/context/index.js'
6
2
 
7
3
  export type TestFunc = (t: T) => void | Promise<void>
@@ -24,6 +20,18 @@ export type RunResult = {
24
20
  skipped: number
25
21
  }
26
22
 
23
+ interface HostProcess {
24
+ env?: Record<string, string | undefined>
25
+ cwd?: () => string
26
+ chdir?: (dir: string) => void
27
+ getBuiltinModule?: (name: string) => unknown
28
+ }
29
+
30
+ interface HostGlobal {
31
+ process?: HostProcess
32
+ require?: (name: string) => unknown
33
+ }
34
+
27
35
  class TestControl extends Error {
28
36
  public readonly kind: 'fatal' | 'skip'
29
37
 
@@ -127,6 +135,9 @@ export class T {
127
135
  try {
128
136
  await fn(child)
129
137
  } catch (err) {
138
+ if (isProcessExitError(err)) {
139
+ throw err
140
+ }
130
141
  if (err instanceof TestControl && err.kind === 'skip') {
131
142
  // A skipped subtest is still a successful Run result.
132
143
  } else {
@@ -139,6 +150,9 @@ export class T {
139
150
  try {
140
151
  await child.runCleanups()
141
152
  } catch (err) {
153
+ if (isProcessExitError(err)) {
154
+ throw err
155
+ }
142
156
  child.Fail()
143
157
  if (!(err instanceof TestControl)) {
144
158
  child.Log(formatValue(err))
@@ -153,9 +167,21 @@ export class T {
153
167
  }
154
168
 
155
169
  public TempDir(): string {
156
- const path = (nodeFS as any).mkdtempSync(
157
- join(
158
- tmpdir(),
170
+ const fs = requireHostModule<{
171
+ mkdtempSync(prefix: string): string
172
+ rmSync(path: string, opts: { force: boolean; recursive: boolean }): void
173
+ }>('node:fs', 'testing.TempDir')
174
+ const os = requireHostModule<{ tmpdir(): string }>(
175
+ 'node:os',
176
+ 'testing.TempDir',
177
+ )
178
+ const pathMod = requireHostModule<{ join(...parts: string[]): string }>(
179
+ 'node:path',
180
+ 'testing.TempDir',
181
+ )
182
+ const path = fs.mkdtempSync(
183
+ pathMod.join(
184
+ os.tmpdir(),
159
185
  'goscript-test-' +
160
186
  this.testName.replace(/[^A-Za-z0-9_.-]/g, '_') +
161
187
  '-' +
@@ -164,7 +190,7 @@ export class T {
164
190
  )
165
191
  this.tempDirs.push(path)
166
192
  this.Cleanup(() => {
167
- ;(nodeFS as any).rmSync(path, { force: true, recursive: true })
193
+ fs.rmSync(path, { force: true, recursive: true })
168
194
  })
169
195
  return path
170
196
  }
@@ -172,12 +198,9 @@ export class T {
172
198
  public Parallel(): void {}
173
199
 
174
200
  public Setenv(key: string, value: string): void {
175
- const proc = (globalThis as any).process as
176
- | { env?: Record<string, string | undefined> }
177
- | undefined
178
- const env = proc?.env
201
+ const env = (globalThis as HostGlobal).process?.env
179
202
  if (env === undefined) {
180
- return
203
+ throw new Error('testing.Setenv is not supported without a host process')
181
204
  }
182
205
  const oldValue = env[key]
183
206
  env[key] = value
@@ -191,11 +214,9 @@ export class T {
191
214
  }
192
215
 
193
216
  public Chdir(dir: string): void {
194
- const proc = (globalThis as any).process as
195
- | { cwd?: () => string; chdir?: (dir: string) => void }
196
- | undefined
217
+ const proc = (globalThis as HostGlobal).process
197
218
  if (proc?.cwd === undefined || proc.chdir === undefined) {
198
- return
219
+ throw new Error('testing.Chdir is not supported without a host process')
199
220
  }
200
221
  const oldDir = proc.cwd()
201
222
  proc.chdir(dir)
@@ -249,6 +270,9 @@ export class B extends T {
249
270
  try {
250
271
  await fn(child)
251
272
  } catch (err) {
273
+ if (isProcessExitError(err)) {
274
+ throw err
275
+ }
252
276
  child.Error(err)
253
277
  }
254
278
  if (child.Failed()) {
@@ -328,6 +352,9 @@ export async function runTests(
328
352
  try {
329
353
  await test.fn(t)
330
354
  } catch (err) {
355
+ if (isProcessExitError(err)) {
356
+ throw err
357
+ }
331
358
  if (err instanceof TestControl && err.kind === 'skip') {
332
359
  skipped++
333
360
  } else {
@@ -336,9 +363,8 @@ export async function runTests(
336
363
  t.Log(formatValue(err))
337
364
  }
338
365
  }
339
- } finally {
340
- await t.runCleanups()
341
366
  }
367
+ await t.runCleanups()
342
368
  const elapsed = ((Date.now() - start) / 1000).toFixed(2)
343
369
  if (t.Skipped()) {
344
370
  if (options.verbose) {
@@ -383,6 +409,48 @@ function formatMessage(format: string, args: unknown[]): string {
383
409
  })
384
410
  }
385
411
 
412
+ function requireHostModule<T>(name: string, api: string): T {
413
+ const fromProcess = (globalThis as HostGlobal).process?.getBuiltinModule?.(
414
+ name,
415
+ )
416
+ if (fromProcess !== undefined && fromProcess !== null) {
417
+ return fromProcess as T
418
+ }
419
+ const req = hostRequire()
420
+ if (req !== undefined) {
421
+ return req(name) as T
422
+ }
423
+ throw new Error(
424
+ api + ' is not supported without Node-compatible host modules',
425
+ )
426
+ }
427
+
428
+ function hostRequire(): ((name: string) => unknown) | undefined {
429
+ const globalRequire = (globalThis as HostGlobal).require
430
+ if (typeof globalRequire === 'function') {
431
+ return globalRequire
432
+ }
433
+ try {
434
+ const req = eval(
435
+ 'typeof require === "function" ? require : undefined',
436
+ ) as unknown
437
+ if (typeof req === 'function') {
438
+ return req as (name: string) => unknown
439
+ }
440
+ } catch {
441
+ return undefined
442
+ }
443
+ return undefined
444
+ }
445
+
446
+ function isProcessExitError(err: unknown): boolean {
447
+ if (err === null || typeof err !== 'object') {
448
+ return false
449
+ }
450
+ const code = (err as { __goscriptExitCode?: unknown }).__goscriptExitCode
451
+ return typeof code === 'number'
452
+ }
453
+
386
454
  function formatValue(value: unknown): string {
387
455
  if (value instanceof Error) {
388
456
  return value.message
@@ -0,0 +1,225 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "strict": true,
4
+ "symbols": {
5
+ "After": {
6
+ "status": "real"
7
+ },
8
+ "AfterFunc": {
9
+ "status": "real"
10
+ },
11
+ "ANSIC": {
12
+ "status": "real"
13
+ },
14
+ "April": {
15
+ "status": "real"
16
+ },
17
+ "August": {
18
+ "status": "real"
19
+ },
20
+ "Date": {
21
+ "status": "real"
22
+ },
23
+ "DateOnly": {
24
+ "status": "real"
25
+ },
26
+ "DateTime": {
27
+ "status": "real"
28
+ },
29
+ "December": {
30
+ "status": "real"
31
+ },
32
+ "Duration": {
33
+ "status": "real"
34
+ },
35
+ "February": {
36
+ "status": "real"
37
+ },
38
+ "FixedZone": {
39
+ "status": "real"
40
+ },
41
+ "Friday": {
42
+ "status": "real"
43
+ },
44
+ "Hour": {
45
+ "status": "real"
46
+ },
47
+ "January": {
48
+ "status": "real"
49
+ },
50
+ "July": {
51
+ "status": "real"
52
+ },
53
+ "June": {
54
+ "status": "real"
55
+ },
56
+ "Kitchen": {
57
+ "status": "real"
58
+ },
59
+ "Layout": {
60
+ "status": "real"
61
+ },
62
+ "LoadLocation": {
63
+ "status": "real"
64
+ },
65
+ "LoadLocationFromTZData": {
66
+ "status": "real"
67
+ },
68
+ "Local": {
69
+ "status": "real"
70
+ },
71
+ "Location": {
72
+ "status": "real"
73
+ },
74
+ "March": {
75
+ "status": "real"
76
+ },
77
+ "May": {
78
+ "status": "real"
79
+ },
80
+ "Microsecond": {
81
+ "status": "real"
82
+ },
83
+ "Millisecond": {
84
+ "status": "real"
85
+ },
86
+ "Minute": {
87
+ "status": "real"
88
+ },
89
+ "Monday": {
90
+ "status": "real"
91
+ },
92
+ "Month": {
93
+ "status": "real"
94
+ },
95
+ "Nanosecond": {
96
+ "status": "real"
97
+ },
98
+ "NewTicker": {
99
+ "status": "real"
100
+ },
101
+ "NewTimer": {
102
+ "status": "real"
103
+ },
104
+ "November": {
105
+ "status": "real"
106
+ },
107
+ "Now": {
108
+ "status": "real"
109
+ },
110
+ "October": {
111
+ "status": "real"
112
+ },
113
+ "Parse": {
114
+ "status": "real"
115
+ },
116
+ "ParseDuration": {
117
+ "status": "real"
118
+ },
119
+ "ParseError": {
120
+ "status": "real"
121
+ },
122
+ "ParseInLocation": {
123
+ "status": "real"
124
+ },
125
+ "RFC1123": {
126
+ "status": "real"
127
+ },
128
+ "RFC1123Z": {
129
+ "status": "real"
130
+ },
131
+ "RFC3339": {
132
+ "status": "real"
133
+ },
134
+ "RFC3339Nano": {
135
+ "status": "real"
136
+ },
137
+ "RFC822": {
138
+ "status": "real"
139
+ },
140
+ "RFC822Z": {
141
+ "status": "real"
142
+ },
143
+ "RFC850": {
144
+ "status": "real"
145
+ },
146
+ "RubyDate": {
147
+ "status": "real"
148
+ },
149
+ "Saturday": {
150
+ "status": "real"
151
+ },
152
+ "Second": {
153
+ "status": "real"
154
+ },
155
+ "September": {
156
+ "status": "real"
157
+ },
158
+ "Since": {
159
+ "status": "real"
160
+ },
161
+ "Sleep": {
162
+ "status": "real"
163
+ },
164
+ "Stamp": {
165
+ "status": "real"
166
+ },
167
+ "StampMicro": {
168
+ "status": "real"
169
+ },
170
+ "StampMilli": {
171
+ "status": "real"
172
+ },
173
+ "StampNano": {
174
+ "status": "real"
175
+ },
176
+ "Sunday": {
177
+ "status": "real"
178
+ },
179
+ "Thursday": {
180
+ "status": "real"
181
+ },
182
+ "Tick": {
183
+ "status": "real"
184
+ },
185
+ "Ticker": {
186
+ "status": "real"
187
+ },
188
+ "Time": {
189
+ "status": "real"
190
+ },
191
+ "TimeOnly": {
192
+ "status": "real"
193
+ },
194
+ "Timer": {
195
+ "status": "real"
196
+ },
197
+ "Tuesday": {
198
+ "status": "real"
199
+ },
200
+ "Unix": {
201
+ "status": "real"
202
+ },
203
+ "UnixDate": {
204
+ "status": "real"
205
+ },
206
+ "UnixMicro": {
207
+ "status": "real"
208
+ },
209
+ "UnixMilli": {
210
+ "status": "real"
211
+ },
212
+ "Until": {
213
+ "status": "real"
214
+ },
215
+ "UTC": {
216
+ "status": "real"
217
+ },
218
+ "Wednesday": {
219
+ "status": "real"
220
+ },
221
+ "Weekday": {
222
+ "status": "real"
223
+ }
224
+ }
225
+ }
@@ -3,6 +3,7 @@ import { describe, expect, it } from 'vitest'
3
3
  import * as $ from '@goscript/builtin/index.js'
4
4
 
5
5
  import {
6
+ ANSIC,
6
7
  Duration_Abs,
7
8
  Duration_Hours,
8
9
  Duration_Microseconds,
@@ -14,14 +15,22 @@ import {
14
15
  Duration_String,
15
16
  Duration_Truncate,
16
17
  FixedZone,
18
+ Friday,
17
19
  January,
20
+ Kitchen,
21
+ Local,
18
22
  Microsecond,
19
23
  Millisecond,
20
24
  Minute,
25
+ Month_String,
21
26
  NewTicker,
22
27
  NewTimer,
28
+ RFC1123,
23
29
  RFC3339Nano,
30
+ Saturday,
24
31
  Second,
32
+ StampMicro,
33
+ Sunday,
25
34
  Date,
26
35
  May,
27
36
  RFC3339,
@@ -67,12 +76,21 @@ describe('time.Duration methods', () => {
67
76
  })
68
77
 
69
78
  describe('time constants and timers', () => {
70
- it('exports RFC3339Nano', () => {
79
+ it('exports layout and location constants', () => {
80
+ expect(ANSIC).toBe('Mon Jan _2 15:04:05 2006')
81
+ expect(RFC1123).toBe('Mon, 02 Jan 2006 15:04:05 MST')
71
82
  expect(RFC3339Nano).toBe('2006-01-02T15:04:05.999999999Z07:00')
83
+ expect(Kitchen).toBe('3:04PM')
84
+ expect(StampMicro).toBe('Jan _2 15:04:05.000000')
85
+ expect(Local.String()).toBe('Local')
72
86
  })
73
87
 
74
- it('exports month constants directly', () => {
88
+ it('exports month and weekday constants directly', () => {
75
89
  expect(January).toBe(1)
90
+ expect(Month_String(May)).toBe('May')
91
+ expect(Sunday).toBe(0)
92
+ expect(Friday).toBe(5)
93
+ expect(Saturday).toBe(6)
76
94
  })
77
95
 
78
96
  it('delivers NewTimer values on C', async () => {
package/gs/time/time.ts CHANGED
@@ -877,6 +877,25 @@ export function WeekdayString(w: Weekday): string {
877
877
  return names[w] || 'Unknown'
878
878
  }
879
879
 
880
+ export function Month_String(m: Month): string {
881
+ const names = [
882
+ '',
883
+ 'January',
884
+ 'February',
885
+ 'March',
886
+ 'April',
887
+ 'May',
888
+ 'June',
889
+ 'July',
890
+ 'August',
891
+ 'September',
892
+ 'October',
893
+ 'November',
894
+ 'December',
895
+ ]
896
+ return names[m] || `%!Month(${m})`
897
+ }
898
+
880
899
  // Weekday_String returns the string representation of a Weekday (wrapper function naming)
881
900
  export function Weekday_String(w: Weekday): string {
882
901
  return WeekdayString(w)
@@ -909,7 +928,7 @@ export class ParseError extends Error {
909
928
 
910
929
  // Timer represents a single event timer
911
930
  export class Timer {
912
- private _timeout: NodeJS.Timeout | number
931
+ private _timeout: ReturnType<typeof setTimeout>
913
932
  private _duration: Duration
914
933
  private _callback?: () => void
915
934
  private _channel = makeChannel(1, new Time(), 'both')
@@ -939,7 +958,7 @@ export class Timer {
939
958
  return true
940
959
  }
941
960
 
942
- private start(d: Duration): NodeJS.Timeout | number {
961
+ private start(d: Duration): ReturnType<typeof setTimeout> {
943
962
  const ms = timeoutMilliseconds(d)
944
963
  if (this._callback) {
945
964
  return setTimeout(this._callback, ms)
@@ -952,7 +971,7 @@ export class Timer {
952
971
 
953
972
  // Ticker holds a channel that delivers ticks at intervals
954
973
  export class Ticker {
955
- private _interval: NodeJS.Timeout | number
974
+ private _interval: ReturnType<typeof setInterval>
956
975
  private _duration: Duration
957
976
  private _stopped: boolean = false
958
977
  private _channel = makeChannel(1, new Time(), 'both')
@@ -988,7 +1007,7 @@ export class Ticker {
988
1007
  }
989
1008
  }
990
1009
 
991
- private start(d: Duration): NodeJS.Timeout | number {
1010
+ private start(d: Duration): ReturnType<typeof setInterval> {
992
1011
  const ms = timeoutMilliseconds(d)
993
1012
  return setInterval(() => {
994
1013
  this._channel.send(Now()).catch(() => {})
@@ -1058,6 +1077,7 @@ export function Date(
1058
1077
 
1059
1078
  // Common locations
1060
1079
  export const UTC = new Location('UTC', 0)
1080
+ export const Local = new Location('Local')
1061
1081
 
1062
1082
  // FixedZone returns a Location that always uses the given zone name and offset (seconds east of UTC)
1063
1083
  export function FixedZone(name: string, offset: number): Location {
@@ -1104,12 +1124,35 @@ export const October = Month.October
1104
1124
  export const November = Month.November
1105
1125
  export const December = Month.December
1106
1126
 
1127
+ // Export weekday constants
1128
+ export const Sunday = Weekday.Sunday
1129
+ export const Monday = Weekday.Monday
1130
+ export const Tuesday = Weekday.Tuesday
1131
+ export const Wednesday = Weekday.Wednesday
1132
+ export const Thursday = Weekday.Thursday
1133
+ export const Friday = Weekday.Friday
1134
+ export const Saturday = Weekday.Saturday
1135
+
1107
1136
  // Time layout constants (matching Go's time package)
1108
- export const DateTime = '2006-01-02 15:04:05'
1109
1137
  export const Layout = "01/02 03:04:05PM '06 -0700"
1138
+ export const ANSIC = 'Mon Jan _2 15:04:05 2006'
1139
+ export const UnixDate = 'Mon Jan _2 15:04:05 MST 2006'
1140
+ export const RubyDate = 'Mon Jan 02 15:04:05 -0700 2006'
1141
+ export const RFC822 = '02 Jan 06 15:04 MST'
1142
+ export const RFC822Z = '02 Jan 06 15:04 -0700'
1143
+ export const RFC850 = 'Monday, 02-Jan-06 15:04:05 MST'
1144
+ export const RFC1123 = 'Mon, 02 Jan 2006 15:04:05 MST'
1145
+ export const RFC1123Z = 'Mon, 02 Jan 2006 15:04:05 -0700'
1110
1146
  export const RFC3339 = '2006-01-02T15:04:05Z07:00'
1111
1147
  export const RFC3339Nano = '2006-01-02T15:04:05.999999999Z07:00'
1112
1148
  export const Kitchen = '3:04PM'
1149
+ export const Stamp = 'Jan _2 15:04:05'
1150
+ export const StampMilli = 'Jan _2 15:04:05.000'
1151
+ export const StampMicro = 'Jan _2 15:04:05.000000'
1152
+ export const StampNano = 'Jan _2 15:04:05.000000000'
1153
+ export const DateTime = '2006-01-02 15:04:05'
1154
+ export const DateOnly = '2006-01-02'
1155
+ export const TimeOnly = '15:04:05'
1113
1156
 
1114
1157
  // Unix returns the local Time corresponding to the given Unix time,
1115
1158
  // sec seconds and nsec nanoseconds since January 1, 1970 UTC
@@ -1298,8 +1341,7 @@ export function LoadLocation(name: string): Location {
1298
1341
  case 'UTC':
1299
1342
  return UTC
1300
1343
  case 'Local':
1301
- // Return a location that uses local time (no fixed offset)
1302
- return new Location('Local')
1344
+ return Local
1303
1345
  default:
1304
1346
  throw new Error(`time: unknown time zone ${name}`)
1305
1347
  }
@@ -26,7 +26,13 @@ export class Handle<T = any> {
26
26
  new Handle(),
27
27
  [{ name: 'Value', args: [], returns: [] }],
28
28
  Handle,
29
- { value: { kind: $.TypeKind.Interface, methods: [] } },
29
+ [
30
+ {
31
+ name: 'value',
32
+ key: 'value',
33
+ type: { kind: $.TypeKind.Interface, methods: [] },
34
+ },
35
+ ],
30
36
  )
31
37
  }
32
38
 
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "goscript",
3
3
  "description": "Go to TypeScript transpiler",
4
- "version": "0.1.4",
4
+ "version": "0.2.1",
5
5
  "author": {
6
6
  "name": "Aperture Robotics LLC.",
7
7
  "email": "support@aperture.us",
@@ -48,6 +48,8 @@
48
48
  "example": "cd ./example/simple && bash run.bash",
49
49
  "test": "bun run test:go && bun run test:js",
50
50
  "test:go": "go test ./...",
51
+ "test:go:browser": "go run ./cmd/goscript test --browser --timeout 1m --dir compiler/gotest/testdata/browserapi --run TestBrowserAPI .",
52
+ "test:go:browser:shim": "mkdir -p .tmp/bin && go build -o .tmp/bin/go_js_wasm_exec ./cmd/go_js_wasm_exec && sh -c 'exec_path=\"$PWD/.tmp/bin/go_js_wasm_exec\"; cd compiler/gotest/testdata/browserapi && GOOS=js GOARCH=wasm go test -exec \"$exec_path\" -run TestBrowserAPI -count=1'",
51
53
  "test:js": "bun run typecheck && vitest run",
52
54
  "test:browser": "bun run scripts/generate-browser-tests.ts && vitest run --config vitest.browser.config.ts",
53
55
  "test:browser:ui": "bun run scripts/generate-browser-tests.ts && vitest --config vitest.browser.config.ts --ui",
@@ -106,7 +108,7 @@
106
108
  "husky": "^9.1.7",
107
109
  "lint-staged": "^17.0.0",
108
110
  "prettier": "^3.8.1",
109
- "starpc": "0.49.15",
111
+ "starpc": "0.49.16",
110
112
  "typescript": "^6.0.0",
111
113
  "typescript-eslint": "^8.58.0",
112
114
  "vitest": "^4.1.2"