This is an automated email from the ASF dual-hosted git repository.
chanholee pushed a commit to branch branch-0.12
in repository https://gitbox.apache.org/repos/asf/zeppelin.git
The following commit(s) were added to refs/heads/branch-0.12 by this push:
new a7a44e62d9 [ZEPPELIN-6301] Add tslint custom rule about ensure the
order in constructor
a7a44e62d9 is described below
commit a7a44e62d925aeb12961062be84db01d835732e3
Author: YONGJAE LEE(이용재) <[email protected]>
AuthorDate: Sat Aug 30 23:40:45 2025 +0900
[ZEPPELIN-6301] Add tslint custom rule about ensure the order in constructor
### What is this PR for?
https://github.com/apache/zeppelin/pull/5045#discussion_r2300816684
Following above PR, I received feedback from a committer suggesting that
constructor parameters should be ordered as public → protected → private.
I found it deeply but there was no existing TSLint rule for this, So I
implemented a custom rule.
([zeppelin-web-angular/tslint-rules/constructorParamsOrderRule.ts](https://github.com/apache/zeppelin/pull/5053/files#diff-2e35dbfe878aa60da74ba9c5399ab6e1ea53eef07a47aef0bc7ff0f95651f31b))
It works as intended, and I ran lint --fix with the new rule and confirmed
that it was applied correctly. The modified files are also included in this PR.
If you want to test it just follow below command.
```sh
// Base Dir: ./zeppelin/zeppelin-web-angular
npm run lint
```
or
```sh
// Base Dir: ./zeppelin/zeppelin-web-angular
npx tslint -c tslint.json 'src/**/*.ts' --fix
```
You can build the lint rule file using the command below
```sh
// Base Dir: ./zeppelin/zeppelin-web-angular/tslint-rules
npx tsc constructorParamsOrderRule.ts
```
### What type of PR is it?
Improvement
### Todos
### What is the Jira issue?
* [[ZEPPELIN-6301](https://issues.apache.org/jira/browse/ZEPPELIN-6301)]
### How should this be tested?
### Screenshots (if appropriate)
### Questions:
* Does the license files need to update? N
* Is there breaking changes for older versions? N
* Does this needs documentation? N
Closes #5053 from dididy/fix/ZEPPELIN-6301.
Signed-off-by: ChanHo Lee <[email protected]>
(cherry picked from commit f4f8a72a5f3f29fb1086f1dc9e8eb31cb40f8e18)
Signed-off-by: ChanHo Lee <[email protected]>
---
.gitignore | 1 +
zeppelin-web-angular/package.json | 3 +-
.../helium-vis-example/src/json-visualization.ts | 9 +-
.../zeppelin-helium/src/zeppelin-helium.service.ts | 4 +-
.../notebook/action-bar/action-bar.component.ts | 2 +-
.../pages/workspace/notebook/notebook.component.ts | 4 +-
.../notebook/paragraph/paragraph.component.ts | 10 +-
.../published/paragraph/paragraph.component.ts | 6 +-
.../src/app/services/configuration.service.ts | 2 +-
.../src/app/services/credential.service.ts | 2 +-
.../src/app/services/interpreter.service.ts | 2 +-
.../src/app/services/job-manager.service.ts | 2 +-
.../src/app/services/notebook-repos.service.ts | 2 +-
.../src/app/services/notebook.service.ts | 2 +-
.../src/app/services/security.service.ts | 2 +-
.../src/app/share/header/header.component.ts | 2 +-
.../src/app/share/node-list/node-list.component.ts | 2 +-
.../app/share/note-import/note-import.component.ts | 2 +-
.../area-chart/area-chart-visualization.ts | 2 +-
.../bar-chart/bar-chart-visualization.ts | 2 +-
.../line-chart/line-chart-visualization.ts | 2 +-
.../pie-chart/pie-chart-visualization.ts | 2 +-
.../scatter-chart/scatter-chart-visualization.ts | 2 +-
.../visualizations/table/table-visualization.ts | 2 +-
.../tslint-rules/constructorParamsOrderRule.ts | 119 +++++++++++++++++++++
zeppelin-web-angular/tslint.json | 5 +-
26 files changed, 159 insertions(+), 36 deletions(-)
diff --git a/.gitignore b/.gitignore
index 7ab3b86337..a77b3b5db6 100644
--- a/.gitignore
+++ b/.gitignore
@@ -50,6 +50,7 @@ zeppelin-web/npm-debug.log
zeppelin-web/yarn-error.log
zeppelin-web/bower_components
zeppelin-web/yarn.lock
+zeppelin-web-angular/tslint-rules/*.js
**nbproject/
**node/
diff --git a/zeppelin-web-angular/package.json
b/zeppelin-web-angular/package.json
index 317766254b..1a418855e4 100644
--- a/zeppelin-web-angular/package.json
+++ b/zeppelin-web-angular/package.json
@@ -2,10 +2,11 @@
"name": "zeppelin",
"version": "0.0.0",
"scripts": {
- "postinstall": "npm run build:projects",
+ "postinstall": "npm run build:projects && npm run build:tslint-rules",
"ng": "./node_modules/.bin/ng",
"start": "ng serve --proxy-config proxy.conf.js --extra-webpack-config
webpack.partial.js",
"build": "ng build --prod --extra-webpack-config webpack.partial.js",
+ "build:tslint-rules": "tsc tslint-rules/*.ts --types node",
"build:projects": "npm run build-project:sdk && npm run build-project:vis
&& npm run build-project:helium",
"build-helium-vis-example": " ng build --project helium-vis-example",
"build-project:sdk": " ng build --project zeppelin-sdk",
diff --git
a/zeppelin-web-angular/projects/helium-vis-example/src/json-visualization.ts
b/zeppelin-web-angular/projects/helium-vis-example/src/json-visualization.ts
index d00299e27b..1e63eee1b7 100644
--- a/zeppelin-web-angular/projects/helium-vis-example/src/json-visualization.ts
+++ b/zeppelin-web-angular/projects/helium-vis-example/src/json-visualization.ts
@@ -32,10 +32,11 @@ export class JsonVisualization extends
Visualization<JsonVisComponent> {
this.viewContainerRef,
this.componentFactoryResolver
);
- constructor(config: GraphConfig,
- private portalOutlet: CdkPortalOutlet,
- private viewContainerRef: ViewContainerRef,
- private componentFactoryResolver?: ComponentFactoryResolver) {
+ constructor(
+ private portalOutlet: CdkPortalOutlet,
+ private viewContainerRef: ViewContainerRef,
+ config: GraphConfig,
+ private componentFactoryResolver?: ComponentFactoryResolver) {
super(config);
}
diff --git
a/zeppelin-web-angular/projects/zeppelin-helium/src/zeppelin-helium.service.ts
b/zeppelin-web-angular/projects/zeppelin-helium/src/zeppelin-helium.service.ts
index f650202ec2..42b339c8a5 100644
---
a/zeppelin-web-angular/projects/zeppelin-helium/src/zeppelin-helium.service.ts
+++
b/zeppelin-web-angular/projects/zeppelin-helium/src/zeppelin-helium.service.ts
@@ -27,9 +27,9 @@ export class ZeppelinHeliumPackage {
public module: Type<any>,
// tslint:disable-next-line:no-any
public component: Type<any>,
+ public icon = 'build',
// tslint:disable-next-line:no-any
- public visualization?: any,
- public icon = 'build'
+ public visualization?: any
) {
}
}
diff --git
a/zeppelin-web-angular/src/app/pages/workspace/notebook/action-bar/action-bar.component.ts
b/zeppelin-web-angular/src/app/pages/workspace/notebook/action-bar/action-bar.component.ts
index dd3e70ee5c..3dfa8c5871 100644
---
a/zeppelin-web-angular/src/app/pages/workspace/notebook/action-bar/action-bar.component.ts
+++
b/zeppelin-web-angular/src/app/pages/workspace/notebook/action-bar/action-bar.component.ts
@@ -287,6 +287,7 @@ export class NotebookActionBarComponent extends
MessageListenersManager implemen
constructor(
public messageService: MessageService,
+ @Inject(TRASH_FOLDER_ID_TOKEN) public TRASH_FOLDER_ID: string,
private nzModalService: NzModalService,
private ticketService: TicketService,
private nzMessageService: NzMessageService,
@@ -294,7 +295,6 @@ export class NotebookActionBarComponent extends
MessageListenersManager implemen
private cdr: ChangeDetectorRef,
private noteStatusService: NoteStatusService,
private notebookService: NotebookService,
- @Inject(TRASH_FOLDER_ID_TOKEN) public TRASH_FOLDER_ID: string,
private activatedRoute: ActivatedRoute,
private saveAsService: SaveAsService
) {
diff --git
a/zeppelin-web-angular/src/app/pages/workspace/notebook/notebook.component.ts
b/zeppelin-web-angular/src/app/pages/workspace/notebook/notebook.component.ts
index 07e433d0f1..4bf9cae4f6 100644
---
a/zeppelin-web-angular/src/app/pages/workspace/notebook/notebook.component.ts
+++
b/zeppelin-web-angular/src/app/pages/workspace/notebook/notebook.component.ts
@@ -395,15 +395,15 @@ export class NotebookComponent extends
MessageListenersManager implements OnInit
}
constructor(
- private activatedRoute: ActivatedRoute,
public messageService: MessageService,
+ protected ngZService: NgZService,
+ private activatedRoute: ActivatedRoute,
private cdr: ChangeDetectorRef,
private noteStatusService: NoteStatusService,
private noteVarShareService: NoteVarShareService,
private ticketService: TicketService,
private securityService: SecurityService,
private router: Router,
- protected ngZService: NgZService,
private titleService: Title
) {
super(messageService);
diff --git
a/zeppelin-web-angular/src/app/pages/workspace/notebook/paragraph/paragraph.component.ts
b/zeppelin-web-angular/src/app/pages/workspace/notebook/paragraph/paragraph.component.ts
index 8baa6543cd..1d9cb4675f 100644
---
a/zeppelin-web-angular/src/app/pages/workspace/notebook/paragraph/paragraph.component.ts
+++
b/zeppelin-web-angular/src/app/pages/workspace/notebook/paragraph/paragraph.component.ts
@@ -432,15 +432,15 @@ export class NotebookParagraphComponent extends
ParagraphBase implements OnInit,
}
constructor(
- noteStatusService: NoteStatusService,
- cdr: ChangeDetectorRef,
- ngZService: NgZService,
- private heliumService: HeliumService,
public messageService: MessageService,
+ private heliumService: HeliumService,
private nzModalService: NzModalService,
private noteVarShareService: NoteVarShareService,
private shortcutService: ShortcutService,
- private host: ElementRef
+ private host: ElementRef,
+ noteStatusService: NoteStatusService,
+ cdr: ChangeDetectorRef,
+ ngZService: NgZService
) {
super(messageService, noteStatusService, ngZService, cdr);
}
diff --git
a/zeppelin-web-angular/src/app/pages/workspace/published/paragraph/paragraph.component.ts
b/zeppelin-web-angular/src/app/pages/workspace/published/paragraph/paragraph.component.ts
index 4aa020aa26..73ec31380a 100644
---
a/zeppelin-web-angular/src/app/pages/workspace/published/paragraph/paragraph.component.ts
+++
b/zeppelin-web-angular/src/app/pages/workspace/published/paragraph/paragraph.component.ts
@@ -37,11 +37,11 @@ export class PublishedParagraphComponent extends
ParagraphBase implements Publis
constructor(
public messageService: MessageService,
+ private activatedRoute: ActivatedRoute,
+ private heliumService: HeliumService,
noteStatusService: NoteStatusService,
ngZService: NgZService,
- cdr: ChangeDetectorRef,
- private activatedRoute: ActivatedRoute,
- private heliumService: HeliumService
+ cdr: ChangeDetectorRef
) {
super(messageService, noteStatusService, ngZService, cdr);
this.activatedRoute.params.subscribe(params => {
diff --git a/zeppelin-web-angular/src/app/services/configuration.service.ts
b/zeppelin-web-angular/src/app/services/configuration.service.ts
index b8c392f0ff..d409083c06 100644
--- a/zeppelin-web-angular/src/app/services/configuration.service.ts
+++ b/zeppelin-web-angular/src/app/services/configuration.service.ts
@@ -20,7 +20,7 @@ import { BaseUrlService } from './base-url.service';
providedIn: 'root'
})
export class ConfigurationService extends BaseRest {
- constructor(baseUrlService: BaseUrlService, private http: HttpClient) {
+ constructor(private http: HttpClient, baseUrlService: BaseUrlService) {
super(baseUrlService);
}
diff --git a/zeppelin-web-angular/src/app/services/credential.service.ts
b/zeppelin-web-angular/src/app/services/credential.service.ts
index 0e08f7b2d9..c08a383338 100644
--- a/zeppelin-web-angular/src/app/services/credential.service.ts
+++ b/zeppelin-web-angular/src/app/services/credential.service.ts
@@ -21,7 +21,7 @@ import { BaseUrlService } from './base-url.service';
providedIn: 'root'
})
export class CredentialService extends BaseRest {
- constructor(baseUrlService: BaseUrlService, private http: HttpClient) {
+ constructor(private http: HttpClient, baseUrlService: BaseUrlService) {
super(baseUrlService);
}
diff --git a/zeppelin-web-angular/src/app/services/interpreter.service.ts
b/zeppelin-web-angular/src/app/services/interpreter.service.ts
index 82f93bbfae..34379a0f5d 100644
--- a/zeppelin-web-angular/src/app/services/interpreter.service.ts
+++ b/zeppelin-web-angular/src/app/services/interpreter.service.ts
@@ -29,7 +29,7 @@ import { BaseUrlService } from './base-url.service';
providedIn: 'root'
})
export class InterpreterService extends BaseRest {
- constructor(baseUrlService: BaseUrlService, private http: HttpClient) {
+ constructor(private http: HttpClient, baseUrlService: BaseUrlService) {
super(baseUrlService);
}
diff --git a/zeppelin-web-angular/src/app/services/job-manager.service.ts
b/zeppelin-web-angular/src/app/services/job-manager.service.ts
index b61523219c..a47a6e60ea 100644
--- a/zeppelin-web-angular/src/app/services/job-manager.service.ts
+++ b/zeppelin-web-angular/src/app/services/job-manager.service.ts
@@ -20,7 +20,7 @@ import { BaseUrlService } from './base-url.service';
providedIn: 'root'
})
export class JobManagerService extends BaseRest {
- constructor(baseUrlService: BaseUrlService, private http: HttpClient) {
+ constructor(private http: HttpClient, baseUrlService: BaseUrlService) {
super(baseUrlService);
}
diff --git a/zeppelin-web-angular/src/app/services/notebook-repos.service.ts
b/zeppelin-web-angular/src/app/services/notebook-repos.service.ts
index 624599ae0f..42b1a90072 100644
--- a/zeppelin-web-angular/src/app/services/notebook-repos.service.ts
+++ b/zeppelin-web-angular/src/app/services/notebook-repos.service.ts
@@ -22,7 +22,7 @@ import { BaseUrlService } from './base-url.service';
providedIn: 'root'
})
export class NotebookRepoService extends BaseRest {
- constructor(baseUrlService: BaseUrlService, private http: HttpClient) {
+ constructor(private http: HttpClient, baseUrlService: BaseUrlService) {
super(baseUrlService);
}
diff --git a/zeppelin-web-angular/src/app/services/notebook.service.ts
b/zeppelin-web-angular/src/app/services/notebook.service.ts
index 93d5a7a933..ac4c825d3d 100644
--- a/zeppelin-web-angular/src/app/services/notebook.service.ts
+++ b/zeppelin-web-angular/src/app/services/notebook.service.ts
@@ -24,7 +24,7 @@ import { BehaviorSubject } from 'rxjs';
export class NotebookService extends BaseRest {
private queryStr$ = new BehaviorSubject<string | null>(null);
- constructor(baseUrlService: BaseUrlService, private http: HttpClient) {
+ constructor(private http: HttpClient, baseUrlService: BaseUrlService) {
super(baseUrlService);
}
diff --git a/zeppelin-web-angular/src/app/services/security.service.ts
b/zeppelin-web-angular/src/app/services/security.service.ts
index c267ad05fa..46c77ec3c1 100644
--- a/zeppelin-web-angular/src/app/services/security.service.ts
+++ b/zeppelin-web-angular/src/app/services/security.service.ts
@@ -22,7 +22,7 @@ import { BaseUrlService } from './base-url.service';
providedIn: 'root'
})
export class SecurityService extends BaseRest {
- constructor(baseUrlService: BaseUrlService, private http: HttpClient) {
+ constructor(private http: HttpClient, baseUrlService: BaseUrlService) {
super(baseUrlService);
}
diff --git a/zeppelin-web-angular/src/app/share/header/header.component.ts
b/zeppelin-web-angular/src/app/share/header/header.component.ts
index f1a1982db2..78a7da185f 100644
--- a/zeppelin-web-angular/src/app/share/header/header.component.ts
+++ b/zeppelin-web-angular/src/app/share/header/header.component.ts
@@ -66,8 +66,8 @@ export class HeaderComponent extends MessageListenersManager
implements OnInit,
constructor(
public ticketService: TicketService,
- private nzModalService: NzModalService,
public messageService: MessageService,
+ private nzModalService: NzModalService,
private router: Router,
private notebookService: NotebookService,
private cdr: ChangeDetectorRef
diff --git
a/zeppelin-web-angular/src/app/share/node-list/node-list.component.ts
b/zeppelin-web-angular/src/app/share/node-list/node-list.component.ts
index 12b52d69f5..ca40098241 100644
--- a/zeppelin-web-angular/src/app/share/node-list/node-list.component.ts
+++ b/zeppelin-web-angular/src/app/share/node-list/node-list.component.ts
@@ -135,9 +135,9 @@ export class NodeListComponent extends
MessageListenersManager implements OnInit
}
constructor(
- private noteListService: NoteListService,
public messageService: MessageService,
@Inject(TRASH_FOLDER_ID_TOKEN) public TRASH_FOLDER_ID: string,
+ private noteListService: NoteListService,
private nzModalService: NzModalService,
private noteActionService: NoteActionService,
private cdr: ChangeDetectorRef
diff --git
a/zeppelin-web-angular/src/app/share/note-import/note-import.component.ts
b/zeppelin-web-angular/src/app/share/note-import/note-import.component.ts
index cdef448fea..32294cb5ee 100644
--- a/zeppelin-web-angular/src/app/share/note-import/note-import.component.ts
+++ b/zeppelin-web-angular/src/app/share/note-import/note-import.component.ts
@@ -101,8 +101,8 @@ export class NoteImportComponent extends
MessageListenersManager implements OnIn
}
constructor(
- private ticketService: TicketService,
public messageService: MessageService,
+ private ticketService: TicketService,
private cdr: ChangeDetectorRef,
private nzModalRef: NzModalRef,
private httpClient: HttpClient
diff --git
a/zeppelin-web-angular/src/app/visualizations/area-chart/area-chart-visualization.ts
b/zeppelin-web-angular/src/app/visualizations/area-chart/area-chart-visualization.ts
index a7f1b481c6..4950a3d916 100644
---
a/zeppelin-web-angular/src/app/visualizations/area-chart/area-chart-visualization.ts
+++
b/zeppelin-web-angular/src/app/visualizations/area-chart/area-chart-visualization.ts
@@ -26,7 +26,7 @@ export class AreaChartVisualization extends
G2VisualizationBase {
this.viewContainerRef
);
- constructor(config: GraphConfig, private portalOutlet: CdkPortalOutlet,
private viewContainerRef: ViewContainerRef) {
+ constructor(private portalOutlet: CdkPortalOutlet, private viewContainerRef:
ViewContainerRef, config: GraphConfig) {
super(config);
}
}
diff --git
a/zeppelin-web-angular/src/app/visualizations/bar-chart/bar-chart-visualization.ts
b/zeppelin-web-angular/src/app/visualizations/bar-chart/bar-chart-visualization.ts
index 736e43dadd..5ad9364603 100644
---
a/zeppelin-web-angular/src/app/visualizations/bar-chart/bar-chart-visualization.ts
+++
b/zeppelin-web-angular/src/app/visualizations/bar-chart/bar-chart-visualization.ts
@@ -25,7 +25,7 @@ export class BarChartVisualization extends
G2VisualizationBase {
this.portalOutlet,
this.viewContainerRef
);
- constructor(config: GraphConfig, private portalOutlet: CdkPortalOutlet,
private viewContainerRef: ViewContainerRef) {
+ constructor(private portalOutlet: CdkPortalOutlet, private viewContainerRef:
ViewContainerRef, config: GraphConfig) {
super(config);
}
}
diff --git
a/zeppelin-web-angular/src/app/visualizations/line-chart/line-chart-visualization.ts
b/zeppelin-web-angular/src/app/visualizations/line-chart/line-chart-visualization.ts
index 0be29c7676..dc5289e48b 100644
---
a/zeppelin-web-angular/src/app/visualizations/line-chart/line-chart-visualization.ts
+++
b/zeppelin-web-angular/src/app/visualizations/line-chart/line-chart-visualization.ts
@@ -26,7 +26,7 @@ export class LineChartVisualization extends
G2VisualizationBase {
this.viewContainerRef
);
- constructor(config: GraphConfig, private portalOutlet: CdkPortalOutlet,
private viewContainerRef: ViewContainerRef) {
+ constructor(private portalOutlet: CdkPortalOutlet, private viewContainerRef:
ViewContainerRef, config: GraphConfig) {
super(config);
}
}
diff --git
a/zeppelin-web-angular/src/app/visualizations/pie-chart/pie-chart-visualization.ts
b/zeppelin-web-angular/src/app/visualizations/pie-chart/pie-chart-visualization.ts
index d70572dda1..675d03f552 100644
---
a/zeppelin-web-angular/src/app/visualizations/pie-chart/pie-chart-visualization.ts
+++
b/zeppelin-web-angular/src/app/visualizations/pie-chart/pie-chart-visualization.ts
@@ -26,7 +26,7 @@ export class PieChartVisualization extends
G2VisualizationBase {
this.viewContainerRef
);
- constructor(config: GraphConfig, private portalOutlet: CdkPortalOutlet,
private viewContainerRef: ViewContainerRef) {
+ constructor(private portalOutlet: CdkPortalOutlet, private viewContainerRef:
ViewContainerRef, config: GraphConfig) {
super(config);
}
}
diff --git
a/zeppelin-web-angular/src/app/visualizations/scatter-chart/scatter-chart-visualization.ts
b/zeppelin-web-angular/src/app/visualizations/scatter-chart/scatter-chart-visualization.ts
index 0bfafab328..90d893d001 100644
---
a/zeppelin-web-angular/src/app/visualizations/scatter-chart/scatter-chart-visualization.ts
+++
b/zeppelin-web-angular/src/app/visualizations/scatter-chart/scatter-chart-visualization.ts
@@ -26,7 +26,7 @@ export class ScatterChartVisualization extends
G2VisualizationBase {
this.viewContainerRef
);
- constructor(config: GraphConfig, private portalOutlet: CdkPortalOutlet,
private viewContainerRef: ViewContainerRef) {
+ constructor(private portalOutlet: CdkPortalOutlet, private viewContainerRef:
ViewContainerRef, config: GraphConfig) {
super(config);
}
}
diff --git
a/zeppelin-web-angular/src/app/visualizations/table/table-visualization.ts
b/zeppelin-web-angular/src/app/visualizations/table/table-visualization.ts
index 686be5ba4e..dce296e4db 100644
--- a/zeppelin-web-angular/src/app/visualizations/table/table-visualization.ts
+++ b/zeppelin-web-angular/src/app/visualizations/table/table-visualization.ts
@@ -31,7 +31,7 @@ export class TableVisualization extends
Visualization<TableVisualizationComponen
this.portalOutlet,
this.viewContainerRef
);
- constructor(config: GraphConfig, private portalOutlet: CdkPortalOutlet,
private viewContainerRef: ViewContainerRef) {
+ constructor(private portalOutlet: CdkPortalOutlet, private viewContainerRef:
ViewContainerRef, config: GraphConfig) {
super(config);
}
diff --git a/zeppelin-web-angular/tslint-rules/constructorParamsOrderRule.ts
b/zeppelin-web-angular/tslint-rules/constructorParamsOrderRule.ts
new file mode 100644
index 0000000000..692051a33e
--- /dev/null
+++ b/zeppelin-web-angular/tslint-rules/constructorParamsOrderRule.ts
@@ -0,0 +1,119 @@
+/*
+ * 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 * as Lint from 'tslint';
+import * as ts from 'typescript';
+
+export class Rule extends Lint.Rules.AbstractRule {
+ public static FAILURE_STRING = 'Constructor parameters should be ordered:
public, protected, private';
+
+ public apply(sourceFile: ts.SourceFile): Lint.RuleFailure[] {
+ return this.applyWithFunction(sourceFile, walk);
+ }
+}
+
+function walk(ctx: Lint.WalkContext<void>) {
+ const checkNode = (node: ts.Node) => {
+ if (ts.isConstructorDeclaration(node)) {
+ const params = node.parameters;
+ if (params.length <= 1) {
+ return;
+ }
+
+ const rankMap: Record<string, number> = { public: 0, protected: 1,
private: 2, none: 3, optional: 4 };
+ const getModifierRank = (param: ts.ParameterDeclaration) =>
rankMap[getModifier(param)];
+
+ let lastRank = -1;
+ let needFix = false;
+ for (let i = 0; i < params.length; i++) {
+ const currentRank = getModifierRank(params[i]);
+ if (currentRank < lastRank) {
+ needFix = true;
+ break;
+ }
+ lastRank = currentRank;
+ }
+
+ if (needFix) {
+ const sourceText = node.getSourceFile().text;
+
+ // For keeping comment
+ const paramSlices = params.map((p, idx) => {
+ const start = p.getFullStart();
+
+ const end = idx < params.length - 1 ? params[idx + 1].getFullStart()
: p.getEnd();
+
+ const text = sourceText.slice(start, end);
+ return { node: p, text };
+ });
+
+ // For sort
+ const sorted = [...paramSlices].sort((a, b) => getModifierRank(a.node)
- getModifierRank(b.node));
+
+ const { line: startLine } =
ctx.sourceFile.getLineAndCharacterOfPosition(node.parameters.pos);
+ const { line: endLine } =
ctx.sourceFile.getLineAndCharacterOfPosition(node.parameters.end);
+ const isMultiLine = startLine !== endLine;
+ const indent = sorted[0].text.replace(sorted[0].text.trim(), '');
+
+ // For recombination
+ const fixText = sorted
+ .map((s, index) => {
+ if (index === paramSlices.length - 1) {
+ return s.text.replace(',', '');
+ }
+
+ if (s.text.includes(',')) {
+ return s.text;
+ }
+
+ if (!s.text.includes('\n') && isMultiLine) {
+ return `${s.text},${indent}`;
+ }
+
+ return s.text + ', ';
+ })
+ .join('')
+ .trim();
+
+ const fix = Lint.Replacement.replaceFromTo(params[0].getStart(),
params[params.length - 1].getEnd(), fixText);
+
+ ctx.addFailureAtNode(node, Rule.FAILURE_STRING, fix);
+ }
+ }
+ ts.forEachChild(node, checkNode);
+ };
+ ts.forEachChild(ctx.sourceFile, checkNode);
+}
+
+function getModifier(param: ts.ParameterDeclaration): string {
+ const hasOptional = param.decorators?.some(d => {
+ let expr = d.expression;
+ if (ts.isCallExpression(expr)) expr = expr.expression;
+ return ts.isIdentifier(expr) && expr.text === "Optional";
+ }) || !!param.questionToken;
+
+ if (hasOptional) {
+ return 'optional';
+ }
+ if (param.modifiers) {
+ if (param.modifiers.some(m => m.kind === ts.SyntaxKind.PublicKeyword)) {
+ return 'public';
+ }
+ if (param.modifiers.some(m => m.kind === ts.SyntaxKind.ProtectedKeyword)) {
+ return 'protected';
+ }
+ if (param.modifiers.some(m => m.kind === ts.SyntaxKind.PrivateKeyword)) {
+ return 'private';
+ }
+ }
+ return 'none';
+}
diff --git a/zeppelin-web-angular/tslint.json b/zeppelin-web-angular/tslint.json
index 045107bdf2..f8cc3bf206 100644
--- a/zeppelin-web-angular/tslint.json
+++ b/zeppelin-web-angular/tslint.json
@@ -1,5 +1,5 @@
{
- "rulesDirectory": ["node_modules/codelyzer", "node_modules/nz-tslint-rules"],
+ "rulesDirectory": ["node_modules/codelyzer", "node_modules/nz-tslint-rules",
"tslint-rules"],
"rules": {
"nz-secondary-entry-imports": true,
"banana-in-box": true,
@@ -137,6 +137,7 @@
"use-isnan": true,
"variable-name": [true, "ban-keywords", "allow-leading-underscore"],
"whitespace": [true, "check-branch", "check-decl", "check-operator",
"check-separator", "check-type"],
- "no-input-rename": true
+ "no-input-rename": true,
+ "constructor-params-order": true
}
}