UNPKG

@bacons/xcode

Version:

pbxproj parser

85 lines 2.65 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.JsonVisitor = void 0; const parser_1 = require("../parser/parser"); /** Converts a CST for `pbxproj` into a JSON representation. */ class JsonVisitor extends parser_1.BaseVisitor { constructor() { super(); this.context = {}; // The "validateVisitor" method is a helper utility which performs static analysis // to detect missing or redundant visitor methods this.validateVisitor(); } head(ctx) { if (ctx.array) { this.context = this.visit(ctx.array); } else if (ctx.object) { this.context = this.visit(ctx.object); } } object(ctx) { return (ctx.objectItem?.reduce((prev, item) => ({ ...prev, ...this.visit(item), }), {}) ?? {}); } array(ctx) { return ctx.value?.map((item) => this.visit(item)) ?? []; } objectItem(ctx) { return { [this.visit(ctx.identifier)]: this.visit(ctx.value), }; } identifier(ctx) { if (ctx.QuotedString) { return ctx.QuotedString[0].payload ?? ctx.QuotedString[0].image; } else if (ctx.StringLiteral) { const literal = ctx.StringLiteral[0].payload ?? ctx.StringLiteral[0].image; return parseType(literal); } throw new Error("unhandled identifier: " + JSON.stringify(ctx)); } value(ctx) { if (ctx.identifier) { return this.visit(ctx.identifier); } else if (ctx.DataLiteral) { return ctx.DataLiteral[0].payload ?? ctx.DataLiteral[0].image; } else if (ctx.object) { return this.visit(ctx.object); } else if (ctx.array) { return this.visit(ctx.array); } throw new Error("unhandled value: " + JSON.stringify(ctx)); } } exports.JsonVisitor = JsonVisitor; function parseType(literal) { // Preserve octal literals with leading zeros if (/^0\d+$/.test(literal)) { return literal; } // Handle decimal numbers but preserve trailing zeros if (/^[+-]?([0-9]+\.?[0-9]*|\.[0-9]+)$/.test(literal)) { if (/0$/.test(literal)) { return literal; // Preserve trailing zero } const num = parseFloat(literal); if (!isNaN(num)) return num; } // Handle integers if (/^\d+$/.test(literal)) { const num = parseInt(literal, 10); if (!isNaN(num)) return num; } return literal; } //# sourceMappingURL=JsonVisitor.js.map