gofront 0.0.8 → 1.0.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 (51) hide show
  1. package/README.md +88 -12
  2. package/package.json +8 -4
  3. package/src/codegen/expressions.js +520 -1717
  4. package/src/{codegen.js → codegen/index.js} +155 -184
  5. package/src/codegen/runtime.js +151 -0
  6. package/src/codegen/statements.js +305 -296
  7. package/src/codegen/stdlib/builder.js +36 -0
  8. package/src/codegen/stdlib/bytes.js +62 -0
  9. package/src/codegen/stdlib/errors.js +17 -0
  10. package/src/codegen/stdlib/fmt.js +101 -0
  11. package/src/codegen/stdlib/gom.js +152 -0
  12. package/src/codegen/stdlib/html.js +17 -0
  13. package/src/codegen/stdlib/index.js +95 -0
  14. package/src/codegen/stdlib/io.js +33 -0
  15. package/src/codegen/stdlib/maps.js +42 -0
  16. package/src/codegen/stdlib/math.js +53 -0
  17. package/src/codegen/stdlib/os.js +10 -0
  18. package/src/codegen/stdlib/path.js +31 -0
  19. package/src/codegen/stdlib/rand.js +24 -0
  20. package/src/codegen/stdlib/regexp.js +51 -0
  21. package/src/codegen/stdlib/slices.js +48 -0
  22. package/src/codegen/stdlib/sort.js +28 -0
  23. package/src/codegen/stdlib/strconv.js +30 -0
  24. package/src/codegen/stdlib/strings.js +83 -0
  25. package/src/codegen/stdlib/time.js +54 -0
  26. package/src/codegen/stdlib/unicode.js +22 -0
  27. package/src/codegen/stdlib/utf8.js +23 -0
  28. package/src/codegen/templ.js +281 -0
  29. package/src/compiler.js +102 -62
  30. package/src/dts-parser.js +355 -371
  31. package/src/index.js +22 -54
  32. package/src/lexer.js +200 -286
  33. package/src/minifier.js +305 -318
  34. package/src/parser/expressions.js +54 -36
  35. package/src/{parser.js → parser/index.js} +12 -5
  36. package/src/parser/statements.js +29 -35
  37. package/src/parser/types.js +31 -29
  38. package/src/templ-lexer.js +737 -0
  39. package/src/templ-parser.js +235 -0
  40. package/src/tokens.js +109 -0
  41. package/src/typechecker/assignability.js +258 -0
  42. package/src/typechecker/expressions.js +559 -549
  43. package/src/typechecker/index.js +555 -0
  44. package/src/typechecker/resolve.js +421 -0
  45. package/src/typechecker/statements.js +267 -280
  46. package/src/typechecker/stdlib/core.js +592 -0
  47. package/src/typechecker/stdlib/extended.js +332 -0
  48. package/src/typechecker/stdlib.js +9 -1060
  49. package/src/typechecker/termination.js +83 -0
  50. package/src/typechecker/types.js +6 -3
  51. package/src/typechecker.js +0 -1271
@@ -1,1067 +1,16 @@
1
1
  // stdlib.js — built-in namespace and browser-global registration for the GoFront type
2
2
  // checker. Called once from TypeChecker._setupGlobals() during construction.
3
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)
4
+ // Delegates to two focused sub-modules:
5
+ // stdlib/core.js — browser globals, fmt, strings, bytes, strconv, sort,
6
+ // math, errors, time, unicode, os, slices, html, io
7
+ // stdlib/extended.js — gom, maps, regexp, rand, utf8, path, builder types,
8
+ // built-in functions
8
9
 
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 };
10
+ import { setupCoreGlobals } from "./stdlib/core.js";
11
+ import { setupExtendedGlobals } from "./stdlib/extended.js";
13
12
 
14
13
  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" });
14
+ setupCoreGlobals(globals, types);
15
+ setupExtendedGlobals(globals, types);
1067
16
  }