diff --git a/.vscode/settings.json b/.vscode/settings.json index 194c9b6..10094f1 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,3 +1,4 @@ { - "editor.insertSpaces": false + "editor.insertSpaces": false, + "editor.defaultFormatter": "esbenp.prettier-vscode" } diff --git a/package.json b/package.json index bd67284..083208b 100644 --- a/package.json +++ b/package.json @@ -250,12 +250,12 @@ "type": "object", "title": "CircleCI", "properties": { - "circleci.apiToken": { + "circleci-vscode.apiToken": { "type": "string", "default": null, "markdownDescription": "A CircleCI API Token. This can be generated on your [Personal API Tokens](https://app.circleci.com/settings/user/tokens) page." }, - "circleci.VCSProvider": { + "circleci-vscode.VcsProvider": { "type": "string", "default": "github", "enum": [ @@ -268,7 +268,7 @@ ], "description": "Your VCS Provider." }, - "circleci.customBranches": { + "circleci-vscode.customBranches": { "type": "array", "items": { "type": "string" @@ -278,23 +278,23 @@ ], "description": "Add any custom branches you'd like to list Pipelines for. These will be displayed in addition to the currently checked-out branch." }, - "circleci.autoLoadWorkflows": { + "circleci-vscode.autoLoadWorkflows": { "type": "boolean", "default": true, - "markdownDescription": "Automatically load Pipeline Workflows." + "description": "Automatically load Pipeline Workflows." }, - "circleci.autoLoadWorkflowJobs": { + "circleci-vscode.autoLoadWorkflowJobs": { "type": "boolean", "default": true, - "markdownDescription": "Automatically load Workflow Jobs." + "description": "Automatically load Workflow Jobs." }, - "circleci.pipelineReloadInterval": { + "circleci-vscode.pipelineReloadInterval": { "type": "number", "default": 120, "minimum": 0, "markdownDescription": "Seconds to wait before reloading all Pipelines. This will load in any new Workflows. Set to `0` to disable." }, - "circleci.workflowReloadInterval": { + "circleci-vscode.workflowReloadInterval": { "type": "number", "default": 10, "minimum": 0, diff --git a/src/extension.ts b/src/extension.ts index 397ac58..9dffd28 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -1,4 +1,10 @@ -import { window, workspace, ExtensionContext, Disposable, extensions, commands } from 'vscode'; +import { + window, + workspace, + ExtensionContext, + Disposable, + extensions, +} from 'vscode'; import constants from './lib/constants'; import config from './lib/config'; import gitService from './lib/git-service'; @@ -7,7 +13,7 @@ import PipelinesTree from './lib/pipelines-tree'; import registerGlobalCommands from './lib/global-commands'; import WelcomeWebView from './views/welcome-webview'; import UpgradeWebView from './views/upgrade-webview'; -import { l, splitVersion } from './lib/utils'; +import { splitVersion } from './lib/utils'; let pipelinesTree: PipelinesTree; let exportedContext: ExtensionContext; @@ -18,7 +24,9 @@ export async function activate(context: ExtensionContext): Promise { const extension = extensions.getExtension(constants.EXTENSION_ID)!; const currentVersion = extension.packageJSON.version; - const previousVersion = context.globalState.get(constants.EXTENSION_VERSION); + const previousVersion = context.globalState.get( + constants.EXTENSION_VERSION + ); if (!workspace.workspaceFolders || !workspace.workspaceFolders.length) { // NOTE: This was getting annoying. Maybe we can @@ -63,41 +71,44 @@ export async function activate(context: ExtensionContext): Promise { export function deactivate(): void { pipelinesTree && pipelinesTree.dispose(); - globalCommands.forEach(command => command.dispose()); + globalCommands.forEach((command) => command.dispose()); } -async function showStartupView(currentVersion: string, previousVersion: string | undefined) { +async function showStartupView( + currentVersion: string, + previousVersion: string | undefined +): Promise { const welcomeWebView = new WelcomeWebView(currentVersion); const upgradeWebView = new UpgradeWebView(currentVersion); - if (previousVersion === undefined) { - return welcomeWebView.show(); - } + if (previousVersion === undefined) { + return welcomeWebView.show(); + } const [currentMajor, currentMinor] = splitVersion(currentVersion); const [previousMajor, previousMinor] = splitVersion(previousVersion); // Don't do anything if... - if ( + if ( // The versions are the same major and minor (currentMajor === previousMajor && currentMinor === previousMinor) || // A major downgrade occurred currentMajor < previousMajor || // A minor downgrade occurred (currentMajor === previousMajor && currentMinor < previousMinor) - ) { - return; - } + ) { + return; + } // Show upgrade view if... - if ( + if ( // A major upgrade occurred currentMajor !== previousMajor || // A minor upgrade occurred (currentMajor === previousMajor && currentMinor > previousMinor) ) { - upgradeWebView.show(); - } + upgradeWebView.show(); + } } export function getContext(): ExtensionContext { diff --git a/src/lib/config.ts b/src/lib/config.ts index 7910f28..ce3abff 100644 --- a/src/lib/config.ts +++ b/src/lib/config.ts @@ -13,7 +13,7 @@ export class Config { } get(key: keyof ConfigItems): ConfigItems[typeof key] { - const config = workspace.getConfiguration('circleci'); + const config = workspace.getConfiguration('circleci-vscode'); return config[key] as ConfigItems[typeof key]; } diff --git a/src/lib/git-service.ts b/src/lib/git-service.ts index 98fb2af..2274b04 100644 --- a/src/lib/git-service.ts +++ b/src/lib/git-service.ts @@ -14,7 +14,7 @@ export class GitService { private changeCallback?: () => void; - constructor(public vcs: ConfigItems['VCSProvider']) { + constructor(public vcs: ConfigItems['VcsProvider']) { this.rootPath = workspace.workspaceFolders![0].uri.fsPath; } @@ -108,7 +108,7 @@ export class GitService { export default async function gitService(): Promise { if (!exportedService) { exportedService = new GitService( - config().get(ConfigKey.VCSProvider) as ConfigItems['VCSProvider'] + config().get(ConfigKey.VcsProvider) as ConfigItems['VcsProvider'] ); await exportedService.setup(); } diff --git a/src/lib/types.ts b/src/lib/types.ts index 9c17d67..7c7f965 100644 --- a/src/lib/types.ts +++ b/src/lib/types.ts @@ -1,6 +1,6 @@ export enum ConfigKey { APIToken = 'apiToken', - VCSProvider = 'VCSProvider', + VcsProvider = 'VcsProvider', CustomBranches = 'customBranches', AutoLoadWorkflows = 'autoLoadWorkflows', AutoLoadWorkflowJobs = 'autoLoadWorkflowJobs', @@ -15,7 +15,7 @@ export type ConfigItems = { [ConfigKey.AutoLoadWorkflowJobs]: boolean; [ConfigKey.PipelineReloadInterval]: number; [ConfigKey.WorkflowReloadInterval]: number; - [ConfigKey.VCSProvider]: 'github' | 'bitbucket'; + [ConfigKey.VcsProvider]: 'github' | 'bitbucket'; }; export type GitSet = { diff --git a/src/lib/utils.ts b/src/lib/utils.ts index 3ced9ff..3a8dd6d 100644 --- a/src/lib/utils.ts +++ b/src/lib/utils.ts @@ -139,6 +139,6 @@ export function interpolate( }, value); } -export function splitVersion(version: string) { - return version.split('.').map(v => parseInt(v, 10)); +export function splitVersion(version: string): number[] { + return version.split('.').map((v) => parseInt(v, 10)); } diff --git a/src/views/job-tests.ts b/src/views/job-tests.ts index c7265e8..18d01ab 100644 --- a/src/views/job-tests.ts +++ b/src/views/job-tests.ts @@ -1,4 +1,9 @@ -import { commands, Disposable, TreeItem, TreeItemCollapsibleState } from 'vscode'; +import { + commands, + Disposable, + TreeItem, + TreeItemCollapsibleState, +} from 'vscode'; import constants from '../lib/constants'; import { getAsset, l } from '../lib/utils'; import Job from './job'; diff --git a/src/views/job.ts b/src/views/job.ts index c0fc072..3b01a08 100644 --- a/src/views/job.ts +++ b/src/views/job.ts @@ -1,4 +1,10 @@ -import { Disposable, env, TreeItem, TreeItemCollapsibleState, window } from 'vscode'; +import { + Disposable, + env, + TreeItem, + TreeItemCollapsibleState, + window, +} from 'vscode'; import { Job as JobData } from 'circle-client'; import constants from '../lib/constants'; import { @@ -6,7 +12,7 @@ import { interpolate, openInBrowser, statusDescriptions, - l + l, } from '../lib/utils'; import circleClient from '../lib/circle-client'; import Workflow from './workflow'; @@ -54,7 +60,6 @@ export default class Job extends TreeItem implements Disposable { } else { return statusDescriptions['loading']; } - } private statusIcon(status?: string): string { @@ -68,7 +73,9 @@ export default class Job extends TreeItem implements Disposable { } private loadDetails(): void { - if (this.job.type !== 'build') { return; } + if (this.job.type !== 'build') { + return; + } circleClient().then((client) => { client @@ -105,7 +112,7 @@ export default class Job extends TreeItem implements Disposable { } disposeRows(): void { - this.rows.forEach(row => { + this.rows.forEach((row) => { if ('dispose' in row) { // @ts-ignore row.dispose(); @@ -172,7 +179,10 @@ export default class Job extends TreeItem implements Disposable { ); } - (await circleClient()).approveWorkflowJob(this.workflow.workflow.id, this.job.approval_request_id!); + (await circleClient()).approveWorkflowJob( + this.workflow.workflow.id, + this.job.approval_request_id! + ); window.showInformationMessage(l('jobCanceled', 'Job approved.')); setTimeout(this.reload.bind(this), 1000); } diff --git a/src/views/resources-item.ts b/src/views/resources-item.ts index 88eadf6..f048426 100644 --- a/src/views/resources-item.ts +++ b/src/views/resources-item.ts @@ -4,7 +4,9 @@ import Loader from './loader'; import Empty from './empty'; import { l } from '../lib/utils'; -export default abstract class ResourcesItem extends TreeItem implements Disposable { +export default abstract class ResourcesItem + extends TreeItem + implements Disposable { protected prefixRows: TreeItem[] = []; protected mainRows: TreeItem[] = []; private allRows: TreeItem[] = []; @@ -23,7 +25,7 @@ export default abstract class ResourcesItem extends TreeItem implements Disposab } dispose(): void { - this.allRows.forEach(row => { + this.allRows.forEach((row) => { if ('dispose' in row) { // @ts-ignore row.dispose(); @@ -104,7 +106,7 @@ export default abstract class ResourcesItem extends TreeItem implements Disposab } disposeRows(): void { - this.allRows.forEach(row => { + this.allRows.forEach((row) => { if ('dispose' in row) { // @ts-ignore row.dispose(); diff --git a/src/webviews/assets/components/CTAButton/index.tsx b/src/webviews/assets/components/CTAButton/index.tsx index 3e3c58a..8b19a4b 100644 --- a/src/webviews/assets/components/CTAButton/index.tsx +++ b/src/webviews/assets/components/CTAButton/index.tsx @@ -4,7 +4,7 @@ import './index.scss'; const CTAButton = ({ text, href, - onClick + onClick, }: { text: string; href?: string; diff --git a/src/webviews/assets/components/JobTests/index.tsx b/src/webviews/assets/components/JobTests/index.tsx index c813ea0..45de416 100644 --- a/src/webviews/assets/components/JobTests/index.tsx +++ b/src/webviews/assets/components/JobTests/index.tsx @@ -14,7 +14,9 @@ const JobTests = ({ vscode }: { vscode: any }): JSX.Element => { const [tests, setTests] = useState([]); const [hasMore, setHasMore] = useState(true); const [query, setQuery] = useState(null); - const [sortBy, setSortBy] = useState<'status' | 'alphabetically' | 'duration'>('status'); + const [sortBy, setSortBy] = useState< + 'status' | 'alphabetically' | 'duration' + >('status'); useEffect(() => { if (!jobDetails) { @@ -25,7 +27,7 @@ const JobTests = ({ vscode }: { vscode: any }): JSX.Element => { case constants.TEST_DATA_WEBVIEW_EVENT: if (!initLoaded) { setInitLoaded(true); - setInitHasTests(!!(data.data.tests.length)); + setInitHasTests(!!data.data.tests.length); } setTests((existing) => existing.concat(data.data.tests)); @@ -55,15 +57,17 @@ const JobTests = ({ vscode }: { vscode: any }): JSX.Element => { } if (sortBy === 'status') { - filteredTests.sort((a, b) => a.result.localeCompare(b.result)) + filteredTests.sort((a, b) => a.result.localeCompare(b.result)); } if (sortBy === 'alphabetically') { - filteredTests.sort((a, b) => a.classname.localeCompare(b.classname)) + filteredTests.sort((a, b) => a.classname.localeCompare(b.classname)); } if (sortBy === 'duration') { - filteredTests.sort((a, b) => { return b.run_time - a.run_time }) + filteredTests.sort((a, b) => { + return b.run_time - a.run_time; + }); } if (!jobDetails) { @@ -72,8 +76,27 @@ const JobTests = ({ vscode }: { vscode: any }): JSX.Element => { return ( <> - - + + ); }; diff --git a/src/webviews/assets/components/NoTests/index.tsx b/src/webviews/assets/components/NoTests/index.tsx index 740339a..d7ebfd0 100644 --- a/src/webviews/assets/components/NoTests/index.tsx +++ b/src/webviews/assets/components/NoTests/index.tsx @@ -5,9 +5,21 @@ import CTAButton from '../CTAButton'; const NoTests = (): JSX.Element => { return (
-

{l('noTestMetadataTitle', `This Job doesn't have any test metadata.`)}

-

{l('noTestMetadataExplain', `You can set up test metadata collection by setting the store_test_results key in your config.`)}

-

+

+ {l('noTestMetadataTitle', `This Job doesn't have any test metadata.`)} +

+

+ {l( + 'noTestMetadataExplain', + `You can set up test metadata collection by setting the store_test_results key in your config.` + )} +

+

+ +

); }; diff --git a/src/webviews/assets/components/Search/index.tsx b/src/webviews/assets/components/Search/index.tsx index a75b645..bdc52b4 100644 --- a/src/webviews/assets/components/Search/index.tsx +++ b/src/webviews/assets/components/Search/index.tsx @@ -5,7 +5,7 @@ import './index.scss'; const Search = ({ query, - setQuery + setQuery, }: { query: string | null; setQuery: (value: React.SetStateAction) => void; @@ -13,13 +13,16 @@ const Search = ({ let typeTimer: NodeJS.Timeout | null; let searchField = useRef(null); - const onSearch = useCallback((value: string) => { - clearTimeout(typeTimer!); - // @ts-ignore - typeTimer = setTimeout(() => { - setQuery(value); - }, 300); - }, [query]); + const onSearch = useCallback( + (value: string) => { + clearTimeout(typeTimer!); + // @ts-ignore + typeTimer = setTimeout(() => { + setQuery(value); + }, 300); + }, + [query] + ); const onClear = useCallback(() => { setQuery(null); @@ -27,7 +30,12 @@ const Search = ({ }, [query]); return ( -
{ event.preventDefault(); }}> + { + event.preventDefault(); + }} + > {

- {test.result === 'success' && ( - - )} - {test.result === 'failure' && ( - - )} + {test.result === 'success' && } + {test.result === 'failure' && } {test.name}

diff --git a/src/webviews/assets/components/TestResults/index.tsx b/src/webviews/assets/components/TestResults/index.tsx index 52ef066..66241b9 100644 --- a/src/webviews/assets/components/TestResults/index.tsx +++ b/src/webviews/assets/components/TestResults/index.tsx @@ -25,7 +25,7 @@ const TestResults = ({ hasTests: boolean; }): JSX.Element => { if (!loaded) { - return (

{l('loadingLabel', 'Loading...')}

) + return

{l('loadingLabel', 'Loading...')}

; } if (!hasTests) { @@ -33,7 +33,7 @@ const TestResults = ({
- ) + ); } return ( @@ -47,18 +47,23 @@ const TestResults = ({ onClick={(event) => { event.preventDefault(); setQuery(null); - }}> + }} + > {l('searchQueryClear', 'Clear results')}

)}
- {tests.length - ? tests.map((test: JobTest, index: number) => ( + {tests.length ? ( + tests.map((test: JobTest, index: number) => ( )) - : (

{l('noSearchResults', 'Sorry, no results.')}

)} + ) : ( +

+ {l('noSearchResults', 'Sorry, no results.')} +

+ )}
{!query && hasMore && ( diff --git a/src/webviews/assets/components/TestsHeader/index.tsx b/src/webviews/assets/components/TestsHeader/index.tsx index 0606816..707dda0 100644 --- a/src/webviews/assets/components/TestsHeader/index.tsx +++ b/src/webviews/assets/components/TestsHeader/index.tsx @@ -18,8 +18,10 @@ const TestsHeader = ({ query: string | null; setQuery: (value: React.SetStateAction) => void; hasTests: boolean; - sortBy: 'status' | 'alphabetically' | 'duration', - setSortBy: (value: React.SetStateAction<'status' | 'alphabetically' | 'duration'>) => void, + sortBy: 'status' | 'alphabetically' | 'duration'; + setSortBy: ( + value: React.SetStateAction<'status' | 'alphabetically' | 'duration'> + ) => void; }): JSX.Element => { return (
@@ -33,7 +35,10 @@ const TestsHeader = ({
- +
@@ -43,34 +48,34 @@ const TestsHeader = ({

{l('sortBy', 'Sort:')}{' '} - { event.preventDefault(); setSortBy('status'); - }}> + }} + > {l('sortByStatus', 'Status')} - { event.preventDefault(); setSortBy('alphabetically'); - }}> + }} + > {l('sortByAlphabetically', 'Alphabetically')} - { event.preventDefault(); setSortBy('duration'); - }}> + }} + > {l('sortByDuration', 'Duration')}

diff --git a/src/webviews/assets/components/Upgrade/index.tsx b/src/webviews/assets/components/Upgrade/index.tsx index fe877e9..e92ac11 100644 --- a/src/webviews/assets/components/Upgrade/index.tsx +++ b/src/webviews/assets/components/Upgrade/index.tsx @@ -5,9 +5,12 @@ import { PostMessagePayload } from '../../../../lib/types'; import Loading from '../Loading'; import './index.scss'; -const Upgrade = ({ vscode }: { vscode: any }): JSX.Element => { +const Upgrade = ({}: { vscode: any }): JSX.Element => { const [initLoaded, setInitLoaded] = useState(false); - const [changelog, setChangelog] = useState<{ content: string; version: string; } | null>(null); + const [changelog, setChangelog] = useState<{ + content: string; + version: string; + } | null>(null); useEffect(() => { if (!changelog) { @@ -26,18 +29,16 @@ const Upgrade = ({ vscode }: { vscode: any }): JSX.Element => { } ); } - }, [changelog]); + }, [changelog]); - if (!initLoaded) { - return + if (!initLoaded) { + return ; } return ( -
+

New in CircleCI for VS Code v{changelog!.version}

-
- {} -
+
{}
); }; diff --git a/src/webviews/assets/components/Welcome/index.tsx b/src/webviews/assets/components/Welcome/index.tsx index e7440dd..6ed2b7b 100644 --- a/src/webviews/assets/components/Welcome/index.tsx +++ b/src/webviews/assets/components/Welcome/index.tsx @@ -5,9 +5,12 @@ import { PostMessagePayload } from '../../../../lib/types'; import Loading from '../Loading'; import './index.scss'; -const Welcome = ({ vscode }: { vscode: any }): JSX.Element => { +const Welcome = ({}: { vscode: any }): JSX.Element => { const [initLoaded, setInitLoaded] = useState(false); - const [changelog, setChangelog] = useState<{ content: string; version: string; } | null>(null); + const [changelog, setChangelog] = useState<{ + content: string; + version: string; + } | null>(null); useEffect(() => { if (!changelog) { @@ -26,23 +29,21 @@ const Welcome = ({ vscode }: { vscode: any }): JSX.Element => { } ); } - }, [changelog]); + }, [changelog]); - if (!initLoaded) { - return + if (!initLoaded) { + return ; } return ( -
-

Welcome!

+
+

Welcome!

Here's what's new in v{changelog!.version}

-
- {} -
+
{}
-
+
); }; diff --git a/tsconfig.json b/tsconfig.json index 0d8e855..7d17260 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -20,6 +20,8 @@ "jsx": "react" }, "include": [ + "./src/**/*.ts", + "./src/**/*.tsx", "./src/webviews/types.d.ts" ], "exclude": [