@xnoxs/flux-lang 3.1.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 (56) hide show
  1. package/CHANGELOG.md +103 -0
  2. package/README.md +1089 -0
  3. package/bin/flux.js +1397 -0
  4. package/dist/flux.cjs.js +6664 -0
  5. package/dist/flux.esm.js +6674 -0
  6. package/dist/flux.min.js +263 -0
  7. package/index.d.ts +202 -0
  8. package/index.js +26 -0
  9. package/package.json +77 -0
  10. package/scripts/build.js +76 -0
  11. package/src/bundler.js +216 -0
  12. package/src/checker.js +322 -0
  13. package/src/codegen.js +785 -0
  14. package/src/css-preprocessor.js +399 -0
  15. package/src/formatter.js +140 -0
  16. package/src/jsx.js +480 -0
  17. package/src/lexer.js +518 -0
  18. package/src/linter.js +758 -0
  19. package/src/mangler.js +280 -0
  20. package/src/parser.js +1671 -0
  21. package/src/self/bundler.flux +167 -0
  22. package/src/self/bundler.js +187 -0
  23. package/src/self/checker.flux +249 -0
  24. package/src/self/checker.js +338 -0
  25. package/src/self/codegen.flux +555 -0
  26. package/src/self/codegen.js +784 -0
  27. package/src/self/css-preprocessor.flux +373 -0
  28. package/src/self/css-preprocessor.js +387 -0
  29. package/src/self/formatter.flux +93 -0
  30. package/src/self/formatter.js +114 -0
  31. package/src/self/jsx.flux +430 -0
  32. package/src/self/jsx.js +396 -0
  33. package/src/self/lexer.flux +529 -0
  34. package/src/self/lexer.js +709 -0
  35. package/src/self/lexer.stage2.js +700 -0
  36. package/src/self/linter.flux +515 -0
  37. package/src/self/linter.js +804 -0
  38. package/src/self/mangler.flux +253 -0
  39. package/src/self/mangler.js +348 -0
  40. package/src/self/parser.flux +1146 -0
  41. package/src/self/parser.js +1571 -0
  42. package/src/self/sourcemap.flux +66 -0
  43. package/src/self/sourcemap.js +72 -0
  44. package/src/self/stdlib.flux +356 -0
  45. package/src/self/stdlib.js +396 -0
  46. package/src/self/test-runner.flux +201 -0
  47. package/src/self/test-runner.js +132 -0
  48. package/src/self/transpiler.flux +123 -0
  49. package/src/self/transpiler.js +83 -0
  50. package/src/self/type-checker.flux +821 -0
  51. package/src/self/type-checker.js +1106 -0
  52. package/src/sourcemap.js +82 -0
  53. package/src/stdlib.js +436 -0
  54. package/src/test-runner.js +239 -0
  55. package/src/transpiler.js +172 -0
  56. package/src/type-checker.js +1206 -0
@@ -0,0 +1,253 @@
1
+ // ============================================================
2
+ // Flux Self-Hosted Mangler
3
+ // src/self/mangler.flux — written in Flux, compiled by stage-0
4
+ //
5
+ // Renames local identifiers to short names (_a, _b, ...) to
6
+ // reduce output size. Exported/imported names are preserved.
7
+ // ============================================================
8
+
9
+ export val SAFE = new Set([
10
+ 'undefined','null','true','false','NaN','Infinity','arguments','this','super',
11
+ 'console','document','window','navigator','location','history','screen',
12
+ 'Math','JSON','Array','Object','String','Number','Boolean','Symbol','BigInt',
13
+ 'Promise','Proxy','Reflect','WeakMap','WeakSet','WeakRef',
14
+ 'Map','Set','Date','RegExp','Error','TypeError','RangeError','SyntaxError',
15
+ 'URIError','EvalError','ReferenceError',
16
+ 'parseInt','parseFloat','isNaN','isFinite',
17
+ 'encodeURIComponent','decodeURIComponent','encodeURI','decodeURI',
18
+ 'atob','btoa','structuredClone','queueMicrotask',
19
+ 'setTimeout','setInterval','clearTimeout','clearInterval',
20
+ 'requestAnimationFrame','cancelAnimationFrame',
21
+ 'fetch','XMLHttpRequest','WebSocket','EventSource','FormData','Headers',
22
+ 'Request','Response','URL','URLSearchParams','Blob','File','FileReader',
23
+ 'alert','confirm','prompt',
24
+ 'Event','CustomEvent','Node','Element','HTMLElement','DocumentFragment',
25
+ 'MutationObserver','IntersectionObserver','ResizeObserver',
26
+ 'process','Buffer','require','module','exports','__dirname','__filename',
27
+ 'global','globalThis','setImmediate','clearImmediate',
28
+ 'TextEncoder','TextDecoder','AbortController','AbortSignal','performance',
29
+ 'Http','Fs','Path','Url','Crypto','Os','Net','Stream','Events','Util',
30
+ 'http','fs','path','url','crypto','os','net','stream','events','util',
31
+ '_fluxH','_fluxCSS',
32
+ 'print',
33
+ ])
34
+
35
+ export fn makeName(n):
36
+ val chars = 'abcdefghijklmnopqrstuvwxyz'
37
+ var s = ''
38
+ var num = n + 1
39
+ while num > 0:
40
+ s = chars[(num - 1) % 26] + s
41
+ num = Math.floor((num - 1) / 26)
42
+ return '_' + s
43
+
44
+ export class Mangler:
45
+ map: any
46
+ counter: int
47
+ exported: any
48
+ imported: any
49
+
50
+ fn mangle(ast):
51
+ self.collectExportedAndImported(ast)
52
+ self.collectDeclarations(ast)
53
+ return self.walkProgram(ast)
54
+
55
+ fn getMap():
56
+ return Object.fromEntries(self.map)
57
+
58
+ fn collectExportedAndImported(ast):
59
+ for node in ast.body:
60
+ if node.type == 'ExportDecl':
61
+ val d = node.decl
62
+ if d and d.name: self.exported.add(d.name)
63
+ if d and d.type == 'DestructureDecl':
64
+ for pat in (d.pattern ?? []):
65
+ if pat: self.exported.add(pat.alias ?? pat.name ?? pat.key)
66
+ if node.type == 'ImportDecl':
67
+ if node.defaultName: self.imported.add(node.defaultName)
68
+ (node.names ?? []).forEach(n -> self.imported.add(n))
69
+
70
+ fn collectDeclarations(ast):
71
+ self.walkStmts(ast.body, { toplevel: true, collect: true })
72
+
73
+ fn walkProgram(ast):
74
+ val body = self.walkStmts(ast.body, { toplevel: true })
75
+ return { ...ast, body }
76
+
77
+ fn walkStmts(stmts, ctx):
78
+ return stmts.map(s -> self.walkStmt(s, ctx ?? {}))
79
+
80
+ fn walkStmt(node, ctx):
81
+ if not node: return node
82
+ val c = ctx ?? {}
83
+ if node.type == 'VarDecl': return self.walkVarDecl(node, c)
84
+ if node.type == 'DestructureDecl': return self.walkDestructure(node, c)
85
+ if node.type == 'FnDecl': return self.walkFnDecl(node, c)
86
+ if node.type == 'ClassDecl': return self.walkClassDecl(node, c)
87
+ if node.type == 'IfStmt':
88
+ return { ...node,
89
+ cond: self.walkExpr(node.cond),
90
+ then: self.walkStmts(node.then),
91
+ elseifs: node.elseifs.map(e -> ({ cond: self.walkExpr(e.cond), body: self.walkStmts(e.body) })),
92
+ else_: node.else_ ? self.walkStmts(node.else_) : null }
93
+ if node.type == 'ForInStmt':
94
+ return { ...node,
95
+ var: self.mangleLocal(node.var),
96
+ iter: self.walkExpr(node.iter),
97
+ body: self.walkStmts(node.body) }
98
+ if node.type == 'WhileStmt':
99
+ return { ...node, cond: self.walkExpr(node.cond), body: self.walkStmts(node.body) }
100
+ if node.type == 'DoWhileStmt':
101
+ return { ...node, cond: self.walkExpr(node.cond), body: self.walkStmts(node.body) }
102
+ if node.type == 'MatchStmt':
103
+ return { ...node,
104
+ subject: self.walkExpr(node.subject),
105
+ arms: node.arms.map(a -> ({ ...a, body: self.walkStmts(a.body) })) }
106
+ if node.type == 'ReturnStmt':
107
+ return { ...node, value: self.walkExpr(node.value) }
108
+ if node.type == 'ThrowStmt':
109
+ return { ...node, value: self.walkExpr(node.value) }
110
+ if node.type == 'TryCatchStmt':
111
+ return { ...node,
112
+ tryBody: self.walkStmts(node.tryBody),
113
+ catchParam: node.catchParam ? self.mangleLocal(node.catchParam) : null,
114
+ catchBody: node.catchBody ? self.walkStmts(node.catchBody) : null,
115
+ finallyBody: node.finallyBody ? self.walkStmts(node.finallyBody) : null }
116
+ if node.type == 'ExportDecl':
117
+ return { ...node, decl: self.walkStmt(node.decl, c) }
118
+ if node.type == 'ImportDecl': return node
119
+ if node.type == 'TypeDecl': return node
120
+ if node.type == 'ExprStmt':
121
+ return { ...node, expr: self.walkExpr(node.expr) }
122
+ return node
123
+
124
+ fn walkVarDecl(node, ctx):
125
+ if ctx.collect: self.registerName(node.name); return node
126
+ return { ...node,
127
+ name: self.mangleName(node.name),
128
+ init: node.init ? self.walkExpr(node.init) : null }
129
+
130
+ fn mangleArrPatItem(p):
131
+ if not p: return p
132
+ if p.rest: return { ...p, name: self.mangleName(p.name) }
133
+ return { ...p, name: self.mangleName(p.name), defaultVal: p.defaultVal ? self.walkExpr(p.defaultVal) : null }
134
+
135
+ fn mangleObjPatItem(p):
136
+ if not p: return p
137
+ if p.rest: return { ...p, key: p.key, alias: self.mangleName(p.alias ?? p.key) }
138
+ return { ...p, alias: self.mangleName(p.alias ?? p.key), defaultVal: p.defaultVal ? self.walkExpr(p.defaultVal) : null }
139
+
140
+ fn walkDestructure(node, ctx):
141
+ if ctx.collect:
142
+ for dp in (node.pattern ?? []):
143
+ if dp: self.registerName(dp.alias ?? dp.name ?? dp.key)
144
+ return node
145
+ if node.patternType == 'array':
146
+ val pattern = node.pattern.map(p -> self.mangleArrPatItem(p))
147
+ return { ...node, pattern, init: self.walkExpr(node.init) }
148
+ else:
149
+ val pattern2 = node.pattern.map(p -> self.mangleObjPatItem(p))
150
+ return { ...node, pattern: pattern2, init: self.walkExpr(node.init) }
151
+
152
+ fn walkFnDecl(node, ctx):
153
+ if ctx.collect and node.name: self.registerName(node.name); return node
154
+ val mangledName = node.name ? self.mangleName(node.name) : null
155
+ val params = node.params.map(p -> ({
156
+ ...p,
157
+ name: self.mangleParam(p.name),
158
+ defaultVal: p.defaultVal ? self.walkExpr(p.defaultVal) : null,
159
+ }))
160
+ val body = node.inline ? self.walkExpr(node.body) : self.walkStmts(node.body)
161
+ return { ...node, name: mangledName, params, body }
162
+
163
+ fn mangleClassMethod(m):
164
+ val params = m.params.map(p -> ({
165
+ ...p,
166
+ name: self.mangleParam(p.name),
167
+ defaultVal: p.defaultVal ? self.walkExpr(p.defaultVal) : null,
168
+ }))
169
+ val body = m.inline ? self.walkExpr(m.body) : self.walkStmts(m.body)
170
+ return { ...m, params, body }
171
+
172
+ fn walkClassDecl(node, ctx):
173
+ if ctx.collect and node.name: self.registerName(node.name); return node
174
+ val mangledName = self.mangleName(node.name)
175
+ val methods = node.methods.map(m -> self.mangleClassMethod(m))
176
+ val superClass = node.superClass ? self.mangleName(node.superClass) : null
177
+ return { ...node, name: mangledName, superClass, methods }
178
+
179
+ fn mangleTemplatePart(p):
180
+ if p.type != 'expr': return p
181
+ var expr = p.value
182
+ for entry in self.map:
183
+ val orig = entry[0]
184
+ val mangled = entry[1]
185
+ expr = expr.replace(new RegExp('(?<![\\w$])' + orig + '(?![\\w$])', 'g'), mangled)
186
+ return { ...p, value: expr }
187
+
188
+ fn walkExpr(node):
189
+ if not node: return node
190
+ if node.type == 'Identifier':
191
+ return { ...node, name: self.mangleName(node.name) }
192
+ if (node.type == 'NumberLit' or node.type == 'BoolLit' or node.type == 'NullLit' or
193
+ node.type == 'StringLit' or node.type == 'SelfExpr'):
194
+ return node
195
+ if node.type == 'TemplateLit':
196
+ return { ...node, parts: node.parts.map(p -> self.mangleTemplatePart(p)) }
197
+ if node.type == 'BinaryExpr':
198
+ return { ...node, left: self.walkExpr(node.left), right: self.walkExpr(node.right) }
199
+ if (node.type == 'UnaryExpr' or node.type == 'UpdateExpr' or
200
+ node.type == 'AwaitExpr' or node.type == 'TypeofExpr'):
201
+ return { ...node, operand: self.walkExpr(node.operand) }
202
+ if node.type == 'TernaryExpr':
203
+ return { ...node, cond: self.walkExpr(node.cond), then: self.walkExpr(node.then), else_: self.walkExpr(node.else_) }
204
+ if node.type == 'AssignExpr':
205
+ return { ...node, target: self.walkExpr(node.target), value: self.walkExpr(node.value) }
206
+ if node.type == 'SpreadExpr':
207
+ return { ...node, expr: self.walkExpr(node.expr) }
208
+ if node.type == 'PipeExpr':
209
+ return { ...node, left: self.walkExpr(node.left), right: self.walkExpr(node.right) }
210
+ if node.type == 'MemberExpr' or node.type == 'OptMemberExpr':
211
+ return { ...node, obj: self.walkExpr(node.obj) }
212
+ if node.type == 'IndexExpr' or node.type == 'OptIndexExpr':
213
+ return { ...node, obj: self.walkExpr(node.obj), idx: self.walkExpr(node.idx) }
214
+ if node.type == 'CallExpr' or node.type == 'OptCallExpr':
215
+ return { ...node, callee: self.walkExpr(node.callee), args: node.args.map(a -> self.walkExpr(a)) }
216
+ if node.type == 'NewExpr':
217
+ return { ...node, callee: self.mangleName(node.callee), args: node.args.map(a -> self.walkExpr(a)) }
218
+ if node.type == 'LambdaExpr':
219
+ return { ...node,
220
+ params: node.params.map(p -> ({ ...p, name: self.mangleParam(p.name) })),
221
+ body: self.walkExpr(node.body) }
222
+ if node.type == 'FnDecl':
223
+ return self.walkFnDecl(node, {})
224
+ if node.type == 'ArrayExpr':
225
+ return { ...node, items: node.items.map(i -> self.walkExpr(i)) }
226
+ if node.type == 'ObjectExpr':
227
+ return { ...node, pairs: node.pairs.map(p -> ({ ...p, value: self.walkExpr(p.value) })) }
228
+ if node.type == 'RangeExpr':
229
+ return { ...node, start: self.walkExpr(node.start), end: self.walkExpr(node.end) }
230
+ return node
231
+
232
+ fn registerName(name):
233
+ if not name or SAFE.has(name) or self.exported.has(name) or self.imported.has(name): return
234
+ if not self.map.has(name): self.map.set(name, makeName(self.counter)); self.counter = self.counter + 1
235
+
236
+ fn mangleName(name):
237
+ if not name: return name
238
+ if SAFE.has(name) or self.exported.has(name) or self.imported.has(name): return name
239
+ if self.map.has(name): return self.map.get(name)
240
+ return name
241
+
242
+ fn mangleLocal(name):
243
+ if not name or SAFE.has(name): return name
244
+ if not self.map.has(name): self.map.set(name, makeName(self.counter)); self.counter = self.counter + 1
245
+ return self.map.get(name)
246
+
247
+ fn mangleParam(name):
248
+ if not name or SAFE.has(name): return name
249
+ if not self.map.has(name): self.map.set(name, makeName(self.counter)); self.counter = self.counter + 1
250
+ return self.map.get(name)
251
+
252
+ export fn makeMangler():
253
+ return new Mangler(new Map(), 0, new Set(), new Set())
@@ -0,0 +1,348 @@
1
+ // Flux JSX Runtime
2
+ "use strict";
3
+
4
+ function _fluxH(tag,props,...children){
5
+ if(tag===""){const f=document.createDocumentFragment();children.flat(Infinity).forEach(c=>{if(c==null)return;f.appendChild(c instanceof Node?c:document.createTextNode(String(c)));});return f;}
6
+ const el=document.createElement(tag);
7
+ if(props){for(const[k,v]of Object.entries(props)){if(k==="class"||k==="className"){el.className=v;}else if(k==="style"&&typeof v==="object"){Object.assign(el.style,v);}else if(k.startsWith("on")&&typeof v==="function"){el.addEventListener(k.slice(2).toLowerCase(),v);}else if(typeof v==="boolean"){if(v)el.setAttribute(k,"");}else{el.setAttribute(k,String(v));}}}
8
+ children.flat(Infinity).forEach(c=>{if(c==null)return;el.appendChild(c instanceof Node?c:document.createTextNode(String(c)));});
9
+ return el;
10
+ }
11
+ function _fluxCSS(css){const s=document.createElement("style");s.textContent=css;document.head.appendChild(s);return css;}
12
+ // ── Flux stdlib ──
13
+
14
+ function map(arr, fn) { return arr.map(fn); }
15
+
16
+ function forEach(arr, fn) { arr.forEach(fn); return arr; }
17
+
18
+ function fromEntries(entries) {
19
+ return Object.fromEntries(entries);
20
+ }
21
+ // ── end stdlib ──
22
+
23
+
24
+ const SAFE = new Set(["undefined", "null", "true", "false", "NaN", "Infinity", "arguments", "this", "super", "console", "document", "window", "navigator", "location", "history", "screen", "Math", "JSON", "Array", "Object", "String", "Number", "Boolean", "Symbol", "BigInt", "Promise", "Proxy", "Reflect", "WeakMap", "WeakSet", "WeakRef", "Map", "Set", "Date", "RegExp", "Error", "TypeError", "RangeError", "SyntaxError", "URIError", "EvalError", "ReferenceError", "parseInt", "parseFloat", "isNaN", "isFinite", "encodeURIComponent", "decodeURIComponent", "encodeURI", "decodeURI", "atob", "btoa", "structuredClone", "queueMicrotask", "setTimeout", "setInterval", "clearTimeout", "clearInterval", "requestAnimationFrame", "cancelAnimationFrame", "fetch", "XMLHttpRequest", "WebSocket", "EventSource", "FormData", "Headers", "Request", "Response", "URL", "URLSearchParams", "Blob", "File", "FileReader", "alert", "confirm", "prompt", "Event", "CustomEvent", "Node", "Element", "HTMLElement", "DocumentFragment", "MutationObserver", "IntersectionObserver", "ResizeObserver", "process", "Buffer", "require", "module", "exports", "__dirname", "__filename", "global", "globalThis", "setImmediate", "clearImmediate", "TextEncoder", "TextDecoder", "AbortController", "AbortSignal", "performance", "Http", "Fs", "Path", "Url", "Crypto", "Os", "Net", "Stream", "Events", "Util", "http", "fs", "path", "url", "crypto", "os", "net", "stream", "events", "util", "_fluxH", "_fluxCSS", "print"]);
25
+ module.exports.SAFE = SAFE;
26
+ function makeName(n) {
27
+ const chars = "abcdefghijklmnopqrstuvwxyz";
28
+ let s = "";
29
+ let num = (n + 1);
30
+ while ((num > 0)) {
31
+ s = (chars[((num - 1) % 26)] + s);
32
+ num = Math.floor(((num - 1) / 26));
33
+ }
34
+ return ("_" + s);
35
+ }
36
+ module.exports.makeName = makeName;
37
+ class Mangler {
38
+ constructor(map, counter, exported, imported) {
39
+ this.map = map;
40
+ this.counter = counter;
41
+ this.exported = exported;
42
+ this.imported = imported;
43
+ }
44
+
45
+ mangle(ast) {
46
+ this.collectExportedAndImported(ast);
47
+ this.collectDeclarations(ast);
48
+ return this.walkProgram(ast);
49
+ }
50
+
51
+ getMap() {
52
+ return Object.fromEntries(this.map);
53
+ }
54
+
55
+ collectExportedAndImported(ast) {
56
+ for (const node of ast.body) {
57
+ if ((node.type == "ExportDecl")) {
58
+ const d = node.decl;
59
+ if ((d && d.name)) {
60
+ this.exported.add(d.name);
61
+ }
62
+ if ((d && (d.type == "DestructureDecl"))) {
63
+ for (const pat of (d.pattern ?? [])) {
64
+ if (pat) {
65
+ this.exported.add(((pat.alias ?? pat.name) ?? pat.key));
66
+ }
67
+ }
68
+ }
69
+ }
70
+ if ((node.type == "ImportDecl")) {
71
+ if (node.defaultName) {
72
+ this.imported.add(node.defaultName);
73
+ }
74
+ (node.names ?? []).forEach((n) => this.imported.add(n));
75
+ }
76
+ }
77
+ }
78
+
79
+ collectDeclarations(ast) {
80
+ this.walkStmts(ast.body, { toplevel: true, collect: true });
81
+ }
82
+
83
+ walkProgram(ast) {
84
+ const body = this.walkStmts(ast.body, { toplevel: true });
85
+ return { ...ast, body };
86
+ }
87
+
88
+ walkStmts(stmts, ctx) {
89
+ return stmts.map((s) => this.walkStmt(s, (ctx ?? { })));
90
+ }
91
+
92
+ walkStmt(node, ctx) {
93
+ if (!node) {
94
+ return node;
95
+ }
96
+ const c = (ctx ?? { });
97
+ if ((node.type == "VarDecl")) {
98
+ return this.walkVarDecl(node, c);
99
+ }
100
+ if ((node.type == "DestructureDecl")) {
101
+ return this.walkDestructure(node, c);
102
+ }
103
+ if ((node.type == "FnDecl")) {
104
+ return this.walkFnDecl(node, c);
105
+ }
106
+ if ((node.type == "ClassDecl")) {
107
+ return this.walkClassDecl(node, c);
108
+ }
109
+ if ((node.type == "IfStmt")) {
110
+ return { ...node, cond: this.walkExpr(node.cond), then: this.walkStmts(node.then), elseifs: node.elseifs.map((e) => { cond: this.walkExpr(e.cond), body: this.walkStmts(e.body) }), else_: (node.else_ ? this.walkStmts(node.else_) : null) };
111
+ }
112
+ if ((node.type == "ForInStmt")) {
113
+ return { ...node, var: this.mangleLocal(node.var), iter: this.walkExpr(node.iter), body: this.walkStmts(node.body) };
114
+ }
115
+ if ((node.type == "WhileStmt")) {
116
+ return { ...node, cond: this.walkExpr(node.cond), body: this.walkStmts(node.body) };
117
+ }
118
+ if ((node.type == "DoWhileStmt")) {
119
+ return { ...node, cond: this.walkExpr(node.cond), body: this.walkStmts(node.body) };
120
+ }
121
+ if ((node.type == "MatchStmt")) {
122
+ return { ...node, subject: this.walkExpr(node.subject), arms: node.arms.map((a) => { ...a, body: this.walkStmts(a.body) }) };
123
+ }
124
+ if ((node.type == "ReturnStmt")) {
125
+ return { ...node, value: this.walkExpr(node.value) };
126
+ }
127
+ if ((node.type == "ThrowStmt")) {
128
+ return { ...node, value: this.walkExpr(node.value) };
129
+ }
130
+ if ((node.type == "TryCatchStmt")) {
131
+ return { ...node, tryBody: this.walkStmts(node.tryBody), catchParam: (node.catchParam ? this.mangleLocal(node.catchParam) : null), catchBody: (node.catchBody ? this.walkStmts(node.catchBody) : null), finallyBody: (node.finallyBody ? this.walkStmts(node.finallyBody) : null) };
132
+ }
133
+ if ((node.type == "ExportDecl")) {
134
+ return { ...node, decl: this.walkStmt(node.decl, c) };
135
+ }
136
+ if ((node.type == "ImportDecl")) {
137
+ return node;
138
+ }
139
+ if ((node.type == "TypeDecl")) {
140
+ return node;
141
+ }
142
+ if ((node.type == "ExprStmt")) {
143
+ return { ...node, expr: this.walkExpr(node.expr) };
144
+ }
145
+ return node;
146
+ }
147
+
148
+ walkVarDecl(node, ctx) {
149
+ if (ctx.collect) {
150
+ this.registerName(node.name);
151
+ }
152
+ return node;
153
+ return { ...node, name: this.mangleName(node.name), init: (node.init ? this.walkExpr(node.init) : null) };
154
+ }
155
+
156
+ mangleArrPatItem(p) {
157
+ if (!p) {
158
+ return p;
159
+ }
160
+ if (p.rest) {
161
+ return { ...p, name: this.mangleName(p.name) };
162
+ }
163
+ return { ...p, name: this.mangleName(p.name), defaultVal: (p.defaultVal ? this.walkExpr(p.defaultVal) : null) };
164
+ }
165
+
166
+ mangleObjPatItem(p) {
167
+ if (!p) {
168
+ return p;
169
+ }
170
+ if (p.rest) {
171
+ return { ...p, key: p.key, alias: this.mangleName((p.alias ?? p.key)) };
172
+ }
173
+ return { ...p, alias: this.mangleName((p.alias ?? p.key)), defaultVal: (p.defaultVal ? this.walkExpr(p.defaultVal) : null) };
174
+ }
175
+
176
+ walkDestructure(node, ctx) {
177
+ if (ctx.collect) {
178
+ for (const dp of (node.pattern ?? [])) {
179
+ if (dp) {
180
+ this.registerName(((dp.alias ?? dp.name) ?? dp.key));
181
+ }
182
+ }
183
+ return node;
184
+ }
185
+ if ((node.patternType == "array")) {
186
+ const pattern = node.pattern.map((p) => this.mangleArrPatItem(p));
187
+ return { ...node, pattern, init: this.walkExpr(node.init) };
188
+ }
189
+ else {
190
+ const pattern2 = node.pattern.map((p) => this.mangleObjPatItem(p));
191
+ return { ...node, pattern: pattern2, init: this.walkExpr(node.init) };
192
+ }
193
+ }
194
+
195
+ walkFnDecl(node, ctx) {
196
+ if ((ctx.collect && node.name)) {
197
+ this.registerName(node.name);
198
+ }
199
+ return node;
200
+ const mangledName = (node.name ? this.mangleName(node.name) : null);
201
+ const params = node.params.map((p) => { ...p, name: this.mangleParam(p.name), defaultVal: (p.defaultVal ? this.walkExpr(p.defaultVal) : null) });
202
+ const body = (node.inline ? this.walkExpr(node.body) : this.walkStmts(node.body));
203
+ return { ...node, name: mangledName, params, body };
204
+ }
205
+
206
+ mangleClassMethod(m) {
207
+ const params = m.params.map((p) => { ...p, name: this.mangleParam(p.name), defaultVal: (p.defaultVal ? this.walkExpr(p.defaultVal) : null) });
208
+ const body = (m.inline ? this.walkExpr(m.body) : this.walkStmts(m.body));
209
+ return { ...m, params, body };
210
+ }
211
+
212
+ walkClassDecl(node, ctx) {
213
+ if ((ctx.collect && node.name)) {
214
+ this.registerName(node.name);
215
+ }
216
+ return node;
217
+ const mangledName = this.mangleName(node.name);
218
+ const methods = node.methods.map((m) => this.mangleClassMethod(m));
219
+ const superClass = (node.superClass ? this.mangleName(node.superClass) : null);
220
+ return { ...node, name: mangledName, superClass, methods };
221
+ }
222
+
223
+ mangleTemplatePart(p) {
224
+ if ((p.type != "expr")) {
225
+ return p;
226
+ }
227
+ let expr = p.value;
228
+ for (const entry of this.map) {
229
+ const orig = entry[0];
230
+ const mangled = entry[1];
231
+ expr = expr.replace(new RegExp((("(?<![\\w$])" + orig) + "(?![\\w$])"), "g"), mangled);
232
+ }
233
+ return { ...p, value: expr };
234
+ }
235
+
236
+ walkExpr(node) {
237
+ if (!node) {
238
+ return node;
239
+ }
240
+ if ((node.type == "Identifier")) {
241
+ return { ...node, name: this.mangleName(node.name) };
242
+ }
243
+ if ((((((node.type == "NumberLit") || (node.type == "BoolLit")) || (node.type == "NullLit")) || (node.type == "StringLit")) || (node.type == "SelfExpr"))) {
244
+ return node;
245
+ }
246
+ if ((node.type == "TemplateLit")) {
247
+ return { ...node, parts: node.parts.map((p) => this.mangleTemplatePart(p)) };
248
+ }
249
+ if ((node.type == "BinaryExpr")) {
250
+ return { ...node, left: this.walkExpr(node.left), right: this.walkExpr(node.right) };
251
+ }
252
+ if (((((node.type == "UnaryExpr") || (node.type == "UpdateExpr")) || (node.type == "AwaitExpr")) || (node.type == "TypeofExpr"))) {
253
+ return { ...node, operand: this.walkExpr(node.operand) };
254
+ }
255
+ if ((node.type == "TernaryExpr")) {
256
+ return { ...node, cond: this.walkExpr(node.cond), then: this.walkExpr(node.then), else_: this.walkExpr(node.else_) };
257
+ }
258
+ if ((node.type == "AssignExpr")) {
259
+ return { ...node, target: this.walkExpr(node.target), value: this.walkExpr(node.value) };
260
+ }
261
+ if ((node.type == "SpreadExpr")) {
262
+ return { ...node, expr: this.walkExpr(node.expr) };
263
+ }
264
+ if ((node.type == "PipeExpr")) {
265
+ return { ...node, left: this.walkExpr(node.left), right: this.walkExpr(node.right) };
266
+ }
267
+ if (((node.type == "MemberExpr") || (node.type == "OptMemberExpr"))) {
268
+ return { ...node, obj: this.walkExpr(node.obj) };
269
+ }
270
+ if (((node.type == "IndexExpr") || (node.type == "OptIndexExpr"))) {
271
+ return { ...node, obj: this.walkExpr(node.obj), idx: this.walkExpr(node.idx) };
272
+ }
273
+ if (((node.type == "CallExpr") || (node.type == "OptCallExpr"))) {
274
+ return { ...node, callee: this.walkExpr(node.callee), args: node.args.map((a) => this.walkExpr(a)) };
275
+ }
276
+ if ((node.type == "NewExpr")) {
277
+ return { ...node, callee: this.mangleName(node.callee), args: node.args.map((a) => this.walkExpr(a)) };
278
+ }
279
+ if ((node.type == "LambdaExpr")) {
280
+ return { ...node, params: node.params.map((p) => { ...p, name: this.mangleParam(p.name) }), body: this.walkExpr(node.body) };
281
+ }
282
+ if ((node.type == "FnDecl")) {
283
+ return this.walkFnDecl(node, { });
284
+ }
285
+ if ((node.type == "ArrayExpr")) {
286
+ return { ...node, items: node.items.map((i) => this.walkExpr(i)) };
287
+ }
288
+ if ((node.type == "ObjectExpr")) {
289
+ return { ...node, pairs: node.pairs.map((p) => { ...p, value: this.walkExpr(p.value) }) };
290
+ }
291
+ if ((node.type == "RangeExpr")) {
292
+ return { ...node, start: this.walkExpr(node.start), end: this.walkExpr(node.end) };
293
+ }
294
+ return node;
295
+ }
296
+
297
+ registerName(name) {
298
+ if ((((!name || SAFE.has(name)) || this.exported.has(name)) || this.imported.has(name))) {
299
+ return;
300
+ }
301
+ if (!this.map.has(name)) {
302
+ this.map.set(name, makeName(this.counter));
303
+ }
304
+ this.counter = (this.counter + 1);
305
+ }
306
+
307
+ mangleName(name) {
308
+ if (!name) {
309
+ return name;
310
+ }
311
+ if (((SAFE.has(name) || this.exported.has(name)) || this.imported.has(name))) {
312
+ return name;
313
+ }
314
+ if (this.map.has(name)) {
315
+ return this.map.get(name);
316
+ }
317
+ return name;
318
+ }
319
+
320
+ mangleLocal(name) {
321
+ if ((!name || SAFE.has(name))) {
322
+ return name;
323
+ }
324
+ if (!this.map.has(name)) {
325
+ this.map.set(name, makeName(this.counter));
326
+ }
327
+ this.counter = (this.counter + 1);
328
+ return this.map.get(name);
329
+ }
330
+
331
+ mangleParam(name) {
332
+ if ((!name || SAFE.has(name))) {
333
+ return name;
334
+ }
335
+ if (!this.map.has(name)) {
336
+ this.map.set(name, makeName(this.counter));
337
+ }
338
+ this.counter = (this.counter + 1);
339
+ return this.map.get(name);
340
+ }
341
+
342
+ }
343
+
344
+ module.exports.Mangler = Mangler;
345
+ function makeMangler() {
346
+ return new Mangler(new Map(), 0, new Set(), new Set());
347
+ }
348
+ module.exports.makeMangler = makeMangler;