-
Notifications
You must be signed in to change notification settings - Fork 1
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
DEV-117 linter #18
DEV-117 linter #18
Conversation
… property
✅ Deploy Preview for creative-choux-a3c817 ready!
To edit notification comments on pull requests, go to your Netlify site configuration. |
Warning Rate Limit Exceeded@daroczig has exceeded the limit for the number of commits or files that can be reviewed per hour. Please wait 40 minutes and 1 seconds before requesting another review. How to resolve this issue?After the wait time has elapsed, a review can be triggered using the We recommend that you space out your commits to avoid hitting the rate limit. How do rate limits work?CodeRabbit enforces hourly rate limits for each developer per organization. WalkthroughThis update brings a bouquet of enhancements to the project, focusing on improving code quality and maintainability. Changes include implementing Changes
Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media? TipsChatThere are 3 ways to chat with CodeRabbit:
Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments. CodeRabbit Commands (invoked as PR comments)
Additionally, you can add CodeRabbit Configration File (
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 10
Outside diff range and nitpick comments (7)
src/app/pages/server-listing/server-listing.component.ts (5)
1-1
: Ensure consistent import formatting.Consider aligning the import statements for better readability and maintainability.
Line range hint
180-180
: Invalid use of decorators.Decorators should not be used in this context. Please review and correct the placement or usage of any decorators in this line.
Line range hint
152-152
: Specify explicit types instead ofany
.Using
any
type defeats the purpose of TypeScript's static typing. It's recommended to specify explicit types for better type safety and code clarity.- servers: ServerPriceWithPKs[] | any[] = []; + servers: ServerPriceWithPKs[] = [];Also applies to: 154-154, 157-157, 160-160, 161-161, 162-162, 163-163, 165-165, 170-170, 178-178, 197-197, 199-199, 332-333, 339-339, 342-343, 343-343
Line range hint
228-231
: Preferfor...of
overforEach
for better performance and readability.Using
for...of
can lead to cleaner and more efficient code compared toforEach
.- this.countryMetadata.forEach((country) => { + for (const country of this.countryMetadata) {
Line range hint
313-315
: Use template literals for string concatenation.Template literals provide a more readable and concise way to handle dynamic string creation.
- return ((item.server.memory || 0) / 1024).toFixed(1) + ' GB'; + return `${((item.server.memory || 0) / 1024).toFixed(1)} GB`;Also applies to: 317-319
src/app/pages/server-listing/server-listing.component.html (2)
26-26
: Ensure accessibility by adding anaria-label
to the clickable div for better screen reader support.
451-451
: Ensure all interactive elements have appropriate keyboard event handlers to enhance accessibility and usability.Also applies to: 461-461, 483-483
Review Details
Configuration used: CodeRabbit UI
Review profile: CHILL
Files selected for processing (22)
- .eslintrc.json (1 hunks)
- .github/workflows/tests.yaml (1 hunks)
- src/app/app.component.ts (4 hunks)
- src/app/components/faq/faq.component.html (1 hunks)
- src/app/pages/article/article.component.html (1 hunks)
- src/app/pages/article/article.component.ts (4 hunks)
- src/app/pages/articles/articles.component.ts (4 hunks)
- src/app/pages/datacenters/datacenters.component.html (1 hunks)
- src/app/pages/datacenters/datacenters.component.ts (2 hunks)
- src/app/pages/landingpage/landingpage.component.html (8 hunks)
- src/app/pages/landingpage/landingpage.component.ts (6 hunks)
- src/app/pages/server-details/server-details.component.html (1 hunks)
- src/app/pages/server-details/server-details.component.ts (21 hunks)
- src/app/pages/server-listing/server-listing.component.html (5 hunks)
- src/app/pages/server-listing/server-listing.component.ts (6 hunks)
- src/app/pages/tos/tos.component.ts (3 hunks)
- src/app/pages/vendors/vendors.component.html (2 hunks)
- src/app/pages/vendors/vendors.component.ts (2 hunks)
- src/app/services/articles.service.ts (1 hunks)
- src/app/services/my_http/my-http.ts (1 hunks)
- src/app/tools/queryParamFunctions.ts (1 hunks)
- src/polyfills.ts (1 hunks)
Files skipped from review due to trivial changes (8)
- .eslintrc.json
- .github/workflows/tests.yaml
- src/app/components/faq/faq.component.html
- src/app/pages/article/article.component.html
- src/app/pages/datacenters/datacenters.component.html
- src/app/pages/landingpage/landingpage.component.html
- src/app/pages/server-details/server-details.component.html
- src/app/pages/vendors/vendors.component.html
Additional Context Used
Biome (142)
src/app/app.component.ts (6)
21-21: Decorators are not valid here.
22-22: Decorators are not valid here.
1-2: Some named imports are only used as types.
2-3: All these imports are only used as types.
3-4: Some named imports are only used as types.
8-9: All these imports are only used as types.
src/app/pages/article/article.component.ts (17)
32-32: Decorators are not valid here.
28-28: Unexpected any. Specify a different type.
29-29: Unexpected any. Specify a different type.
46-46: The computed expression can be simplified without the use of a string literal.
48-48: Unexpected any. Specify a different type.
57-57: Do not use template literals if interpolation and special-character handling are not needed.
61-61: Do not use template literals if interpolation and special-character handling are not needed.
68-68: Use === instead of ==.
== is only allowed when comparing againstnull
83-83: Unexpected any. Specify a different type.
1-1: Some named imports are only used as types.
1-2: Some named imports are only used as types.
2-3: Some named imports are only used as types.
4-5: Some named imports are only used as types.
5-6: All these imports are only used as types.
7-8: All these imports are only used as types.
8-9: All these imports are only used as types.
10-11: Some named imports are only used as types.
src/app/pages/articles/articles.component.ts (8)
32-32: The computed expression can be simplified without the use of a string literal.
47-47: Template literals are preferred over string concatenation.
51-51: Do not use template literals if interpolation and special-character handling are not needed.
1-1: Some named imports are only used as types.
1-2: All these imports are only used as types.
2-3: Some named imports are only used as types.
4-5: All these imports are only used as types.
5-6: All these imports are only used as types.
src/app/pages/datacenters/datacenters.component.ts (8)
34-34: Unexpected any. Specify a different type.
101-101: Unexpected any. Specify a different type.
1-1: Some named imports are only used as types.
1-2: Some named imports are only used as types.
2-3: All these imports are only used as types.
3-4: All these imports are only used as types.
4-5: Some named imports are only used as types.
9-10: Some named imports are only used as types.
src/app/pages/landingpage/landingpage.component.ts (17)
120-120: Decorators are not valid here.
26-26: Unexpected any. Specify a different type.
58-58: Unexpected any. Specify a different type.
110-110: Unexpected any. Specify a different type.
152-152: This type annotation is trivially inferred from its initialization.
186-186: Template literals are preferred over string concatenation.
227-227: The computed expression can be simplified without the use of a string literal.
260-260: Template literals are preferred over string concatenation.
281-286: Prefer for...of instead of forEach.
288-288: Template literals are preferred over string concatenation.
291-291: The computed expression can be simplified without the use of a string literal.
1-1: Some named imports are only used as types.
1-2: All these imports are only used as types.
3-4: All these imports are only used as types.
5-6: All these imports are only used as types.
12-13: All these imports are only used as types.
13-14: All these imports are only used as types.
src/app/pages/server-details/server-details.component.ts (20)
93-93: Decorators are not valid here.
52-52: Unexpected any. Specify a different type.
57-57: Unexpected any. Specify a different type.
59-59: Unexpected any. Specify a different type.
60-60: Unexpected any. Specify a different type.
61-61: Unexpected any. Specify a different type.
63-63: Unexpected any. Specify a different type.
64-64: Unexpected any. Specify a different type.
65-65: Unexpected any. Specify a different type.
70-70: Unexpected any. Specify a different type.
71-71: Unexpected any. Specify a different type.
73-73: Unexpected any. Specify a different type.
74-74: Unexpected any. Specify a different type.
75-75: Unexpected any. Specify a different type.
86-86: Unexpected any. Specify a different type.
87-87: Unexpected any. Specify a different type.
105-105: The computed expression can be simplified without the use of a string literal.
106-106: The computed expression can be simplified without the use of a string literal.
114-114: Unexpected any. Specify a different type.
118-118: Template literals are preferred over string concatenation.
src/app/pages/server-listing/server-listing.component.ts (20)
180-180: Decorators are not valid here.
152-152: Unexpected any. Specify a different type.
154-154: Unexpected any. Specify a different type.
157-157: Unexpected any. Specify a different type.
160-160: Unexpected any. Specify a different type.
161-161: Unexpected any. Specify a different type.
162-162: Unexpected any. Specify a different type.
163-163: Unexpected any. Specify a different type.
165-165: Unexpected any. Specify a different type.
170-170: Unexpected any. Specify a different type.
178-178: Unexpected any. Specify a different type.
197-197: Unexpected any. Specify a different type.
199-199: Unexpected any. Specify a different type.
228-231: Prefer for...of instead of forEach.
313-315: Template literals are preferred over string concatenation.
317-319: Template literals are preferred over string concatenation.
332-333: Unexpected any. Specify a different type.
339-339: Unexpected any. Specify a different type.
342-343: Unexpected any. Specify a different type.
343-343: Unexpected any. Specify a different type.
src/app/pages/tos/tos.component.ts (10)
19-19: Unexpected any. Specify a different type.
37-37: Do not use template literals if interpolation and special-character handling are not needed.
40-40: Do not use template literals if interpolation and special-character handling are not needed.
40-40: Unexpected any. Specify a different type.
1-2: All these imports are only used as types.
2-3: Some named imports are only used as types.
4-5: Some named imports are only used as types.
5-6: Some named imports are only used as types.
6-7: Some named imports are only used as types.
7-8: All these imports are only used as types.
src/app/pages/vendors/vendors.component.ts (9)
32-32: Unexpected any. Specify a different type.
55-55: Unexpected any. Specify a different type.
107-107: Unexpected any. Specify a different type.
1-1: Some named imports are only used as types.
1-2: All these imports are only used as types.
2-3: Some named imports are only used as types.
3-4: All these imports are only used as types.
4-5: Some named imports are only used as types.
7-8: Some named imports are only used as types.
src/app/services/articles.service.ts (2)
23-23: Do not use template literals if interpolation and special-character handling are not needed.
1-1: All these imports are only used as types.
src/app/services/my_http/my-http.ts (14)
18-18: Decorators are not valid here.
10-10: The computed expression can be simplified without the use of a string literal.
11-11: The computed expression can be simplified without the use of a string literal.
22-22: Unexpected any. Specify a different type.
22-22: Unexpected any. Specify a different type.
34-34: Unexpected any. Specify a different type.
39-39: Unexpected any. Specify a different type.
39-39: This type annotation is trivially inferred from its initialization.
39-39: Unexpected any. Specify a different type.
40-40: Unexpected any. Specify a different type.
55-55: Unexpected any. Specify a different type.
60-65: This else clause can be omitted because previous branches break early.
1-2: Some named imports are only used as types.
3-4: Some named imports are only used as types.
src/app/tools/queryParamFunctions.ts (5)
2-2: Use === instead of ==.
== is only allowed when comparing againstnull
6-6: Template literals are preferred over string concatenation.
11-11: Unexpected any. Specify a different type.
12-12: Use === instead of ==.
== is only allowed when comparing againstnull
16-16: Template literals are preferred over string concatenation.
src/polyfills.ts (6)
2-2: A Node.js builtin module should be imported with the node: protocol.
3-3: A Node.js builtin module should be imported with the node: protocol.
5-5: Unexpected any. Specify a different type.
6-6: Unexpected any. Specify a different type.
6-6: Unexpected any. Specify a different type.
7-7: Unexpected any. Specify a different type.
Additional comments not posted (15)
src/app/services/articles.service.ts (1)
31-31
: The use ofconst
for immutable variable declaration is appropriate here.src/app/pages/tos/tos.component.ts (1)
34-34
: Consider specifying a more precise type than 'any' forarticleBody
to enhance type safety.- articleBody: any; + articleBody: string; // or another more appropriate typeLikely invalid or redundant comment.
src/app/services/my_http/my-http.ts (2)
14-14
: The classMYHTTPClient
is now extendingHttpClientSDK
without specifying any generic type parameters.
30-30
: Theheaders
object is correctly initialized with a content type. Good use ofnew HttpHeaders
.src/app/pages/article/article.component.ts (2)
20-20
: The classArticleComponent
now implementsOnInit
. Ensure that all lifecycle methods are correctly implemented.
85-85
: The loop usesconst
forline
which is good practice as it prevents reassignment within the loop.src/app/pages/datacenters/datacenters.component.ts (2)
19-19
: The classDatacentersComponent
now implementsOnInit
. This is a good practice to ensure that the component is properly initialized.
5-5
: The import statement correctly reflects the removal of unused imports as per the PR summary.src/app/pages/vendors/vendors.component.ts (1)
18-18
: The classVendorsComponent
now implementsOnInit
. This aligns with Angular best practices for component initialization.src/app/pages/landingpage/landingpage.component.ts (2)
24-24
: The classLandingpageComponent
now implementsOnInit
. This is essential for lifecycle management in Angular components.
140-142
: The use ofconst
forspinner1
,spinner2
, andspinner3
arrays is appropriate as these arrays are not reassigned.src/app/pages/server-details/server-details.component.ts (1)
43-43
: The classServerDetailsComponent
now implementsOnInit
. This ensures that the component lifecycle hooks are correctly used.src/app/pages/server-listing/server-listing.component.ts (1)
75-75
: Correct implementation of interfaces and host binding.The class correctly implements
OnInit
and usesHostBinding
to setngSkipHydration
to 'true', aligning with Angular best practices.src/app/pages/server-listing/server-listing.component.html (2)
32-32
: Good use oftabindex="0"
to make the div focusable, enhancing keyboard navigation.
338-338
: Addingalt
attributes to images is a great practice for accessibility. Ensure thealt
text is descriptive enough.
@@ -1,6 +1,7 @@ | |||
|
|||
import * as process from 'process'; | |||
import { Buffer } from 'buffer'; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Use the 'node:' protocol when importing Node.js built-in modules.
- import { Buffer } from 'buffer';
+ import { Buffer } from 'node:buffer';
Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation.
import { Buffer } from 'buffer'; | |
import { Buffer } from 'node:buffer'; |
|
||
(window as any).global = window; | ||
(window as any).Buffer = (window as any).Buffer || require('buffer').Buffer; | ||
(window as any).Buffer = (window as any).Buffer || Buffer; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Consider specifying a more precise type than 'any' for global properties or add a TODO to address this.
- (window as any).Buffer = (window as any).Buffer || Buffer;
- (window as any).process = process;
+ // TODO: Define a more specific type for global properties
+ (window as any).Buffer = (window as any).Buffer || Buffer;
+ (window as any).process = process;
Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation.
(window as any).Buffer = (window as any).Buffer || Buffer; | |
// TODO: Define a more specific type for global properties | |
(window as any).Buffer = (window as any).Buffer || Buffer; | |
(window as any).process = process; |
|
||
constructor( | ||
private httpClient: HttpClient, | ||
@Inject(PLATFORM_ID) private platformId: object) { | ||
super(); | ||
} | ||
|
||
public override request = async <T = any, E = any>({ method, body, secure, path, type, query, format, baseUrl, cancelToken, ...params }: FullRequestParams): Promise<HttpResponse<T, E>> => { | ||
public override request = async <T = any, E = any>({ method, body, path, type, query }: FullRequestParams): Promise<HttpResponse<T, E>> => { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The method request
uses any
type for its generic parameters, which is not recommended. Consider specifying more precise types.
- public override request = async <T = any, E = any>({ method, body, path, type, query }: FullRequestParams): Promise<HttpResponse<T, E>> => {
+ public override request = async <T, E>({ method, body, path, type, query }: FullRequestParams): Promise<HttpResponse<T, E>> => {
Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation.
public override request = async <T = any, E = any>({ method, body, path, type, query }: FullRequestParams): Promise<HttpResponse<T, E>> => { | |
public override request = async <T, E>({ method, body, path, type, query }: FullRequestParams): Promise<HttpResponse<T, E>> => { |
@@ -13,7 +13,7 @@ export function encodeQueryParams(params: any): string | null { | |||
return null; | |||
} | |||
|
|||
let query = Object.keys(params).map(key => key + '=' + params[key]).join('&'); | |||
const query = Object.keys(params).map(key => key + '=' + params[key]).join('&'); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Use template literals for better readability and consistency.
- const query = Object.keys(params).map(key => key + '=' + params[key]).join('&');
+ const query = Object.keys(params).map(key => `${key}=${params[key]}`).join('&');
Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation.
const query = Object.keys(params).map(key => key + '=' + params[key]).join('&'); | |
const query = Object.keys(params).map(key => `${key}=${params[key]}`).join('&'); |
'Content-Type': type || 'application/json' | ||
}); | ||
|
||
let response: any = await this._requestWithRetries(method, url, body, headers); | ||
const response: any = await this._requestWithRetries(method, url, body, headers); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The variable response
is typed as any
. It's better to use a more specific type to enhance type safety.
- const response: any = await this._requestWithRetries(method, url, body, headers);
+ const response: HttpResponse<T, E> = await this._requestWithRetries(method, url, body, headers);
Committable suggestion was skipped due low confidence.
@@ -40,7 +40,7 @@ export class ArticlesComponent { | |||
|
|||
]; | |||
|
|||
let title = category ? category.charAt(0).toUpperCase() + category.slice(1) : ''; | |||
const title = category ? category.charAt(0).toUpperCase() + category.slice(1) : ''; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Use template literals consistently for better readability and to avoid errors.
- const title = category ? category.charAt(0).toUpperCase() + category.slice(1) : '';
+ const title = category ? `${category.charAt(0).toUpperCase()}${category.slice(1)}` : '';
Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation.
const title = category ? category.charAt(0).toUpperCase() + category.slice(1) : ''; | |
const title = category ? `${category.charAt(0).toUpperCase()}${category.slice(1)}` : ''; |
@@ -63,7 +63,7 @@ export class AppComponent { | |||
updateCanonical(url: string) { | |||
const canonicalUrl = url; | |||
const head = this.document.getElementsByTagName('head')[0]; | |||
var element: HTMLLinkElement | null = this.document.querySelector(`link[rel='canonical']`) || null; | |||
let element: HTMLLinkElement | null = this.document.querySelector(`link[rel='canonical']`) || null; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Consider using const
instead of let
for element
since it is not reassigned.
- let element: HTMLLinkElement | null = this.document.querySelector(`link[rel='canonical']`) || null;
+ const element: HTMLLinkElement | null = this.document.querySelector(`link[rel='canonical']`) || null;
Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation.
let element: HTMLLinkElement | null = this.document.querySelector(`link[rel='canonical']`) || null; | |
const element: HTMLLinkElement | null = this.document.querySelector(`link[rel='canonical']`) || null; |
@@ -62,7 +62,7 @@ export class ArticleComponent { | |||
|
|||
if(isPlatformBrowser(this.platformId)) { | |||
// Wait for the articleDiv to be rendered | |||
let checkExist = setInterval(() => { | |||
const checkExist = setInterval(() => { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The use of setInterval
for checking the existence of articleDiv
is not the most efficient method. Consider using Angular's ViewChild
with { static: false }
to handle this more elegantly.
- const checkExist = setInterval(() => {
- if (this.articleDiv) {
- this.renderer.listen(this.articleDiv.nativeElement, 'click', (event) => {
- if (event.target.tagName === 'IMG' && event.target.classList[0] == 'zoomin') {
- this.openLightbox(event.target.src);
- }
- });
- clearInterval(checkExist);
- }
- }, 100);
+ @ViewChild('articleDiv', { static: false }) set content(content: ElementRef) {
+ if(content) {
+ this.renderer.listen(content.nativeElement, 'click', (event) => {
+ if (event.target.tagName === 'IMG' && event.target.classList.contains('zoomin')) {
+ this.openLightbox(event.target.src);
+ }
+ });
+ }
+ }
Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation.
const checkExist = setInterval(() => { | |
@ViewChild('articleDiv', { static: false }) set content(content: ElementRef) { | |
if(content) { | |
this.renderer.listen(content.nativeElement, 'click', (event) => { | |
if (event.target.tagName === 'IMG' && event.target.classList.contains('zoomin')) { | |
this.openLightbox(event.target.src); | |
} | |
}); | |
} | |
} |
const vendor = params['vendor']; | ||
const id = params['id']; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Tip
Codebase Verification
The search results indicate multiple instances of the getServer
method being called and the parameters vendor
and id
being used. However, there is no clear evidence of validation logic for these parameters before they are used in the getServer
method.
src/app/pages/server-details/server-details.component.ts:105
: The parametersvendor
andid
are extracted fromparams
and directly used in thegetServer
method call.
To ensure the parameters are validated before use, you should add validation logic for vendor
and id
before calling the getServer
method.
Analysis chain
The method getServer
is called with parameters extracted from params
. Ensure that these parameters are validated before use.
Scripts Executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Description: Verify that parameters 'vendor' and 'id' are validated before use in getServer method.
# Test: Search for the validation logic. Expect: Validation logic before the method call.
rg --type typescript 'getServer'
Length of output: 67
Script:
#!/bin/bash
# Description: Verify that parameters 'vendor' and 'id' are validated before use in getServer method.
# Test: Search for the getServer method call and any validation logic for 'vendor' and 'id'.
rg 'getServer' --glob '*.ts'
rg 'vendor' --glob '*.ts'
rg 'id' --glob '*.ts'
Length of output: 40731
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 0
Review Details
Configuration used: CodeRabbit UI
Review profile: CHILL
Files selected for processing (1)
- .github/workflows/tests.yaml (1 hunks)
Files skipped from review as they are similar to previous changes (1)
- .github/workflows/tests.yaml
Summary by CodeRabbit
New Features
alt
attributes to images andtabindex
attributes to interactive elements.OnInit
in multiple components.Bug Fixes
!=
to!==
in Angular templates.Chores
Refactor
let
toconst
for improved code quality and immutability.