package com.pablissimo.sonar;
import org.sonar.api.*;
@Properties({
@Property(
key = TypeScriptPlugin.SETTING_TS_LINT_ENABLED,
deprecatedKey = TypeScriptPlugin.SETTING_TS_LINT_ENABLED_PREV,
type = PropertyType.BOOLEAN,
defaultValue = "true",
name = "Enable tslint",
description = "Specifies whether to run tslint on SonarQube analysis",
project = true
),
@Property(
key = TypeScriptPlugin.SETTING_TS_LINT_PATH,
deprecatedKey = TypeScriptPlugin.SETTING_TS_LINT_PATH_PREV,
defaultValue = "",
name = "Path to tslint",
description = "Path to installed copy of tslint to use to analyse the project",
project = true,
global = true
),
@Property(
key = TypeScriptPlugin.SETTING_TS_RULE_CONFIGS,
deprecatedKey = TypeScriptPlugin.SETTING_TS_RULE_CONFIGS_PREV,
name = "TsLint Rule-Collections",
description = "A collection of configurations for mapping tslint rules to Sonar rules",
project = false,
global = true,
fields = {
@PropertyField(
key = "name",
name = "Rule collection name",
type = PropertyType.STRING
),
@PropertyField(
key = "config",
name = "Rule configuration (see documentation)",
type = PropertyType.TEXT,
indicativeSize = 120
)
}
),
@Property(
key = TypeScriptPlugin.SETTING_EXCLUDE_TYPE_DEFINITION_FILES,
deprecatedKey = TypeScriptPlugin.SETTING_EXCLUDE_TYPE_DEFINITION_FILES_PREV,
type = PropertyType.BOOLEAN,
defaultValue = "true",
name = "Exclude .d.ts files",
description = "Exclude .d.ts files from analysis",
project = true,
global = false
),
@Property(
key = TypeScriptPlugin.SETTING_LCOV_REPORT_PATH,
deprecatedKey = TypeScriptPlugin.SETTING_LCOV_REPORT_PATH_PREV,
type = PropertyType.STRING,
name = "LCOV report path",
description = "Path to the LCOV report for code coverage, if one is available",
project = true,
global = false
),
@Property(
key = TypeScriptPlugin.SETTING_FORCE_ZERO_COVERAGE,
deprecatedKey = TypeScriptPlugin.SETTING_FORCE_ZERO_COVERAGE_PREV,
defaultValue = "false",
type = PropertyType.BOOLEAN,
name = "Force zero coverage",
description = "Forces coverage of all source file to be set to 0% when no coverage report is provided",
project = true,
global = false
),
@Property(
key = TypeScriptPlugin.SETTING_TS_LINT_CONFIG_PATH,
deprecatedKey = TypeScriptPlugin.SETTING_TS_LINT_CONFIG_PATH_PREV,
defaultValue = "tslint.json",
type = PropertyType.STRING,
name = "Path to tslint.json rule configuration file",
description = "Path to the file that configures the rules to be included in analysis",
project = true,
global = false
),
@Property(
key = TypeScriptPlugin.SETTING_TS_LINT_RULES_DIR,
deprecatedKey = TypeScriptPlugin.SETTING_TS_LINT_RULES_DIR_PREV,
defaultValue = "",
type = PropertyType.STRING,
name = "Custom rules dir",
description = "Path to any custom rules directory to be supplied to tslint",
project = true,
global = false
),
@Property(
key = TypeScriptPlugin.SETTING_TS_LINT_TIMEOUT,
deprecatedKey = TypeScriptPlugin.SETTING_TS_LINT_TIMEOUT_PREV,
defaultValue = "60000",
type = PropertyType.INTEGER,
name = "Max TsLint wait time (milliseconds) per analysed file",
description = "Maximum time to wait for tslint execution to finish before aborting (in milliseconds) per file sent to tslint",
project = true,
global = false
),
@Property(
key = TypeScriptPlugin.SETTING_TS_LINT_TYPECHECK,
deprecatedKey = TypeScriptPlugin.SETTING_TS_LINT_TYPECHECK_PREV,
defaultValue = "false",
type = PropertyType.BOOLEAN,
name = "Forces tslint to run a type-check",
description = "Equivalent to --type-check tslint argument - requires " + TypeScriptPlugin.SETTING_TS_LINT_PROJECT_PATH + " to also be set",
project = true,
global = false
),
@Property(
key = TypeScriptPlugin.SETTING_TS_LINT_PROJECT_PATH,
deprecatedKey = TypeScriptPlugin.SETTING_TS_LINT_PROJECT_PATH_PREV,
defaultValue = "",
type = PropertyType.STRING,
name = "Path to tsconfig.json file, if required",
description = "Required if " + TypeScriptPlugin.SETTING_TS_LINT_TYPECHECK + " setting specified, the path to the tsconfig.json file that describes the files to lint and build",
project = true,
global = false
),
@Property(
key = TypeScriptPlugin.SETTING_TS_LINT_OUTPUT_PATH,
deprecatedKey = TypeScriptPlugin.SETTING_TS_LINT_OUTPUT_PATH_PREV,
defaultValue = "",
type = PropertyType.STRING,
name = "Path to tslint JSON output file",
description = "If set, the contents of this file will parsed for linting issues rather than the plugin running tslint itself",
project = true,
global = false
),
@Property(
key = TypeScriptPlugin.SETTING_TS_LINT_DISALLOW_CUSTOM_RULES,
defaultValue = "false",
type = PropertyType.BOOLEAN,
name = "Disallow the usage of custom rules",
description = "If set to true, custom rules will no longer be used for analysis",
project = false,
global = true
)
})
public class TypeScriptPlugin implements Plugin {
// Deprecated settings
public static final String SETTING_EXCLUDE_TYPE_DEFINITION_FILES_PREV = "sonar.ts.excludetypedefinitionfiles";
public static final String SETTING_FORCE_ZERO_COVERAGE_PREV = "sonar.ts.forceZeroCoverage";
public static final String SETTING_IGNORE_NOT_FOUND_PREV = "sonar.ts.ignoreNotFound";
public static final String SETTING_TS_LINT_ENABLED_PREV = "sonar.ts.tslintenabled";
public static final String SETTING_TS_LINT_PATH_PREV = "sonar.ts.tslintpath";
public static final String SETTING_TS_LINT_CONFIG_PATH_PREV = "sonar.ts.tslintconfigpath";
public static final String SETTING_TS_LINT_TIMEOUT_PREV = "sonar.ts.tslinttimeout";
public static final String SETTING_TS_LINT_RULES_DIR_PREV = "sonar.ts.tslintrulesdir";
public static final String SETTING_LCOV_REPORT_PATH_PREV = "sonar.ts.lcov.reportpath";
public static final String SETTING_TS_RULE_CONFIGS_PREV = "sonar.ts.ruleconfigs";
public static final String SETTING_TS_LINT_TYPECHECK_PREV = "sonar.ts.tslinttypecheck";
public static final String SETTING_TS_LINT_PROJECT_PATH_PREV = "sonar.ts.tslintprojectpath";
public static final String SETTING_TS_LINT_OUTPUT_PATH_PREV = "sonar.ts.tslintoutputpath";
// Current settings
public static final String SETTING_EXCLUDE_TYPE_DEFINITION_FILES = "sonar.ts.excludeTypeDefinitionFiles";
public static final String SETTING_FORCE_ZERO_COVERAGE = "sonar.ts.coverage.forceZeroIfUnspecified";
public static final String SETTING_IGNORE_NOT_FOUND = "sonar.ts.coverage.ignoreNotFound";
public static final String SETTING_LCOV_REPORT_PATH = "sonar.ts.coverage.lcovReportPath";
public static final String SETTING_TS_LINT_ENABLED = "sonar.ts.tslint.enabled";
public static final String SETTING_TS_LINT_PATH = "sonar.ts.tslint.path";
public static final String SETTING_TS_LINT_CONFIG_PATH = "sonar.ts.tslint.configPath";
public static final String SETTING_TS_LINT_TIMEOUT = "sonar.ts.tslint.timeout";
public static final String SETTING_TS_LINT_RULES_DIR = "sonar.ts.tslint.rulesDir";
public static final String SETTING_TS_RULE_CONFIGS = "sonar.ts.tslint.ruleConfigs";
public static final String SETTING_TS_LINT_TYPECHECK = "sonar.ts.tslint.typeCheck";
public static final String SETTING_TS_LINT_PROJECT_PATH = "sonar.ts.tslint.projectPath";
public static final String SETTING_TS_LINT_OUTPUT_PATH = "sonar.ts.tslint.outputPath";
public static final String SETTING_TS_LINT_DISALLOW_CUSTOM_RULES = "sonar.ts.disallowcustomrules";
@Override
public void define(Context ctx) {
// Core components - the actual sensors doing the work or configuring
// the plugin
ctx
.addExtension(TypeScriptRuleProfile.class)
.addExtension(TypeScriptLanguage.class)
.addExtension(TsLintSensor.class)
.addExtension(CombinedCoverageSensor.class)
.addExtension(TsRulesDefinition.class);
// Additional services to be DI'd into the above
ctx.addExtension(PathResolverImpl.class);
ctx.addExtension(TsLintExecutorImpl.class);
ctx.addExtension(TsLintParserImpl.class);
ctx.addExtension(LOCSensorImpl.class);
ctx.addExtension(TsCoverageSensorImpl.class);
}
}