From a5a1418aa627a121927830825477005e3216dc4e Mon Sep 17 00:00:00 2001 From: Christopher Pezza Date: Thu, 2 Jan 2025 20:33:34 -0500 Subject: [PATCH 1/3] chore: prettier clean up --- .github/workflows/tests.yml | 24 +- .prettierignore | 3 +- .prettierrc.json | 39 ++ config/project-scratch-def.json | 24 +- jest.config.js | 6 +- package.json | 70 +- pnpm-lock.yaml | 562 +++++++++++++--- prettier.config.js | 19 - sfdx-project.json | 20 +- src/PackBuild/classes/MetadataSelector.cls | 338 +++++----- src/PackBuild/classes/MetadataService.cls | 632 ++++++++---------- src/PackBuild/classes/MetadataUtility.cls | 190 +++--- .../classes/TestMetadataSelector.cls | 380 +++++------ src/PackBuild/classes/TestMetadataService.cls | 186 +++--- src/PackBuild/classes/TestMetadataUtility.cls | 364 +++++----- src/PackBuild/lwc/.eslintrc.json | 24 +- .../lwc/labelService/labelService.js | 60 +- .../lwc/lightningCard/lightningCard.html | 67 +- .../lwc/lightningCard/lightningCard.js | 112 ++-- .../metadataSelector/metadataSelector.html | 272 ++++---- .../lwc/metadataSelector/metadataSelector.js | 544 +++++++-------- .../metadataSelectorTableColumns.js | 28 +- .../metadataSelectorUtilities.js | 38 +- .../packageCodeSnippet/packageCodeSnippet.css | 413 ++++++------ .../packageCodeSnippet.html | 6 +- .../packageCodeSnippet/packageCodeSnippet.js | 110 +-- .../lwc/sfdxCodeSnippet/sfdxCodeSnippet.css | 413 ++++++------ .../lwc/sfdxCodeSnippet/sfdxCodeSnippet.html | 6 +- .../lwc/sfdxCodeSnippet/sfdxCodeSnippet.js | 48 +- 29 files changed, 2646 insertions(+), 2352 deletions(-) create mode 100644 .prettierrc.json delete mode 100644 prettier.config.js diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index f9e5d9d..632557f 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -10,8 +10,24 @@ jobs: runs-on: ubuntu-latest steps: - - uses: sfdx-actions/setup-sfdx@v1 + - name: 📚 Checkout Main Code 📚 + uses: actions/checkout@v4 + + - name: 🐢 Install pnpm 🐢 + uses: pnpm/action-setup@v3 + with: + version: 9 + run_install: false + + - name: 🐢 Setup Node 🐢 + uses: actions/setup-node@v4 with: - sfdx-auth-url: ${{ secrets.SFDX_AUTH_URL }} - - name: sfdx-test-run - run: sfdx force:apex:test:run -s "PackageBuilder" -r human -c -w 30 + node-version: 20 + cache: pnpm + + - name: 🐢 Install Node Package Dependencies 🐢 + shell: bash + run: pnpm install + + - name: 🐢 Install SF CLI 🐢 + uses: svierk/sfdx-cli-setup@main diff --git a/.prettierignore b/.prettierignore index 4d3550c..1692a0c 100644 --- a/.prettierignore +++ b/.prettierignore @@ -3,4 +3,5 @@ .sfdx .vscode coverage/ -pnpm-lock.yaml \ No newline at end of file +pnpm-lock.yaml +/documentation/** \ No newline at end of file diff --git a/.prettierrc.json b/.prettierrc.json new file mode 100644 index 0000000..4254df7 --- /dev/null +++ b/.prettierrc.json @@ -0,0 +1,39 @@ +{ + "plugins": ["@prettier/plugin-xml", "prettier-plugin-apex"], + "semi": true, + "singleQuote": true, + "printWidth": 150, + "trailingComma": "none", + "arrowParens": "always", + "tabWidth": 2, + "useTabs": true, + "quoteProps": "as-needed", + "jsxSingleQuote": false, + "apexStandaloneParser": "none", + "overrides": [ + { + "files": "**/lwc/**/*.html", + "options": { + "parser": "lwc", + "singleQuote": false + } + }, + { + "files": "*.cls", + "options": { + "tabWidth": 2 + } + }, + { + "files": "*.{yaml, yml}", + "options": { + "useTabs": false, + "tabWidth": 2 + } + }, + { + "files": "*.{cmp,page,component,design}", + "options": { "parser": "html" } + } + ] +} diff --git a/config/project-scratch-def.json b/config/project-scratch-def.json index ce99fb3..354da60 100644 --- a/config/project-scratch-def.json +++ b/config/project-scratch-def.json @@ -1,14 +1,14 @@ { - "orgName": "Metadata PackageBuilder", - "country": "US", - "edition": "Developer", - "description": "Metadata PackageBuilder", - "settings": { - "orgPreferenceSettings": { - "s1DesktopEnabled": true, - "chatterEnabled": true, - "translation": true - } - }, - "features": ["DebugApex", "MultiCurrency", "CascadeDelete"] + "orgName": "Metadata PackageBuilder", + "country": "US", + "edition": "Developer", + "description": "Metadata PackageBuilder", + "settings": { + "orgPreferenceSettings": { + "s1DesktopEnabled": true, + "chatterEnabled": true, + "translation": true + } + }, + "features": ["DebugApex", "MultiCurrency", "CascadeDelete"] } diff --git a/jest.config.js b/jest.config.js index 410b3d5..826bbd3 100644 --- a/jest.config.js +++ b/jest.config.js @@ -1,6 +1,6 @@ -const { jestConfig } = require("@salesforce/sfdx-lwc-jest/config"); +const { jestConfig } = require('@salesforce/sfdx-lwc-jest/config'); module.exports = { - ...jestConfig, - modulePathIgnorePatterns: ["/.localdevserver"] + ...jestConfig, + modulePathIgnorePatterns: ['/.localdevserver'] }; diff --git a/package.json b/package.json index 0529518..501c1b0 100644 --- a/package.json +++ b/package.json @@ -1,37 +1,37 @@ { - "name": "package-builder", - "private": true, - "version": "2.1.0", - "description": "Package Builder, ability to build package.xml and sfdx cmd of specific file names. All from within the org.", - "scripts": { - "lint": "./bin/lint", - "lint:aura": "eslint **/aura/**", - "lint:lwc": "eslint **/lwc/**", - "lint:markdown": "markdownlint .github/**/*.md README.md CHANGELOG.md -c .markdownlint.yml", - "pmd:mac": "pmd check -d ./src/PackBuild/classes -R ./.pmdrc.xml -f textcolor --force-language apex -r pmd-results.html", - "apexTest": "sf apex run test -s \"PackageBuilder\" -r human -c -w 30 -d .sfdx/tools/testresults/apex", - "test": "pnpm run test:unit", - "test:unit": "sfdx-lwc-jest", - "test:unit:watch": "sfdx-lwc-jest --watch", - "test:unit:debug": "sfdx-lwc-jest --debug", - "test:unit:coverage": "sfdx-lwc-jest --coverage", - "format": "prettier -l \"./**/*.{cls,cmp,component,css,html,js,json,md,page,trigger,yaml,yml}\"", - "format:fix": "prettier -w \"./**/*.{cls,cmp,component,css,html,js,json,md,page,trigger,yaml,yml}\"", - "update-dependencies": "ncu -u && pnpm install" - }, - "devDependencies": { - "@lwc/eslint-plugin-lwc": "^1.8.2", - "@prettier/plugin-xml": "^3.4.1", - "@salesforce/eslint-config-lwc": "^3.6.0", - "@salesforce/eslint-plugin-aura": "^2.1.0", - "@salesforce/eslint-plugin-lightning": "^1.0.0", - "@salesforce/sfdx-lwc-jest": "^7.0.1", - "eslint": "^9.15.0", - "eslint-config-prettier": "^9.1.0", - "eslint-plugin-import": "^2.31.0", - "eslint-plugin-jest": "^28.9.0", - "markdownlint": "^0.36.1", - "prettier": "^3.3.3", - "prettier-plugin-apex": "^2.2.2" - } + "name": "package-builder", + "private": true, + "version": "2.1.0", + "description": "Package Builder, ability to build package.xml and sfdx cmd of specific file names. All from within the org.", + "scripts": { + "lint": "./bin/lint", + "lint:aura": "eslint **/aura/**", + "lint:lwc": "eslint **/lwc/**", + "lint:markdown": "markdownlint .github/**/*.md README.md CHANGELOG.md -c .markdownlint.yml", + "pmd:mac": "pmd check -d ./src/PackBuild/classes -R ./.pmdrc.xml -f textcolor --force-language apex -r pmd-results.html", + "apexTest": "sf apex run test -s \"PackageBuilder\" -r human -c -w 30 -d .sfdx/tools/testresults/apex", + "test": "pnpm run test:unit", + "test:unit": "sfdx-lwc-jest", + "test:unit:watch": "sfdx-lwc-jest --watch", + "test:unit:debug": "sfdx-lwc-jest --debug", + "test:unit:coverage": "sfdx-lwc-jest --coverage", + "format": "prettier -l \"./**/*.{cls,cmp,component,css,html,js,json,md,page,trigger,yaml,yml}\"", + "format:fix": "prettier -w \"./**/*.{cls,cmp,component,css,html,js,json,md,page,trigger,yaml,yml}\"", + "update-dependencies": "ncu -u && pnpm install" + }, + "devDependencies": { + "@lwc/eslint-plugin-lwc": "^1.9.0", + "@prettier/plugin-xml": "^3.4.1", + "@salesforce/eslint-config-lwc": "^3.6.0", + "@salesforce/eslint-plugin-aura": "^2.1.0", + "@salesforce/eslint-plugin-lightning": "^1.0.0", + "@salesforce/sfdx-lwc-jest": "^7.0.1", + "eslint": "^9.17.0", + "eslint-config-prettier": "^9.1.0", + "eslint-plugin-import": "^2.31.0", + "eslint-plugin-jest": "^28.10.0", + "markdownlint": "^0.37.3", + "prettier": "^3.4.2", + "prettier-plugin-apex": "^2.2.2" + } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f37e828..a0a3dab 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,44 +9,44 @@ importers: .: devDependencies: '@lwc/eslint-plugin-lwc': - specifier: ^1.8.2 - version: 1.8.2(@babel/eslint-parser@7.24.8(@babel/core@7.26.0)(eslint@9.15.0))(eslint@9.15.0) + specifier: ^1.9.0 + version: 1.9.0(@babel/eslint-parser@7.24.8(@babel/core@7.26.0)(eslint@9.17.0))(eslint@9.17.0) '@prettier/plugin-xml': specifier: ^3.4.1 - version: 3.4.1(prettier@3.3.3) + version: 3.4.1(prettier@3.4.2) '@salesforce/eslint-config-lwc': specifier: ^3.6.0 - version: 3.6.0(@lwc/eslint-plugin-lwc@1.8.2(@babel/eslint-parser@7.24.8(@babel/core@7.26.0)(eslint@9.15.0))(eslint@9.15.0))(@salesforce/eslint-plugin-lightning@1.0.0(eslint@9.15.0))(eslint-plugin-import@2.31.0(@typescript-eslint/parser@6.12.0(eslint@9.15.0)(typescript@5.3.2))(eslint@9.15.0))(eslint-plugin-jest@28.9.0(@typescript-eslint/eslint-plugin@6.12.0(@typescript-eslint/parser@6.12.0(eslint@9.15.0)(typescript@5.3.2))(eslint@9.15.0)(typescript@5.3.2))(eslint@9.15.0)(jest@29.7.0(@types/node@20.10.0))(typescript@5.3.2))(eslint@9.15.0) + version: 3.6.0(@lwc/eslint-plugin-lwc@1.9.0(@babel/eslint-parser@7.24.8(@babel/core@7.26.0)(eslint@9.17.0))(eslint@9.17.0))(@salesforce/eslint-plugin-lightning@1.0.0(eslint@9.17.0))(eslint-plugin-import@2.31.0(@typescript-eslint/parser@6.12.0(eslint@9.17.0)(typescript@5.3.2))(eslint@9.17.0))(eslint-plugin-jest@28.10.0(@typescript-eslint/eslint-plugin@6.12.0(@typescript-eslint/parser@6.12.0(eslint@9.17.0)(typescript@5.3.2))(eslint@9.17.0)(typescript@5.3.2))(eslint@9.17.0)(jest@29.7.0(@types/node@20.10.0))(typescript@5.3.2))(eslint@9.17.0) '@salesforce/eslint-plugin-aura': specifier: ^2.1.0 - version: 2.1.0(eslint@9.15.0) + version: 2.1.0(eslint@9.17.0) '@salesforce/eslint-plugin-lightning': specifier: ^1.0.0 - version: 1.0.0(eslint@9.15.0) + version: 1.0.0(eslint@9.17.0) '@salesforce/sfdx-lwc-jest': specifier: ^7.0.1 version: 7.0.1(@types/node@20.10.0) eslint: - specifier: ^9.15.0 - version: 9.15.0 + specifier: ^9.17.0 + version: 9.17.0 eslint-config-prettier: specifier: ^9.1.0 - version: 9.1.0(eslint@9.15.0) + version: 9.1.0(eslint@9.17.0) eslint-plugin-import: specifier: ^2.31.0 - version: 2.31.0(@typescript-eslint/parser@6.12.0(eslint@9.15.0)(typescript@5.3.2))(eslint@9.15.0) + version: 2.31.0(@typescript-eslint/parser@6.12.0(eslint@9.17.0)(typescript@5.3.2))(eslint@9.17.0) eslint-plugin-jest: - specifier: ^28.9.0 - version: 28.9.0(@typescript-eslint/eslint-plugin@6.12.0(@typescript-eslint/parser@6.12.0(eslint@9.15.0)(typescript@5.3.2))(eslint@9.15.0)(typescript@5.3.2))(eslint@9.15.0)(jest@29.7.0(@types/node@20.10.0))(typescript@5.3.2) + specifier: ^28.10.0 + version: 28.10.0(@typescript-eslint/eslint-plugin@6.12.0(@typescript-eslint/parser@6.12.0(eslint@9.17.0)(typescript@5.3.2))(eslint@9.17.0)(typescript@5.3.2))(eslint@9.17.0)(jest@29.7.0(@types/node@20.10.0))(typescript@5.3.2) markdownlint: - specifier: ^0.36.1 - version: 0.36.1 + specifier: ^0.37.3 + version: 0.37.3 prettier: - specifier: ^3.3.3 - version: 3.3.3 + specifier: ^3.4.2 + version: 3.4.2 prettier-plugin-apex: specifier: ^2.2.2 - version: 2.2.2(prettier@3.3.3) + version: 2.2.2(prettier@3.4.2) packages: @@ -433,10 +433,6 @@ packages: peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - '@eslint-community/regexpp@4.10.0': - resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} - engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - '@eslint-community/regexpp@4.12.1': resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} @@ -453,8 +449,8 @@ packages: resolution: {integrity: sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@9.15.0': - resolution: {integrity: sha512-tMTqrY+EzbXmKJR5ToI8lxu7jaN5EdmrBFJpQk5JmSlyLsx6o4t27r883K5xsLuCYCpfKBCGswMSWXsM+jB7lg==} + '@eslint/js@9.17.0': + resolution: {integrity: sha512-Sxc4hqcs1kTu0iID3kcZDW3JHq2a77HO9P8CP6YEA/FpH3Ll8UXE2r/86Rz9YJLKme39S9vU5OWNjC6Xl0Cr3w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/object-schema@2.1.4': @@ -606,8 +602,8 @@ packages: '@lwc/errors@8.8.0': resolution: {integrity: sha512-f5+jJCesmU0JWGzpYlZ1N+FMvwdJCcd9Bh1FWNShEy59X/FclOxQ0R7xVOte/+cKjgn+aYVvf98QXMwVM4frVQ==} - '@lwc/eslint-plugin-lwc@1.8.2': - resolution: {integrity: sha512-kPlOq6G2BPo3x56qkGOgwas1SJWZYeQR6uXLMFzFrjb/Lisb24VeABNQd1i7JgoQXQzad0F12pfU0BLgIhhR7g==} + '@lwc/eslint-plugin-lwc@1.9.0': + resolution: {integrity: sha512-z2wEUvLanstSl9o7VT/HAI7uFWHkTApz8N1ZpRQtyh8Hg6UbBZKLrg+vMxDED1vZVLu256i2KgYUWysVQyO4tg==} engines: {node: '>=10.0.0'} peerDependencies: '@babel/eslint-parser': ^7 @@ -784,6 +780,9 @@ packages: '@types/babel__traverse@7.20.4': resolution: {integrity: sha512-mSM/iKUk5fDDrEV/e83qY+Cr3I1+Q3qqTuEn++HAWYjEa1+NxZr6CNrcJGf2ZTnq4HoFGC3zaTPZTobCzCFukA==} + '@types/debug@4.1.12': + resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} + '@types/estree-jsx@1.0.5': resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==} @@ -811,6 +810,12 @@ packages: '@types/json5@0.0.29': resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} + '@types/katex@0.16.7': + resolution: {integrity: sha512-HMwFiRujE5PjrgwHQ25+bsLJgowjGjm5Z8FVSf0N6PwgJrwxH0QxzHYDcKsTfV3wva0vzrpqMTJS2jXPr5BMEQ==} + + '@types/ms@0.7.34': + resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} + '@types/node@20.10.0': resolution: {integrity: sha512-D0WfRmU9TQ8I9PFx9Yc+EBHw+vSpIub4IDvQivcp26PtPrdMGAq5SDcpXEo/epqa/DXotVpekHiLNTg3iaKXBQ==} @@ -823,6 +828,9 @@ packages: '@types/tough-cookie@4.0.5': resolution: {integrity: sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==} + '@types/unist@2.0.11': + resolution: {integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==} + '@types/yargs-parser@21.0.3': resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} @@ -1108,6 +1116,15 @@ packages: resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} engines: {node: '>=10'} + character-entities-legacy@3.0.0: + resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} + + character-entities@2.0.2: + resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} + + character-reference-invalid@2.0.1: + resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} + chevrotain@7.1.1: resolution: {integrity: sha512-wy3mC1x4ye+O+QkEinVJkPf5u2vsrDIYW9G7ZuwFl6v/Yu0LwUuT2POsb+NUWApebyxfkQq6+yDfRExbnI5rcw==} @@ -1146,6 +1163,10 @@ packages: resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} engines: {node: '>= 0.8'} + commander@8.3.0: + resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} + engines: {node: '>= 12'} + concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} @@ -1216,6 +1237,9 @@ packages: decimal.js@10.4.3: resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==} + decode-named-character-reference@1.0.2: + resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==} + dedent@1.5.1: resolution: {integrity: sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==} peerDependencies: @@ -1247,10 +1271,17 @@ packages: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} engines: {node: '>=0.4.0'} + dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + detect-newline@3.1.0: resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} engines: {node: '>=8'} + devlop@1.1.0: + resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + diff-sequences@29.6.3: resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -1421,8 +1452,8 @@ packages: '@typescript-eslint/parser': optional: true - eslint-plugin-jest@28.9.0: - resolution: {integrity: sha512-rLu1s1Wf96TgUUxSw6loVIkNtUjq1Re7A9QdCCHSohnvXEBAjuL420h0T/fMmkQlNsQP2GhQzEUpYHPfxBkvYQ==} + eslint-plugin-jest@28.10.0: + resolution: {integrity: sha512-hyMWUxkBH99HpXT3p8hc7REbEZK3D+nk8vHXGgpB+XXsi0gO4PxMSP+pjfUzb67GnV9yawV9a53eUmcde1CCZA==} engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} peerDependencies: '@typescript-eslint/eslint-plugin': ^6.0.0 || ^7.0.0 || ^8.0.0 @@ -1457,8 +1488,8 @@ packages: resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint@9.15.0: - resolution: {integrity: sha512-7CrWySmIibCgT1Os28lUU6upBshZ+GxybLOrmRzi08kS8MBuO8QA7pXEgYgY5W8vK3e74xv0lpjo9DbaGU9Rkw==} + eslint@9.17.0: + resolution: {integrity: sha512-evtlNcpJg+cZLcnVKwsai8fExnqjGPicK7gnUtlNuzu+Fv9bI0aLpND5T44VLQtoMEnI57LoXO9XAkIXwohKrA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true peerDependencies: @@ -1773,6 +1804,12 @@ packages: resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} engines: {node: '>= 0.4'} + is-alphabetical@2.0.1: + resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} + + is-alphanumerical@2.0.1: + resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} + is-array-buffer@3.0.2: resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==} @@ -1809,6 +1846,9 @@ packages: resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} engines: {node: '>= 0.4'} + is-decimal@2.0.1: + resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} + is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} @@ -1825,6 +1865,9 @@ packages: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} + is-hexadecimal@2.0.1: + resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} + is-negative-zero@2.0.2: resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==} engines: {node: '>= 0.4'} @@ -2110,6 +2153,10 @@ packages: engines: {node: '>=6'} hasBin: true + katex@0.16.19: + resolution: {integrity: sha512-3IA6DYVhxhBabjSLTNO9S4+OliA3Qvb8pBQXMfC4WxXJgLwZgnfDl0BmB4z6nBMdznBsZ+CGM8DrGZ5hcguDZg==} + hasBin: true + keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} @@ -2172,12 +2219,8 @@ packages: resolution: {integrity: sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==} hasBin: true - markdownlint-micromark@0.1.12: - resolution: {integrity: sha512-RlB6EwMGgc0sxcIhOQ2+aq7Zw1V2fBnzbXKGgYK/mVWdT7cz34fteKSwfYeo4rL6+L/q2tyC9QtD/PgZbkdyJQ==} - engines: {node: '>=18'} - - markdownlint@0.36.1: - resolution: {integrity: sha512-s73fU2CQN7WCgjhaQUQ8wYESQNzGRNOKDd+3xgVqu8kuTEhmwepd/mxOv1LR2oV046ONrTLBFsM7IoKWNvmy5g==} + markdownlint@0.37.3: + resolution: {integrity: sha512-eoQqH0291YCCjd+Pe1PUQ9AmWthlVmS0XWgcionkZ8q34ceZyRI+pYvsWksXJJL8OBkWCPwp1h/pnXxrPFC4oA==} engines: {node: '>=18'} match-json@1.3.7: @@ -2197,6 +2240,81 @@ packages: resolution: {integrity: sha512-tNlPDP4AzkH/7cROw7PKJ7mCLe/ZLpa2ja23uqB35vt63+8dgZi2NKLJMrkjxLcxArnLJVvd3Y/7pRl3OLR7yg==} engines: {node: '>=10.4.0'} + micromark-core-commonmark@2.0.2: + resolution: {integrity: sha512-FKjQKbxd1cibWMM1P9N+H8TwlgGgSkWZMmfuVucLCHaYqeSvJ0hFeHsIa65pA2nYbes0f8LDHPMrd9X7Ujxg9w==} + + micromark-extension-directive@3.0.2: + resolution: {integrity: sha512-wjcXHgk+PPdmvR58Le9d7zQYWy+vKEU9Se44p2CrCDPiLr2FMyiT4Fyb5UFKFC66wGB3kPlgD7q3TnoqPS7SZA==} + + micromark-extension-gfm-autolink-literal@2.1.0: + resolution: {integrity: sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==} + + micromark-extension-gfm-footnote@2.1.0: + resolution: {integrity: sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==} + + micromark-extension-gfm-table@2.1.0: + resolution: {integrity: sha512-Ub2ncQv+fwD70/l4ou27b4YzfNaCJOvyX4HxXU15m7mpYY+rjuWzsLIPZHJL253Z643RpbcP1oeIJlQ/SKW67g==} + + micromark-extension-math@3.1.0: + resolution: {integrity: sha512-lvEqd+fHjATVs+2v/8kg9i5Q0AP2k85H0WUOwpIVvUML8BapsMvh1XAogmQjOCsLpoKRCVQqEkQBB3NhVBcsOg==} + + micromark-factory-destination@2.0.1: + resolution: {integrity: sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==} + + micromark-factory-label@2.0.1: + resolution: {integrity: sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==} + + micromark-factory-space@2.0.1: + resolution: {integrity: sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==} + + micromark-factory-title@2.0.1: + resolution: {integrity: sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==} + + micromark-factory-whitespace@2.0.1: + resolution: {integrity: sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==} + + micromark-util-character@2.1.1: + resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==} + + micromark-util-chunked@2.0.1: + resolution: {integrity: sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==} + + micromark-util-classify-character@2.0.1: + resolution: {integrity: sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==} + + micromark-util-combine-extensions@2.0.1: + resolution: {integrity: sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==} + + micromark-util-decode-numeric-character-reference@2.0.2: + resolution: {integrity: sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==} + + micromark-util-encode@2.0.1: + resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==} + + micromark-util-html-tag-name@2.0.1: + resolution: {integrity: sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==} + + micromark-util-normalize-identifier@2.0.1: + resolution: {integrity: sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==} + + micromark-util-resolve-all@2.0.1: + resolution: {integrity: sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==} + + micromark-util-sanitize-uri@2.0.1: + resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==} + + micromark-util-subtokenize@2.0.3: + resolution: {integrity: sha512-VXJJuNxYWSoYL6AJ6OQECCFGhIU2GGHMw8tahogePBrjkG8aCCas3ibkp7RnVOSTClg2is05/R7maAhF1XyQMg==} + + micromark-util-symbol@2.0.1: + resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==} + + micromark-util-types@2.0.1: + resolution: {integrity: sha512-534m2WhVTddrcKVepwmVEVnUAmtrx9bfIjNoQHRqfnvdaHQiFytEhJoTgpWJvDEXCO5gLTQh3wYC1PgOJA4NSQ==} + + micromark@4.0.1: + resolution: {integrity: sha512-eBPdkcoCNvYcxQOAKAlceo5SNdzZWfF+FcSupREAzdAh9rRmE239CEQAiTwIgblwnoM8zzj35sZ5ZwvSEOF6Kw==} + micromatch@4.0.5: resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} engines: {node: '>=8.6'} @@ -2326,6 +2444,9 @@ packages: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} + parse-entities@4.0.2: + resolution: {integrity: sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==} + parse-json@5.2.0: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} @@ -2395,8 +2516,8 @@ packages: peerDependencies: prettier: ^3.0.0 - prettier@3.3.3: - resolution: {integrity: sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==} + prettier@3.4.2: + resolution: {integrity: sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ==} engines: {node: '>=14'} hasBin: true @@ -2953,19 +3074,19 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/eslint-parser@7.24.8(@babel/core@7.24.9)(eslint@9.15.0)': + '@babel/eslint-parser@7.24.8(@babel/core@7.24.9)(eslint@9.17.0)': dependencies: '@babel/core': 7.24.9 '@nicolo-ribaudo/eslint-scope-5-internals': 5.1.1-v1 - eslint: 9.15.0 + eslint: 9.17.0 eslint-visitor-keys: 2.1.0 semver: 6.3.1 - '@babel/eslint-parser@7.24.8(@babel/core@7.26.0)(eslint@9.15.0)': + '@babel/eslint-parser@7.24.8(@babel/core@7.26.0)(eslint@9.17.0)': dependencies: '@babel/core': 7.26.0 '@nicolo-ribaudo/eslint-scope-5-internals': 5.1.1-v1 - eslint: 9.15.0 + eslint: 9.17.0 eslint-visitor-keys: 2.1.0 semver: 6.3.1 @@ -3453,14 +3574,11 @@ snapshots: '@bcoe/v8-coverage@0.2.3': {} - '@eslint-community/eslint-utils@4.4.0(eslint@9.15.0)': + '@eslint-community/eslint-utils@4.4.0(eslint@9.17.0)': dependencies: - eslint: 9.15.0 + eslint: 9.17.0 eslint-visitor-keys: 3.4.3 - '@eslint-community/regexpp@4.10.0': - optional: true - '@eslint-community/regexpp@4.12.1': {} '@eslint/config-array@0.19.0': @@ -3487,7 +3605,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/js@9.15.0': {} + '@eslint/js@9.17.0': {} '@eslint/object-schema@2.1.4': {} @@ -3745,10 +3863,10 @@ snapshots: '@lwc/errors@8.8.0': {} - '@lwc/eslint-plugin-lwc@1.8.2(@babel/eslint-parser@7.24.8(@babel/core@7.26.0)(eslint@9.15.0))(eslint@9.15.0)': + '@lwc/eslint-plugin-lwc@1.9.0(@babel/eslint-parser@7.24.8(@babel/core@7.26.0)(eslint@9.17.0))(eslint@9.17.0)': dependencies: - '@babel/eslint-parser': 7.24.8(@babel/core@7.26.0)(eslint@9.15.0) - eslint: 9.15.0 + '@babel/eslint-parser': 7.24.8(@babel/core@7.26.0)(eslint@9.17.0) + eslint: 9.17.0 globals: 13.24.0 minimatch: 9.0.5 @@ -3868,35 +3986,35 @@ snapshots: '@prettier-apex/apex-ast-serializer-win32-x64@2.2.2': optional: true - '@prettier/plugin-xml@3.4.1(prettier@3.3.3)': + '@prettier/plugin-xml@3.4.1(prettier@3.4.2)': dependencies: '@xml-tools/parser': 1.0.11 - prettier: 3.3.3 + prettier: 3.4.2 '@rtsao/scc@1.1.0': {} - '@salesforce/eslint-config-lwc@3.6.0(@lwc/eslint-plugin-lwc@1.8.2(@babel/eslint-parser@7.24.8(@babel/core@7.26.0)(eslint@9.15.0))(eslint@9.15.0))(@salesforce/eslint-plugin-lightning@1.0.0(eslint@9.15.0))(eslint-plugin-import@2.31.0(@typescript-eslint/parser@6.12.0(eslint@9.15.0)(typescript@5.3.2))(eslint@9.15.0))(eslint-plugin-jest@28.9.0(@typescript-eslint/eslint-plugin@6.12.0(@typescript-eslint/parser@6.12.0(eslint@9.15.0)(typescript@5.3.2))(eslint@9.15.0)(typescript@5.3.2))(eslint@9.15.0)(jest@29.7.0(@types/node@20.10.0))(typescript@5.3.2))(eslint@9.15.0)': + '@salesforce/eslint-config-lwc@3.6.0(@lwc/eslint-plugin-lwc@1.9.0(@babel/eslint-parser@7.24.8(@babel/core@7.26.0)(eslint@9.17.0))(eslint@9.17.0))(@salesforce/eslint-plugin-lightning@1.0.0(eslint@9.17.0))(eslint-plugin-import@2.31.0(@typescript-eslint/parser@6.12.0(eslint@9.17.0)(typescript@5.3.2))(eslint@9.17.0))(eslint-plugin-jest@28.10.0(@typescript-eslint/eslint-plugin@6.12.0(@typescript-eslint/parser@6.12.0(eslint@9.17.0)(typescript@5.3.2))(eslint@9.17.0)(typescript@5.3.2))(eslint@9.17.0)(jest@29.7.0(@types/node@20.10.0))(typescript@5.3.2))(eslint@9.17.0)': dependencies: '@babel/core': 7.24.9 - '@babel/eslint-parser': 7.24.8(@babel/core@7.24.9)(eslint@9.15.0) - '@lwc/eslint-plugin-lwc': 1.8.2(@babel/eslint-parser@7.24.8(@babel/core@7.26.0)(eslint@9.15.0))(eslint@9.15.0) - '@salesforce/eslint-plugin-lightning': 1.0.0(eslint@9.15.0) - eslint: 9.15.0 - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@6.12.0(eslint@9.15.0)(typescript@5.3.2))(eslint@9.15.0) - eslint-plugin-jest: 28.9.0(@typescript-eslint/eslint-plugin@6.12.0(@typescript-eslint/parser@6.12.0(eslint@9.15.0)(typescript@5.3.2))(eslint@9.15.0)(typescript@5.3.2))(eslint@9.15.0)(jest@29.7.0(@types/node@20.10.0))(typescript@5.3.2) + '@babel/eslint-parser': 7.24.8(@babel/core@7.24.9)(eslint@9.17.0) + '@lwc/eslint-plugin-lwc': 1.9.0(@babel/eslint-parser@7.24.8(@babel/core@7.26.0)(eslint@9.17.0))(eslint@9.17.0) + '@salesforce/eslint-plugin-lightning': 1.0.0(eslint@9.17.0) + eslint: 9.17.0 + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@6.12.0(eslint@9.17.0)(typescript@5.3.2))(eslint@9.17.0) + eslint-plugin-jest: 28.10.0(@typescript-eslint/eslint-plugin@6.12.0(@typescript-eslint/parser@6.12.0(eslint@9.17.0)(typescript@5.3.2))(eslint@9.17.0)(typescript@5.3.2))(eslint@9.17.0)(jest@29.7.0(@types/node@20.10.0))(typescript@5.3.2) eslint-restricted-globals: 0.2.0 semver: 7.6.3 transitivePeerDependencies: - supports-color - '@salesforce/eslint-plugin-aura@2.1.0(eslint@9.15.0)': + '@salesforce/eslint-plugin-aura@2.1.0(eslint@9.17.0)': dependencies: - eslint: 9.15.0 - eslint-plugin-compat: 4.2.0(eslint@9.15.0) + eslint: 9.17.0 + eslint-plugin-compat: 4.2.0(eslint@9.17.0) - '@salesforce/eslint-plugin-lightning@1.0.0(eslint@9.15.0)': + '@salesforce/eslint-plugin-lightning@1.0.0(eslint@9.17.0)': dependencies: - eslint: 9.15.0 + eslint: 9.17.0 '@salesforce/sfdx-lwc-jest@7.0.1(@types/node@20.10.0)': dependencies: @@ -3970,6 +4088,10 @@ snapshots: dependencies: '@babel/types': 7.24.0 + '@types/debug@4.1.12': + dependencies: + '@types/ms': 0.7.34 + '@types/estree-jsx@1.0.5': dependencies: '@types/estree': 1.0.6 @@ -4000,6 +4122,10 @@ snapshots: '@types/json5@0.0.29': {} + '@types/katex@0.16.7': {} + + '@types/ms@0.7.34': {} + '@types/node@20.10.0': dependencies: undici-types: 5.26.5 @@ -4010,26 +4136,28 @@ snapshots: '@types/tough-cookie@4.0.5': {} + '@types/unist@2.0.11': {} + '@types/yargs-parser@21.0.3': {} '@types/yargs@17.0.32': dependencies: '@types/yargs-parser': 21.0.3 - '@typescript-eslint/eslint-plugin@6.12.0(@typescript-eslint/parser@6.12.0(eslint@9.15.0)(typescript@5.3.2))(eslint@9.15.0)(typescript@5.3.2)': + '@typescript-eslint/eslint-plugin@6.12.0(@typescript-eslint/parser@6.12.0(eslint@9.17.0)(typescript@5.3.2))(eslint@9.17.0)(typescript@5.3.2)': dependencies: - '@eslint-community/regexpp': 4.10.0 - '@typescript-eslint/parser': 6.12.0(eslint@9.15.0)(typescript@5.3.2) + '@eslint-community/regexpp': 4.12.1 + '@typescript-eslint/parser': 6.12.0(eslint@9.17.0)(typescript@5.3.2) '@typescript-eslint/scope-manager': 6.12.0 - '@typescript-eslint/type-utils': 6.12.0(eslint@9.15.0)(typescript@5.3.2) - '@typescript-eslint/utils': 6.12.0(eslint@9.15.0)(typescript@5.3.2) + '@typescript-eslint/type-utils': 6.12.0(eslint@9.17.0)(typescript@5.3.2) + '@typescript-eslint/utils': 6.12.0(eslint@9.17.0)(typescript@5.3.2) '@typescript-eslint/visitor-keys': 6.12.0 debug: 4.3.4 - eslint: 9.15.0 + eslint: 9.17.0 graphemer: 1.4.0 ignore: 5.3.0 natural-compare: 1.4.0 - semver: 7.5.4 + semver: 7.6.3 ts-api-utils: 1.0.3(typescript@5.3.2) optionalDependencies: typescript: 5.3.2 @@ -4037,14 +4165,14 @@ snapshots: - supports-color optional: true - '@typescript-eslint/parser@6.12.0(eslint@9.15.0)(typescript@5.3.2)': + '@typescript-eslint/parser@6.12.0(eslint@9.17.0)(typescript@5.3.2)': dependencies: '@typescript-eslint/scope-manager': 6.12.0 '@typescript-eslint/types': 6.12.0 '@typescript-eslint/typescript-estree': 6.12.0(typescript@5.3.2) '@typescript-eslint/visitor-keys': 6.12.0 debug: 4.3.4 - eslint: 9.15.0 + eslint: 9.17.0 optionalDependencies: typescript: 5.3.2 transitivePeerDependencies: @@ -4056,12 +4184,12 @@ snapshots: '@typescript-eslint/types': 6.12.0 '@typescript-eslint/visitor-keys': 6.12.0 - '@typescript-eslint/type-utils@6.12.0(eslint@9.15.0)(typescript@5.3.2)': + '@typescript-eslint/type-utils@6.12.0(eslint@9.17.0)(typescript@5.3.2)': dependencies: '@typescript-eslint/typescript-estree': 6.12.0(typescript@5.3.2) - '@typescript-eslint/utils': 6.12.0(eslint@9.15.0)(typescript@5.3.2) + '@typescript-eslint/utils': 6.12.0(eslint@9.17.0)(typescript@5.3.2) debug: 4.3.4 - eslint: 9.15.0 + eslint: 9.17.0 ts-api-utils: 1.0.3(typescript@5.3.2) optionalDependencies: typescript: 5.3.2 @@ -4078,23 +4206,23 @@ snapshots: debug: 4.3.4 globby: 11.1.0 is-glob: 4.0.3 - semver: 7.5.4 + semver: 7.6.3 ts-api-utils: 1.0.3(typescript@5.3.2) optionalDependencies: typescript: 5.3.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@6.12.0(eslint@9.15.0)(typescript@5.3.2)': + '@typescript-eslint/utils@6.12.0(eslint@9.17.0)(typescript@5.3.2)': dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.15.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@9.17.0) '@types/json-schema': 7.0.15 '@types/semver': 7.5.6 '@typescript-eslint/scope-manager': 6.12.0 '@typescript-eslint/types': 6.12.0 '@typescript-eslint/typescript-estree': 6.12.0(typescript@5.3.2) - eslint: 9.15.0 - semver: 7.5.4 + eslint: 9.17.0 + semver: 7.6.3 transitivePeerDependencies: - supports-color - typescript @@ -4407,6 +4535,12 @@ snapshots: char-regex@1.0.2: {} + character-entities-legacy@3.0.0: {} + + character-entities@2.0.2: {} + + character-reference-invalid@2.0.1: {} + chevrotain@7.1.1: dependencies: regexp-to-ast: 0.5.0 @@ -4441,6 +4575,8 @@ snapshots: dependencies: delayed-stream: 1.0.0 + commander@8.3.0: {} + concat-map@0.0.1: {} convert-source-map@2.0.0: {} @@ -4516,6 +4652,10 @@ snapshots: decimal.js@10.4.3: {} + decode-named-character-reference@1.0.2: + dependencies: + character-entities: 2.0.2 + dedent@1.5.1: {} deep-is@0.1.4: {} @@ -4542,8 +4682,14 @@ snapshots: delayed-stream@1.0.0: {} + dequal@2.0.3: {} + detect-newline@3.1.0: {} + devlop@1.1.0: + dependencies: + dequal: 2.0.3 + diff-sequences@29.6.3: {} diffable-html@4.1.0: @@ -4741,9 +4887,9 @@ snapshots: optionalDependencies: source-map: 0.6.1 - eslint-config-prettier@9.1.0(eslint@9.15.0): + eslint-config-prettier@9.1.0(eslint@9.17.0): dependencies: - eslint: 9.15.0 + eslint: 9.17.0 eslint-import-resolver-node@0.3.9: dependencies: @@ -4753,28 +4899,28 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.0(@typescript-eslint/parser@6.12.0(eslint@9.15.0)(typescript@5.3.2))(eslint-import-resolver-node@0.3.9)(eslint@9.15.0): + eslint-module-utils@2.12.0(@typescript-eslint/parser@6.12.0(eslint@9.17.0)(typescript@5.3.2))(eslint-import-resolver-node@0.3.9)(eslint@9.17.0): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 6.12.0(eslint@9.15.0)(typescript@5.3.2) - eslint: 9.15.0 + '@typescript-eslint/parser': 6.12.0(eslint@9.17.0)(typescript@5.3.2) + eslint: 9.17.0 eslint-import-resolver-node: 0.3.9 transitivePeerDependencies: - supports-color - eslint-plugin-compat@4.2.0(eslint@9.15.0): + eslint-plugin-compat@4.2.0(eslint@9.17.0): dependencies: '@mdn/browser-compat-data': 5.4.1 ast-metadata-inferer: 0.8.0 browserslist: 4.22.1 caniuse-lite: 1.0.30001564 - eslint: 9.15.0 + eslint: 9.17.0 find-up: 5.0.0 lodash.memoize: 4.1.2 semver: 7.5.4 - eslint-plugin-import@2.31.0(@typescript-eslint/parser@6.12.0(eslint@9.15.0)(typescript@5.3.2))(eslint@9.15.0): + eslint-plugin-import@2.31.0(@typescript-eslint/parser@6.12.0(eslint@9.17.0)(typescript@5.3.2))(eslint@9.17.0): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.8 @@ -4783,9 +4929,9 @@ snapshots: array.prototype.flatmap: 1.3.2 debug: 3.2.7 doctrine: 2.1.0 - eslint: 9.15.0 + eslint: 9.17.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@6.12.0(eslint@9.15.0)(typescript@5.3.2))(eslint-import-resolver-node@0.3.9)(eslint@9.15.0) + eslint-module-utils: 2.12.0(@typescript-eslint/parser@6.12.0(eslint@9.17.0)(typescript@5.3.2))(eslint-import-resolver-node@0.3.9)(eslint@9.17.0) hasown: 2.0.2 is-core-module: 2.15.1 is-glob: 4.0.3 @@ -4797,18 +4943,18 @@ snapshots: string.prototype.trimend: 1.0.8 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 6.12.0(eslint@9.15.0)(typescript@5.3.2) + '@typescript-eslint/parser': 6.12.0(eslint@9.17.0)(typescript@5.3.2) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - eslint-plugin-jest@28.9.0(@typescript-eslint/eslint-plugin@6.12.0(@typescript-eslint/parser@6.12.0(eslint@9.15.0)(typescript@5.3.2))(eslint@9.15.0)(typescript@5.3.2))(eslint@9.15.0)(jest@29.7.0(@types/node@20.10.0))(typescript@5.3.2): + eslint-plugin-jest@28.10.0(@typescript-eslint/eslint-plugin@6.12.0(@typescript-eslint/parser@6.12.0(eslint@9.17.0)(typescript@5.3.2))(eslint@9.17.0)(typescript@5.3.2))(eslint@9.17.0)(jest@29.7.0(@types/node@20.10.0))(typescript@5.3.2): dependencies: - '@typescript-eslint/utils': 6.12.0(eslint@9.15.0)(typescript@5.3.2) - eslint: 9.15.0 + '@typescript-eslint/utils': 6.12.0(eslint@9.17.0)(typescript@5.3.2) + eslint: 9.17.0 optionalDependencies: - '@typescript-eslint/eslint-plugin': 6.12.0(@typescript-eslint/parser@6.12.0(eslint@9.15.0)(typescript@5.3.2))(eslint@9.15.0)(typescript@5.3.2) + '@typescript-eslint/eslint-plugin': 6.12.0(@typescript-eslint/parser@6.12.0(eslint@9.17.0)(typescript@5.3.2))(eslint@9.17.0)(typescript@5.3.2) jest: 29.7.0(@types/node@20.10.0) transitivePeerDependencies: - supports-color @@ -4832,14 +4978,14 @@ snapshots: eslint-visitor-keys@4.2.0: {} - eslint@9.15.0: + eslint@9.17.0: dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.15.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@9.17.0) '@eslint-community/regexpp': 4.12.1 '@eslint/config-array': 0.19.0 '@eslint/core': 0.9.0 '@eslint/eslintrc': 3.2.0 - '@eslint/js': 9.15.0 + '@eslint/js': 9.17.0 '@eslint/plugin-kit': 0.2.3 '@humanfs/node': 0.16.6 '@humanwhocodes/module-importer': 1.0.1 @@ -5190,6 +5336,13 @@ snapshots: hasown: 2.0.2 side-channel: 1.0.4 + is-alphabetical@2.0.1: {} + + is-alphanumerical@2.0.1: + dependencies: + is-alphabetical: 2.0.1 + is-decimal: 2.0.1 + is-array-buffer@3.0.2: dependencies: call-bind: 1.0.5 @@ -5230,6 +5383,8 @@ snapshots: dependencies: has-tostringtag: 1.0.0 + is-decimal@2.0.1: {} + is-extglob@2.1.1: {} is-fullwidth-code-point@3.0.0: {} @@ -5240,6 +5395,8 @@ snapshots: dependencies: is-extglob: 2.1.1 + is-hexadecimal@2.0.1: {} + is-negative-zero@2.0.2: {} is-negative-zero@2.0.3: {} @@ -5735,6 +5892,10 @@ snapshots: json5@2.2.3: {} + katex@0.16.19: + dependencies: + commander: 8.3.0 + keyv@4.5.4: dependencies: json-buffer: 3.0.1 @@ -5802,12 +5963,19 @@ snapshots: punycode.js: 2.3.1 uc.micro: 2.1.0 - markdownlint-micromark@0.1.12: {} - - markdownlint@0.36.1: + markdownlint@0.37.3: dependencies: markdown-it: 14.1.0 - markdownlint-micromark: 0.1.12 + micromark: 4.0.1 + micromark-core-commonmark: 2.0.2 + micromark-extension-directive: 3.0.2 + micromark-extension-gfm-autolink-literal: 2.1.0 + micromark-extension-gfm-footnote: 2.1.0 + micromark-extension-gfm-table: 2.1.0 + micromark-extension-math: 3.1.0 + micromark-util-types: 2.0.1 + transitivePeerDependencies: + - supports-color match-json@1.3.7: {} @@ -5819,6 +5987,178 @@ snapshots: meriyah@5.0.0: {} + micromark-core-commonmark@2.0.2: + dependencies: + decode-named-character-reference: 1.0.2 + devlop: 1.1.0 + micromark-factory-destination: 2.0.1 + micromark-factory-label: 2.0.1 + micromark-factory-space: 2.0.1 + micromark-factory-title: 2.0.1 + micromark-factory-whitespace: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-chunked: 2.0.1 + micromark-util-classify-character: 2.0.1 + micromark-util-html-tag-name: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-subtokenize: 2.0.3 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + + micromark-extension-directive@3.0.2: + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.1 + micromark-factory-whitespace: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + parse-entities: 4.0.2 + + micromark-extension-gfm-autolink-literal@2.1.0: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + + micromark-extension-gfm-footnote@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-core-commonmark: 2.0.2 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + + micromark-extension-gfm-table@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + + micromark-extension-math@3.1.0: + dependencies: + '@types/katex': 0.16.7 + devlop: 1.1.0 + katex: 0.16.19 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + + micromark-factory-destination@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + + micromark-factory-label@2.0.1: + dependencies: + devlop: 1.1.0 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + + micromark-factory-space@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-types: 2.0.1 + + micromark-factory-title@2.0.1: + dependencies: + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + + micromark-factory-whitespace@2.0.1: + dependencies: + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + + micromark-util-character@2.1.1: + dependencies: + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + + micromark-util-chunked@2.0.1: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-classify-character@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + + micromark-util-combine-extensions@2.0.1: + dependencies: + micromark-util-chunked: 2.0.1 + micromark-util-types: 2.0.1 + + micromark-util-decode-numeric-character-reference@2.0.2: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-encode@2.0.1: {} + + micromark-util-html-tag-name@2.0.1: {} + + micromark-util-normalize-identifier@2.0.1: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-resolve-all@2.0.1: + dependencies: + micromark-util-types: 2.0.1 + + micromark-util-sanitize-uri@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-encode: 2.0.1 + micromark-util-symbol: 2.0.1 + + micromark-util-subtokenize@2.0.3: + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + + micromark-util-symbol@2.0.1: {} + + micromark-util-types@2.0.1: {} + + micromark@4.0.1: + dependencies: + '@types/debug': 4.1.12 + debug: 4.3.4 + decode-named-character-reference: 1.0.2 + devlop: 1.1.0 + micromark-core-commonmark: 2.0.2 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-chunked: 2.0.1 + micromark-util-combine-extensions: 2.0.1 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-encode: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-subtokenize: 2.0.3 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + transitivePeerDependencies: + - supports-color + micromatch@4.0.5: dependencies: braces: 3.0.2 @@ -5944,6 +6284,16 @@ snapshots: dependencies: callsites: 3.1.0 + parse-entities@4.0.2: + dependencies: + '@types/unist': 2.0.11 + character-entities-legacy: 3.0.0 + character-reference-invalid: 2.0.1 + decode-named-character-reference: 1.0.2 + is-alphanumerical: 2.0.1 + is-decimal: 2.0.1 + is-hexadecimal: 2.0.1 + parse-json@5.2.0: dependencies: '@babel/code-frame': 7.24.2 @@ -5994,10 +6344,10 @@ snapshots: prelude-ls@1.2.1: {} - prettier-plugin-apex@2.2.2(prettier@3.3.3): + prettier-plugin-apex@2.2.2(prettier@3.4.2): dependencies: jest-docblock: 29.7.0 - prettier: 3.3.3 + prettier: 3.4.2 wait-on: 8.0.1 optionalDependencies: '@prettier-apex/apex-ast-serializer-darwin-arm64': 2.2.2 @@ -6007,7 +6357,7 @@ snapshots: transitivePeerDependencies: - debug - prettier@3.3.3: {} + prettier@3.4.2: {} pretty-format@29.7.0: dependencies: diff --git a/prettier.config.js b/prettier.config.js deleted file mode 100644 index dcad9ff..0000000 --- a/prettier.config.js +++ /dev/null @@ -1,19 +0,0 @@ -/** @type {import('prettier').Options} */ -module.exports = { - trailingComma: 'none', - tabWidth: 2, - printWidth: 120, -// plugins: ['prettier-plugin-apex'], - singleQuote: true, - semi: false, - overrides: [ - { - files: '**/lwc/**/*.html', - options: { parser: 'lwc' } - }, - { - files: '*.{cmp,page,component}', - options: { parser: 'html' } - } - ], -} diff --git a/sfdx-project.json b/sfdx-project.json index 9614d31..c9a454e 100644 --- a/sfdx-project.json +++ b/sfdx-project.json @@ -1,12 +1,12 @@ { - "packageDirectories": [ - { - "path": "src/PackBuild", - "default": true - } - ], - "name": "package-builder", - "namespace": "PackBuild", - "sfdcLoginUrl": "https://login.salesforce.com", - "sourceApiVersion": "59.0" + "packageDirectories": [ + { + "path": "src/PackBuild", + "default": true + } + ], + "name": "package-builder", + "namespace": "PackBuild", + "sfdcLoginUrl": "https://login.salesforce.com", + "sourceApiVersion": "59.0" } diff --git a/src/PackBuild/classes/MetadataSelector.cls b/src/PackBuild/classes/MetadataSelector.cls index b024ea9..a749f2b 100644 --- a/src/PackBuild/classes/MetadataSelector.cls +++ b/src/PackBuild/classes/MetadataSelector.cls @@ -5,185 +5,161 @@ */ @SuppressWarnings('PMD.StdCyclomaticComplexity') public with sharing class MetadataSelector { - /** - * Custom Exception class - */ - public class MetadataSelectorException extends Exception { - } - - /** - * Get List of Metadata for specific Metadata Type defined. - * @param metadataType API name of metadata type - * @param folderNames list of folder names (max: 3) - * @param packageType package type (all, unamanaged, managed) - * @return `String` - * @exception Invalid_Package_Types - */ - @SuppressWarnings('PMD.CognitiveComplexity, PMD.CyclomaticComplexity') - @AuraEnabled(cacheable=true) - public static String listMetadata(String metadataType, List folderNames, String packageType) { - if (!MetadataUtility.PACKAGE_TYPES.contains(packageType)) { - throw new MetadataSelectorException(System.Label.Invlid_Package_Types); - } - - MetadataService.MetadataPort service = createService(); - List files = new List(); - List queries = new List(); - if (folderNames.size() != 0) { - for (String foldername : folderNames) { - MetadataService.ListMetadataQuery query = new MetadataService.ListMetadataQuery(); - query.folder = folderName; - query.type_x = metadataType; - queries.add(query); - } - } else { - MetadataService.ListMetadataQuery query = new MetadataService.ListMetadataQuery(); - query.type_x = metadataType; - queries.add(query); - } - - MetadataService.FileProperties[] properties = service.listMetadata(queries, API_VERSION); - - if (properties != null) { - for (MetadataService.FileProperties property : properties) { - if (packageType == PACKAGETYPE_ALL) { - files.add( - new FileProperty( - property.fileName, - property.fullName, - property.id, - property.manageableState, - property.namespacePrefix - ) - ); - } else if (packageType == PACKAGETYPE_UNMANAGED) { - if (property.namespacePrefix == null) { - files.add( - new FileProperty( - property.fileName, - property.fullName, - property.id, - property.manageableState, - property.namespacePrefix - ) - ); - } - } else if (packageType == PACKAGETYPE_MANAGED) { - if (property.namespacePrefix != null) { - files.add( - new FileProperty( - property.fileName, - property.fullName, - property.id, - property.manageableState, - property.namespacePrefix - ) - ); - } - } - } - - return JSON.serialize(files); - } else { - return 'NoData'; - } - } - - /** - * Get list of Folders for specific metadata type - * @param metadataType API name of metadata type - * @return `string` - */ - @AuraEnabled(cacheable=true) - public static string listFolders(String metadataType) { - List toReturn = new List(); - List folders = getFolders(metadataType); - - for (Folder f : folders) { - toReturn.add(new KeyValuePair(f.Name, f.DeveloperName)); - } - - return JSON.serialize(toReturn); - } - - /** - * File Property class used for showing data in LWC easily - */ - public class FileProperty { - public String fileName; - public String fullName; - public String id; - public String manageableState; - public String namespacePrefix; - - /** - * Constructor for File Property to initialize - * @param fileName name of File - * @param fullName full name used API - * @param id id of file - * @param manageableState state of file managed or unmanaged - * @param namespacePrefix namespace prefix - */ - @SuppressWarnings('PMD.ExcessiveParameterList') - public FileProperty(String fileName, String fullName, String id, string manageableState, String namespacePrefix) { - this.fileName = fileName; - this.fullName = fullName; - this.id = id; - this.manageableState = manageableState; - this.namespacePrefix = namespacePrefix; - } - } - - /** - * KeyValuePair to mimic SelectOption for usage in LWC - */ - public class KeyValuePair { - public String label; - public String value; - - /** - * Constructor of KeyValuePair - * @param label label of item (key) - * @param value value of item (value) - */ - public KeyValuePair(String label, String value) { - this.label = label; - this.value = value; - } - } - - /** - * Create a Metadata Service to start usage - * @return `MetadataService.MetadataPort` - */ - private static MetadataService.MetadataPort createService() { - MetadataService.MetadataPort service = new MetadataService.MetadataPort(); - service.SessionHeader = new MetadataService.SessionHeader_element(); - service.SessionHeader.sessionId = MetadataUtility.getSessionIdFromVFPage(Page.SessionId); - return service; - } - - /** - * get a list of folders for a given metadata type - * @param metadataType API of metadata type - * @return `List` - */ - private static List getFolders(String metadataType) { - Set names = new Set{ metadataType }; - if (metadataType == 'EmailTemplate') { - names.add('Email'); - } - - return [ - SELECT Id, Name, DeveloperName - FROM Folder - WHERE Type IN :names AND DeveloperName != '' - WITH SECURITY_ENFORCED - ]; - } - - private static final Integer API_VERSION = Integer.ValueOf(MetadataUtility.API_VERSION); - private static final String PACKAGETYPE_ALL = 'all'; - private static final String PACKAGETYPE_MANAGED = 'managedOnly'; - private static final String PACKAGETYPE_UNMANAGED = 'unmanagedOnly'; + /** + * Custom Exception class + */ + public class MetadataSelectorException extends Exception { + } + + /** + * Get List of Metadata for specific Metadata Type defined. + * @param metadataType API name of metadata type + * @param folderNames list of folder names (max: 3) + * @param packageType package type (all, unamanaged, managed) + * @return `String` + * @exception Invalid_Package_Types + */ + @SuppressWarnings('PMD.CognitiveComplexity, PMD.CyclomaticComplexity') + @AuraEnabled(cacheable=true) + public static String listMetadata(String metadataType, List folderNames, String packageType) { + if (!MetadataUtility.PACKAGE_TYPES.contains(packageType)) { + throw new MetadataSelectorException(System.Label.Invlid_Package_Types); + } + + MetadataService.MetadataPort service = createService(); + List files = new List(); + List queries = new List(); + if (folderNames.size() != 0) { + for (String foldername : folderNames) { + MetadataService.ListMetadataQuery query = new MetadataService.ListMetadataQuery(); + query.folder = folderName; + query.type_x = metadataType; + queries.add(query); + } + } else { + MetadataService.ListMetadataQuery query = new MetadataService.ListMetadataQuery(); + query.type_x = metadataType; + queries.add(query); + } + + MetadataService.FileProperties[] properties = service.listMetadata(queries, API_VERSION); + + if (properties != null) { + for (MetadataService.FileProperties property : properties) { + if (packageType == PACKAGETYPE_ALL) { + files.add(new FileProperty(property.fileName, property.fullName, property.id, property.manageableState, property.namespacePrefix)); + } else if (packageType == PACKAGETYPE_UNMANAGED) { + if (property.namespacePrefix == null) { + files.add(new FileProperty(property.fileName, property.fullName, property.id, property.manageableState, property.namespacePrefix)); + } + } else if (packageType == PACKAGETYPE_MANAGED) { + if (property.namespacePrefix != null) { + files.add(new FileProperty(property.fileName, property.fullName, property.id, property.manageableState, property.namespacePrefix)); + } + } + } + + return JSON.serialize(files); + } else { + return 'NoData'; + } + } + + /** + * Get list of Folders for specific metadata type + * @param metadataType API name of metadata type + * @return `string` + */ + @AuraEnabled(cacheable=true) + public static string listFolders(String metadataType) { + List toReturn = new List(); + List folders = getFolders(metadataType); + + for (Folder f : folders) { + toReturn.add(new KeyValuePair(f.Name, f.DeveloperName)); + } + + return JSON.serialize(toReturn); + } + + /** + * File Property class used for showing data in LWC easily + */ + public class FileProperty { + public String fileName; + public String fullName; + public String id; + public String manageableState; + public String namespacePrefix; + + /** + * Constructor for File Property to initialize + * @param fileName name of File + * @param fullName full name used API + * @param id id of file + * @param manageableState state of file managed or unmanaged + * @param namespacePrefix namespace prefix + */ + @SuppressWarnings('PMD.ExcessiveParameterList') + public FileProperty(String fileName, String fullName, String id, string manageableState, String namespacePrefix) { + this.fileName = fileName; + this.fullName = fullName; + this.id = id; + this.manageableState = manageableState; + this.namespacePrefix = namespacePrefix; + } + } + + /** + * KeyValuePair to mimic SelectOption for usage in LWC + */ + public class KeyValuePair { + public String label; + public String value; + + /** + * Constructor of KeyValuePair + * @param label label of item (key) + * @param value value of item (value) + */ + public KeyValuePair(String label, String value) { + this.label = label; + this.value = value; + } + } + + /** + * Create a Metadata Service to start usage + * @return `MetadataService.MetadataPort` + */ + private static MetadataService.MetadataPort createService() { + MetadataService.MetadataPort service = new MetadataService.MetadataPort(); + service.SessionHeader = new MetadataService.SessionHeader_element(); + service.SessionHeader.sessionId = MetadataUtility.getSessionIdFromVFPage(Page.SessionId); + return service; + } + + /** + * get a list of folders for a given metadata type + * @param metadataType API of metadata type + * @return `List` + */ + private static List getFolders(String metadataType) { + Set names = new Set{ metadataType }; + if (metadataType == 'EmailTemplate') { + names.add('Email'); + } + + return [ + SELECT Id, Name, DeveloperName + FROM Folder + WHERE Type IN :names AND DeveloperName != '' + WITH SECURITY_ENFORCED + ]; + } + + private static final Integer API_VERSION = Integer.ValueOf(MetadataUtility.API_VERSION); + private static final String PACKAGETYPE_ALL = 'all'; + private static final String PACKAGETYPE_MANAGED = 'managedOnly'; + private static final String PACKAGETYPE_UNMANAGED = 'unmanagedOnly'; } diff --git a/src/PackBuild/classes/MetadataService.cls b/src/PackBuild/classes/MetadataService.cls index e790209..c76a802 100644 --- a/src/PackBuild/classes/MetadataService.cls +++ b/src/PackBuild/classes/MetadataService.cls @@ -5,374 +5,300 @@ */ @SuppressWarnings('PMD.FieldNamingConventions, PMD.ExcessivePublicCount') public with sharing class MetadataService { - public static String SOAP_URI = 'http://soap.sforce.com/2006/04/metadata'; + public static String SOAP_URI = 'http://soap.sforce.com/2006/04/metadata'; - /** - * List Metadata Element Class - */ - @SuppressWarnings('PMD.ClassNamingConventions') - public class listMetadata_element { - public MetadataService.ListMetadataQuery[] queries; - public Double asOfVersion; - private String[] queries_type_info = new List{ 'queries', SOAP_URI, null, '0', '-1', 'false' }; - private String[] asOfVersion_type_info = new List{ 'asOfVersion', SOAP_URI, null, '1', '1', 'false' }; - private String[] apex_schema_type_info = new List{ SOAP_URI, 'true', 'false' }; - private String[] field_order_type_info = new List{ 'queries', 'asOfVersion' }; - } + /** + * List Metadata Element Class + */ + @SuppressWarnings('PMD.ClassNamingConventions') + public class listMetadata_element { + public MetadataService.ListMetadataQuery[] queries; + public Double asOfVersion; + private String[] queries_type_info = new List{ 'queries', SOAP_URI, null, '0', '-1', 'false' }; + private String[] asOfVersion_type_info = new List{ 'asOfVersion', SOAP_URI, null, '1', '1', 'false' }; + private String[] apex_schema_type_info = new List{ SOAP_URI, 'true', 'false' }; + private String[] field_order_type_info = new List{ 'queries', 'asOfVersion' }; + } - /** - * List Metadata Query Class - */ - public class ListMetadataQuery { - public String folder; - public String type_x; - private String[] folder_type_info = new List{ 'folder', SOAP_URI, null, '0', '1', 'false' }; - private String[] type_x_type_info = new List{ 'type', SOAP_URI, null, '1', '1', 'false' }; - private String[] apex_schema_type_info = new List{ SOAP_URI, 'true', 'false' }; - private String[] field_order_type_info = new List{ 'folder', 'type_x' }; - } + /** + * List Metadata Query Class + */ + public class ListMetadataQuery { + public String folder; + public String type_x; + private String[] folder_type_info = new List{ 'folder', SOAP_URI, null, '0', '1', 'false' }; + private String[] type_x_type_info = new List{ 'type', SOAP_URI, null, '1', '1', 'false' }; + private String[] apex_schema_type_info = new List{ SOAP_URI, 'true', 'false' }; + private String[] field_order_type_info = new List{ 'folder', 'type_x' }; + } - /** - * Describe Metadata Object - */ - public class DescribeMetadataObject { - public String[] childXmlNames; - public String directoryName; - public Boolean inFolder; - public Boolean metaFile; - public String suffix; - public String xmlName; - private String[] childXmlNames_type_info = new List{ 'childXmlNames', SOAP_URI, null, '0', '-1', 'false' }; - private String[] directoryName_type_info = new List{ 'directoryName', SOAP_URI, null, '1', '1', 'false' }; - private String[] inFolder_type_info = new List{ 'inFolder', SOAP_URI, null, '1', '1', 'false' }; - private String[] metaFile_type_info = new List{ 'metaFile', SOAP_URI, null, '1', '1', 'false' }; - private String[] suffix_type_info = new List{ 'suffix', SOAP_URI, null, '0', '1', 'false' }; - private String[] xmlName_type_info = new List{ 'xmlName', SOAP_URI, null, '1', '1', 'false' }; - private String[] apex_schema_type_info = new List{ SOAP_URI, 'true', 'false' }; - private String[] field_order_type_info = new List{ - 'childXmlNames', - 'directoryName', - 'inFolder', - 'metaFile', - 'suffix', - 'xmlName' - }; - } + /** + * Describe Metadata Object + */ + public class DescribeMetadataObject { + public String[] childXmlNames; + public String directoryName; + public Boolean inFolder; + public Boolean metaFile; + public String suffix; + public String xmlName; + private String[] childXmlNames_type_info = new List{ 'childXmlNames', SOAP_URI, null, '0', '-1', 'false' }; + private String[] directoryName_type_info = new List{ 'directoryName', SOAP_URI, null, '1', '1', 'false' }; + private String[] inFolder_type_info = new List{ 'inFolder', SOAP_URI, null, '1', '1', 'false' }; + private String[] metaFile_type_info = new List{ 'metaFile', SOAP_URI, null, '1', '1', 'false' }; + private String[] suffix_type_info = new List{ 'suffix', SOAP_URI, null, '0', '1', 'false' }; + private String[] xmlName_type_info = new List{ 'xmlName', SOAP_URI, null, '1', '1', 'false' }; + private String[] apex_schema_type_info = new List{ SOAP_URI, 'true', 'false' }; + private String[] field_order_type_info = new List{ 'childXmlNames', 'directoryName', 'inFolder', 'metaFile', 'suffix', 'xmlName' }; + } - /** - * Describe Metadata Result Class - */ - public class DescribeMetadataResult { - public MetadataService.DescribeMetadataObject[] metadataObjects; - public String organizationNamespace; - public Boolean partialSaveAllowed; - public Boolean testRequired; - private String[] metadataObjects_type_info = new List{ - 'metadataObjects', - SOAP_URI, - null, - '0', - '-1', - 'false' - }; - private String[] organizationNamespace_type_info = new List{ - 'organizationNamespace', - SOAP_URI, - null, - '1', - '1', - 'false' - }; - private String[] partialSaveAllowed_type_info = new List{ - 'partialSaveAllowed', - SOAP_URI, - null, - '1', - '1', - 'false' - }; - private String[] testRequired_type_info = new List{ 'testRequired', SOAP_URI, null, '1', '1', 'false' }; - private String[] apex_schema_type_info = new List{ SOAP_URI, 'true', 'false' }; - private String[] field_order_type_info = new List{ - 'metadataObjects', - 'organizationNamespace', - 'partialSaveAllowed', - 'testRequired' - }; - } + /** + * Describe Metadata Result Class + */ + public class DescribeMetadataResult { + public MetadataService.DescribeMetadataObject[] metadataObjects; + public String organizationNamespace; + public Boolean partialSaveAllowed; + public Boolean testRequired; + private String[] metadataObjects_type_info = new List{ 'metadataObjects', SOAP_URI, null, '0', '-1', 'false' }; + private String[] organizationNamespace_type_info = new List{ 'organizationNamespace', SOAP_URI, null, '1', '1', 'false' }; + private String[] partialSaveAllowed_type_info = new List{ 'partialSaveAllowed', SOAP_URI, null, '1', '1', 'false' }; + private String[] testRequired_type_info = new List{ 'testRequired', SOAP_URI, null, '1', '1', 'false' }; + private String[] apex_schema_type_info = new List{ SOAP_URI, 'true', 'false' }; + private String[] field_order_type_info = new List{ 'metadataObjects', 'organizationNamespace', 'partialSaveAllowed', 'testRequired' }; + } - /** - * List Metadata Response Element Class - */ - @SuppressWarnings('PMD.ClassNamingConventions') - public class listMetadataResponse_element { - public MetadataService.FileProperties[] result; - private String[] result_type_info = new List{ 'result', SOAP_URI, null, '0', '-1', 'false' }; - private String[] apex_schema_type_info = new List{ SOAP_URI, 'true', 'false' }; - private String[] field_order_type_info = new List{ 'result' }; - } + /** + * List Metadata Response Element Class + */ + @SuppressWarnings('PMD.ClassNamingConventions') + public class listMetadataResponse_element { + public MetadataService.FileProperties[] result; + private String[] result_type_info = new List{ 'result', SOAP_URI, null, '0', '-1', 'false' }; + private String[] apex_schema_type_info = new List{ SOAP_URI, 'true', 'false' }; + private String[] field_order_type_info = new List{ 'result' }; + } - /** - * File Properties Class - */ - @SuppressWarnings('PMD.TooManyFields') - public class FileProperties { - public String createdById; - public String createdByName; - public DateTime createdDate; - public String fileName; - public String fullName; - public String id; - public String lastModifiedById; - public String lastModifiedByName; - public DateTime lastModifiedDate; - public String manageableState; - public String namespacePrefix; - public String type_x; - private String[] createdById_type_info = new List{ 'createdById', SOAP_URI, null, '1', '1', 'false' }; - private String[] createdByName_type_info = new List{ 'createdByName', SOAP_URI, null, '1', '1', 'false' }; - private String[] createdDate_type_info = new List{ 'createdDate', SOAP_URI, null, '1', '1', 'false' }; - private String[] fileName_type_info = new List{ 'fileName', SOAP_URI, null, '1', '1', 'false' }; - private String[] fullName_type_info = new List{ 'fullName', SOAP_URI, null, '1', '1', 'false' }; - private String[] id_type_info = new List{ 'id', SOAP_URI, null, '1', '1', 'false' }; - private String[] lastModifiedById_type_info = new List{ - 'lastModifiedById', - SOAP_URI, - null, - '1', - '1', - 'false' - }; - private String[] lastModifiedByName_type_info = new List{ - 'lastModifiedByName', - SOAP_URI, - null, - '1', - '1', - 'false' - }; - private String[] lastModifiedDate_type_info = new List{ - 'lastModifiedDate', - SOAP_URI, - null, - '1', - '1', - 'false' - }; - private String[] manageableState_type_info = new List{ - 'manageableState', - SOAP_URI, - null, - '0', - '1', - 'false' - }; - private String[] namespacePrefix_type_info = new List{ - 'namespacePrefix', - SOAP_URI, - null, - '0', - '1', - 'false' - }; - private String[] type_x_type_info = new List{ 'type', SOAP_URI, null, '1', '1', 'false' }; - private String[] apex_schema_type_info = new List{ SOAP_URI, 'true', 'false' }; - private String[] field_order_type_info = new List{ - 'createdById', - 'createdByName', - 'createdDate', - 'fileName', - 'fullName', - 'id', - 'lastModifiedById', - 'lastModifiedByName', - 'lastModifiedDate', - 'manageableState', - 'namespacePrefix', - 'type_x' - }; - } + /** + * File Properties Class + */ + @SuppressWarnings('PMD.TooManyFields') + public class FileProperties { + public String createdById; + public String createdByName; + public DateTime createdDate; + public String fileName; + public String fullName; + public String id; + public String lastModifiedById; + public String lastModifiedByName; + public DateTime lastModifiedDate; + public String manageableState; + public String namespacePrefix; + public String type_x; + private String[] createdById_type_info = new List{ 'createdById', SOAP_URI, null, '1', '1', 'false' }; + private String[] createdByName_type_info = new List{ 'createdByName', SOAP_URI, null, '1', '1', 'false' }; + private String[] createdDate_type_info = new List{ 'createdDate', SOAP_URI, null, '1', '1', 'false' }; + private String[] fileName_type_info = new List{ 'fileName', SOAP_URI, null, '1', '1', 'false' }; + private String[] fullName_type_info = new List{ 'fullName', SOAP_URI, null, '1', '1', 'false' }; + private String[] id_type_info = new List{ 'id', SOAP_URI, null, '1', '1', 'false' }; + private String[] lastModifiedById_type_info = new List{ 'lastModifiedById', SOAP_URI, null, '1', '1', 'false' }; + private String[] lastModifiedByName_type_info = new List{ 'lastModifiedByName', SOAP_URI, null, '1', '1', 'false' }; + private String[] lastModifiedDate_type_info = new List{ 'lastModifiedDate', SOAP_URI, null, '1', '1', 'false' }; + private String[] manageableState_type_info = new List{ 'manageableState', SOAP_URI, null, '0', '1', 'false' }; + private String[] namespacePrefix_type_info = new List{ 'namespacePrefix', SOAP_URI, null, '0', '1', 'false' }; + private String[] type_x_type_info = new List{ 'type', SOAP_URI, null, '1', '1', 'false' }; + private String[] apex_schema_type_info = new List{ SOAP_URI, 'true', 'false' }; + private String[] field_order_type_info = new List{ + 'createdById', + 'createdByName', + 'createdDate', + 'fileName', + 'fullName', + 'id', + 'lastModifiedById', + 'lastModifiedByName', + 'lastModifiedDate', + 'manageableState', + 'namespacePrefix', + 'type_x' + }; + } - /** - * Log Info Class - */ - public class LogInfo { - public String category; - public String level; - private String[] category_type_info = new List{ 'category', SOAP_URI, null, '1', '1', 'false' }; - private String[] level_type_info = new List{ 'level', SOAP_URI, null, '1', '1', 'false' }; - private String[] apex_schema_type_info = new List{ SOAP_URI, 'true', 'false' }; - private String[] field_order_type_info = new List{ 'category', 'level' }; - } + /** + * Log Info Class + */ + public class LogInfo { + public String category; + public String level; + private String[] category_type_info = new List{ 'category', SOAP_URI, null, '1', '1', 'false' }; + private String[] level_type_info = new List{ 'level', SOAP_URI, null, '1', '1', 'false' }; + private String[] apex_schema_type_info = new List{ SOAP_URI, 'true', 'false' }; + private String[] field_order_type_info = new List{ 'category', 'level' }; + } - /** - * Session Header Element Class - */ - public class SessionHeader_element { - public String sessionId; - private String[] sessionId_type_info = new List{ 'sessionId', SOAP_URI, null, '1', '1', 'false' }; - private String[] apex_schema_type_info = new List{ SOAP_URI, 'true', 'false' }; - private String[] field_order_type_info = new List{ 'sessionId' }; - } + /** + * Session Header Element Class + */ + public class SessionHeader_element { + public String sessionId; + private String[] sessionId_type_info = new List{ 'sessionId', SOAP_URI, null, '1', '1', 'false' }; + private String[] apex_schema_type_info = new List{ SOAP_URI, 'true', 'false' }; + private String[] field_order_type_info = new List{ 'sessionId' }; + } - /** - * Debugging Info Element Class - */ - public class DebuggingInfo_element { - public String debugLog; - private String[] debugLog_type_info = new List{ 'debugLog', SOAP_URI, null, '1', '1', 'false' }; - private String[] apex_schema_type_info = new List{ SOAP_URI, 'true', 'false' }; - private String[] field_order_type_info = new List{ 'debugLog' }; - } + /** + * Debugging Info Element Class + */ + public class DebuggingInfo_element { + public String debugLog; + private String[] debugLog_type_info = new List{ 'debugLog', SOAP_URI, null, '1', '1', 'false' }; + private String[] apex_schema_type_info = new List{ SOAP_URI, 'true', 'false' }; + private String[] field_order_type_info = new List{ 'debugLog' }; + } - /** - * Debugger Header Element Class - */ - public class DebuggingHeader_element { - public MetadataService.LogInfo[] categories; - public String debugLevel; - private String[] categories_type_info = new List{ 'categories', SOAP_URI, null, '0', '-1', 'false' }; - private String[] debugLevel_type_info = new List{ 'debugLevel', SOAP_URI, null, '1', '1', 'false' }; - private String[] apex_schema_type_info = new List{ SOAP_URI, 'true', 'false' }; - private String[] field_order_type_info = new List{ 'categories', 'debugLevel' }; - } + /** + * Debugger Header Element Class + */ + public class DebuggingHeader_element { + public MetadataService.LogInfo[] categories; + public String debugLevel; + private String[] categories_type_info = new List{ 'categories', SOAP_URI, null, '0', '-1', 'false' }; + private String[] debugLevel_type_info = new List{ 'debugLevel', SOAP_URI, null, '1', '1', 'false' }; + private String[] apex_schema_type_info = new List{ SOAP_URI, 'true', 'false' }; + private String[] field_order_type_info = new List{ 'categories', 'debugLevel' }; + } - /** - * Call Options Element Class - */ - public class CallOptions_element { - public String client; - private String[] client_type_info = new List{ 'client', SOAP_URI, null, '1', '1', 'false' }; - private String[] apex_schema_type_info = new List{ SOAP_URI, 'true', 'false' }; - private String[] field_order_type_info = new List{ 'client' }; - } + /** + * Call Options Element Class + */ + public class CallOptions_element { + public String client; + private String[] client_type_info = new List{ 'client', SOAP_URI, null, '1', '1', 'false' }; + private String[] apex_schema_type_info = new List{ SOAP_URI, 'true', 'false' }; + private String[] field_order_type_info = new List{ 'client' }; + } - /** - * All Or None Header Element Class - */ - public class AllOrNoneHeader_element { - public Boolean allOrNone; - private String[] allOrNone_type_info = new List{ 'allOrNone', SOAP_URI, null, '1', '1', 'false' }; - private String[] apex_schema_type_info = new List{ SOAP_URI, 'true', 'false' }; - private String[] field_order_type_info = new List{ 'allOrNone' }; - } + /** + * All Or None Header Element Class + */ + public class AllOrNoneHeader_element { + public Boolean allOrNone; + private String[] allOrNone_type_info = new List{ 'allOrNone', SOAP_URI, null, '1', '1', 'false' }; + private String[] apex_schema_type_info = new List{ SOAP_URI, 'true', 'false' }; + private String[] field_order_type_info = new List{ 'allOrNone' }; + } - /** - * Describe Metadata Element Class - */ - @SuppressWarnings('PMD.ClassNamingConventions') - public class describeMetadata_element { - public Double asOfVersion; - private String[] asOfVersion_type_info = new List{ 'asOfVersion', SOAP_URI, null, '1', '1', 'false' }; - private String[] apex_schema_type_info = new List{ SOAP_URI, 'true', 'false' }; - private String[] field_order_type_info = new List{ 'asOfVersion' }; - } + /** + * Describe Metadata Element Class + */ + @SuppressWarnings('PMD.ClassNamingConventions') + public class describeMetadata_element { + public Double asOfVersion; + private String[] asOfVersion_type_info = new List{ 'asOfVersion', SOAP_URI, null, '1', '1', 'false' }; + private String[] apex_schema_type_info = new List{ SOAP_URI, 'true', 'false' }; + private String[] field_order_type_info = new List{ 'asOfVersion' }; + } - /** - * Describer Metadata Response Element Class - */ - @SuppressWarnings('PMD.ClassNamingConventions') - public class describeMetadataResponse_element { - public MetadataService.DescribeMetadataResult result; - private String[] result_type_info = new List{ 'result', SOAP_URI, null, '1', '1', 'false' }; - private String[] apex_schema_type_info = new List{ SOAP_URI, 'true', 'false' }; - private String[] field_order_type_info = new List{ 'result' }; - } + /** + * Describer Metadata Response Element Class + */ + @SuppressWarnings('PMD.ClassNamingConventions') + public class describeMetadataResponse_element { + public MetadataService.DescribeMetadataResult result; + private String[] result_type_info = new List{ 'result', SOAP_URI, null, '1', '1', 'false' }; + private String[] apex_schema_type_info = new List{ SOAP_URI, 'true', 'false' }; + private String[] field_order_type_info = new List{ 'result' }; + } - /** - * Metadata Port Class - */ - public class MetadataPort { - public String endpoint_x = - URL.getOrgDomainURL().toExternalForm() + - '/services/Soap/m/' + - MetadataUtility.API_VERSION; - public Map inputHttpHeaders_x; - public Map outputHttpHeaders_x; - public String clientCertName_x; - public String clientCert_x; - public String clientCertPasswd_x; - public Integer timeout_x; - public MetadataService.SessionHeader_element SessionHeader; - public MetadataService.DebuggingInfo_element DebuggingInfo; - public MetadataService.DebuggingHeader_element DebuggingHeader; - public MetadataService.CallOptions_element CallOptions; - public MetadataService.AllOrNoneHeader_element AllOrNoneHeader; - private String SessionHeader_hns = 'SessionHeader=' + SOAP_URI; - private String DebuggingInfo_hns = 'DebuggingInfo=' + SOAP_URI; - private String DebuggingHeader_hns = 'DebuggingHeader=' + SOAP_URI; - private String CallOptions_hns = 'CallOptions=' + SOAP_URI; - private String AllOrNoneHeader_hns = 'AllOrNoneHeader=' + SOAP_URI; - private String[] ns_map_type_info = new List{ SOAP_URI, 'MetadataService' }; + /** + * Metadata Port Class + */ + public class MetadataPort { + public String endpoint_x = URL.getOrgDomainURL().toExternalForm() + '/services/Soap/m/' + MetadataUtility.API_VERSION; + public Map inputHttpHeaders_x; + public Map outputHttpHeaders_x; + public String clientCertName_x; + public String clientCert_x; + public String clientCertPasswd_x; + public Integer timeout_x; + public MetadataService.SessionHeader_element SessionHeader; + public MetadataService.DebuggingInfo_element DebuggingInfo; + public MetadataService.DebuggingHeader_element DebuggingHeader; + public MetadataService.CallOptions_element CallOptions; + public MetadataService.AllOrNoneHeader_element AllOrNoneHeader; + private String SessionHeader_hns = 'SessionHeader=' + SOAP_URI; + private String DebuggingInfo_hns = 'DebuggingInfo=' + SOAP_URI; + private String DebuggingHeader_hns = 'DebuggingHeader=' + SOAP_URI; + private String CallOptions_hns = 'CallOptions=' + SOAP_URI; + private String AllOrNoneHeader_hns = 'AllOrNoneHeader=' + SOAP_URI; + private String[] ns_map_type_info = new List{ SOAP_URI, 'MetadataService' }; - /** - * List Metadata based on types and api version - * @param queries Query of Metadata Types - * @param asOfVersion API Version - * @return `MetadataService.FileProperties[]` - * @exception CalloutException - */ - @SuppressWarnings('PMD.LocalVariableNamingConventions') - public MetadataService.FileProperties[] listMetadata( - MetadataService.ListMetadataQuery[] queries, - Double asOfVersion - ) { - MetadataService.listMetadata_element request_x = new MetadataService.listMetadata_element(); - request_x.queries = queries; - request_x.asOfVersion = asOfVersion; - MetadataService.listMetadataResponse_element response_x; - Map response_map_x = new Map(); - response_map_x.put('response_x', response_x); - try { - WebServiceCallout.invoke( - this, - request_x, - response_map_x, - new List{ - endpoint_x, - '', - SOAP_URI, - 'listMetadata', - SOAP_URI, - 'listMetadataResponse', - 'MetadataService.listMetadataResponse_element' - } - ); - } catch (System.CalloutException ex) { - throw new AuraHandledException(ex.getMessage()); - } - response_x = response_map_x.get('response_x'); - return response_x.result; - } + /** + * List Metadata based on types and api version + * @param queries Query of Metadata Types + * @param asOfVersion API Version + * @return `MetadataService.FileProperties[]` + * @exception CalloutException + */ + @SuppressWarnings('PMD.LocalVariableNamingConventions') + public MetadataService.FileProperties[] listMetadata(MetadataService.ListMetadataQuery[] queries, Double asOfVersion) { + MetadataService.listMetadata_element request_x = new MetadataService.listMetadata_element(); + request_x.queries = queries; + request_x.asOfVersion = asOfVersion; + MetadataService.listMetadataResponse_element response_x; + Map response_map_x = new Map(); + response_map_x.put('response_x', response_x); + try { + WebServiceCallout.invoke( + this, + request_x, + response_map_x, + new List{ + endpoint_x, + '', + SOAP_URI, + 'listMetadata', + SOAP_URI, + 'listMetadataResponse', + 'MetadataService.listMetadataResponse_element' + } + ); + } catch (System.CalloutException ex) { + throw new AuraHandledException(ex.getMessage()); + } + response_x = response_map_x.get('response_x'); + return response_x.result; + } - /** - * Describe Metadata for list of all Metadata based on api version - * @param asOfVersion API Version - * @return `MetadataService.DescribeMetadataResult` - */ - @SuppressWarnings('PMD.LocalVariableNamingConventions') - public MetadataService.DescribeMetadataResult describeMetadata(Double asOfVersion) { - MetadataService.describeMetadata_element request_x = new MetadataService.describeMetadata_element(); - request_x.asOfVersion = asOfVersion; - MetadataService.describeMetadataResponse_element response_x; - Map response_map_x = new Map(); - response_map_x.put('response_x', response_x); - WebServiceCallout.invoke( - this, - request_x, - response_map_x, - new List{ - endpoint_x, - '', - SOAP_URI, - 'describeMetadata', - SOAP_URI, - 'describeMetadataResponse', - 'MetadataService.describeMetadataResponse_element' - } - ); - response_x = response_map_x.get('response_x'); - return response_x.result; - } - } + /** + * Describe Metadata for list of all Metadata based on api version + * @param asOfVersion API Version + * @return `MetadataService.DescribeMetadataResult` + */ + @SuppressWarnings('PMD.LocalVariableNamingConventions') + public MetadataService.DescribeMetadataResult describeMetadata(Double asOfVersion) { + MetadataService.describeMetadata_element request_x = new MetadataService.describeMetadata_element(); + request_x.asOfVersion = asOfVersion; + MetadataService.describeMetadataResponse_element response_x; + Map response_map_x = new Map(); + response_map_x.put('response_x', response_x); + WebServiceCallout.invoke( + this, + request_x, + response_map_x, + new List{ + endpoint_x, + '', + SOAP_URI, + 'describeMetadata', + SOAP_URI, + 'describeMetadataResponse', + 'MetadataService.describeMetadataResponse_element' + } + ); + response_x = response_map_x.get('response_x'); + return response_x.result; + } + } } diff --git a/src/PackBuild/classes/MetadataUtility.cls b/src/PackBuild/classes/MetadataUtility.cls index 185d7d2..014a73d 100644 --- a/src/PackBuild/classes/MetadataUtility.cls +++ b/src/PackBuild/classes/MetadataUtility.cls @@ -4,112 +4,110 @@ * @since 2023 */ public with sharing class MetadataUtility { - /** - * Get API Version Defined in System Properties - * @return `String` - */ - @AuraEnabled(cacheable=true) - @SuppressWarnings('PMD.MethodNamingConventions') - public static String APIVERSION() { - return API_VERSION; - } + /** + * Get API Version Defined in System Properties + * @return `String` + */ + @AuraEnabled(cacheable=true) + @SuppressWarnings('PMD.MethodNamingConventions') + public static String APIVERSION() { + return API_VERSION; + } - /** - * Get CLI Command to generate for based on System Properties (sfdx or sf) supported - * @return `String` - */ - @AuraEnabled(cacheable=true) - @SuppressWarnings('PMD.MethodNamingConventions') - public static String CLICOMMAND() { - return CLI_COMMAND; - } + /** + * Get CLI Command to generate for based on System Properties (sfdx or sf) supported + * @return `String` + */ + @AuraEnabled(cacheable=true) + @SuppressWarnings('PMD.MethodNamingConventions') + public static String CLICOMMAND() { + return CLI_COMMAND; + } - /** - * Get Session Id from ApexPage - * @param visualforcePage VF Page for Session Id - * @return `String` - */ - public static String getSessionIdFromVFPage(PageReference visualforcePage) { - String content = Test.IsRunningTest() - ? 'Start_Of_Session_Id1234567890End_Of_Session_Id' - : visualforcePage.getContent().toString(); - Integer s = content.indexOf('Start_Of_Session_Id') + 'Start_Of_Session_Id'.length(); - Integer e = content.indexOf('End_Of_Session_Id'); - return content.substring(s, e); - } + /** + * Get Session Id from ApexPage + * @param visualforcePage VF Page for Session Id + * @return `String` + */ + public static String getSessionIdFromVFPage(PageReference visualforcePage) { + String content = Test.IsRunningTest() ? 'Start_Of_Session_Id1234567890End_Of_Session_Id' : visualforcePage.getContent().toString(); + Integer s = content.indexOf('Start_Of_Session_Id') + 'Start_Of_Session_Id'.length(); + Integer e = content.indexOf('End_Of_Session_Id'); + return content.substring(s, e); + } - public static final List PACKAGE_TYPES = new List{ 'all', 'unmanagedOnly', 'managedOnly' }; + public static final List PACKAGE_TYPES = new List{ 'all', 'unmanagedOnly', 'managedOnly' }; - /** - * Get Metadata Types for the org in a SelectOption List - * @return `String` - */ - @AuraEnabled(cacheable=true) - public static String getMetadataTypes() { - MetadataService.MetadataPort service = createService(); - MetadataService.DescribeMetadataResult describeResult = service.describeMetadata(Integer.valueOf(API_VERSION)); - List metadataTypeNames = new List(); - for (MetadataService.DescribeMetadataObject metadataObject : describeResult.metadataObjects) { - metadataTypeNames.add(metadataObject.xmlName); - if (metadataObject.childXmlNames != null) { - for (String childXmlName : metadataObject.childXmlNames) { - if (childXmlName != null) { - metadataTypeNames.add(childXmlName); - } - } - } - } + /** + * Get Metadata Types for the org in a SelectOption List + * @return `String` + */ + @AuraEnabled(cacheable=true) + public static String getMetadataTypes() { + MetadataService.MetadataPort service = createService(); + MetadataService.DescribeMetadataResult describeResult = service.describeMetadata(Integer.valueOf(API_VERSION)); + List metadataTypeNames = new List(); + for (MetadataService.DescribeMetadataObject metadataObject : describeResult.metadataObjects) { + metadataTypeNames.add(metadataObject.xmlName); + if (metadataObject.childXmlNames != null) { + for (String childXmlName : metadataObject.childXmlNames) { + if (childXmlName != null) { + metadataTypeNames.add(childXmlName); + } + } + } + } - metadataTypeNames.sort(); - List toReturn = new List(); - for (String metadataTypeName : metadataTypeNames) { - toReturn.add(new MetadataSelector.KeyValuePair(metadataTypeName, metadataTypeName)); - } + metadataTypeNames.sort(); + List toReturn = new List(); + for (String metadataTypeName : metadataTypeNames) { + toReturn.add(new MetadataSelector.KeyValuePair(metadataTypeName, metadataTypeName)); + } - return JSON.serialize(toReturn); - } + return JSON.serialize(toReturn); + } - public static final List METADATA_TYPES = new List{}; + public static final List METADATA_TYPES = new List{}; - /** - * get System Property based on Category and Key with a default value if not found - * @param category Category of System Property - * @param key Unique Key of System Property - * @param defaultValue Value to use if not found - * @return `String` - */ - public static String getSystemProperty(String category, String key, String defaultValue) { - List records = [ - SELECT Id, Value__c - FROM System_Property__mdt - WHERE Category__c = :category AND Key__c = :key AND Is_Active__c = TRUE - WITH SECURITY_ENFORCED - LIMIT 1 - ]; + /** + * get System Property based on Category and Key with a default value if not found + * @param category Category of System Property + * @param key Unique Key of System Property + * @param defaultValue Value to use if not found + * @return `String` + */ + public static String getSystemProperty(String category, String key, String defaultValue) { + List records = [ + SELECT Id, Value__c + FROM System_Property__mdt + WHERE Category__c = :category AND Key__c = :key AND Is_Active__c = TRUE + WITH SECURITY_ENFORCED + LIMIT 1 + ]; - if (records.size() > 0) { - return records[0].Value__c; - } + if (records.size() > 0) { + return records[0].Value__c; + } - return defaultValue; - } + return defaultValue; + } - /** - * Create Service of Metadata API for initialization - * @return `MetadataService.MetadataPort` - */ - private static MetadataService.MetadataPort createService() { - MetadataService.MetadataPort service = new MetadataService.MetadataPort(); - service.SessionHeader = new MetadataService.SessionHeader_element(); - service.SessionHeader.sessionId = MetadataUtility.getSessionIdFromVFPage(Page.SessionId); - return service; - } + /** + * Create Service of Metadata API for initialization + * @return `MetadataService.MetadataPort` + */ + private static MetadataService.MetadataPort createService() { + MetadataService.MetadataPort service = new MetadataService.MetadataPort(); + service.SessionHeader = new MetadataService.SessionHeader_element(); + service.SessionHeader.sessionId = MetadataUtility.getSessionIdFromVFPage(Page.SessionId); + return service; + } - private static final String SYSPROP_CATEGORY = 'PackBuild'; - private static final String SYSPROP_API_KEY = 'APIVersion'; - private static final String SYSPROP_CLI = 'CLICommand'; - private static final String DEFAULT_APIVERSION = '56.0'; - private static final String DEFAULT_CLI = 'sfdx'; - public static final String API_VERSION = getSystemProperty(SYSPROP_CATEGORY, SYSPROP_API_KEY, DEFAULT_APIVERSION); - public static final String CLI_COMMAND = getSystemProperty(SYSPROP_CATEGORY, SYSPROP_CLI, DEFAULT_CLI); + private static final String SYSPROP_CATEGORY = 'PackBuild'; + private static final String SYSPROP_API_KEY = 'APIVersion'; + private static final String SYSPROP_CLI = 'CLICommand'; + private static final String DEFAULT_APIVERSION = '56.0'; + private static final String DEFAULT_CLI = 'sfdx'; + public static final String API_VERSION = getSystemProperty(SYSPROP_CATEGORY, SYSPROP_API_KEY, DEFAULT_APIVERSION); + public static final String CLI_COMMAND = getSystemProperty(SYSPROP_CATEGORY, SYSPROP_CLI, DEFAULT_CLI); } diff --git a/src/PackBuild/classes/TestMetadataSelector.cls b/src/PackBuild/classes/TestMetadataSelector.cls index 2a69a09..b64ef5e 100644 --- a/src/PackBuild/classes/TestMetadataSelector.cls +++ b/src/PackBuild/classes/TestMetadataSelector.cls @@ -5,194 +5,194 @@ */ @isTest private with sharing class TestMetadataSelector { - /** - * Mock Webservice for MetadataService - */ - private class WebServiceMockImpl implements WebServiceMock { - /** - * Do Invoke method for webservice - * @param stub - * @param request - * @param response - * @param endpoint - * @param soapAction - * @param requestName - * @param responseNS - * @param responseName - * @param responseType - */ - @SuppressWarnings('PMD.ExcessiveParameterList, PMD.AvoidNonExistentAnnotations') - public void doInvoke( - Object stub, - Object request, - Map response, - String endpoint, - String soapAction, - String requestName, - String responseNS, - String responseName, - String responseType - ) { - MetadataService.FileProperties prop1 = new MetadataService.FileProperties(); - prop1.id = '123145646'; - prop1.fullName = 'TestClass1'; - prop1.fileName = 'classes/TestClass1'; - prop1.manageableState = 'unmanaged'; - prop1.namespacePrefix = null; - prop1.type_x = 'ApexClass'; - - MetadataService.FileProperties prop2 = new MetadataService.FileProperties(); - prop2.id = '12354689'; - prop2.fullName = 'TEST__TestClass2'; - prop2.fileName = 'classes/TEST__TestClass2'; - prop2.manageableState = 'managed'; - prop2.namespacePrefix = 'TEST'; - prop2.type_x = 'ApexClass'; - - MetadataService.FileProperties prop3 = new MetadataService.FileProperties(); - prop3.id = '1234567894'; - prop3.fullName = 'TEST__TestClass2'; - prop3.fileName = 'reports/unfiled$public/report1'; - prop3.manageableState = 'unmanaged'; - prop3.namespacePrefix = null; - prop3.type_x = 'Report'; - - MetadataService.listMetadataResponse_element element = new MetadataService.listMetadataResponse_element(); - element.result = new List{ prop1, prop2, prop3 }; - - if (request instanceof MetadataService.listMetadata_element) { - response.put('response_x', element); - } - return; - } - } - - /** - * Test Get Metadata with Package type all - */ - @isTest - static void testGetMetadataAll() { - System.Test.setMock(WebServiceMock.class, new WebServiceMockImpl()); - - Test.startTest(); - String data = MetadataSelector.listMetadata('ApexClass', new List(), 'all'); - Test.stopTest(); - - List results = formatResults(data); - - Assert.areEqual(3, results.size(), 'Check that two are returned'); - } - - /** - * Get Metadata with a folder with package type all - */ - @isTest - static void testGetMetadataAllWithFolders() { - System.Test.setMock(WebServiceMock.class, new WebServiceMockImpl()); - - Test.startTest(); - String data = MetadataSelector.listMetadata('Report', new List{ 'unfiled$public' }, 'all'); - Test.stopTest(); - - List results = formatResults(data); - - Assert.areEqual(3, results.size(), 'Check that one is returned'); - } - - /** - * Get Metadata with Package Type unmanaged only - */ - @isTest - static void testGetMetadataUnmanaged() { - System.Test.setMock(WebServiceMock.class, new WebServiceMockImpl()); - - Test.startTest(); - String data = MetadataSelector.listMetadata('ApexClass', new List(), 'unmanagedOnly'); - Test.stopTest(); - - List results = formatResults(data); - Assert.areEqual(2, results.size(), 'Check that one is returned'); - Assert.areEqual(null, results[0].namespacePrefix, 'check only unmanaged is returned'); - Assert.areEqual('unmanaged', results[0].manageableState, 'check only unmanaged is returned'); - } - - /** - * Get Metadata with package type managed only - */ - @isTest - static void testGetMetadataManaged() { - System.Test.setMock(WebServiceMock.class, new WebServiceMockImpl()); - - Test.startTest(); - String data = MetadataSelector.listMetadata('ApexClass', new List(), 'managedOnly'); - Test.stopTest(); - - List results = formatResults(data); - Assert.areEqual(1, results.size(), 'Check that one is returned'); - Assert.areEqual('TEST', results[0].namespacePrefix, 'check only managed is returned'); - Assert.areEqual('managed', results[0].manageableState, 'check only managed is returned'); - } - - /* Deprecated not used anymore */ - @SuppressWarnings('PMD.ApexUnitTestClassShouldHaveAsserts, PMD.EmptyStatementBlock') - @isTest - static void testGetMetadataInvalidMetadata() { - } - - /** - * Get Metadata with an invalid package type - */ - @isTest - static void testGetMetadataInvalidPackage() { - System.Test.setMock(WebServiceMock.class, new WebServiceMockImpl()); - String data; - String error; - - Test.startTest(); - try { - data = MetadataSelector.listMetadata('ApexClass', new List(), 'test'); - } catch (Exception ex) { - error = ex.getMessage(); - } - Test.stopTest(); - - Assert.areEqual(null, data, 'Check that null is returned'); - Assert.areEqual(System.Label.Invlid_Package_Types, error, 'Check Package Type Error Message'); - } - - /** - * Get list folders for Email Template Metadata type - */ - @SuppressWarnings('PMD.ApexUnitTestClassShouldHaveAsserts') - @isTest - static void testListFolders1() { - Test.startTest(); - MetadataSelector.listFolders('EmailTemplate'); - Test.stopTest(); - } - - /** - * Get List folders for Report metadata type - */ - @SuppressWarnings('PMD.ApexUnitTestClassShouldHaveAsserts') - @isTest - static void testListFolders2() { - Test.startTest(); - MetadataSelector.listFolders('Report'); - Test.stopTest(); - } - - /** - * Format Results for assertion usage - * @param data data returned from method - * @return `List` - */ - private static List formatResults(String data) { - List props = (List) JSON.deserialize( - data, - List.class - ); - - return props; - } + /** + * Mock Webservice for MetadataService + */ + private class WebServiceMockImpl implements WebServiceMock { + /** + * Do Invoke method for webservice + * @param stub + * @param request + * @param response + * @param endpoint + * @param soapAction + * @param requestName + * @param responseNS + * @param responseName + * @param responseType + */ + @SuppressWarnings('PMD.ExcessiveParameterList, PMD.AvoidNonExistentAnnotations') + public void doInvoke( + Object stub, + Object request, + Map response, + String endpoint, + String soapAction, + String requestName, + String responseNS, + String responseName, + String responseType + ) { + MetadataService.FileProperties prop1 = new MetadataService.FileProperties(); + prop1.id = '123145646'; + prop1.fullName = 'TestClass1'; + prop1.fileName = 'classes/TestClass1'; + prop1.manageableState = 'unmanaged'; + prop1.namespacePrefix = null; + prop1.type_x = 'ApexClass'; + + MetadataService.FileProperties prop2 = new MetadataService.FileProperties(); + prop2.id = '12354689'; + prop2.fullName = 'TEST__TestClass2'; + prop2.fileName = 'classes/TEST__TestClass2'; + prop2.manageableState = 'managed'; + prop2.namespacePrefix = 'TEST'; + prop2.type_x = 'ApexClass'; + + MetadataService.FileProperties prop3 = new MetadataService.FileProperties(); + prop3.id = '1234567894'; + prop3.fullName = 'TEST__TestClass2'; + prop3.fileName = 'reports/unfiled$public/report1'; + prop3.manageableState = 'unmanaged'; + prop3.namespacePrefix = null; + prop3.type_x = 'Report'; + + MetadataService.listMetadataResponse_element element = new MetadataService.listMetadataResponse_element(); + element.result = new List{ prop1, prop2, prop3 }; + + if (request instanceof MetadataService.listMetadata_element) { + response.put('response_x', element); + } + return; + } + } + + /** + * Test Get Metadata with Package type all + */ + @isTest + static void testGetMetadataAll() { + System.Test.setMock(WebServiceMock.class, new WebServiceMockImpl()); + + Test.startTest(); + String data = MetadataSelector.listMetadata('ApexClass', new List(), 'all'); + Test.stopTest(); + + List results = formatResults(data); + + Assert.areEqual(3, results.size(), 'Check that two are returned'); + } + + /** + * Get Metadata with a folder with package type all + */ + @isTest + static void testGetMetadataAllWithFolders() { + System.Test.setMock(WebServiceMock.class, new WebServiceMockImpl()); + + Test.startTest(); + String data = MetadataSelector.listMetadata('Report', new List{ 'unfiled$public' }, 'all'); + Test.stopTest(); + + List results = formatResults(data); + + Assert.areEqual(3, results.size(), 'Check that one is returned'); + } + + /** + * Get Metadata with Package Type unmanaged only + */ + @isTest + static void testGetMetadataUnmanaged() { + System.Test.setMock(WebServiceMock.class, new WebServiceMockImpl()); + + Test.startTest(); + String data = MetadataSelector.listMetadata('ApexClass', new List(), 'unmanagedOnly'); + Test.stopTest(); + + List results = formatResults(data); + Assert.areEqual(2, results.size(), 'Check that one is returned'); + Assert.areEqual(null, results[0].namespacePrefix, 'check only unmanaged is returned'); + Assert.areEqual('unmanaged', results[0].manageableState, 'check only unmanaged is returned'); + } + + /** + * Get Metadata with package type managed only + */ + @isTest + static void testGetMetadataManaged() { + System.Test.setMock(WebServiceMock.class, new WebServiceMockImpl()); + + Test.startTest(); + String data = MetadataSelector.listMetadata('ApexClass', new List(), 'managedOnly'); + Test.stopTest(); + + List results = formatResults(data); + Assert.areEqual(1, results.size(), 'Check that one is returned'); + Assert.areEqual('TEST', results[0].namespacePrefix, 'check only managed is returned'); + Assert.areEqual('managed', results[0].manageableState, 'check only managed is returned'); + } + + /* Deprecated not used anymore */ + @SuppressWarnings('PMD.ApexUnitTestClassShouldHaveAsserts, PMD.EmptyStatementBlock') + @isTest + static void testGetMetadataInvalidMetadata() { + } + + /** + * Get Metadata with an invalid package type + */ + @isTest + static void testGetMetadataInvalidPackage() { + System.Test.setMock(WebServiceMock.class, new WebServiceMockImpl()); + String data; + String error; + + Test.startTest(); + try { + data = MetadataSelector.listMetadata('ApexClass', new List(), 'test'); + } catch (Exception ex) { + error = ex.getMessage(); + } + Test.stopTest(); + + Assert.areEqual(null, data, 'Check that null is returned'); + Assert.areEqual(System.Label.Invlid_Package_Types, error, 'Check Package Type Error Message'); + } + + /** + * Get list folders for Email Template Metadata type + */ + @SuppressWarnings('PMD.ApexUnitTestClassShouldHaveAsserts') + @isTest + static void testListFolders1() { + Test.startTest(); + MetadataSelector.listFolders('EmailTemplate'); + Test.stopTest(); + } + + /** + * Get List folders for Report metadata type + */ + @SuppressWarnings('PMD.ApexUnitTestClassShouldHaveAsserts') + @isTest + static void testListFolders2() { + Test.startTest(); + MetadataSelector.listFolders('Report'); + Test.stopTest(); + } + + /** + * Format Results for assertion usage + * @param data data returned from method + * @return `List` + */ + private static List formatResults(String data) { + List props = (List) JSON.deserialize( + data, + List.class + ); + + return props; + } } diff --git a/src/PackBuild/classes/TestMetadataService.cls b/src/PackBuild/classes/TestMetadataService.cls index 01e64e7..838c98e 100644 --- a/src/PackBuild/classes/TestMetadataService.cls +++ b/src/PackBuild/classes/TestMetadataService.cls @@ -6,105 +6,105 @@ @SuppressWarnings('PMD.ApexUnitTestClassShouldHaveAsserts') @isTest private without sharing class TestMetadataService { - /** - * Mock Webservice for MetadataService - */ - private class WebServiceMockImpl implements WebServiceMock { - /** - * Do Invoke method for webservice - * @param stub - * @param request - * @param response - * @param endpoint - * @param soapAction - * @param requestName - * @param responseNS - * @param responseName - * @param responseType - */ - @SuppressWarnings('PMD.ExcessiveParameterList') - public void doInvoke( - Object stub, - Object request, - Map response, - String endpoint, - String soapAction, - String requestName, - String responseNS, - String responseName, - String responseType - ) { - if (request instanceof MetadataService.listMetadata_element) { - response.put('response_x', new MetadataService.listMetadataResponse_element()); - } + /** + * Mock Webservice for MetadataService + */ + private class WebServiceMockImpl implements WebServiceMock { + /** + * Do Invoke method for webservice + * @param stub + * @param request + * @param response + * @param endpoint + * @param soapAction + * @param requestName + * @param responseNS + * @param responseName + * @param responseType + */ + @SuppressWarnings('PMD.ExcessiveParameterList') + public void doInvoke( + Object stub, + Object request, + Map response, + String endpoint, + String soapAction, + String requestName, + String responseNS, + String responseName, + String responseType + ) { + if (request instanceof MetadataService.listMetadata_element) { + response.put('response_x', new MetadataService.listMetadataResponse_element()); + } - if (request instanceof MetadataService.describeMetadata_element) { - response.put('response_x', new MetadataService.describeMetadataResponse_element()); - } - return; - } - } + if (request instanceof MetadataService.describeMetadata_element) { + response.put('response_x', new MetadataService.describeMetadataResponse_element()); + } + return; + } + } - /** - * Test Initiating Metadata Port - */ - @IsTest - private static void initiateMetdataPort() { - System.Test.setMock(WebServiceMock.class, new WebServiceMockImpl()); + /** + * Test Initiating Metadata Port + */ + @IsTest + private static void initiateMetdataPort() { + System.Test.setMock(WebServiceMock.class, new WebServiceMockImpl()); - Test.startTest(); - new MetadataService.MetadataPort(); - Test.stopTest(); - } + Test.startTest(); + new MetadataService.MetadataPort(); + Test.stopTest(); + } - /** - * Test List Metadata - */ - @IsTest - private static void listMetadataTest() { - System.Test.setMock(WebServiceMock.class, new WebServiceMockImpl()); + /** + * Test List Metadata + */ + @IsTest + private static void listMetadataTest() { + System.Test.setMock(WebServiceMock.class, new WebServiceMockImpl()); - Test.startTest(); - MetadataService.MetadataPort metaDataPort = new MetadataService.MetadataPort(); - metaDataPort.listMetadata(null, null); - Test.stopTest(); - } + Test.startTest(); + MetadataService.MetadataPort metaDataPort = new MetadataService.MetadataPort(); + metaDataPort.listMetadata(null, null); + Test.stopTest(); + } - /** - * Test Describe Metadata - */ - @IsTest - private static void describeMetadataTest() { - System.Test.setMock(WebServiceMock.class, new WebServiceMockImpl()); + /** + * Test Describe Metadata + */ + @IsTest + private static void describeMetadataTest() { + System.Test.setMock(WebServiceMock.class, new WebServiceMockImpl()); - Test.startTest(); - MetadataService.MetadataPort metaDataPort = new MetadataService.MetadataPort(); - metaDataPort.describeMetadata(null); - Test.stopTest(); - } + Test.startTest(); + MetadataService.MetadataPort metaDataPort = new MetadataService.MetadataPort(); + metaDataPort.describeMetadata(null); + Test.stopTest(); + } - /** - * Code Coverage for all other methods - */ - @IsTest - private static void coverGeneratedCodeTypes() { - Test.startTest(); - new MetadataService(); - new MetadataService.listMetadataResponse_element(); - new MetadataService.listMetadata_element(); - new MetadataService.ListMetadataQuery(); - new MetadataService.listMetadataResponse_element(); - new MetadataService.describeMetadata_element(); - new MetadataService.describeMetadataResponse_element(); - new MetadataService.DescribeMetadataObject(); - new MetadataService.DescribeMetadataResult(); - new MetadataService.FileProperties(); - new MetadataService.LogInfo(); - new MetadataService.SessionHeader_element(); - new MetadataService.DebuggingInfo_element(); - new MetadataService.DebuggingHeader_element(); - new MetadataService.CallOptions_element(); - new MetadataService.AllOrNoneHeader_element(); - Test.stopTest(); - } + /** + * Code Coverage for all other methods + */ + @IsTest + private static void coverGeneratedCodeTypes() { + Test.startTest(); + new MetadataService(); + new MetadataService.listMetadataResponse_element(); + new MetadataService.listMetadata_element(); + new MetadataService.ListMetadataQuery(); + new MetadataService.listMetadataResponse_element(); + new MetadataService.describeMetadata_element(); + new MetadataService.describeMetadataResponse_element(); + new MetadataService.DescribeMetadataObject(); + new MetadataService.DescribeMetadataResult(); + new MetadataService.FileProperties(); + new MetadataService.LogInfo(); + new MetadataService.SessionHeader_element(); + new MetadataService.DebuggingInfo_element(); + new MetadataService.DebuggingHeader_element(); + new MetadataService.CallOptions_element(); + new MetadataService.AllOrNoneHeader_element(); + Test.stopTest(); + } } diff --git a/src/PackBuild/classes/TestMetadataUtility.cls b/src/PackBuild/classes/TestMetadataUtility.cls index 360f9a6..972da91 100644 --- a/src/PackBuild/classes/TestMetadataUtility.cls +++ b/src/PackBuild/classes/TestMetadataUtility.cls @@ -5,186 +5,186 @@ */ @isTest private with sharing class TestMetadataUtility { - /** - * Mock Webservice for MetadataService - */ - private class WebServiceMockImpl implements WebServiceMock { - /** - * Do Invoke method for webservice - * @param stub - * @param request - * @param response - * @param endpoint - * @param soapAction - * @param requestName - * @param responseNS - * @param responseName - * @param responseType - */ - @SuppressWarnings('PMD.ExcessiveParameterList') - public void doInvoke( - Object stub, - Object request, - Map response, - String endpoint, - String soapAction, - String requestName, - String responseNS, - String responseName, - String responseType - ) { - MetadataService.DescribeMetadataObject prop1 = new MetadataService.DescribeMetadataObject(); - prop1.childXmlNames = new List{}; - prop1.directoryName = ''; - prop1.inFolder = false; - prop1.metaFile = false; - prop1.suffix = null; - prop1.xmlName = 'ApexClass'; - - MetadataService.DescribeMetadataObject prop2 = new MetadataService.DescribeMetadataObject(); - prop2.childXmlNames = new List{}; - prop2.directoryName = ''; - prop2.inFolder = false; - prop2.metaFile = false; - prop2.suffix = null; - prop2.xmlName = 'ApexTrigger'; - - MetadataService.DescribeMetadataObject prop3 = new MetadataService.DescribeMetadataObject(); - prop3.childXmlNames = new List{ 'Test' }; - prop3.directoryName = ''; - prop3.inFolder = false; - prop3.metaFile = false; - prop3.suffix = null; - prop3.xmlName = 'ApexPage'; - - MetadataService.DescribeMetadataResult prop4 = new MetadataService.DescribeMetadataResult(); - prop4.metadataObjects = new List{ prop1, prop2, prop3 }; - prop4.organizationNamespace = null; - prop4.partialSaveAllowed = false; - prop4.testRequired = false; - - MetadataService.describeMetadataResponse_element element = new MetadataService.describeMetadataResponse_element(); - element.result = prop4; - - if (request instanceof MetadataService.describeMetadata_element) { - response.put('response_x', element); - } - return; - } - } - - /** - * Test Get Session Id - */ - @isTest - static void testSessionId() { - Test.startTest(); - - String sessionId = MetadataUtility.getSessionIdFromVFPage(Page.SessionId); - Test.stopTest(); - Assert.areEqual('1234567890', sessionId, 'Check Session Id equals 1234567890'); - } - - /** - * Test API Version retrieve - */ - @SuppressWarnings('PMD.MethodNamingConventions') - @isTest - static void testApi_Version() { - Test.startTest(); - String apiVersion = MetadataUtility.API_VERSION; - Test.stopTest(); - - Assert.isNotNull(apiVersion, 'Check api is not null'); - } - - /** - * Test API Version retrieve function - */ - @isTest - static void testApiVersion() { - Test.startTest(); - String apiVersion = MetadataUtility.APIVERSION(); - Test.stopTest(); - - Assert.isNotNull(apiVersion, 'Check api is not null'); - } - - /** - * Test CLI Command retrieve - */ - @SuppressWarnings('PMD.MethodNamingConventions') - @isTest - static void testCli_Command() { - Test.startTest(); - String cliCommand = MetadataUtility.CLI_COMMAND; - Test.stopTest(); - - Assert.isNotNull(cliCommand, 'Check cli is not null'); - } - - /** - * Test CLI Command retrieve function - */ - @isTest - static void testCliCommand() { - Test.startTest(); - String cliCommand = MetadataUtility.CLICOMMAND(); - Test.stopTest(); - - Assert.isNotNull(cliCommand, 'Check cli is not null'); - } - - /** - * Get List of Metadata Types - */ - @isTest - static void testGetMetadataTypes() { - System.Test.setMock(WebServiceMock.class, new WebServiceMockImpl()); - - Test.startTest(); - List results = (List) JSON.deserialize( - MetadataUtility.getMetadataTypes(), - List.class - ); - Test.stopTest(); - - Assert.areEqual(4, results.size(), 'Check Metadata Types returned'); - } - - /** - * Get List of Package Types - */ - @isTest - static void testPackageTypes() { - Test.startTest(); - List packageTypes = MetadataUtility.PACKAGE_TYPES; - Test.stopTest(); - - Assert.areEqual(3, packageTypes.size(), 'Check 3 types returned'); - } - - /** - * Get Old Metadata Types Not used anymore - */ - @isTest - static void testMetadataTypes() { - Test.startTest(); - List metadataTypes = MetadataUtility.METADATA_TYPES; - Test.stopTest(); - - Assert.areEqual(0, metadataTypes.size(), 'Check Number of Metadata Type List'); - } - - /** - * Get a System Property of the Default value if not found - */ - @isTest - static void testDefaultValue() { - Test.startTest(); - String result = MetadataUtility.getSystemProperty('Test', 'Test', 'Good'); - Test.stopTest(); - - Assert.areEqual('Good', result, 'Check default value is returned'); - } + /** + * Mock Webservice for MetadataService + */ + private class WebServiceMockImpl implements WebServiceMock { + /** + * Do Invoke method for webservice + * @param stub + * @param request + * @param response + * @param endpoint + * @param soapAction + * @param requestName + * @param responseNS + * @param responseName + * @param responseType + */ + @SuppressWarnings('PMD.ExcessiveParameterList') + public void doInvoke( + Object stub, + Object request, + Map response, + String endpoint, + String soapAction, + String requestName, + String responseNS, + String responseName, + String responseType + ) { + MetadataService.DescribeMetadataObject prop1 = new MetadataService.DescribeMetadataObject(); + prop1.childXmlNames = new List{}; + prop1.directoryName = ''; + prop1.inFolder = false; + prop1.metaFile = false; + prop1.suffix = null; + prop1.xmlName = 'ApexClass'; + + MetadataService.DescribeMetadataObject prop2 = new MetadataService.DescribeMetadataObject(); + prop2.childXmlNames = new List{}; + prop2.directoryName = ''; + prop2.inFolder = false; + prop2.metaFile = false; + prop2.suffix = null; + prop2.xmlName = 'ApexTrigger'; + + MetadataService.DescribeMetadataObject prop3 = new MetadataService.DescribeMetadataObject(); + prop3.childXmlNames = new List{ 'Test' }; + prop3.directoryName = ''; + prop3.inFolder = false; + prop3.metaFile = false; + prop3.suffix = null; + prop3.xmlName = 'ApexPage'; + + MetadataService.DescribeMetadataResult prop4 = new MetadataService.DescribeMetadataResult(); + prop4.metadataObjects = new List{ prop1, prop2, prop3 }; + prop4.organizationNamespace = null; + prop4.partialSaveAllowed = false; + prop4.testRequired = false; + + MetadataService.describeMetadataResponse_element element = new MetadataService.describeMetadataResponse_element(); + element.result = prop4; + + if (request instanceof MetadataService.describeMetadata_element) { + response.put('response_x', element); + } + return; + } + } + + /** + * Test Get Session Id + */ + @isTest + static void testSessionId() { + Test.startTest(); + + String sessionId = MetadataUtility.getSessionIdFromVFPage(Page.SessionId); + Test.stopTest(); + Assert.areEqual('1234567890', sessionId, 'Check Session Id equals 1234567890'); + } + + /** + * Test API Version retrieve + */ + @SuppressWarnings('PMD.MethodNamingConventions') + @isTest + static void testApi_Version() { + Test.startTest(); + String apiVersion = MetadataUtility.API_VERSION; + Test.stopTest(); + + Assert.isNotNull(apiVersion, 'Check api is not null'); + } + + /** + * Test API Version retrieve function + */ + @isTest + static void testApiVersion() { + Test.startTest(); + String apiVersion = MetadataUtility.APIVERSION(); + Test.stopTest(); + + Assert.isNotNull(apiVersion, 'Check api is not null'); + } + + /** + * Test CLI Command retrieve + */ + @SuppressWarnings('PMD.MethodNamingConventions') + @isTest + static void testCli_Command() { + Test.startTest(); + String cliCommand = MetadataUtility.CLI_COMMAND; + Test.stopTest(); + + Assert.isNotNull(cliCommand, 'Check cli is not null'); + } + + /** + * Test CLI Command retrieve function + */ + @isTest + static void testCliCommand() { + Test.startTest(); + String cliCommand = MetadataUtility.CLICOMMAND(); + Test.stopTest(); + + Assert.isNotNull(cliCommand, 'Check cli is not null'); + } + + /** + * Get List of Metadata Types + */ + @isTest + static void testGetMetadataTypes() { + System.Test.setMock(WebServiceMock.class, new WebServiceMockImpl()); + + Test.startTest(); + List results = (List) JSON.deserialize( + MetadataUtility.getMetadataTypes(), + List.class + ); + Test.stopTest(); + + Assert.areEqual(4, results.size(), 'Check Metadata Types returned'); + } + + /** + * Get List of Package Types + */ + @isTest + static void testPackageTypes() { + Test.startTest(); + List packageTypes = MetadataUtility.PACKAGE_TYPES; + Test.stopTest(); + + Assert.areEqual(3, packageTypes.size(), 'Check 3 types returned'); + } + + /** + * Get Old Metadata Types Not used anymore + */ + @isTest + static void testMetadataTypes() { + Test.startTest(); + List metadataTypes = MetadataUtility.METADATA_TYPES; + Test.stopTest(); + + Assert.areEqual(0, metadataTypes.size(), 'Check Number of Metadata Type List'); + } + + /** + * Get a System Property of the Default value if not found + */ + @isTest + static void testDefaultValue() { + Test.startTest(); + String result = MetadataUtility.getSystemProperty('Test', 'Test', 'Good'); + Test.stopTest(); + + Assert.areEqual('Good', result, 'Check default value is returned'); + } } diff --git a/src/PackBuild/lwc/.eslintrc.json b/src/PackBuild/lwc/.eslintrc.json index a82e76d..f93fff4 100644 --- a/src/PackBuild/lwc/.eslintrc.json +++ b/src/PackBuild/lwc/.eslintrc.json @@ -1,14 +1,14 @@ { - "extends": ["@salesforce/eslint-config-lwc/recommended"], - "overrides": [ - { - "files": ["*.test.js"], - "rules": { - "@lwc/lwc/no-unexpected-wire-adapter-usages": "off" - }, - "env": { - "node": true - } - } - ] + "extends": ["@salesforce/eslint-config-lwc/recommended"], + "overrides": [ + { + "files": ["*.test.js"], + "rules": { + "@lwc/lwc/no-unexpected-wire-adapter-usages": "off" + }, + "env": { + "node": true + } + } + ] } diff --git a/src/PackBuild/lwc/labelService/labelService.js b/src/PackBuild/lwc/labelService/labelService.js index 3bb556d..aebe704 100644 --- a/src/PackBuild/lwc/labelService/labelService.js +++ b/src/PackBuild/lwc/labelService/labelService.js @@ -1,31 +1,31 @@ -import Metadata_Type_Selector from "@salesforce/label/c.Metadata_Type_Selector"; -import Metadata_Types from "@salesforce/label/c.Metadata_Types"; -import Folders from "@salesforce/label/c.Folders"; -import Metadata_Types_Placeholder from "@salesforce/label/c.Metadata_Types_Placeholder"; -import Folders_Placeholder from "@salesforce/label/c.Folders_Placeholder"; -import Package_Types_Placeholder from "@salesforce/label/c.Package_Types_Placeholder"; -import Metadata_Types_Missing from "@salesforce/label/c.Metadata_Types_Missing"; -import Folders_Missing from "@salesforce/label/c.Folders_Missing"; -import Package_Types_Missing from "@salesforce/label/c.Package_Types_Missing"; -import Search_Button from "@salesforce/label/c.Search_Button"; -import Results_Title from "@salesforce/label/c.Results_Title"; -import Package_Title from "@salesforce/label/c.Package_Title"; -import SFDX_Retrieve_Title from "@salesforce/label/c.SFDX_Retrieve_Title"; -import Package_Type_All from "@salesforce/label/c.Package_Type_All"; -import Package_Type_Unmanaged from "@salesforce/label/c.Package_Type_Unmanaged"; -import Package_Type_Managed from "@salesforce/label/c.Package_Type_Managed"; -import Metadata_Retrieve_Error_Title from "@salesforce/label/c.Metadata_Retrieve_Error_Title"; -import Metadata_Retrieve_Success_Message from "@salesforce/label/c.Metadata_Retrieve_Success_Message"; -import Package_Types from "@salesforce/label/c.Package_Types"; -import Metadata_Retrieve_Success_Title from "@salesforce/label/c.Metadata_Retrieve_Success_Title"; -import Invalid_Metadata_Types from "@salesforce/label/c.Invalid_Metadata_Types"; -import Invalid_Package_Types from "@salesforce/label/c.Invlid_Package_Types"; -import Copy_Button_Label from "@salesforce/label/c.Copy_Button_Label"; -import Copy_All_Button_Label from "@salesforce/label/c.Copy_All_Button_Label"; -import Copy_Types_Button_Label from "@salesforce/label/c.Copy_Types_Button_Label"; -import Copied_Button_Label from "@salesforce/label/c.Copied_Button_Label"; -import Available_Folders_Label from "@salesforce/label/c.Available_Folders_Label"; -import Selected_Folders_Label from "@salesforce/label/c.Selected_Folders_Label"; +import Metadata_Type_Selector from '@salesforce/label/c.Metadata_Type_Selector'; +import Metadata_Types from '@salesforce/label/c.Metadata_Types'; +import Folders from '@salesforce/label/c.Folders'; +import Metadata_Types_Placeholder from '@salesforce/label/c.Metadata_Types_Placeholder'; +import Folders_Placeholder from '@salesforce/label/c.Folders_Placeholder'; +import Package_Types_Placeholder from '@salesforce/label/c.Package_Types_Placeholder'; +import Metadata_Types_Missing from '@salesforce/label/c.Metadata_Types_Missing'; +import Folders_Missing from '@salesforce/label/c.Folders_Missing'; +import Package_Types_Missing from '@salesforce/label/c.Package_Types_Missing'; +import Search_Button from '@salesforce/label/c.Search_Button'; +import Results_Title from '@salesforce/label/c.Results_Title'; +import Package_Title from '@salesforce/label/c.Package_Title'; +import SFDX_Retrieve_Title from '@salesforce/label/c.SFDX_Retrieve_Title'; +import Package_Type_All from '@salesforce/label/c.Package_Type_All'; +import Package_Type_Unmanaged from '@salesforce/label/c.Package_Type_Unmanaged'; +import Package_Type_Managed from '@salesforce/label/c.Package_Type_Managed'; +import Metadata_Retrieve_Error_Title from '@salesforce/label/c.Metadata_Retrieve_Error_Title'; +import Metadata_Retrieve_Success_Message from '@salesforce/label/c.Metadata_Retrieve_Success_Message'; +import Package_Types from '@salesforce/label/c.Package_Types'; +import Metadata_Retrieve_Success_Title from '@salesforce/label/c.Metadata_Retrieve_Success_Title'; +import Invalid_Metadata_Types from '@salesforce/label/c.Invalid_Metadata_Types'; +import Invalid_Package_Types from '@salesforce/label/c.Invlid_Package_Types'; +import Copy_Button_Label from '@salesforce/label/c.Copy_Button_Label'; +import Copy_All_Button_Label from '@salesforce/label/c.Copy_All_Button_Label'; +import Copy_Types_Button_Label from '@salesforce/label/c.Copy_Types_Button_Label'; +import Copied_Button_Label from '@salesforce/label/c.Copied_Button_Label'; +import Available_Folders_Label from '@salesforce/label/c.Available_Folders_Label'; +import Selected_Folders_Label from '@salesforce/label/c.Selected_Folders_Label'; export const labels = { Metadata_Type_Selector, @@ -55,5 +55,5 @@ export const labels = { Copy_Types_Button_Label, Copied_Button_Label, Available_Folders_Label, - Selected_Folders_Label, -} + Selected_Folders_Label +}; diff --git a/src/PackBuild/lwc/lightningCard/lightningCard.html b/src/PackBuild/lwc/lightningCard/lightningCard.html index 0aafbbf..f30e284 100644 --- a/src/PackBuild/lwc/lightningCard/lightningCard.html +++ b/src/PackBuild/lwc/lightningCard/lightningCard.html @@ -1,39 +1,34 @@ diff --git a/src/PackBuild/lwc/lightningCard/lightningCard.js b/src/PackBuild/lwc/lightningCard/lightningCard.js index 80abd66..d574dc4 100644 --- a/src/PackBuild/lwc/lightningCard/lightningCard.js +++ b/src/PackBuild/lwc/lightningCard/lightningCard.js @@ -1,59 +1,59 @@ -import { LightningElement, api } from "lwc"; +import { LightningElement, api } from 'lwc'; export default class LightningCard extends LightningElement { - @api title; - @api iconName; - @api loadingAlternativeText; - @api isLoading = false; - @api isEmpty = false; - @api hideFooter = false; - @api emptyText = "No Data Available to display."; - @api hasBodyPadding = false; - @api variant = "base"; - - labels = { - LoadingAlternativeText: "Loading" - }; - - /** - * determines if an icon was defined - * @return `boolean` - */ - get hasIcon() { - return this.iconName ? true : false; - } - - /** - * Sets the loading text based on if alt test was set or uses default text - * @return `string` - */ - get loadingText() { - return this.loadingAlternativeText ? this.loadingAlternativeText : this.labels.LoadingAlternativeText; - } - - /** - * Sets the Card level classes based on variant defined, supports, base and ui - * @return `string` - */ - get cardClassNames() { - if (this.variant === "ui") { - return "slds-card slds-card_boundary slds-var-m-horizontal_large"; - } - - return "slds-card slds-card_boundary"; - } - - /** - * Sets the Card body classes based on if bodyPadding is true - * @return `string` - */ - get bodyClassNames() { - if (this.hasBodyPadding) { - return "slds-card__body slds-card__body_inner"; - } else if (this.variant === "no-padding-bottom") { - return "slds-card__body slds-m-bottom_none"; - } - - return "slds-card__body"; - } + @api title; + @api iconName; + @api loadingAlternativeText; + @api isLoading = false; + @api isEmpty = false; + @api hideFooter = false; + @api emptyText = 'No Data Available to display.'; + @api hasBodyPadding = false; + @api variant = 'base'; + + labels = { + LoadingAlternativeText: 'Loading' + }; + + /** + * determines if an icon was defined + * @return `boolean` + */ + get hasIcon() { + return this.iconName ? true : false; + } + + /** + * Sets the loading text based on if alt test was set or uses default text + * @return `string` + */ + get loadingText() { + return this.loadingAlternativeText ? this.loadingAlternativeText : this.labels.LoadingAlternativeText; + } + + /** + * Sets the Card level classes based on variant defined, supports, base and ui + * @return `string` + */ + get cardClassNames() { + if (this.variant === 'ui') { + return 'slds-card slds-card_boundary slds-var-m-horizontal_large'; + } + + return 'slds-card slds-card_boundary'; + } + + /** + * Sets the Card body classes based on if bodyPadding is true + * @return `string` + */ + get bodyClassNames() { + if (this.hasBodyPadding) { + return 'slds-card__body slds-card__body_inner'; + } else if (this.variant === 'no-padding-bottom') { + return 'slds-card__body slds-m-bottom_none'; + } + + return 'slds-card__body'; + } } diff --git a/src/PackBuild/lwc/metadataSelector/metadataSelector.html b/src/PackBuild/lwc/metadataSelector/metadataSelector.html index c0c5c3f..4d4e178 100644 --- a/src/PackBuild/lwc/metadataSelector/metadataSelector.html +++ b/src/PackBuild/lwc/metadataSelector/metadataSelector.html @@ -1,142 +1,140 @@ diff --git a/src/PackBuild/lwc/metadataSelector/metadataSelector.js b/src/PackBuild/lwc/metadataSelector/metadataSelector.js index 4d2cb83..ee2b6df 100644 --- a/src/PackBuild/lwc/metadataSelector/metadataSelector.js +++ b/src/PackBuild/lwc/metadataSelector/metadataSelector.js @@ -1,280 +1,280 @@ /* eslint-disable @lwc/lwc/no-async-operation */ -import { LightningElement, track, wire } from "lwc"; -import { ShowToastEvent } from "lightning/platformShowToastEvent"; +import { LightningElement, track, wire } from 'lwc'; +import { ShowToastEvent } from 'lightning/platformShowToastEvent'; /* Import Custom Utilities */ -import { MS_COLUMNS } from "c/metadataSelectorTableColumns"; -import { CONSTANTS } from "c/metadataSelectorUtilities"; -import { labels } from "c/labelService"; +import { MS_COLUMNS } from 'c/metadataSelectorTableColumns'; +import { CONSTANTS } from 'c/metadataSelectorUtilities'; +import { labels } from 'c/labelService'; /* Import Class Methods */ -import APIVERSION from "@salesforce/apex/MetadataUtility.APIVERSION"; -import CLICOMMAND from "@salesforce/apex/MetadataUtility.CLICOMMAND"; -import listMetadata from "@salesforce/apex/MetadataSelector.listMetadata"; -import listFolders from "@salesforce/apex/MetadataSelector.listFolders"; -import getMetadataTypes from "@salesforce/apex/MetadataUtility.getMetadataTypes"; +import APIVERSION from '@salesforce/apex/MetadataUtility.APIVERSION'; +import CLICOMMAND from '@salesforce/apex/MetadataUtility.CLICOMMAND'; +import listMetadata from '@salesforce/apex/MetadataSelector.listMetadata'; +import listFolders from '@salesforce/apex/MetadataSelector.listFolders'; +import getMetadataTypes from '@salesforce/apex/MetadataUtility.getMetadataTypes'; export default class MetadataSelector extends LightningElement { - metadataTypes = []; - availableFolders = []; - selectedMetadataTypes = []; - metadataOptions = []; - columns = MS_COLUMNS; - sfdxOutput = CONSTANTS.BLANK; - selectedMetadataType = CONSTANTS.BLANK; - selectedPackageType = CONSTANTS.BLANK; - selectedFolders = []; - showMetadataList = false; - showFolderList = false; - showPackageList = false; - includeAllSymbol = false; - labels = labels; - - @track metadataTypeSetting = { - title: labels.Metadata_Type_Selector, - iconName: CONSTANTS.ICONS.METADATATYPE, - isLoading: true, - isEmpty: false, - hideFooter: false, - emptyText: CONSTANTS.BLANK - }; - - @track metadataListSetting = { - title: labels.Results_Title, - iconName: CONSTANTS.ICONS.METADATALIST, - isLoading: false, - isEmpty: false, - hideFooter: true, - emptyText: "No Metadata Found with these search parameters", - show: false - }; - - @track packageOutputSetting = { - title: labels.Package_Title, - iconName: CONSTANTS.ICONS.PACKAGE, - isLoading: false, - isEmpty: false, - hideFooter: true, - emptyText: CONSTANTS.BLANK, - show: false - }; - - @track sfdxOutputSetting = { - title: labels.SFDX_Retrieve_Title, - iconName: CONSTANTS.ICONS.SFDX, - isLoading: false, - isEmpty: false, - hideFooter: true, - emptyText: CONSTANTS.BLANK, - show: false - }; - - @wire(APIVERSION) - wiredApiVersion({ data }) { - if (data) { - this.API_VERSION = data; - } - } - - @wire(CLICOMMAND) - wiredCliCommand({ data }) { - if (data) { - this.CLI_COMMAND = data; - } - } - - @wire(getMetadataTypes) - wiredGetMetadataTypes({ error, data }) { - if (data) { - this.metadataOptions = JSON.parse(data); - this.metadataTypeSetting.isLoading = false; - } else if (error) { - this.showNotification(0, error, CONSTANTS.BLANK, CONSTANTS.BLANK); - this.metadataTypeSetting.isLoading = false; - } - } - - handleSfdxCopyCode(event) { - this.template.querySelector("c-sfdx-code-snippet").handleCopy(); - let button = event.target; - button.label = labels.Copied_Button_Label; - - setTimeout(() => { - button.label = labels.Copy_Button_Label; - }, 1000); - } - - handlePackageCopyCodeAll(event) { - this.template.querySelector("c-package-code-snippet").handleCopyAll(); - let button = event.target; - button.label = labels.Copied_Button_Label; - - setTimeout(() => { - button.label = labels.Copy_All_Button_Label; - }, 1000); - } - - handlePackageCopyCodeType(event) { - this.template.querySelector("c-package-code-snippet").handleCopyTypes(); - let button = event.target; - button.label = labels.Copied_Button_Label; - - setTimeout(() => { - button.label = labels.Copy_Types_Button_Label; - }, 1000); - } - - handleMetadataTypeChange(event) { - this.selectedMetadataType = event.target.value; - this.selectedFolders = []; - if ( - event.target.value === "EmailTemplate" || - event.target.value === "Document" || - event.target.value === "Report" || - event.target.value === "Dashboard" - ) { - this.metadataTypeSetting.isLoading = true; - listFolders({ metadataType: this.selectedMetadataType }) - .then((result) => { - this.availableFolders = JSON.parse(result); - if (this.selectedMetadataType === "EmailTemplate" || this.selectedMetadataType === "Report") { - this.availableFolders.push({ - label: "unfiled$public", - value: "unfiled$public" - }); - } - this.showFolderList = true; - this.metadataTypeSetting.isLoading = false; - }) - .catch((error) => { - this.showFolderList = false; - this.availableFolders = []; - this.selectedFolder = ""; - - this.showNotification(0, error, CONSTANTS.BLANK, labels.Metadata_Retrieve_Error_Title); - this.metadataTypeSetting.isLoading = false; - }); - } else { - this.showFolderList = false; - this.availableFolders = []; - this.selectedFolder = ""; - } - } - - handleFolderListChange(event) { - this.selectedFolders = event.target.value; - console.log(event.target.value); - } - - handlePackageTypeChange(event) { - this.selectedPackageType = event.target.value; - } - - handleMetadataSearch() { - this.metadataTypeSetting.isLoading = true; - if (!this.search(this.selectedMetadataType, this.metadataOptions)) { - this.message = labels.Invalid_Metadata_Types; - } - - if (!this.search(this.selectedPackageType, this.packageTypeOptions)) { - this.message = labels.Invalid_Package_Types; - } - - listMetadata({ - metadataType: this.selectedMetadataType, - folderNames: this.selectedFolders, - packageType: this.selectedPackageType - }) - .then((result) => { - if (result === "NoData") { - this.metadataListSetting.isEmpty = true; - } else { - this.metadataListSetting.isEmpty = false; - this.metadataTypes = JSON.parse(result); - } - this.metadataListSetting.show = true; - if (this.selectedMetadataType === "CustomLabels") { - this.includeAllSymbol = true; - } else { - this.includeAllSymbol = false; - } - - this.showNotification(2, CONSTANTS.BLANK, labels.Metadata_Retrieve_Success_Message, labels.Metadata_Retrieve_Success_Title); - this.metadataTypeSetting.isLoading = false; - }) - .catch((error) => { - this.data = undefined; - this.includeAllSymbol = false; - - this.showNotification(0, error, CONSTANTS.BLANK, labels.Metadata_Retrieve_Error_Title); - this.metadataTypeSetting.isLoading = false; - }); - } - - getSelectedName(event) { - this.selectedMetadataTypes = event.detail.selectedRows; - this.sfdxOutput = CONSTANTS.BLANK; - - this.selectedMetadataTypes.forEach((element) => { - if (this.CLI_COMMAND == 'sf') { - this.sfdxOutput += " -m " + this.selectedMetadataType + ":" + element.fullName; - } else { - this.sfdxOutput += this.selectedMetadataType + ":" + element.fullName + ","; - } - }); - - this.sfdxOutput = this.sfdxOutput.slice(0, -1); - - if (this.selectedMetadataTypes.length > 0) { - this.packageOutputSetting.show = true; - this.sfdxOutputSetting.show = true; - } else { - this.packageOutputSetting.show = false; - this.sfdxOutputSetting.show = false; - } - } - - get min() { - return 1; - } - - get max() { - return 3; - } - - get packageTypeOptions() { - return [ - { label: labels.Package_Type_All, value: "all" }, - { label: labels.Package_Type_Unmanaged, value: "unmanagedOnly" }, - { label: labels.Package_Type_Managed, value: "managedOnly" } - ]; - } - - get setDatatableHeight() { - if (this.metadataTypes.length > 15) { - return "height:450px;"; - } - return ""; - } - - search(nameKey, anArray) { - var status = false; - // eslint-disable-next-line vars-on-top - for (var i = 0; i < anArray.length; i++) { - if (anArray[i].value === nameKey) { - status = true; - } - } - return status; - } - - showNotification(type, error, msg, title) { - const evt = new ShowToastEvent({ - title: labels.title !== CONSTANTS.BLANK ? title : CONSTANTS.VARIANTOPTIONS[type].label, - message: type === 0 ? error.body.message : msg, - variant: CONSTANTS.VARIANTOPTIONS[type].value, - mode: type === 0 ? "sticky" : "dismissible" - }); - this.dispatchEvent(evt); - } + metadataTypes = []; + availableFolders = []; + selectedMetadataTypes = []; + metadataOptions = []; + columns = MS_COLUMNS; + sfdxOutput = CONSTANTS.BLANK; + selectedMetadataType = CONSTANTS.BLANK; + selectedPackageType = CONSTANTS.BLANK; + selectedFolders = []; + showMetadataList = false; + showFolderList = false; + showPackageList = false; + includeAllSymbol = false; + labels = labels; + + @track metadataTypeSetting = { + title: labels.Metadata_Type_Selector, + iconName: CONSTANTS.ICONS.METADATATYPE, + isLoading: true, + isEmpty: false, + hideFooter: false, + emptyText: CONSTANTS.BLANK + }; + + @track metadataListSetting = { + title: labels.Results_Title, + iconName: CONSTANTS.ICONS.METADATALIST, + isLoading: false, + isEmpty: false, + hideFooter: true, + emptyText: 'No Metadata Found with these search parameters', + show: false + }; + + @track packageOutputSetting = { + title: labels.Package_Title, + iconName: CONSTANTS.ICONS.PACKAGE, + isLoading: false, + isEmpty: false, + hideFooter: true, + emptyText: CONSTANTS.BLANK, + show: false + }; + + @track sfdxOutputSetting = { + title: labels.SFDX_Retrieve_Title, + iconName: CONSTANTS.ICONS.SFDX, + isLoading: false, + isEmpty: false, + hideFooter: true, + emptyText: CONSTANTS.BLANK, + show: false + }; + + @wire(APIVERSION) + wiredApiVersion({ data }) { + if (data) { + this.API_VERSION = data; + } + } + + @wire(CLICOMMAND) + wiredCliCommand({ data }) { + if (data) { + this.CLI_COMMAND = data; + } + } + + @wire(getMetadataTypes) + wiredGetMetadataTypes({ error, data }) { + if (data) { + this.metadataOptions = JSON.parse(data); + this.metadataTypeSetting.isLoading = false; + } else if (error) { + this.showNotification(0, error, CONSTANTS.BLANK, CONSTANTS.BLANK); + this.metadataTypeSetting.isLoading = false; + } + } + + handleSfdxCopyCode(event) { + this.template.querySelector('c-sfdx-code-snippet').handleCopy(); + let button = event.target; + button.label = labels.Copied_Button_Label; + + setTimeout(() => { + button.label = labels.Copy_Button_Label; + }, 1000); + } + + handlePackageCopyCodeAll(event) { + this.template.querySelector('c-package-code-snippet').handleCopyAll(); + let button = event.target; + button.label = labels.Copied_Button_Label; + + setTimeout(() => { + button.label = labels.Copy_All_Button_Label; + }, 1000); + } + + handlePackageCopyCodeType(event) { + this.template.querySelector('c-package-code-snippet').handleCopyTypes(); + let button = event.target; + button.label = labels.Copied_Button_Label; + + setTimeout(() => { + button.label = labels.Copy_Types_Button_Label; + }, 1000); + } + + handleMetadataTypeChange(event) { + this.selectedMetadataType = event.target.value; + this.selectedFolders = []; + if ( + event.target.value === 'EmailTemplate' || + event.target.value === 'Document' || + event.target.value === 'Report' || + event.target.value === 'Dashboard' + ) { + this.metadataTypeSetting.isLoading = true; + listFolders({ metadataType: this.selectedMetadataType }) + .then((result) => { + this.availableFolders = JSON.parse(result); + if (this.selectedMetadataType === 'EmailTemplate' || this.selectedMetadataType === 'Report') { + this.availableFolders.push({ + label: 'unfiled$public', + value: 'unfiled$public' + }); + } + this.showFolderList = true; + this.metadataTypeSetting.isLoading = false; + }) + .catch((error) => { + this.showFolderList = false; + this.availableFolders = []; + this.selectedFolder = ''; + + this.showNotification(0, error, CONSTANTS.BLANK, labels.Metadata_Retrieve_Error_Title); + this.metadataTypeSetting.isLoading = false; + }); + } else { + this.showFolderList = false; + this.availableFolders = []; + this.selectedFolder = ''; + } + } + + handleFolderListChange(event) { + this.selectedFolders = event.target.value; + console.log(event.target.value); + } + + handlePackageTypeChange(event) { + this.selectedPackageType = event.target.value; + } + + handleMetadataSearch() { + this.metadataTypeSetting.isLoading = true; + if (!this.search(this.selectedMetadataType, this.metadataOptions)) { + this.message = labels.Invalid_Metadata_Types; + } + + if (!this.search(this.selectedPackageType, this.packageTypeOptions)) { + this.message = labels.Invalid_Package_Types; + } + + listMetadata({ + metadataType: this.selectedMetadataType, + folderNames: this.selectedFolders, + packageType: this.selectedPackageType + }) + .then((result) => { + if (result === 'NoData') { + this.metadataListSetting.isEmpty = true; + } else { + this.metadataListSetting.isEmpty = false; + this.metadataTypes = JSON.parse(result); + } + this.metadataListSetting.show = true; + if (this.selectedMetadataType === 'CustomLabels') { + this.includeAllSymbol = true; + } else { + this.includeAllSymbol = false; + } + + this.showNotification(2, CONSTANTS.BLANK, labels.Metadata_Retrieve_Success_Message, labels.Metadata_Retrieve_Success_Title); + this.metadataTypeSetting.isLoading = false; + }) + .catch((error) => { + this.data = undefined; + this.includeAllSymbol = false; + + this.showNotification(0, error, CONSTANTS.BLANK, labels.Metadata_Retrieve_Error_Title); + this.metadataTypeSetting.isLoading = false; + }); + } + + getSelectedName(event) { + this.selectedMetadataTypes = event.detail.selectedRows; + this.sfdxOutput = CONSTANTS.BLANK; + + this.selectedMetadataTypes.forEach((element) => { + if (this.CLI_COMMAND == 'sf') { + this.sfdxOutput += ' -m ' + this.selectedMetadataType + ':' + element.fullName; + } else { + this.sfdxOutput += this.selectedMetadataType + ':' + element.fullName + ','; + } + }); + + this.sfdxOutput = this.sfdxOutput.slice(0, -1); + + if (this.selectedMetadataTypes.length > 0) { + this.packageOutputSetting.show = true; + this.sfdxOutputSetting.show = true; + } else { + this.packageOutputSetting.show = false; + this.sfdxOutputSetting.show = false; + } + } + + get min() { + return 1; + } + + get max() { + return 3; + } + + get packageTypeOptions() { + return [ + { label: labels.Package_Type_All, value: 'all' }, + { label: labels.Package_Type_Unmanaged, value: 'unmanagedOnly' }, + { label: labels.Package_Type_Managed, value: 'managedOnly' } + ]; + } + + get setDatatableHeight() { + if (this.metadataTypes.length > 15) { + return 'height:450px;'; + } + return ''; + } + + search(nameKey, anArray) { + var status = false; + // eslint-disable-next-line vars-on-top + for (var i = 0; i < anArray.length; i++) { + if (anArray[i].value === nameKey) { + status = true; + } + } + return status; + } + + showNotification(type, error, msg, title) { + const evt = new ShowToastEvent({ + title: labels.title !== CONSTANTS.BLANK ? title : CONSTANTS.VARIANTOPTIONS[type].label, + message: type === 0 ? error.body.message : msg, + variant: CONSTANTS.VARIANTOPTIONS[type].value, + mode: type === 0 ? 'sticky' : 'dismissible' + }); + this.dispatchEvent(evt); + } } diff --git a/src/PackBuild/lwc/metadataSelectorTableColumns/metadataSelectorTableColumns.js b/src/PackBuild/lwc/metadataSelectorTableColumns/metadataSelectorTableColumns.js index 0e15e4a..a239018 100644 --- a/src/PackBuild/lwc/metadataSelectorTableColumns/metadataSelectorTableColumns.js +++ b/src/PackBuild/lwc/metadataSelectorTableColumns/metadataSelectorTableColumns.js @@ -1,20 +1,20 @@ /* Import Custom Labels */ -import Name_Column from "@salesforce/label/c.Name_Column"; -import File_Name_Column from "@salesforce/label/c.File_Name_Column"; -import Manageable_State_Column from "@salesforce/label/c.Manageable_State_Column"; -import Namespace_Column from "@salesforce/label/c.Namespace_Column"; +import Name_Column from '@salesforce/label/c.Name_Column'; +import File_Name_Column from '@salesforce/label/c.File_Name_Column'; +import Manageable_State_Column from '@salesforce/label/c.Manageable_State_Column'; +import Namespace_Column from '@salesforce/label/c.Namespace_Column'; const MS_COLUMNS = [ - { label: Name_Column, fieldName: "fullName", type: "text", hideDefaultActions: true }, - { label: File_Name_Column, fieldName: "fileName", type: "text", hideDefaultActions: true }, - { - label: Manageable_State_Column, - fieldName: "manageableState", - type: "text", - fixedWidth: 125, - hideDefaultActions: true - }, - { label: Namespace_Column, fieldName: "namespacePrefix", type: "text", fixedWidth: 125, hideDefaultActions: true } + { label: Name_Column, fieldName: 'fullName', type: 'text', hideDefaultActions: true }, + { label: File_Name_Column, fieldName: 'fileName', type: 'text', hideDefaultActions: true }, + { + label: Manageable_State_Column, + fieldName: 'manageableState', + type: 'text', + fixedWidth: 125, + hideDefaultActions: true + }, + { label: Namespace_Column, fieldName: 'namespacePrefix', type: 'text', fixedWidth: 125, hideDefaultActions: true } ]; export { MS_COLUMNS }; diff --git a/src/PackBuild/lwc/metadataSelectorUtilities/metadataSelectorUtilities.js b/src/PackBuild/lwc/metadataSelectorUtilities/metadataSelectorUtilities.js index 4b51cc9..96cd0be 100644 --- a/src/PackBuild/lwc/metadataSelectorUtilities/metadataSelectorUtilities.js +++ b/src/PackBuild/lwc/metadataSelectorUtilities/metadataSelectorUtilities.js @@ -1,25 +1,25 @@ const CONSTANTS = { - APIVERSION: "62.0", - ICONS: { - METADATATYPE: "custom:custom63", - METADATALIST: "standard:related_list", - PACKAGE: "standard:file", - SFDX: "standard:file" - }, - BLANK: "", - DEFAULT_MESSAGE: "Message", - VARIANTOPTIONS: [ - { label: "Error", value: "error" }, - { label: "Warning", value: "warning" }, - { label: "Success", value: "success" }, - { label: "Info", value: "info" } - ] + APIVERSION: '62.0', + ICONS: { + METADATATYPE: 'custom:custom63', + METADATALIST: 'standard:related_list', + PACKAGE: 'standard:file', + SFDX: 'standard:file' + }, + BLANK: '', + DEFAULT_MESSAGE: 'Message', + VARIANTOPTIONS: [ + { label: 'Error', value: 'error' }, + { label: 'Warning', value: 'warning' }, + { label: 'Success', value: 'success' }, + { label: 'Info', value: 'info' } + ] }; const copy = async (textToCopy) => - navigator.clipboard.writeText(textToCopy).catch( - (err) => console.error(JSON.stringify(err)), - (err) => console.error(JSON.stringify(err)) - ); + navigator.clipboard.writeText(textToCopy).catch( + (err) => console.error(JSON.stringify(err)), + (err) => console.error(JSON.stringify(err)) + ); export { CONSTANTS, copy }; diff --git a/src/PackBuild/lwc/packageCodeSnippet/packageCodeSnippet.css b/src/PackBuild/lwc/packageCodeSnippet/packageCodeSnippet.css index 66b7e9f..131bbec 100644 --- a/src/PackBuild/lwc/packageCodeSnippet/packageCodeSnippet.css +++ b/src/PackBuild/lwc/packageCodeSnippet/packageCodeSnippet.css @@ -1,183 +1,190 @@ .site-code_content { - position: relative; - margin-top: 0; - margin-bottom: 0; - padding: 1rem; - max-width: none; - background-color: rgba(224, 229, 238, 0.1); - box-shadow: inset 0 1px 3px #a8b7c7; + position: relative; + margin-top: 0; + margin-bottom: 0; + padding: 1rem; + max-width: none; + background-color: rgba(224, 229, 238, 0.1); + box-shadow: inset 0 1px 3px #a8b7c7; } .site-code_content.slds-scrollable_x::-webkit-scrollbar { - width: 10px; - height: 10px; + width: 10px; + height: 10px; } .site-code_content.slds-scrollable_x::-webkit-scrollbar:window-inactive { - opacity: 0; + opacity: 0; } .site-code_content.slds-scrollable_x::-webkit-scrollbar-thumb { - background: #ecebea; - border-radius: 0.5rem; - box-shadow: inset 0 0 0 1px #c9c7c5; + background: #ecebea; + border-radius: 0.5rem; + box-shadow: inset 0 0 0 1px #c9c7c5; } .site-code_content.slds-scrollable_x::-webkit-scrollbar-track { - background: #c9c7c5; + background: #c9c7c5; } .site-code_content .site-code_copy { - float: right; - margin-top: -1.125rem; - margin-right: -2rem; + float: right; + margin-top: -1.125rem; + margin-right: -2rem; } .site-code_content.code-collapsed:after { - content: ""; - position: absolute; - bottom: 1rem; - left: 1px; - right: 1px; - background: linear-gradient(180deg, rgba(250, 251, 253, 0), #fafbfd); - display: block; - height: 2.25rem; + content: ''; + position: absolute; + bottom: 1rem; + left: 1px; + right: 1px; + background: linear-gradient(180deg, rgba(250, 251, 253, 0), #fafbfd); + display: block; + height: 2.25rem; } .site-code_content.code-collapsed pre { - height: 3.9375rem; - overflow: hidden; + height: 3.9375rem; + overflow: hidden; } .site-code_content.code-collapsed code { - overflow: hidden; + overflow: hidden; } .site-code_content.code-expanded pre { - height: auto; -} - -code[class*="language-"], -pre[class*="language-"] { - color: #000; - background: none; - font-family: Consolas, Monaco, Andale Mono, Ubuntu Mono, monospace; - text-align: left; - white-space: pre; - word-spacing: normal; - word-break: normal; - word-wrap: normal; - line-height: 1.5; - -moz-tab-size: 4; - -o-tab-size: 4; - tab-size: 4; - -webkit-hyphens: none; - -moz-hyphens: none; - -ms-hyphens: none; - hyphens: none; -} - -pre[class*="language-"] { - position: relative; - margin: 0.5em 0; - box-shadow: -1px 0 0 0 #358ccb, 0 0 0 1px #dfdfdf; - border-left: 10px solid #358ccb; - background-color: #fdfdfd; - background-image: linear-gradient(transparent 50%, rgba(69, 142, 209, 0.04) 0); - background-size: 3em 3em; - background-origin: content-box; - overflow: visible; - padding: 0; -} - -code[class*="language"] { - max-height: inherit; - height: 100%; - padding: 0 1em; - display: block; - overflow: auto; -} - -:not(pre) > code[class*="language-"], -pre[class*="language-"] { - background-color: #fdfdfd; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - margin-bottom: 1em; -} - -:not(pre) > code[class*="language-"] { - position: relative; - padding: 0.2em; - border-radius: 0.3em; - color: #c92c2c; - border: 1px solid rgba(0, 0, 0, 0.1); - display: inline; - white-space: normal; -} - -pre[class*="language-"]:after, -pre[class*="language-"]:before { - content: "\A"; - z-index: -2; - display: block; - position: absolute; - bottom: 0.75em; - left: 0.18em; - width: 40%; - height: 20%; - max-height: 13em; - box-shadow: 0 13px 8px #979797; - -webkit-transform: rotate(-2deg); - -moz-transform: rotate(-2deg); - -ms-transform: rotate(-2deg); - -o-transform: rotate(-2deg); - transform: rotate(-2deg); -} - -:not(pre) > code[class*="language-"]:after, -pre[class*="language-"]:after { - right: 0.75em; - left: auto; - -webkit-transform: rotate(2deg); - -moz-transform: rotate(2deg); - -ms-transform: rotate(2deg); - -o-transform: rotate(2deg); - transform: rotate(2deg); -} - -pre[class*="language-"] button { - position: absolute; - top: 5px; - right: 5px; - - font-size: 0.9rem; - padding: 0.15rem; - background-color: #828282; - - border: ridge 1px #7b7b7c; - border-radius: 5px; - text-shadow: #c4c4c4 0 0 2px; -} - -pre[class*="language-"] button:hover { - cursor: pointer; - background-color: #bcbabb; + height: auto; +} + +code[class*='language-'], +pre[class*='language-'] { + color: #000; + background: none; + font-family: + Consolas, + Monaco, + Andale Mono, + Ubuntu Mono, + monospace; + text-align: left; + white-space: pre; + word-spacing: normal; + word-break: normal; + word-wrap: normal; + line-height: 1.5; + -moz-tab-size: 4; + -o-tab-size: 4; + tab-size: 4; + -webkit-hyphens: none; + -moz-hyphens: none; + -ms-hyphens: none; + hyphens: none; +} + +pre[class*='language-'] { + position: relative; + margin: 0.5em 0; + box-shadow: + -1px 0 0 0 #358ccb, + 0 0 0 1px #dfdfdf; + border-left: 10px solid #358ccb; + background-color: #fdfdfd; + background-image: linear-gradient(transparent 50%, rgba(69, 142, 209, 0.04) 0); + background-size: 3em 3em; + background-origin: content-box; + overflow: visible; + padding: 0; +} + +code[class*='language'] { + max-height: inherit; + height: 100%; + padding: 0 1em; + display: block; + overflow: auto; +} + +:not(pre) > code[class*='language-'], +pre[class*='language-'] { + background-color: #fdfdfd; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + margin-bottom: 1em; +} + +:not(pre) > code[class*='language-'] { + position: relative; + padding: 0.2em; + border-radius: 0.3em; + color: #c92c2c; + border: 1px solid rgba(0, 0, 0, 0.1); + display: inline; + white-space: normal; +} + +pre[class*='language-']:after, +pre[class*='language-']:before { + content: '\A'; + z-index: -2; + display: block; + position: absolute; + bottom: 0.75em; + left: 0.18em; + width: 40%; + height: 20%; + max-height: 13em; + box-shadow: 0 13px 8px #979797; + -webkit-transform: rotate(-2deg); + -moz-transform: rotate(-2deg); + -ms-transform: rotate(-2deg); + -o-transform: rotate(-2deg); + transform: rotate(-2deg); +} + +:not(pre) > code[class*='language-']:after, +pre[class*='language-']:after { + right: 0.75em; + left: auto; + -webkit-transform: rotate(2deg); + -moz-transform: rotate(2deg); + -ms-transform: rotate(2deg); + -o-transform: rotate(2deg); + transform: rotate(2deg); +} + +pre[class*='language-'] button { + position: absolute; + top: 5px; + right: 5px; + + font-size: 0.9rem; + padding: 0.15rem; + background-color: #828282; + + border: ridge 1px #7b7b7c; + border-radius: 5px; + text-shadow: #c4c4c4 0 0 2px; +} + +pre[class*='language-'] button:hover { + cursor: pointer; + background-color: #bcbabb; } .line-numbers-rows > span { - pointer-events: none; - display: block; - counter-increment: linenumber; + pointer-events: none; + display: block; + counter-increment: linenumber; } .line-numbers-rows > span:before { - content: counter(linenumber); - color: #999; - display: block; - padding-right: 0.8em; - text-align: right; + content: counter(linenumber); + color: #999; + display: block; + padding-right: 0.8em; + text-align: right; } .token.block-comment, @@ -185,11 +192,11 @@ pre[class*="language-"] button:hover { .token.comment, .token.doctype, .token.prolog { - color: #7d8b99; + color: #7d8b99; } .token.punctuation { - color: #5f6364; + color: #5f6364; } .token.boolean, @@ -200,7 +207,7 @@ pre[class*="language-"] button:hover { .token.property, .token.symbol, .token.tag { - color: #c92c2c; + color: #c92c2c; } .token.attr-name, @@ -210,137 +217,137 @@ pre[class*="language-"] button:hover { .token.inserted, .token.selector, .token.string { - color: #2f9c0a; + color: #2f9c0a; } .token.entity, .token.operator, .token.url, .token.variable { - color: #a67f59; - background: hsla(0, 0%, 100%, 0.5); + color: #a67f59; + background: hsla(0, 0%, 100%, 0.5); } .token.atrule, .token.attr-value, .token.class-name, .token.keyword { - color: #1990b8; + color: #1990b8; } .token.important, .token.regex { - color: #e90; + color: #e90; } .language-css .token.string, .style .token.string { - color: #a67f59; - background: hsla(0, 0%, 100%, 0.5); + color: #a67f59; + background: hsla(0, 0%, 100%, 0.5); } .token.important { - font-weight: 400; + font-weight: 400; } .token.bold { - font-weight: 700; + font-weight: 700; } .token.italic { - font-style: italic; + font-style: italic; } .token.entity { - cursor: help; + cursor: help; } .language-css .token.string, .style .token.string { - color: #a67f59; - background: hsla(0, 0%, 100%, 0.5); + color: #a67f59; + background: hsla(0, 0%, 100%, 0.5); } @media screen and (max-width: 767px) { - pre[class*="language-"]:after, - pre[class*="language-"]:before { - bottom: 14px; - box-shadow: none; - } + pre[class*='language-']:after, + pre[class*='language-']:before { + bottom: 14px; + box-shadow: none; + } } .token.cr:before, .token.lf:before, .token.tab:not(:empty):before { - color: #e0d7d1; + color: #e0d7d1; } -pre[class*="language-"].line-numbers { - padding-left: 0; +pre[class*='language-'].line-numbers { + padding-left: 0; } -pre[class*="language-"].line-numbers code { - padding-left: 3.8em; +pre[class*='language-'].line-numbers code { + padding-left: 3.8em; } -pre[class*="language-"].line-numbers .line-numbers-rows { - left: 0; +pre[class*='language-'].line-numbers .line-numbers-rows { + left: 0; } -pre[class*="language-"][data-line] { - padding-top: 0; - padding-bottom: 0; - padding-left: 0; +pre[class*='language-'][data-line] { + padding-top: 0; + padding-bottom: 0; + padding-left: 0; } pre[data-line] code { - position: relative; - padding-left: 4em; + position: relative; + padding-left: 4em; } pre .line-highlight { - margin-top: 0; + margin-top: 0; } pre[data-line] { - position: relative; - padding: 1em 0 1em 3em; + position: relative; + padding: 1em 0 1em 3em; } -code[class*="language-"], -pre[class*="language-"] { - padding: 0; - margin: 0; - border: 0; - max-height: none; - box-shadow: none; - text-shadow: none; - tab-size: 2; +code[class*='language-'], +pre[class*='language-'] { + padding: 0; + margin: 0; + border: 0; + max-height: none; + box-shadow: none; + text-shadow: none; + tab-size: 2; } -code[class*="language-"]:after, -code[class*="language-"]:before, -pre[class*="language-"]:after, -pre[class*="language-"]:before { - display: none; +code[class*='language-']:after, +code[class*='language-']:before, +pre[class*='language-']:after, +pre[class*='language-']:before { + display: none; } -pre[class*="language-"] { - position: static; +pre[class*='language-'] { + position: static; } .padding-left-1 { - padding-left: 20px; + padding-left: 20px; } .padding-left-2 { - padding-left: 40px; + padding-left: 40px; } .padding-left-3 { - padding-left: 60px; + padding-left: 60px; } .padding-left-4 { - padding-left: 80px; + padding-left: 80px; } diff --git a/src/PackBuild/lwc/packageCodeSnippet/packageCodeSnippet.html b/src/PackBuild/lwc/packageCodeSnippet/packageCodeSnippet.html index 52343c1..fc1649d 100644 --- a/src/PackBuild/lwc/packageCodeSnippet/packageCodeSnippet.html +++ b/src/PackBuild/lwc/packageCodeSnippet/packageCodeSnippet.html @@ -1,6 +1,6 @@ diff --git a/src/PackBuild/lwc/packageCodeSnippet/packageCodeSnippet.js b/src/PackBuild/lwc/packageCodeSnippet/packageCodeSnippet.js index 1a2389f..6a29353 100644 --- a/src/PackBuild/lwc/packageCodeSnippet/packageCodeSnippet.js +++ b/src/PackBuild/lwc/packageCodeSnippet/packageCodeSnippet.js @@ -1,21 +1,21 @@ -import { LightningElement, api } from "lwc"; +import { LightningElement, api } from 'lwc'; /* Import Custom Utilities */ -import { CONSTANTS, copy } from "c/metadataSelectorUtilities"; +import { CONSTANTS, copy } from 'c/metadataSelectorUtilities'; export default class PackageCodeSnippet extends LightningElement { - @api includeAllSymbol = false; - @api selectedMetadataTypes; - @api selectedMetadataType; + @api includeAllSymbol = false; + @api selectedMetadataTypes; + @api selectedMetadataType; - @api - async handleCopyAll() { - let members = ""; - for (let i = 0; i < this.selectedMetadataTypes.length; i++) { - members += " " + this.selectedMetadataTypes[i].fullName + "\n"; - } - members.replace(/\n$/, ""); - const code = ` + @api + async handleCopyAll() { + let members = ''; + for (let i = 0; i < this.selectedMetadataTypes.length; i++) { + members += ' ' + this.selectedMetadataTypes[i].fullName + '\n'; + } + members.replace(/\n$/, ''); + const code = ` ${members} ${this.selectedMetadataType} @@ -23,55 +23,55 @@ ${members} ${this.selectedMetadataType} 56.0 `; - const input = document.createElement("textarea"); - input.value = code; + const input = document.createElement('textarea'); + input.value = code; - document.body.appendChild(input); - input.select(); + document.body.appendChild(input); + input.select(); - if (navigator.clipboard) { - console.log("clipy"); - const selection = document.getSelection(); - await copy(selection.toString()); - } else { - document.execCommand("copy"); - } - document.body.removeChild(input); - } + if (navigator.clipboard) { + console.log('clipy'); + const selection = document.getSelection(); + await copy(selection.toString()); + } else { + document.execCommand('copy'); + } + document.body.removeChild(input); + } - @api - async handleCopyTypes() { - let members = ""; - for (let i = 0; i < this.selectedMetadataTypes.length; i++) { - members += " " + this.selectedMetadataTypes[i].fullName + "\n"; - } - members.replace(/\n$/, ""); - const code = ` + @api + async handleCopyTypes() { + let members = ''; + for (let i = 0; i < this.selectedMetadataTypes.length; i++) { + members += ' ' + this.selectedMetadataTypes[i].fullName + '\n'; + } + members.replace(/\n$/, ''); + const code = ` ${members} ${this.selectedMetadataType} `; - const input = document.createElement("textarea"); - input.value = code; + const input = document.createElement('textarea'); + input.value = code; - document.body.appendChild(input); - input.select(); + document.body.appendChild(input); + input.select(); - if (navigator.clipboard) { - console.log("clipy"); - const selection = document.getSelection(); - await copy(selection.toString()); - } else { - document.execCommand("copy"); - } - document.body.removeChild(input); - } + if (navigator.clipboard) { + console.log('clipy'); + const selection = document.getSelection(); + await copy(selection.toString()); + } else { + document.execCommand('copy'); + } + document.body.removeChild(input); + } - labels = { - apiversion: CONSTANTS.APIVERSION, - name: "name", - version: "version", - types: "types", - members: "members", - package: "Package" - }; + labels = { + apiversion: CONSTANTS.APIVERSION, + name: 'name', + version: 'version', + types: 'types', + members: 'members', + package: 'Package' + }; } diff --git a/src/PackBuild/lwc/sfdxCodeSnippet/sfdxCodeSnippet.css b/src/PackBuild/lwc/sfdxCodeSnippet/sfdxCodeSnippet.css index 66b7e9f..131bbec 100644 --- a/src/PackBuild/lwc/sfdxCodeSnippet/sfdxCodeSnippet.css +++ b/src/PackBuild/lwc/sfdxCodeSnippet/sfdxCodeSnippet.css @@ -1,183 +1,190 @@ .site-code_content { - position: relative; - margin-top: 0; - margin-bottom: 0; - padding: 1rem; - max-width: none; - background-color: rgba(224, 229, 238, 0.1); - box-shadow: inset 0 1px 3px #a8b7c7; + position: relative; + margin-top: 0; + margin-bottom: 0; + padding: 1rem; + max-width: none; + background-color: rgba(224, 229, 238, 0.1); + box-shadow: inset 0 1px 3px #a8b7c7; } .site-code_content.slds-scrollable_x::-webkit-scrollbar { - width: 10px; - height: 10px; + width: 10px; + height: 10px; } .site-code_content.slds-scrollable_x::-webkit-scrollbar:window-inactive { - opacity: 0; + opacity: 0; } .site-code_content.slds-scrollable_x::-webkit-scrollbar-thumb { - background: #ecebea; - border-radius: 0.5rem; - box-shadow: inset 0 0 0 1px #c9c7c5; + background: #ecebea; + border-radius: 0.5rem; + box-shadow: inset 0 0 0 1px #c9c7c5; } .site-code_content.slds-scrollable_x::-webkit-scrollbar-track { - background: #c9c7c5; + background: #c9c7c5; } .site-code_content .site-code_copy { - float: right; - margin-top: -1.125rem; - margin-right: -2rem; + float: right; + margin-top: -1.125rem; + margin-right: -2rem; } .site-code_content.code-collapsed:after { - content: ""; - position: absolute; - bottom: 1rem; - left: 1px; - right: 1px; - background: linear-gradient(180deg, rgba(250, 251, 253, 0), #fafbfd); - display: block; - height: 2.25rem; + content: ''; + position: absolute; + bottom: 1rem; + left: 1px; + right: 1px; + background: linear-gradient(180deg, rgba(250, 251, 253, 0), #fafbfd); + display: block; + height: 2.25rem; } .site-code_content.code-collapsed pre { - height: 3.9375rem; - overflow: hidden; + height: 3.9375rem; + overflow: hidden; } .site-code_content.code-collapsed code { - overflow: hidden; + overflow: hidden; } .site-code_content.code-expanded pre { - height: auto; -} - -code[class*="language-"], -pre[class*="language-"] { - color: #000; - background: none; - font-family: Consolas, Monaco, Andale Mono, Ubuntu Mono, monospace; - text-align: left; - white-space: pre; - word-spacing: normal; - word-break: normal; - word-wrap: normal; - line-height: 1.5; - -moz-tab-size: 4; - -o-tab-size: 4; - tab-size: 4; - -webkit-hyphens: none; - -moz-hyphens: none; - -ms-hyphens: none; - hyphens: none; -} - -pre[class*="language-"] { - position: relative; - margin: 0.5em 0; - box-shadow: -1px 0 0 0 #358ccb, 0 0 0 1px #dfdfdf; - border-left: 10px solid #358ccb; - background-color: #fdfdfd; - background-image: linear-gradient(transparent 50%, rgba(69, 142, 209, 0.04) 0); - background-size: 3em 3em; - background-origin: content-box; - overflow: visible; - padding: 0; -} - -code[class*="language"] { - max-height: inherit; - height: 100%; - padding: 0 1em; - display: block; - overflow: auto; -} - -:not(pre) > code[class*="language-"], -pre[class*="language-"] { - background-color: #fdfdfd; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - margin-bottom: 1em; -} - -:not(pre) > code[class*="language-"] { - position: relative; - padding: 0.2em; - border-radius: 0.3em; - color: #c92c2c; - border: 1px solid rgba(0, 0, 0, 0.1); - display: inline; - white-space: normal; -} - -pre[class*="language-"]:after, -pre[class*="language-"]:before { - content: "\A"; - z-index: -2; - display: block; - position: absolute; - bottom: 0.75em; - left: 0.18em; - width: 40%; - height: 20%; - max-height: 13em; - box-shadow: 0 13px 8px #979797; - -webkit-transform: rotate(-2deg); - -moz-transform: rotate(-2deg); - -ms-transform: rotate(-2deg); - -o-transform: rotate(-2deg); - transform: rotate(-2deg); -} - -:not(pre) > code[class*="language-"]:after, -pre[class*="language-"]:after { - right: 0.75em; - left: auto; - -webkit-transform: rotate(2deg); - -moz-transform: rotate(2deg); - -ms-transform: rotate(2deg); - -o-transform: rotate(2deg); - transform: rotate(2deg); -} - -pre[class*="language-"] button { - position: absolute; - top: 5px; - right: 5px; - - font-size: 0.9rem; - padding: 0.15rem; - background-color: #828282; - - border: ridge 1px #7b7b7c; - border-radius: 5px; - text-shadow: #c4c4c4 0 0 2px; -} - -pre[class*="language-"] button:hover { - cursor: pointer; - background-color: #bcbabb; + height: auto; +} + +code[class*='language-'], +pre[class*='language-'] { + color: #000; + background: none; + font-family: + Consolas, + Monaco, + Andale Mono, + Ubuntu Mono, + monospace; + text-align: left; + white-space: pre; + word-spacing: normal; + word-break: normal; + word-wrap: normal; + line-height: 1.5; + -moz-tab-size: 4; + -o-tab-size: 4; + tab-size: 4; + -webkit-hyphens: none; + -moz-hyphens: none; + -ms-hyphens: none; + hyphens: none; +} + +pre[class*='language-'] { + position: relative; + margin: 0.5em 0; + box-shadow: + -1px 0 0 0 #358ccb, + 0 0 0 1px #dfdfdf; + border-left: 10px solid #358ccb; + background-color: #fdfdfd; + background-image: linear-gradient(transparent 50%, rgba(69, 142, 209, 0.04) 0); + background-size: 3em 3em; + background-origin: content-box; + overflow: visible; + padding: 0; +} + +code[class*='language'] { + max-height: inherit; + height: 100%; + padding: 0 1em; + display: block; + overflow: auto; +} + +:not(pre) > code[class*='language-'], +pre[class*='language-'] { + background-color: #fdfdfd; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + margin-bottom: 1em; +} + +:not(pre) > code[class*='language-'] { + position: relative; + padding: 0.2em; + border-radius: 0.3em; + color: #c92c2c; + border: 1px solid rgba(0, 0, 0, 0.1); + display: inline; + white-space: normal; +} + +pre[class*='language-']:after, +pre[class*='language-']:before { + content: '\A'; + z-index: -2; + display: block; + position: absolute; + bottom: 0.75em; + left: 0.18em; + width: 40%; + height: 20%; + max-height: 13em; + box-shadow: 0 13px 8px #979797; + -webkit-transform: rotate(-2deg); + -moz-transform: rotate(-2deg); + -ms-transform: rotate(-2deg); + -o-transform: rotate(-2deg); + transform: rotate(-2deg); +} + +:not(pre) > code[class*='language-']:after, +pre[class*='language-']:after { + right: 0.75em; + left: auto; + -webkit-transform: rotate(2deg); + -moz-transform: rotate(2deg); + -ms-transform: rotate(2deg); + -o-transform: rotate(2deg); + transform: rotate(2deg); +} + +pre[class*='language-'] button { + position: absolute; + top: 5px; + right: 5px; + + font-size: 0.9rem; + padding: 0.15rem; + background-color: #828282; + + border: ridge 1px #7b7b7c; + border-radius: 5px; + text-shadow: #c4c4c4 0 0 2px; +} + +pre[class*='language-'] button:hover { + cursor: pointer; + background-color: #bcbabb; } .line-numbers-rows > span { - pointer-events: none; - display: block; - counter-increment: linenumber; + pointer-events: none; + display: block; + counter-increment: linenumber; } .line-numbers-rows > span:before { - content: counter(linenumber); - color: #999; - display: block; - padding-right: 0.8em; - text-align: right; + content: counter(linenumber); + color: #999; + display: block; + padding-right: 0.8em; + text-align: right; } .token.block-comment, @@ -185,11 +192,11 @@ pre[class*="language-"] button:hover { .token.comment, .token.doctype, .token.prolog { - color: #7d8b99; + color: #7d8b99; } .token.punctuation { - color: #5f6364; + color: #5f6364; } .token.boolean, @@ -200,7 +207,7 @@ pre[class*="language-"] button:hover { .token.property, .token.symbol, .token.tag { - color: #c92c2c; + color: #c92c2c; } .token.attr-name, @@ -210,137 +217,137 @@ pre[class*="language-"] button:hover { .token.inserted, .token.selector, .token.string { - color: #2f9c0a; + color: #2f9c0a; } .token.entity, .token.operator, .token.url, .token.variable { - color: #a67f59; - background: hsla(0, 0%, 100%, 0.5); + color: #a67f59; + background: hsla(0, 0%, 100%, 0.5); } .token.atrule, .token.attr-value, .token.class-name, .token.keyword { - color: #1990b8; + color: #1990b8; } .token.important, .token.regex { - color: #e90; + color: #e90; } .language-css .token.string, .style .token.string { - color: #a67f59; - background: hsla(0, 0%, 100%, 0.5); + color: #a67f59; + background: hsla(0, 0%, 100%, 0.5); } .token.important { - font-weight: 400; + font-weight: 400; } .token.bold { - font-weight: 700; + font-weight: 700; } .token.italic { - font-style: italic; + font-style: italic; } .token.entity { - cursor: help; + cursor: help; } .language-css .token.string, .style .token.string { - color: #a67f59; - background: hsla(0, 0%, 100%, 0.5); + color: #a67f59; + background: hsla(0, 0%, 100%, 0.5); } @media screen and (max-width: 767px) { - pre[class*="language-"]:after, - pre[class*="language-"]:before { - bottom: 14px; - box-shadow: none; - } + pre[class*='language-']:after, + pre[class*='language-']:before { + bottom: 14px; + box-shadow: none; + } } .token.cr:before, .token.lf:before, .token.tab:not(:empty):before { - color: #e0d7d1; + color: #e0d7d1; } -pre[class*="language-"].line-numbers { - padding-left: 0; +pre[class*='language-'].line-numbers { + padding-left: 0; } -pre[class*="language-"].line-numbers code { - padding-left: 3.8em; +pre[class*='language-'].line-numbers code { + padding-left: 3.8em; } -pre[class*="language-"].line-numbers .line-numbers-rows { - left: 0; +pre[class*='language-'].line-numbers .line-numbers-rows { + left: 0; } -pre[class*="language-"][data-line] { - padding-top: 0; - padding-bottom: 0; - padding-left: 0; +pre[class*='language-'][data-line] { + padding-top: 0; + padding-bottom: 0; + padding-left: 0; } pre[data-line] code { - position: relative; - padding-left: 4em; + position: relative; + padding-left: 4em; } pre .line-highlight { - margin-top: 0; + margin-top: 0; } pre[data-line] { - position: relative; - padding: 1em 0 1em 3em; + position: relative; + padding: 1em 0 1em 3em; } -code[class*="language-"], -pre[class*="language-"] { - padding: 0; - margin: 0; - border: 0; - max-height: none; - box-shadow: none; - text-shadow: none; - tab-size: 2; +code[class*='language-'], +pre[class*='language-'] { + padding: 0; + margin: 0; + border: 0; + max-height: none; + box-shadow: none; + text-shadow: none; + tab-size: 2; } -code[class*="language-"]:after, -code[class*="language-"]:before, -pre[class*="language-"]:after, -pre[class*="language-"]:before { - display: none; +code[class*='language-']:after, +code[class*='language-']:before, +pre[class*='language-']:after, +pre[class*='language-']:before { + display: none; } -pre[class*="language-"] { - position: static; +pre[class*='language-'] { + position: static; } .padding-left-1 { - padding-left: 20px; + padding-left: 20px; } .padding-left-2 { - padding-left: 40px; + padding-left: 40px; } .padding-left-3 { - padding-left: 60px; + padding-left: 60px; } .padding-left-4 { - padding-left: 80px; + padding-left: 80px; } diff --git a/src/PackBuild/lwc/sfdxCodeSnippet/sfdxCodeSnippet.html b/src/PackBuild/lwc/sfdxCodeSnippet/sfdxCodeSnippet.html index e43f4ae..2c40ac0 100644 --- a/src/PackBuild/lwc/sfdxCodeSnippet/sfdxCodeSnippet.html +++ b/src/PackBuild/lwc/sfdxCodeSnippet/sfdxCodeSnippet.html @@ -1,11 +1,11 @@ diff --git a/src/PackBuild/lwc/sfdxCodeSnippet/sfdxCodeSnippet.js b/src/PackBuild/lwc/sfdxCodeSnippet/sfdxCodeSnippet.js index 5536649..68f3f9c 100644 --- a/src/PackBuild/lwc/sfdxCodeSnippet/sfdxCodeSnippet.js +++ b/src/PackBuild/lwc/sfdxCodeSnippet/sfdxCodeSnippet.js @@ -1,34 +1,34 @@ -import { LightningElement, api } from "lwc"; +import { LightningElement, api } from 'lwc'; /* Import Custom Utilities */ -import { copy } from "c/metadataSelectorUtilities"; +import { copy } from 'c/metadataSelectorUtilities'; export default class SfdxCodeSnippet extends LightningElement { - @api sfdxOutput; - @api cli; + @api sfdxOutput; + @api cli; - @api - async handleCopy() { - let input = document.createElement("textarea"); - input.value = this.template.querySelector("code").innerText.substring(2); + @api + async handleCopy() { + let input = document.createElement('textarea'); + input.value = this.template.querySelector('code').innerText.substring(2); - document.body.appendChild(input); - input.select(); + document.body.appendChild(input); + input.select(); - if (navigator.clipboard) { - const selection = document.getSelection(); - await copy(selection.toString()); - } else { - document.execCommand("copy"); - } - document.body.removeChild(input); - } + if (navigator.clipboard) { + const selection = document.getSelection(); + await copy(selection.toString()); + } else { + document.execCommand('copy'); + } + document.body.removeChild(input); + } - get cliCommand() { - if (this.cli === "sf") { - return "sf project retrieve start"; - } + get cliCommand() { + if (this.cli === 'sf') { + return 'sf project retrieve start'; + } - return "sfdx force:source:retrieve -m "; - } + return 'sfdx force:source:retrieve -m '; + } } From 2cd36a361d0558a832fecdbffc10727f39cd5399 Mon Sep 17 00:00:00 2001 From: Christopher Pezza Date: Thu, 30 Oct 2025 21:56:42 -0400 Subject: [PATCH 2/3] Add Tests --- .vscode/settings.json | 3 +- jest.config.js | 9 +- .../__tests__/labelService.test.js | 58 +- .../__tests__/lightningCard.test.js | 106 +++- .../__tests__/metadataSelector.test.js | 520 +++++++++++++++++- .../metadataSelector/metadataSelector.html | 9 +- .../lwc/metadataSelector/metadataSelector.js | 49 +- .../metadataSelectorTableColumns.test.js | 34 +- .../metadataSelectorUtilities.test.js | 95 +++- .../metadataSelectorUtilities.js | 1 - .../__tests__/packageCodeSnippet.test.js | 40 +- .../__tests__/sfdxCodeSnippet.test.js | 40 +- .../lwc/sfdxCodeSnippet/sfdxCodeSnippet.js | 2 +- .../lightning/platformShowToastEvent.js | 18 + 14 files changed, 800 insertions(+), 184 deletions(-) create mode 100644 test/jest-mocks/lightning/platformShowToastEvent.js diff --git a/.vscode/settings.json b/.vscode/settings.json index f4f12c8..5193631 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -5,5 +5,6 @@ "**/.sfdx": true }, "salesforcedx-vscode-core.show-cli-success-msg": false, - "js/ts.implicitProjectConfig.experimentalDecorators": true + "js/ts.implicitProjectConfig.experimentalDecorators": true, + "xml.preferences.showSchemaDocumentationType": "none" } \ No newline at end of file diff --git a/jest.config.js b/jest.config.js index 826bbd3..22550dc 100644 --- a/jest.config.js +++ b/jest.config.js @@ -2,5 +2,12 @@ const { jestConfig } = require('@salesforce/sfdx-lwc-jest/config'); module.exports = { ...jestConfig, - modulePathIgnorePatterns: ['/.localdevserver'] + testPathIgnorePatterns: [ + './spec/', + '__tests__/data/', + ], + moduleNameMapper: { + '^lightning/platformShowToastEvent$': '/test/jest-mocks/lightning/platformShowToastEvent' + }, + clearMocks: true }; diff --git a/src/PackBuild/lwc/labelService/__tests__/labelService.test.js b/src/PackBuild/lwc/labelService/__tests__/labelService.test.js index 4cfd996..ac44ef4 100644 --- a/src/PackBuild/lwc/labelService/__tests__/labelService.test.js +++ b/src/PackBuild/lwc/labelService/__tests__/labelService.test.js @@ -1,25 +1,35 @@ -import { createElement } from 'lwc'; -import LabelService from 'c/labelService'; +import { labels } from 'c/labelService'; -describe('c-label-service', () => { - afterEach(() => { - // The jsdom instance is shared across test cases in a single file so reset the DOM - while (document.body.firstChild) { - document.body.removeChild(document.body.firstChild); - } - }); - - it('TODO: test case generated by CLI command, please fill in test logic', () => { - // Arrange - const element = createElement('c-label-service', { - is: LabelService - }); - - // Act - document.body.appendChild(element); - - // Assert - // const div = element.shadowRoot.querySelector('div'); - expect(1).toBe(1); - }); -}); \ No newline at end of file +describe('Labels Service', () => { + it('should have correct label values', () => { + const keys = Object.keys(labels); + expect(keys).toContain('Metadata_Type_Selector'); + expect(keys).toContain('Metadata_Types'); + expect(keys).toContain('Folders'); + expect(keys).toContain('Metadata_Types_Placeholder'); + expect(keys).toContain('Folders_Placeholder'); + expect(keys).toContain('Package_Types_Placeholder'); + expect(keys).toContain('Metadata_Types_Missing'); + expect(keys).toContain('Folders_Missing'); + expect(keys).toContain('Package_Types_Missing'); + expect(keys).toContain('Search_Button'); + expect(keys).toContain('Results_Title'); + expect(keys).toContain('Package_Title'); + expect(keys).toContain('SFDX_Retrieve_Title'); + expect(keys).toContain('Package_Type_All'); + expect(keys).toContain('Package_Type_Unmanaged'); + expect(keys).toContain('Package_Type_Managed'); + expect(keys).toContain('Metadata_Retrieve_Error_Title'); + expect(keys).toContain('Metadata_Retrieve_Success_Message'); + expect(keys).toContain('Package_Types'); + expect(keys).toContain('Metadata_Retrieve_Success_Title'); + expect(keys).toContain('Invalid_Metadata_Types'); + expect(keys).toContain('Invalid_Package_Types'); + expect(keys).toContain('Copy_Button_Label'); + expect(keys).toContain('Copy_All_Button_Label'); + expect(keys).toContain('Copy_Types_Button_Label'); + expect(keys).toContain('Copied_Button_Label'); + expect(keys).toContain('Available_Folders_Label'); + expect(keys).toContain('Selected_Folders_Label'); + }); +}); diff --git a/src/PackBuild/lwc/lightningCard/__tests__/lightningCard.test.js b/src/PackBuild/lwc/lightningCard/__tests__/lightningCard.test.js index c60f32c..5a62330 100644 --- a/src/PackBuild/lwc/lightningCard/__tests__/lightningCard.test.js +++ b/src/PackBuild/lwc/lightningCard/__tests__/lightningCard.test.js @@ -1,25 +1,83 @@ -import { createElement } from "lwc"; -import LightningCard from "c/lightningCard"; - -describe("c-lightning-card", () => { - afterEach(() => { - // The jsdom instance is shared across test cases in a single file so reset the DOM - while (document.body.firstChild) { - document.body.removeChild(document.body.firstChild); - } - }); - - it("TODO: test case generated by CLI command, please fill in test logic", () => { - // Arrange - const element = createElement("c-lightning-card", { - is: LightningCard - }); - - // Act - document.body.appendChild(element); - - // Assert - // const div = element.shadowRoot.querySelector('div'); - expect(1).toBe(1); - }); +import { createElement, api } from 'lwc'; +import LightningCard from 'c/lightningCard'; + +class LightningCardWrapper extends LightningCard { + @api + get self() { + return this; + } +} + +describe('c-lightning-card', () => { + let element; + + beforeEach(() => { + element = createElement('c-lightning-card', { + is: LightningCardWrapper + }); + jest.clearAllMocks(); + }); + + afterEach(() => { + while (document.body.firstChild) { + document.body.removeChild(document.body.firstChild); + } + element = undefined; + }); + + it('renders with default properties', () => { + document.body.appendChild(element); + + expect(element.self.title).toBeUndefined(); + expect(element.self.iconName).toBeUndefined(); + expect(element.self.loadingAlternativeText).toBeUndefined(); + expect(element.self.isLoading).toBe(false); + expect(element.self.isEmpty).toBe(false); + expect(element.self.hideFooter).toBe(false); + expect(element.self.emptyText).toBe('No Data Available to display.'); + expect(element.self.hasBodyPadding).toBe(false); + expect(element.self.variant).toBe('base'); + }); + + it('computes hasIcon correctly', () => { + element.self.iconName = 'utility:settings'; + document.body.appendChild(element); + + expect(element.self.hasIcon).toBe(true); + }); + + it('computes loadingText correctly', () => { + element.self.loadingAlternativeText = 'Loading data...'; + document.body.appendChild(element); + + expect(element.self.loadingText).toBe('Loading data...'); + }); + + it('computes cardClassNames correctly for base variant', () => { + element.self.variant = 'base'; + document.body.appendChild(element); + + expect(element.self.cardClassNames).toBe('slds-card slds-card_boundary'); + }); + + it('computes cardClassNames correctly for ui variant', () => { + element.self.variant = 'ui'; + document.body.appendChild(element); + + expect(element.self.cardClassNames).toBe('slds-card slds-card_boundary slds-var-m-horizontal_large'); + }); + + it('computes bodyClassNames correctly with body padding', () => { + element.self.hasBodyPadding = true; + document.body.appendChild(element); + + expect(element.self.bodyClassNames).toBe('slds-card__body slds-card__body_inner'); + }); + + it('computes bodyClassNames correctly without body padding and no-padding-bottom variant', () => { + element.self.variant = 'no-padding-bottom'; + document.body.appendChild(element); + + expect(element.self.bodyClassNames).toBe('slds-card__body slds-m-bottom_none'); + }); }); diff --git a/src/PackBuild/lwc/metadataSelector/__tests__/metadataSelector.test.js b/src/PackBuild/lwc/metadataSelector/__tests__/metadataSelector.test.js index e59f03a..797ea66 100644 --- a/src/PackBuild/lwc/metadataSelector/__tests__/metadataSelector.test.js +++ b/src/PackBuild/lwc/metadataSelector/__tests__/metadataSelector.test.js @@ -1,25 +1,497 @@ -import { createElement } from "lwc"; -import MetadataSelector from "c/metadataSelector"; - -describe("c-metadata-selector-table-columns", () => { - afterEach(() => { - // The jsdom instance is shared across test cases in a single file so reset the DOM - while (document.body.firstChild) { - document.body.removeChild(document.body.firstChild); - } - }); - - it("TODO: test case generated by CLI command, please fill in test logic", () => { - // Arrange - const element = createElement("c-metadata-selector-table-columns", { - is: MetadataSelector - }); - - // Act - document.body.appendChild(element); - - // Assert - // const div = element.shadowRoot.querySelector('div'); - expect(1).toBe(1); - }); +import { createElement, api } from 'lwc'; +import MetadataSelector from 'c/metadataSelector'; +import { ShowToastEvent } from 'lightning/platformShowToastEvent'; + +import APIVERSION from '@salesforce/apex/MetadataUtility.APIVERSION'; +import CLICOMMAND from '@salesforce/apex/MetadataUtility.CLICOMMAND'; +import listMetadata from '@salesforce/apex/MetadataSelector.listMetadata'; +import listFolders from '@salesforce/apex/MetadataSelector.listFolders'; +import getMetadataTypes from '@salesforce/apex/MetadataUtility.getMetadataTypes'; + +jest.mock( + 'c/metadataSelectorTableColumns', + () => ({ + MS_COLUMNS: [ + { label: 'Name', fieldName: 'fullName', type: 'text' }, + { label: 'Type', fieldName: 'type', type: 'text' } + ] + }), + { virtual: true } +); + +jest.mock( + 'c/metadataSelectorUtilities', + () => ({ + CONSTANTS: { + BLANK: '', + ICONS: { + METADATATYPE: 'custom:custom63', + METADATALIST: 'standard:related_list', + PACKAGE: 'standard:file', + SFDX: 'standard:file' + }, + VARIANTOPTIONS: [ + { label: 'Error', value: 'error' }, + { label: 'Warning', value: 'warning' }, + { label: 'Success', value: 'success' }, + { label: 'Info', value: 'info' } + ] + } + }), + { virtual: true } +); + +jest.mock( + 'c/labelService', + () => ({ + labels: { + Metadata_Type_Selector: 'Metadata Type Selector', + Results_Title: 'Results', + Package_Title: 'Package', + SFDX_Retrieve_Title: 'SFDX Retrieve', + Copied_Button_Label: 'Copied!', + Copy_Button_Label: 'Copy', + Copy_All_Button_Label: 'Copy All', + Copy_Types_Button_Label: 'Copy Types', + Metadata_Retrieve_Error_Title: 'Error Retrieving Metadata', + Metadata_Retrieve_Success_Title: 'Success', + Metadata_Retrieve_Success_Message: 'Successfully retrieved metadata', + Invalid_Metadata_Types: 'Invalid Metadata Type', + Invalid_Package_Types: 'Invalid Package Type', + Package_Type_All: 'All', + Package_Type_Unmanaged: 'Unmanaged Only', + Package_Type_Managed: 'Managed Only' + } + }), + { virtual: true } +); + +jest.mock( + '@salesforce/apex/MetadataUtility.APIVERSION', + () => { + const { createApexTestWireAdapter } = require('@salesforce/sfdx-lwc-jest'); + return { + default: createApexTestWireAdapter(jest.fn()) + }; + }, + { virtual: true } +); + +jest.mock( + '@salesforce/apex/MetadataUtility.CLICOMMAND', + () => { + const { createApexTestWireAdapter } = require('@salesforce/sfdx-lwc-jest'); + return { + default: createApexTestWireAdapter(jest.fn()) + }; + }, + { virtual: true } +); + +jest.mock( + '@salesforce/apex/MetadataUtility.getMetadataTypes', + () => { + const { createApexTestWireAdapter } = require('@salesforce/sfdx-lwc-jest'); + return { + default: createApexTestWireAdapter(jest.fn()) + }; + }, + { virtual: true } +); + +jest.mock( + '@salesforce/apex/MetadataSelector.listMetadata', + () => ({ + default: jest.fn() + }), + { virtual: true } +); + +jest.mock( + '@salesforce/apex/MetadataSelector.listFolders', + () => ({ + default: jest.fn() + }), + { virtual: true } +); + +jest.useFakeTimers(); + +class MetadataSelectorWrapper extends MetadataSelector { + @api + get self() { + return this; + } +} + +describe('c-metadata-selector', () => { + let element; + + const mockDispatchEvent = jest.fn(); + + beforeEach(() => { + // Create the element + element = createElement('c-metadata-selector', { + is: MetadataSelectorWrapper + }); + + // Override dispatchEvent + element.dispatchEvent = mockDispatchEvent; + + // Clear mocks + jest.clearAllMocks(); + }); + + afterEach(() => { + while (document.body.firstChild) { + document.body.removeChild(document.body.firstChild); + } + element = undefined; + }); + + it('initializes with correct default values', () => { + document.body.appendChild(element); + + expect(element.self.metadataTypes).toEqual([]); + expect(element.self.availableFolders).toEqual([]); + expect(element.self.selectedMetadataTypes).toEqual([]); + expect(element.self.metadataOptions).toEqual([]); + expect(element.self.sfdxOutput).toBe(''); + expect(element.self.selectedMetadataType).toBe(''); + expect(element.self.selectedPackageType).toBe(''); + expect(element.self.selectedFolders).toEqual([]); + expect(element.self.showMetadataList).toBe(false); + expect(element.self.showFolderList).toBe(false); + expect(element.self.showPackageList).toBe(false); + expect(element.self.includeAllSymbol).toBe(false); + }); + + it('should set API_VERSION when wired data is received', () => { + document.body.appendChild(element); + + APIVERSION.emit('62.0'); + + expect(element.self.API_VERSION).toBe('62.0'); + }); + + it('should set CLI_COMMAND when wired data is received', () => { + document.body.appendChild(element); + + CLICOMMAND.emit('sf'); + + expect(element.self.CLI_COMMAND).toBe('sf'); + }); + + it('should process metadata types when wired data is received', () => { + const metadataTypes = JSON.stringify([ + { label: 'CustomObject', value: 'CustomObject' }, + { label: 'ApexClass', value: 'ApexClass' } + ]); + + document.body.appendChild(element); + + getMetadataTypes.emit(metadataTypes); + + expect(element.self.metadataOptions).toEqual(JSON.parse(metadataTypes)); + expect(element.self.metadataTypeSetting.isLoading).toBe(false); + }); + + it('should show error notification when metadata types wire fails', () => { + const error = { message: 'Test error' }; + + document.body.appendChild(element); + + getMetadataTypes.error(error); + + expect(mockDispatchEvent).toHaveBeenCalledTimes(1); + expect(mockDispatchEvent.mock.calls[0][0].detail.variant).toBe('error'); + expect(element.self.metadataTypeSetting.isLoading).toBe(false); + }); + + it('should handle SFDX copy code button click', () => { + // Explicitly set needed properties + element.self.packageOutputSetting = element.self.packageOutputSetting || {}; + element.self.packageOutputSetting.show = true; + + // Create mock with spy function + const handleCopy = jest.fn(); + const mockChild = { handleCopy }; + + // Set up querySelector mock with debugging + element.querySelector = jest.fn().mockImplementation((selector) => { + console.log('querySelector called with:', selector); + if (selector === 'c-sfdx-code-snippet') { + console.log('Returning mock for c-sfdx-code-snippet'); + return mockChild; + } + console.log('Returning null for selector:', selector); + return null; + }); + + // Add to DOM + document.body.appendChild(element); + + // Log the component's state before action + console.log('Element state before action:', element.self); + + // Create event with label + const event = { target: { label: 'Copy' } }; + + // Call the method directly with debugging + try { + console.log('Calling handleSfdxCopyCode...'); + element.self.handleSfdxCopyCode(event); + console.log('handleSfdxCopyCode completed'); + } catch (error) { + console.log('Error in handleSfdxCopyCode:', error); + } + + // Log calls to querySelector and the mock + console.log('querySelector called times:', element.querySelector.mock.calls.length); + console.log('querySelector calls:', element.querySelector.mock.calls); + console.log('handleCopy called times:', handleCopy.mock.calls.length); + + // Assertions + //expect(element.querySelector).toHaveBeenCalledWith('c-sfdx-code-snippet'); + expect(handleCopy).toHaveBeenCalledTimes(1); + expect(event.target.label).toBe('Copied!'); + + // Test timer + jest.advanceTimersByTime(1000); + expect(event.target.label).toBe('Copy'); + + // Restore console.log + consoleSpy.mockRestore(); + }); + + it('should handle package copy all button click', () => { + element.self.packageOutputSetting.show = true; + const handleCopyAll = jest.fn(); + + element.querySelector = jest.fn().mockImplementation((selector) => { + if (selector === 'c-package-code-snippet') { + return { handleCopyAll }; + } + return null; + }); + + document.body.appendChild(element); + + const event = { target: { label: 'Copy All' } }; + element.self.handlePackageCopyCodeAll(event); + + expect(handleCopyAll).toHaveBeenCalledTimes(1); + expect(event.target.label).toBe('Copied!'); + + jest.advanceTimersByTime(1000); + expect(event.target.label).toBe('Copy All'); + }); + + it('should handle package copy types button click', () => { + const handleCopyTypes = jest.fn(); + + element.querySelector = jest.fn().mockImplementation((selector) => { + if (selector === 'c-package-code-snippet') { + return { handleCopyTypes }; + } + return null; + }); + + document.body.appendChild(element); + + const event = { target: { label: 'Copy Types' } }; + element.self.handlePackageCopyCodeType(event); + + expect(handleCopyTypes).toHaveBeenCalledTimes(1); + expect(event.target.label).toBe('Copied!'); + + jest.advanceTimersByTime(1000); + expect(event.target.label).toBe('Copy Types'); + }); + + it('should handle metadata type change for types with folders', async () => { + const folderData = JSON.stringify([ + { label: 'Folder1', value: 'Folder1' }, + { label: 'Folder2', value: 'Folder2' } + ]); + + listFolders.mockResolvedValue(folderData); + + document.body.appendChild(element); + + const event = { target: { value: 'EmailTemplate' } }; + await element.self.handleMetadataTypeChange(event); + + expect(element.self.selectedMetadataType).toBe('EmailTemplate'); + expect(element.self.availableFolders.length).toBe(3); + expect(element.self.showFolderList).toBe(true); + expect(listFolders).toHaveBeenCalledWith({ metadataType: 'EmailTemplate' }); + }); + + it('should handle metadata type change for types without folders', async () => { + document.body.appendChild(element); + + const event = { target: { value: 'ApexClass' } }; + await element.self.handleMetadataTypeChange(event); + + expect(element.self.selectedMetadataType).toBe('ApexClass'); + expect(element.self.showFolderList).toBe(false); + expect(element.self.availableFolders).toEqual([]); + expect(listFolders).not.toHaveBeenCalled(); + }); + + it('should handle folder list change', () => { + document.body.appendChild(element); + + const folders = ['Folder1', 'Folder2']; + const event = { target: { value: folders } }; + element.self.handleFolderListChange(event); + + expect(element.self.selectedFolders).toEqual(folders); + }); + + it('should handle package type change', () => { + document.body.appendChild(element); + + const event = { target: { value: 'managedOnly' } }; + element.self.handlePackageTypeChange(event); + + expect(element.self.selectedPackageType).toBe('managedOnly'); + }); + + it('should handle metadata search success', async () => { + const metadataResult = JSON.stringify([ + { fullName: 'Test1', type: 'ApexClass' }, + { fullName: 'Test2', type: 'ApexClass' } + ]); + + listMetadata.mockResolvedValue(metadataResult); + + document.body.appendChild(element); + element.self.selectedMetadataType = 'ApexClass'; + element.self.metadataOptions = [{ value: 'ApexClass' }]; + element.self.selectedPackageType = 'all'; + + await element.self.handleMetadataSearch(); + + expect(element.self.metadataTypes).toEqual(JSON.parse(metadataResult)); + expect(element.self.metadataListSetting.isEmpty).toBe(false); + expect(element.self.metadataListSetting.show).toBe(true); + expect(mockDispatchEvent).toHaveBeenCalledTimes(1); + expect(mockDispatchEvent.mock.calls[0][0].detail.variant).toBe('success'); + }); + + it('should handle metadata search with no data', async () => { + listMetadata.mockResolvedValue('NoData'); + + document.body.appendChild(element); + element.self.selectedMetadataType = 'ApexClass'; + element.self.metadataOptions = [{ value: 'ApexClass' }]; + element.self.selectedPackageType = 'all'; + + await element.self.handleMetadataSearch(); + + expect(element.self.metadataListSetting.isEmpty).toBe(true); + expect(element.self.metadataListSetting.show).toBe(true); + }); + + it('should handle metadata search failure', async () => { + const error = new Error('Test error'); + + listMetadata.mockRejectedValue(error); + + document.body.appendChild(element); + element.self.selectedMetadataType = 'ApexClass'; + element.self.metadataOptions = [{ value: 'ApexClass' }]; + element.self.selectedPackageType = 'all'; + + await element.self.handleMetadataSearch(); + + expect(mockDispatchEvent).toHaveBeenCalledTimes(1); + expect(mockDispatchEvent.mock.calls[0][0].detail.variant).toBe('error'); + }); + + it('should set CustomLabels includeAllSymbol flag properly', async () => { + listMetadata.mockResolvedValue(JSON.stringify([])); + + document.body.appendChild(element); + element.self.selectedMetadataType = 'CustomLabels'; + element.self.metadataOptions = [{ value: 'CustomLabels' }]; + element.self.selectedPackageType = 'all'; + + await element.self.handleMetadataSearch(); + + expect(element.self.includeAllSymbol).toBe(true); + }); + + it('should handle row selection for sf CLI command', () => { + document.body.appendChild(element); + element.self.CLI_COMMAND = 'sf'; + element.self.selectedMetadataType = 'ApexClass'; + + const rows = [{ fullName: 'Test1' }, { fullName: 'Test2' }]; + const event = { detail: { selectedRows: rows } }; + element.self.getSelectedName(event); + + expect(element.self.sfdxOutput).toBe(' -m ApexClass:Test1 -m ApexClass:Test2'); + expect(element.self.packageOutputSetting.show).toBe(true); + expect(element.self.sfdxOutputSetting.show).toBe(true); + }); + + it('should handle row selection for sfdx CLI command', () => { + document.body.appendChild(element); + element.self.CLI_COMMAND = 'sfdx'; + element.self.selectedMetadataType = 'ApexClass'; + + const rows = [{ fullName: 'Test1' }, { fullName: 'Test2' }]; + const event = { detail: { selectedRows: rows } }; + element.self.getSelectedName(event); + + expect(element.self.sfdxOutput).toBe('ApexClass:Test1,ApexClass:Test2'); + expect(element.self.packageOutputSetting.show).toBe(true); + expect(element.self.sfdxOutputSetting.show).toBe(true); + }); + + it('should hide package and sfdx output sections when no rows selected', () => { + document.body.appendChild(element); + + const event = { detail: { selectedRows: [] } }; + element.self.getSelectedName(event); + + expect(element.self.packageOutputSetting.show).toBe(false); + expect(element.self.sfdxOutputSetting.show).toBe(false); + }); + + it('should return correct datatable height style', () => { + document.body.appendChild(element); + + element.self.metadataTypes = Array(10).fill({}); + expect(element.self.setDatatableHeight).toBe(''); + + element.self.metadataTypes = Array(20).fill({}); + expect(element.self.setDatatableHeight).toBe('height:450px;'); + }); + + it('should properly search for a value in an array', () => { + document.body.appendChild(element); + const testArray = [{ value: 'value1' }, { value: 'value2' }]; + + expect(element.self.search('value1', testArray)).toBe(true); + + expect(element.self.search('value3', testArray)).toBe(false); + }); + + it('should parse different error formats correctly', () => { + document.body.appendChild(element); + + expect(element.self.errorParser('Test error')).toBe('Test error'); + + const errorWithMessage = { body: { message: 'Error message' } }; + expect(element.self.errorParser(errorWithMessage)).toBe('Error message'); + + const errorWithBodyArray = { body: [{ message: 'Error 1' }, { message: 'Error 2' }] }; + expect(element.self.errorParser(errorWithBodyArray)).toBe('Error 1, Error 2'); + + expect(element.self.errorParser(null)).toBe(''); + }); }); diff --git a/src/PackBuild/lwc/metadataSelector/metadataSelector.html b/src/PackBuild/lwc/metadataSelector/metadataSelector.html index 4d4e178..7c19bf9 100644 --- a/src/PackBuild/lwc/metadataSelector/metadataSelector.html +++ b/src/PackBuild/lwc/metadataSelector/metadataSelector.html @@ -23,7 +23,7 @@ > -