├── .gitignore ├── .vscode ├── launch.json ├── settings.json └── tasks.json ├── LICENSE.txt ├── README.md ├── client ├── .gitignore ├── README.md ├── build │ ├── asset-manifest.json │ ├── favicon.ico │ ├── index.html │ ├── logo192.png │ ├── logo512.png │ ├── manifest.json │ ├── precache-manifest.61ddf4873fc6db8dfc079ac68782190f.js │ ├── robots.txt │ ├── service-worker.js │ └── static │ │ ├── css │ │ ├── main.523f09c5.chunk.css │ │ └── main.523f09c5.chunk.css.map │ │ └── js │ │ ├── 2.802a2f8d.chunk.js │ │ ├── 2.802a2f8d.chunk.js.LICENSE.txt │ │ ├── 2.802a2f8d.chunk.js.map │ │ ├── main.5aff7432.chunk.js │ │ ├── main.5aff7432.chunk.js.map │ │ ├── runtime-main.ef76e641.js │ │ └── runtime-main.ef76e641.js.map ├── package-lock.json ├── package.json ├── public │ ├── favicon.ico │ ├── index.html │ ├── logo192.png │ ├── logo512.png │ ├── manifest.json │ └── robots.txt └── src │ ├── App.css │ ├── App.js │ ├── App.test.js │ ├── components │ ├── AppHeader.js │ ├── ComponentList.js │ └── MetadataType.js │ ├── context │ └── reducer.js │ ├── index.css │ ├── index.js │ ├── logo.svg │ ├── serviceWorker.js │ └── setupTests.js ├── icon.png ├── media └── main.js ├── out ├── extension.js └── extension.js.map ├── package-lock.json ├── package.json ├── sfdx-gen-pack1.png ├── sfdx-gen-pack2.png ├── src └── extension.ts ├── tsconfig.json └── tslint.json /.gitignore: -------------------------------------------------------------------------------- 1 | out 2 | node_modules/ 3 | *.vsix -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | // A launch configuration that compiles the extension and then opens it inside a new window 2 | // Use IntelliSense to learn about possible attributes. 3 | // Hover to view descriptions of existing attributes. 4 | // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 5 | { 6 | "version": "0.2.0", 7 | "configurations": [ 8 | { 9 | "name": "Run Extension", 10 | "type": "extensionHost", 11 | "request": "launch", 12 | "runtimeExecutable": "${execPath}", 13 | "args": ["--extensionDevelopmentPath=${workspaceRoot}"], 14 | "outFiles": ["${workspaceFolder}/out/**/*.js"], 15 | "preLaunchTask": "npm: watch" 16 | } 17 | ] 18 | } 19 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "editor.insertSpaces": false, 3 | "git.ignoreLimitWarning": true 4 | } -------------------------------------------------------------------------------- /.vscode/tasks.json: -------------------------------------------------------------------------------- 1 | // See https://go.microsoft.com/fwlink/?LinkId=733558 2 | // for the documentation about the tasks.json format 3 | { 4 | "version": "2.0.0", 5 | "tasks": [ 6 | { 7 | "type": "npm", 8 | "script": "watch", 9 | "problemMatcher": "$tsc-watch", 10 | "isBackground": true, 11 | "presentation": { 12 | "reveal": "never" 13 | }, 14 | "group": { 15 | "kind": "build", 16 | "isDefault": true 17 | } 18 | } 19 | ] 20 | } 21 | -------------------------------------------------------------------------------- /LICENSE.txt: -------------------------------------------------------------------------------- 1 | The 3-Clause BSD License 2 | 3 | Copyright (c) 2019 vignaesh01 4 | 5 | Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 6 | 7 | 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 8 | 9 | 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 10 | 11 | 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. 12 | 13 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Salesforce Package.xml Generator Extension for VS Code 2 | 3 | This extension provides a User Interface to choose metadata components for Package.xml file for development against sandboxes or DE orgs (Org Development Model with VS Code). This is similar to Eclipse Force.com IDE Add/Remove Metadata Components option. 4 | 5 | ## Prerequisites 6 | Before you set up Salesforce Package.xml Generator Extension for VS Code, make sure that you have these essentials. 7 | 8 | - Salesforce Extensions for Visual Studio Code 9 | - Visual Studio Code v1.26 or later 10 | 11 | ## Screenshots 12 | ![Screenshot 1](sfdx-gen-pack1.png) 13 | 14 | ![Screenshot 2](sfdx-gen-pack2.png) 15 | 16 | ## How to use? 17 | [Click to view the Youtube Video](https://youtu.be/uXwIMh8bK0A) 18 | 19 | [![How to Use](https://img.youtube.com/vi/uXwIMh8bK0A/0.jpg)](https://youtu.be/uXwIMh8bK0A) 20 | - Setup your project using **SFDX: Create Project with Manifest** command and authorize it using **SFDX: Authorize an Org command**. Skip this step if already done. 21 | For more details refer [Org Development Model with VS Code] (https://forcedotcom.github.io/salesforcedx-vscode/articles/user-guide/org-development-model). 22 | - Open the command palette (press Ctrl+Shift+P on Windows or Linux, or Cmd+Shift+P on macOS) and run **SFDX Package.xml Generator: Choose Metadata Components** command. 23 | - In Choose Metadata Components for Package.xml page, select the Metadata you need and click on **Update Package.xml** button. 24 | - Package.xml file opens up with the selected metadata components. 25 | - Open the command palette (press Ctrl+Shift+P on Windows or Linux, or Cmd+Shift+P on macOS) and run **SFDX: Retrieve Source in Manifest from Org** 26 | - **Select All** button selects all the metadata components except Reports, Dashboards, Email Templates and Documents. 27 | - If you don't want to modify the existing package.xml file & only want the generated xml content, click on **Copy to Clipboard** button. This copies the formatted package.xml contents to clipboard which can be pasted somewhere else. 28 | -------------------------------------------------------------------------------- /client/.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.js 7 | 8 | # testing 9 | /coverage 10 | 11 | # production 12 | #/build 13 | 14 | # misc 15 | .DS_Store 16 | .env.local 17 | .env.development.local 18 | .env.test.local 19 | .env.production.local 20 | 21 | npm-debug.log* 22 | yarn-debug.log* 23 | yarn-error.log* 24 | -------------------------------------------------------------------------------- /client/README.md: -------------------------------------------------------------------------------- 1 | This project was bootstrapped with [Create React App](https://github.com/facebook/create-react-app). 2 | 3 | ## Available Scripts 4 | 5 | In the project directory, you can run: 6 | 7 | ### `npm start` 8 | 9 | Runs the app in the development mode.
10 | Open [http://localhost:3000](http://localhost:3000) to view it in the browser. 11 | 12 | The page will reload if you make edits.
13 | You will also see any lint errors in the console. 14 | 15 | ### `npm test` 16 | 17 | Launches the test runner in the interactive watch mode.
18 | See the section about [running tests](https://facebook.github.io/create-react-app/docs/running-tests) for more information. 19 | 20 | ### `npm run build` 21 | 22 | Builds the app for production to the `build` folder.
23 | It correctly bundles React in production mode and optimizes the build for the best performance. 24 | 25 | The build is minified and the filenames include the hashes.
26 | Your app is ready to be deployed! 27 | 28 | See the section about [deployment](https://facebook.github.io/create-react-app/docs/deployment) for more information. 29 | 30 | ### `npm run eject` 31 | 32 | **Note: this is a one-way operation. Once you `eject`, you can’t go back!** 33 | 34 | If you aren’t satisfied with the build tool and configuration choices, you can `eject` at any time. This command will remove the single build dependency from your project. 35 | 36 | Instead, it will copy all the configuration files and the transitive dependencies (webpack, Babel, ESLint, etc) right into your project so you have full control over them. All of the commands except `eject` will still work, but they will point to the copied scripts so you can tweak them. At this point you’re on your own. 37 | 38 | You don’t have to ever use `eject`. The curated feature set is suitable for small and middle deployments, and you shouldn’t feel obligated to use this feature. However we understand that this tool wouldn’t be useful if you couldn’t customize it when you are ready for it. 39 | 40 | ## Learn More 41 | 42 | You can learn more in the [Create React App documentation](https://facebook.github.io/create-react-app/docs/getting-started). 43 | 44 | To learn React, check out the [React documentation](https://reactjs.org/). 45 | 46 | ### Code Splitting 47 | 48 | This section has moved here: https://facebook.github.io/create-react-app/docs/code-splitting 49 | 50 | ### Analyzing the Bundle Size 51 | 52 | This section has moved here: https://facebook.github.io/create-react-app/docs/analyzing-the-bundle-size 53 | 54 | ### Making a Progressive Web App 55 | 56 | This section has moved here: https://facebook.github.io/create-react-app/docs/making-a-progressive-web-app 57 | 58 | ### Advanced Configuration 59 | 60 | This section has moved here: https://facebook.github.io/create-react-app/docs/advanced-configuration 61 | 62 | ### Deployment 63 | 64 | This section has moved here: https://facebook.github.io/create-react-app/docs/deployment 65 | 66 | ### `npm run build` fails to minify 67 | 68 | This section has moved here: https://facebook.github.io/create-react-app/docs/troubleshooting#npm-run-build-fails-to-minify 69 | -------------------------------------------------------------------------------- /client/build/asset-manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "files": { 3 | "main.css": "/static/css/main.523f09c5.chunk.css", 4 | "main.js": "/static/js/main.5aff7432.chunk.js", 5 | "main.js.map": "/static/js/main.5aff7432.chunk.js.map", 6 | "runtime-main.js": "/static/js/runtime-main.ef76e641.js", 7 | "runtime-main.js.map": "/static/js/runtime-main.ef76e641.js.map", 8 | "static/js/2.802a2f8d.chunk.js": "/static/js/2.802a2f8d.chunk.js", 9 | "static/js/2.802a2f8d.chunk.js.map": "/static/js/2.802a2f8d.chunk.js.map", 10 | "index.html": "/index.html", 11 | "precache-manifest.61ddf4873fc6db8dfc079ac68782190f.js": "/precache-manifest.61ddf4873fc6db8dfc079ac68782190f.js", 12 | "service-worker.js": "/service-worker.js", 13 | "static/css/main.523f09c5.chunk.css.map": "/static/css/main.523f09c5.chunk.css.map", 14 | "static/js/2.802a2f8d.chunk.js.LICENSE.txt": "/static/js/2.802a2f8d.chunk.js.LICENSE.txt" 15 | }, 16 | "entrypoints": [ 17 | "static/js/runtime-main.ef76e641.js", 18 | "static/js/2.802a2f8d.chunk.js", 19 | "static/css/main.523f09c5.chunk.css", 20 | "static/js/main.5aff7432.chunk.js" 21 | ] 22 | } -------------------------------------------------------------------------------- /client/build/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vignaesh01/sfdx-package-generator/4c5e260ddf70ff9f6e2bdb417677fc1a95ea8961/client/build/favicon.ico -------------------------------------------------------------------------------- /client/build/index.html: -------------------------------------------------------------------------------- 1 | React App
-------------------------------------------------------------------------------- /client/build/logo192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vignaesh01/sfdx-package-generator/4c5e260ddf70ff9f6e2bdb417677fc1a95ea8961/client/build/logo192.png -------------------------------------------------------------------------------- /client/build/logo512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vignaesh01/sfdx-package-generator/4c5e260ddf70ff9f6e2bdb417677fc1a95ea8961/client/build/logo512.png -------------------------------------------------------------------------------- /client/build/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "short_name": "React App", 3 | "name": "Create React App Sample", 4 | "icons": [ 5 | { 6 | "src": "favicon.ico", 7 | "sizes": "64x64 32x32 24x24 16x16", 8 | "type": "image/x-icon" 9 | }, 10 | { 11 | "src": "logo192.png", 12 | "type": "image/png", 13 | "sizes": "192x192" 14 | }, 15 | { 16 | "src": "logo512.png", 17 | "type": "image/png", 18 | "sizes": "512x512" 19 | } 20 | ], 21 | "start_url": ".", 22 | "display": "standalone", 23 | "theme_color": "#000000", 24 | "background_color": "#ffffff" 25 | } 26 | -------------------------------------------------------------------------------- /client/build/precache-manifest.61ddf4873fc6db8dfc079ac68782190f.js: -------------------------------------------------------------------------------- 1 | self.__precacheManifest = (self.__precacheManifest || []).concat([ 2 | { 3 | "revision": "624b0d4ef70d2a2cce0873f3e41035fe", 4 | "url": "/index.html" 5 | }, 6 | { 7 | "revision": "e7dbe8bd5669423c718f", 8 | "url": "/static/css/main.523f09c5.chunk.css" 9 | }, 10 | { 11 | "revision": "b072910a29306b4bb2b8", 12 | "url": "/static/js/2.802a2f8d.chunk.js" 13 | }, 14 | { 15 | "revision": "ac9fac6c8e755a8efecd01981adb88e6", 16 | "url": "/static/js/2.802a2f8d.chunk.js.LICENSE.txt" 17 | }, 18 | { 19 | "revision": "e7dbe8bd5669423c718f", 20 | "url": "/static/js/main.5aff7432.chunk.js" 21 | }, 22 | { 23 | "revision": "08a01cac7a9424eef63f", 24 | "url": "/static/js/runtime-main.ef76e641.js" 25 | } 26 | ]); -------------------------------------------------------------------------------- /client/build/robots.txt: -------------------------------------------------------------------------------- 1 | # https://www.robotstxt.org/robotstxt.html 2 | User-agent: * 3 | Disallow: 4 | -------------------------------------------------------------------------------- /client/build/service-worker.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Welcome to your Workbox-powered service worker! 3 | * 4 | * You'll need to register this file in your web app and you should 5 | * disable HTTP caching for this file too. 6 | * See https://goo.gl/nhQhGp 7 | * 8 | * The rest of the code is auto-generated. Please don't update this file 9 | * directly; instead, make changes to your Workbox build configuration 10 | * and re-run your build process. 11 | * See https://goo.gl/2aRDsh 12 | */ 13 | 14 | importScripts("https://storage.googleapis.com/workbox-cdn/releases/4.3.1/workbox-sw.js"); 15 | 16 | importScripts( 17 | "/precache-manifest.61ddf4873fc6db8dfc079ac68782190f.js" 18 | ); 19 | 20 | self.addEventListener('message', (event) => { 21 | if (event.data && event.data.type === 'SKIP_WAITING') { 22 | self.skipWaiting(); 23 | } 24 | }); 25 | 26 | workbox.core.clientsClaim(); 27 | 28 | /** 29 | * The workboxSW.precacheAndRoute() method efficiently caches and responds to 30 | * requests for URLs in the manifest. 31 | * See https://goo.gl/S9QRab 32 | */ 33 | self.__precacheManifest = [].concat(self.__precacheManifest || []); 34 | workbox.precaching.precacheAndRoute(self.__precacheManifest, {}); 35 | 36 | workbox.routing.registerNavigationRoute(workbox.precaching.getCacheKeyForURL("/index.html"), { 37 | 38 | blacklist: [/^\/_/,/\/[^\/?]+\.[^\/]+$/], 39 | }); 40 | -------------------------------------------------------------------------------- /client/build/static/css/main.523f09c5.chunk.css: -------------------------------------------------------------------------------- 1 | body{margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI","Roboto","Oxygen","Ubuntu","Cantarell","Fira Sans","Droid Sans","Helvetica Neue",sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}code{font-family:source-code-pro,Menlo,Monaco,Consolas,"Courier New",monospace}.App{text-align:center}.App-logo{height:40vmin;pointer-events:none}@media (prefers-reduced-motion:no-preference){.App-logo{-webkit-animation:App-logo-spin 20s linear infinite;animation:App-logo-spin 20s linear infinite}}.App-header{background-color:#282c34;min-height:100vh;display:flex;flex-direction:column;align-items:center;justify-content:center;font-size:calc(10px + 2vmin);color:#fff}.App-link{color:#61dafb}@-webkit-keyframes App-logo-spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}@keyframes App-logo-spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}} 2 | /*# sourceMappingURL=main.523f09c5.chunk.css.map */ -------------------------------------------------------------------------------- /client/build/static/css/main.523f09c5.chunk.css.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["index.css","App.css"],"names":[],"mappings":"AAAA,KACE,QAAS,CACT,mJAEY,CACZ,kCAAmC,CACnC,iCACF,CAEA,KACE,yEAEF,CCZA,KACE,iBACF,CAEA,UACE,aAAc,CACd,mBACF,CAEA,8CACE,UACE,mDAA4C,CAA5C,2CACF,CACF,CAEA,YACE,wBAAyB,CACzB,gBAAiB,CACjB,YAAa,CACb,qBAAsB,CACtB,kBAAmB,CACnB,sBAAuB,CACvB,4BAA6B,CAC7B,UACF,CAEA,UACE,aACF,CAEA,iCACE,GACE,sBACF,CACA,GACE,uBACF,CACF,CAPA,yBACE,GACE,sBACF,CACA,GACE,uBACF,CACF","file":"main.523f09c5.chunk.css","sourcesContent":["body {\r\n margin: 0;\r\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen',\r\n 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue',\r\n sans-serif;\r\n -webkit-font-smoothing: antialiased;\r\n -moz-osx-font-smoothing: grayscale;\r\n}\r\n\r\ncode {\r\n font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New',\r\n monospace;\r\n}\r\n",".App {\r\n text-align: center;\r\n}\r\n\r\n.App-logo {\r\n height: 40vmin;\r\n pointer-events: none;\r\n}\r\n\r\n@media (prefers-reduced-motion: no-preference) {\r\n .App-logo {\r\n animation: App-logo-spin infinite 20s linear;\r\n }\r\n}\r\n\r\n.App-header {\r\n background-color: #282c34;\r\n min-height: 100vh;\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n justify-content: center;\r\n font-size: calc(10px + 2vmin);\r\n color: white;\r\n}\r\n\r\n.App-link {\r\n color: #61dafb;\r\n}\r\n\r\n@keyframes App-logo-spin {\r\n from {\r\n transform: rotate(0deg);\r\n }\r\n to {\r\n transform: rotate(360deg);\r\n }\r\n}\r\n"]} -------------------------------------------------------------------------------- /client/build/static/js/2.802a2f8d.chunk.js.LICENSE.txt: -------------------------------------------------------------------------------- 1 | /* 2 | object-assign 3 | (c) Sindre Sorhus 4 | @license MIT 5 | */ 6 | 7 | /** 8 | * A better abstraction over CSS. 9 | * 10 | * @copyright Oleg Isonen (Slobodskoi) / Isonen 2014-present 11 | * @website https://github.com/cssinjs/jss 12 | * @license MIT 13 | */ 14 | 15 | /** @license React v0.19.0 16 | * scheduler.production.min.js 17 | * 18 | * Copyright (c) Facebook, Inc. and its affiliates. 19 | * 20 | * This source code is licensed under the MIT license found in the 21 | * LICENSE file in the root directory of this source tree. 22 | */ 23 | 24 | /** @license React v16.13.0 25 | * react-dom.production.min.js 26 | * 27 | * Copyright (c) Facebook, Inc. and its affiliates. 28 | * 29 | * This source code is licensed under the MIT license found in the 30 | * LICENSE file in the root directory of this source tree. 31 | */ 32 | 33 | /** @license React v16.13.0 34 | * react-is.production.min.js 35 | * 36 | * Copyright (c) Facebook, Inc. and its affiliates. 37 | * 38 | * This source code is licensed under the MIT license found in the 39 | * LICENSE file in the root directory of this source tree. 40 | */ 41 | 42 | /** @license React v16.13.0 43 | * react.production.min.js 44 | * 45 | * Copyright (c) Facebook, Inc. and its affiliates. 46 | * 47 | * This source code is licensed under the MIT license found in the 48 | * LICENSE file in the root directory of this source tree. 49 | */ 50 | -------------------------------------------------------------------------------- /client/build/static/js/main.5aff7432.chunk.js: -------------------------------------------------------------------------------- 1 | (this.webpackJsonpclient=this.webpackJsonpclient||[]).push([[0],{71:function(e,t,a){e.exports=a(82)},76:function(e,t,a){},77:function(e,t,a){},82:function(e,t,a){"use strict";a.r(t);var n=a(0),l=a.n(n),o=a(9),r=a.n(o),c=(a(76),a(26)),i=(a(77),a(114)),s=a(117),d=a(119),m=a(15),u=a(120),p=a(53),E=a.n(p),h=a(54),f=a.n(h),v=a(55),T=a.n(v),C=Object(i.a)((function(e){return{root:{flexGrow:1},menuButton:{marginRight:e.spacing(2)},button:{marginRight:e.spacing(1)},title:{flexGrow:1}}}));function g(){var e=C(),t=Object(n.useContext)(se).dispatch;return l.a.createElement("div",{className:e.root},l.a.createElement(s.a,{position:"static"},l.a.createElement(d.a,null,l.a.createElement(m.a,{variant:"h6",className:e.title},"Salesforce Package.xml Generator"),l.a.createElement(u.a,{color:"inherit",onClick:function(){t({type:"UPDATE_PACKAGE_XML"})},variant:"outlined",className:e.button,startIcon:l.a.createElement(E.a,null)},"Update Package.xml"),l.a.createElement(u.a,{color:"inherit",onClick:function(){t({type:"COPY_TO_CLIPBOARD"})},variant:"outlined",className:e.button,startIcon:l.a.createElement(f.a,null)},"Copy To Clipboard"),l.a.createElement(u.a,{color:"inherit",onClick:function(){console.log("handleHowTo invoked"),t({type:"HOW_TO"})},variant:"outlined",className:e.button,startIcon:l.a.createElement(T.a,null)},"How To"))))}var y=a(121),A=a(122),_=a(123),S=a(135),O=a(125),N=a(41),M=a.n(N),b=a(124),k=a(126),x=a(127),I=a(129),L=a(130),P=a(136),j=a(128),R=a(56),w=a.n(R),H=a(58),D=Object(i.a)({root:{minWidth:275},title:{fontSize:10},pos:{marginBottom:12}});function F(){var e=D(),t=Object(n.useContext)(se),a=t.globalState,o=t.dispatch,r=Object(n.useState)(""),i=Object(c.a)(r,2),s=i[0],d=i[1],m=function(e,t){e.stopPropagation(),console.log("handleMetadataClick invoked MetadataType.js"),console.log(t),o({type:"MDATA_TYPE_CLICK",payload:t})};return l.a.createElement(y.a,{className:e.root,variant:"outlined"},l.a.createElement(A.a,{titleTypographyProps:{variant:"h6"},title:"Metadata Types",action:l.a.createElement(l.a.Fragment,null,l.a.createElement(u.a,{color:"secondary",onClick:function(){console.log("handleSelectAll MetadataType.js");var e=[],t=[],n=a.metadataTypes.map((function(a){return a.inFolder||a.isChildXMLName?t.push(a.id):(e.push(a.id),a.isSelected=!0,a.isIndeterminate=!1),a}));t&&t.length>0&&(console.log("skippedMetadataTypes"),console.log(t),t.sort()),e.sort(),o({type:"MDATA_TYPE_SELECT_ALL",payload:{metadataTypes:n,parNodeArr:e,skippedMetadataTypes:t}})}},l.a.createElement("strong",null,"Select All")),l.a.createElement(u.a,{onClick:function(){console.log("handleClearAll MetadataType.js"),o({type:"MDATA_TYPE_CLEAR_ALL"})}},"Clear All"))}),l.a.createElement(_.a,null,l.a.createElement(S.a,{id:"input-with-icon-textfield",variant:"outlined",placeholder:"Filter Metadata Types..",value:s,onChange:function(e){var t=e.target.value;d(t=t||"")},size:"small",InputProps:{startAdornment:l.a.createElement(O.a,{position:"start"},l.a.createElement(M.a,null))},fullWidth:!0}),l.a.createElement(H.a,{style:{maxHeight:500,overflow:"auto"}},l.a.createElement(b.a,{dense:!0,component:"nav","aria-label":"Metadata Types"},a.metadataTypes.map((function(e){return e.id.toUpperCase().includes(s.toUpperCase())?l.a.createElement(k.a,{button:!0,key:e.id,onClick:function(t){return m(t,e)},selected:e.id===a.selectedMetadataType.id,title:"Click to view available Metadata Components"},l.a.createElement(x.a,null,l.a.createElement(P.a,{edge:"start",tabIndex:-1,disableRipple:!0,inputProps:{"aria-labelledby":"labelId"},checked:e.isSelected,indeterminate:e.isIndeterminate,onClick:function(t){return function(e,t){e.stopPropagation(),console.log("handleCheckboxChange invoked MetadataType.js");var a=e.target.checked;t.isSelected=a,t.isIndeterminate=!1,console.log(t),o({type:"MDATA_TYPE_CHECKBOX_STATE_CHANGE",payload:t})}(t,e)}})),l.a.createElement(I.a,{primary:e.id}),l.a.createElement(L.a,null,l.a.createElement(j.a,{edge:"end","aria-label":"comments",onClick:function(t){return m(t,e)}},l.a.createElement(w.a,null)))):l.a.createElement(l.a.Fragment,null)}))))))}var X=a(131),B=a(132),U=Object(i.a)({root:{minWidth:275},title:{fontSize:10},pos:{marginBottom:12}});function G(e){var t=e.selectedMetadataType,a=(e.isShowChildren,U()),o=Object(n.useContext)(se).dispatch,r=Object(n.useState)(""),i=Object(c.a)(r,2),s=i[0],d=i[1],m=function(e){console.log("updateMetadataType invoked ComponentList.js");var t=e.children.filter((function(e){return e.isSelected}));return 0===t.length?(e.isSelected=!1,e.isIndeterminate=!1):t.length===e.children.length?(e.isSelected=!0,e.isIndeterminate=!1):(e.isSelected=!1,e.isIndeterminate=!0),e};return l.a.createElement(y.a,{className:a.root,variant:"outlined"},l.a.createElement(A.a,{titleTypographyProps:{variant:"h6"},title:""!==t.text?t.text:"Available Components",action:l.a.createElement(l.a.Fragment,null,l.a.createElement(u.a,{onClick:function(){t.children=t.children.map((function(e){return e.isSelected=!0,e})),t.isSelected=!0,t.isIndeterminate=!1,o({type:"COMPONENT_CHECKBOX_STATE_CHANGE",payload:t})}},"Select All"),l.a.createElement(u.a,{onClick:function(){t.children=t.children.map((function(e){return e.isSelected=!1,e})),t.isSelected=!1,t.isIndeterminate=!1,o({type:"COMPONENT_CHECKBOX_STATE_CHANGE",payload:t})}},"Clear All"))}),l.a.createElement(_.a,null,l.a.createElement(S.a,{id:"input-with-icon-textfield",variant:"outlined",placeholder:""!==t.text?"Filter "+t.text+"..":"Filter Components..",value:s,onChange:function(e){var t=e.target.value;d(t=t||"")},size:"small",InputProps:{startAdornment:l.a.createElement(O.a,{position:"start"},l.a.createElement(M.a,null))},fullWidth:!0}),l.a.createElement(H.a,{style:{maxHeight:500,overflow:"auto"}},l.a.createElement(X.a,null,t.children.map((function(e){return e.text.toUpperCase().includes(s.toUpperCase())?l.a.createElement(B.a,{control:l.a.createElement(P.a,{value:e.id,checked:e.isSelected,onClick:function(a){return function(e,a){console.log("handleComponentClick invoked ComponentList.js");var n=a.target.checked,l=e.id;t.children=t.children.map((function(e){return l===e.id&&(e.isSelected=n),e})),t=m(t),o({type:"COMPONENT_CHECKBOX_STATE_CHANGE",payload:t})}(e,a)}}),label:e.text}):l.a.createElement(l.a.Fragment,null)}))))))}var K=a(57),Y=a(133),W=a(134),Q=a(21),z=function(e,t){switch(t.type){case"INIT_LOAD_REQUEST":return q(e);case"INIT_LOAD_RESPONSE":return J(e,t);case"MDATA_TYPE_CHECKBOX_STATE_CHANGE":return $(e,t);case"MDATA_TYPE_CLICK":return Z(e,t);case"FETCH_CHILDREN_RESPONSE":return te(e,t);case"COMPONENT_CHECKBOX_STATE_CHANGE":return ae(e,t);case"MDATA_TYPE_SELECT_ALL":return ne(e,t);case"MDATA_TYPE_CLEAR_ALL":return le(e,t);case"UPDATE_PACKAGE_XML":return oe(e,t);case"COPY_TO_CLIPBOARD":return re(e,t);case"HOW_TO":return ce(e,t);default:return e}},q=function(e){return e.vscode.postMessage({command:"INIT_LOAD_REQUEST"}),e},J=function(e,t){console.log("processInitialResponse invoked");var a=[],n=t.payload,l=n.metadataObjects,o=n.mpExistingPackageXML;return(l=V(l)).sort((function(e,t){return e.xmlName>t.xmlName?1:e.xmlName===t.xmlName?0:e.xmlNamet.text?1:e.text===t.text?0:e.text0.2%", 27 | "not dead", 28 | "not op_mini all" 29 | ], 30 | "development": [ 31 | "last 1 chrome version", 32 | "last 1 firefox version", 33 | "last 1 safari version" 34 | ] 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /client/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vignaesh01/sfdx-package-generator/4c5e260ddf70ff9f6e2bdb417677fc1a95ea8961/client/public/favicon.ico -------------------------------------------------------------------------------- /client/public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 12 | 13 | 17 | 18 | 27 | 28 | 29 | React App 30 | 31 | 32 | 33 |
34 | 44 | 45 | 46 | -------------------------------------------------------------------------------- /client/public/logo192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vignaesh01/sfdx-package-generator/4c5e260ddf70ff9f6e2bdb417677fc1a95ea8961/client/public/logo192.png -------------------------------------------------------------------------------- /client/public/logo512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vignaesh01/sfdx-package-generator/4c5e260ddf70ff9f6e2bdb417677fc1a95ea8961/client/public/logo512.png -------------------------------------------------------------------------------- /client/public/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "short_name": "React App", 3 | "name": "Create React App Sample", 4 | "icons": [ 5 | { 6 | "src": "favicon.ico", 7 | "sizes": "64x64 32x32 24x24 16x16", 8 | "type": "image/x-icon" 9 | }, 10 | { 11 | "src": "logo192.png", 12 | "type": "image/png", 13 | "sizes": "192x192" 14 | }, 15 | { 16 | "src": "logo512.png", 17 | "type": "image/png", 18 | "sizes": "512x512" 19 | } 20 | ], 21 | "start_url": ".", 22 | "display": "standalone", 23 | "theme_color": "#000000", 24 | "background_color": "#ffffff" 25 | } 26 | -------------------------------------------------------------------------------- /client/public/robots.txt: -------------------------------------------------------------------------------- 1 | # https://www.robotstxt.org/robotstxt.html 2 | User-agent: * 3 | Disallow: 4 | -------------------------------------------------------------------------------- /client/src/App.css: -------------------------------------------------------------------------------- 1 | .App { 2 | text-align: center; 3 | } 4 | 5 | .App-logo { 6 | height: 40vmin; 7 | pointer-events: none; 8 | } 9 | 10 | @media (prefers-reduced-motion: no-preference) { 11 | .App-logo { 12 | animation: App-logo-spin infinite 20s linear; 13 | } 14 | } 15 | 16 | .App-header { 17 | background-color: #282c34; 18 | min-height: 100vh; 19 | display: flex; 20 | flex-direction: column; 21 | align-items: center; 22 | justify-content: center; 23 | font-size: calc(10px + 2vmin); 24 | color: white; 25 | } 26 | 27 | .App-link { 28 | color: #61dafb; 29 | } 30 | 31 | @keyframes App-logo-spin { 32 | from { 33 | transform: rotate(0deg); 34 | } 35 | to { 36 | transform: rotate(360deg); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /client/src/App.js: -------------------------------------------------------------------------------- 1 | import React, { createContext, useReducer, useEffect } from 'react'; 2 | import { vscode } from "./index"; 3 | import './App.css'; 4 | import AppHeader from "./components/AppHeader"; 5 | import MetadataType from "./components/MetadataType"; 6 | import ComponentList from "./components/ComponentList"; 7 | import { createMuiTheme, makeStyles, ThemeProvider } from '@material-ui/core/styles'; 8 | import Paper from '@material-ui/core/Paper'; 9 | import Grid from '@material-ui/core/Grid'; 10 | import {reducer} from "./context/reducer"; 11 | 12 | 13 | const useStyles = makeStyles(theme => ({ 14 | root: { 15 | flexGrow: 1, 16 | } 17 | })); 18 | 19 | export const GlobalContext = createContext(); 20 | 21 | 22 | function App() { 23 | const classes = useStyles(); 24 | const [globalState, dispatch] = useReducer(reducer, {'vscode' : vscode, metadataTypes : [], selectedMetadataType : {id:'',text:'',children:[]}, isShowChildren : false}); 25 | console.log(vscode); 26 | 27 | const element = document.querySelector("body"); 28 | 29 | const prefersDarkMode = element.classList.contains("vscode-dark"); 30 | //const prefersDarkMode = useMediaQuery('(body.vscode-dark)'); 31 | 32 | const preferredTheme = createMuiTheme({ 33 | palette: { 34 | // Switching the dark mode on is a single property value change. 35 | type: prefersDarkMode ? 'dark' : 'light', 36 | }, 37 | }); 38 | 39 | useEffect(()=>{ 40 | console.log('Inside INIT_LOAD_REQUEST useEffect() App.js'); 41 | dispatch({ type: "INIT_LOAD_REQUEST" }); 42 | },[globalState.vscode]); 43 | 44 | 45 | useEffect(()=>{ 46 | console.log('Inside messageEventListener useEffect() App.js'); 47 | const messageEventListener= (event) => { 48 | const message = event.data; // The json data that the extension sent 49 | console.log(event.data); 50 | switch (message.command) { 51 | case 'metadataObjects': 52 | let metadataObjects=message.metadataObjects; 53 | console.log("Inside App.js metadataObjects event listener "+metadataObjects.length); 54 | dispatch({ type: "INIT_LOAD_RESPONSE" , payload : message}); 55 | break; 56 | 57 | case 'listmetadata': 58 | console.log("Inside App.js listmetadata event listener"); 59 | dispatch({ type: "FETCH_CHILDREN_RESPONSE" , payload : message}); 60 | break; 61 | 62 | default: 63 | break; 64 | 65 | } 66 | } 67 | 68 | window.addEventListener('message', messageEventListener); 69 | return ()=>{ 70 | window.removeEventListener('message', messageEventListener); 71 | }; 72 | },[globalState.vscode]); 73 | 74 | return ( 75 | 76 | 77 |
78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | {globalState.selectedMetadataType.id!=='' && 88 | 89 | } 90 | 91 | 92 | 93 |
94 |
95 |
96 | ); 97 | } 98 | 99 | export default App; 100 | -------------------------------------------------------------------------------- /client/src/App.test.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { render } from '@testing-library/react'; 3 | import App from './App'; 4 | 5 | test('renders learn react link', () => { 6 | const { getByText } = render(); 7 | const linkElement = getByText(/learn react/i); 8 | expect(linkElement).toBeInTheDocument(); 9 | }); 10 | -------------------------------------------------------------------------------- /client/src/components/AppHeader.js: -------------------------------------------------------------------------------- 1 | import React,{useContext} from 'react'; 2 | import { makeStyles } from '@material-ui/core/styles'; 3 | import { GlobalContext } from "../App"; 4 | import AppBar from '@material-ui/core/AppBar'; 5 | import Toolbar from '@material-ui/core/Toolbar'; 6 | import Typography from '@material-ui/core/Typography'; 7 | import Button from '@material-ui/core/Button'; 8 | import DescriptionIcon from '@material-ui/icons/Description'; 9 | import FileCopyIcon from '@material-ui/icons/FileCopy'; 10 | import HelpOutlineIcon from '@material-ui/icons/HelpOutline'; 11 | 12 | const useStyles = makeStyles(theme => ({ 13 | root: { 14 | flexGrow: 1, 15 | }, 16 | menuButton: { 17 | marginRight: theme.spacing(2), 18 | }, 19 | button: { 20 | marginRight: theme.spacing(1), 21 | }, 22 | title: { 23 | flexGrow: 1, 24 | }, 25 | })); 26 | 27 | export default function AppHeader() { 28 | const classes = useStyles(); 29 | const { dispatch }= useContext(GlobalContext); 30 | 31 | const updatePackageXML=()=>{ 32 | dispatch({type: "UPDATE_PACKAGE_XML"}); 33 | }; 34 | 35 | const copyToClipboard=()=>{ 36 | dispatch({type: "COPY_TO_CLIPBOARD"}); 37 | }; 38 | 39 | const handleHowTo = ()=>{ 40 | console.log('handleHowTo invoked'); 41 | dispatch({type: "HOW_TO"}); 42 | }; 43 | 44 | return ( 45 |
46 | 47 | 48 | 49 | Salesforce Package.xml Generator 50 | 51 | 58 | 65 | 72 | 73 | 74 |
75 | ); 76 | } 77 | -------------------------------------------------------------------------------- /client/src/components/ComponentList.js: -------------------------------------------------------------------------------- 1 | import React,{useState,useContext} from 'react'; 2 | import { GlobalContext } from "../App"; 3 | import { makeStyles } from '@material-ui/core/styles'; 4 | import Card from '@material-ui/core/Card'; 5 | import CardHeader from '@material-ui/core/CardHeader'; 6 | import CardContent from '@material-ui/core/CardContent'; 7 | import Button from '@material-ui/core/Button'; 8 | import TextField from '@material-ui/core/TextField'; 9 | import InputAdornment from '@material-ui/core/InputAdornment'; 10 | import SearchIcon from '@material-ui/icons/Search'; 11 | import Checkbox from '@material-ui/core/Checkbox'; 12 | import FormGroup from '@material-ui/core/FormGroup'; 13 | import FormControlLabel from '@material-ui/core/FormControlLabel'; 14 | import Paper from '@material-ui/core/Paper';//Added for #35 15 | 16 | const useStyles = makeStyles({ 17 | root: { 18 | minWidth: 275, 19 | }, 20 | title: { 21 | fontSize: 10, 22 | }, 23 | pos: { 24 | marginBottom: 12, 25 | } 26 | }); 27 | 28 | export default function ComponentList({selectedMetadataType,isShowChildren}) { 29 | const classes = useStyles(); 30 | const { dispatch }= useContext(GlobalContext); 31 | const [filterKey,setFilterKey] = useState(""); 32 | 33 | const handleComponentClick = (component,evt)=>{ 34 | console.log("handleComponentClick invoked ComponentList.js"); 35 | const isChecked=evt.target.checked; 36 | const compId=component.id; 37 | selectedMetadataType.children=selectedMetadataType.children.map(child=>{ 38 | if(compId===child.id){ 39 | child.isSelected=isChecked;//update the child state 40 | } 41 | return child; 42 | }); 43 | 44 | selectedMetadataType=updateMetadataType(selectedMetadataType); 45 | dispatch({type: "COMPONENT_CHECKBOX_STATE_CHANGE" , payload : selectedMetadataType}); 46 | 47 | }; 48 | 49 | const updateMetadataType = (selectedMetadataType)=>{ 50 | console.log("updateMetadataType invoked ComponentList.js"); 51 | 52 | const selectedChildrenArr=selectedMetadataType.children.filter(child=>child.isSelected); 53 | if(selectedChildrenArr.length===0){ 54 | //None of the children is selected 55 | selectedMetadataType.isSelected=false; 56 | selectedMetadataType.isIndeterminate=false; 57 | }else if(selectedChildrenArr.length===selectedMetadataType.children.length){ 58 | //ALl the children are selected 59 | selectedMetadataType.isSelected=true; 60 | selectedMetadataType.isIndeterminate=false; 61 | }else{ 62 | //Some the children are selected 63 | selectedMetadataType.isSelected=false; 64 | selectedMetadataType.isIndeterminate=true; 65 | } 66 | 67 | return selectedMetadataType; 68 | 69 | }; 70 | 71 | const handleSelectAll = ()=>{ 72 | selectedMetadataType.children=selectedMetadataType.children.map(child=>{ 73 | child.isSelected=true;//update the child state 74 | return child; 75 | }); 76 | 77 | //ALl the children are selected 78 | selectedMetadataType.isSelected=true; 79 | selectedMetadataType.isIndeterminate=false; 80 | dispatch({type: "COMPONENT_CHECKBOX_STATE_CHANGE" , payload : selectedMetadataType}); 81 | }; 82 | 83 | const handleClearAll = ()=>{ 84 | selectedMetadataType.children=selectedMetadataType.children.map(child=>{ 85 | child.isSelected=false;//update the child state 86 | return child; 87 | }); 88 | 89 | //None of the children are selected 90 | selectedMetadataType.isSelected=false; 91 | selectedMetadataType.isIndeterminate=false; 92 | dispatch({type: "COMPONENT_CHECKBOX_STATE_CHANGE" , payload : selectedMetadataType}); 93 | }; 94 | 95 | const handleFilterKeyChange=(event)=>{ 96 | let fKey=event.target.value; 97 | fKey=fKey?fKey:''; 98 | setFilterKey(fKey); 99 | } 100 | 101 | return ( 102 | 103 | 108 | 109 | 110 | 111 | } 112 | 113 | /> 114 | 115 | 125 | 126 | 127 | ), 128 | }} 129 | fullWidth 130 | /> 131 | {/*Added for #35*/} 132 | 133 | 134 | { 135 | selectedMetadataType.children.map(child=>{ 136 | 137 | if(child.text.toUpperCase().includes(filterKey.toUpperCase())){ 138 | 139 | return ( 140 | handleComponentClick(child,evt)}/>} 143 | label={child.text}/> 144 | ) 145 | 146 | }else{ 147 | return <>; 148 | } 149 | 150 | }) 151 | 152 | } 153 | 154 | 155 | 156 | {/*Added for #35*/} 157 | 158 | 159 | ); 160 | } 161 | 162 | -------------------------------------------------------------------------------- /client/src/components/MetadataType.js: -------------------------------------------------------------------------------- 1 | import React,{useState,useContext} from 'react'; 2 | import { GlobalContext } from "../App"; 3 | import { makeStyles } from '@material-ui/core/styles'; 4 | import Card from '@material-ui/core/Card'; 5 | import CardHeader from '@material-ui/core/CardHeader'; 6 | import CardContent from '@material-ui/core/CardContent'; 7 | import Button from '@material-ui/core/Button'; 8 | import TextField from '@material-ui/core/TextField'; 9 | import InputAdornment from '@material-ui/core/InputAdornment'; 10 | import SearchIcon from '@material-ui/icons/Search'; 11 | import List from '@material-ui/core/List'; 12 | import ListItem from '@material-ui/core/ListItem'; 13 | import ListItemIcon from '@material-ui/core/ListItemIcon'; 14 | import ListItemText from '@material-ui/core/ListItemText'; 15 | import ListItemSecondaryAction from '@material-ui/core/ListItemSecondaryAction'; 16 | import Checkbox from '@material-ui/core/Checkbox'; 17 | import IconButton from '@material-ui/core/IconButton'; 18 | import NavigateNextIcon from '@material-ui/icons/NavigateNext'; 19 | import Paper from '@material-ui/core/Paper';//Added for #35 20 | 21 | const useStyles = makeStyles({ 22 | root: { 23 | minWidth: 275, 24 | }, 25 | title: { 26 | fontSize: 10, 27 | }, 28 | pos: { 29 | marginBottom: 12, 30 | } 31 | }); 32 | 33 | export default function MetadataType() { 34 | const classes = useStyles(); 35 | const { globalState, dispatch }= useContext(GlobalContext); 36 | const [filterKey,setFilterKey] = useState(""); 37 | 38 | const handleCheckboxChange = (evt,metadataType)=>{ 39 | evt.stopPropagation(); 40 | console.log('handleCheckboxChange invoked MetadataType.js'); 41 | const isChecked=evt.target.checked; 42 | metadataType.isSelected=isChecked; 43 | metadataType.isIndeterminate=false;//reset indeterminate state 44 | console.log(metadataType); 45 | dispatch({type: "MDATA_TYPE_CHECKBOX_STATE_CHANGE" , payload : metadataType}); 46 | //window.scrollTo(0, 0);Commented for #35 47 | 48 | }; 49 | 50 | const handleMetadataClick = (evt,metadataType)=>{ 51 | evt.stopPropagation(); 52 | console.log('handleMetadataClick invoked MetadataType.js'); 53 | console.log(metadataType); 54 | dispatch({type: "MDATA_TYPE_CLICK" , payload : metadataType}); 55 | //window.scrollTo(0, 0);Commented for #35 56 | }; 57 | 58 | const handleSelectAll =()=>{ 59 | console.log("handleSelectAll MetadataType.js"); 60 | let parNodeArr=[]; 61 | let skippedMetadataTypes=[]; 62 | 63 | const metadataTypes=globalState.metadataTypes.map(metadataType => { 64 | 65 | if(!metadataType.inFolder && !metadataType.isChildXMLName){ 66 | parNodeArr.push(metadataType.id); 67 | metadataType.isSelected=true; 68 | metadataType.isIndeterminate=false;//reset indeterminate state 69 | }else{ 70 | skippedMetadataTypes.push(metadataType.id); 71 | } 72 | 73 | return metadataType; 74 | }); 75 | //Added for #18 - starts 76 | if(skippedMetadataTypes && skippedMetadataTypes.length>0){ 77 | console.log("skippedMetadataTypes"); 78 | console.log(skippedMetadataTypes); 79 | skippedMetadataTypes.sort(); 80 | //alert("The following Metadata Types will be skipped "+skippedMetadataTypes.join()); 81 | } 82 | //Added for #18 - ends 83 | parNodeArr.sort(); 84 | 85 | dispatch({type: "MDATA_TYPE_SELECT_ALL" , payload : {metadataTypes,parNodeArr,skippedMetadataTypes}}); 86 | }; 87 | 88 | const handleClearAll=()=>{ 89 | console.log("handleClearAll MetadataType.js"); 90 | dispatch({type: "MDATA_TYPE_CLEAR_ALL" }); 91 | }; 92 | 93 | const handleFilterKeyChange=(event)=>{ 94 | let fKey=event.target.value; 95 | fKey=fKey?fKey:''; 96 | setFilterKey(fKey); 97 | } 98 | 99 | return ( 100 | 101 | 106 | 107 | 108 | 109 | } 110 | 111 | /> 112 | 113 | 123 | 124 | 125 | ), 126 | }} 127 | fullWidth 128 | /> 129 | {/*Added for #35*/} 130 | 131 | 132 | {globalState.metadataTypes.map(metadataType =>{ 133 | 134 | if(metadataType.id.toUpperCase().includes(filterKey.toUpperCase())){ 135 | return( 136 | handleMetadataClick(evt,metadataType)} 137 | selected={metadataType.id===globalState.selectedMetadataType.id} 138 | title='Click to view available Metadata Components'> 139 | 140 | handleCheckboxChange(evt,metadataType)} 148 | 149 | /> 150 | 151 | 152 | 153 | handleMetadataClick(evt,metadataType)}> 155 | 156 | 157 | 158 | 159 | ); 160 | }else{ 161 | return <>; 162 | } 163 | 164 | }) 165 | } 166 | 167 | 168 | 169 | {/*Added for #35*/} 170 | 171 | 172 | ); 173 | } 174 | -------------------------------------------------------------------------------- /client/src/context/reducer.js: -------------------------------------------------------------------------------- 1 | export const reducer = (state, action) => { 2 | switch (action.type) { 3 | case "INIT_LOAD_REQUEST": 4 | return processInitialRequest(state); 5 | 6 | case "INIT_LOAD_RESPONSE": 7 | return processInitialResponse(state, action); 8 | 9 | case "MDATA_TYPE_CHECKBOX_STATE_CHANGE": 10 | return processMetadataTypeCheckBox(state,action); 11 | 12 | case "MDATA_TYPE_CLICK": 13 | return processMetadataTypeClick(state,action); 14 | 15 | case "FETCH_CHILDREN_RESPONSE": 16 | return processFetchChildrenResponse(state,action); 17 | 18 | case "COMPONENT_CHECKBOX_STATE_CHANGE": 19 | return processComponentCheckBox(state,action); 20 | 21 | case "MDATA_TYPE_SELECT_ALL": 22 | return processMetadataSelectAll(state,action); 23 | 24 | case "MDATA_TYPE_CLEAR_ALL": 25 | return processMetadataClearAll(state,action); 26 | 27 | case "UPDATE_PACKAGE_XML": 28 | return processUpdatePackageXml(state,action); 29 | 30 | case "COPY_TO_CLIPBOARD": 31 | return processCopyToClipboard(state,action); 32 | 33 | case "HOW_TO": 34 | return processHowTo(state,action); 35 | 36 | default: 37 | return state; 38 | } 39 | }; 40 | 41 | const processInitialRequest= (state)=>{ 42 | state.vscode.postMessage({ 43 | command: 'INIT_LOAD_REQUEST' 44 | }); 45 | return state; 46 | }; 47 | 48 | const processInitialResponse = (state, action)=>{ 49 | console.log('processInitialResponse invoked'); 50 | let metadataTypes=[]; 51 | const payload=action.payload; 52 | let metadataObjects=payload.metadataObjects; 53 | const mpExistingPackageXML=payload.mpExistingPackageXML; 54 | metadataObjects=processChildXMLNames(metadataObjects); 55 | 56 | metadataObjects.sort((obj1,obj2)=>{ 57 | if (obj1.xmlName > obj2.xmlName) return 1; // if the first value is greater than the second 58 | if (obj1.xmlName === obj2.xmlName) return 0; // if values are equal 59 | if (obj1.xmlName < obj2.xmlName) return -1; // if the first value is less than the second 60 | 61 | }); 62 | 63 | metadataObjects.forEach(metadataObj =>{ 64 | let xmlName=metadataObj.xmlName; 65 | let isChildXMLName=(metadataObj.isChildXMLName)?metadataObj.isChildXMLName:false;//Added for #18 66 | 67 | if(mpExistingPackageXML[xmlName]){ 68 | //metadata already selected in existing package.xml 69 | let members=mpExistingPackageXML[xmlName]; 70 | let childArr=[]; 71 | let isWildChar=false; 72 | let parNode={}; 73 | for(let c=0;c{ 127 | let combinedArr=[]; 128 | for(let i=0;i { 133 | let childObj={}; 134 | childObj.xmlName=childXmlName; 135 | childObj.inFolder=false; 136 | childObj.isChildXMLName=true; 137 | combinedArr.push(childObj); 138 | }); 139 | 140 | } 141 | } 142 | 143 | return combinedArr; 144 | }; 145 | 146 | const processMetadataTypeCheckBox= (state,action)=>{ 147 | console.log('processMetadataTypeCheckBox invoked'); 148 | const metadataType=action.payload; 149 | console.log(metadataType); 150 | const vscode=state.vscode; 151 | state=updateMetadataType(state,metadataType); 152 | const selectedMetadataType=metadataType; 153 | //update checked state for all its children 154 | let updatedChildren=metadataType.children.map(child=>{ 155 | child.isSelected=metadataType.isSelected; 156 | return child; 157 | }); 158 | metadataType.children=updatedChildren; 159 | 160 | if(!metadataType.isRefreshedFromServer){ 161 | vscode.postMessage({ 162 | command: 'FETCH_CHILDREN_REQUEST', 163 | metadataType : metadataType 164 | }); 165 | } 166 | 167 | state.selectedMetadataType=selectedMetadataType; 168 | 169 | return {...state}; 170 | }; 171 | 172 | const processMetadataTypeClick= (state,action)=>{ 173 | console.log('processMetadataTypeClick invoked'); 174 | const metadataType=action.payload; 175 | console.log(metadataType); 176 | const vscode=state.vscode; 177 | state=updateMetadataType(state,metadataType); 178 | const selectedMetadataType=metadataType; 179 | 180 | if(!metadataType.isRefreshedFromServer){ 181 | vscode.postMessage({ 182 | command: 'FETCH_CHILDREN_REQUEST', 183 | metadataType : metadataType 184 | }); 185 | } 186 | 187 | state.selectedMetadataType=selectedMetadataType; 188 | 189 | return {...state}; 190 | }; 191 | 192 | const updateMetadataType = (state,metadataType)=>{ 193 | const metadataTypes=state.metadataTypes; 194 | const newMetadataTypes=metadataTypes.map(mTypeItr=>{ 195 | if(metadataType.id===mTypeItr.id){ 196 | return metadataType; 197 | } 198 | 199 | return mTypeItr; 200 | }); 201 | state.metadataTypes=newMetadataTypes; 202 | return state; 203 | }; 204 | 205 | const processFetchChildrenResponse=(state,action)=>{ 206 | console.log("processFetchChildrenResponse invoked"); 207 | let message=action.payload; 208 | let results=message.results; 209 | let metadataTypeId=message.metadataType; 210 | 211 | let childrenArr=[]; 212 | //let mpChildren=new Map(); 213 | 214 | if(!results || results.length===0){ 215 | console.log('No children'); 216 | childrenArr=[]; 217 | 218 | }else if( !Array.isArray(results)){ 219 | console.log("listmetadata results.fullName "+results.fullName); 220 | childrenArr.push({ "id" : metadataTypeId+'.'+results.fullName, "text" : results.fullName}) 221 | //mpChildren.set(metadataTypeId+'.'+results.fullName,results.fullName); 222 | }else{ 223 | for(let i=0;i{ 233 | if (obj1.text > obj2.text) return 1; // if the first value is greater than the second 234 | if (obj1.text === obj2.text) return 0; // if values are equal 235 | if (obj1.text < obj2.text) return -1; // if the first value is less than the second 236 | }); 237 | 238 | const newMetadataTypes=state.metadataTypes.map(mTypeItr=>{ 239 | if(metadataTypeId===mTypeItr.id){ 240 | let isParMetadataSelected=mTypeItr.isSelected; 241 | mTypeItr.isRefreshedFromServer=true;//Server fetch done 242 | let oldChildArr = mTypeItr.children;//old children 243 | let selChildCount=0; 244 | mTypeItr.children=childrenArr.map(child=>{ 245 | //update the children 246 | if(isParMetadataSelected){ 247 | //if parent is selected, child is automatically selected 248 | child.isSelected=true; 249 | }else{ 250 | //if old child is selected, new child is also selected 251 | let oldChild = oldChildArr.find(item=>{ 252 | return item.id===child.id; 253 | }); 254 | 255 | if(oldChild){ 256 | //transfer all the existing properties to new child 257 | child.isSelected= oldChild.isSelected; 258 | if(child.isSelected){ 259 | selChildCount++; 260 | } 261 | }else{ 262 | //old child doesnot exist, unselected by default 263 | child.isSelected=false; 264 | } 265 | } 266 | 267 | return child; 268 | 269 | }); 270 | 271 | if(childrenArr.length!==0 && selChildCount===childrenArr.length){ 272 | mTypeItr.isSelected=true; 273 | mTypeItr.isIndeterminate=false; 274 | } 275 | 276 | state.selectedMetadataType=mTypeItr;//update selectedMetadataType 277 | } 278 | 279 | return mTypeItr; 280 | }); 281 | 282 | state.metadataTypes=newMetadataTypes; 283 | console.log(newMetadataTypes); 284 | return {...state}; 285 | 286 | }; 287 | 288 | const processComponentCheckBox=(state,action)=>{ 289 | console.log("processComponentCheckBox invoked"); 290 | const selectedMetadataType=action.payload; 291 | console.log(selectedMetadataType); 292 | state.selectedMetadataType=selectedMetadataType; 293 | return {...state}; 294 | }; 295 | 296 | const processMetadataSelectAll=(state,action)=>{ 297 | console.log('processMetadataSelectAll invoked'); 298 | const payload=action.payload; 299 | const vscode=state.vscode; 300 | state.metadataTypes=payload.metadataTypes; 301 | vscode.postMessage({ 302 | command: 'selectAll', 303 | selectedMetadata : payload.parNodeArr, 304 | skippedMetadataTypes : payload.skippedMetadataTypes//Added for #18 305 | }); 306 | console.log(state.metadataTypes); 307 | return {...state}; 308 | 309 | }; 310 | 311 | const processMetadataClearAll=(state,action)=>{ 312 | console.log('processMetadataClearAll invoked'); 313 | //reset selectedMetadataType 314 | state.selectedMetadataType={id:'',children:[]}; 315 | 316 | //reset metadataTypes & its children 317 | state.metadataTypes=state.metadataTypes.map(metadataType=>{ 318 | metadataType.isRefreshedFromServer= false; 319 | metadataType.children = []; 320 | metadataType.isSelected = false; 321 | metadataType.isIndeterminate=false; 322 | return metadataType; 323 | }); 324 | 325 | console.log(state.metadataTypes); 326 | return {...state}; 327 | }; 328 | 329 | const processUpdatePackageXml=(state,action)=>{ 330 | const vscode=state.vscode; 331 | vscode.postMessage({ 332 | command: 'UPDATE_PACKAGE_XML', 333 | metadataTypes : state.metadataTypes 334 | }); 335 | 336 | return state; 337 | }; 338 | 339 | const processCopyToClipboard=(state,action)=>{ 340 | const vscode=state.vscode; 341 | vscode.postMessage({ 342 | command: 'COPY_TO_CLIPBOARD', 343 | metadataTypes : state.metadataTypes 344 | }); 345 | 346 | return state; 347 | }; 348 | 349 | const processHowTo=(state,action)=>{ 350 | const vscode=state.vscode; 351 | vscode.postMessage({ 352 | command: 'OPEN_URL', 353 | url : 'https://youtu.be/uXwIMh8bK0A' 354 | }); 355 | 356 | return state; 357 | }; -------------------------------------------------------------------------------- /client/src/index.css: -------------------------------------------------------------------------------- 1 | body { 2 | margin: 0; 3 | font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 4 | 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', 5 | sans-serif; 6 | -webkit-font-smoothing: antialiased; 7 | -moz-osx-font-smoothing: grayscale; 8 | } 9 | 10 | code { 11 | font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New', 12 | monospace; 13 | } 14 | -------------------------------------------------------------------------------- /client/src/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import ReactDOM from 'react-dom'; 3 | import './index.css'; 4 | import App from './App'; 5 | import * as serviceWorker from './serviceWorker'; 6 | export const vscode = window.acquireVsCodeApi();//Only one instance per app. 7 | ReactDOM.render(, document.getElementById('root')); 8 | 9 | // If you want your app to work offline and load faster, you can change 10 | // unregister() to register() below. Note this comes with some pitfalls. 11 | // Learn more about service workers: https://bit.ly/CRA-PWA 12 | serviceWorker.unregister(); 13 | -------------------------------------------------------------------------------- /client/src/logo.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /client/src/serviceWorker.js: -------------------------------------------------------------------------------- 1 | // This optional code is used to register a service worker. 2 | // register() is not called by default. 3 | 4 | // This lets the app load faster on subsequent visits in production, and gives 5 | // it offline capabilities. However, it also means that developers (and users) 6 | // will only see deployed updates on subsequent visits to a page, after all the 7 | // existing tabs open on the page have been closed, since previously cached 8 | // resources are updated in the background. 9 | 10 | // To learn more about the benefits of this model and instructions on how to 11 | // opt-in, read https://bit.ly/CRA-PWA 12 | 13 | const isLocalhost = Boolean( 14 | window.location.hostname === 'localhost' || 15 | // [::1] is the IPv6 localhost address. 16 | window.location.hostname === '[::1]' || 17 | // 127.0.0.0/8 are considered localhost for IPv4. 18 | window.location.hostname.match( 19 | /^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/ 20 | ) 21 | ); 22 | 23 | export function register(config) { 24 | if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) { 25 | // The URL constructor is available in all browsers that support SW. 26 | const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href); 27 | if (publicUrl.origin !== window.location.origin) { 28 | // Our service worker won't work if PUBLIC_URL is on a different origin 29 | // from what our page is served on. This might happen if a CDN is used to 30 | // serve assets; see https://github.com/facebook/create-react-app/issues/2374 31 | return; 32 | } 33 | 34 | window.addEventListener('load', () => { 35 | const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`; 36 | 37 | if (isLocalhost) { 38 | // This is running on localhost. Let's check if a service worker still exists or not. 39 | checkValidServiceWorker(swUrl, config); 40 | 41 | // Add some additional logging to localhost, pointing developers to the 42 | // service worker/PWA documentation. 43 | navigator.serviceWorker.ready.then(() => { 44 | console.log( 45 | 'This web app is being served cache-first by a service ' + 46 | 'worker. To learn more, visit https://bit.ly/CRA-PWA' 47 | ); 48 | }); 49 | } else { 50 | // Is not localhost. Just register service worker 51 | registerValidSW(swUrl, config); 52 | } 53 | }); 54 | } 55 | } 56 | 57 | function registerValidSW(swUrl, config) { 58 | navigator.serviceWorker 59 | .register(swUrl) 60 | .then(registration => { 61 | registration.onupdatefound = () => { 62 | const installingWorker = registration.installing; 63 | if (installingWorker == null) { 64 | return; 65 | } 66 | installingWorker.onstatechange = () => { 67 | if (installingWorker.state === 'installed') { 68 | if (navigator.serviceWorker.controller) { 69 | // At this point, the updated precached content has been fetched, 70 | // but the previous service worker will still serve the older 71 | // content until all client tabs are closed. 72 | console.log( 73 | 'New content is available and will be used when all ' + 74 | 'tabs for this page are closed. See https://bit.ly/CRA-PWA.' 75 | ); 76 | 77 | // Execute callback 78 | if (config && config.onUpdate) { 79 | config.onUpdate(registration); 80 | } 81 | } else { 82 | // At this point, everything has been precached. 83 | // It's the perfect time to display a 84 | // "Content is cached for offline use." message. 85 | console.log('Content is cached for offline use.'); 86 | 87 | // Execute callback 88 | if (config && config.onSuccess) { 89 | config.onSuccess(registration); 90 | } 91 | } 92 | } 93 | }; 94 | }; 95 | }) 96 | .catch(error => { 97 | console.error('Error during service worker registration:', error); 98 | }); 99 | } 100 | 101 | function checkValidServiceWorker(swUrl, config) { 102 | // Check if the service worker can be found. If it can't reload the page. 103 | fetch(swUrl, { 104 | headers: { 'Service-Worker': 'script' } 105 | }) 106 | .then(response => { 107 | // Ensure service worker exists, and that we really are getting a JS file. 108 | const contentType = response.headers.get('content-type'); 109 | if ( 110 | response.status === 404 || 111 | (contentType != null && contentType.indexOf('javascript') === -1) 112 | ) { 113 | // No service worker found. Probably a different app. Reload the page. 114 | navigator.serviceWorker.ready.then(registration => { 115 | registration.unregister().then(() => { 116 | window.location.reload(); 117 | }); 118 | }); 119 | } else { 120 | // Service worker found. Proceed as normal. 121 | registerValidSW(swUrl, config); 122 | } 123 | }) 124 | .catch(() => { 125 | console.log( 126 | 'No internet connection found. App is running in offline mode.' 127 | ); 128 | }); 129 | } 130 | 131 | export function unregister() { 132 | if ('serviceWorker' in navigator) { 133 | navigator.serviceWorker.ready 134 | .then(registration => { 135 | registration.unregister(); 136 | }) 137 | .catch(error => { 138 | console.error(error.message); 139 | }); 140 | } 141 | } 142 | -------------------------------------------------------------------------------- /client/src/setupTests.js: -------------------------------------------------------------------------------- 1 | // jest-dom adds custom jest matchers for asserting on DOM nodes. 2 | // allows you to do things like: 3 | // expect(element).toHaveTextContent(/react/i) 4 | // learn more: https://github.com/testing-library/jest-dom 5 | import '@testing-library/jest-dom/extend-expect'; 6 | -------------------------------------------------------------------------------- /icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vignaesh01/sfdx-package-generator/4c5e260ddf70ff9f6e2bdb417677fc1a95ea8961/icon.png -------------------------------------------------------------------------------- /media/main.js: -------------------------------------------------------------------------------- 1 | // This script will be run within the webview itself 2 | // It cannot access the main VS Code APIs directly. 3 | const vscode = acquireVsCodeApi(); 4 | var process = true; 5 | const LOADING='*loading..'; 6 | // Handle messages sent from the extension to the webview 7 | window.addEventListener('message', event => { 8 | const message = event.data; // The json data that the extension sent 9 | console.log(event.data); 10 | switch (message.command) { 11 | case 'refactor': 12 | currentCount = Math.ceil(currentCount * 0.5); 13 | counter.textContent = currentCount; 14 | break; 15 | case 'metadataObjects': 16 | console.log("Inside metadataObjects"); 17 | let metadataObjects=message.metadataObjects; 18 | metadataObjects=processChildXMLNames(metadataObjects);//Added for #18 19 | let mpExistingPackageXML=message.mpExistingPackageXML; 20 | console.log(mpExistingPackageXML); 21 | let jsTreeData=[]; 22 | for(let i=0;i { 136 | let childObj={}; 137 | childObj.xmlName=childXmlName; 138 | childObj.inFolder=false; 139 | childObj.isChildXMLName=true; 140 | combinedArr.push(childObj); 141 | }); 142 | 143 | } 144 | } 145 | 146 | return combinedArr; 147 | } 148 | 149 | $(function () { 150 | 151 | 152 | 153 | 154 | // 6 create an instance when the DOM is ready 155 | $('#jstree').jstree({ 156 | 'core' : { 157 | "themes" : { 158 | "variant" : "large" 159 | } 160 | }, 161 | "checkbox" : { 162 | "keep_selected_style" : false 163 | 164 | }, 165 | "plugins" : [ "checkbox","sort" ] 166 | }); 167 | 168 | 169 | 170 | 171 | $("#jstree").on("open_node.jstree", function (e, data) { 172 | if(process){ 173 | console.log("Open node_id: " + JSON.stringify(data.node)); 174 | let parentNode=data.node; 175 | 176 | //if(data.node.children && $('#'+data.node.children[0]).text()=="loading.."){ 177 | if(parentNode && parentNode.parent==='#' && !parentNode.original.isRefreshedFromServer){ 178 | vscode.postMessage({ 179 | command: 'fetchChildren', 180 | metadataType : data.node 181 | }); 182 | } 183 | 184 | } 185 | 186 | }); 187 | 188 | 189 | $('#jstree').on('refresh.jstree', function () { process = true; }); 190 | 191 | $('#jstree').on("select_node.jstree", function(e, data) { 192 | 193 | //only for parent nodes 194 | let parentNode=data.node; 195 | // if(process && data.node.parent=='#'){ 196 | if(process){ 197 | console.log("select_node: " + JSON.stringify(data.node)); 198 | 199 | //if(data.node.children && data.node.children.length==1){ 200 | if(parentNode && parentNode.parent==='#' && !parentNode.original.isRefreshedFromServer) { 201 | vscode.postMessage({ 202 | command: 'fetchChildren', 203 | metadataType : data.node 204 | }); 205 | } 206 | 207 | } 208 | }); 209 | 210 | // 8 interact with the tree - either way is OK 211 | $('#buildBtn').on('click', function () { 212 | var selectedNodes= $('#jstree').jstree(true).get_selected(true) 213 | console.log(JSON.stringify(selectedNodes)); 214 | vscode.postMessage({ 215 | command: 'buildPackageXML', 216 | selectedNodes : selectedNodes 217 | }); 218 | 219 | }); 220 | 221 | 222 | $('#copyBtn').on('click', function () { 223 | var selectedNodes= $('#jstree').jstree(true).get_selected(true) 224 | console.log(JSON.stringify(selectedNodes)); 225 | vscode.postMessage({ 226 | command: 'copyToClipboard', 227 | selectedNodes : selectedNodes 228 | }); 229 | 230 | }); 231 | 232 | 233 | $('#clearAllBtn').on('click', function () { 234 | console.log('Clear All invoked'); 235 | $('#jstree').jstree(true).settings.core.data = []; 236 | process=false; 237 | $('#jstree').jstree(true).refresh(); 238 | vscode.postMessage({ 239 | command: 'getMetadataTypes' 240 | }); 241 | 242 | }); 243 | 244 | $('#selectAllBtn').on('click', function () { 245 | console.log('Select All invoked'); 246 | 247 | let tData =$('#jstree').jstree(true).settings.core.data; 248 | let parNodeArr=[]; 249 | let skippedMetadataTypes=[]; 250 | for(let i=0;i0){ 261 | console.log("skippedMetadataTypes"); 262 | console.log(skippedMetadataTypes); 263 | skippedMetadataTypes.sort(); 264 | //alert("The following Metadata Types will be skipped "+skippedMetadataTypes.join()); 265 | } 266 | //Added for #18 - ends 267 | parNodeArr.sort(); 268 | vscode.postMessage({ 269 | command: 'selectAll', 270 | selectedMetadata : parNodeArr, 271 | skippedMetadataTypes : skippedMetadataTypes//Added for #18 272 | }); 273 | 274 | process=false; 275 | $('#jstree').jstree('select_node', parNodeArr,true,true); 276 | process=true; 277 | 278 | }); 279 | 280 | }); 281 | 282 | -------------------------------------------------------------------------------- /out/extension.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { 3 | if (k2 === undefined) k2 = k; 4 | var desc = Object.getOwnPropertyDescriptor(m, k); 5 | if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { 6 | desc = { enumerable: true, get: function() { return m[k]; } }; 7 | } 8 | Object.defineProperty(o, k2, desc); 9 | }) : (function(o, m, k, k2) { 10 | if (k2 === undefined) k2 = k; 11 | o[k2] = m[k]; 12 | })); 13 | var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { 14 | Object.defineProperty(o, "default", { enumerable: true, value: v }); 15 | }) : function(o, v) { 16 | o["default"] = v; 17 | }); 18 | var __importStar = (this && this.__importStar) || (function () { 19 | var ownKeys = function(o) { 20 | ownKeys = Object.getOwnPropertyNames || function (o) { 21 | var ar = []; 22 | for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; 23 | return ar; 24 | }; 25 | return ownKeys(o); 26 | }; 27 | return function (mod) { 28 | if (mod && mod.__esModule) return mod; 29 | var result = {}; 30 | if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); 31 | __setModuleDefault(result, mod); 32 | return result; 33 | }; 34 | })(); 35 | Object.defineProperty(exports, "__esModule", { value: true }); 36 | exports.activate = activate; 37 | const path = __importStar(require("path")); 38 | const vscode = __importStar(require("vscode")); 39 | const child = __importStar(require("child_process")); 40 | let clipboardy; 41 | var fs = require("fs"); 42 | var xml2js = require('xml2js'); 43 | let DEFAULT_API_VERSION = ''; 44 | function activate(context) { 45 | context.subscriptions.push(vscode.commands.registerCommand('sfdxPackageGen.chooseMetadata', async () => { 46 | // Dynamically import clipboardy 47 | const module = await import('clipboardy'); 48 | clipboardy = module.default || module; // Handle both default and named exports 49 | //check whether clipboardy got imported correctly 50 | console.log(clipboardy); 51 | DEFAULT_API_VERSION = await getAPIVersion(); 52 | console.log('DEFAULT_API_VERSION ' + DEFAULT_API_VERSION); 53 | CodingPanel.createOrShow(context.extensionPath); 54 | })); 55 | } 56 | function getAPIVersion() { 57 | console.log('getAPIVersion invoked'); 58 | return new Promise((resolve, reject) => { 59 | let sfdxCmd = "sf org display --json"; 60 | let foo = child.exec(sfdxCmd, { 61 | maxBuffer: 1024 * 1024 * 6, 62 | cwd: vscode.workspace.workspaceFolders[0].uri.fsPath 63 | }); 64 | let bufferOutData = ''; 65 | foo.stdout.on("data", (dataArg) => { 66 | console.log('stdout: ' + dataArg); 67 | bufferOutData += dataArg; 68 | }); 69 | /*foo.stderr.on("data",(data : any)=> { 70 | console.log('stderr: ' + data); 71 | //vscode.window.showErrorMessage(data); 72 | resolve(undefined); 73 | }); 74 | 75 | foo.stdin.on("data",(data : any)=> { 76 | console.log('stdin: ' + data); 77 | resolve(undefined); 78 | });*/ 79 | foo.on("exit", (code, signal) => { 80 | console.log("exited with code " + code); 81 | console.log("bufferOutData " + bufferOutData); 82 | let data = JSON.parse(bufferOutData); 83 | let apiVersion = data.result.apiVersion; 84 | console.log('apiVersion ' + apiVersion); 85 | resolve(apiVersion); 86 | }); 87 | }); 88 | } 89 | /** 90 | * Manages cat coding webview panels 91 | */ 92 | class CodingPanel { 93 | /** 94 | * Track the currently panel. Only allow a single panel to exist at a time. 95 | */ 96 | static currentPanel; 97 | static viewType = 'Coding'; 98 | _panel; 99 | _extensionPath; 100 | _disposables = []; 101 | reportFolderMap = { 102 | Dashboard: 'DashboardFolder', 103 | Document: 'DocumentFolder', 104 | EmailTemplate: 'EmailFolder', 105 | Report: 'ReportFolder' 106 | }; 107 | //Modified for #18 108 | //metadata types that accept * reg exp 109 | regExpArr = ['AccountRelationshipShareRule', 'ActionLinkGroupTemplate', 'ApexClass', 'ApexComponent', 110 | 'ApexPage', 'ApexTrigger', 'AppMenu', 'ApprovalProcess', 'ArticleType', 'AssignmentRules', 'Audience', 'AuthProvider', 111 | 'AuraDefinitionBundle', 'AutoResponseRules', 'Bot', 'BrandingSet', 'CallCenter', 'Certificate', 'CleanDataService', 112 | 'CMSConnectSource', 'Community', 'CommunityTemplateDefinition', 'CommunityThemeDefinition', 'CompactLayout', 113 | 'ConnectedApp', 'ContentAsset', 'CorsWhitelistOrigin', 'CustomApplication', 'CustomApplicationComponent', 114 | 'CustomFeedFilter', 'CustomHelpMenuSection', 'CustomMetadata', 'CustomLabels', 'CustomObjectTranslation', 115 | 'CustomPageWebLink', 'CustomPermission', 'CustomSite', 'CustomTab', 'DataCategoryGroup', 'DelegateGroup', 116 | 'DuplicateRule', 'EclairGeoData', 'EntitlementProcess', 'EntitlementTemplate', 'EventDelivery', 'EventSubscription', 117 | 'ExternalServiceRegistration', 'ExternalDataSource', 'FeatureParameterBoolean', 'FeatureParameterDate', 'FeatureParameterInteger', 118 | 'FieldSet', 'FlexiPage', 'Flow', 'FlowCategory', 'FlowDefinition', 'GlobalValueSet', 'GlobalValueSetTranslation', 'Group', 'HomePageComponent', 119 | 'HomePageLayout', 'InstalledPackage', 'KeywordList', 'Layout', 'LightningBolt', 'LightningComponentBundle', 'LightningExperienceTheme', 120 | 'LiveChatAgentConfig', 'LiveChatButton', 'LiveChatDeployment', 'LiveChatSensitiveDataRule', 'ManagedTopics', 'MatchingRules', 'MilestoneType', 121 | 'MlDomain', 'ModerationRule', 'NamedCredential', 'Network', 'NetworkBranding', 'PathAssistant', 'PermissionSet', 'PlatformCachePartition', 122 | 'Portal', 'PostTemplate', 'PresenceDeclineReason', 'PresenceUserConfig', 'Profile', 'ProfilePasswordPolicy', 'ProfileSessionSetting', 123 | 'Queue', 'QueueRoutingConfig', 'QuickAction', 'RecommendationStrategy', 'RecordActionDeployment', 'ReportType', 'Role', 'SamlSsoConfig', 124 | 'Scontrol', 'ServiceChannel', 'ServicePresenceStatus', 'SharingRules', 'SharingSet', 'SiteDotCom', 'Skill', 'StandardValueSetTranslation', 125 | 'StaticResource', 'SynonymDictionary', 'Territory', 'Territory2', 'Territory2Model', 'Territory2Rule', 'Territory2Type', 'TopicsForObjects', 126 | 'TransactionSecurityPolicy', 'Translations', 'WaveApplication', 'WaveDashboard', 'WaveDataflow', 'WaveDataset', 'WaveLens', 'WaveTemplateBundle', 127 | 'WaveXmd', 'Workflow', 128 | 'ActionPlanTemplate', 129 | 'AnimationRule', 130 | 'ChannelLayout', 131 | 'ApexTestSuite', 132 | 'AppointmentSchedulingPolicy', 133 | 'CampaignInfluenceModel', 134 | 'ChatterExtension', 135 | 'CspTrustedSite', 136 | 'CompactLayout', 137 | 'ExperienceBundle', 138 | 'LightningMessageChannel', 139 | 'MyDomainDiscoverableLogin', 140 | 'NavigationMenu', 141 | 'OauthCustomScope', 142 | 'PaymentGatewayProvider', 143 | 'PlatformEventChannel', 144 | 'PlatformEventChannelMember', 145 | 'Prompt', 146 | 'RedirectWhitelistUrl', 147 | 'Settings', 148 | 'TimeSheetTemplate', 149 | 'WaveRecipe', 150 | 'WorkSkillRouting']; 151 | PACKAGE_START = '\n' + 152 | '\n'; 153 | TYPES_START = ''; 154 | TYPES_END = ''; 155 | MEMBERS_START = ''; 156 | MEMBERS_END = ''; 157 | NAME_START = ''; 158 | NAME_END = ''; 159 | VERSION_START = ''; 160 | VERSION_END = ''; 161 | PACKAGE_END = ''; 162 | NEW_LINE = '\n'; 163 | VERSION_NUM = DEFAULT_API_VERSION; 164 | CHAR_TAB = '\t'; 165 | LOADING = '*loading..'; 166 | infoMsg = 'All metadata selected except '; 167 | static createOrShow(extensionPath) { 168 | const column = vscode.window.activeTextEditor 169 | ? vscode.window.activeTextEditor.viewColumn 170 | : undefined; 171 | // If we already have a panel, show it. 172 | if (CodingPanel.currentPanel) { 173 | CodingPanel.currentPanel._panel.reveal(column); 174 | return; 175 | } 176 | // Otherwise, create a new panel. 177 | const panel = vscode.window.createWebviewPanel(CodingPanel.viewType, 'Choose Metadata Components', column || vscode.ViewColumn.One, { 178 | // Enable javascript in the webview 179 | enableScripts: true, 180 | retainContextWhenHidden: true, 181 | // And restrict the webview to only loading content from our extension's `media` directory. 182 | //localResourceRoots: [vscode.Uri.file(path.join(extensionPath, 'media'))]Commented for UI Changes 183 | }); 184 | //get the API version 185 | CodingPanel.currentPanel = new CodingPanel(panel, extensionPath); 186 | } 187 | static revive(panel, extensionPath) { 188 | CodingPanel.currentPanel = new CodingPanel(panel, extensionPath); 189 | } 190 | constructor(panel, extensionPath) { 191 | this._panel = panel; 192 | this._extensionPath = extensionPath; 193 | // Set the webview's initial html content 194 | this._update(); 195 | // Listen for when the panel is disposed 196 | // This happens when the user closes the panel or when the panel is closed programatically 197 | this._panel.onDidDispose(() => this.dispose(), null, this._disposables); 198 | // Update the content based on view changes 199 | /*this._panel.onDidChangeViewState( 200 | e => { 201 | if (this._panel.visible) { 202 | this._update(); 203 | } 204 | }, 205 | null, 206 | this._disposables 207 | );*/ 208 | // Handle messages from the webview 209 | this._panel.webview.onDidReceiveMessage(async (message) => { 210 | switch (message.command) { 211 | case 'fetchChildren': 212 | console.log('onDidReceiveMessage fetchChildren'); 213 | let metadataType = message.metadataType; 214 | this.fetchChildren(metadataType); 215 | return; 216 | case 'buildPackageXML': 217 | console.log('onDidReceiveMessage buildPackageXML'); 218 | this.buildPackageXML(message.selectedNodes, false); 219 | return; 220 | case 'getMetadataTypes': 221 | console.log('onDidReceiveMessage getMetadataTypes'); 222 | this.getMetadataTypes({}); 223 | return; 224 | case 'copyToClipboard': 225 | console.log('onDidReceiveMessage copyToClipboard'); 226 | //clipboardy = await import('clipboardy'); 227 | this.buildPackageXML(message.selectedNodes, true); 228 | return; 229 | case 'selectAll': 230 | console.log('onDidReceiveMessage selectAll'); 231 | let selectedMetadata = message.selectedMetadata; 232 | let skippedMetadataTypes = message.skippedMetadataTypes; //Added for #18 233 | this.fetchAllChildren(selectedMetadata, skippedMetadataTypes, 0); 234 | return; 235 | //Added for UI Changes - starts 236 | case 'INIT_LOAD_REQUEST': 237 | console.log('onDidReceiveMessage INIT_LOAD_REQUEST'); 238 | this.handleInitLoadRequest(); 239 | return; 240 | case 'FETCH_CHILDREN_REQUEST': 241 | console.log('onDidReceiveMessage FETCH_CHILDREN'); 242 | this.fetchChildren(message.metadataType); 243 | return; 244 | case 'UPDATE_PACKAGE_XML': 245 | console.log('onDidReceiveMessage UPDATE_PACKAGE_XML'); 246 | this.handleUpdatePackageXml(message.metadataTypes); 247 | return; 248 | case 'COPY_TO_CLIPBOARD': 249 | console.log('onDidReceiveMessage COPY_TO_CLIPBOARD'); 250 | //clipboardy = await import('clipboardy'); 251 | this.handleCopyToClipboard(message.metadataTypes); 252 | return; 253 | case 'OPEN_URL': 254 | console.log('onDidReceiveMessage OPEN_URL'); 255 | this.openUrl(message.url); 256 | return; 257 | //Added for Ui Changes - ends 258 | } 259 | }, null, this._disposables); 260 | } 261 | buildPackageXML(selectedNodes, isCopyToClipboard) { 262 | console.log('Invoked buildPackageXML'); 263 | if (!selectedNodes || selectedNodes.length == 0) { 264 | vscode.window.showErrorMessage("Please select components for package.xml"); 265 | return; 266 | } 267 | let mpPackage = this.buildPackageMap(selectedNodes); 268 | this.generatePackageXML(mpPackage, isCopyToClipboard); 269 | } 270 | buildPackageMap(selectedNodes) { 271 | console.log('Invoked buildPackageMap'); 272 | let mpPackage = new Map(); 273 | for (let i = 0; i < selectedNodes.length; i++) { 274 | let node = selectedNodes[i]; 275 | let parent = node.parent; 276 | //do not add loading child node to final map 277 | if (node.text == this.LOADING) { 278 | continue; 279 | } 280 | if (parent == '#') { 281 | //parent node 282 | if (!mpPackage.has(node.text)) { 283 | //new entry 284 | if (this.regExpArr.includes(node.text)) { 285 | //accepts * 286 | mpPackage.set(node.text, ['*']); 287 | } 288 | else { 289 | mpPackage.set(node.text, []); 290 | } 291 | } 292 | else { 293 | if (this.regExpArr.includes(node.text)) { 294 | //accepts * 295 | mpPackage.set(node.text, ['*']); 296 | } 297 | } 298 | } 299 | else { 300 | //children 301 | if (!mpPackage.has(parent)) { 302 | //metadata type not present 303 | mpPackage.set(parent, [node.text]); 304 | } 305 | else { 306 | let childArr = mpPackage.get(parent); 307 | if (!childArr.includes('*')) { 308 | //add children only if parent metadata type does not accept * 309 | childArr.push(node.text); 310 | mpPackage.set(parent, childArr); 311 | } 312 | } 313 | } //else children end 314 | } //end for 315 | for (const [k, v] of mpPackage) { 316 | console.log(k, v); 317 | } 318 | return mpPackage; 319 | } 320 | generatePackageXML(mpPackage, isCopyToClipboard) { 321 | console.log('Invoked generatePackageXML'); 322 | //for parent metadata types which have empty children, fetch the children and rebuild the map entries. 323 | if (!mpPackage || mpPackage.size == 0) { 324 | console.log('Invoked generatePackageXML' + mpPackage); 325 | return mpPackage; 326 | } 327 | let xmlString = ''; 328 | xmlString += this.PACKAGE_START; 329 | let mpKeys = []; 330 | for (let key of mpPackage.keys()) { 331 | mpKeys.push(key); 332 | } 333 | // mpKeys=mpKeys.sort(); 334 | console.log(mpKeys); 335 | let mpSortedKeys = mpKeys.sort(); 336 | console.log(mpSortedKeys); 337 | // for (const [mType, components] of mpPackage) { 338 | for (let mType of mpKeys) { 339 | let components = mpPackage.get(mType); 340 | //remove metadata types with empty array values 341 | if (!components || components.length == 0) { 342 | continue; 343 | } 344 | components = components.sort(); 345 | //console.log(components); 346 | xmlString += this.CHAR_TAB + this.TYPES_START + this.NEW_LINE; 347 | for (const component of components) { 348 | xmlString += this.CHAR_TAB + this.CHAR_TAB + this.MEMBERS_START + component + this.MEMBERS_END + this.NEW_LINE; 349 | } 350 | xmlString += this.CHAR_TAB + this.CHAR_TAB + this.NAME_START + mType + this.NAME_END + this.NEW_LINE; 351 | xmlString += this.CHAR_TAB + this.TYPES_END + this.NEW_LINE; 352 | } 353 | xmlString += this.CHAR_TAB + this.VERSION_START + this.VERSION_NUM + this.VERSION_END + this.NEW_LINE; 354 | xmlString += this.PACKAGE_END; 355 | console.log(xmlString); 356 | if (isCopyToClipboard) { 357 | console.log('Copy to Clipboard - Initiated'); 358 | console.log(clipboardy); 359 | clipboardy.write(xmlString).then((result) => { 360 | console.log(result); 361 | vscode.window.showInformationMessage("Contents Copied to Clipboard successfully!!"); 362 | }); 363 | } 364 | else { 365 | fs.writeFile(vscode.workspace.workspaceFolders[0].uri.fsPath + "/manifest/package.xml", xmlString, (err) => { 366 | if (err) { 367 | console.log(err); 368 | vscode.window.showErrorMessage(err); 369 | } 370 | console.log("Successfully Written to File."); 371 | vscode.workspace.openTextDocument(vscode.workspace.workspaceFolders[0].uri.fsPath + "/manifest/package.xml").then(data => { 372 | console.log('Opened ' + data.fileName); 373 | vscode.window.showTextDocument(data); 374 | }); 375 | }); 376 | } 377 | } 378 | fetchChildren(metadataType) { 379 | console.log('Invoked fetchChildren'); 380 | let mType = metadataType.id; 381 | //Modified for UI Changes - starts 382 | //let node = metadataType.original; 383 | let node = metadataType; 384 | //Modified for UI Changes - ends 385 | console.log('Invoked fetchChildren ' + JSON.stringify(node)); 386 | if (!node.inFolder) { 387 | vscode.window.withProgress({ 388 | location: vscode.ProgressLocation.Notification, 389 | title: "Processing Metadata : " + mType, 390 | cancellable: true 391 | }, (progress, token) => { 392 | token.onCancellationRequested(() => { 393 | console.log("User canceled the long running operation"); 394 | }); 395 | var p = new Promise(resolve => { 396 | let sfdxCmd = "sf org list metadata --api-version " + this.VERSION_NUM + " --json -m " + mType; 397 | let foo = child.exec(sfdxCmd, { 398 | maxBuffer: 1024 * 1024 * 8, 399 | cwd: vscode.workspace.workspaceFolders[0].uri.fsPath 400 | }); 401 | let bufferOutData = ''; 402 | foo.stdout.on("data", (dataArg) => { 403 | console.log('stdout: ' + dataArg); 404 | bufferOutData += dataArg; 405 | /*let data = JSON.parse(dataArg); 406 | let depArr=[]; 407 | let results = data.result; 408 | this._panel.webview.postMessage({ command: 'listmetadata', results : results , metadataType : mType}); 409 | resolve();*/ 410 | }); 411 | foo.stderr.on("data", (data) => { 412 | console.log('stderr: ' + data); 413 | //vscode.window.showErrorMessage(data); 414 | resolve(undefined); 415 | }); 416 | foo.stdin.on("data", (data) => { 417 | console.log('stdin: ' + data); 418 | //vscode.window.showErrorMessage(data); 419 | resolve(undefined); 420 | }); 421 | foo.on('exit', (code, signal) => { 422 | console.log('exit code ' + code); 423 | console.log('bufferOutData ' + bufferOutData); 424 | let data = JSON.parse(bufferOutData); 425 | let depArr = []; 426 | let results = data.result; 427 | this._panel.webview.postMessage({ command: 'listmetadata', results: results, metadataType: mType }); 428 | resolve(); 429 | }); 430 | }); 431 | return p; 432 | }); 433 | } 434 | else { 435 | //get the folder 436 | let folderType = this.reportFolderMap[mType]; 437 | let sfdxCmd = "sf org list metadata --json --api-version " + this.VERSION_NUM + " -m " + folderType; 438 | vscode.window.withProgress({ 439 | location: vscode.ProgressLocation.Notification, 440 | title: "Processing Metadata : " + folderType, 441 | cancellable: true 442 | }, (progress, token) => { 443 | token.onCancellationRequested(() => { 444 | console.log("User canceled the long running operation"); 445 | }); 446 | var p = new Promise(resolve => { 447 | let foo = child.exec(sfdxCmd, { 448 | maxBuffer: 1024 * 1024 * 6, 449 | cwd: vscode.workspace.workspaceFolders[0].uri.fsPath 450 | }); 451 | let bufferOutData = ''; 452 | foo.stdout.on("data", (dataArg) => { 453 | console.log('stdout: ' + dataArg); 454 | bufferOutData += dataArg; 455 | /*let data = JSON.parse(dataArg); 456 | let folderNames=[]; 457 | let results = data.result; 458 | 459 | if(!results || results.length==0){ 460 | //no folders 461 | this._panel.webview.postMessage({ command: 'listmetadata', results : results , metadataType : mType}); 462 | return; 463 | }else if(!Array.isArray(results)){ 464 | //1 folder 465 | folderNames.push(results.fullName); 466 | }else{ 467 | //many folders 468 | for(let i=0;i { 478 | console.log('stderr: ' + data); 479 | //vscode.window.showErrorMessage(data); 480 | resolve(undefined); 481 | }); 482 | foo.stdin.on("data", (data) => { 483 | console.log('stdin: ' + data); 484 | resolve(undefined); 485 | }); 486 | foo.on('exit', (code, signal) => { 487 | console.log('exit code ' + code); 488 | console.log('bufferOutData ' + bufferOutData); 489 | let data = JSON.parse(bufferOutData); 490 | let folderNames = []; 491 | let results = data.result; 492 | if (!results || results.length == 0) { 493 | //no folders 494 | this._panel.webview.postMessage({ command: 'listmetadata', results: results, metadataType: mType }); 495 | return; 496 | } 497 | else if (!Array.isArray(results)) { 498 | //1 folder 499 | folderNames.push(results.fullName); 500 | } 501 | else { 502 | //many folders 503 | for (let i = 0; i < results.length; i++) { 504 | folderNames.push(results[i].fullName); 505 | } 506 | } 507 | //get the components inside each folder 508 | this.getComponentsInsideFolders(folderNames, mType, 0, []); 509 | resolve(undefined); 510 | }); 511 | }); 512 | return p; 513 | }); 514 | } 515 | } 516 | fetchAllChildren(selectedMetadata, skippedMetadataTypes, index) { 517 | console.log('Invoked fetchAllChildren'); 518 | if (!selectedMetadata || selectedMetadata.length == 0) { 519 | return; 520 | } 521 | if (index == selectedMetadata.length) { //end condition 522 | let mpKeys = []; 523 | for (let key in this.reportFolderMap) { 524 | mpKeys.push(key); 525 | } 526 | vscode.window.showInformationMessage(this.infoMsg + skippedMetadataTypes.join()); //Modified for #18 527 | return; 528 | } 529 | let mType = selectedMetadata[index]; 530 | vscode.window.withProgress({ 531 | location: vscode.ProgressLocation.Notification, 532 | title: "Processing Metadata : " + mType, 533 | cancellable: true 534 | }, (progress, token) => { 535 | token.onCancellationRequested(() => { 536 | console.log("User canceled the long running operation"); 537 | }); 538 | var p = new Promise(resolve => { 539 | let sfdxCmd = "sf org list metadata --json --api-version " + this.VERSION_NUM + " -m " + mType; 540 | let foo = child.exec(sfdxCmd, { 541 | maxBuffer: 1024 * 1024 * 6, 542 | cwd: vscode.workspace.workspaceFolders[0].uri.fsPath 543 | }); 544 | let bufferOutData = ''; 545 | foo.stdout.on("data", (dataArg) => { 546 | console.log('stdout: ' + dataArg); 547 | bufferOutData += dataArg; 548 | /*let data = JSON.parse(dataArg); 549 | let depArr=[]; 550 | let results = data.result; 551 | this._panel.webview.postMessage({ command: 'listmetadata', results : results , metadataType : mType}); 552 | resolve();*/ 553 | }); 554 | foo.stderr.on("data", (data) => { 555 | console.log('stderr: ' + data); 556 | //vscode.window.showErrorMessage(data); 557 | resolve(undefined); 558 | }); 559 | foo.stdin.on("data", (data) => { 560 | console.log('stdin: ' + data); 561 | //vscode.window.showErrorMessage(data); 562 | resolve(undefined); 563 | }); 564 | foo.on('exit', (code, signal) => { 565 | console.log('exit code ' + code); 566 | console.log('bufferOutData ' + bufferOutData); 567 | let data = JSON.parse(bufferOutData); 568 | let depArr = []; 569 | let results = data.result; 570 | this._panel.webview.postMessage({ command: 'listmetadata', results: results, metadataType: mType }); 571 | resolve(undefined); 572 | this.fetchAllChildren(selectedMetadata, skippedMetadataTypes, ++index); //recurse through other metadata 573 | }); 574 | }); 575 | return p; 576 | }); 577 | } 578 | getComponentsInsideFolders(folderNames, mType, index, resultsArr) { 579 | if (index == folderNames.length) { 580 | this._panel.webview.postMessage({ command: 'listmetadata', results: resultsArr, metadataType: mType }); 581 | return; 582 | } 583 | vscode.window.withProgress({ 584 | location: vscode.ProgressLocation.Notification, 585 | title: "Processing Metadata : " + mType + ":" + folderNames[index], 586 | cancellable: true 587 | }, (progress, token) => { 588 | token.onCancellationRequested(() => { 589 | console.log("User canceled the long running operation"); 590 | }); 591 | var p = new Promise(resolve => { 592 | let sfdxCmd = "sf org list metadata --json --api-version " + this.VERSION_NUM + " -m " + mType + " --folder " + folderNames[index]; 593 | let foo = child.exec(sfdxCmd, { 594 | maxBuffer: 1024 * 1024 * 6, 595 | cwd: vscode.workspace.workspaceFolders[0].uri.fsPath 596 | }); 597 | let bufferOutData = ''; 598 | foo.stdout.on("data", (dataArg) => { 599 | console.log('stdout: ' + dataArg); 600 | bufferOutData += dataArg; 601 | /*let data = JSON.parse(dataArg); 602 | let depArr=[]; 603 | let results = data.result; 604 | 605 | if(results){ 606 | if(!Array.isArray(results)){ 607 | //1 folder 608 | resultsArr.push(results); 609 | }else{ 610 | //many folders 611 | for(let i=0;i { 622 | console.log('stderr: ' + data); 623 | //vscode.window.showErrorMessage(data); 624 | resolve(undefined); 625 | }); 626 | foo.stdin.on("data", (data) => { 627 | console.log('stdin: ' + data); 628 | resolve(undefined); 629 | }); 630 | foo.on('exit', (code, signal) => { 631 | console.log('exit code ' + code); 632 | console.log('bufferOutData ' + bufferOutData); 633 | let data = JSON.parse(bufferOutData); 634 | let depArr = []; 635 | let results = data.result; 636 | if (results) { 637 | if (!Array.isArray(results)) { 638 | //1 folder 639 | resultsArr.push(results); 640 | } 641 | else { 642 | //many folders 643 | for (let i = 0; i < results.length; i++) { 644 | resultsArr.push(results[i]); 645 | } 646 | } 647 | } 648 | resolve(undefined); 649 | console.log('After resolve getComponentsInsideFolders'); 650 | this.getComponentsInsideFolders(folderNames, mType, ++index, resultsArr); 651 | }); 652 | }); 653 | return p; 654 | }); 655 | } 656 | dispose() { 657 | CodingPanel.currentPanel = undefined; 658 | // Clean up our resources 659 | this._panel.dispose(); 660 | while (this._disposables.length) { 661 | const x = this._disposables.pop(); 662 | if (x) { 663 | x.dispose(); 664 | } 665 | } 666 | } 667 | _update() { 668 | this._panel.title = 'Choose Metadata Components'; 669 | this._panel.webview.html = this._getHtmlForWebview(); 670 | //Commented for UI Changes - starts 671 | /*this.readExistingPackageXML().then(mpExistingPackageXML=>{ 672 | this.getMetadataTypes(mpExistingPackageXML); 673 | }).catch(err=>{ 674 | console.log(err); 675 | });*/ 676 | //Commented for Ui Changes - ends 677 | } 678 | //Added for UI Changes - starts 679 | handleInitLoadRequest() { 680 | this.readExistingPackageXML().then(mpExistingPackageXML => { 681 | this.getMetadataTypes(mpExistingPackageXML); 682 | }).catch(err => { 683 | console.log(err); 684 | }); 685 | } 686 | handleUpdatePackageXml(metadataTypes) { 687 | const mpPackage = this.buildSelectedMetadataMap(metadataTypes); 688 | if (mpPackage.size == 0) { 689 | vscode.window.showErrorMessage("Please select components for package.xml"); 690 | return; 691 | } 692 | this.generatePackageXML(mpPackage, false); 693 | } 694 | handleCopyToClipboard(metadataTypes) { 695 | const mpPackage = this.buildSelectedMetadataMap(metadataTypes); 696 | if (mpPackage.size == 0) { 697 | vscode.window.showErrorMessage("Please select components for package.xml"); 698 | return; 699 | } 700 | this.generatePackageXML(mpPackage, true); 701 | } 702 | openUrl(url) { 703 | vscode.commands.executeCommand('vscode.open', vscode.Uri.parse(url)); 704 | } 705 | buildSelectedMetadataMap(metadataTypes) { 706 | const mpPackage = new Map(); 707 | if (!metadataTypes || metadataTypes.length == 0) { 708 | return mpPackage; 709 | } 710 | metadataTypes.forEach(metadataType => { 711 | if (metadataType.isSelected) { 712 | //Add to Map 713 | if (this.regExpArr.includes(metadataType.id)) { 714 | //accepts * 715 | mpPackage.set(metadataType.id, ['*']); 716 | } 717 | else { 718 | const childrenArr = metadataType.children.map(child => child.text); 719 | mpPackage.set(metadataType.id, childrenArr); 720 | } 721 | } 722 | else if (metadataType.isIndeterminate) { 723 | const childrenArr = []; 724 | metadataType.children.forEach(child => { 725 | if (child.isSelected) { 726 | childrenArr.push(child.text); 727 | } 728 | }); 729 | mpPackage.set(metadataType.id, childrenArr); 730 | } 731 | }); 732 | return mpPackage; 733 | } 734 | //Added for UI Changes - ends 735 | readExistingPackageXML() { 736 | console.log('Read existing packge.xml'); 737 | let mpExistingPackageXML = {}; 738 | let parser = new xml2js.Parser(); 739 | return new Promise((resolve, reject) => { 740 | fs.readFile(vscode.workspace.workspaceFolders[0].uri.fsPath + "/manifest/package.xml", function (err, data) { 741 | if (err) { 742 | console.error(err); 743 | resolve(mpExistingPackageXML); 744 | } 745 | parser.parseString(data, function (err, result) { 746 | if (err) { 747 | console.error(err); 748 | resolve(mpExistingPackageXML); 749 | //return; 750 | } 751 | console.log('Existing package.xml'); 752 | console.log(JSON.stringify(result)); 753 | ///mpExistingPackageXML=this.putExistingPackageXMLInMap(result); 754 | if (!result || !result.Package || !result.Package.types) { 755 | resolve(mpExistingPackageXML); 756 | } 757 | let types = result.Package.types; 758 | for (let i = 0; i < types.length; i++) { 759 | let type = types[i]; 760 | let name = type.name[0]; 761 | let members = type.members; 762 | //Commented for UI Changes - starts 763 | //for setting undetermined state 764 | /*if(members && !members.includes("*")){ 765 | members.push("*loading.."); 766 | }*/ 767 | //Commented for UI Changes - ends 768 | mpExistingPackageXML[name] = members; 769 | } 770 | console.log(mpExistingPackageXML); 771 | resolve(mpExistingPackageXML); 772 | }); 773 | }); 774 | }); 775 | } 776 | getMetadataTypes(mpExistingPackageXML) { 777 | console.log("getMetadataTypes invoked"); 778 | vscode.window.withProgress({ 779 | location: vscode.ProgressLocation.Notification, 780 | title: "Processing Metadata", 781 | cancellable: true 782 | }, (progress, token) => { 783 | token.onCancellationRequested(() => { 784 | console.log("User canceled the long running operation"); 785 | }); 786 | console.log("vscode.workspace.workspaceFolders[0].uri.fsPath " + vscode.workspace.workspaceFolders[0].uri.fsPath); 787 | var p = new Promise(resolve => { 788 | var foo = child.exec('sf org list metadata-types --api-version ' + this.VERSION_NUM + ' --json', { 789 | maxBuffer: 1024 * 1024 * 6, 790 | cwd: vscode.workspace.workspaceFolders[0].uri.fsPath 791 | }); 792 | let bufferOutData = ''; 793 | foo.stdout.on("data", (dataArg) => { 794 | console.log('dataArg ' + dataArg); 795 | bufferOutData += dataArg; 796 | /*let data = JSON.parse(dataArg); 797 | let depArr=[]; 798 | let metadataObjectsArr = data.result.metadataObjects; 799 | 800 | for(let index=0;index { 809 | console.log('stderr: ' + data); 810 | //vscode.window.showErrorMessage(data); 811 | resolve(undefined); 812 | }); 813 | foo.stdin.on("data", (data) => { 814 | console.log('stdin: ' + data); 815 | resolve(undefined); 816 | }); 817 | foo.on("exit", (code, signal) => { 818 | console.log("exited with code " + code); 819 | console.log("bufferOutData " + bufferOutData); 820 | resolve(undefined); 821 | let data = JSON.parse(bufferOutData); 822 | let depArr = []; 823 | let metadataObjectsArr = data.result.metadataObjects; 824 | for (let index = 0; index < metadataObjectsArr.length; index++) { 825 | let obj = metadataObjectsArr[index]; 826 | console.log(obj.xmlName); 827 | depArr.push(obj.xmlName); 828 | } 829 | this._panel.webview.postMessage({ command: 'metadataObjects', metadataObjects: metadataObjectsArr, 830 | 'mpExistingPackageXML': mpExistingPackageXML }); 831 | }); 832 | console.log(typeof foo.on); 833 | }); 834 | return p; 835 | }); 836 | } 837 | _getHtmlForWebview() { 838 | //Added for UI Changes - starts 839 | const manifest = require(path.join(this._extensionPath, 'client', 'build', 'asset-manifest.json')); 840 | const entrypoints = manifest['entrypoints']; 841 | const scriptEntryPoints = []; 842 | const styleEntryPoints = []; 843 | entrypoints.forEach(entrypoint => { 844 | if (entrypoint.endsWith('.js')) { 845 | scriptEntryPoints.push(entrypoint); 846 | } 847 | else { 848 | styleEntryPoints.push(entrypoint); 849 | } 850 | }); 851 | const scriptPathOnDisk = vscode.Uri.file(path.join(this._extensionPath, 'client', 'build', scriptEntryPoints[0])); 852 | //const scriptUri = scriptPathOnDisk.with({ scheme: 'vscode-resource' }); 853 | const scriptUri = this._panel.webview.asWebviewUri(scriptPathOnDisk); 854 | const runtimeScriptPathOnDisk = vscode.Uri.file(path.join(this._extensionPath, 'client', 'build', scriptEntryPoints[1])); 855 | //const runtimeScriptUri = runtimeScriptPathOnDisk.with({ scheme: 'vscode-resource' }); 856 | const runtimeScriptUri = this._panel.webview.asWebviewUri(runtimeScriptPathOnDisk); 857 | const staticScriptPathOnDisk = vscode.Uri.file(path.join(this._extensionPath, 'client', 'build', scriptEntryPoints[2])); 858 | //const staticScriptUri = staticScriptPathOnDisk.with({ scheme: 'vscode-resource' }); 859 | const staticScriptUri = this._panel.webview.asWebviewUri(staticScriptPathOnDisk); 860 | const stylePathOnDisk = vscode.Uri.file(path.join(this._extensionPath, 'client', 'build', styleEntryPoints[0])); 861 | //const styleUri = stylePathOnDisk.with({ scheme: 'vscode-resource' }); 862 | const styleUri = this._panel.webview.asWebviewUri(stylePathOnDisk); 863 | console.log(`scriptUri ${scriptUri}`); 864 | console.log(`styleUri ${styleUri}`); 865 | //Added for UI Changes - ends 866 | //Commented for UI Changes - starts 867 | /* 868 | // Local path to main script run in the webview 869 | const scriptPathOnDisk = vscode.Uri.file( 870 | path.join(this._extensionPath, 'media', 'main.js') 871 | ); 872 | 873 | // And the uri we use to load this script in the webview 874 | const scriptUri = scriptPathOnDisk.with({ scheme: 'vscode-resource' }); 875 | */ 876 | //Commented for UI Changes - ends 877 | // Use a nonce to whitelist which scripts can be run 878 | const nonce = getNonce(); 879 | // Base CSP directive 880 | const cspSource = this._panel.webview.cspSource; 881 | // Define the allowed resources path 882 | const resourcePathUri = this._panel.webview.asWebviewUri(vscode.Uri.file(path.join(this._extensionPath, ''))); 883 | return ` 884 | 885 | 886 | 887 | 888 | 892 | 893 | 894 | 900 | 901 | 905 | 906 | 907 | 908 | 909 | Add Components 910 | 911 | 912 | 913 | 914 | 915 | 916 | 935 | 936 | 937 | 938 | 939 |
940 | 943 | 944 | 945 | 946 | 947 | 948 | `; 949 | } 950 | } 951 | function getNonce() { 952 | let text = ''; 953 | const possible = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; 954 | for (let i = 0; i < 32; i++) { 955 | text += possible.charAt(Math.floor(Math.random() * possible.length)); 956 | } 957 | return text; 958 | } 959 | //# sourceMappingURL=extension.js.map -------------------------------------------------------------------------------- /out/extension.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"extension.js","sourceRoot":"","sources":["../src/extension.ts"],"names":[],"mappings":"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"} -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "sfdx-package-xml-generator", 3 | "displayName": "Salesforce Package.xml Generator Extension for VS Code", 4 | "description": "Extension for generating Package.xml on the Salesforce Platform", 5 | "version": "2.1.0", 6 | "publisher": "VignaeshRamA", 7 | "repository": "https://github.com/vignaesh01/sfdx-package-generator", 8 | "icon": "icon.png", 9 | "keywords": [ 10 | "sfdx", 11 | "salesforcedx", 12 | "sfdx package xml", 13 | "salesforce", 14 | "salesforce package xml generator" 15 | ], 16 | "engines": { 17 | "vscode": "^1.76.0" 18 | }, 19 | "categories": [ 20 | "Extension Packs", 21 | "Other" 22 | ], 23 | "activationEvents": [], 24 | "main": "./out/extension.js", 25 | "contributes": { 26 | "commands": [ 27 | { 28 | "command": "sfdxPackageGen.chooseMetadata", 29 | "title": "Choose Metadata Components", 30 | "category": "SFDX Package.xml Generator" 31 | } 32 | ] 33 | }, 34 | "scripts": { 35 | "vscode:prepublish": "npm run compile", 36 | "compile": "tsc -p ./", 37 | "lint": "eslint", 38 | "watch": "tsc -w -p ./" 39 | }, 40 | "dependencies": { 41 | "clipboardy": "^4.0.0", 42 | "xml2js": "^0.4.23" 43 | }, 44 | "devDependencies": { 45 | "@eslint/js": "^9.13.0", 46 | "@stylistic/eslint-plugin": "^2.9.0", 47 | "@types/clipboardy": "^1.1.0", 48 | "@types/node": "^20", 49 | "@types/vscode": "^1.73.0", 50 | "@types/vscode-webview": "^1.57.0", 51 | "eslint": "^9.17.0", 52 | "typescript": "^5.7.2", 53 | "typescript-eslint": "^8.16.0" 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /sfdx-gen-pack1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vignaesh01/sfdx-package-generator/4c5e260ddf70ff9f6e2bdb417677fc1a95ea8961/sfdx-gen-pack1.png -------------------------------------------------------------------------------- /sfdx-gen-pack2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vignaesh01/sfdx-package-generator/4c5e260ddf70ff9f6e2bdb417677fc1a95ea8961/sfdx-gen-pack2.png -------------------------------------------------------------------------------- /src/extension.ts: -------------------------------------------------------------------------------- 1 | import * as path from 'path'; 2 | import * as vscode from 'vscode'; 3 | import * as child from 'child_process'; 4 | 5 | let clipboardy: any; 6 | var fs = require("fs"); 7 | var xml2js = require('xml2js'); 8 | let DEFAULT_API_VERSION=''; 9 | 10 | export function activate(context: vscode.ExtensionContext) { 11 | context.subscriptions.push( 12 | vscode.commands.registerCommand('sfdxPackageGen.chooseMetadata',async () => { 13 | // Dynamically import clipboardy 14 | const module = await import('clipboardy'); 15 | clipboardy = module.default || module; // Handle both default and named exports 16 | //check whether clipboardy got imported correctly 17 | console.log(clipboardy); 18 | DEFAULT_API_VERSION=await getAPIVersion(); 19 | console.log('DEFAULT_API_VERSION '+DEFAULT_API_VERSION); 20 | CodingPanel.createOrShow(context.extensionPath); 21 | }) 22 | ); 23 | 24 | 25 | } 26 | 27 | function getAPIVersion():Promise{ 28 | console.log('getAPIVersion invoked'); 29 | return new Promise((resolve,reject)=>{ 30 | let sfdxCmd ="sf org display --json"; 31 | let foo: child.ChildProcess = child.exec(sfdxCmd,{ 32 | maxBuffer: 1024 * 1024 * 6, 33 | cwd: vscode.workspace.workspaceFolders[0].uri.fsPath 34 | }); 35 | let bufferOutData=''; 36 | foo.stdout.on("data",(dataArg : any)=> { 37 | console.log('stdout: ' + dataArg); 38 | bufferOutData+=dataArg; 39 | }); 40 | 41 | /*foo.stderr.on("data",(data : any)=> { 42 | console.log('stderr: ' + data); 43 | //vscode.window.showErrorMessage(data); 44 | resolve(undefined); 45 | }); 46 | 47 | foo.stdin.on("data",(data : any)=> { 48 | console.log('stdin: ' + data); 49 | resolve(undefined); 50 | });*/ 51 | 52 | foo.on("exit", (code: number, signal: string) => { 53 | console.log("exited with code "+code); 54 | console.log("bufferOutData "+bufferOutData); 55 | let data = JSON.parse(bufferOutData); 56 | let apiVersion = data.result.apiVersion; 57 | console.log('apiVersion '+apiVersion); 58 | resolve(apiVersion); 59 | }); 60 | }); 61 | } 62 | /** 63 | * Manages cat coding webview panels 64 | */ 65 | class CodingPanel { 66 | /** 67 | * Track the currently panel. Only allow a single panel to exist at a time. 68 | */ 69 | public static currentPanel: CodingPanel | undefined; 70 | 71 | public static readonly viewType = 'Coding'; 72 | 73 | private readonly _panel: vscode.WebviewPanel; 74 | private readonly _extensionPath: string; 75 | private _disposables: vscode.Disposable[] = []; 76 | private reportFolderMap={ 77 | Dashboard : 'DashboardFolder', 78 | Document :'DocumentFolder', 79 | EmailTemplate :'EmailFolder', 80 | Report :'ReportFolder' 81 | }; 82 | //Modified for #18 83 | //metadata types that accept * reg exp 84 | private regExpArr=['AccountRelationshipShareRule','ActionLinkGroupTemplate','ApexClass','ApexComponent', 85 | 'ApexPage','ApexTrigger','AppMenu','ApprovalProcess','ArticleType','AssignmentRules','Audience','AuthProvider', 86 | 'AuraDefinitionBundle','AutoResponseRules','Bot','BrandingSet','CallCenter','Certificate','CleanDataService', 87 | 'CMSConnectSource','Community','CommunityTemplateDefinition','CommunityThemeDefinition','CompactLayout', 88 | 'ConnectedApp','ContentAsset','CorsWhitelistOrigin','CustomApplication','CustomApplicationComponent', 89 | 'CustomFeedFilter','CustomHelpMenuSection','CustomMetadata','CustomLabels','CustomObjectTranslation', 90 | 'CustomPageWebLink','CustomPermission','CustomSite','CustomTab','DataCategoryGroup','DelegateGroup', 91 | 'DuplicateRule','EclairGeoData','EntitlementProcess','EntitlementTemplate','EventDelivery','EventSubscription', 92 | 'ExternalServiceRegistration','ExternalDataSource','FeatureParameterBoolean','FeatureParameterDate','FeatureParameterInteger', 93 | 'FieldSet','FlexiPage','Flow','FlowCategory','FlowDefinition','GlobalValueSet','GlobalValueSetTranslation','Group','HomePageComponent', 94 | 'HomePageLayout','InstalledPackage','KeywordList','Layout','LightningBolt','LightningComponentBundle','LightningExperienceTheme', 95 | 'LiveChatAgentConfig','LiveChatButton','LiveChatDeployment','LiveChatSensitiveDataRule','ManagedTopics','MatchingRules','MilestoneType', 96 | 'MlDomain','ModerationRule','NamedCredential','Network','NetworkBranding','PathAssistant','PermissionSet','PlatformCachePartition', 97 | 'Portal','PostTemplate','PresenceDeclineReason','PresenceUserConfig','Profile','ProfilePasswordPolicy','ProfileSessionSetting', 98 | 'Queue','QueueRoutingConfig','QuickAction','RecommendationStrategy','RecordActionDeployment','ReportType','Role','SamlSsoConfig', 99 | 'Scontrol','ServiceChannel','ServicePresenceStatus','SharingRules','SharingSet','SiteDotCom','Skill','StandardValueSetTranslation', 100 | 'StaticResource','SynonymDictionary','Territory','Territory2','Territory2Model','Territory2Rule','Territory2Type','TopicsForObjects', 101 | 'TransactionSecurityPolicy','Translations','WaveApplication','WaveDashboard','WaveDataflow','WaveDataset','WaveLens','WaveTemplateBundle', 102 | 'WaveXmd','Workflow', 103 | 'ActionPlanTemplate', 104 | 'AnimationRule', 105 | 'ChannelLayout', 106 | 'ApexTestSuite', 107 | 'AppointmentSchedulingPolicy', 108 | 'CampaignInfluenceModel', 109 | 'ChatterExtension', 110 | 'CspTrustedSite', 111 | 'CompactLayout', 112 | 'ExperienceBundle', 113 | 'LightningMessageChannel', 114 | 'MyDomainDiscoverableLogin', 115 | 'NavigationMenu', 116 | 'OauthCustomScope', 117 | 'PaymentGatewayProvider', 118 | 'PlatformEventChannel', 119 | 'PlatformEventChannelMember', 120 | 'Prompt', 121 | 'RedirectWhitelistUrl', 122 | 'Settings', 123 | 'TimeSheetTemplate', 124 | 'WaveRecipe', 125 | 'WorkSkillRouting']; 126 | 127 | private PACKAGE_START='\n'+ 128 | '\n'; 129 | 130 | private TYPES_START=''; 131 | private TYPES_END=''; 132 | private MEMBERS_START=''; 133 | private MEMBERS_END=''; 134 | private NAME_START=''; 135 | private NAME_END=''; 136 | private VERSION_START=''; 137 | private VERSION_END=''; 138 | private PACKAGE_END=''; 139 | private NEW_LINE ='\n'; 140 | private VERSION_NUM=DEFAULT_API_VERSION; 141 | private CHAR_TAB='\t'; 142 | private LOADING='*loading..'; 143 | private infoMsg='All metadata selected except '; 144 | 145 | public static createOrShow(extensionPath: string) { 146 | const column = vscode.window.activeTextEditor 147 | ? vscode.window.activeTextEditor.viewColumn 148 | : undefined; 149 | 150 | // If we already have a panel, show it. 151 | if (CodingPanel.currentPanel) { 152 | CodingPanel.currentPanel._panel.reveal(column); 153 | return; 154 | } 155 | 156 | // Otherwise, create a new panel. 157 | const panel = vscode.window.createWebviewPanel( 158 | CodingPanel.viewType, 159 | 'Choose Metadata Components', 160 | column || vscode.ViewColumn.One, 161 | { 162 | // Enable javascript in the webview 163 | enableScripts: true, 164 | retainContextWhenHidden: true, 165 | // And restrict the webview to only loading content from our extension's `media` directory. 166 | //localResourceRoots: [vscode.Uri.file(path.join(extensionPath, 'media'))]Commented for UI Changes 167 | } 168 | ); 169 | //get the API version 170 | CodingPanel.currentPanel = new CodingPanel(panel, extensionPath); 171 | 172 | } 173 | 174 | public static revive(panel: vscode.WebviewPanel, extensionPath: string) { 175 | CodingPanel.currentPanel = new CodingPanel(panel, extensionPath); 176 | } 177 | 178 | private constructor(panel: vscode.WebviewPanel, extensionPath: string) { 179 | this._panel = panel; 180 | this._extensionPath = extensionPath; 181 | 182 | // Set the webview's initial html content 183 | this._update(); 184 | 185 | // Listen for when the panel is disposed 186 | // This happens when the user closes the panel or when the panel is closed programatically 187 | this._panel.onDidDispose(() => this.dispose(), null, this._disposables); 188 | 189 | // Update the content based on view changes 190 | /*this._panel.onDidChangeViewState( 191 | e => { 192 | if (this._panel.visible) { 193 | this._update(); 194 | } 195 | }, 196 | null, 197 | this._disposables 198 | );*/ 199 | 200 | // Handle messages from the webview 201 | this._panel.webview.onDidReceiveMessage( 202 | async message => { 203 | switch (message.command) { 204 | case 'fetchChildren': 205 | console.log('onDidReceiveMessage fetchChildren'); 206 | let metadataType = message.metadataType; 207 | this.fetchChildren(metadataType); 208 | return; 209 | 210 | case 'buildPackageXML': 211 | console.log('onDidReceiveMessage buildPackageXML'); 212 | this.buildPackageXML(message.selectedNodes,false); 213 | return; 214 | 215 | case 'getMetadataTypes': 216 | console.log('onDidReceiveMessage getMetadataTypes'); 217 | this.getMetadataTypes({}); 218 | return; 219 | 220 | case 'copyToClipboard': 221 | console.log('onDidReceiveMessage copyToClipboard'); 222 | //clipboardy = await import('clipboardy'); 223 | this.buildPackageXML(message.selectedNodes,true); 224 | return; 225 | 226 | case 'selectAll': 227 | console.log('onDidReceiveMessage selectAll'); 228 | let selectedMetadata = message.selectedMetadata; 229 | let skippedMetadataTypes=message.skippedMetadataTypes;//Added for #18 230 | this.fetchAllChildren(selectedMetadata,skippedMetadataTypes,0); 231 | return; 232 | //Added for UI Changes - starts 233 | case 'INIT_LOAD_REQUEST': 234 | console.log('onDidReceiveMessage INIT_LOAD_REQUEST'); 235 | this.handleInitLoadRequest(); 236 | return; 237 | 238 | case 'FETCH_CHILDREN_REQUEST': 239 | console.log('onDidReceiveMessage FETCH_CHILDREN'); 240 | this.fetchChildren(message.metadataType); 241 | return; 242 | 243 | case 'UPDATE_PACKAGE_XML': 244 | console.log('onDidReceiveMessage UPDATE_PACKAGE_XML'); 245 | this.handleUpdatePackageXml(message.metadataTypes); 246 | return; 247 | 248 | case 'COPY_TO_CLIPBOARD': 249 | console.log('onDidReceiveMessage COPY_TO_CLIPBOARD'); 250 | //clipboardy = await import('clipboardy'); 251 | this.handleCopyToClipboard(message.metadataTypes); 252 | return; 253 | 254 | case 'OPEN_URL': 255 | console.log('onDidReceiveMessage OPEN_URL'); 256 | this.openUrl(message.url); 257 | return; 258 | //Added for Ui Changes - ends 259 | 260 | } 261 | }, 262 | null, 263 | this._disposables 264 | ); 265 | } 266 | 267 | private buildPackageXML(selectedNodes,isCopyToClipboard){ 268 | console.log('Invoked buildPackageXML'); 269 | if(!selectedNodes || selectedNodes.length==0){ 270 | vscode.window.showErrorMessage("Please select components for package.xml"); 271 | return; 272 | } 273 | 274 | let mpPackage=this.buildPackageMap(selectedNodes); 275 | this.generatePackageXML(mpPackage,isCopyToClipboard); 276 | 277 | } 278 | 279 | private buildPackageMap(selectedNodes){ 280 | console.log('Invoked buildPackageMap'); 281 | let mpPackage=new Map(); 282 | 283 | for(let i=0;i{ 405 | console.log(result); 406 | vscode.window.showInformationMessage("Contents Copied to Clipboard successfully!!"); 407 | }); 408 | 409 | }else{ 410 | fs.writeFile(vscode.workspace.workspaceFolders[0].uri.fsPath+"/manifest/package.xml", xmlString, (err) => { 411 | if (err) { 412 | console.log(err); 413 | vscode.window.showErrorMessage(err); 414 | } 415 | console.log("Successfully Written to File."); 416 | vscode.workspace.openTextDocument(vscode.workspace.workspaceFolders[0].uri.fsPath+"/manifest/package.xml").then(data =>{ 417 | console.log('Opened '+ data.fileName); 418 | vscode.window.showTextDocument(data); 419 | }); 420 | }); 421 | } 422 | 423 | 424 | } 425 | 426 | private fetchChildren(metadataType){ 427 | console.log('Invoked fetchChildren'); 428 | let mType=metadataType.id; 429 | //Modified for UI Changes - starts 430 | //let node = metadataType.original; 431 | let node = metadataType; 432 | //Modified for UI Changes - ends 433 | console.log('Invoked fetchChildren '+JSON.stringify(node) ); 434 | 435 | if(!node.inFolder){ 436 | 437 | vscode.window.withProgress({ 438 | location: vscode.ProgressLocation.Notification, 439 | title: "Processing Metadata : "+mType, 440 | cancellable: true 441 | }, (progress, token) => { 442 | 443 | token.onCancellationRequested(() => { 444 | console.log("User canceled the long running operation"); 445 | }); 446 | 447 | 448 | 449 | var p = new Promise(resolve => { 450 | let sfdxCmd ="sf org list metadata --api-version "+this.VERSION_NUM+" --json -m "+mType; 451 | let foo: child.ChildProcess = child.exec(sfdxCmd,{ 452 | maxBuffer: 1024 * 1024 * 8, 453 | cwd: vscode.workspace.workspaceFolders[0].uri.fsPath 454 | }); 455 | 456 | let bufferOutData=''; 457 | 458 | foo.stdout.on("data",(dataArg : any)=> { 459 | console.log('stdout: ' + dataArg); 460 | bufferOutData+=dataArg; 461 | 462 | /*let data = JSON.parse(dataArg); 463 | let depArr=[]; 464 | let results = data.result; 465 | this._panel.webview.postMessage({ command: 'listmetadata', results : results , metadataType : mType}); 466 | resolve();*/ 467 | }); 468 | 469 | foo.stderr.on("data",(data : any)=> { 470 | console.log('stderr: ' + data); 471 | //vscode.window.showErrorMessage(data); 472 | resolve(undefined); 473 | }); 474 | 475 | foo.stdin.on("data",(data : any)=> { 476 | console.log('stdin: ' + data); 477 | //vscode.window.showErrorMessage(data); 478 | resolve(undefined); 479 | }); 480 | 481 | foo.on('exit',(code,signal)=>{ 482 | console.log('exit code '+code); 483 | console.log('bufferOutData '+bufferOutData); 484 | 485 | let data = JSON.parse(bufferOutData); 486 | let depArr=[]; 487 | let results = data.result; 488 | this._panel.webview.postMessage({ command: 'listmetadata', results : results , metadataType : mType}); 489 | resolve(); 490 | }); 491 | 492 | }); 493 | 494 | return p; 495 | 496 | }); 497 | 498 | 499 | 500 | 501 | 502 | 503 | }else{ 504 | //get the folder 505 | 506 | let folderType = this.reportFolderMap[mType]; 507 | let sfdxCmd ="sf org list metadata --json --api-version "+this.VERSION_NUM+" -m "+folderType; 508 | 509 | vscode.window.withProgress({ 510 | location: vscode.ProgressLocation.Notification, 511 | title: "Processing Metadata : "+folderType, 512 | cancellable: true 513 | }, (progress, token) => { 514 | token.onCancellationRequested(() => { 515 | console.log("User canceled the long running operation") 516 | }); 517 | 518 | 519 | 520 | var p = new Promise(resolve => { 521 | let foo: child.ChildProcess = child.exec(sfdxCmd,{ 522 | maxBuffer: 1024 * 1024 * 6, 523 | cwd: vscode.workspace.workspaceFolders[0].uri.fsPath 524 | }); 525 | 526 | let bufferOutData=''; 527 | 528 | foo.stdout.on("data",(dataArg : any)=> { 529 | console.log('stdout: ' + dataArg); 530 | bufferOutData+=dataArg; 531 | 532 | /*let data = JSON.parse(dataArg); 533 | let folderNames=[]; 534 | let results = data.result; 535 | 536 | if(!results || results.length==0){ 537 | //no folders 538 | this._panel.webview.postMessage({ command: 'listmetadata', results : results , metadataType : mType}); 539 | return; 540 | }else if(!Array.isArray(results)){ 541 | //1 folder 542 | folderNames.push(results.fullName); 543 | }else{ 544 | //many folders 545 | for(let i=0;i { 557 | console.log('stderr: ' + data); 558 | //vscode.window.showErrorMessage(data); 559 | resolve(undefined); 560 | }); 561 | 562 | foo.stdin.on("data",(data : any)=> { 563 | console.log('stdin: ' + data); 564 | resolve(undefined); 565 | }); 566 | 567 | foo.on('exit',(code,signal)=>{ 568 | console.log('exit code '+code); 569 | console.log('bufferOutData '+bufferOutData); 570 | 571 | let data = JSON.parse(bufferOutData); 572 | let folderNames=[]; 573 | let results = data.result; 574 | 575 | if(!results || results.length==0){ 576 | //no folders 577 | this._panel.webview.postMessage({ command: 'listmetadata', results : results , metadataType : mType}); 578 | return; 579 | }else if(!Array.isArray(results)){ 580 | //1 folder 581 | folderNames.push(results.fullName); 582 | }else{ 583 | //many folders 584 | for(let i=0;i { 631 | 632 | token.onCancellationRequested(() => { 633 | console.log("User canceled the long running operation"); 634 | }); 635 | 636 | 637 | 638 | var p = new Promise(resolve => { 639 | let sfdxCmd ="sf org list metadata --json --api-version "+this.VERSION_NUM+" -m "+mType; 640 | let foo: child.ChildProcess = child.exec(sfdxCmd,{ 641 | maxBuffer: 1024 * 1024 * 6, 642 | cwd: vscode.workspace.workspaceFolders[0].uri.fsPath 643 | }); 644 | 645 | let bufferOutData=''; 646 | 647 | foo.stdout.on("data",(dataArg : any)=> { 648 | console.log('stdout: ' + dataArg); 649 | bufferOutData+=dataArg; 650 | 651 | /*let data = JSON.parse(dataArg); 652 | let depArr=[]; 653 | let results = data.result; 654 | this._panel.webview.postMessage({ command: 'listmetadata', results : results , metadataType : mType}); 655 | resolve();*/ 656 | }); 657 | 658 | foo.stderr.on("data",(data : any)=> { 659 | console.log('stderr: ' + data); 660 | //vscode.window.showErrorMessage(data); 661 | resolve(undefined); 662 | }); 663 | 664 | foo.stdin.on("data",(data : any)=> { 665 | console.log('stdin: ' + data); 666 | //vscode.window.showErrorMessage(data); 667 | resolve(undefined); 668 | }); 669 | 670 | foo.on('exit',(code,signal)=>{ 671 | console.log('exit code '+code); 672 | console.log('bufferOutData '+bufferOutData); 673 | 674 | let data = JSON.parse(bufferOutData); 675 | let depArr=[]; 676 | let results = data.result; 677 | this._panel.webview.postMessage({ command: 'listmetadata', results : results , metadataType : mType}); 678 | resolve(undefined); 679 | this.fetchAllChildren(selectedMetadata,skippedMetadataTypes,++index);//recurse through other metadata 680 | }); 681 | 682 | }); 683 | 684 | return p; 685 | 686 | }); 687 | 688 | } 689 | public getComponentsInsideFolders(folderNames,mType,index,resultsArr){ 690 | if(index==folderNames.length){ 691 | this._panel.webview.postMessage({ command: 'listmetadata', results : resultsArr , metadataType : mType}); 692 | return; 693 | } 694 | 695 | 696 | vscode.window.withProgress({ 697 | location: vscode.ProgressLocation.Notification, 698 | title: "Processing Metadata : "+mType+":"+folderNames[index], 699 | cancellable: true 700 | }, (progress, token) => { 701 | token.onCancellationRequested(() => { 702 | console.log("User canceled the long running operation") 703 | }); 704 | 705 | 706 | 707 | var p = new Promise(resolve => { 708 | let sfdxCmd ="sf org list metadata --json --api-version "+this.VERSION_NUM+" -m "+mType+" --folder "+folderNames[index]; 709 | let foo: child.ChildProcess = child.exec(sfdxCmd,{ 710 | maxBuffer: 1024 * 1024 * 6, 711 | cwd: vscode.workspace.workspaceFolders[0].uri.fsPath 712 | }); 713 | 714 | let bufferOutData=''; 715 | 716 | foo.stdout.on("data",(dataArg : any)=> { 717 | console.log('stdout: ' + dataArg); 718 | bufferOutData+=dataArg; 719 | 720 | /*let data = JSON.parse(dataArg); 721 | let depArr=[]; 722 | let results = data.result; 723 | 724 | if(results){ 725 | if(!Array.isArray(results)){ 726 | //1 folder 727 | resultsArr.push(results); 728 | }else{ 729 | //many folders 730 | for(let i=0;i { 744 | console.log('stderr: ' + data); 745 | //vscode.window.showErrorMessage(data); 746 | resolve(undefined); 747 | }); 748 | 749 | foo.stdin.on("data",(data : any)=> { 750 | console.log('stdin: ' + data); 751 | resolve(undefined); 752 | }); 753 | 754 | foo.on('exit',(code,signal)=>{ 755 | console.log('exit code '+code); 756 | console.log('bufferOutData '+bufferOutData); 757 | 758 | let data = JSON.parse(bufferOutData); 759 | let depArr=[]; 760 | let results = data.result; 761 | 762 | if(results){ 763 | if(!Array.isArray(results)){ 764 | //1 folder 765 | resultsArr.push(results); 766 | }else{ 767 | //many folders 768 | for(let i=0;i{ 812 | this.getMetadataTypes(mpExistingPackageXML); 813 | }).catch(err=>{ 814 | console.log(err); 815 | });*/ 816 | //Commented for Ui Changes - ends 817 | 818 | 819 | } 820 | 821 | //Added for UI Changes - starts 822 | private handleInitLoadRequest(){ 823 | this.readExistingPackageXML().then(mpExistingPackageXML=>{ 824 | this.getMetadataTypes(mpExistingPackageXML); 825 | }).catch(err=>{ 826 | console.log(err); 827 | }); 828 | } 829 | 830 | private handleUpdatePackageXml(metadataTypes){ 831 | const mpPackage =this.buildSelectedMetadataMap(metadataTypes); 832 | if(mpPackage.size==0){ 833 | vscode.window.showErrorMessage("Please select components for package.xml"); 834 | return; 835 | } 836 | this.generatePackageXML(mpPackage,false); 837 | } 838 | 839 | private handleCopyToClipboard(metadataTypes){ 840 | const mpPackage =this.buildSelectedMetadataMap(metadataTypes); 841 | if(mpPackage.size==0){ 842 | vscode.window.showErrorMessage("Please select components for package.xml"); 843 | return; 844 | } 845 | this.generatePackageXML(mpPackage,true); 846 | } 847 | 848 | private openUrl(url){ 849 | vscode.commands.executeCommand('vscode.open', vscode.Uri.parse(url)); 850 | } 851 | 852 | private buildSelectedMetadataMap(metadataTypes){ 853 | const mpPackage = new Map(); 854 | 855 | if(!metadataTypes || metadataTypes.length==0){ 856 | return mpPackage; 857 | } 858 | 859 | metadataTypes.forEach(metadataType => { 860 | if(metadataType.isSelected){ 861 | //Add to Map 862 | if(this.regExpArr.includes(metadataType.id)){ 863 | //accepts * 864 | mpPackage.set(metadataType.id,['*']); 865 | }else{ 866 | const childrenArr=metadataType.children.map(child=>child.text); 867 | mpPackage.set(metadataType.id,childrenArr); 868 | } 869 | }else if (metadataType.isIndeterminate){ 870 | const childrenArr=[]; 871 | metadataType.children.forEach(child=>{ 872 | if(child.isSelected){ 873 | childrenArr.push(child.text); 874 | } 875 | }); 876 | mpPackage.set(metadataType.id,childrenArr); 877 | } 878 | }); 879 | 880 | return mpPackage; 881 | } 882 | //Added for UI Changes - ends 883 | 884 | private readExistingPackageXML(){ 885 | console.log('Read existing packge.xml'); 886 | let mpExistingPackageXML={}; 887 | let parser = new xml2js.Parser(); 888 | 889 | return new Promise((resolve,reject)=>{ 890 | fs.readFile(vscode.workspace.workspaceFolders[0].uri.fsPath+"/manifest/package.xml", function(err, data) { 891 | if(err){ 892 | console.error(err); 893 | resolve(mpExistingPackageXML); 894 | } 895 | parser.parseString(data, function (err, result) { 896 | if(err){ 897 | console.error(err); 898 | resolve(mpExistingPackageXML); 899 | //return; 900 | } 901 | console.log('Existing package.xml'); 902 | console.log(JSON.stringify(result)); 903 | ///mpExistingPackageXML=this.putExistingPackageXMLInMap(result); 904 | if(!result || !result.Package || !result.Package.types){ 905 | resolve(mpExistingPackageXML); 906 | } 907 | 908 | let types=result.Package.types; 909 | for(let i=0;i { 945 | token.onCancellationRequested(() => { 946 | console.log("User canceled the long running operation") 947 | }); 948 | 949 | console.log("vscode.workspace.workspaceFolders[0].uri.fsPath "+vscode.workspace.workspaceFolders[0].uri.fsPath); 950 | 951 | var p = new Promise(resolve => { 952 | var foo: child.ChildProcess = child.exec('sf org list metadata-types --api-version '+this.VERSION_NUM+' --json',{ 953 | maxBuffer: 1024 * 1024 * 6, 954 | cwd: vscode.workspace.workspaceFolders[0].uri.fsPath 955 | }); 956 | let bufferOutData=''; 957 | foo.stdout.on("data",(dataArg : any)=> { 958 | 959 | console.log('dataArg '+dataArg); 960 | bufferOutData+=dataArg; 961 | /*let data = JSON.parse(dataArg); 962 | let depArr=[]; 963 | let metadataObjectsArr = data.result.metadataObjects; 964 | 965 | for(let index=0;index { 975 | console.log('stderr: ' + data); 976 | //vscode.window.showErrorMessage(data); 977 | resolve(undefined); 978 | }); 979 | 980 | foo.stdin.on("data",(data : any)=> { 981 | console.log('stdin: ' + data); 982 | resolve(undefined); 983 | }); 984 | 985 | foo.on("exit", (code: number, signal: string) => { 986 | console.log("exited with code "+code); 987 | console.log("bufferOutData "+bufferOutData); 988 | resolve(undefined); 989 | let data = JSON.parse(bufferOutData); 990 | let depArr=[]; 991 | let metadataObjectsArr = data.result.metadataObjects; 992 | 993 | for(let index=0;index { 1020 | if(entrypoint.endsWith('.js')){ 1021 | scriptEntryPoints.push(entrypoint); 1022 | }else{ 1023 | styleEntryPoints.push(entrypoint); 1024 | } 1025 | }); 1026 | 1027 | 1028 | const scriptPathOnDisk = vscode.Uri.file(path.join(this._extensionPath,'client', 'build', scriptEntryPoints[0])); 1029 | //const scriptUri = scriptPathOnDisk.with({ scheme: 'vscode-resource' }); 1030 | const scriptUri = this._panel.webview.asWebviewUri(scriptPathOnDisk); 1031 | 1032 | const runtimeScriptPathOnDisk = vscode.Uri.file(path.join(this._extensionPath,'client', 'build', scriptEntryPoints[1])); 1033 | //const runtimeScriptUri = runtimeScriptPathOnDisk.with({ scheme: 'vscode-resource' }); 1034 | const runtimeScriptUri = this._panel.webview.asWebviewUri(runtimeScriptPathOnDisk); 1035 | 1036 | const staticScriptPathOnDisk = vscode.Uri.file(path.join(this._extensionPath,'client', 'build', scriptEntryPoints[2])); 1037 | //const staticScriptUri = staticScriptPathOnDisk.with({ scheme: 'vscode-resource' }); 1038 | const staticScriptUri = this._panel.webview.asWebviewUri(staticScriptPathOnDisk); 1039 | 1040 | const stylePathOnDisk = vscode.Uri.file(path.join(this._extensionPath, 'client','build', styleEntryPoints[0])); 1041 | //const styleUri = stylePathOnDisk.with({ scheme: 'vscode-resource' }); 1042 | const styleUri = this._panel.webview.asWebviewUri(stylePathOnDisk); 1043 | console.log(`scriptUri ${scriptUri}`); 1044 | console.log(`styleUri ${styleUri}`); 1045 | //Added for UI Changes - ends 1046 | //Commented for UI Changes - starts 1047 | /* 1048 | // Local path to main script run in the webview 1049 | const scriptPathOnDisk = vscode.Uri.file( 1050 | path.join(this._extensionPath, 'media', 'main.js') 1051 | ); 1052 | 1053 | // And the uri we use to load this script in the webview 1054 | const scriptUri = scriptPathOnDisk.with({ scheme: 'vscode-resource' }); 1055 | */ 1056 | //Commented for UI Changes - ends 1057 | // Use a nonce to whitelist which scripts can be run 1058 | const nonce = getNonce(); 1059 | 1060 | // Base CSP directive 1061 | const cspSource = this._panel.webview.cspSource; 1062 | 1063 | // Define the allowed resources path 1064 | const resourcePathUri = this._panel.webview.asWebviewUri(vscode.Uri.file(path.join(this._extensionPath, ''))); 1065 | 1066 | return ` 1067 | 1068 | 1069 | 1070 | 1071 | 1075 | 1076 | 1077 | 1083 | 1084 | 1088 | 1089 | 1090 | 1091 | 1092 | Add Components 1093 | 1094 | 1095 | 1096 | 1097 | 1098 | 1099 | 1118 | 1119 | 1120 | 1121 | 1122 |
1123 | 1126 | 1127 | 1128 | 1129 | 1130 | 1131 | `; 1132 | } 1133 | } 1134 | 1135 | function getNonce() { 1136 | let text = ''; 1137 | const possible = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; 1138 | for (let i = 0; i < 32; i++) { 1139 | text += possible.charAt(Math.floor(Math.random() * possible.length)); 1140 | } 1141 | return text; 1142 | } 1143 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "NodeNext", 4 | "moduleResolution": "NodeNext", 5 | "resolveJsonModule": true, 6 | //"module": "Node16", 7 | "target": "ESNext", 8 | "outDir": "out", 9 | "lib": ["ESNext"], 10 | "sourceMap": true, 11 | "rootDir": "src" 12 | }, 13 | "exclude": ["node_modules", ".vscode-test"] 14 | } 15 | -------------------------------------------------------------------------------- /tslint.json: -------------------------------------------------------------------------------- 1 | { 2 | "rules": { 3 | "indent": [true, "tabs"], 4 | "semicolon": [true, "always"] 5 | } 6 | } --------------------------------------------------------------------------------