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.
- package/README.md +5 -2
- package/cmd/go_js_wasm_exec/main.go +201 -0
- package/cmd/go_js_wasm_exec/main_test.go +83 -0
- package/cmd/goscript/{cmd_compile.go → cmd-compile.go} +7 -0
- package/cmd/goscript/cmd-test.go +14 -0
- package/cmd/goscript/cmd-test_test.go +1 -1
- package/cmd/goscript-wasm/main.go +38 -6
- package/compiler/compile-request.go +12 -9
- package/compiler/compliance_test.go +0 -1
- package/compiler/config.go +2 -0
- package/compiler/diagnostic.go +104 -12
- package/compiler/diagnostic_test.go +106 -0
- package/compiler/gotest/request.go +28 -0
- package/compiler/gotest/runner.go +354 -44
- package/compiler/gotest/runner_test.go +293 -1
- package/compiler/gotest/testdata/browserapi/browserapi_test.go +20 -0
- package/compiler/gotest/testdata/browserapi/go.mod +3 -0
- package/compiler/index.test.ts +23 -0
- package/compiler/lowered-program.go +33 -24
- package/compiler/lowering.go +746 -194
- package/compiler/lowering_bench_test.go +42 -27
- package/compiler/lowering_internal_test.go +18 -0
- package/compiler/override-facts.go +15 -0
- package/compiler/override-parity-verifier.go +450 -0
- package/compiler/override-parity.go +122 -0
- package/compiler/override-registry_test.go +559 -0
- package/compiler/protobuf-ts-binding.go +567 -0
- package/compiler/protobuf-ts-binding_test.go +402 -0
- package/compiler/runtime-contract.go +4 -0
- package/compiler/runtime-contract_test.go +2 -0
- package/compiler/semantic-model-types.go +9 -4
- package/compiler/semantic-model.go +282 -70
- package/compiler/semantic-model_test.go +82 -1
- package/compiler/service.go +21 -1
- package/compiler/skeleton_test.go +118 -10
- package/compiler/typescript-emitter.go +128 -13
- package/compiler/wasm/compile_test.go +37 -4
- package/compiler/{wasm_api.go → wasm-api.go} +57 -7
- package/dist/gs/builtin/hostio.js +5 -0
- package/dist/gs/builtin/hostio.js.map +1 -1
- package/dist/gs/builtin/slice.d.ts +13 -2
- package/dist/gs/builtin/slice.js +187 -6
- package/dist/gs/builtin/slice.js.map +1 -1
- package/dist/gs/builtin/type.d.ts +13 -5
- package/dist/gs/builtin/type.js +153 -60
- package/dist/gs/builtin/type.js.map +1 -1
- package/dist/gs/builtin/varRef.d.ts +11 -0
- package/dist/gs/builtin/varRef.js +57 -2
- package/dist/gs/builtin/varRef.js.map +1 -1
- package/dist/gs/bytes/buffer.gs.js +1 -1
- package/dist/gs/bytes/buffer.gs.js.map +1 -1
- package/dist/gs/bytes/reader.gs.js +1 -1
- package/dist/gs/bytes/reader.gs.js.map +1 -1
- package/dist/gs/compress/zlib/index.d.ts +10 -3
- package/dist/gs/compress/zlib/index.js +50 -16
- package/dist/gs/compress/zlib/index.js.map +1 -1
- package/dist/gs/encoding/json/index.d.ts +114 -0
- package/dist/gs/encoding/json/index.js +544 -36
- package/dist/gs/encoding/json/index.js.map +1 -1
- package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.d.ts +101 -0
- package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.js +589 -0
- package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.js.map +1 -1
- package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.d.ts +1 -0
- package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.js +17 -11
- package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.js.map +1 -1
- package/dist/gs/github.com/pkg/errors/errors.js +54 -30
- package/dist/gs/github.com/pkg/errors/errors.js.map +1 -1
- package/dist/gs/go/scanner/index.d.ts +2 -0
- package/dist/gs/go/scanner/index.js +29 -5
- package/dist/gs/go/scanner/index.js.map +1 -1
- package/dist/gs/go/token/index.js +22 -6
- package/dist/gs/go/token/index.js.map +1 -1
- package/dist/gs/hash/index.d.ts +6 -0
- package/dist/gs/hash/index.js +20 -0
- package/dist/gs/hash/index.js.map +1 -1
- package/dist/gs/internal/byteorder/index.js +2 -2
- package/dist/gs/internal/byteorder/index.js.map +1 -1
- package/dist/gs/internal/goarch/index.d.ts +43 -3
- package/dist/gs/internal/goarch/index.js +42 -10
- package/dist/gs/internal/goarch/index.js.map +1 -1
- package/dist/gs/io/fs/fs.js +26 -14
- package/dist/gs/io/fs/fs.js.map +1 -1
- package/dist/gs/io/fs/readdir.js +4 -2
- package/dist/gs/io/fs/readdir.js.map +1 -1
- package/dist/gs/io/fs/sub.js +8 -1
- package/dist/gs/io/fs/sub.js.map +1 -1
- package/dist/gs/io/io.d.ts +2 -0
- package/dist/gs/io/io.js.map +1 -1
- package/dist/gs/math/bits/index.d.ts +5 -0
- package/dist/gs/math/bits/index.js +16 -4
- package/dist/gs/math/bits/index.js.map +1 -1
- package/dist/gs/mime/index.d.ts +16 -0
- package/dist/gs/mime/index.js +315 -6
- package/dist/gs/mime/index.js.map +1 -1
- package/dist/gs/net/http/httptest/index.d.ts +12 -0
- package/dist/gs/net/http/httptest/index.js +85 -6
- package/dist/gs/net/http/httptest/index.js.map +1 -1
- package/dist/gs/net/http/index.d.ts +300 -5
- package/dist/gs/net/http/index.js +1598 -58
- package/dist/gs/net/http/index.js.map +1 -1
- package/dist/gs/os/dir_unix.gs.js +1 -1
- package/dist/gs/os/dir_unix.gs.js.map +1 -1
- package/dist/gs/os/error.gs.js +1 -1
- package/dist/gs/os/error.gs.js.map +1 -1
- package/dist/gs/os/exec.gs.d.ts +1 -0
- package/dist/gs/os/exec.gs.js +4 -8
- package/dist/gs/os/exec.gs.js.map +1 -1
- package/dist/gs/os/exec_posix.gs.js +1 -1
- package/dist/gs/os/exec_posix.gs.js.map +1 -1
- package/dist/gs/os/index.d.ts +1 -1
- package/dist/gs/os/index.js +1 -1
- package/dist/gs/os/index.js.map +1 -1
- package/dist/gs/os/proc.gs.d.ts +4 -0
- package/dist/gs/os/proc.gs.js +12 -6
- package/dist/gs/os/proc.gs.js.map +1 -1
- package/dist/gs/os/root_js.gs.js +1 -1
- package/dist/gs/os/root_js.gs.js.map +1 -1
- package/dist/gs/os/types.gs.js +1 -1
- package/dist/gs/os/types.gs.js.map +1 -1
- package/dist/gs/os/types_js.gs.js +1 -1
- package/dist/gs/os/types_js.gs.js.map +1 -1
- package/dist/gs/os/types_unix.gs.js +1 -1
- package/dist/gs/os/types_unix.gs.js.map +1 -1
- package/dist/gs/path/path.js +11 -7
- package/dist/gs/path/path.js.map +1 -1
- package/dist/gs/reflect/index.d.ts +5 -4
- package/dist/gs/reflect/index.js +4 -3
- package/dist/gs/reflect/index.js.map +1 -1
- package/dist/gs/reflect/map.js +15 -0
- package/dist/gs/reflect/map.js.map +1 -1
- package/dist/gs/reflect/type.d.ts +25 -6
- package/dist/gs/reflect/type.js +1475 -228
- package/dist/gs/reflect/type.js.map +1 -1
- package/dist/gs/reflect/types.d.ts +14 -6
- package/dist/gs/reflect/types.js +35 -1
- package/dist/gs/reflect/types.js.map +1 -1
- package/dist/gs/reflect/value.d.ts +1 -0
- package/dist/gs/reflect/value.js +83 -41
- package/dist/gs/reflect/value.js.map +1 -1
- package/dist/gs/reflect/visiblefields.js +4 -140
- package/dist/gs/reflect/visiblefields.js.map +1 -1
- package/dist/gs/runtime/pprof/index.d.ts +8 -2
- package/dist/gs/runtime/pprof/index.js +50 -30
- package/dist/gs/runtime/pprof/index.js.map +1 -1
- package/dist/gs/runtime/runtime.js +5 -4
- package/dist/gs/runtime/runtime.js.map +1 -1
- package/dist/gs/runtime/trace/index.js +5 -19
- package/dist/gs/runtime/trace/index.js.map +1 -1
- package/dist/gs/strconv/atoi.gs.js +1 -1
- package/dist/gs/strconv/atoi.gs.js.map +1 -1
- package/dist/gs/strconv/complex.gs.d.ts +3 -0
- package/dist/gs/strconv/complex.gs.js +148 -0
- package/dist/gs/strconv/complex.gs.js.map +1 -0
- package/dist/gs/strconv/index.d.ts +1 -0
- package/dist/gs/strconv/index.js +1 -0
- package/dist/gs/strconv/index.js.map +1 -1
- package/dist/gs/strings/builder.js +1 -1
- package/dist/gs/strings/reader.js +9 -5
- package/dist/gs/strings/reader.js.map +1 -1
- package/dist/gs/strings/replace.js +15 -7
- package/dist/gs/strings/replace.js.map +1 -1
- package/dist/gs/strings/strings.d.ts +5 -0
- package/dist/gs/strings/strings.js +57 -5
- package/dist/gs/strings/strings.js.map +1 -1
- package/dist/gs/sync/atomic/doc_64.gs.js +7 -6
- package/dist/gs/sync/atomic/doc_64.gs.js.map +1 -1
- package/dist/gs/sync/atomic/type.gs.js +9 -9
- package/dist/gs/sync/atomic/type.gs.js.map +1 -1
- package/dist/gs/sync/atomic/value.gs.js +2 -2
- package/dist/gs/sync/atomic/value.gs.js.map +1 -1
- package/dist/gs/syscall/env.js +22 -14
- package/dist/gs/syscall/env.js.map +1 -1
- package/dist/gs/testing/testing.js +55 -13
- package/dist/gs/testing/testing.js.map +1 -1
- package/dist/gs/time/time.d.ts +24 -1
- package/dist/gs/time/time.js +43 -3
- package/dist/gs/time/time.js.map +1 -1
- package/dist/gs/unique/index.js +7 -1
- package/dist/gs/unique/index.js.map +1 -1
- package/go.mod +3 -3
- package/go.sum +16 -0
- package/gs/builtin/hostio.test.ts +16 -0
- package/gs/builtin/hostio.ts +7 -0
- package/gs/builtin/runtime-contract.test.ts +246 -21
- package/gs/builtin/slice.ts +269 -24
- package/gs/builtin/type.ts +226 -59
- package/gs/builtin/varRef.ts +85 -2
- package/gs/bytes/buffer.gs.ts +1 -1
- package/gs/bytes/reader.gs.ts +1 -1
- package/gs/compress/zlib/index.test.ts +62 -1
- package/gs/compress/zlib/index.ts +53 -16
- package/gs/compress/zlib/parity.json +51 -0
- package/gs/encoding/json/index.test.ts +360 -6
- package/gs/encoding/json/index.ts +679 -38
- package/gs/encoding/json/parity.json +81 -0
- package/gs/github.com/aperturerobotics/protobuf-go-lite/index.test.ts +373 -3
- package/gs/github.com/aperturerobotics/protobuf-go-lite/index.ts +893 -1
- package/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.test.ts +18 -0
- package/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.ts +17 -11
- package/gs/github.com/pkg/errors/errors.ts +54 -30
- package/gs/go/scanner/index.test.ts +39 -56
- package/gs/go/scanner/index.ts +33 -5
- package/gs/go/scanner/parity.json +27 -0
- package/gs/go/token/index.ts +22 -6
- package/gs/hash/index.test.ts +20 -33
- package/gs/hash/index.ts +28 -0
- package/gs/hash/parity.json +21 -0
- package/gs/internal/byteorder/index.test.ts +2 -2
- package/gs/internal/byteorder/index.ts +2 -2
- package/gs/internal/goarch/index.test.ts +32 -0
- package/gs/internal/goarch/index.ts +45 -13
- package/gs/internal/goarch/parity.json +144 -0
- package/gs/io/fs/fs.ts +26 -14
- package/gs/io/fs/readdir.ts +4 -4
- package/gs/io/fs/sub.ts +8 -1
- package/gs/io/io.ts +1 -0
- package/gs/io/parity.json +162 -0
- package/gs/math/bits/index.test.ts +14 -1
- package/gs/math/bits/index.ts +23 -4
- package/gs/math/bits/parity.json +156 -0
- package/gs/mime/index.test.ts +90 -0
- package/gs/mime/index.ts +369 -6
- package/gs/mime/parity.json +36 -0
- package/gs/net/http/httptest/index.test.ts +98 -2
- package/gs/net/http/httptest/index.ts +101 -6
- package/gs/net/http/httptest/parity.json +15 -0
- package/gs/net/http/index.test.ts +781 -12
- package/gs/net/http/index.ts +1860 -139
- package/gs/net/http/meta.json +16 -1
- package/gs/net/http/parity.json +193 -0
- package/gs/os/dir_unix.gs.ts +1 -1
- package/gs/os/error.gs.ts +1 -1
- package/gs/os/exec.gs.ts +4 -8
- package/gs/os/exec_posix.gs.ts +1 -1
- package/gs/os/index.test.ts +9 -0
- package/gs/os/index.ts +1 -0
- package/gs/os/parity.json +9 -0
- package/gs/os/proc.gs.ts +18 -5
- package/gs/os/proc.test.ts +26 -0
- package/gs/os/root_js.gs.ts +1 -1
- package/gs/os/types.gs.ts +1 -1
- package/gs/os/types_js.gs.ts +1 -1
- package/gs/os/types_unix.gs.ts +1 -1
- package/gs/path/path.ts +11 -7
- package/gs/reflect/field.test.ts +37 -15
- package/gs/reflect/function-types.test.ts +518 -22
- package/gs/reflect/index.ts +8 -6
- package/gs/reflect/map.ts +20 -0
- package/gs/reflect/meta.json +6 -4
- package/gs/reflect/parity.json +234 -0
- package/gs/reflect/sliceat.test.ts +156 -0
- package/gs/reflect/structof.test.ts +401 -0
- package/gs/reflect/type.ts +1961 -317
- package/gs/reflect/typefor.test.ts +530 -10
- package/gs/reflect/types.ts +43 -18
- package/gs/reflect/value.ts +105 -45
- package/gs/reflect/visiblefields.ts +5 -168
- package/gs/runtime/parity.json +24 -0
- package/gs/runtime/pprof/index.test.ts +29 -7
- package/gs/runtime/pprof/index.ts +56 -30
- package/gs/runtime/pprof/parity.json +27 -0
- package/gs/runtime/runtime.test.ts +3 -1
- package/gs/runtime/runtime.ts +4 -3
- package/gs/runtime/trace/index.test.ts +5 -3
- package/gs/runtime/trace/index.ts +8 -20
- package/gs/runtime/trace/parity.json +36 -0
- package/gs/strconv/atoi.gs.ts +1 -1
- package/gs/strconv/complex.gs.ts +174 -0
- package/gs/strconv/complex.test.ts +65 -0
- package/gs/strconv/index.ts +1 -0
- package/gs/strconv/parity.json +120 -0
- package/gs/strings/builder.ts +1 -1
- package/gs/strings/parity.json +186 -0
- package/gs/strings/reader.ts +9 -5
- package/gs/strings/replace.ts +15 -7
- package/gs/strings/strings.test.ts +22 -2
- package/gs/strings/strings.ts +64 -6
- package/gs/sync/atomic/doc_64.gs.ts +6 -7
- package/gs/sync/atomic/doc_64.test.ts +43 -0
- package/gs/sync/atomic/type.gs.ts +9 -9
- package/gs/sync/atomic/value.gs.ts +2 -2
- package/gs/syscall/env.ts +29 -14
- package/gs/testing/testing.test.ts +67 -0
- package/gs/testing/testing.ts +87 -19
- package/gs/time/parity.json +225 -0
- package/gs/time/time.test.ts +20 -2
- package/gs/time/time.ts +49 -7
- package/gs/unique/index.ts +7 -1
- package/package.json +4 -2
- package/dist/gs/github.com/aperturerobotics/starpc/srpc/index.d.ts +0 -217
- package/dist/gs/github.com/aperturerobotics/starpc/srpc/index.js +0 -926
- package/dist/gs/github.com/aperturerobotics/starpc/srpc/index.js.map +0 -1
- package/gs/github.com/aperturerobotics/starpc/srpc/index.test.ts +0 -38
- package/gs/github.com/aperturerobotics/starpc/srpc/index.ts +0 -1361
- 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
|
-
|
|
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
|
|
219
|
+
export function Compact(dst, src) {
|
|
26
220
|
try {
|
|
27
|
-
const text = JSON.stringify(
|
|
28
|
-
|
|
29
|
-
|
|
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
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
|
80
|
-
|
|
81
|
-
|
|
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] =
|
|
441
|
+
out[jsonName] = marshalFieldValue(ref.value, field.type);
|
|
86
442
|
}
|
|
87
443
|
return out;
|
|
88
444
|
}
|
|
89
|
-
function
|
|
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
|
|
108
|
-
|
|
109
|
-
|
|
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
|
|
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 (
|
|
158
|
-
const out =
|
|
159
|
-
for (const
|
|
160
|
-
if (
|
|
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
|
|
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;
|