├── .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 | 
13 |
14 | 
15 |
16 | ## How to use?
17 | [Click to view the Youtube Video](https://youtu.be/uXwIMh8bK0A)
18 |
19 | [](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 You need to enable JavaScript to run this 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 | You need to enable JavaScript to run this app.
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 | }>
56 | Update Package.xml
57 |
58 | }>
63 | Copy To Clipboard
64 |
65 | }>
70 | How To
71 |
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 | Select All
109 | Clear All
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 | Select All
107 | Clear All
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 | You need to enable JavaScript to run this app.
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 | You need to enable JavaScript to run this app.
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 | }
--------------------------------------------------------------------------------