diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml new file mode 100644 index 0000000..44dea56 --- /dev/null +++ b/.github/workflows/lint.yml @@ -0,0 +1,17 @@ +name: lint +run-name: Installs project and runs linting +on: [ push, pull_request ] +jobs: + lint: + runs-on: ubuntu-latest + strategy: + matrix: + node: [ 16, 18 ] + name: Linting on Ubuntu with Node ${{ matrix.node }} + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-node@v3 + with: + node-version: ${{ matrix.node }} + - run: npm install + - run: npm run lint \ No newline at end of file diff --git a/.github/workflows/prettier.yml b/.github/workflows/prettier.yml new file mode 100644 index 0000000..6ffed91 --- /dev/null +++ b/.github/workflows/prettier.yml @@ -0,0 +1,17 @@ +name: prettier +run-name: Installs project and runs prettier checks +on: [ push, pull_request ] +jobs: + lint: + runs-on: ubuntu-latest + strategy: + matrix: + node: [ 16, 18 ] + name: Prettier on Ubuntu with Node ${{ matrix.node }} + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-node@v3 + with: + node-version: ${{ matrix.node }} + - run: npm install + - run: npm run prettier:verify \ No newline at end of file diff --git a/.github/workflows/run-tests.yml b/.github/workflows/run-tests.yml new file mode 100644 index 0000000..3f45857 --- /dev/null +++ b/.github/workflows/run-tests.yml @@ -0,0 +1,29 @@ +name: run-tests +run-name: Installs project and runs project tests +on: [ push, pull_request ] +jobs: + run-tests-nix: + runs-on: ubuntu-latest + strategy: + matrix: + node: [ 16, 18 ] + name: Tests on Ubuntu with Node ${{ matrix.node }} + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-node@v3 + with: + node-version: ${{ matrix.node }} + - run: npm install + - run: npm run compile + run-tests-win: + runs-on: windows-latest + strategy: + matrix: + node: [ 16, 18 ] + name: Tests on Windows with Node ${{ matrix.node }} + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-node@v3 + with: + node-version: ${{ matrix.node }} + - run: npm install diff --git a/package.json b/package.json index 31a7acb..3a36869 100644 --- a/package.json +++ b/package.json @@ -43,8 +43,7 @@ "lint": "eslint src --ext ts", "test": "node ./out/test/runTest.js", "prettier:write": "prettier --write \"src/**/*.{ts, js}\"", - "prettier:verify": "prettier --list-different \"src/**/*.{ts, js}\"", - "genl10n": "vscode-l10n-dev export ./src" + "prettier:verify": "prettier --list-different \"src/**/*.{ts, js}\"" }, "devDependencies": { "@types/glob": "^8.1.0", diff --git a/src/commands/landingPageCommand.ts b/src/commands/landingPageCommand.ts index a5475a2..83197a2 100644 --- a/src/commands/landingPageCommand.ts +++ b/src/commands/landingPageCommand.ts @@ -80,7 +80,9 @@ export class LandingPageCommand { */ static async configureRecordListCard(uem: UEMBuilder): Promise { const selectedItem = await UIUtils.showQuickPick( - l10n.t('Select which sObject you want to display on the Record List.'), + l10n.t( + 'Select which sObject you want to display on the Record List.' + ), l10n.t('Retrieving sObjects from your org, please wait...'), () => { return new Promise(async (resolve, reject) => { @@ -110,13 +112,15 @@ export class LandingPageCommand { const finishedOption: QuickPickItem = { label: l10n.t('-- Finished --'), - detail: l10n.t('I don\'t want any more fields to be displayed.') + detail: l10n.t("I don't want any more fields to be displayed.") }; // Prompt user for up to 3 fields. The first request we will retrieve the fields and show a progress // message const selectedFieldPickItem1 = await UIUtils.showQuickPick( - l10n.t('Select which field you want to display as the primary field.'), + l10n.t( + 'Select which field you want to display as the primary field.' + ), l10n.t('Retrieving list of fields for sObject.'), () => { return new Promise(async (resolve, reject) => { @@ -142,7 +146,9 @@ export class LandingPageCommand { // get optional field 2 -- do not show a progress message. const selectedFieldPickItem2 = await UIUtils.showQuickPick( - l10n.t('Select which field you want to display as the second field (or Finished to skip).'), + l10n.t( + 'Select which field you want to display as the second field (or Finished to skip).' + ), undefined, () => { return new Promise(async (resolve, reject) => { @@ -165,7 +171,9 @@ export class LandingPageCommand { let selectedFieldPickItem3: QuickPickItem; if (selectedFieldPickItem2.label !== finishedOption.label) { selectedFieldPickItem3 = await UIUtils.showQuickPick( - l10n.t('Select which field you want to display as the third field (or Finished to skip).'), + l10n.t( + 'Select which field you want to display as the third field (or Finished to skip).' + ), undefined, () => { return new Promise( @@ -218,7 +226,9 @@ export class LandingPageCommand { const cardTypes: QuickPickItem[] = [ { label: `${LandingPageCommand.GLOBAL_ACTIONS_CARD_LABEL}`, - description: l10n.t('A card showing the LWC Global Quick Actions defined in the org.') + description: l10n.t( + 'A card showing the LWC Global Quick Actions defined in the org.' + ) }, { label: `${LandingPageCommand.RECORD_LIST_CARD_LABEL}`, @@ -226,7 +236,9 @@ const cardTypes: QuickPickItem[] = [ }, { label: `${LandingPageCommand.TIMED_LIST_CARD_LABEL}`, - description: l10n.t('A card showing a list of records filtered and sorted by a date/time range.') + description: l10n.t( + 'A card showing a list of records filtered and sorted by a date/time range.' + ) }, { label: '', diff --git a/src/commands/templateChooserCommand.ts b/src/commands/templateChooserCommand.ts index c93510f..e7e4362 100644 --- a/src/commands/templateChooserCommand.ts +++ b/src/commands/templateChooserCommand.ts @@ -48,7 +48,9 @@ export class TemplateChooserCommand { }, { label: l10n.t('Retail Execution'), - detail: l10n.t('Global quick actions with new Opportunity, new Lead, and more.'), + detail: l10n.t( + 'Global quick actions with new Opportunity, new Lead, and more.' + ), filename: 'landing_page_retail_execution.json' } ]; diff --git a/src/test/suite/utils/orgUtils.test.ts b/src/test/suite/utils/orgUtils.test.ts index 5e28e48..fd845de 100644 --- a/src/test/suite/utils/orgUtils.test.ts +++ b/src/test/suite/utils/orgUtils.test.ts @@ -68,7 +68,7 @@ suite('Org Utils Test Suite', () => { const reloadSpy = sinon.spy(() => { return Promise.resolve; }); - + const config: SinonStub = sinon.stub(ConfigAggregator, 'create'); config.returns({ getInfo: (key: OrgConfigProperties) => { @@ -87,7 +87,7 @@ suite('Org Utils Test Suite', () => { const defaultUser = await OrgUtils.getDefaultUser(); assert.equal(defaultUser, 'username'); - assert.equal(reloadSpy.called, true, "reload should be invoked"); + assert.equal(reloadSpy.called, true, 'reload should be invoked'); }); test('Returns list of sobjects', async () => { diff --git a/src/test/suite/webviews.test.ts b/src/test/suite/webviews.test.ts index 35ac96a..ff50a8e 100644 --- a/src/test/suite/webviews.test.ts +++ b/src/test/suite/webviews.test.ts @@ -13,7 +13,7 @@ import { afterEach, beforeEach } from 'mocha'; import * as fs from 'fs'; suite('InstructionsWebviewProvider Test Suite', () => { - const extensionUri = Uri.parse("file:///tmp/testdir"); + const extensionUri = Uri.parse('file:///tmp/testdir'); beforeEach(function () {}); @@ -22,29 +22,28 @@ suite('InstructionsWebviewProvider Test Suite', () => { }); test('Locale-specific file is returned if it exists', async () => { - const languageStub = sinon.stub(env, "language"); - languageStub.value("es"); + const languageStub = sinon.stub(env, 'language'); + languageStub.value('es'); - const fsExistStub = sinon.stub(fs, "existsSync"); + const fsExistStub = sinon.stub(fs, 'existsSync'); fsExistStub.returns(true); const provider = new InstructionsWebviewProvider(extensionUri); - const path = provider.getLocaleContentPath(extensionUri, "test.html"); + const path = provider.getLocaleContentPath(extensionUri, 'test.html'); - assert.equal(path, "test.es.html"); + assert.equal(path, 'test.es.html'); }); test('Defaults to english file if locale-specific file does not exist.', async () => { - const languageStub = sinon.stub(env, "language"); - languageStub.value("es"); + const languageStub = sinon.stub(env, 'language'); + languageStub.value('es'); - const fsExistStub = sinon.stub(fs, "existsSync"); + const fsExistStub = sinon.stub(fs, 'existsSync'); fsExistStub.returns(false); const provider = new InstructionsWebviewProvider(extensionUri); - const path = provider.getLocaleContentPath(extensionUri, "test.html"); + const path = provider.getLocaleContentPath(extensionUri, 'test.html'); - assert.equal(path, "test.html"); + assert.equal(path, 'test.html'); }); - }); diff --git a/src/utils/uemBuilder.ts b/src/utils/uemBuilder.ts index 57d2399..af68356 100644 --- a/src/utils/uemBuilder.ts +++ b/src/utils/uemBuilder.ts @@ -14,7 +14,7 @@ export class UEMBuilder { // TODO: Create a typed data structure for this instead of any private cards: any[] = []; - static readonly valueTypes = [ + static readonly VALUE_TYPES = [ 'Int', 'String', 'Boolean', @@ -40,10 +40,10 @@ export class UEMBuilder { 'Base64' ]; - static readonly defaultValueType = 'StringValue'; + static readonly DEFAULT_VALUE_TYPE = 'StringValue'; private getFieldType(field: Field): string { - const t = UEMBuilder.valueTypes.find( + const t = UEMBuilder.VALUE_TYPES.find( (t) => t.toLowerCase() === field.type.toLowerCase() ); @@ -52,7 +52,7 @@ export class UEMBuilder { } // default - return UEMBuilder.defaultValueType; + return UEMBuilder.DEFAULT_VALUE_TYPE; } addGlobalActionCard(): UEMBuilder { diff --git a/src/utils/uiUtils.ts b/src/utils/uiUtils.ts index d59a8b0..5411974 100644 --- a/src/utils/uiUtils.ts +++ b/src/utils/uiUtils.ts @@ -13,9 +13,9 @@ import { window, QuickPickItem, QuickPickItemKind, QuickPick } from 'vscode'; export class UIUtils { /** * Wraps the ability to ask user for a selection from a quick pick list. - * + * * @param placeholderMessage Message shown to user in the quick pick text entry box. - * @param progressMessage Message shown while the quick pick is shown, but is not yet enabled due + * @param progressMessage Message shown while the quick pick is shown, but is not yet enabled due * to building a list of options via the callback. * @param optionsCallback Callback used to provide an array of QuickPickItems. * @param ignoreFocusOut Boolean for the ignoreFocusOut option on QuickPick. @@ -40,13 +40,13 @@ export class UIUtils { if (selectedItem) { resolve(selectedItem); } else { - reject("Nothing selected"); + reject('Nothing selected'); } }); quickPick.onDidHide((e) => { quickPick.dispose(); - reject("Hiding"); + reject('Hiding'); }); if (progressMessage) { diff --git a/src/webviews.ts b/src/webviews.ts index fe0850f..f290546 100644 --- a/src/webviews.ts +++ b/src/webviews.ts @@ -53,7 +53,10 @@ export class InstructionsWebviewProvider { this.extensionUri, contentPath ); - const htmlPath = vscode.Uri.joinPath(this.extensionUri, localeContentPath); + const htmlPath = vscode.Uri.joinPath( + this.extensionUri, + localeContentPath + ); const messagingJsPath = vscode.Uri.joinPath( this.extensionUri, MESSAGING_JS_PATH