"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const ts = require("typescript");
const Lint = require("tslint");
class Rule extends Lint.Rules.AbstractRule {
    apply(sourceFile) {
        return this.applyWithFunction(sourceFile, walk, undefined);
    }
}
exports.Rule = Rule;
function walk(ctx) {
    if (ctx.sourceFile.isDeclarationFile)
        return;
    return ts.forEachChild(ctx.sourceFile, cb);
    function cb(node) {
        if (node.kind !== ts.SyntaxKind.PropertyDeclaration)
            return ts.forEachChild(node, cb);
        if (!node.decorators)
            return;
        const property = node;
        for (const decorator of node.decorators) {
            const call = decorator.expression.kind == ts.SyntaxKind.CallExpression ? decorator.expression : undefined;
            const name = call && call.expression.getText() || decorator.expression.getText();
            if (name === 'Prop') {
                if (!node.modifiers || !node.modifiers.some((x) => x.kind === ts.SyntaxKind.ReadonlyKeyword))
                    ctx.addFailureAtNode(property.name, 'Vue property should be readonly');
                if (call && call.arguments.length > 0 &&
                    call.arguments[0].properties.map((x) => x.name.getText()).some((x) => x === 'default' || x === 'required')) {
                    if (property.questionToken !== undefined)
                        ctx.addFailureAtNode(property.name, 'Vue property is required and should not be optional.');
                }
                else if (property.questionToken === undefined)
                    ctx.addFailureAtNode(property.name, 'Vue property should be optional - it is not required and has no default value.');
            }
        }
    }
}