gofront 0.0.9 → 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 (50) hide show
  1. package/README.md +6 -6
  2. package/package.json +7 -4
  3. package/src/codegen/expressions.js +520 -1717
  4. package/src/codegen/index.js +576 -0
  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 +80 -74
  30. package/src/dts-parser.js +355 -371
  31. package/src/index.js +13 -49
  32. package/src/lexer.js +186 -272
  33. package/src/minifier.js +305 -318
  34. package/src/parser/expressions.js +51 -34
  35. package/src/{parser.js → parser/index.js} +4 -4
  36. package/src/parser/statements.js +24 -34
  37. package/src/parser/types.js +31 -29
  38. package/src/templ-parser.js +2 -2
  39. package/src/tokens.js +109 -0
  40. package/src/typechecker/assignability.js +258 -0
  41. package/src/typechecker/expressions.js +559 -549
  42. package/src/typechecker/index.js +555 -0
  43. package/src/typechecker/resolve.js +421 -0
  44. package/src/typechecker/statements.js +267 -280
  45. package/src/typechecker/stdlib/core.js +592 -0
  46. package/src/typechecker/stdlib/extended.js +332 -0
  47. package/src/typechecker/stdlib.js +9 -1060
  48. package/src/typechecker/termination.js +83 -0
  49. package/src/codegen.js +0 -882
  50. package/src/typechecker.js +0 -1299
@@ -0,0 +1,151 @@
1
+ // Runtime helpers emitted by the code generator when the corresponding feature is used.
2
+ // Each export is a single JS statement (var __x = __x || function(...){...};) so that
3
+ // multiple compiled files bundled together can safely repeat the declaration.
4
+
5
+ export const HELPER_LEN = `var __len = __len || function(a) {
6
+ if (a && typeof a === 'object' && !Array.isArray(a)) return Object.keys(a).length;
7
+ return a?.length ?? 0;
8
+ };`;
9
+
10
+ export const HELPER_APPEND =
11
+ "var __append = __append || function(a, ...b) { return a ? [...a, ...b] : b; };";
12
+
13
+ export const HELPER_S = "var __s = __s || function(a) { return a || []; };";
14
+
15
+ export const HELPER_EQUAL = `var __equal = __equal || function __equal(a, b) {
16
+ if (a === b) return true;
17
+ if (a === null || b === null) return false;
18
+ if (Array.isArray(a) && Array.isArray(b)) {
19
+ if (a.length !== b.length) return false;
20
+ for (let i = 0; i < a.length; i++) if (!__equal(a[i], b[i])) return false;
21
+ return true;
22
+ }
23
+ if (typeof a === "object" && typeof b === "object") {
24
+ const ka = Object.keys(a), kb = Object.keys(b);
25
+ if (ka.length !== kb.length) return false;
26
+ for (const k of ka) if (!__equal(a[k], b[k])) return false;
27
+ return true;
28
+ }
29
+ return false;
30
+ };`;
31
+
32
+ export const HELPER_CMUL = `var __cmul = __cmul || function(a, b) {
33
+ return { re: a.re * b.re - a.im * b.im, im: a.re * b.im + a.im * b.re };
34
+ };`;
35
+
36
+ export const HELPER_CDIV = `var __cdiv = __cdiv || function(a, b) {
37
+ const d = b.re * b.re + b.im * b.im;
38
+ return { re: (a.re * b.re + a.im * b.im) / d, im: (a.im * b.re - a.re * b.im) / d };
39
+ };`;
40
+
41
+ export const HELPER_SPRINTF = `var __sprintf = __sprintf || function(f, ...a) {
42
+ let i = 0;
43
+ return f.replace(/%([#+\\- 0]*)([0-9]*)\\.?([0-9]*)[sdvftxXqobeEgGw%]/g, (m) => {
44
+ if (m === "%%") return "%";
45
+ const verb = m.slice(-1);
46
+ const v = a[i++];
47
+ const [, flags, width, prec] = m.match(/^%([#+\\- 0]*)([0-9]*)\\.?([0-9]*)/) || [];
48
+ const zero = flags?.includes("0") && !flags?.includes("-");
49
+ const pad = (s, w, z) => {
50
+ w = parseInt(w) || 0;
51
+ if (!w) return s;
52
+ const p = (z ? "0" : " ").repeat(Math.max(0, w - s.length));
53
+ return flags.includes("-") ? s + p : p + s;
54
+ };
55
+ switch (verb) {
56
+ case "s": return pad(String(v == null ? "<nil>" : v), width, false);
57
+ case "d": return pad(String(Math.trunc(Number(v))), width, zero);
58
+ case "v": {
59
+ if (typeof v === "object" && v !== null && "re" in v && "im" in v) {
60
+ const sign = v.im >= 0 ? "+" : "";
61
+ return pad("(" + v.re + sign + v.im + "i)", width, false);
62
+ }
63
+ return pad(String(v == null ? "<nil>" : v), width, false);
64
+ }
65
+ case "f": { const n = Number(v), p = prec !== "" ? parseInt(prec) : 6; return pad(n.toFixed(p), width, zero); }
66
+ case "t": return pad(String(!!v), width, false);
67
+ case "x": return pad((Number(v) >>> 0).toString(16), width, zero);
68
+ case "X": return pad((Number(v) >>> 0).toString(16).toUpperCase(), width, zero);
69
+ case "o": return pad((Number(v) >>> 0).toString(8), width, zero);
70
+ case "b": return pad((Number(v) >>> 0).toString(2), width, zero);
71
+ case "q": return pad('"' + String(v == null ? "" : v).replace(/\\\\/g, "\\\\\\\\").replace(/"/g, '\\\\"') + '"', width, false);
72
+ case "e": case "E": { const n = Number(v), p = prec !== "" ? parseInt(prec) : 6; return pad(n.toExponential(p), width, zero); }
73
+ case "g": case "G": { const n = Number(v); return pad(prec !== "" ? n.toPrecision(parseInt(prec)) : String(n), width, zero); }
74
+ case "w": return pad(String(v == null ? "<nil>" : typeof v === "object" && v.Error ? v.Error() : v), width, false);
75
+ default: return m;
76
+ }
77
+ });
78
+ };`;
79
+
80
+ export const HELPER_ERROR = `var __error = __error || function(msg, cause) {
81
+ return { Error() { return msg; }, toString() { return msg; }, _msg: msg, _cause: cause ?? null };
82
+ };`;
83
+
84
+ export const HELPER_ERROR_IS = `var __errorIs = __errorIs || function(err, target) {
85
+ while (err !== null && err !== undefined) {
86
+ if (err === target) return true;
87
+ if (typeof err === "object" && typeof target === "object" &&
88
+ err._msg !== undefined && target._msg !== undefined &&
89
+ err._msg === target._msg) return true;
90
+ err = err?._cause ?? null;
91
+ }
92
+ return false;
93
+ };`;
94
+
95
+ export const HELPER_PATH_CLEAN = `var __pathClean = __pathClean || function(p) {
96
+ if (!p) return ".";
97
+ const abs = p.startsWith("/");
98
+ const parts = p.split("/").reduce((acc, s) => {
99
+ if (s === "" || s === ".") return acc;
100
+ if (s === "..") {
101
+ if (acc.length && acc[acc.length - 1] !== "..") acc.pop();
102
+ else if (!abs) acc.push("..");
103
+ } else acc.push(s);
104
+ return acc;
105
+ }, []);
106
+ return (abs ? "/" : "") + (parts.join("/") || ".");
107
+ };`;
108
+
109
+ export const HELPER_TIME_FMT = `var __timeFmt = __timeFmt || function(d, layout) {
110
+ const pad = (n, w = 2) => String(n).padStart(w, "0");
111
+ const DAYS = ["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"];
112
+ const MONTHS = ["January","February","March","April","May","June","July","August","September","October","November","December"];
113
+ return layout.replace(/2006|06|Monday|Mon|January|Jan|01|1|02|2|15|PM|3|04|4|05|5|Z07:00|\\.000|\\.999/g, t => {
114
+ switch (t) {
115
+ case "2006": return d.getFullYear();
116
+ case "06": return String(d.getFullYear()).slice(-2);
117
+ case "Monday": return DAYS[d.getDay()];
118
+ case "Mon": return DAYS[d.getDay()].slice(0, 3);
119
+ case "January": return MONTHS[d.getMonth()];
120
+ case "Jan": return MONTHS[d.getMonth()].slice(0, 3);
121
+ case "01": return pad(d.getMonth() + 1);
122
+ case "1": return String(d.getMonth() + 1);
123
+ case "02": return pad(d.getDate());
124
+ case "2": return String(d.getDate());
125
+ case "15": return pad(d.getHours());
126
+ case "PM": return d.getHours() < 12 ? "AM" : "PM";
127
+ case "3": return String(d.getHours() % 12 || 12);
128
+ case "04": return pad(d.getMinutes());
129
+ case "4": return String(d.getMinutes());
130
+ case "05": return pad(d.getSeconds());
131
+ case "5": return String(d.getSeconds());
132
+ case "Z07:00": {
133
+ const o = -d.getTimezoneOffset();
134
+ return o === 0 ? "Z" : (o > 0 ? "+" : "-") + pad(Math.floor(Math.abs(o) / 60)) + ":" + pad(Math.abs(o) % 60);
135
+ }
136
+ case ".000": return "." + pad(d.getMilliseconds(), 3);
137
+ case ".999": return d.getMilliseconds() > 0 ? "." + String(d.getMilliseconds()).replace(/0+$/, "") : "";
138
+ default: return t;
139
+ }
140
+ });
141
+ };`;
142
+
143
+ export const HELPER_TIME_PARSE = `var __timeParse = __timeParse || function(layout, value) {
144
+ try {
145
+ const d = new Date(value);
146
+ if (isNaN(d.getTime())) throw 0;
147
+ return [{ _d: d }, null];
148
+ } catch {
149
+ return [{ _d: new Date(0) }, "parsing time: cannot parse"];
150
+ }
151
+ };`;