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,4 +1,185 @@
1
1
  import * as $ from '@goscript/builtin/index.js';
2
+ import * as bytes from '@goscript/bytes/index.js';
3
+ class jsonError extends Error {
4
+ Error() {
5
+ return this.message;
6
+ }
7
+ }
8
+ export class SyntaxError extends jsonError {
9
+ Offset;
10
+ constructor(init) {
11
+ super(init?.Message ?? 'invalid character in JSON');
12
+ this.name = 'SyntaxError';
13
+ this.Offset = init?.Offset ?? 0;
14
+ }
15
+ }
16
+ export class InvalidUTF8Error extends jsonError {
17
+ S;
18
+ constructor(init) {
19
+ super(`json: invalid UTF-8 in string: ${init?.S ?? ''}`);
20
+ this.name = 'InvalidUTF8Error';
21
+ this.S = init?.S ?? '';
22
+ }
23
+ }
24
+ export class InvalidUnmarshalError extends jsonError {
25
+ Type;
26
+ constructor(init) {
27
+ super('json: Unmarshal(non-pointer)');
28
+ this.name = 'InvalidUnmarshalError';
29
+ this.Type = init?.Type ?? null;
30
+ }
31
+ }
32
+ export class MarshalerError extends jsonError {
33
+ Type;
34
+ Err;
35
+ constructor(init) {
36
+ super(`json: error calling MarshalJSON: ${init?.Err?.Error?.() ?? ''}`);
37
+ this.name = 'MarshalerError';
38
+ this.Type = init?.Type ?? null;
39
+ this.Err = init?.Err ?? null;
40
+ }
41
+ Unwrap() {
42
+ return this.Err;
43
+ }
44
+ }
45
+ export class UnmarshalFieldError extends jsonError {
46
+ Key;
47
+ Type;
48
+ Field;
49
+ constructor(init) {
50
+ super(`json: cannot unmarshal object key ${init?.Key ?? ''}`);
51
+ this.name = 'UnmarshalFieldError';
52
+ this.Key = init?.Key ?? '';
53
+ this.Type = init?.Type ?? null;
54
+ this.Field = init?.Field ?? null;
55
+ }
56
+ }
57
+ export class UnmarshalTypeError extends jsonError {
58
+ Value;
59
+ Type;
60
+ Offset;
61
+ Struct;
62
+ Field;
63
+ constructor(init) {
64
+ super(`json: cannot unmarshal ${init?.Value ?? ''}`);
65
+ this.name = 'UnmarshalTypeError';
66
+ this.Value = init?.Value ?? '';
67
+ this.Type = init?.Type ?? null;
68
+ this.Offset = init?.Offset ?? 0;
69
+ this.Struct = init?.Struct ?? '';
70
+ this.Field = init?.Field ?? '';
71
+ }
72
+ }
73
+ export class UnsupportedTypeError extends jsonError {
74
+ Type;
75
+ constructor(init) {
76
+ super('json: unsupported type');
77
+ this.name = 'UnsupportedTypeError';
78
+ this.Type = init?.Type ?? null;
79
+ }
80
+ }
81
+ export class UnsupportedValueError extends jsonError {
82
+ Value;
83
+ Str;
84
+ constructor(init) {
85
+ super(`json: unsupported value: ${init?.Str ?? ''}`);
86
+ this.name = 'UnsupportedValueError';
87
+ this.Value = init?.Value ?? null;
88
+ this.Str = init?.Str ?? '';
89
+ }
90
+ }
91
+ export class Decoder {
92
+ reader;
93
+ disallowUnknownFields = false;
94
+ inputOffset = 0;
95
+ useNumber = false;
96
+ constructor(reader) {
97
+ this.reader = reader;
98
+ }
99
+ Decode(v) {
100
+ const [data, err] = readAllSync(this.reader);
101
+ if (err !== null) {
102
+ return err;
103
+ }
104
+ this.inputOffset += $.len(data);
105
+ return decode(data, v, {
106
+ disallowUnknownFields: this.disallowUnknownFields,
107
+ useNumber: this.useNumber,
108
+ });
109
+ }
110
+ Buffered() {
111
+ return new bytes.Buffer();
112
+ }
113
+ DisallowUnknownFields() {
114
+ this.disallowUnknownFields = true;
115
+ }
116
+ InputOffset() {
117
+ return this.inputOffset;
118
+ }
119
+ More() {
120
+ return false;
121
+ }
122
+ Token() {
123
+ return [null, $.newError('json: token streaming is unsupported')];
124
+ }
125
+ UseNumber() {
126
+ this.useNumber = true;
127
+ }
128
+ }
129
+ export class Encoder {
130
+ writer;
131
+ escapeHTML = true;
132
+ indent = '';
133
+ prefix = '';
134
+ constructor(writer) {
135
+ this.writer = writer;
136
+ }
137
+ Encode(v) {
138
+ const [data, err] = this.indent === '' && this.prefix === '' ?
139
+ marshalBytes(v, '', '', this.escapeHTML)
140
+ : marshalBytes(v, this.prefix, this.indent, this.escapeHTML);
141
+ if (err !== null) {
142
+ return err;
143
+ }
144
+ const out = $.stringToBytes($.bytesToString(data) + '\n');
145
+ const [n, writeErr] = this.writer.Write(out);
146
+ if (writeErr !== null) {
147
+ return writeErr;
148
+ }
149
+ if (n < $.len(out)) {
150
+ return $.newError('short write');
151
+ }
152
+ return null;
153
+ }
154
+ SetEscapeHTML(on) {
155
+ this.escapeHTML = on;
156
+ }
157
+ SetIndent(prefix, indent) {
158
+ this.prefix = prefix;
159
+ this.indent = indent;
160
+ }
161
+ }
162
+ export function NewDecoder(r) {
163
+ return new Decoder(r);
164
+ }
165
+ export function NewEncoder(w) {
166
+ return new Encoder(w);
167
+ }
168
+ $.registerInterfaceType('json.Marshaler', null, [
169
+ {
170
+ name: 'MarshalJSON',
171
+ args: [],
172
+ returns: [
173
+ {
174
+ type: {
175
+ kind: $.TypeKind.Slice,
176
+ elemType: { kind: $.TypeKind.Basic, name: 'uint8' },
177
+ },
178
+ },
179
+ { type: 'GoError' },
180
+ ],
181
+ },
182
+ ]);
2
183
  $.registerInterfaceType('json.Unmarshaler', null, [
3
184
  {
4
185
  name: 'UnmarshalJSON',
@@ -15,52 +196,224 @@ $.registerInterfaceType('json.Unmarshaler', null, [
15
196
  },
16
197
  ]);
17
198
  export function Marshal(v) {
199
+ return marshalBytes(v, '', '', true);
200
+ }
201
+ function marshalBytes(v, prefix, indent, escapeHTML) {
18
202
  try {
19
- return [$.stringToBytes(JSON.stringify(marshalValue(v))), null];
203
+ let text = JSON.stringify(marshalValue(v), null, indent);
204
+ if (escapeHTML) {
205
+ text = escapeHTMLString(text);
206
+ }
207
+ if (prefix !== '') {
208
+ text = text
209
+ .split('\n')
210
+ .map((line, idx) => (idx === 0 ? line : prefix + line))
211
+ .join('\n');
212
+ }
213
+ return [$.stringToBytes(text), null];
20
214
  }
21
215
  catch (err) {
22
216
  return [null, goError(err)];
23
217
  }
24
218
  }
25
- export function MarshalIndent(v, prefix, indent) {
219
+ export function Compact(dst, src) {
26
220
  try {
27
- const text = JSON.stringify(marshalValue(v), null, indent);
28
- if (prefix === '') {
29
- return [$.stringToBytes(text), null];
221
+ const text = JSON.stringify(JSON.parse($.bytesToString(src)));
222
+ const [, err] = $.pointerValue(dst).Write($.stringToBytes(text));
223
+ return err;
224
+ }
225
+ catch (err) {
226
+ return goError(err);
227
+ }
228
+ }
229
+ export function HTMLEscape(dst, src) {
230
+ const escaped = $.bytesToString(src).replace(/[<>&\u2028\u2029]/g, (char) => {
231
+ switch (char) {
232
+ case '<':
233
+ return '\\u003c';
234
+ case '>':
235
+ return '\\u003e';
236
+ case '&':
237
+ return '\\u0026';
238
+ case '\u2028':
239
+ return '\\u2028';
240
+ case '\u2029':
241
+ return '\\u2029';
242
+ default:
243
+ return char;
30
244
  }
31
- return [
32
- $.stringToBytes(text
33
- .split('\n')
34
- .map((line, idx) => (idx === 0 ? line : prefix + line))
35
- .join('\n')),
36
- null,
37
- ];
245
+ });
246
+ $.pointerValue(dst).Write($.stringToBytes(escaped));
247
+ }
248
+ export function Indent(dst, src, prefix, indent) {
249
+ try {
250
+ const text = JSON.stringify(JSON.parse($.bytesToString(src)), null, indent);
251
+ const prefixed = prefix === '' ? text : (text
252
+ .split('\n')
253
+ .map((line, idx) => (idx === 0 ? line : prefix + line))
254
+ .join('\n'));
255
+ const [, err] = $.pointerValue(dst).Write($.stringToBytes(prefixed));
256
+ return err;
38
257
  }
39
258
  catch (err) {
40
- return [null, goError(err)];
259
+ return goError(err);
41
260
  }
42
261
  }
262
+ export function MarshalIndent(v, prefix, indent) {
263
+ return marshalBytes(v, prefix, indent, true);
264
+ }
43
265
  export function Unmarshal(data, v) {
266
+ return decode(data, v, {});
267
+ }
268
+ function decode(data, v, opts) {
44
269
  try {
45
- assignDecodedValue(v, JSON.parse($.bytesToString(data)));
270
+ if (!validUnmarshalTarget(v)) {
271
+ return $.toGoError(new InvalidUnmarshalError());
272
+ }
273
+ const unmarshaler = unmarshalJSONTarget(v);
274
+ if (unmarshaler !== null) {
275
+ const err = unmarshaler.UnmarshalJSON(data);
276
+ if (err instanceof Promise) {
277
+ return $.newError('json: asynchronous UnmarshalJSON is unsupported');
278
+ }
279
+ return err;
280
+ }
281
+ assignDecodedValue(v, parseJSON(data, opts), opts);
46
282
  return null;
47
283
  }
48
284
  catch (err) {
49
285
  return goError(err);
50
286
  }
51
287
  }
288
+ export function Valid(data) {
289
+ try {
290
+ JSON.parse($.bytesToString(data));
291
+ return true;
292
+ }
293
+ catch {
294
+ return false;
295
+ }
296
+ }
297
+ export function RawMessage_MarshalJSON(m) {
298
+ if (m === null) {
299
+ return [$.stringToBytes('null'), null];
300
+ }
301
+ const out = $.makeSlice($.len(m), undefined, 'byte');
302
+ $.copy(out, m);
303
+ return [out, null];
304
+ }
305
+ export function RawMessage_UnmarshalJSON(m, data) {
306
+ const out = $.makeSlice($.len(data), undefined, 'byte');
307
+ $.copy(out, data);
308
+ if ($.isVarRef(m)) {
309
+ m.value = out;
310
+ }
311
+ return null;
312
+ }
313
+ export function Number_Float64(n) {
314
+ if (!isValidFloat(n)) {
315
+ return [0, $.newError(`strconv.ParseFloat: parsing "${n}": invalid syntax`)];
316
+ }
317
+ if (/^[+-]?nan$/i.test(n)) {
318
+ return [Number.NaN, null];
319
+ }
320
+ if (/^\+?inf(?:inity)?$/i.test(n)) {
321
+ return [Infinity, null];
322
+ }
323
+ if (/^-inf(?:inity)?$/i.test(n)) {
324
+ return [-Infinity, null];
325
+ }
326
+ const value = Number.parseFloat(n);
327
+ if (Number.isNaN(value)) {
328
+ return [0, $.newError(`strconv.ParseFloat: parsing "${n}": invalid syntax`)];
329
+ }
330
+ if (!Number.isFinite(value) && !/^[+-]?(?:inf(?:inity)?|nan)$/i.test(n)) {
331
+ return [
332
+ value,
333
+ $.newError(`strconv.ParseFloat: parsing "${n}": value out of range`),
334
+ ];
335
+ }
336
+ return [value, null];
337
+ }
338
+ export function Number_Int64(n) {
339
+ if (!/^[+-]?\d+$/.test(n)) {
340
+ return [0, $.newError(`strconv.ParseInt: parsing "${n}": invalid syntax`)];
341
+ }
342
+ const value = BigInt(n);
343
+ const min = -(1n << 63n);
344
+ const max = (1n << 63n) - 1n;
345
+ if (value < min || value > max) {
346
+ const clamped = value < min ? min : max;
347
+ return [
348
+ Number(clamped),
349
+ $.newError(`strconv.ParseInt: parsing "${n}": value out of range`),
350
+ ];
351
+ }
352
+ return [Number(value), null];
353
+ }
354
+ export function Number_String(n) {
355
+ return n;
356
+ }
357
+ function isValidFloat(value) {
358
+ return /^[+-]?(?:(?:\d+(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+)?|inf(?:inity)?|nan)$/i.test(value);
359
+ }
360
+ function readAllSync(r) {
361
+ const chunks = [];
362
+ const buf = $.makeSlice(512, undefined, 'byte');
363
+ while (true) {
364
+ const read = r.Read(buf);
365
+ if (read instanceof Promise) {
366
+ return [null, $.newError('json: asynchronous reader is unsupported')];
367
+ }
368
+ const [n, err] = read;
369
+ if (n > 0) {
370
+ chunks.push(...$.bytesToUint8Array($.goSlice(buf, 0, n)));
371
+ }
372
+ if (err !== null) {
373
+ if (err.Error() === 'EOF') {
374
+ return [new Uint8Array(chunks), null];
375
+ }
376
+ return [null, err];
377
+ }
378
+ }
379
+ }
52
380
  function marshalValue(v) {
381
+ const marshaler = marshalJSONTarget(v);
382
+ if (marshaler !== null) {
383
+ const result = marshaler.MarshalJSON();
384
+ if (result instanceof Promise) {
385
+ throw new MarshalerError({
386
+ Err: $.newError('json: asynchronous MarshalJSON is unsupported'),
387
+ });
388
+ }
389
+ const [data, err] = result;
390
+ if (err !== null) {
391
+ throw new MarshalerError({ Err: err });
392
+ }
393
+ try {
394
+ return JSON.parse($.bytesToString(data));
395
+ }
396
+ catch (parseErr) {
397
+ throw new MarshalerError({ Err: goError(parseErr) });
398
+ }
399
+ }
53
400
  if ($.isVarRef(v)) {
54
401
  return marshalValue(v.value);
55
402
  }
56
403
  if (v === null || v === undefined) {
57
404
  return null;
58
405
  }
406
+ if (typeof v === 'number') {
407
+ if (!Number.isFinite(v)) {
408
+ throw new UnsupportedValueError({ Value: v, Str: String(v) });
409
+ }
410
+ return v;
411
+ }
59
412
  if (typeof v !== 'object') {
60
413
  return v;
61
414
  }
62
415
  if (v instanceof Uint8Array) {
63
- return Array.from(v).map(marshalValue);
416
+ return base64Encode(v);
64
417
  }
65
418
  if (Array.isArray(v)) {
66
419
  return v.map(marshalValue);
@@ -76,20 +429,88 @@ function marshalValue(v) {
76
429
  return v;
77
430
  }
78
431
  const out = {};
79
- const typeFields = structFieldMetadata(v);
80
- for (const [fieldName, ref] of Object.entries(v._fields)) {
81
- const jsonName = jsonFieldName(fieldName, typeFields[fieldName]?.tag);
432
+ for (const field of structFields(v)) {
433
+ const ref = v._fields[field.key];
434
+ if (ref === undefined) {
435
+ continue;
436
+ }
437
+ const jsonName = jsonFieldName(field.name, field.tag);
82
438
  if (jsonName === '') {
83
439
  continue;
84
440
  }
85
- out[jsonName] = marshalValue(ref.value);
441
+ out[jsonName] = marshalFieldValue(ref.value, field.type);
86
442
  }
87
443
  return out;
88
444
  }
89
- function assignDecodedValue(target, decoded) {
445
+ function marshalFieldValue(value, fieldType) {
446
+ if (isRawMessageType(fieldType)) {
447
+ const target = $.isVarRef(value) ? value.value : value;
448
+ if (target === null || target === undefined) {
449
+ return null;
450
+ }
451
+ try {
452
+ return JSON.parse($.bytesToString(target));
453
+ }
454
+ catch (err) {
455
+ throw new MarshalerError({ Err: goError(err) });
456
+ }
457
+ }
458
+ return marshalValue(value);
459
+ }
460
+ function marshalJSONTarget(value) {
461
+ const target = $.isVarRef(value) ? value.value : value;
462
+ if (target === null || target === undefined) {
463
+ return null;
464
+ }
465
+ if (typeof target !== 'object' && typeof target !== 'function') {
466
+ return null;
467
+ }
468
+ const method = Reflect.get(target, 'MarshalJSON');
469
+ return typeof method === 'function' ? target : null;
470
+ }
471
+ function unmarshalJSONTarget(value) {
472
+ const target = $.isVarRef(value) ? value.value : value;
473
+ if (target === null || target === undefined) {
474
+ return null;
475
+ }
476
+ if (typeof target !== 'object' && typeof target !== 'function') {
477
+ return null;
478
+ }
479
+ const method = Reflect.get(target, 'UnmarshalJSON');
480
+ return typeof method === 'function' ? target : null;
481
+ }
482
+ function validUnmarshalTarget(value) {
483
+ if (value === null || value === undefined) {
484
+ return false;
485
+ }
486
+ if ($.isVarRef(value)) {
487
+ return true;
488
+ }
489
+ return unmarshalJSONTarget(value) !== null || isStructValue(value);
490
+ }
491
+ function parseJSON(data, opts) {
492
+ const text = $.bytesToString(data);
493
+ if (opts.useNumber) {
494
+ return JSON.parse(text, (_key, value) => typeof value === 'number' ? String(value) : value);
495
+ }
496
+ return JSON.parse(text);
497
+ }
498
+ function assignDecodedValue(target, decoded, opts) {
90
499
  if ($.isVarRef(target)) {
500
+ const unmarshaler = unmarshalJSONTarget(target.value);
501
+ if (unmarshaler !== null) {
502
+ const err = unmarshaler.UnmarshalJSON($.stringToBytes(JSON.stringify(decoded)));
503
+ if (err !== null) {
504
+ throw err;
505
+ }
506
+ return;
507
+ }
91
508
  if (isStructValue(target.value) && isPlainObject(decoded)) {
92
- assignStructFields(target.value, decoded);
509
+ assignStructFields(target.value, decoded, opts);
510
+ return;
511
+ }
512
+ if (target.value instanceof Uint8Array && typeof decoded === 'string') {
513
+ target.value = base64Decode(decoded);
93
514
  return;
94
515
  }
95
516
  if (isPlainObject(decoded)) {
@@ -100,19 +521,44 @@ function assignDecodedValue(target, decoded) {
100
521
  return;
101
522
  }
102
523
  if (isStructValue(target) && isPlainObject(decoded)) {
103
- assignStructFields(target, decoded);
524
+ assignStructFields(target, decoded, opts);
104
525
  }
105
526
  }
106
- function assignStructFields(target, decoded) {
107
- const typeFields = structFieldMetadata(target);
108
- for (const [fieldName, ref] of Object.entries(target._fields)) {
109
- const jsonName = jsonFieldName(fieldName, typeFields[fieldName]?.tag);
527
+ function assignStructFields(target, decoded, opts) {
528
+ const fields = structFields(target);
529
+ const knownNames = new Set();
530
+ for (const field of fields) {
531
+ const jsonName = jsonFieldName(field.name, field.tag);
532
+ if (jsonName !== '') {
533
+ knownNames.add(jsonName);
534
+ }
535
+ }
536
+ if (opts.disallowUnknownFields) {
537
+ for (const key of Object.keys(decoded)) {
538
+ if (!knownNames.has(key)) {
539
+ throw $.newError(`json: unknown field "${key}"`);
540
+ }
541
+ }
542
+ }
543
+ for (const field of fields) {
544
+ const ref = target._fields[field.key];
545
+ if (ref === undefined) {
546
+ continue;
547
+ }
548
+ const jsonName = jsonFieldName(field.name, field.tag);
110
549
  if (jsonName !== '' &&
111
550
  Object.prototype.hasOwnProperty.call(decoded, jsonName)) {
112
- ref.value = decoded[jsonName];
551
+ assignDecodedFieldValue(ref, decoded[jsonName], opts, field.type);
113
552
  }
114
553
  }
115
554
  }
555
+ function assignDecodedFieldValue(target, decoded, opts, fieldType) {
556
+ if (isRawMessageType(fieldType)) {
557
+ target.value = $.stringToBytes(JSON.stringify(decoded));
558
+ return;
559
+ }
560
+ assignDecodedValue(target, decoded, opts);
561
+ }
116
562
  function objectToMap(decoded) {
117
563
  const out = new Map();
118
564
  for (const [key, value] of Object.entries(decoded)) {
@@ -137,42 +583,104 @@ function isPlainObject(value) {
137
583
  !(value instanceof Uint8Array) &&
138
584
  !(value instanceof Map));
139
585
  }
586
+ function structFields(value) {
587
+ const fields = structFieldMetadata(value);
588
+ if (fields.length !== 0) {
589
+ return fields;
590
+ }
591
+ return Object.keys(value._fields).map((key) => ({ key, name: key }));
592
+ }
140
593
  function structFieldMetadata(value) {
141
594
  if (value === null || typeof value !== 'object') {
142
- return {};
595
+ return [];
143
596
  }
144
597
  const ctor = Reflect.get(value, 'constructor');
145
598
  if (ctor === null ||
146
599
  ctor === undefined ||
147
600
  (typeof ctor !== 'object' && typeof ctor !== 'function')) {
148
- return {};
601
+ return [];
149
602
  }
150
603
  const typeInfo = Reflect.get(ctor, '__typeInfo');
151
604
  if (typeInfo === null ||
152
605
  typeInfo === undefined ||
153
606
  typeof typeInfo !== 'object') {
154
- return {};
607
+ return [];
155
608
  }
156
609
  const fields = Reflect.get(typeInfo, 'fields');
157
- if (isPlainObject(fields)) {
158
- const out = {};
159
- for (const [name, field] of Object.entries(fields)) {
160
- if (!isPlainObject(field)) {
610
+ if (Array.isArray(fields)) {
611
+ const out = [];
612
+ for (const field of fields) {
613
+ if (!$.isStructFieldInfo(field)) {
161
614
  continue;
162
615
  }
163
616
  const tag = field.tag;
164
- out[name] = typeof tag === 'string' ? { tag } : {};
617
+ out.push({
618
+ key: $.structFieldRuntimeKey(field),
619
+ name: field.name,
620
+ type: field.type,
621
+ ...(typeof tag === 'string' ? { tag } : {}),
622
+ });
165
623
  }
166
624
  return out;
167
625
  }
168
- return {};
626
+ return [];
627
+ }
628
+ function isRawMessageType(value) {
629
+ if (value === 'json.RawMessage' || value === 'encoding/json.RawMessage') {
630
+ return true;
631
+ }
632
+ if (!isPlainObject(value)) {
633
+ return false;
634
+ }
635
+ return (value.typeName === 'json.RawMessage' ||
636
+ value.typeName === 'encoding/json.RawMessage' ||
637
+ value.name === 'json.RawMessage' ||
638
+ value.name === 'encoding/json.RawMessage');
169
639
  }
170
640
  function goError(err) {
641
+ if (err !== null &&
642
+ typeof err === 'object' &&
643
+ typeof err.Error === 'function') {
644
+ return err;
645
+ }
171
646
  if (err instanceof Error) {
172
647
  return $.toGoError(err);
173
648
  }
174
649
  return $.newError(String(err));
175
650
  }
651
+ function base64Encode(data) {
652
+ let binary = '';
653
+ for (const byte of data) {
654
+ binary += String.fromCharCode(byte);
655
+ }
656
+ return btoa(binary);
657
+ }
658
+ function base64Decode(text) {
659
+ const binary = atob(text);
660
+ const out = new Uint8Array(binary.length);
661
+ for (let i = 0; i < binary.length; i++) {
662
+ out[i] = binary.charCodeAt(i);
663
+ }
664
+ return out;
665
+ }
666
+ function escapeHTMLString(text) {
667
+ return text.replace(/[<>&\u2028\u2029]/g, (char) => {
668
+ switch (char) {
669
+ case '<':
670
+ return '\\u003c';
671
+ case '>':
672
+ return '\\u003e';
673
+ case '&':
674
+ return '\\u0026';
675
+ case '\u2028':
676
+ return '\\u2028';
677
+ case '\u2029':
678
+ return '\\u2029';
679
+ default:
680
+ return char;
681
+ }
682
+ });
683
+ }
176
684
  function jsonFieldName(fieldName, tag) {
177
685
  if (tag === undefined || !tag.startsWith('json:"')) {
178
686
  return fieldName;