gofront 1.8.0 → 1.9.0

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 (177) hide show
  1. package/README.md +3 -3
  2. package/package.json +5 -4
  3. package/src/backend/js/expressions.js +849 -371
  4. package/src/backend/js/index.js +241 -147
  5. package/src/backend/js/natives.js +383 -0
  6. package/src/backend/js/runtime.js +512 -2547
  7. package/src/backend/js/statements.js +506 -103
  8. package/src/backend/js/stdlib/index.js +45 -93
  9. package/src/backend/js/templ.js +32 -45
  10. package/src/backend/js/type-info.js +177 -13
  11. package/src/backend/shared/fixed-float.js +20 -0
  12. package/src/backend/shared/fmt-types.js +63 -171
  13. package/src/backend/shared/host-unicode.js +36 -0
  14. package/src/backend/wasm/boundary.js +490 -965
  15. package/src/backend/wasm/emit-builtins.js +643 -256
  16. package/src/backend/wasm/emit-exprs.js +124 -57
  17. package/src/backend/wasm/emit-maps.js +17 -367
  18. package/src/backend/wasm/emit-stmts.js +325 -75
  19. package/src/backend/wasm/emit.js +104 -13
  20. package/src/backend/wasm/globals.js +47 -8
  21. package/src/backend/wasm/glue.js +2 -4
  22. package/src/backend/wasm/index.js +36 -530
  23. package/src/backend/wasm/method-expr.js +12 -1
  24. package/src/backend/wasm/module-emitter.js +92 -717
  25. package/src/backend/wasm/monomorph.js +103 -6
  26. package/src/backend/wasm/natives.js +596 -0
  27. package/src/backend/wasm/prescan.js +5 -153
  28. package/src/backend/wasm/prune-funcs.js +89 -0
  29. package/src/backend/wasm/stdlib/index.js +2 -32
  30. package/src/backend/wasm/types.js +68 -20
  31. package/src/backend/wasm/variadic.js +3 -3
  32. package/src/cli/cli-core.js +5 -1
  33. package/src/cli/test-runner.js +115 -342
  34. package/src/compiler.js +108 -130
  35. package/src/lexer/lexer.js +105 -11
  36. package/src/lexer/templ-lexer.js +61 -18
  37. package/src/lexer/tokens.js +1 -0
  38. package/src/link/stdlib.js +354 -132
  39. package/src/link/type-names.js +148 -0
  40. package/src/link/wasm.js +30 -6
  41. package/src/lower/bounds.js +153 -0
  42. package/src/lower/captures.js +92 -33
  43. package/src/lower/embedding.js +32 -3
  44. package/src/lower/errors-as.js +196 -0
  45. package/src/lower/fmt-formatters.js +905 -0
  46. package/src/lower/functions.js +2 -0
  47. package/src/lower/gen-types.js +274 -0
  48. package/src/lower/index.js +7 -1
  49. package/src/lower/json-codecs.js +228 -247
  50. package/src/lower/ownership.js +25 -7
  51. package/src/lower/reachability.js +69 -51
  52. package/src/lower/walk.js +12 -0
  53. package/src/parser/declarations.js +28 -5
  54. package/src/parser/expressions.js +86 -16
  55. package/src/parser/statements.js +1 -0
  56. package/src/parser/templ.js +44 -5
  57. package/src/parser/types.js +1 -0
  58. package/src/resolver.js +1 -2
  59. package/src/typechecker/assignability.js +124 -11
  60. package/src/typechecker/const-fold.js +70 -27
  61. package/src/typechecker/constants.js +32 -6
  62. package/src/typechecker/expressions.js +326 -98
  63. package/src/typechecker/index.js +208 -33
  64. package/src/typechecker/init-order.js +136 -40
  65. package/src/typechecker/operand-text.js +40 -0
  66. package/src/typechecker/resolve.js +192 -36
  67. package/src/typechecker/statements.js +122 -11
  68. package/src/typechecker/stdlib/excluded.js +9 -5
  69. package/src/typechecker/stdlib/index.js +25 -9
  70. package/src/typechecker/termination.js +10 -1
  71. package/src/typechecker/types.js +203 -573
  72. package/stdlib/bytes/buffer.go +479 -0
  73. package/stdlib/bytes/bytes.go +1010 -0
  74. package/stdlib/bytes/reader.go +161 -0
  75. package/stdlib/context/context.go +115 -0
  76. package/stdlib/crypto/rand/rand.go +34 -0
  77. package/stdlib/crypto/sha256/sha256.go +249 -0
  78. package/stdlib/encoding/base64/base64.go +331 -0
  79. package/stdlib/encoding/binary/binary.go +332 -0
  80. package/stdlib/encoding/hex/hex.go +140 -0
  81. package/stdlib/encoding/json/json.go +62 -0
  82. package/stdlib/errors/errors.go +174 -0
  83. package/stdlib/fmt/errors.go +110 -0
  84. package/stdlib/fmt/format.go +732 -0
  85. package/stdlib/fmt/print.go +1232 -0
  86. package/stdlib/gom/gom.go +293 -0
  87. package/stdlib/html/html.go +251 -0
  88. package/stdlib/internal/fmtrt/fmtrt.go +163 -0
  89. package/stdlib/internal/jsonrt/dec.go +171 -38
  90. package/stdlib/internal/jsonrt/enc.go +186 -36
  91. package/stdlib/internal/jsonrt/scanner.go +17 -8
  92. package/stdlib/io/io.go +157 -1
  93. package/stdlib/maps/maps.go +131 -0
  94. package/stdlib/math/bits/bits.go +507 -0
  95. package/stdlib/math/extra.go +16 -14
  96. package/stdlib/math/math.go +439 -0
  97. package/stdlib/math/rand/rand.go +297 -0
  98. package/stdlib/os/os.go +93 -0
  99. package/stdlib/path/filepath/filepath.go +47 -0
  100. package/stdlib/path/path.go +394 -0
  101. package/stdlib/regexp/regexp.go +231 -0
  102. package/stdlib/slices/slices.go +526 -0
  103. package/stdlib/slices/sort.go +209 -0
  104. package/stdlib/slices/zsort_cmp.go +480 -0
  105. package/stdlib/slices/zsort_ordered.go +482 -0
  106. package/stdlib/sort/sort.go +391 -452
  107. package/stdlib/sort/zsort_func.go +480 -0
  108. package/stdlib/sort/zsort_iface.go +480 -0
  109. package/stdlib/strconv/float.go +1699 -0
  110. package/stdlib/strconv/isprint.go +752 -0
  111. package/stdlib/strconv/quote.go +235 -50
  112. package/stdlib/strconv/strconv.go +616 -0
  113. package/stdlib/strings/builder.go +95 -0
  114. package/stdlib/strings/reader.go +163 -0
  115. package/stdlib/strings/replacer.go +102 -0
  116. package/stdlib/strings/strings.go +807 -0
  117. package/stdlib/sync/sync.go +268 -0
  118. package/stdlib/testing/async_js.go +61 -0
  119. package/stdlib/testing/benchmark.go +297 -0
  120. package/stdlib/testing/testing.go +523 -0
  121. package/stdlib/time/duration.go +233 -0
  122. package/stdlib/time/format.go +745 -0
  123. package/stdlib/time/parse.go +790 -0
  124. package/stdlib/time/sleep_js.go +63 -0
  125. package/stdlib/time/time.go +834 -0
  126. package/stdlib/unicode/unicode.go +141 -3
  127. package/stdlib/unicode/utf8/utf8.go +464 -0
  128. package/src/backend/js/fmt-runtime.js +0 -573
  129. package/src/backend/js/stdlib/base64.js +0 -12
  130. package/src/backend/js/stdlib/binary.js +0 -102
  131. package/src/backend/js/stdlib/bits.js +0 -119
  132. package/src/backend/js/stdlib/builder.js +0 -98
  133. package/src/backend/js/stdlib/bytes.js +0 -368
  134. package/src/backend/js/stdlib/errors.js +0 -45
  135. package/src/backend/js/stdlib/fmt.js +0 -517
  136. package/src/backend/js/stdlib/gom.js +0 -155
  137. package/src/backend/js/stdlib/hex.js +0 -17
  138. package/src/backend/js/stdlib/html.js +0 -20
  139. package/src/backend/js/stdlib/io.js +0 -137
  140. package/src/backend/js/stdlib/json.js +0 -1167
  141. package/src/backend/js/stdlib/maps.js +0 -37
  142. package/src/backend/js/stdlib/math.js +0 -85
  143. package/src/backend/js/stdlib/os.js +0 -13
  144. package/src/backend/js/stdlib/path.js +0 -48
  145. package/src/backend/js/stdlib/rand.js +0 -32
  146. package/src/backend/js/stdlib/regexp.js +0 -54
  147. package/src/backend/js/stdlib/sha256.js +0 -12
  148. package/src/backend/js/stdlib/shared.js +0 -17
  149. package/src/backend/js/stdlib/simd.js +0 -34
  150. package/src/backend/js/stdlib/slices.js +0 -107
  151. package/src/backend/js/stdlib/sort.js +0 -30
  152. package/src/backend/js/stdlib/strconv.js +0 -79
  153. package/src/backend/js/stdlib/strings.js +0 -301
  154. package/src/backend/js/stdlib/sync.js +0 -13
  155. package/src/backend/js/stdlib/testing.js +0 -41
  156. package/src/backend/js/stdlib/time.js +0 -152
  157. package/src/backend/js/stdlib/unicode.js +0 -25
  158. package/src/backend/js/stdlib/utf8.js +0 -26
  159. package/src/backend/wasm/stdlib/bytes.js +0 -6716
  160. package/src/backend/wasm/stdlib/core.js +0 -10278
  161. package/src/backend/wasm/stdlib/io.js +0 -3578
  162. package/src/backend/wasm/stdlib/packages.js +0 -2402
  163. package/src/backend/wasm/stdlib/pure.js +0 -720
  164. package/src/backend/wasm/stdlib/time.js +0 -2229
  165. package/src/typechecker/stdlib/core.js +0 -1079
  166. package/src/typechecker/stdlib/extended.js +0 -1210
  167. package/stdlib/bytes/iter.go +0 -192
  168. package/stdlib/bytes/search.go +0 -240
  169. package/stdlib/bytes/split.go +0 -218
  170. package/stdlib/errors/overlay.go +0 -12
  171. package/stdlib/maps/iter.go +0 -65
  172. package/stdlib/slices/extra.go +0 -73
  173. package/stdlib/slices/iter.go +0 -113
  174. package/stdlib/strings/extra.go +0 -35
  175. package/stdlib/strings/iter.go +0 -122
  176. package/stdlib/sync/extra.go +0 -105
  177. package/stdlib/unicode/utf8/bytes.go +0 -239
@@ -1,368 +0,0 @@
1
- // CodeGen for Go `bytes` package.
2
-
3
- /** @typedef {import('../index.js').CodeGen} CodeGen */
4
-
5
- const __bs = `(b => typeof TextDecoder !== "undefined" ? new TextDecoder().decode(b instanceof Uint8Array ? b : new Uint8Array(b)) : String.fromCharCode.apply(null, b))`;
6
- const __sb = `(s => typeof TextEncoder !== "undefined" ? new TextEncoder().encode(s) : new Uint8Array([...s].map(c => c.charCodeAt(0))))`;
7
-
8
- const BYTES_DISPATCH = {
9
- Contains: (a) =>
10
- `((b, sep) => {
11
- b = b || new Uint8Array(0);
12
- sep = sep || new Uint8Array(0);
13
- if (sep.length === 0) return true;
14
- if (sep.length === 1) return (b.indexOf ? b.indexOf(sep[0]) : Array.prototype.indexOf.call(b, sep[0])) >= 0;
15
- if (sep.length > b.length) return false;
16
- const first = sep[0];
17
- const last = sep[sep.length - 1];
18
- let i = 0;
19
- while (i <= b.length - sep.length) {
20
- const idx = b.indexOf ? b.indexOf(first, i) : Array.prototype.indexOf.call(b, first, i);
21
- if (idx < 0 || idx > b.length - sep.length) return false;
22
- if (b[idx + sep.length - 1] === last) {
23
- let match = true;
24
- for (let j = 1; j < sep.length - 1; j++) {
25
- if (b[idx + j] !== sep[j]) { match = false; break; }
26
- }
27
- if (match) return true;
28
- }
29
- i = idx + 1;
30
- }
31
- return false;
32
- })(${a[0]}, ${a[1]})`,
33
- HasPrefix: (a) =>
34
- `((b, p) => { for (let i = 0; i < p.length; i++) if (b[i] !== p[i]) return false; return b.length >= p.length; })(${a[0]}, ${a[1]})`,
35
- HasSuffix: (a) =>
36
- `((b, s) => { const off = b.length - s.length; if (off < 0) return false; for (let i = 0; i < s.length; i++) if (b[off + i] !== s[i]) return false; return true; })(${a[0]}, ${a[1]})`,
37
- Index: (a) =>
38
- `((b, sep) => {
39
- b = b || new Uint8Array(0);
40
- sep = sep || new Uint8Array(0);
41
- const n = b.length;
42
- const m = sep.length;
43
- if (m === 0) return 0;
44
- if (m === 1) return b.indexOf ? b.indexOf(sep[0]) : Array.prototype.indexOf.call(b, sep[0]);
45
- if (m > n) return -1;
46
- if (m === n) {
47
- for (let k = 0; k < m; k++) if (b[k] !== sep[k]) return -1;
48
- return 0;
49
- }
50
- const first = sep[0];
51
- const last = sep[m - 1];
52
- let i = 0;
53
- while (i <= n - m) {
54
- const idx = b.indexOf ? b.indexOf(first, i) : Array.prototype.indexOf.call(b, first, i);
55
- if (idx < 0 || idx > n - m) return -1;
56
- if (b[idx + m - 1] === last) {
57
- let match = true;
58
- for (let j = 1; j < m - 1; j++) {
59
- if (b[idx + j] !== sep[j]) { match = false; break; }
60
- }
61
- if (match) return idx;
62
- }
63
- i = idx + 1;
64
- }
65
- return -1;
66
- })(${a[0]}, ${a[1]})`,
67
- Count: (a) =>
68
- `((b, sep) => {
69
- b = b || new Uint8Array(0);
70
- sep = sep || new Uint8Array(0);
71
- if (sep.length === 0) {
72
- let runes = 0;
73
- for (let i = 0; i < b.length; i++) if ((b[i] & 0xc0) !== 0x80) runes++;
74
- return runes + 1;
75
- }
76
- let cnt = 0;
77
- if (sep.length === 1) {
78
- const c = sep[0];
79
- for (let i = 0; i < b.length; i++) if (b[i] === c) cnt++;
80
- return cnt;
81
- }
82
- let i = 0;
83
- const first = sep[0];
84
- const last = sep[sep.length - 1];
85
- while (i <= b.length - sep.length) {
86
- const idx = b.indexOf ? b.indexOf(first, i) : Array.prototype.indexOf.call(b, first, i);
87
- if (idx < 0 || idx > b.length - sep.length) break;
88
- if (b[idx + sep.length - 1] === last) {
89
- let match = true;
90
- for (let j = 1; j < sep.length - 1; j++) {
91
- if (b[idx + j] !== sep[j]) { match = false; break; }
92
- }
93
- if (match) {
94
- cnt++;
95
- i = idx + sep.length;
96
- continue;
97
- }
98
- }
99
- i = idx + 1;
100
- }
101
- return cnt;
102
- })(${a[0]}, ${a[1]})`,
103
- Repeat: (a) => `${__sb}(${__bs}(${a[0]}).repeat(${a[1]}))`,
104
- Replace: (a) =>
105
- `((b, o, n, cnt) => { let str = ${__bs}(b), os = ${__bs}(o), nw = ${__bs}(n); if (cnt < 0) return ${__sb}(str.replaceAll(os, () => nw)); let r = ""; let i = 0; for (; cnt > 0; cnt--) { const j = str.indexOf(os, i); if (j < 0) break; r += str.slice(i, j) + nw; i = j + os.length; if (os.length === 0) { if (i >= str.length) break; r += str[i]; i++; } } return ${__sb}(r + str.slice(i)); })(${a[0]}, ${a[1]}, ${a[2]}, ${a[3]})`,
106
- ToUpper: (a) =>
107
- `new TextEncoder().encode(new TextDecoder().decode(new Uint8Array(${a[0]})).toUpperCase())`,
108
- ToLower: (a) =>
109
- `new TextEncoder().encode(new TextDecoder().decode(new Uint8Array(${a[0]})).toLowerCase())`,
110
- ToTitle: (a) =>
111
- `new TextEncoder().encode(new TextDecoder().decode(new Uint8Array(${a[0]})).toUpperCase())`,
112
- TrimSpace: (a) =>
113
- `new TextEncoder().encode(new TextDecoder().decode(new Uint8Array(${a[0]})).trim())`,
114
- Trim: (a) =>
115
- `((b, c) => { const s = new TextDecoder().decode(new Uint8Array(b)); const cs = new Set(Array.from(c)); const chars = Array.from(s); let l = 0, r = chars.length; while (l < r && cs.has(chars[l])) l++; while (r > l && cs.has(chars[r - 1])) r--; return new TextEncoder().encode(chars.slice(l, r).join("")); })(${a[0]}, ${a[1]})`,
116
- Equal: (a) =>
117
- `((a, b) => { if (a.length !== b.length) return false; for (let i = 0; i < a.length; i++) if (a[i] !== b[i]) return false; return true; })(${a[0]}, ${a[1]})`,
118
- Split: (a) => `${__bs}(${a[0]}).split(${__bs}(${a[1]})).map(p => ${__sb}(p))`,
119
- Join: (a) => `${__sb}(${a[0]}.map(p => ${__bs}(p)).join(${__bs}(${a[1]})))`,
120
- ReplaceAll: (a) =>
121
- `((b, o, n) => { const r = []; let i = 0; while (i <= b.length - o.length) { if (o.length > 0 && o.every((v, j) => b[i + j] === v)) { r.push(...n); i += o.length; } else { r.push(b[i++]); } } for (; i < b.length; i++) r.push(b[i]); return new Uint8Array(r); })(${a[0]}, ${a[1]}, ${a[2]})`,
122
- TrimPrefix: (a) =>
123
- `((b, p) => p.every((v, i) => b[i] === v) ? b.slice(p.length) : b.slice())(${a[0]}, ${a[1]})`,
124
- TrimSuffix: (a) =>
125
- `((b, s) => s.length && s.every((v, i) => b[b.length - s.length + i] === v) ? b.slice(0, -s.length) : b.slice())(${a[0]}, ${a[1]})`,
126
- TrimLeft: (a) =>
127
- `((b, c) => { const s = new TextDecoder().decode(new Uint8Array(b)); const cs = new Set(Array.from(c)); const chars = Array.from(s); let l = 0, r = chars.length; while (l < r && cs.has(chars[l])) l++; return new TextEncoder().encode(chars.slice(l, r).join("")); })(${a[0]}, ${a[1]})`,
128
- TrimRight: (a) =>
129
- `((b, c) => { const s = new TextDecoder().decode(new Uint8Array(b)); const cs = new Set(Array.from(c)); const chars = Array.from(s); let l = 0, r = chars.length; while (r > l && cs.has(chars[r - 1])) r--; return new TextEncoder().encode(chars.slice(l, r).join("")); })(${a[0]}, ${a[1]})`,
130
- TrimFunc: (a) =>
131
- `((b, f) => { const s = new TextDecoder().decode(new Uint8Array(b)); const chars = Array.from(s); let l = 0, r = chars.length; while (l < r && f(chars[l].codePointAt(0))) l++; while (r > l && f(chars[r - 1].codePointAt(0))) r--; return new TextEncoder().encode(chars.slice(l, r).join("")); })(${a[0]}, ${a[1]})`,
132
- IndexByte: (a) => `(${a[0]}).indexOf(${a[1]})`,
133
- LastIndex: (a) =>
134
- `((b, sep) => {
135
- b = b || new Uint8Array(0);
136
- sep = sep || new Uint8Array(0);
137
- const n = b.length;
138
- const m = sep.length;
139
- if (m === 0) return n;
140
- if (m === 1) return b.lastIndexOf ? b.lastIndexOf(sep[0]) : Array.prototype.lastIndexOf.call(b, sep[0]);
141
- if (m > n) return -1;
142
- if (m === n) {
143
- for (let k = 0; k < m; k++) if (b[k] !== sep[k]) return -1;
144
- return 0;
145
- }
146
- const first = sep[0];
147
- const last = sep[m - 1];
148
- let i = n - m;
149
- while (i >= 0) {
150
- const idx = b.lastIndexOf ? b.lastIndexOf(first, i) : Array.prototype.lastIndexOf.call(b, first, i);
151
- if (idx < 0) return -1;
152
- if (b[idx + m - 1] === last) {
153
- let match = true;
154
- for (let j = 1; j < m - 1; j++) {
155
- if (b[idx + j] !== sep[j]) { match = false; break; }
156
- }
157
- if (match) return idx;
158
- }
159
- i = idx - 1;
160
- }
161
- return -1;
162
- })(${a[0]}, ${a[1]})`,
163
- LastIndexByte: (a) => `(${a[0]}).lastIndexOf(${a[1]})`,
164
- Fields: (a) =>
165
- `((b) => { const s = new TextDecoder().decode(new Uint8Array(b ?? [])); return s.split(/[ \\t\\n\\v\\f\\r\\u0085\\u00A0\\u1680\\u2000-\\u200A\\u2028\\u2029\\u202F\\u205F\\u3000]+/).filter(p => p !== "").map(w => new TextEncoder().encode(w)); })(${a[0]})`,
166
- FieldsFunc: (a) =>
167
- `((b, fn) => { const s = new TextDecoder().decode(new Uint8Array(b ?? [])); const res = []; let cur = ""; for (const ch of s) { const cp = ch.codePointAt(0); if (fn(cp)) { if (cur.length > 0) { res.push(new TextEncoder().encode(cur)); cur = ""; } } else { cur += ch; } } if (cur.length > 0) res.push(new TextEncoder().encode(cur)); return res; })(${a[0]}, ${a[1]})`,
168
- Clone: (a) =>
169
- `(${a[0]} ? (${a[0]}.slice ? ${a[0]}.slice() : Array.from(${a[0]})) : null)`,
170
- Cut: (a) =>
171
- `((b, sep) => { for (let i = 0; i <= b.length - sep.length; i++) if (sep.every((v, j) => b[i + j] === v)) return [b.slice(0, i), b.slice(i + sep.length), true]; return [b.slice(), new Uint8Array(0), false]; })(${a[0]}, ${a[1]})`,
172
- ContainsAny: (a) =>
173
- `((b, chars) => { const s = new TextDecoder().decode(new Uint8Array(b)); for (const c of chars) if (s.includes(c)) return true; return false; })(${a[0]}, ${a[1]})`,
174
- ContainsRune: (a) =>
175
- `((b, r) => { const s = new TextDecoder().decode(new Uint8Array(b)); return s.includes(String.fromCodePoint(r < 0 || r > 0x10ffff || (r >= 0xd800 && r <= 0xdfff) ? 0xfffd : r)); })(${a[0]}, ${a[1]})`,
176
- Map: (a) =>
177
- `((f, b) => { const s = new TextDecoder().decode(new Uint8Array(b)); let res = ""; for (const c of s) { const r = f(c.codePointAt(0)); if (r >= 0) res += String.fromCodePoint(r); } return new TextEncoder().encode(res); })(${a[0]}, ${a[1]})`,
178
- SplitN: (a) =>
179
- `((b, sep, n) => {
180
- if (n === 0) return null;
181
- if (sep.length === 0) {
182
- if (n < 0 || b.length <= n) {
183
- const r = [];
184
- for (let k = 0; k < b.length; k++) r.push(b.slice(k, k + 1));
185
- return r;
186
- }
187
- const r = [];
188
- for (let k = 0; k < n - 1; k++) r.push(b.slice(k, k + 1));
189
- r.push(b.slice(n - 1));
190
- return r;
191
- }
192
- const findNext = (start) => {
193
- for (let k = start; k <= b.length - sep.length; k++) {
194
- let match = true;
195
- for (let l = 0; l < sep.length; l++) {
196
- if (b[k + l] !== sep[l]) { match = false; break; }
197
- }
198
- if (match) return k;
199
- }
200
- return -1;
201
- };
202
- if (n < 0) {
203
- const r = [];
204
- let i = 0;
205
- while (i <= b.length) {
206
- const j = findNext(i);
207
- if (j < 0) break;
208
- r.push(b.slice(i, j));
209
- i = j + sep.length;
210
- }
211
- r.push(b.slice(i));
212
- return r;
213
- }
214
- const r = [];
215
- let i = 0;
216
- for (let c = 1; c < n; c++) {
217
- const j = findNext(i);
218
- if (j < 0) break;
219
- r.push(b.slice(i, j));
220
- i = j + sep.length;
221
- }
222
- r.push(b.slice(i));
223
- return r;
224
- })(${a[0]}, ${a[1]}, ${a[2]})`,
225
- NewBuffer: (a) => `({ _buf: Array.from(${a[0]} ?? []) })`,
226
- NewBufferString: (a) =>
227
- `({ _buf: Array.from(new TextEncoder().encode(${a[0]} ?? "")) })`,
228
- ToValidUTF8: (a) =>
229
- `((b, repl) => {
230
- if (!b) return new Uint8Array(0);
231
- repl = repl || new Uint8Array(0);
232
- const res = [];
233
- let i = 0;
234
- let inInvalid = false;
235
- while (i < b.length) {
236
- const b0 = b[i];
237
- let sz = 0;
238
- let valid = false;
239
- if (b0 < 0x80) {
240
- sz = 1;
241
- valid = true;
242
- } else if (b0 >= 0xC2 && b0 <= 0xDF) {
243
- if (i + 1 < b.length && (b[i+1] & 0xC0) === 0x80) {
244
- sz = 2;
245
- valid = true;
246
- }
247
- } else if (b0 >= 0xE0 && b0 <= 0xEF) {
248
- if (i + 2 < b.length && (b[i+1] & 0xC0) === 0x80 && (b[i+2] & 0xC0) === 0x80) {
249
- const r = ((b0 & 0x0F) << 12) | ((b[i+1] & 0x3F) << 6) | (b[i+2] & 0x3F);
250
- if (r >= 0x800 && (r < 0xD800 || r > 0xDFFF)) {
251
- sz = 3;
252
- valid = true;
253
- }
254
- }
255
- } else if (b0 >= 0xF0 && b0 <= 0xF4) {
256
- if (i + 3 < b.length && (b[i+1] & 0xC0) === 0x80 && (b[i+2] & 0xC0) === 0x80 && (b[i+3] & 0xC0) === 0x80) {
257
- const r = ((b0 & 0x07) << 18) | ((b[i+1] & 0x3F) << 12) | ((b[i+2] & 0x3F) << 6) | (b[i+3] & 0x3F);
258
- if (r >= 0x10000 && r <= 0x10FFFF) {
259
- sz = 4;
260
- valid = true;
261
- }
262
- }
263
- }
264
- if (valid) {
265
- if (inInvalid) {
266
- for (let k = 0; k < repl.length; k++) res.push(repl[k]);
267
- inInvalid = false;
268
- }
269
- for (let k = 0; k < sz; k++) res.push(b[i + k]);
270
- i += sz;
271
- } else {
272
- inInvalid = true;
273
- i += 1;
274
- }
275
- }
276
- if (inInvalid) {
277
- for (let k = 0; k < repl.length; k++) res.push(repl[k]);
278
- }
279
- return new Uint8Array(res);
280
- })(${a[0]}, ${a[1]})`,
281
- NewReader: (a) =>
282
- `((b) => ({
283
- _src: b,
284
- _pos: 0,
285
- _prevRune: -1,
286
- Read(p) {
287
- if (this._pos >= this._src.length) return [0, __io_eof];
288
- const n = Math.min(p.length, this._src.length - this._pos);
289
- for (let i = 0; i < n; i++) p[i] = this._src[this._pos + i];
290
- this._pos += n;
291
- this._prevRune = -1;
292
- return [n, null];
293
- },
294
- ReadAt(p, off) {
295
- const o = Number(off);
296
- if (o < 0) return [0, __error("bytes.Reader.ReadAt: negative offset")];
297
- if (o >= this._src.length) return [0, __io_eof];
298
- const n = Math.min(p.length, this._src.length - o);
299
- for (let i = 0; i < n; i++) p[i] = this._src[o + i];
300
- return [n, n < p.length ? __io_eof : null];
301
- },
302
- ReadByte() {
303
- if (this._pos >= this._src.length) return [0, __io_eof];
304
- this._prevRune = -1;
305
- return [this._src[this._pos++], null];
306
- },
307
- UnreadByte() {
308
- if (this._pos <= 0) return __error("bytes.Reader.UnreadByte: at beginning of slice");
309
- this._prevRune = -1;
310
- this._pos--;
311
- return null;
312
- },
313
- ReadRune() {
314
- if (this._pos >= this._src.length) return [0, 0, __io_eof];
315
- const rem = this._src.subarray ? this._src.subarray(this._pos) : new Uint8Array(this._src.slice(this._pos));
316
- const s = new TextDecoder().decode(rem);
317
- const cp = s.codePointAt(0);
318
- const runeStr = s.slice(0, cp > 0xffff ? 2 : 1);
319
- const sz = new TextEncoder().encode(runeStr).length;
320
- this._prevRune = this._pos;
321
- this._pos += sz;
322
- return [cp, sz, null];
323
- },
324
- UnreadRune() {
325
- if (this._prevRune === undefined || this._prevRune < 0 || this._prevRune >= this._pos) {
326
- return __error("bytes.Reader.UnreadRune: previous operation was not ReadRune");
327
- }
328
- this._pos = this._prevRune;
329
- this._prevRune = -1;
330
- return null;
331
- },
332
- Seek(offset, whence) {
333
- const off = BigInt(offset);
334
- const w = Number(whence);
335
- let newPos;
336
- if (w === 0) newPos = off;
337
- else if (w === 1) newPos = BigInt(this._pos) + off;
338
- else if (w === 2) newPos = BigInt(this._src.length) + off;
339
- else return [0n, __error("bytes.Reader.Seek: invalid whence")];
340
- if (newPos < 0n) return [0n, __error("bytes.Reader.Seek: negative position")];
341
- this._pos = Number(newPos);
342
- this._prevRune = -1;
343
- return [newPos, null];
344
- },
345
- Size() { return BigInt(this._src.length); },
346
- WriteTo(w) {
347
- if (this._pos >= this._src.length) return [0, null];
348
- const rem = this._src.subarray ? this._src.subarray(this._pos) : new Uint8Array(this._src.slice(this._pos));
349
- const [n, err] = w.Write(rem);
350
- this._pos += n;
351
- return [n, err];
352
- },
353
- Len() { return Math.max(0, this._src.length - this._pos); },
354
- Reset(b2) { this._src = b2; this._pos = 0; this._prevRune = -1; }
355
- }))(${a[0]})`,
356
- };
357
-
358
- /** @type {ThisType<CodeGen>} */
359
- export const bytesMethods = {
360
- _genBytes(fn, a) {
361
- if (fn === "NewReader") {
362
- this.useHelper("ioEOF");
363
- this.useHelper("error");
364
- }
365
- const gen = BYTES_DISPATCH[fn];
366
- return gen ? gen(a()) : undefined;
367
- },
368
- };
@@ -1,45 +0,0 @@
1
- // CodeGen for Go `errors` package.
2
-
3
- /** @typedef {import('../index.js').CodeGen} CodeGen */
4
-
5
- /** @type {ThisType<CodeGen>} */
6
- export const errorsMethods = {
7
- _genErrors(fn, a, expr) {
8
- const args = a();
9
- if (fn === "New") {
10
- this.useHelper("error");
11
- return `__error(${args[0]})`;
12
- }
13
- if (fn === "Is") {
14
- this.useHelper("errorIs");
15
- return `__errorIs(${args[0]}, ${args[1]})`;
16
- }
17
- if (fn === "Unwrap")
18
- return `((e) => typeof e?.Unwrap === "function" ? e.Unwrap() : (e?._cause ?? null))(${args[0]})`;
19
- if (fn === "As") {
20
- this.useHelper("errorAs");
21
- const targetGoType = expr?.args?.[1]?._type;
22
- const baseGoType = targetGoType?.base ?? targetGoType;
23
- const concreteGoType = baseGoType?.base ?? baseGoType;
24
- const typeName = concreteGoType?.name;
25
- if (concreteGoType?.kind === "interface" || typeName === "error") {
26
- return `__errorAs(${args[0]}, ${args[1]}, (x) => x !== null && (typeof x === "object" ? typeof x.Error === "function" : true))`;
27
- }
28
- // Named non-struct error types sit in interfaces as boxes; store the raw value.
29
- const namedBox = this._namedBoxInfo(concreteGoType);
30
- if (namedBox) {
31
- return `__errorAs(${args[0]}, ${args[1]}, (x) => x instanceof ${namedBox.cls}, (x) => x.__gfUnbox())`;
32
- }
33
- if (typeName) {
34
- return `__errorAs(${args[0]}, ${args[1]}, (x) => (typeof ${typeName} === "function" && x instanceof ${typeName}) || x?.constructor?.name === "${typeName}" || x?.__struct === "${typeName}")`;
35
- }
36
- return `__errorAs(${args[0]}, ${args[1]})`;
37
- }
38
- if (fn === "Join") {
39
- this.useHelper("error");
40
- this.useHelper("errorJoin");
41
- return `__errorJoin(${args.join(", ")})`;
42
- }
43
- return undefined;
44
- },
45
- };