aboutsummaryrefslogtreecommitdiff
path: root/src/main.zig
blob: 0b8437253ef640ec89859fd70ee96a1c4ad1c59b (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
const std = @import("std");
const lex = @import("js_lexer.zig");
const logger = @import("logger.zig");
const alloc = @import("alloc.zig");
const options = @import("options.zig");
const js_parser = @import("js_parser.zig");
const json_parser = @import("json_parser.zig");
const js_printer = @import("js_printer.zig");
const js_ast = @import("js_ast.zig");
const linker = @import("linker.zig");
usingnamespace @import("ast/base.zig");

pub fn main() anyerror!void {
    try alloc.setup(std.heap.page_allocator);
    const args = try std.process.argsAlloc(alloc.dynamic);
    const stdout = std.io.getStdOut();
    const stderr = std.io.getStdErr();

    if (args.len < 1) {
        const len = stderr.write("Pass a file");
        return;
    }

    const absolutePath = try std.fs.path.resolve(alloc.dynamic, args);
    const entryPointName = std.fs.path.basename(absolutePath);
    const file = try std.fs.openFileAbsolute(absolutePath, std.fs.File.OpenFlags{ .read = true });
    const stat = try file.stat();
    const code = try file.readToEndAlloc(alloc.dynamic, stat.size);

    const opts = try options.TransformOptions.initUncached(alloc.dynamic, entryPointName, code);
    var log = logger.Log.init(alloc.dynamic);
    var source = logger.Source.initFile(opts.entry_point, alloc.dynamic);
    var ast: js_ast.Ast = undefined;

    switch (opts.loader) {
        .json => {
            var expr = try json_parser.ParseJSON(&source, &log, alloc.dynamic);
            var stmt = js_ast.Stmt.alloc(alloc.dynamic, js_ast.S.ExportDefault{
                .value = js_ast.StmtOrExpr{ .expr = expr },
                .default_name = js_ast.LocRef{ .loc = logger.Loc{}, .ref = Ref{} },
            }, logger.Loc{ .start = 0 });

            var part = js_ast.Part{
                .stmts = &([_]js_ast.Stmt{stmt}),
            };

            ast = js_ast.Ast.initTest(&([_]js_ast.Part{part}));
        },
        .jsx, .tsx, .ts, .js => {
            var parser = try js_parser.Parser.init(opts, &log, &source, alloc.dynamic);
            var res = try parser.parse();
            ast = res.ast;
        },
        else => {
            std.debug.panic("Unsupported loader: {s}", .{opts.loader});
        },
    }

    var _linker = linker.Linker{};
    var symbols: [][]js_ast.Symbol = &([_][]js_ast.Symbol{ast.symbols});
    const printed = try js_printer.printAst(
        alloc.dynamic,
        ast,
        js_ast.Symbol.Map.initList(symbols),
        false,
        js_printer.Options{ .to_module_ref = js_ast.Ref{ .inner_index = 0 } },
        &_linker,
    );

    _ = try stdout.write(printed.js);
}