-
-
Notifications
You must be signed in to change notification settings - Fork 945
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
web: all aboard the anti-if bus, according to tooling #10220
Changes from all commits
3146e5a
fe52f44
e505f27
5090621
035bda4
2d0117d
22cb5b7
8b4e036
db96e1a
8946b81
30beca9
5d84082
a7e3dca
2d254d6
3f95020
a056703
fc00bde
7123b2c
5d4c380
66cefcc
875fc5c
c84be1d
b08dcc2
272fdc5
23665d1
cacdf64
085debf
f19ed14
ac4ba5d
98503f6
2d94b16
34de6bf
ca42506
2a96900
9acebec
8248163
ee37e92
e1d565d
3d532d4
fffc8c7
3fae9e5
09803fe
5752497
61eb9fa
3ff20ca
5b132c8
2488eb9
312f364
fcab990
10bfc4e
c49185d
7b208d9
75b605f
186e1bf
be9b44a
f5a561f
d3e2273
f800754
b0f2575
1a644e3
dd9349c
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -5,39 +5,38 @@ import process from "process"; | |
|
||
const localizeRules = JSON.parse(fs.readFileSync("./lit-localize.json", "utf-8")); | ||
|
||
function compareXlfAndSrc(loc) { | ||
const xlf = path.join("./xliff", `${loc}.xlf`); | ||
const src = path.join("./src/locales", `${loc}.ts`); | ||
function generatedFileIsUpToDateWithXliffSource(loc) { | ||
const xliff = path.join("./xliff", `${loc}.xlf`); | ||
const gened = path.join("./src/locales", `${loc}.ts`); | ||
|
||
// Returns false if: the expected XLF file doesn't exist, The expected | ||
// generated file doesn't exist, or the XLF file is newer (has a higher date) | ||
// than the generated file. The missing XLF file is important enough it | ||
// generates a unique error message and halts the build. | ||
|
||
try { | ||
var xlfStat = fs.statSync(xlf); | ||
var xlfStat = fs.statSync(xliff); | ||
} catch (_error) { | ||
console.error(`lit-localize expected '${loc}.xlf', but XLF file is not present`); | ||
process.exit(1); | ||
} | ||
|
||
// If the generated file doesn't exist, of course it's not up to date. | ||
try { | ||
var srcStat = fs.statSync(src); | ||
var genedStat = fs.statSync(gened); | ||
} catch (_error) { | ||
return false; | ||
} | ||
|
||
// if the xlf is newer (greater) than src, it's out of date. | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. // prefer-single-boolean-return |
||
if (xlfStat.mtimeMs > srcStat.mtimeMs) { | ||
return false; | ||
} | ||
return true; | ||
// if the generated file is the same age or older (date is greater) than the xliff file, it's | ||
// presumed to have been generated by that file and is up-to-date. | ||
return genedStat.mtimeMs >= xlfStat.mtimeMs; | ||
} | ||
|
||
// For all the expected files, find out if any aren't up-to-date. | ||
|
||
const upToDate = localizeRules.targetLocales.reduce( | ||
(acc, loc) => acc && compareXlfAndSrc(loc), | ||
(acc, loc) => acc && generatedFileIsUpToDateWithXliffSource(loc), | ||
true, | ||
); | ||
|
||
|
@@ -61,7 +60,9 @@ if (!upToDate) { | |
.map((locale) => `Locale '${locale}' has ${counts.get(locale)} missing translations`) | ||
.join("\n"); | ||
|
||
// eslint-disable-next-line no-console | ||
console.log(`Translation tables rebuilt.\n${report}\n`); | ||
} | ||
|
||
// eslint-disable-next-line no-console | ||
console.log("Locale ./src is up-to-date"); |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,55 @@ | ||
import { execFileSync } from "child_process"; | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. ESlint in nightmare mode, only this checks everything. |
||
import { ESLint } from "eslint"; | ||
import path from "path"; | ||
import process from "process"; | ||
|
||
// Code assumes this script is in the './web/scripts' folder. | ||
const projectRoot = execFileSync("git", ["rev-parse", "--show-toplevel"], { | ||
encoding: "utf8", | ||
}).replace("\n", ""); | ||
process.chdir(path.join(projectRoot, "./web")); | ||
|
||
const eslintConfig = { | ||
overrideConfig: { | ||
env: { | ||
browser: true, | ||
es2021: true, | ||
}, | ||
extends: [ | ||
"eslint:recommended", | ||
"plugin:@typescript-eslint/recommended", | ||
"plugin:lit/recommended", | ||
"plugin:custom-elements/recommended", | ||
"plugin:storybook/recommended", | ||
"plugin:sonarjs/recommended", | ||
], | ||
parser: "@typescript-eslint/parser", | ||
parserOptions: { | ||
ecmaVersion: 12, | ||
sourceType: "module", | ||
}, | ||
plugins: ["@typescript-eslint", "lit", "custom-elements", "sonarjs"], | ||
rules: { | ||
"indent": "off", | ||
"linebreak-style": ["error", "unix"], | ||
"quotes": ["error", "double", { avoidEscape: true }], | ||
"semi": ["error", "always"], | ||
"@typescript-eslint/ban-ts-comment": "off", | ||
"sonarjs/cognitive-complexity": ["error", 9], | ||
"sonarjs/no-duplicate-string": "off", | ||
"sonarjs/no-nested-template-literals": "off", | ||
}, | ||
}, | ||
}; | ||
|
||
const updated = ["./src/", "./build.mjs", "./scripts/*.mjs"]; | ||
|
||
const eslint = new ESLint(eslintConfig); | ||
const results = await eslint.lintFiles(updated); | ||
const formatter = await eslint.loadFormatter("stylish"); | ||
const resultText = formatter.format(results); | ||
const errors = results.reduce((acc, result) => acc + result.errorCount, 0); | ||
|
||
// eslint-disable-next-line no-console | ||
console.log(resultText); | ||
process.exit(errors > 1 ? 1 : 0); |
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -103,11 +103,7 @@ export class ApplicationWizardCommitApplication extends BasePanel { | |
); | ||
if (!providerModel) { | ||
throw new Error( | ||
`Could not determine provider model from user request: ${JSON.stringify( | ||
this.wizard, | ||
null, | ||
2, | ||
)}`, | ||
`Could not determine provider model from user request: ${JSON.stringify(this.wizard, null, 2)}`, | ||
); | ||
} | ||
|
||
|
@@ -118,7 +114,6 @@ export class ApplicationWizardCommitApplication extends BasePanel { | |
}; | ||
|
||
this.send(request); | ||
return; | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. // redundant-return |
||
} | ||
} | ||
|
||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -8,7 +8,7 @@ import "@goauthentik/elements/forms/SearchSelect"; | |
import YAML from "yaml"; | ||
|
||
import { msg } from "@lit/localize"; | ||
import { TemplateResult, html } from "lit"; | ||
import { TemplateResult, html, nothing } from "lit"; | ||
import { customElement, property } from "lit/decorators.js"; | ||
import { ifDefined } from "lit/directives/if-defined.js"; | ||
|
||
|
@@ -66,14 +66,11 @@ export class PolicyTestForm extends Form<PropertyMappingTestRequest> { | |
</ak-form-element-horizontal>`; | ||
} | ||
|
||
renderExampleButtons(): TemplateResult { | ||
const header = html`<p>${msg("Example context data")}</p>`; | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. // small-switch-statement |
||
switch (this.mapping?.metaModelName) { | ||
case "authentik_sources_ldap.ldappropertymapping": | ||
return html`${header}${this.renderExampleLDAP()}`; | ||
default: | ||
return html``; | ||
} | ||
renderExampleButtons() { | ||
return this.mapping?.metaModelName === "authentik_sources_ldap.ldappropertymapping" | ||
? html`<p>${msg("Example context data")}</p> | ||
${this.renderExampleLDAP()}` | ||
: nothing; | ||
} | ||
|
||
renderExampleLDAP(): TemplateResult { | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -42,12 +42,11 @@ export function transformCredentialCreateOptions( | |
user.id = u8arr(b64enc(u8arr(stringId))); | ||
const challenge = u8arr(credentialCreateOptions.challenge.toString()); | ||
|
||
const transformedCredentialCreateOptions = Object.assign({}, credentialCreateOptions, { | ||
return { | ||
...credentialCreateOptions, | ||
challenge, | ||
user, | ||
}); | ||
|
||
return transformedCredentialCreateOptions; | ||
}; | ||
} | ||
|
||
export interface Assertion { | ||
|
@@ -98,12 +97,11 @@ export function transformCredentialRequestOptions( | |
}, | ||
); | ||
|
||
const transformedCredentialRequestOptions = Object.assign({}, credentialRequestOptions, { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. // prefer-immediate-return |
||
return { | ||
...credentialRequestOptions, | ||
challenge, | ||
allowCredentials, | ||
}); | ||
|
||
return transformedCredentialRequestOptions; | ||
}; | ||
} | ||
|
||
export interface AuthAssertion { | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -92,11 +92,13 @@ export class Tabs extends AKElement { | |
const pages = Array.from(this.querySelectorAll(":scope > [slot^='page-']")); | ||
if (window.location.hash.includes(ROUTE_SEPARATOR)) { | ||
const params = getURLParams(); | ||
if (this.pageIdentifier in params && !this.currentPage) { | ||
if (this.querySelector(`[slot='${params[this.pageIdentifier]}']`) !== null) { | ||
// To update the URL to match with the current slot | ||
this.onClick(params[this.pageIdentifier] as string); | ||
} | ||
if ( | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. // collapse-nested-if |
||
this.pageIdentifier in params && | ||
!this.currentPage && | ||
this.querySelector(`[slot='${params[this.pageIdentifier]}']`) !== null | ||
) { | ||
// To update the URL to match with the current slot | ||
this.onClick(params[this.pageIdentifier] as string); | ||
} | ||
} | ||
if (!this.currentPage) { | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -352,10 +352,13 @@ export class SearchSelect<T> extends CustomEmitterElement(AKElement) { | |
const onFocus = (ev: FocusEvent) => { | ||
this.open = true; | ||
this.renderMenu(); | ||
if (this.blankable && this.renderedValue === this.emptyOption) { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. // collapse-nested-if |
||
if (ev.target && ev.target instanceof HTMLInputElement) { | ||
ev.target.value = ""; | ||
} | ||
if ( | ||
this.blankable && | ||
this.renderedValue === this.emptyOption && | ||
ev.target && | ||
ev.target instanceof HTMLInputElement | ||
) { | ||
ev.target.value = ""; | ||
} | ||
}; | ||
|
||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -117,19 +117,11 @@ export class SidebarItem extends AKElement { | |
if (!this.path) { | ||
return false; | ||
} | ||
if (this.path) { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I realized the two comparisons were complimentary, so that takes out the // prefer-single-boolean-return |
||
const ourPath = this.path.split(";")[0]; | ||
if (new RegExp(`^${ourPath}$`).exec(path)) { | ||
return true; | ||
} | ||
} | ||
return this.activeMatchers.some((v) => { | ||
const match = v.exec(path); | ||
if (match !== null) { | ||
return true; | ||
} | ||
return false; | ||
}); | ||
|
||
const ourPath = this.path.split(";")[0]; | ||
const pathIsWholePath = new RegExp(`^${ourPath}$`).test(path); | ||
const pathIsAnActivePath = this.activeMatchers.some((v) => v.test(path)); | ||
return pathIsWholePath || pathIsAnActivePath; | ||
} | ||
|
||
expandParentRecursive(activePath: string, item: SidebarItem): void { | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -231,14 +231,11 @@ ${prompt.initialValue}</textarea | |
|
||
shouldRenderInWrapper(prompt: StagePrompt): boolean { | ||
// Special types that aren't rendered in a wrapper | ||
if ( | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. // prefer-single-boolean-return |
||
return !( | ||
prompt.type === PromptTypeEnum.Static || | ||
prompt.type === PromptTypeEnum.Hidden || | ||
prompt.type === PromptTypeEnum.Separator | ||
) { | ||
return false; | ||
} | ||
return true; | ||
); | ||
} | ||
|
||
renderField(prompt: StagePrompt): TemplateResult { | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -70,10 +70,7 @@ export class UserSettingsFlowExecutor | |
}) | ||
.then((data) => { | ||
this.challenge = data; | ||
if (this.challenge.responseErrors) { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. // prefer-single-boolean-return |
||
return false; | ||
} | ||
return true; | ||
return !this.challenge.responseErrors; | ||
}) | ||
.catch((e: Error | ResponseError) => { | ||
this.errorMessage(e); | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -10,20 +10,16 @@ import { PromptTypeEnum, StagePrompt } from "@goauthentik/api"; | |
@customElement("ak-user-stage-prompt") | ||
export class UserSettingsPromptStage extends PromptStage { | ||
renderPromptInner(prompt: StagePrompt): TemplateResult { | ||
switch (prompt.type) { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. // small-switch-statement |
||
// Checkbox requires slightly different rendering here due to the use of horizontal form elements | ||
case PromptTypeEnum.Checkbox: | ||
return html`<input | ||
type="checkbox" | ||
class="pf-c-check__input" | ||
name="${prompt.fieldKey}" | ||
?checked=${prompt.initialValue !== ""} | ||
?required=${prompt.required} | ||
style="vertical-align: bottom" | ||
/>`; | ||
default: | ||
return super.renderPromptInner(prompt); | ||
} | ||
return prompt.type === PromptTypeEnum.Checkbox | ||
? html`<input | ||
type="checkbox" | ||
class="pf-c-check__input" | ||
name="${prompt.fieldKey}" | ||
?checked=${prompt.initialValue !== ""} | ||
?required=${prompt.required} | ||
style="vertical-align: bottom" | ||
/>` | ||
: super.renderPromptInner(prompt); | ||
} | ||
|
||
renderField(prompt: StagePrompt): TemplateResult { | ||
|
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.
It took me awhile to figure out what this function does. That isn't good, considering I wrote it initially. I've revised it with a better name and the clear comparison eslint demanded.