gofront 1.8.0 → 1.9.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 (178) hide show
  1. package/README.md +3 -3
  2. package/package.json +6 -5
  3. package/src/backend/js/expressions.js +1157 -408
  4. package/src/backend/js/index.js +327 -153
  5. package/src/backend/js/natives.js +383 -0
  6. package/src/backend/js/runtime.js +559 -2552
  7. package/src/backend/js/statements.js +670 -158
  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 +298 -19
  11. package/src/backend/shared/fixed-float.js +20 -0
  12. package/src/backend/shared/fmt-types.js +91 -170
  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 +884 -256
  16. package/src/backend/wasm/emit-exprs.js +185 -77
  17. package/src/backend/wasm/emit-maps.js +17 -367
  18. package/src/backend/wasm/emit-shared.js +4 -1
  19. package/src/backend/wasm/emit-stmts.js +524 -240
  20. package/src/backend/wasm/emit.js +176 -38
  21. package/src/backend/wasm/globals.js +48 -8
  22. package/src/backend/wasm/glue.js +2 -4
  23. package/src/backend/wasm/index.js +44 -530
  24. package/src/backend/wasm/method-expr.js +12 -1
  25. package/src/backend/wasm/module-emitter.js +299 -770
  26. package/src/backend/wasm/monomorph.js +139 -8
  27. package/src/backend/wasm/natives.js +600 -0
  28. package/src/backend/wasm/prescan.js +5 -153
  29. package/src/backend/wasm/prune-funcs.js +89 -0
  30. package/src/backend/wasm/stdlib/index.js +2 -32
  31. package/src/backend/wasm/types.js +97 -20
  32. package/src/backend/wasm/variadic.js +9 -4
  33. package/src/cli/cli-core.js +5 -1
  34. package/src/cli/test-runner.js +115 -342
  35. package/src/compiler.js +113 -130
  36. package/src/lexer/lexer.js +106 -11
  37. package/src/lexer/templ-lexer.js +61 -18
  38. package/src/lexer/tokens.js +1 -0
  39. package/src/link/stdlib.js +355 -132
  40. package/src/link/type-names.js +204 -0
  41. package/src/link/wasm.js +30 -6
  42. package/src/lower/bounds.js +153 -0
  43. package/src/lower/captures.js +92 -33
  44. package/src/lower/embedding.js +62 -5
  45. package/src/lower/errors-as.js +196 -0
  46. package/src/lower/fmt-formatters.js +929 -0
  47. package/src/lower/functions.js +225 -7
  48. package/src/lower/gen-types.js +293 -0
  49. package/src/lower/index.js +14 -2
  50. package/src/lower/json-codecs.js +334 -245
  51. package/src/lower/ownership.js +25 -7
  52. package/src/lower/reachability.js +69 -51
  53. package/src/lower/walk.js +12 -0
  54. package/src/parser/declarations.js +30 -5
  55. package/src/parser/expressions.js +111 -57
  56. package/src/parser/statements.js +108 -0
  57. package/src/parser/templ.js +44 -5
  58. package/src/parser/types.js +12 -0
  59. package/src/resolver.js +1 -2
  60. package/src/typechecker/assignability.js +214 -19
  61. package/src/typechecker/const-fold.js +70 -27
  62. package/src/typechecker/constants.js +156 -8
  63. package/src/typechecker/expressions.js +490 -108
  64. package/src/typechecker/index.js +346 -42
  65. package/src/typechecker/init-order.js +136 -40
  66. package/src/typechecker/operand-text.js +41 -0
  67. package/src/typechecker/resolve.js +490 -65
  68. package/src/typechecker/statements.js +288 -27
  69. package/src/typechecker/stdlib/excluded.js +9 -5
  70. package/src/typechecker/stdlib/index.js +25 -9
  71. package/src/typechecker/termination.js +10 -1
  72. package/src/typechecker/types.js +287 -575
  73. package/stdlib/bytes/buffer.go +479 -0
  74. package/stdlib/bytes/bytes.go +1010 -0
  75. package/stdlib/bytes/reader.go +161 -0
  76. package/stdlib/context/context.go +115 -0
  77. package/stdlib/crypto/rand/rand.go +34 -0
  78. package/stdlib/crypto/sha256/sha256.go +249 -0
  79. package/stdlib/encoding/base64/base64.go +331 -0
  80. package/stdlib/encoding/binary/binary.go +332 -0
  81. package/stdlib/encoding/hex/hex.go +140 -0
  82. package/stdlib/encoding/json/json.go +62 -0
  83. package/stdlib/errors/errors.go +174 -0
  84. package/stdlib/fmt/errors.go +110 -0
  85. package/stdlib/fmt/format.go +732 -0
  86. package/stdlib/fmt/print.go +1232 -0
  87. package/stdlib/gom/gom.go +293 -0
  88. package/stdlib/html/html.go +251 -0
  89. package/stdlib/internal/fmtrt/fmtrt.go +163 -0
  90. package/stdlib/internal/jsonrt/dec.go +171 -38
  91. package/stdlib/internal/jsonrt/enc.go +186 -36
  92. package/stdlib/internal/jsonrt/scanner.go +17 -8
  93. package/stdlib/io/io.go +157 -1
  94. package/stdlib/maps/maps.go +131 -0
  95. package/stdlib/math/bits/bits.go +507 -0
  96. package/stdlib/math/extra.go +16 -14
  97. package/stdlib/math/math.go +439 -0
  98. package/stdlib/math/rand/rand.go +297 -0
  99. package/stdlib/os/os.go +93 -0
  100. package/stdlib/path/filepath/filepath.go +47 -0
  101. package/stdlib/path/path.go +394 -0
  102. package/stdlib/regexp/regexp.go +231 -0
  103. package/stdlib/slices/slices.go +526 -0
  104. package/stdlib/slices/sort.go +209 -0
  105. package/stdlib/slices/zsort_cmp.go +480 -0
  106. package/stdlib/slices/zsort_ordered.go +482 -0
  107. package/stdlib/sort/sort.go +391 -452
  108. package/stdlib/sort/zsort_func.go +480 -0
  109. package/stdlib/sort/zsort_iface.go +480 -0
  110. package/stdlib/strconv/float.go +1699 -0
  111. package/stdlib/strconv/isprint.go +752 -0
  112. package/stdlib/strconv/quote.go +235 -50
  113. package/stdlib/strconv/strconv.go +616 -0
  114. package/stdlib/strings/builder.go +95 -0
  115. package/stdlib/strings/reader.go +163 -0
  116. package/stdlib/strings/replacer.go +102 -0
  117. package/stdlib/strings/strings.go +807 -0
  118. package/stdlib/sync/sync.go +268 -0
  119. package/stdlib/testing/async_js.go +61 -0
  120. package/stdlib/testing/benchmark.go +297 -0
  121. package/stdlib/testing/testing.go +523 -0
  122. package/stdlib/time/duration.go +233 -0
  123. package/stdlib/time/format.go +745 -0
  124. package/stdlib/time/parse.go +790 -0
  125. package/stdlib/time/sleep_js.go +63 -0
  126. package/stdlib/time/time.go +834 -0
  127. package/stdlib/unicode/unicode.go +141 -3
  128. package/stdlib/unicode/utf8/utf8.go +464 -0
  129. package/src/backend/js/fmt-runtime.js +0 -573
  130. package/src/backend/js/stdlib/base64.js +0 -12
  131. package/src/backend/js/stdlib/binary.js +0 -102
  132. package/src/backend/js/stdlib/bits.js +0 -119
  133. package/src/backend/js/stdlib/builder.js +0 -98
  134. package/src/backend/js/stdlib/bytes.js +0 -368
  135. package/src/backend/js/stdlib/errors.js +0 -45
  136. package/src/backend/js/stdlib/fmt.js +0 -517
  137. package/src/backend/js/stdlib/gom.js +0 -155
  138. package/src/backend/js/stdlib/hex.js +0 -17
  139. package/src/backend/js/stdlib/html.js +0 -20
  140. package/src/backend/js/stdlib/io.js +0 -137
  141. package/src/backend/js/stdlib/json.js +0 -1167
  142. package/src/backend/js/stdlib/maps.js +0 -37
  143. package/src/backend/js/stdlib/math.js +0 -85
  144. package/src/backend/js/stdlib/os.js +0 -13
  145. package/src/backend/js/stdlib/path.js +0 -48
  146. package/src/backend/js/stdlib/rand.js +0 -32
  147. package/src/backend/js/stdlib/regexp.js +0 -54
  148. package/src/backend/js/stdlib/sha256.js +0 -12
  149. package/src/backend/js/stdlib/shared.js +0 -17
  150. package/src/backend/js/stdlib/simd.js +0 -34
  151. package/src/backend/js/stdlib/slices.js +0 -107
  152. package/src/backend/js/stdlib/sort.js +0 -30
  153. package/src/backend/js/stdlib/strconv.js +0 -79
  154. package/src/backend/js/stdlib/strings.js +0 -301
  155. package/src/backend/js/stdlib/sync.js +0 -13
  156. package/src/backend/js/stdlib/testing.js +0 -41
  157. package/src/backend/js/stdlib/time.js +0 -152
  158. package/src/backend/js/stdlib/unicode.js +0 -25
  159. package/src/backend/js/stdlib/utf8.js +0 -26
  160. package/src/backend/wasm/stdlib/bytes.js +0 -6716
  161. package/src/backend/wasm/stdlib/core.js +0 -10278
  162. package/src/backend/wasm/stdlib/io.js +0 -3578
  163. package/src/backend/wasm/stdlib/packages.js +0 -2402
  164. package/src/backend/wasm/stdlib/pure.js +0 -720
  165. package/src/backend/wasm/stdlib/time.js +0 -2229
  166. package/src/typechecker/stdlib/core.js +0 -1079
  167. package/src/typechecker/stdlib/extended.js +0 -1210
  168. package/stdlib/bytes/iter.go +0 -192
  169. package/stdlib/bytes/search.go +0 -240
  170. package/stdlib/bytes/split.go +0 -218
  171. package/stdlib/errors/overlay.go +0 -12
  172. package/stdlib/maps/iter.go +0 -65
  173. package/stdlib/slices/extra.go +0 -73
  174. package/stdlib/slices/iter.go +0 -113
  175. package/stdlib/strings/extra.go +0 -35
  176. package/stdlib/strings/iter.go +0 -122
  177. package/stdlib/sync/extra.go +0 -105
  178. 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
- };