Merge "Use .git in bare repository names in delete and archive test"
diff --git a/.eslintignore b/.eslintignore
deleted file mode 100644
index e69de29..0000000
--- a/.eslintignore
+++ /dev/null
diff --git a/gr-delete-repo/plugin.js b/.eslintrc.js
similarity index 74%
copy from gr-delete-repo/plugin.js
copy to .eslintrc.js
index 2e22d59..30df322 100644
--- a/gr-delete-repo/plugin.js
+++ b/.eslintrc.js
@@ -1,6 +1,6 @@
/**
* @license
- * Copyright (C) 2020 The Android Open Source Project
+ * Copyright (C) 2021 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -14,9 +14,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-import './gr-delete-repo.js';
-
-Gerrit.install(plugin => {
- plugin.registerCustomComponent(
- 'repo-command', 'gr-delete-repo');
-});
+__plugindir = 'delete-project';
+module.exports = {
+ extends: '../.eslintrc.js',
+};
diff --git a/.eslintrc.json b/.eslintrc.json
deleted file mode 100644
index 6d9ae7c..0000000
--- a/.eslintrc.json
+++ /dev/null
@@ -1,166 +0,0 @@
-{
- "extends": ["eslint:recommended", "google"],
- "parserOptions": {
- "ecmaVersion": 8,
- "sourceType": "module"
- },
- "env": {
- "browser": true,
- "es6": true
- },
- "globals": {
- "__dirname": false,
- "app": false,
- "page": false,
- "Polymer": false,
- "process": false,
- "require": false,
- "Gerrit": false,
- "Promise": false,
- "assert": false,
- "test": false,
- "flushAsynchronousOperations": false
- },
- "rules": {
- "arrow-parens": ["error", "as-needed"],
- "block-spacing": ["error", "always"],
- "brace-style": ["error", "1tbs", { "allowSingleLine": true }],
- "camelcase": "off",
- "comma-dangle": ["error", {
- "arrays": "always-multiline",
- "objects": "always-multiline",
- "imports": "always-multiline",
- "exports": "always-multiline",
- "functions": "never"
- }],
- "eol-last": "off",
- "indent": ["error", 2, {
- "MemberExpression": 2,
- "FunctionDeclaration": {"body": 1, "parameters": 2},
- "FunctionExpression": {"body": 1, "parameters": 2},
- "CallExpression": {"arguments": 2 },
- "ArrayExpression": 1,
- "ObjectExpression": 1,
- "SwitchCase": 1
- }],
- "keyword-spacing": ["error", { "after": true, "before": true }],
- "lines-between-class-members": ["error", "always"],
- "max-len": [
- "error",
- 80,
- 2,
- {
- "ignoreComments": true,
- "ignorePattern": "^import .*;$"
- }
- ],
- "new-cap": ["error", { "capIsNewExceptions": ["Polymer", "LegacyElementMixin", "GestureEventListeners", "LegacyDataMixin"] }],
- "no-console": "off",
- "no-multiple-empty-lines": [ "error", { "max": 1 } ],
- "no-prototype-builtins": "off",
- "no-redeclare": "off",
- "no-restricted-syntax": [
- "error",
- {
- "selector": "ExpressionStatement > CallExpression > MemberExpression[object.name='test'][property.name='only']",
- "message": "Remove test.only."
- },
- {
- "selector": "ExpressionStatement > CallExpression > MemberExpression[object.name='suite'][property.name='only']",
- "message": "Remove suite.only."
- }
- ],
- "no-undef": "off",
- "no-useless-escape": "off",
- "no-var": "error",
- "object-shorthand": ["error", "always"],
- "padding-line-between-statements": [
- "error",
- {
- "blankLine": "always",
- "prev": "class",
- "next": "*"
- },
- {
- "blankLine": "always",
- "prev": "*",
- "next": "class"
- }
- ],
- "prefer-arrow-callback": "error",
- "prefer-const": "error",
- "prefer-spread": "error",
- "quote-props": ["error", "consistent-as-needed"],
- "semi": [2, "always"],
- "template-curly-spacing": "error",
- "valid-jsdoc": "off",
-
- "require-jsdoc": 0,
- "valid-jsdoc": 0,
- "jsdoc/check-alignment": 2,
- "jsdoc/check-examples": 0,
- "jsdoc/check-indentation": 0,
- "jsdoc/check-param-names": 0,
- "jsdoc/check-syntax": 0,
- "jsdoc/check-tag-names": 0,
- "jsdoc/check-types": 0,
- "jsdoc/implements-on-classes": 2,
- "jsdoc/match-description": 0,
- "jsdoc/newline-after-description": 2,
- "jsdoc/no-types": 0,
- "jsdoc/no-undefined-types": 0,
- "jsdoc/require-description": 0,
- "jsdoc/require-description-complete-sentence": 0,
- "jsdoc/require-example": 0,
- "jsdoc/require-hyphen-before-param-description": 0,
- "jsdoc/require-jsdoc": 0,
- "jsdoc/require-param": 0,
- "jsdoc/require-param-description": 0,
- "jsdoc/require-param-name": 2,
- "jsdoc/require-param-type": 2,
- "jsdoc/require-returns": 0,
- "jsdoc/require-returns-check": 0,
- "jsdoc/require-returns-description": 0,
- "jsdoc/require-returns-type": 2,
- "jsdoc/valid-types": 2,
- "jsdoc/require-file-overview": ["error", {
- "tags": {
- "license": {
- "mustExist": true,
- "preventDuplicates": true
- }
- }
- }],
- "import/named": 2,
- "import/no-unresolved": 2,
- "import/no-self-import": 2,
- // The no-cycle rule is slow, because it doesn't cache dependencies.
- // Disable it.
- "import/no-cycle": 0,
- "import/no-useless-path-segments": 2,
- "import/no-unused-modules": 2,
- "import/no-default-export": 2
- },
- "plugins": [
- "html",
- "jsdoc",
- "import"
- ],
- "settings": {
- "html/report-bad-indent": "error"
- },
- "overrides": [
- {
- "files": ["*_html.js", "*-styles.js", "externs.js"],
- "rules": {
- "max-len": "off"
- }
- },
- {
- "files": ["*.html"],
- "rules": {
- "jsdoc/require-file-overview": "off"
- }
- }
- ]
-}
diff --git a/.gitignore b/.gitignore
index 4c0afce..81322bc 100644
--- a/.gitignore
+++ b/.gitignore
@@ -4,3 +4,4 @@
/.settings
/bazel-*
/eclipse-out
+/node_modules
diff --git a/BUILD b/BUILD
index d560d98..47d5db0 100644
--- a/BUILD
+++ b/BUILD
@@ -1,5 +1,4 @@
load("@rules_java//java:defs.bzl", "java_library")
-load("@npm//@bazel/rollup:index.bzl", "rollup_bundle")
load("//tools/bzl:junit.bzl", "junit_tests")
load("//tools/js:eslint.bzl", "eslint")
load(
@@ -8,8 +7,8 @@
"PLUGIN_TEST_DEPS",
"gerrit_plugin",
)
-load("//tools/bzl:genrule2.bzl", "genrule2")
-load("//tools/bzl:js.bzl", "polygerrit_plugin")
+load("//tools/bzl:js.bzl", "gerrit_js_bundle")
+load("@npm//@bazel/typescript:index.bzl", "ts_config", "ts_project")
gerrit_plugin(
name = "delete-project",
@@ -20,41 +19,39 @@
"Gerrit-HttpModule: com.googlesource.gerrit.plugins.deleteproject.HttpModule",
"Gerrit-SshModule: com.googlesource.gerrit.plugins.deleteproject.SshModule",
],
- resource_jars = [":gr-delete-repo-static"],
+ resource_jars = [":gr-delete-repo"],
resources = glob(["src/main/resources/Documentation/*.md"]),
deps = ["@commons-io//jar"],
)
-genrule2(
- name = "gr-delete-repo-static",
- srcs = [":gr-delete-repo"],
- outs = ["gr-delete-repo-static.jar"],
- cmd = " && ".join([
- "mkdir $$TMP/static",
- "cp $(locations :gr-delete-repo) $$TMP/static",
- "cd $$TMP",
- "zip -Drq $$ROOT/$@ -g .",
- ]),
-)
-
-polygerrit_plugin(
- name = "gr-delete-repo",
- app = "delete-project-bundle.js",
- plugin_name = "delete-project",
-)
-
-rollup_bundle(
- name = "delete-project-bundle",
- srcs = glob(["gr-delete-repo/*.js"]),
- entry_point = "gr-delete-repo/plugin.js",
- format = "iife",
- rollup_bin = "//tools/node_tools:rollup-bin",
- sourcemap = "hidden",
+ts_config(
+ name = "tsconfig",
+ src = "tsconfig.json",
deps = [
- "@tools_npm//rollup-plugin-node-resolve",
+ "//plugins:tsconfig-plugins-base.json",
],
)
+ts_project(
+ name = "gr-delete-repo-ts",
+ srcs = glob([
+ "gr-delete-repo/**/*.ts",
+ ]),
+ incremental = True,
+ tsc = "//tools/node_tools:tsc-bin",
+ tsconfig = ":tsconfig",
+ deps = [
+ "@plugins_npm//@gerritcodereview/typescript-api",
+ "@plugins_npm//lit",
+ ],
+)
+
+gerrit_js_bundle(
+ name = "gr-delete-repo",
+ srcs = [":gr-delete-repo-ts"],
+ entry_point = "gr-delete-repo/plugin.js",
+)
+
junit_tests(
name = "delete-project_tests",
srcs = glob(["src/test/java/**/*.java"]),
@@ -75,23 +72,27 @@
],
)
-# Define the eslinter for the plugin
-# The eslint macro creates 2 rules: lint_test and lint_bin
+# The eslint macro creates 2 rules: lint_test and lint_bin. Typical usage:
+# bazel test $DIR:lint_test
+# bazel run $DIR:lint_bin -- --fix $PATH_TO_SRCS
eslint(
name = "lint",
- srcs = glob([
- "gr-delete-repo/**/*.js",
- ]),
- config = ".eslintrc.json",
- data = [],
- extensions = [
- ".js",
+ srcs = glob(["gr-delete-repo/**/*"]),
+ config = ".eslintrc.js",
+ data = [
+ "tsconfig.json",
+ "//plugins:.eslintrc.js",
+ "//plugins:.prettierrc.js",
+ "//plugins:tsconfig-plugins-base.json",
],
- ignore = ".eslintignore",
+ extensions = [".ts"],
+ ignore = "//plugins:.eslintignore",
plugins = [
"@npm//eslint-config-google",
"@npm//eslint-plugin-html",
"@npm//eslint-plugin-import",
"@npm//eslint-plugin-jsdoc",
+ "@npm//eslint-plugin-prettier",
+ "@npm//gts",
],
)
diff --git a/gr-delete-repo/gr-delete-repo.js b/gr-delete-repo/gr-delete-repo.js
deleted file mode 100644
index 20c3555..0000000
--- a/gr-delete-repo/gr-delete-repo.js
+++ /dev/null
@@ -1,83 +0,0 @@
-/**
- * @license
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import {htmlTemplate} from './gr-delete-repo_html.js';
-
-class GrDeleteRepo extends Polymer.Element {
- /** @returns {string} name of the component */
- static get is() { return 'gr-delete-repo'; }
-
- /** @returns {?} template for this component */
- static get template() { return htmlTemplate; }
-
- /**
- * Defines properties of the component
- *
- * @returns {?}
- */
- static get properties() {
- return {
- repoName: String,
- config: Object,
- action: Object,
- actionId: String,
- };
- }
-
- connectedCallback() {
- super.connectedCallback();
- this.actionId = this.plugin.getPluginName() + '~delete';
- this.action = this.config.actions[this.actionId];
- this.hidden = !this.action;
- }
-
- _handleCommandTap() {
- this.$.deleteRepoOverlay.open();
- }
-
- _handleCloseDeleteRepo() {
- this.$.deleteRepoOverlay.close();
- }
-
- _handleDeleteRepo() {
- const endpoint = '/projects/' +
- encodeURIComponent(this.repoName) + '/' +
- this.actionId;
-
- const json = {
- force: this.$.forceDeleteOpenChangesCheckBox.checked,
- preserve: this.$.preserveGitRepoCheckBox.checked,
- };
-
- const errFn = response => {
- this.dispatchEvent(new CustomEvent('page-error', {
- detail: {response},
- bubbles: true,
- composed: true,
- }));
- };
-
- return this.plugin.restApi().send(
- this.action.method, endpoint, json, errFn)
- .then(r => {
- this.plugin.restApi().invalidateReposCache();
- Gerrit.Nav.navigateToRelativeUrl('/admin/repos');
- });
- }
-}
-
-customElements.define(GrDeleteRepo.is, GrDeleteRepo);
diff --git a/gr-delete-repo/gr-delete-repo.ts b/gr-delete-repo/gr-delete-repo.ts
new file mode 100644
index 0000000..e16cefb
--- /dev/null
+++ b/gr-delete-repo/gr-delete-repo.ts
@@ -0,0 +1,173 @@
+/**
+ * @license
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+import {PluginApi} from '@gerritcodereview/typescript-api/plugin';
+import {
+ ActionInfo,
+ ConfigInfo,
+ RepoName,
+} from '@gerritcodereview/typescript-api/rest-api';
+import {css, html, LitElement} from 'lit';
+import {customElement, property, query, state} from 'lit/decorators';
+
+// TODO: This should be defined and exposed by @gerritcodereview/typescript-api
+type GrOverlay = Element & {
+ open(): void;
+ close(): void;
+};
+
+declare global {
+ interface HTMLElementTagNameMap {
+ 'gr-delete-repo': GrDeleteRepo;
+ }
+}
+
+@customElement('gr-delete-repo')
+class GrDeleteRepo extends LitElement {
+ @query('#deleteRepoOverlay')
+ deleteRepoOverlay?: GrOverlay;
+
+ @query('#preserveGitRepoCheckBox')
+ preserveGitRepoCheckBox?: HTMLInputElement;
+
+ @query('#forceDeleteOpenChangesCheckBox')
+ forceDeleteOpenChangesCheckBox?: HTMLInputElement;
+
+ /** Guaranteed to be provided by the 'repo-command' endpoint. */
+ @property({type: Object})
+ plugin!: PluginApi;
+
+ /** Guaranteed to be provided by the 'repo-command' endpoint. */
+ @property({type: Object})
+ config!: ConfigInfo;
+
+ /** Guaranteed to be provided by the 'repo-command' endpoint. */
+ @property({type: String})
+ repoName!: RepoName;
+
+ @state()
+ private error?: string;
+
+ static styles = css`
+ :host {
+ display: block;
+ margin-bottom: var(--spacing-xxl);
+ }
+ /* TODO: Find a way to use shared styles in lit elements in plugins. */
+ h3 {
+ font: inherit;
+ margin: 0;
+ }
+ .error {
+ color: red;
+ }
+ `;
+
+ get action(): ActionInfo | undefined {
+ return this.config.actions?.[this.actionId];
+ }
+
+ get actionId(): string {
+ return `${this.plugin.getPluginName()}~delete`;
+ }
+
+ private renderError() {
+ if (!this.error) return;
+ return html`<div class="error">${this.error}</div>`;
+ }
+
+ protected render() {
+ if (!this.action) return;
+ return html`
+ <h3>${this.action.label}</h3>
+ <gr-button
+ title="${this.action.title}"
+ ?disabled="${!this.action.enabled}"
+ @click="${() => {
+ this.error = undefined;
+ this.deleteRepoOverlay?.open();
+ }}"
+ >
+ ${this.action.label}
+ </gr-button>
+ ${this.renderError()}
+ <gr-overlay id="deleteRepoOverlay" with-backdrop>
+ <gr-dialog
+ id="deleteRepoDialog"
+ confirm-label="Delete"
+ @confirm="${this.deleteRepo}"
+ @cancel="${() => this.deleteRepoOverlay?.close()}"
+ >
+ <div class="header" slot="header">
+ Are you really sure you want to delete the repo: "${this.repoName}"?
+ </div>
+ <div class="main" slot="main">
+ <div>
+ <div id="form">
+ <section>
+ <input type="checkbox" id="forceDeleteOpenChangesCheckBox" />
+ <label for="forceDeleteOpenChangesCheckBox"
+ >Delete repo even if open changes exist?</label
+ >
+ </section>
+ <section>
+ <input type="checkbox" id="preserveGitRepoCheckBox" />
+ <label for="preserveGitRepoCheckBox"
+ >Preserve GIT Repository?</label
+ >
+ </section>
+ </div>
+ </div>
+ </div>
+ </gr-dialog>
+ </gr-overlay>
+ `;
+ }
+
+ private deleteRepo() {
+ if (!this.action) {
+ this.error = 'delete action undefined';
+ this.deleteRepoOverlay?.close();
+ return;
+ }
+ if (!this.action.method) {
+ this.error = 'delete action does not have a HTTP method set';
+ this.deleteRepoOverlay?.close();
+ return;
+ }
+ this.error = undefined;
+
+ const endpoint = `/projects/${encodeURIComponent(this.repoName)}/${
+ this.actionId
+ }`;
+ const json = {
+ force: this.forceDeleteOpenChangesCheckBox?.checked ?? false,
+ preserve: this.preserveGitRepoCheckBox?.checked ?? false,
+ };
+ return this.plugin
+ .restApi()
+ .send(this.action.method, endpoint, json)
+ .then(_ => {
+ this.plugin.restApi().invalidateReposCache();
+ this.deleteRepoOverlay?.close();
+ window.location.href = '/admin/repos';
+ })
+ .catch(e => {
+ this.error = e;
+ this.deleteRepoOverlay?.close();
+ });
+ }
+}
diff --git a/gr-delete-repo/gr-delete-repo_html.js b/gr-delete-repo/gr-delete-repo_html.js
deleted file mode 100644
index e3a985d..0000000
--- a/gr-delete-repo/gr-delete-repo_html.js
+++ /dev/null
@@ -1,66 +0,0 @@
-/**
- * @license
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-export const htmlTemplate = Polymer.html`
- <style include="shared-styles"></style>
- <style include="gr-form-styles">
- :host {
- display: block;
- margin-bottom: var(--spacing-xxl);
- }
- </style>
- <h3 class="heading-3">
- [[action.label]]
- </h3>
- <gr-button
- title="[[action.title]]"
- loading="[[_deleting]]"
- disabled="[[!action.enabled]]"
- on-click="_handleCommandTap"
- >
- [[action.label]]
- </gr-button>
- <gr-overlay id="deleteRepoOverlay" with-backdrop>
- <gr-dialog
- id="deleteRepoDialog"
- confirm-label="Delete"
- on-confirm="_handleDeleteRepo"
- on-cancel="_handleCloseDeleteRepo">
- <div class="header" slot="header">
- Are you really sure you want to delete the repo: "[[repoName]]"?
- </div>
- <div class="main" slot="main">
- <div class="gr-form-styles">
- <div id="form">
- <section>
- <input
- type="checkbox"
- id="forceDeleteOpenChangesCheckBox">
- <label for="forceDeleteOpenChangesCheckBox">Delete repo even if open changes exist?</label>
- </section>
- <section>
- <input
- type="checkbox"
- id="preserveGitRepoCheckBox">
- <label for="preserveGitRepoCheckBox">Preserve GIT Repository?</label>
- </section>
- </div>
- </div>
- </div>
- </gr-dialog>
- </gr-overlay>
-`;
diff --git a/gr-delete-repo/plugin.js b/gr-delete-repo/plugin.ts
similarity index 77%
rename from gr-delete-repo/plugin.js
rename to gr-delete-repo/plugin.ts
index 2e22d59..7355b50 100644
--- a/gr-delete-repo/plugin.js
+++ b/gr-delete-repo/plugin.ts
@@ -14,9 +14,9 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-import './gr-delete-repo.js';
+import '@gerritcodereview/typescript-api/gerrit';
+import './gr-delete-repo';
-Gerrit.install(plugin => {
- plugin.registerCustomComponent(
- 'repo-command', 'gr-delete-repo');
+window.Gerrit.install(plugin => {
+ plugin.registerCustomComponent('repo-command', 'gr-delete-repo');
});
diff --git a/src/main/java/com/googlesource/gerrit/plugins/deleteproject/HttpModule.java b/src/main/java/com/googlesource/gerrit/plugins/deleteproject/HttpModule.java
index a41a374..563b1ab 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/deleteproject/HttpModule.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/deleteproject/HttpModule.java
@@ -23,6 +23,6 @@
@Override
protected void configureServlets() {
DynamicSet.bind(binder(), WebUiPlugin.class)
- .toInstance(new JavaScriptPlugin("delete-project.html"));
+ .toInstance(new JavaScriptPlugin("gr-delete-repo.js"));
}
}
diff --git a/src/test/java/com/googlesource/gerrit/plugins/deleteproject/DeletePreconditionsTest.java b/src/test/java/com/googlesource/gerrit/plugins/deleteproject/DeletePreconditionsTest.java
index e126c19..dcb45ab 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/deleteproject/DeletePreconditionsTest.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/deleteproject/DeletePreconditionsTest.java
@@ -14,6 +14,15 @@
package com.googlesource.gerrit.plugins.deleteproject;
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.gerrit.testing.GerritJUnit.assertThrows;
+import static com.googlesource.gerrit.plugins.deleteproject.DeleteOwnProjectCapability.DELETE_OWN_PROJECT;
+import static com.googlesource.gerrit.plugins.deleteproject.DeleteProjectCapability.DELETE_PROJECT;
+import static org.mockito.Mockito.doNothing;
+import static org.mockito.Mockito.doThrow;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
import com.google.common.collect.ImmutableList;
import com.google.gerrit.entities.Project;
import com.google.gerrit.exceptions.StorageException;
@@ -41,15 +50,6 @@
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;
-import static com.google.common.truth.Truth.assertThat;
-import static com.google.gerrit.testing.GerritJUnit.assertThrows;
-import static com.googlesource.gerrit.plugins.deleteproject.DeleteOwnProjectCapability.DELETE_OWN_PROJECT;
-import static com.googlesource.gerrit.plugins.deleteproject.DeleteProjectCapability.DELETE_PROJECT;
-import static org.mockito.Mockito.doNothing;
-import static org.mockito.Mockito.doThrow;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-
@RunWith(MockitoJUnitRunner.class)
public class DeletePreconditionsTest {
private static final String PLUGIN_NAME = "delete-project";
diff --git a/tsconfig.json b/tsconfig.json
new file mode 100644
index 0000000..9be4292
--- /dev/null
+++ b/tsconfig.json
@@ -0,0 +1,6 @@
+{
+ "extends": "../tsconfig-plugins-base.json",
+ "include": [
+ "gr-delete-repo/**/*",
+ ]
+}