azkal-lang 0.1.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.
@@ -0,0 +1,456 @@
1
+ import { TokenType } from "./tokens.js";
2
+ import { ParseError } from "./errors.js";
3
+ export class Parser {
4
+ tokens;
5
+ pos = 0;
6
+ constructor(tokens) {
7
+ this.tokens = tokens;
8
+ }
9
+ parse() {
10
+ const body = [];
11
+ this.skipNewlines();
12
+ while (!this.isAtEnd()) {
13
+ body.push(this.declaration());
14
+ this.skipNewlines();
15
+ }
16
+ return { kind: "Program", body, line: 1 };
17
+ }
18
+ // --- Declarations ---
19
+ declaration() {
20
+ if (this.check(TokenType.Let))
21
+ return this.letDeclaration();
22
+ if (this.check(TokenType.Fn) && this.peekNext()?.type === TokenType.Identifier) {
23
+ return this.fnDeclaration();
24
+ }
25
+ return this.statement();
26
+ }
27
+ letDeclaration() {
28
+ const letTok = this.consume(TokenType.Let, "Expected 'let'");
29
+ const name = this.consume(TokenType.Identifier, "Expected variable name after 'let'").value;
30
+ this.consume(TokenType.Assign, "Expected '=' after variable name");
31
+ const value = this.expression();
32
+ this.expectEndOfStatement();
33
+ return { kind: "LetDecl", name, value, line: letTok.line };
34
+ }
35
+ fnDeclaration() {
36
+ const fnTok = this.consume(TokenType.Fn, "Expected 'fn'");
37
+ const name = this.consume(TokenType.Identifier, "Expected function name").value;
38
+ const params = this.parseParams();
39
+ const body = this.block();
40
+ return { kind: "FnDecl", name, params, body, line: fnTok.line };
41
+ }
42
+ // --- Statements ---
43
+ statement() {
44
+ if (this.check(TokenType.If))
45
+ return this.ifStatement();
46
+ if (this.check(TokenType.While))
47
+ return this.whileStatement();
48
+ if (this.check(TokenType.For))
49
+ return this.forStatement();
50
+ if (this.check(TokenType.Return))
51
+ return this.returnStatement();
52
+ if (this.check(TokenType.Break))
53
+ return this.breakStatement();
54
+ if (this.check(TokenType.Continue))
55
+ return this.continueStatement();
56
+ if (this.check(TokenType.LBrace))
57
+ return this.block();
58
+ return this.expressionStatement();
59
+ }
60
+ ifStatement() {
61
+ const tok = this.consume(TokenType.If, "Expected 'if'");
62
+ const condition = this.expression();
63
+ const then = this.block();
64
+ let otherwise = null;
65
+ this.skipNewlines();
66
+ if (this.match(TokenType.Else)) {
67
+ if (this.check(TokenType.If)) {
68
+ otherwise = this.ifStatement();
69
+ }
70
+ else {
71
+ otherwise = this.block();
72
+ }
73
+ }
74
+ return { kind: "IfStmt", condition, then, otherwise, line: tok.line };
75
+ }
76
+ whileStatement() {
77
+ const tok = this.consume(TokenType.While, "Expected 'while'");
78
+ const condition = this.expression();
79
+ const body = this.block();
80
+ return { kind: "WhileStmt", condition, body, line: tok.line };
81
+ }
82
+ forStatement() {
83
+ const tok = this.consume(TokenType.For, "Expected 'for'");
84
+ const variable = this.consume(TokenType.Identifier, "Expected variable name after 'for'").value;
85
+ this.consume(TokenType.In, "Expected 'in' after variable name");
86
+ const iterable = this.expression();
87
+ const body = this.block();
88
+ return { kind: "ForInStmt", variable, iterable, body, line: tok.line };
89
+ }
90
+ returnStatement() {
91
+ const tok = this.consume(TokenType.Return, "Expected 'return'");
92
+ let value = null;
93
+ if (!this.check(TokenType.Newline) && !this.check(TokenType.EOF) && !this.check(TokenType.RBrace)) {
94
+ value = this.expression();
95
+ }
96
+ this.expectEndOfStatement();
97
+ return { kind: "ReturnStmt", value, line: tok.line };
98
+ }
99
+ breakStatement() {
100
+ const tok = this.consume(TokenType.Break, "Expected 'break'");
101
+ this.expectEndOfStatement();
102
+ return { kind: "BreakStmt", line: tok.line };
103
+ }
104
+ continueStatement() {
105
+ const tok = this.consume(TokenType.Continue, "Expected 'continue'");
106
+ this.expectEndOfStatement();
107
+ return { kind: "ContinueStmt", line: tok.line };
108
+ }
109
+ block() {
110
+ const tok = this.consume(TokenType.LBrace, "Expected '{'");
111
+ this.skipNewlines();
112
+ const body = [];
113
+ while (!this.check(TokenType.RBrace) && !this.isAtEnd()) {
114
+ body.push(this.declaration());
115
+ this.skipNewlines();
116
+ }
117
+ this.consume(TokenType.RBrace, "Expected '}'");
118
+ return { kind: "BlockStmt", body, line: tok.line };
119
+ }
120
+ expressionStatement() {
121
+ const expr = this.expression();
122
+ this.expectEndOfStatement();
123
+ return { kind: "ExprStmt", expr, line: expr.line };
124
+ }
125
+ // --- Expressions (precedence climbing) ---
126
+ expression() {
127
+ return this.assignment();
128
+ }
129
+ assignment() {
130
+ const expr = this.pipe();
131
+ if (this.match(TokenType.Assign)) {
132
+ const value = this.assignment();
133
+ if (expr.kind === "Identifier" || expr.kind === "IndexExpr" || expr.kind === "MemberExpr") {
134
+ return { kind: "AssignExpr", target: expr, value, line: expr.line };
135
+ }
136
+ throw this.error("Invalid assignment target", expr.line);
137
+ }
138
+ return expr;
139
+ }
140
+ pipe() {
141
+ let left = this.logicalOr();
142
+ while (this.match(TokenType.PipeOp)) {
143
+ const right = this.logicalOr();
144
+ left = { kind: "PipeExpr", left, right, line: left.line };
145
+ }
146
+ return left;
147
+ }
148
+ logicalOr() {
149
+ let left = this.logicalAnd();
150
+ while (this.match(TokenType.Or)) {
151
+ const right = this.logicalAnd();
152
+ left = { kind: "LogicalExpr", op: "or", left, right, line: left.line };
153
+ }
154
+ return left;
155
+ }
156
+ logicalAnd() {
157
+ let left = this.equality();
158
+ while (this.match(TokenType.And)) {
159
+ const right = this.equality();
160
+ left = { kind: "LogicalExpr", op: "and", left, right, line: left.line };
161
+ }
162
+ return left;
163
+ }
164
+ equality() {
165
+ let left = this.comparison();
166
+ while (this.check(TokenType.Eq) || this.check(TokenType.NotEq)) {
167
+ const op = this.advance().value;
168
+ const right = this.comparison();
169
+ left = { kind: "BinaryExpr", op, left, right, line: left.line };
170
+ }
171
+ return left;
172
+ }
173
+ comparison() {
174
+ let left = this.addition();
175
+ while (this.check(TokenType.Lt) || this.check(TokenType.Gt) ||
176
+ this.check(TokenType.LtEq) || this.check(TokenType.GtEq)) {
177
+ const op = this.advance().value;
178
+ const right = this.addition();
179
+ left = { kind: "BinaryExpr", op, left, right, line: left.line };
180
+ }
181
+ return left;
182
+ }
183
+ addition() {
184
+ let left = this.multiplication();
185
+ while (this.check(TokenType.Plus) || this.check(TokenType.Minus)) {
186
+ const op = this.advance().value;
187
+ const right = this.multiplication();
188
+ left = { kind: "BinaryExpr", op, left, right, line: left.line };
189
+ }
190
+ return left;
191
+ }
192
+ multiplication() {
193
+ let left = this.unary();
194
+ while (this.check(TokenType.Star) || this.check(TokenType.Slash) || this.check(TokenType.Percent)) {
195
+ const op = this.advance().value;
196
+ const right = this.unary();
197
+ left = { kind: "BinaryExpr", op, left, right, line: left.line };
198
+ }
199
+ return left;
200
+ }
201
+ unary() {
202
+ if (this.check(TokenType.Minus) || this.check(TokenType.Bang)) {
203
+ const op = this.advance();
204
+ const operand = this.unary();
205
+ return { kind: "UnaryExpr", op: op.value, operand, line: op.line };
206
+ }
207
+ return this.callExpr();
208
+ }
209
+ callExpr() {
210
+ let expr = this.primary();
211
+ while (true) {
212
+ if (this.match(TokenType.LParen)) {
213
+ const args = this.parseArgs();
214
+ this.consume(TokenType.RParen, "Expected ')' after arguments");
215
+ expr = { kind: "CallExpr", callee: expr, args, line: expr.line };
216
+ }
217
+ else if (this.match(TokenType.LBracket)) {
218
+ const index = this.expression();
219
+ this.consume(TokenType.RBracket, "Expected ']'");
220
+ expr = { kind: "IndexExpr", object: expr, index, line: expr.line };
221
+ }
222
+ else if (this.match(TokenType.Dot)) {
223
+ const prop = this.consume(TokenType.Identifier, "Expected property name after '.'").value;
224
+ expr = { kind: "MemberExpr", object: expr, property: prop, line: expr.line };
225
+ }
226
+ else {
227
+ break;
228
+ }
229
+ }
230
+ return expr;
231
+ }
232
+ primary() {
233
+ const tok = this.current();
234
+ if (this.match(TokenType.Number)) {
235
+ return { kind: "NumberLiteral", value: parseFloat(tok.value), line: tok.line };
236
+ }
237
+ if (this.match(TokenType.String)) {
238
+ return { kind: "StringLiteral", value: tok.value, line: tok.line };
239
+ }
240
+ // Template string: ` ... {expr} ... `
241
+ if (this.match(TokenType.TemplateString)) {
242
+ return this.parseTemplateLiteral(tok.line);
243
+ }
244
+ if (this.match(TokenType.Boolean)) {
245
+ return { kind: "BooleanLiteral", value: tok.value === "true", line: tok.line };
246
+ }
247
+ if (this.match(TokenType.Null)) {
248
+ return { kind: "NullLiteral", line: tok.line };
249
+ }
250
+ if (this.match(TokenType.Identifier)) {
251
+ return { kind: "Identifier", name: tok.value, line: tok.line };
252
+ }
253
+ if (this.match(TokenType.LParen)) {
254
+ const expr = this.expression();
255
+ this.consume(TokenType.RParen, "Expected ')'");
256
+ return expr;
257
+ }
258
+ // Array literal
259
+ if (this.match(TokenType.LBracket)) {
260
+ const elements = [];
261
+ if (!this.check(TokenType.RBracket)) {
262
+ do {
263
+ this.skipNewlines();
264
+ if (this.match(TokenType.Spread)) {
265
+ elements.push({ kind: "SpreadExpr", expr: this.expression(), line: tok.line });
266
+ }
267
+ else {
268
+ elements.push(this.expression());
269
+ }
270
+ this.skipNewlines();
271
+ } while (this.match(TokenType.Comma));
272
+ }
273
+ this.consume(TokenType.RBracket, "Expected ']'");
274
+ return { kind: "ArrayLiteral", elements, line: tok.line };
275
+ }
276
+ // Object literal: { key: value, ... }
277
+ // Disambiguate from block by checking for `identifier :` or `}`
278
+ if (this.check(TokenType.LBrace) && this.isObjectLiteral()) {
279
+ return this.parseObjectLiteral();
280
+ }
281
+ // Spread
282
+ if (this.match(TokenType.Spread)) {
283
+ return { kind: "SpreadExpr", expr: this.expression(), line: tok.line };
284
+ }
285
+ // Anonymous function: fn(params) { body }
286
+ if (this.match(TokenType.Fn)) {
287
+ const params = this.parseParams();
288
+ const body = this.block();
289
+ return { kind: "FnExpr", params, body, line: tok.line };
290
+ }
291
+ throw this.error(`Unexpected token: '${tok.value}'`, tok.line);
292
+ }
293
+ parseTemplateLiteral(line) {
294
+ const parts = [];
295
+ while (!this.isAtEnd()) {
296
+ // End of template
297
+ if (this.check(TokenType.TemplateString)) {
298
+ this.advance(); // consume closing `
299
+ break;
300
+ }
301
+ // String part
302
+ if (this.check(TokenType.String)) {
303
+ const tok = this.advance();
304
+ if (tok.value.length > 0) {
305
+ parts.push({ kind: "StringLiteral", value: tok.value, line: tok.line });
306
+ }
307
+ continue;
308
+ }
309
+ // Expression part
310
+ if (this.match(TokenType.TemplateExprStart)) {
311
+ const expr = this.expression();
312
+ parts.push(expr);
313
+ this.consume(TokenType.TemplateExprEnd, "Expected '}' in template");
314
+ continue;
315
+ }
316
+ break;
317
+ }
318
+ return { kind: "TemplateLiteral", parts, line };
319
+ }
320
+ isObjectLiteral() {
321
+ // Look ahead to see if this is { key: value } or a block
322
+ let i = this.pos + 1; // skip the {
323
+ // Skip newlines
324
+ while (i < this.tokens.length && this.tokens[i].type === TokenType.Newline)
325
+ i++;
326
+ // Empty braces = object
327
+ if (i < this.tokens.length && this.tokens[i].type === TokenType.RBrace)
328
+ return true;
329
+ // identifier followed by : or , or } = object (shorthand support)
330
+ if (i < this.tokens.length && this.tokens[i].type === TokenType.Identifier) {
331
+ let j = i + 1;
332
+ while (j < this.tokens.length && this.tokens[j].type === TokenType.Newline)
333
+ j++;
334
+ if (j < this.tokens.length) {
335
+ const nextType = this.tokens[j].type;
336
+ if (nextType === TokenType.Colon || nextType === TokenType.Comma || nextType === TokenType.RBrace)
337
+ return true;
338
+ }
339
+ }
340
+ // String followed by : = object
341
+ if (i < this.tokens.length && this.tokens[i].type === TokenType.String) {
342
+ let j = i + 1;
343
+ while (j < this.tokens.length && this.tokens[j].type === TokenType.Newline)
344
+ j++;
345
+ if (j < this.tokens.length && this.tokens[j].type === TokenType.Colon)
346
+ return true;
347
+ }
348
+ return false;
349
+ }
350
+ parseObjectLiteral() {
351
+ const tok = this.consume(TokenType.LBrace, "Expected '{'");
352
+ this.skipNewlines();
353
+ const properties = [];
354
+ while (!this.check(TokenType.RBrace) && !this.isAtEnd()) {
355
+ let key;
356
+ if (this.check(TokenType.Identifier)) {
357
+ key = this.advance().value;
358
+ }
359
+ else if (this.check(TokenType.String)) {
360
+ key = this.advance().value;
361
+ }
362
+ else {
363
+ throw this.error("Expected property name", this.current().line);
364
+ }
365
+ // Shorthand: { name } is same as { name: name }
366
+ if (this.check(TokenType.Comma) || this.check(TokenType.Newline) || this.check(TokenType.RBrace)) {
367
+ properties.push({
368
+ key,
369
+ value: { kind: "Identifier", name: key, line: tok.line },
370
+ });
371
+ }
372
+ else {
373
+ this.consume(TokenType.Colon, "Expected ':' after property name");
374
+ const value = this.expression();
375
+ properties.push({ key, value });
376
+ }
377
+ this.skipNewlines();
378
+ if (!this.check(TokenType.RBrace)) {
379
+ this.match(TokenType.Comma);
380
+ }
381
+ this.skipNewlines();
382
+ }
383
+ this.consume(TokenType.RBrace, "Expected '}'");
384
+ return { kind: "ObjectLiteral", properties, line: tok.line };
385
+ }
386
+ // --- Helpers ---
387
+ parseParams() {
388
+ this.consume(TokenType.LParen, "Expected '(' for parameters");
389
+ const params = [];
390
+ if (!this.check(TokenType.RParen)) {
391
+ do {
392
+ params.push(this.consume(TokenType.Identifier, "Expected parameter name").value);
393
+ } while (this.match(TokenType.Comma));
394
+ }
395
+ this.consume(TokenType.RParen, "Expected ')'");
396
+ return params;
397
+ }
398
+ parseArgs() {
399
+ const args = [];
400
+ if (!this.check(TokenType.RParen)) {
401
+ do {
402
+ args.push(this.expression());
403
+ } while (this.match(TokenType.Comma));
404
+ }
405
+ return args;
406
+ }
407
+ skipNewlines() {
408
+ while (this.match(TokenType.Newline)) { }
409
+ }
410
+ expectEndOfStatement() {
411
+ if (this.isAtEnd())
412
+ return;
413
+ if (this.check(TokenType.RBrace))
414
+ return;
415
+ if (!this.match(TokenType.Newline)) {
416
+ if (!this.check(TokenType.EOF)) {
417
+ throw this.error(`Expected end of statement, got '${this.current().value}'`, this.current().line);
418
+ }
419
+ }
420
+ this.skipNewlines();
421
+ }
422
+ current() {
423
+ return this.tokens[this.pos];
424
+ }
425
+ peekNext() {
426
+ return this.tokens[this.pos + 1];
427
+ }
428
+ check(type) {
429
+ return !this.isAtEnd() && this.tokens[this.pos].type === type;
430
+ }
431
+ match(type) {
432
+ if (this.check(type)) {
433
+ this.pos++;
434
+ return true;
435
+ }
436
+ return false;
437
+ }
438
+ advance() {
439
+ const tok = this.tokens[this.pos];
440
+ this.pos++;
441
+ return tok;
442
+ }
443
+ consume(type, message) {
444
+ if (this.check(type))
445
+ return this.advance();
446
+ const tok = this.current();
447
+ throw this.error(`${message}, got '${tok.value}'`, tok.line);
448
+ }
449
+ isAtEnd() {
450
+ return this.pos >= this.tokens.length || this.tokens[this.pos].type === TokenType.EOF;
451
+ }
452
+ error(message, line) {
453
+ return new ParseError(message, line, this.tokens[this.pos]?.col ?? 0);
454
+ }
455
+ }
456
+ //# sourceMappingURL=parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser.js","sourceRoot":"","sources":["../../src/parser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare function startRepl(): void;
@@ -0,0 +1,60 @@
1
+ import * as readline from "readline";
2
+ import { Lexer } from "./lexer.js";
3
+ import { Parser } from "./parser.js";
4
+ import { Interpreter } from "./interpreter.js";
5
+ import { AzkalError } from "./errors.js";
6
+ const BANNER = `
7
+ \x1b[36m ___ __ __
8
+ / _ | ___ / /__ ___ _ / /
9
+ / __ |/_ / / '_// _ '// /
10
+ /_/ |_|/__/ /_/\\_\\ \\_,_//_/
11
+ \x1b[0m
12
+ \x1b[90m v0.1.0 — Type 'exit' to quit\x1b[0m
13
+ `;
14
+ export function startRepl() {
15
+ console.log(BANNER);
16
+ const rl = readline.createInterface({
17
+ input: process.stdin,
18
+ output: process.stdout,
19
+ prompt: "\x1b[36mazkal>\x1b[0m ",
20
+ });
21
+ const interpreter = new Interpreter();
22
+ rl.prompt();
23
+ rl.on("line", (line) => {
24
+ const input = line.trim();
25
+ if (!input) {
26
+ rl.prompt();
27
+ return;
28
+ }
29
+ if (input === "exit" || input === "quit") {
30
+ console.log("\x1b[90mGoodbye.\x1b[0m");
31
+ process.exit(0);
32
+ }
33
+ try {
34
+ const tokens = new Lexer(input).tokenize();
35
+ const ast = new Parser(tokens).parse();
36
+ const result = interpreter.run(ast);
37
+ // Show result if it's an expression (not a statement like let/fn/if/while)
38
+ if (result !== null && result !== undefined) {
39
+ const last = ast.body[ast.body.length - 1];
40
+ if (last && last.kind === "ExprStmt") {
41
+ console.log(`\x1b[32m${interpreter.stringify(result)}\x1b[0m`);
42
+ }
43
+ }
44
+ }
45
+ catch (e) {
46
+ if (e instanceof AzkalError) {
47
+ console.log(e.format());
48
+ }
49
+ else {
50
+ console.log(`\x1b[31merror\x1b[0m: ${e.message}`);
51
+ }
52
+ }
53
+ rl.prompt();
54
+ });
55
+ rl.on("close", () => {
56
+ console.log("\n\x1b[90mGoodbye.\x1b[0m");
57
+ process.exit(0);
58
+ });
59
+ }
60
+ //# sourceMappingURL=repl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repl.js","sourceRoot":"","sources":["../../src/repl.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,UAAU,CAAC;AACrC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,MAAM,MAAM,GAAG;;;;;;;CAOd,CAAC;AAEF,MAAM,UAAU,SAAS;IACvB,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAEpB,MAAM,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC;QAClC,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,MAAM,EAAE,wBAAwB;KACjC,CAAC,CAAC;IAEH,MAAM,WAAW,GAAG,IAAI,WAAW,EAAE,CAAC;IAEtC,EAAE,CAAC,MAAM,EAAE,CAAC;IAEZ,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;QACrB,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC1B,IAAI,CAAC,KAAK,EAAE,CAAC;YAAC,EAAE,CAAC,MAAM,EAAE,CAAC;YAAC,OAAO;QAAC,CAAC;QACpC,IAAI,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,MAAM,EAAE,CAAC;YACzC,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;YACvC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,QAAQ,EAAE,CAAC;YAC3C,MAAM,GAAG,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,CAAC;YACvC,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAEpC,2EAA2E;YAC3E,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;gBAC5C,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;gBAC3C,IAAI,IAAI,IAAI,IAAI,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;oBACrC,OAAO,CAAC,GAAG,CAAC,WAAW,WAAW,CAAC,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;gBACjE,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,IAAI,CAAC,YAAY,UAAU,EAAE,CAAC;gBAC5B,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;YAC1B,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,yBAA0B,CAAW,CAAC,OAAO,EAAE,CAAC,CAAC;YAC/D,CAAC;QACH,CAAC;QAED,EAAE,CAAC,MAAM,EAAE,CAAC;IACd,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;QAClB,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;QACzC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { Environment } from "./environment.js";
2
+ export declare function createGlobals(capturedOutput?: string[] | null): Environment;