gofront 0.0.6 → 0.0.8

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.
@@ -0,0 +1,1067 @@
1
+ // stdlib.js — built-in namespace and browser-global registration for the GoFront type
2
+ // checker. Called once from TypeChecker._setupGlobals() during construction.
3
+ //
4
+ // Exports a single function:
5
+ // setupGlobals(globals, types)
6
+ // globals — the root Scope instance (TypeChecker.globals)
7
+ // types — the named-type Map (TypeChecker.types)
8
+
9
+ import { ANY, BOOL, ERROR, FLOAT64, INT, STRING, VOID } from "./types.js";
10
+
11
+ // time.Time named type — used by the time package
12
+ const TIME_T = { kind: "named", name: "time.Time", underlying: ANY };
13
+
14
+ export function setupGlobals(globals, types) {
15
+ // Browser globals — typed as 'any' so any access/call is permitted
16
+ const browserGlobals = [
17
+ "console",
18
+ "document",
19
+ "window",
20
+ "navigator",
21
+ "location",
22
+ "history",
23
+ "screen",
24
+ "performance",
25
+ "crypto",
26
+ "indexedDB",
27
+ "fetch",
28
+ "setTimeout",
29
+ "setInterval",
30
+ "clearTimeout",
31
+ "clearInterval",
32
+ "requestAnimationFrame",
33
+ "cancelAnimationFrame",
34
+ "Math",
35
+ "JSON",
36
+ "Date",
37
+ "RegExp",
38
+ "Promise",
39
+ "Error",
40
+ "Symbol",
41
+ "String",
42
+ "Number",
43
+ "Boolean",
44
+ "Array",
45
+ "Object",
46
+ "parseInt",
47
+ "parseFloat",
48
+ "isNaN",
49
+ "isFinite",
50
+ "encodeURIComponent",
51
+ "decodeURIComponent",
52
+ "atob",
53
+ "btoa",
54
+ "alert",
55
+ "confirm",
56
+ "prompt",
57
+ "localStorage",
58
+ "sessionStorage",
59
+ "WebSocket",
60
+ "Worker",
61
+ "HTMLElement",
62
+ "Element",
63
+ "Event",
64
+ "CustomEvent",
65
+ "URL",
66
+ "URLSearchParams",
67
+ "FormData",
68
+ "Headers",
69
+ "Request",
70
+ "Response",
71
+ "Blob",
72
+ "File",
73
+ "FileReader",
74
+ "ArrayBuffer",
75
+ "Uint8Array",
76
+ "TextEncoder",
77
+ "TextDecoder",
78
+ "WebGLRenderingContext",
79
+ "WebGL2RenderingContext",
80
+ "GPUDevice",
81
+ "GPUAdapter",
82
+ ];
83
+ for (const g of browserGlobals) globals.define(g, ANY);
84
+
85
+ // fmt package — string formatting (variadic: format string + any args)
86
+ const fmtVariadic = (ret) => ({
87
+ kind: "func",
88
+ params: [STRING, ANY],
89
+ returns: [ret],
90
+ variadic: true,
91
+ });
92
+ globals.define("fmt", {
93
+ kind: "namespace",
94
+ name: "fmt",
95
+ members: {
96
+ Sprintf: fmtVariadic(STRING),
97
+ Errorf: fmtVariadic(ERROR),
98
+ Printf: fmtVariadic(VOID),
99
+ Println: fmtVariadic(VOID),
100
+ Print: fmtVariadic(VOID),
101
+ Fprintf: {
102
+ kind: "func",
103
+ params: [ANY, STRING],
104
+ returns: [INT, ERROR],
105
+ variadic: true,
106
+ },
107
+ Fprintln: {
108
+ kind: "func",
109
+ params: [ANY],
110
+ returns: [INT, ERROR],
111
+ variadic: true,
112
+ },
113
+ Fprint: {
114
+ kind: "func",
115
+ params: [ANY],
116
+ returns: [INT, ERROR],
117
+ variadic: true,
118
+ },
119
+ Sscan: {
120
+ kind: "func",
121
+ params: [STRING, ANY],
122
+ returns: [INT, ERROR],
123
+ variadic: true,
124
+ },
125
+ Sscanln: {
126
+ kind: "func",
127
+ params: [STRING, ANY],
128
+ returns: [INT, ERROR],
129
+ variadic: true,
130
+ },
131
+ Sscanf: {
132
+ kind: "func",
133
+ params: [STRING, STRING, ANY],
134
+ returns: [INT, ERROR],
135
+ variadic: true,
136
+ },
137
+ },
138
+ });
139
+
140
+ // strings package
141
+ const strFn1 = (ret) => ({
142
+ kind: "func",
143
+ params: [STRING],
144
+ returns: [ret],
145
+ });
146
+ const strFn2 = (p2, ret) => ({
147
+ kind: "func",
148
+ params: [STRING, p2],
149
+ returns: [ret],
150
+ });
151
+ const strFn3 = (p2, p3, ret) => ({
152
+ kind: "func",
153
+ params: [STRING, p2, p3],
154
+ returns: [ret],
155
+ });
156
+ globals.define("strings", {
157
+ kind: "namespace",
158
+ name: "strings",
159
+ members: {
160
+ Contains: strFn2(STRING, BOOL),
161
+ HasPrefix: strFn2(STRING, BOOL),
162
+ HasSuffix: strFn2(STRING, BOOL),
163
+ Index: strFn2(STRING, INT),
164
+ LastIndex: strFn2(STRING, INT),
165
+ Count: strFn2(STRING, INT),
166
+ Repeat: strFn2(INT, STRING),
167
+ Replace: {
168
+ kind: "func",
169
+ params: [STRING, STRING, STRING, INT],
170
+ returns: [STRING],
171
+ },
172
+ ReplaceAll: strFn3(STRING, STRING, STRING),
173
+ ToUpper: strFn1(STRING),
174
+ ToLower: strFn1(STRING),
175
+ TrimSpace: strFn1(STRING),
176
+ Trim: strFn2(STRING, STRING),
177
+ TrimPrefix: strFn2(STRING, STRING),
178
+ TrimSuffix: strFn2(STRING, STRING),
179
+ TrimLeft: strFn2(STRING, STRING),
180
+ TrimRight: strFn2(STRING, STRING),
181
+ Split: strFn2(STRING, { kind: "slice", elem: STRING }),
182
+ Join: {
183
+ kind: "func",
184
+ params: [{ kind: "slice", elem: STRING }, STRING],
185
+ returns: [STRING],
186
+ },
187
+ EqualFold: strFn2(STRING, BOOL),
188
+ Fields: strFn1({ kind: "slice", elem: STRING }),
189
+ Cut: {
190
+ kind: "func",
191
+ params: [STRING, STRING],
192
+ returns: [STRING, STRING, BOOL],
193
+ },
194
+ CutPrefix: {
195
+ kind: "func",
196
+ params: [STRING, STRING],
197
+ returns: [STRING, BOOL],
198
+ },
199
+ CutSuffix: {
200
+ kind: "func",
201
+ params: [STRING, STRING],
202
+ returns: [STRING, BOOL],
203
+ },
204
+ SplitN: strFn3(STRING, INT, { kind: "slice", elem: STRING }),
205
+ SplitAfter: strFn2(STRING, { kind: "slice", elem: STRING }),
206
+ SplitAfterN: strFn3(STRING, INT, { kind: "slice", elem: STRING }),
207
+ IndexAny: strFn2(STRING, INT),
208
+ LastIndexAny: strFn2(STRING, INT),
209
+ ContainsAny: strFn2(STRING, BOOL),
210
+ ContainsRune: strFn2(INT, BOOL),
211
+ IndexRune: strFn2(INT, INT),
212
+ IndexByte: strFn2(INT, INT),
213
+ LastIndexByte: strFn2(INT, INT),
214
+ Map: {
215
+ kind: "func",
216
+ params: [ANY, STRING],
217
+ returns: [STRING],
218
+ },
219
+ Title: strFn1(STRING),
220
+ ToTitle: strFn1(STRING),
221
+ TrimFunc: {
222
+ kind: "func",
223
+ params: [STRING, ANY],
224
+ returns: [STRING],
225
+ },
226
+ TrimLeftFunc: {
227
+ kind: "func",
228
+ params: [STRING, ANY],
229
+ returns: [STRING],
230
+ },
231
+ TrimRightFunc: {
232
+ kind: "func",
233
+ params: [STRING, ANY],
234
+ returns: [STRING],
235
+ },
236
+ IndexFunc: {
237
+ kind: "func",
238
+ params: [STRING, ANY],
239
+ returns: [INT],
240
+ },
241
+ LastIndexFunc: {
242
+ kind: "func",
243
+ params: [STRING, ANY],
244
+ returns: [INT],
245
+ },
246
+ NewReplacer: {
247
+ kind: "func",
248
+ params: [STRING],
249
+ returns: [ANY],
250
+ variadic: true,
251
+ },
252
+ NewReader: { kind: "func", params: [STRING], returns: [ANY] },
253
+ },
254
+ });
255
+
256
+ // bytes package — operates on []byte (JS arrays of numbers)
257
+ const BYTE_SLICE = { kind: "slice", elem: INT };
258
+ const byFn1 = (ret) => ({
259
+ kind: "func",
260
+ params: [BYTE_SLICE],
261
+ returns: [ret],
262
+ });
263
+ const byFn2 = (p2, ret) => ({
264
+ kind: "func",
265
+ params: [BYTE_SLICE, p2],
266
+ returns: [ret],
267
+ });
268
+ globals.define("bytes", {
269
+ kind: "namespace",
270
+ name: "bytes",
271
+ members: {
272
+ Contains: byFn2(BYTE_SLICE, BOOL),
273
+ HasPrefix: byFn2(BYTE_SLICE, BOOL),
274
+ HasSuffix: byFn2(BYTE_SLICE, BOOL),
275
+ Index: byFn2(BYTE_SLICE, INT),
276
+ Count: byFn2(BYTE_SLICE, INT),
277
+ Repeat: byFn2(INT, BYTE_SLICE),
278
+ Replace: {
279
+ kind: "func",
280
+ params: [BYTE_SLICE, BYTE_SLICE, BYTE_SLICE, INT],
281
+ returns: [BYTE_SLICE],
282
+ },
283
+ ToUpper: byFn1(BYTE_SLICE),
284
+ ToLower: byFn1(BYTE_SLICE),
285
+ TrimSpace: byFn1(BYTE_SLICE),
286
+ Trim: byFn2(STRING, BYTE_SLICE),
287
+ Equal: byFn2(BYTE_SLICE, BOOL),
288
+ Split: byFn2(BYTE_SLICE, { kind: "slice", elem: BYTE_SLICE }),
289
+ Join: {
290
+ kind: "func",
291
+ params: [{ kind: "slice", elem: BYTE_SLICE }, BYTE_SLICE],
292
+ returns: [BYTE_SLICE],
293
+ },
294
+ ReplaceAll: {
295
+ kind: "func",
296
+ params: [BYTE_SLICE, BYTE_SLICE, BYTE_SLICE],
297
+ returns: [BYTE_SLICE],
298
+ },
299
+ TrimPrefix: byFn2(BYTE_SLICE, BYTE_SLICE),
300
+ TrimSuffix: byFn2(BYTE_SLICE, BYTE_SLICE),
301
+ TrimLeft: byFn2(STRING, BYTE_SLICE),
302
+ TrimRight: byFn2(STRING, BYTE_SLICE),
303
+ TrimFunc: {
304
+ kind: "func",
305
+ params: [BYTE_SLICE, ANY],
306
+ returns: [BYTE_SLICE],
307
+ },
308
+ IndexByte: byFn2(INT, INT),
309
+ LastIndex: byFn2(BYTE_SLICE, INT),
310
+ LastIndexByte: byFn2(INT, INT),
311
+ Fields: byFn1({ kind: "slice", elem: BYTE_SLICE }),
312
+ Cut: {
313
+ kind: "func",
314
+ params: [BYTE_SLICE, BYTE_SLICE],
315
+ returns: [BYTE_SLICE, BYTE_SLICE, BOOL],
316
+ },
317
+ ContainsAny: byFn2(STRING, BOOL),
318
+ ContainsRune: byFn2(INT, BOOL),
319
+ Map: {
320
+ kind: "func",
321
+ params: [ANY, BYTE_SLICE],
322
+ returns: [BYTE_SLICE],
323
+ },
324
+ SplitN: {
325
+ kind: "func",
326
+ params: [BYTE_SLICE, BYTE_SLICE, INT],
327
+ returns: [{ kind: "slice", elem: BYTE_SLICE }],
328
+ },
329
+ NewReader: {
330
+ kind: "func",
331
+ params: [BYTE_SLICE],
332
+ returns: [ANY],
333
+ },
334
+ },
335
+ });
336
+
337
+ // strconv package
338
+ globals.define("strconv", {
339
+ kind: "namespace",
340
+ name: "strconv",
341
+ members: {
342
+ Itoa: { kind: "func", params: [INT], returns: [STRING] },
343
+ Atoi: {
344
+ kind: "func",
345
+ params: [STRING],
346
+ returns: [INT, ERROR],
347
+ },
348
+ FormatFloat: {
349
+ kind: "func",
350
+ params: [FLOAT64, INT, INT, INT],
351
+ returns: [STRING],
352
+ },
353
+ FormatBool: { kind: "func", params: [BOOL], returns: [STRING] },
354
+ FormatInt: { kind: "func", params: [INT, INT], returns: [STRING] },
355
+ ParseFloat: {
356
+ kind: "func",
357
+ params: [STRING, INT],
358
+ returns: [FLOAT64, ERROR],
359
+ },
360
+ ParseInt: {
361
+ kind: "func",
362
+ params: [STRING, INT, INT],
363
+ returns: [INT, ERROR],
364
+ },
365
+ ParseBool: {
366
+ kind: "func",
367
+ params: [STRING],
368
+ returns: [BOOL, ERROR],
369
+ },
370
+ Quote: { kind: "func", params: [STRING], returns: [STRING] },
371
+ Unquote: {
372
+ kind: "func",
373
+ params: [STRING],
374
+ returns: [STRING, ERROR],
375
+ },
376
+ AppendInt: {
377
+ kind: "func",
378
+ params: [{ kind: "slice", elem: INT }, INT, INT],
379
+ returns: [{ kind: "slice", elem: INT }],
380
+ },
381
+ AppendFloat: {
382
+ kind: "func",
383
+ params: [{ kind: "slice", elem: INT }, FLOAT64, INT, INT, INT],
384
+ returns: [{ kind: "slice", elem: INT }],
385
+ },
386
+ },
387
+ });
388
+
389
+ // sort package
390
+ globals.define("sort", {
391
+ kind: "namespace",
392
+ name: "sort",
393
+ members: {
394
+ Ints: {
395
+ kind: "func",
396
+ params: [{ kind: "slice", elem: INT }],
397
+ returns: [VOID],
398
+ },
399
+ Float64s: {
400
+ kind: "func",
401
+ params: [{ kind: "slice", elem: FLOAT64 }],
402
+ returns: [VOID],
403
+ },
404
+ Strings: {
405
+ kind: "func",
406
+ params: [{ kind: "slice", elem: STRING }],
407
+ returns: [VOID],
408
+ },
409
+ Slice: {
410
+ kind: "func",
411
+ params: [ANY, ANY],
412
+ returns: [VOID],
413
+ },
414
+ SliceStable: {
415
+ kind: "func",
416
+ params: [ANY, ANY],
417
+ returns: [VOID],
418
+ },
419
+ SliceIsSorted: {
420
+ kind: "func",
421
+ params: [ANY, ANY],
422
+ returns: [BOOL],
423
+ },
424
+ Search: {
425
+ kind: "func",
426
+ params: [INT, ANY],
427
+ returns: [INT],
428
+ },
429
+ IntsAreSorted: {
430
+ kind: "func",
431
+ params: [{ kind: "slice", elem: INT }],
432
+ returns: [BOOL],
433
+ },
434
+ Float64sAreSorted: {
435
+ kind: "func",
436
+ params: [{ kind: "slice", elem: FLOAT64 }],
437
+ returns: [BOOL],
438
+ },
439
+ StringsAreSorted: {
440
+ kind: "func",
441
+ params: [{ kind: "slice", elem: STRING }],
442
+ returns: [BOOL],
443
+ },
444
+ },
445
+ });
446
+
447
+ // math package
448
+ globals.define("math", {
449
+ kind: "namespace",
450
+ name: "math",
451
+ members: {
452
+ Abs: { kind: "func", params: [FLOAT64], returns: [FLOAT64] },
453
+ Floor: { kind: "func", params: [FLOAT64], returns: [FLOAT64] },
454
+ Ceil: { kind: "func", params: [FLOAT64], returns: [FLOAT64] },
455
+ Round: { kind: "func", params: [FLOAT64], returns: [FLOAT64] },
456
+ Sqrt: { kind: "func", params: [FLOAT64], returns: [FLOAT64] },
457
+ Cbrt: { kind: "func", params: [FLOAT64], returns: [FLOAT64] },
458
+ Pow: {
459
+ kind: "func",
460
+ params: [FLOAT64, FLOAT64],
461
+ returns: [FLOAT64],
462
+ },
463
+ Log: { kind: "func", params: [FLOAT64], returns: [FLOAT64] },
464
+ Log2: { kind: "func", params: [FLOAT64], returns: [FLOAT64] },
465
+ Log10: { kind: "func", params: [FLOAT64], returns: [FLOAT64] },
466
+ Sin: { kind: "func", params: [FLOAT64], returns: [FLOAT64] },
467
+ Cos: { kind: "func", params: [FLOAT64], returns: [FLOAT64] },
468
+ Tan: { kind: "func", params: [FLOAT64], returns: [FLOAT64] },
469
+ Min: {
470
+ kind: "func",
471
+ params: [FLOAT64, FLOAT64],
472
+ returns: [FLOAT64],
473
+ },
474
+ Max: {
475
+ kind: "func",
476
+ params: [FLOAT64, FLOAT64],
477
+ returns: [FLOAT64],
478
+ },
479
+ Mod: {
480
+ kind: "func",
481
+ params: [FLOAT64, FLOAT64],
482
+ returns: [FLOAT64],
483
+ },
484
+ Inf: { kind: "func", params: [INT], returns: [FLOAT64] },
485
+ IsNaN: { kind: "func", params: [FLOAT64], returns: [BOOL] },
486
+ IsInf: {
487
+ kind: "func",
488
+ params: [FLOAT64, INT],
489
+ returns: [BOOL],
490
+ },
491
+ NaN: { kind: "func", params: [], returns: [FLOAT64] },
492
+ Atan: { kind: "func", params: [FLOAT64], returns: [FLOAT64] },
493
+ Atan2: { kind: "func", params: [FLOAT64, FLOAT64], returns: [FLOAT64] },
494
+ Asin: { kind: "func", params: [FLOAT64], returns: [FLOAT64] },
495
+ Acos: { kind: "func", params: [FLOAT64], returns: [FLOAT64] },
496
+ Exp: { kind: "func", params: [FLOAT64], returns: [FLOAT64] },
497
+ Exp2: { kind: "func", params: [FLOAT64], returns: [FLOAT64] },
498
+ Trunc: { kind: "func", params: [FLOAT64], returns: [FLOAT64] },
499
+ Hypot: { kind: "func", params: [FLOAT64, FLOAT64], returns: [FLOAT64] },
500
+ Signbit: { kind: "func", params: [FLOAT64], returns: [BOOL] },
501
+ Copysign: {
502
+ kind: "func",
503
+ params: [FLOAT64, FLOAT64],
504
+ returns: [FLOAT64],
505
+ },
506
+ Dim: { kind: "func", params: [FLOAT64, FLOAT64], returns: [FLOAT64] },
507
+ Remainder: {
508
+ kind: "func",
509
+ params: [FLOAT64, FLOAT64],
510
+ returns: [FLOAT64],
511
+ },
512
+ // Constants
513
+ Pi: FLOAT64,
514
+ E: FLOAT64,
515
+ MaxFloat64: FLOAT64,
516
+ SmallestNonzeroFloat64: FLOAT64,
517
+ MaxInt: INT,
518
+ MinInt: INT,
519
+ },
520
+ });
521
+
522
+ // errors package
523
+ globals.define("errors", {
524
+ kind: "namespace",
525
+ name: "errors",
526
+ members: {
527
+ New: { kind: "func", params: [STRING], returns: [ERROR] },
528
+ Is: { kind: "func", params: [ERROR, ERROR], returns: [BOOL] },
529
+ Unwrap: { kind: "func", params: [ERROR], returns: [ERROR] },
530
+ },
531
+ });
532
+
533
+ // time package (partial — JS-friendly subset)
534
+ globals.define("time", {
535
+ kind: "namespace",
536
+ name: "time",
537
+ members: {
538
+ Now: { kind: "func", params: [], returns: [TIME_T] },
539
+ Since: { kind: "func", params: [TIME_T], returns: [INT] },
540
+ Sleep: { kind: "func", params: [ANY], returns: [VOID], async: true },
541
+ Parse: {
542
+ kind: "func",
543
+ params: [STRING, STRING],
544
+ returns: [TIME_T, ERROR],
545
+ },
546
+ Unix: { kind: "func", params: [INT, INT], returns: [TIME_T] },
547
+ Date: {
548
+ kind: "func",
549
+ params: [INT, INT, INT, INT, INT, INT, INT, ANY],
550
+ returns: [TIME_T],
551
+ },
552
+ Millisecond: INT,
553
+ Second: INT,
554
+ Minute: INT,
555
+ Hour: INT,
556
+ // Layout constants
557
+ RFC3339: STRING,
558
+ RFC3339Nano: STRING,
559
+ DateOnly: STRING,
560
+ TimeOnly: STRING,
561
+ DateTime: STRING,
562
+ // Location constants
563
+ UTC: ANY,
564
+ Local: ANY,
565
+ // Month constants
566
+ January: INT,
567
+ February: INT,
568
+ March: INT,
569
+ April: INT,
570
+ May: INT,
571
+ June: INT,
572
+ July: INT,
573
+ August: INT,
574
+ September: INT,
575
+ October: INT,
576
+ November: INT,
577
+ December: INT,
578
+ // Weekday constants
579
+ Sunday: INT,
580
+ Monday: INT,
581
+ Tuesday: INT,
582
+ Wednesday: INT,
583
+ Thursday: INT,
584
+ Friday: INT,
585
+ Saturday: INT,
586
+ },
587
+ });
588
+ types.set("time.Time", TIME_T);
589
+
590
+ // unicode package
591
+ const runeToStr = { kind: "func", params: [INT], returns: [BOOL] };
592
+ const runeTrans = { kind: "func", params: [INT], returns: [INT] };
593
+ globals.define("unicode", {
594
+ kind: "namespace",
595
+ name: "unicode",
596
+ members: {
597
+ IsLetter: runeToStr,
598
+ IsDigit: runeToStr,
599
+ IsSpace: runeToStr,
600
+ IsUpper: runeToStr,
601
+ IsLower: runeToStr,
602
+ IsPunct: runeToStr,
603
+ IsControl: runeToStr,
604
+ IsPrint: runeToStr,
605
+ IsGraphic: runeToStr,
606
+ ToUpper: runeTrans,
607
+ ToLower: runeTrans,
608
+ },
609
+ });
610
+
611
+ // os package (JS-friendly subset)
612
+ globals.define("os", {
613
+ kind: "namespace",
614
+ name: "os",
615
+ members: {
616
+ Exit: { kind: "func", params: [INT], returns: [VOID] },
617
+ Args: { kind: "slice", elem: STRING },
618
+ Getenv: { kind: "func", params: [STRING], returns: [STRING] },
619
+ Stdout: ANY,
620
+ Stderr: ANY,
621
+ Stdin: ANY,
622
+ },
623
+ });
624
+
625
+ // slices package (Go 1.21)
626
+ // Functions are generic — use ANY for slice params so any concrete slice type
627
+ // is accepted without an assignability error (same pattern as sort.Slice).
628
+ globals.define("slices", {
629
+ kind: "namespace",
630
+ name: "slices",
631
+ members: {
632
+ Contains: { kind: "func", params: [ANY, ANY], returns: [BOOL] },
633
+ Index: { kind: "func", params: [ANY, ANY], returns: [INT] },
634
+ Equal: { kind: "func", params: [ANY, ANY], returns: [BOOL] },
635
+ Compare: { kind: "func", params: [ANY, ANY], returns: [INT] },
636
+ Sort: { kind: "func", params: [ANY], returns: [VOID] },
637
+ SortFunc: { kind: "func", params: [ANY, ANY], returns: [VOID] },
638
+ SortStableFunc: { kind: "func", params: [ANY, ANY], returns: [VOID] },
639
+ IsSorted: { kind: "func", params: [ANY], returns: [BOOL] },
640
+ IsSortedFunc: { kind: "func", params: [ANY, ANY], returns: [BOOL] },
641
+ Reverse: { kind: "func", params: [ANY], returns: [VOID] },
642
+ Max: { kind: "func", params: [ANY], returns: [ANY] },
643
+ Min: { kind: "func", params: [ANY], returns: [ANY] },
644
+ MaxFunc: { kind: "func", params: [ANY, ANY], returns: [ANY] },
645
+ MinFunc: { kind: "func", params: [ANY, ANY], returns: [ANY] },
646
+ Clone: { kind: "func", params: [ANY], returns: [ANY] },
647
+ Compact: { kind: "func", params: [ANY], returns: [ANY] },
648
+ CompactFunc: { kind: "func", params: [ANY, ANY], returns: [ANY] },
649
+ Concat: { kind: "func", params: [ANY], returns: [ANY], variadic: true },
650
+ Delete: { kind: "func", params: [ANY, INT, INT], returns: [ANY] },
651
+ DeleteFunc: { kind: "func", params: [ANY, ANY], returns: [ANY] },
652
+ Insert: {
653
+ kind: "func",
654
+ params: [ANY, INT, ANY],
655
+ returns: [ANY],
656
+ variadic: true,
657
+ },
658
+ Replace: {
659
+ kind: "func",
660
+ params: [ANY, INT, INT, ANY],
661
+ returns: [ANY],
662
+ variadic: true,
663
+ },
664
+ Grow: { kind: "func", params: [ANY, INT], returns: [ANY] },
665
+ Clip: { kind: "func", params: [ANY], returns: [ANY] },
666
+ },
667
+ });
668
+
669
+ // html package
670
+ globals.define("html", {
671
+ kind: "namespace",
672
+ name: "html",
673
+ members: {
674
+ EscapeString: { kind: "func", params: [STRING], returns: [STRING] },
675
+ UnescapeString: { kind: "func", params: [STRING], returns: [STRING] },
676
+ },
677
+ });
678
+
679
+ // io package — Writer interface + WriteString
680
+ // io.Writer is typed as ANY so GoFront's built-in writer types (strings.Builder,
681
+ // bytes.Buffer) are accepted without explicit interface-satisfaction registration.
682
+ const BYTE_SLICE_IO = { kind: "slice", elem: INT };
683
+ globals.define("io", {
684
+ kind: "namespace",
685
+ name: "io",
686
+ members: {
687
+ Writer: ANY,
688
+ Reader: ANY,
689
+ EOF: ERROR,
690
+ WriteString: {
691
+ kind: "func",
692
+ params: [ANY, STRING],
693
+ returns: [INT, ERROR],
694
+ },
695
+ ReadAll: {
696
+ kind: "func",
697
+ params: [ANY],
698
+ returns: [BYTE_SLICE_IO, ERROR],
699
+ },
700
+ Discard: ANY,
701
+ },
702
+ });
703
+ // Register io.Writer as a type alias so it resolves in parameter/field annotations.
704
+ types.set("io.Writer", ANY);
705
+ types.set("io.Reader", ANY);
706
+
707
+ // gom package — browser-native component built-in
708
+ const GOM_NODE_T = {
709
+ kind: "interface",
710
+ methods: new Map([
711
+ ["Mount", { kind: "func", params: [ANY], returns: [VOID] }],
712
+ ]),
713
+ };
714
+ const GOM_NODE_FUNC_T = {
715
+ kind: "named",
716
+ name: "gom.NodeFunc",
717
+ underlying: { kind: "func", params: [ANY], returns: [VOID] },
718
+ };
719
+ const GOM_GROUP_T = {
720
+ kind: "named",
721
+ name: "gom.Group",
722
+ underlying: { kind: "slice", elem: GOM_NODE_T },
723
+ };
724
+ const gomEl = {
725
+ kind: "func",
726
+ params: [GOM_NODE_T],
727
+ returns: [GOM_NODE_T],
728
+ variadic: true,
729
+ };
730
+ const gomAttr1 = { kind: "func", params: [STRING], returns: [GOM_NODE_T] };
731
+ const gomBoolAttr = { kind: "func", params: [], returns: [GOM_NODE_T] };
732
+ globals.define("gom", {
733
+ kind: "namespace",
734
+ name: "gom",
735
+ members: {
736
+ // Core types
737
+ Node: GOM_NODE_T,
738
+ NodeFunc: GOM_NODE_FUNC_T,
739
+ Group: GOM_GROUP_T,
740
+ // Core functions
741
+ El: {
742
+ kind: "func",
743
+ params: [STRING, GOM_NODE_T],
744
+ returns: [GOM_NODE_T],
745
+ variadic: true,
746
+ },
747
+ Text: { kind: "func", params: [STRING], returns: [GOM_NODE_T] },
748
+ Attr: { kind: "func", params: [STRING, STRING], returns: [GOM_NODE_T] },
749
+ Class: gomAttr1,
750
+ Type: gomAttr1,
751
+ Href: gomAttr1,
752
+ Src: gomAttr1,
753
+ Placeholder: gomAttr1,
754
+ DataAttr: {
755
+ kind: "func",
756
+ params: [STRING, STRING],
757
+ returns: [GOM_NODE_T],
758
+ },
759
+ If: { kind: "func", params: [BOOL, GOM_NODE_T], returns: [GOM_NODE_T] },
760
+ Map: { kind: "func", params: [ANY, ANY], returns: [GOM_NODE_T] },
761
+ Style: gomAttr1,
762
+ Mount: { kind: "func", params: [STRING, GOM_NODE_T], returns: [VOID] },
763
+ MountTo: {
764
+ kind: "func",
765
+ params: [STRING, GOM_NODE_T],
766
+ returns: [VOID],
767
+ },
768
+ // Block elements
769
+ Div: gomEl,
770
+ Section: gomEl,
771
+ Article: gomEl,
772
+ Aside: gomEl,
773
+ Header: gomEl,
774
+ Footer: gomEl,
775
+ Main: gomEl,
776
+ Nav: gomEl,
777
+ Figure: gomEl,
778
+ // Headings
779
+ H1: gomEl,
780
+ H2: gomEl,
781
+ H3: gomEl,
782
+ H4: gomEl,
783
+ H5: gomEl,
784
+ H6: gomEl,
785
+ // Inline elements
786
+ Span: gomEl,
787
+ A: gomEl,
788
+ Strong: gomEl,
789
+ Em: gomEl,
790
+ Code: gomEl,
791
+ Pre: gomEl,
792
+ Small: gomEl,
793
+ Mark: gomEl,
794
+ // Text-level
795
+ P: gomEl,
796
+ Br: gomEl,
797
+ Hr: gomEl,
798
+ // Lists
799
+ Ul: gomEl,
800
+ Ol: gomEl,
801
+ Li: gomEl,
802
+ Dl: gomEl,
803
+ Dt: gomEl,
804
+ Dd: gomEl,
805
+ // Forms
806
+ Form: gomEl,
807
+ Input: gomEl,
808
+ Button: gomEl,
809
+ Textarea: gomEl,
810
+ Select: gomEl,
811
+ Option: gomEl,
812
+ Label: gomEl,
813
+ Fieldset: gomEl,
814
+ Legend: gomEl,
815
+ // Media / table
816
+ Img: gomEl,
817
+ Video: gomEl,
818
+ Audio: gomEl,
819
+ Canvas: gomEl,
820
+ Table: gomEl,
821
+ Thead: gomEl,
822
+ Tbody: gomEl,
823
+ Tfoot: gomEl,
824
+ Tr: gomEl,
825
+ Th: gomEl,
826
+ Td: gomEl,
827
+ // Attribute helpers
828
+ For: gomAttr1,
829
+ Name: gomAttr1,
830
+ Value: gomAttr1,
831
+ Target: gomAttr1,
832
+ Rel: gomAttr1,
833
+ Alt: gomAttr1,
834
+ Title: gomAttr1,
835
+ Lang: gomAttr1,
836
+ Action: gomAttr1,
837
+ Method: gomAttr1,
838
+ AutoComplete: gomAttr1,
839
+ Draggable: gomAttr1,
840
+ Role: gomAttr1,
841
+ AriaLabel: gomAttr1,
842
+ StyleAttr: gomAttr1,
843
+ // Boolean attribute helpers
844
+ Disabled: gomBoolAttr,
845
+ Checked: gomBoolAttr,
846
+ Selected: gomBoolAttr,
847
+ Readonly: gomBoolAttr,
848
+ },
849
+ });
850
+ types.set("gom.Node", GOM_NODE_T);
851
+ types.set("gom.NodeFunc", GOM_NODE_FUNC_T);
852
+ types.set("gom.Group", GOM_GROUP_T);
853
+
854
+ // maps package (Go 1.21)
855
+ globals.define("maps", {
856
+ kind: "namespace",
857
+ name: "maps",
858
+ members: {
859
+ Keys: { kind: "func", params: [ANY], returns: [ANY] },
860
+ Values: { kind: "func", params: [ANY], returns: [ANY] },
861
+ Clone: { kind: "func", params: [ANY], returns: [ANY] },
862
+ Copy: { kind: "func", params: [ANY, ANY], returns: [VOID] },
863
+ Equal: { kind: "func", params: [ANY, ANY], returns: [BOOL] },
864
+ EqualFunc: { kind: "func", params: [ANY, ANY, ANY], returns: [BOOL] },
865
+ Delete: { kind: "func", params: [ANY, ANY], returns: [VOID] },
866
+ DeleteFunc: { kind: "func", params: [ANY, ANY], returns: [VOID] },
867
+ },
868
+ });
869
+
870
+ // regexp package
871
+ const REGEXP_T = {
872
+ kind: "named",
873
+ name: "regexp.Regexp",
874
+ underlying: { kind: "struct", fields: new Map(), methods: new Map() },
875
+ };
876
+ const REGEXP_PTR = { kind: "pointer", base: REGEXP_T };
877
+ const STR_SLICE = { kind: "slice", elem: STRING };
878
+ const INT_SLICE = { kind: "slice", elem: INT };
879
+ const regexpMethods = new Map([
880
+ ["MatchString", { kind: "func", params: [STRING], returns: [BOOL] }],
881
+ ["FindString", { kind: "func", params: [STRING], returns: [STRING] }],
882
+ [
883
+ "FindStringIndex",
884
+ { kind: "func", params: [STRING], returns: [INT_SLICE] },
885
+ ],
886
+ [
887
+ "FindAllString",
888
+ { kind: "func", params: [STRING, INT], returns: [STR_SLICE] },
889
+ ],
890
+ [
891
+ "FindStringSubmatch",
892
+ { kind: "func", params: [STRING], returns: [STR_SLICE] },
893
+ ],
894
+ [
895
+ "FindAllStringSubmatch",
896
+ {
897
+ kind: "func",
898
+ params: [STRING, INT],
899
+ returns: [{ kind: "slice", elem: STR_SLICE }],
900
+ },
901
+ ],
902
+ [
903
+ "ReplaceAllString",
904
+ { kind: "func", params: [STRING, STRING], returns: [STRING] },
905
+ ],
906
+ [
907
+ "ReplaceAllLiteralString",
908
+ { kind: "func", params: [STRING, STRING], returns: [STRING] },
909
+ ],
910
+ ["Split", { kind: "func", params: [STRING, INT], returns: [STR_SLICE] }],
911
+ ["String", { kind: "func", params: [], returns: [STRING] }],
912
+ ]);
913
+ REGEXP_T.underlying.methods = regexpMethods;
914
+ types.set("regexp.Regexp", REGEXP_T);
915
+ globals.define("regexp", {
916
+ kind: "namespace",
917
+ name: "regexp",
918
+ members: {
919
+ MustCompile: { kind: "func", params: [STRING], returns: [REGEXP_PTR] },
920
+ Compile: {
921
+ kind: "func",
922
+ params: [STRING],
923
+ returns: [REGEXP_PTR, ERROR],
924
+ },
925
+ MatchString: {
926
+ kind: "func",
927
+ params: [STRING, STRING],
928
+ returns: [BOOL, ERROR],
929
+ },
930
+ QuoteMeta: { kind: "func", params: [STRING], returns: [STRING] },
931
+ },
932
+ });
933
+
934
+ // strings.Builder
935
+ const BYTE_SLICE_T = { kind: "slice", elem: INT };
936
+ const strBuilderMethods = new Map([
937
+ ["WriteString", { kind: "func", params: [STRING], returns: [INT, ERROR] }],
938
+ ["WriteByte", { kind: "func", params: [INT], returns: [ERROR] }],
939
+ ["WriteRune", { kind: "func", params: [INT], returns: [INT, ERROR] }],
940
+ ["Write", { kind: "func", params: [BYTE_SLICE_T], returns: [INT, ERROR] }],
941
+ ["String", { kind: "func", params: [], returns: [STRING] }],
942
+ ["Len", { kind: "func", params: [], returns: [INT] }],
943
+ ["Reset", { kind: "func", params: [], returns: [VOID] }],
944
+ ["Grow", { kind: "func", params: [INT], returns: [VOID] }],
945
+ ]);
946
+ types.set("strings.Builder", {
947
+ kind: "named",
948
+ name: "strings.Builder",
949
+ underlying: {
950
+ kind: "struct",
951
+ fields: new Map(),
952
+ methods: strBuilderMethods,
953
+ },
954
+ });
955
+
956
+ // bytes.Buffer
957
+ const bytesBufferMethods = new Map([
958
+ ["WriteString", { kind: "func", params: [STRING], returns: [INT, ERROR] }],
959
+ ["WriteByte", { kind: "func", params: [INT], returns: [ERROR] }],
960
+ ["Write", { kind: "func", params: [BYTE_SLICE_T], returns: [INT, ERROR] }],
961
+ ["String", { kind: "func", params: [], returns: [STRING] }],
962
+ ["Bytes", { kind: "func", params: [], returns: [BYTE_SLICE_T] }],
963
+ ["Len", { kind: "func", params: [], returns: [INT] }],
964
+ ["Reset", { kind: "func", params: [], returns: [VOID] }],
965
+ ["Grow", { kind: "func", params: [INT], returns: [VOID] }],
966
+ ]);
967
+ types.set("bytes.Buffer", {
968
+ kind: "named",
969
+ name: "bytes.Buffer",
970
+ underlying: {
971
+ kind: "struct",
972
+ fields: new Map(),
973
+ methods: bytesBufferMethods,
974
+ },
975
+ });
976
+
977
+ // math/rand package — import "math/rand" → local name "rand"
978
+ globals.define("rand", {
979
+ kind: "namespace",
980
+ name: "rand",
981
+ members: {
982
+ Intn: { kind: "func", params: [INT], returns: [INT] },
983
+ Float64: { kind: "func", params: [], returns: [FLOAT64] },
984
+ Float32: { kind: "func", params: [], returns: [FLOAT64] },
985
+ Int: { kind: "func", params: [], returns: [INT] },
986
+ Int63: { kind: "func", params: [], returns: [INT] },
987
+ Int63n: { kind: "func", params: [INT], returns: [INT] },
988
+ Int31: { kind: "func", params: [], returns: [INT] },
989
+ Int31n: { kind: "func", params: [INT], returns: [INT] },
990
+ Seed: { kind: "func", params: [INT], returns: [VOID] },
991
+ Shuffle: { kind: "func", params: [INT, ANY], returns: [VOID] },
992
+ Perm: {
993
+ kind: "func",
994
+ params: [INT],
995
+ returns: [{ kind: "slice", elem: INT }],
996
+ },
997
+ },
998
+ });
999
+
1000
+ // unicode/utf8 package — import "unicode/utf8" → local name "utf8"
1001
+ globals.define("utf8", {
1002
+ kind: "namespace",
1003
+ name: "utf8",
1004
+ members: {
1005
+ RuneCountInString: { kind: "func", params: [STRING], returns: [INT] },
1006
+ RuneLen: { kind: "func", params: [INT], returns: [INT] },
1007
+ ValidString: { kind: "func", params: [STRING], returns: [BOOL] },
1008
+ ValidRune: { kind: "func", params: [INT], returns: [BOOL] },
1009
+ DecodeRuneInString: {
1010
+ kind: "func",
1011
+ params: [STRING],
1012
+ returns: [INT, INT],
1013
+ },
1014
+ DecodeLastRuneInString: {
1015
+ kind: "func",
1016
+ params: [STRING],
1017
+ returns: [INT, INT],
1018
+ },
1019
+ FullRuneInString: { kind: "func", params: [STRING], returns: [BOOL] },
1020
+ // Constants
1021
+ RuneError: INT,
1022
+ MaxRune: INT,
1023
+ UTFMax: INT,
1024
+ },
1025
+ });
1026
+
1027
+ // path package — import "path" or "path/filepath" → local name "path"
1028
+ globals.define("path", {
1029
+ kind: "namespace",
1030
+ name: "path",
1031
+ members: {
1032
+ Base: { kind: "func", params: [STRING], returns: [STRING] },
1033
+ Dir: { kind: "func", params: [STRING], returns: [STRING] },
1034
+ Ext: { kind: "func", params: [STRING], returns: [STRING] },
1035
+ Join: {
1036
+ kind: "func",
1037
+ params: [STRING],
1038
+ returns: [STRING],
1039
+ variadic: true,
1040
+ },
1041
+ Clean: { kind: "func", params: [STRING], returns: [STRING] },
1042
+ IsAbs: { kind: "func", params: [STRING], returns: [BOOL] },
1043
+ Split: { kind: "func", params: [STRING], returns: [STRING, STRING] },
1044
+ Match: { kind: "func", params: [STRING, STRING], returns: [BOOL, ERROR] },
1045
+ },
1046
+ });
1047
+
1048
+ // Built-in functions
1049
+ globals.define("append", { kind: "builtin", name: "append" });
1050
+ globals.define("len", { kind: "builtin", name: "len" });
1051
+ globals.define("cap", { kind: "builtin", name: "cap" });
1052
+ globals.define("make", { kind: "builtin", name: "make" });
1053
+ globals.define("delete", { kind: "builtin", name: "delete" });
1054
+ globals.define("print", { kind: "builtin", name: "print" });
1055
+ globals.define("println", { kind: "builtin", name: "println" });
1056
+ globals.define("panic", { kind: "builtin", name: "panic" });
1057
+ globals.define("recover", { kind: "builtin", name: "recover" });
1058
+ globals.define("new", { kind: "builtin", name: "new" });
1059
+ globals.define("copy", { kind: "builtin", name: "copy" });
1060
+ globals.define("error", { kind: "builtin", name: "error" });
1061
+ globals.define("min", { kind: "builtin", name: "min" });
1062
+ globals.define("max", { kind: "builtin", name: "max" });
1063
+ globals.define("clear", { kind: "builtin", name: "clear" });
1064
+ globals.define("complex", { kind: "builtin", name: "complex" });
1065
+ globals.define("real", { kind: "builtin", name: "real" });
1066
+ globals.define("imag", { kind: "builtin", name: "imag" });
1067
+ }