├── .sfdx
├── orgs
│ └── test-d7njhea2fazi@example.com
│ │ ├── maxrevision.json
│ │ ├── sourcePathInfos.json
│ │ └── sourcePathInfos.json.bak
└── sfdx-config.json
├── .DS_Store
├── .gitignore
├── force-app
└── main
│ └── default
│ ├── lwc
│ ├── .eslintrc.json
│ ├── .DS_Store
│ ├── demoAsync
│ │ ├── demoAsync.js-meta.xml
│ │ ├── demoAsync.html
│ │ └── demoAsync.js
│ └── jsconfig.json
│ ├── tabs
│ └── Demo.tab-meta.xml
│ ├── permissionsets
│ └── AsyncJS.permissionset-meta.xml
│ ├── flexipages
│ ├── Async_JS_UtilityBar.flexipage-meta.xml
│ └── Demo.flexipage-meta.xml
│ ├── applications
│ └── AsyncJS.app-meta.xml
│ └── appMenus
│ └── AppSwitcher.appMenu-meta.xml
├── .vscode
├── settings.json
└── tasks.json
├── @ELTOROIT
└── scripts
│ ├── AnonymousApex.txt
│ └── CreateOrg.sh
├── sfdx-project.json
├── .prettierrc
├── config
└── project-scratch-def.json
├── .forceignore
└── README.md
/.sfdx/orgs/test-d7njhea2fazi@example.com/maxrevision.json:
--------------------------------------------------------------------------------
1 | 20
--------------------------------------------------------------------------------
/.sfdx/sfdx-config.json:
--------------------------------------------------------------------------------
1 | {
2 | "defaultusername": "AsyncJS"
3 | }
--------------------------------------------------------------------------------
/.DS_Store:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/eltoroit/ETAsyncJS/HEAD/.DS_Store
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | .sfdx
2 | .DS_Store
3 | jsconfig.json
4 | .vscode/settings.json
5 | node_modules
6 |
--------------------------------------------------------------------------------
/force-app/main/default/lwc/.eslintrc.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "@salesforce/eslint-config-lwc/recommended"
3 | }
--------------------------------------------------------------------------------
/force-app/main/default/lwc/.DS_Store:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/eltoroit/ETAsyncJS/HEAD/force-app/main/default/lwc/.DS_Store
--------------------------------------------------------------------------------
/.vscode/settings.json:
--------------------------------------------------------------------------------
1 | {
2 | "eslint.nodePath": "/Users/aperez/.vscode/extensions/salesforce.salesforcedx-vscode-lwc-47.17.1/node_modules",
3 | "salesforcedx-vscode-core.show-cli-success-msg": false
4 | }
--------------------------------------------------------------------------------
/@ELTOROIT/scripts/AnonymousApex.txt:
--------------------------------------------------------------------------------
1 | //Enable debug mode for the default scratch org user
2 | User defaultUser = [SELECT Id FROM User WHERE Id = :UserInfo.getUserId()];
3 | defaultUser.UserPreferencesUserDebugModePref = true;
4 | update defaultUser;
--------------------------------------------------------------------------------
/sfdx-project.json:
--------------------------------------------------------------------------------
1 | {
2 | "packageDirectories": [
3 | {
4 | "path": "force-app",
5 | "default": true
6 | }
7 | ],
8 | "namespace": "",
9 | "sfdcLoginUrl": "https://login.salesforce.com",
10 | "sourceApiVersion": "47.0"
11 | }
--------------------------------------------------------------------------------
/force-app/main/default/tabs/Demo.tab-meta.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | Created by Lightning App Builder
4 | Demo
5 | Demo
6 | Custom63: Chip
7 |
8 |
--------------------------------------------------------------------------------
/.prettierrc:
--------------------------------------------------------------------------------
1 | {
2 | "trailingComma": "none",
3 | "useTabs": true,
4 | "tabWidth": 4,
5 | "printWidth": 150,
6 | "overrides": [
7 | {
8 | "files": "**/lwc/**/*.html",
9 | "options": { "parser": "lwc" }
10 | },
11 | {
12 | "files": "*.{cmp,page,component}",
13 | "options": { "parser": "html" }
14 | }
15 | ]
16 | }
17 |
--------------------------------------------------------------------------------
/force-app/main/default/lwc/demoAsync/demoAsync.js-meta.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | 47.0
4 | true
5 |
6 | lightning__AppPage
7 |
8 |
--------------------------------------------------------------------------------
/config/project-scratch-def.json:
--------------------------------------------------------------------------------
1 | {
2 | "orgName": "AW Computing",
3 | "edition": "Developer",
4 | "settings": {
5 | "lightningExperienceSettings": {
6 | "enableS1DesktopEnabled": true
7 | },
8 | "mobileSettings": {
9 | "enableS1EncryptedStoragePref2": false
10 | },
11 | "languageSettings": {
12 | "enableTranslationWorkbench": true
13 | }
14 | }
15 | }
--------------------------------------------------------------------------------
/.forceignore:
--------------------------------------------------------------------------------
1 | # List files or directories below to ignore them when running force:source:push, force:source:pull, and force:source:status
2 | # More information: https://developer.salesforce.com/docs/atlas.en-us.sfdx_dev.meta/sfdx_dev/sfdx_dev_exclude_source.htm
3 | #
4 |
5 | package.xml
6 |
7 | # LWC configuration files
8 | **/jsconfig.json
9 | **/.eslintrc.json
10 |
11 | # LWC Jest
12 | **/__tests__/**
13 |
14 | # Igenore this...
15 | **/profiles/**
--------------------------------------------------------------------------------
/force-app/main/default/lwc/jsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "experimentalDecorators": true,
4 | "baseUrl": ".",
5 | "paths": {
6 | "c/demoAsync": [
7 | "demoAsync/demoAsync.js"
8 | ]
9 | }
10 | },
11 | "include": [
12 | "**/*",
13 | "../../../../.sfdx/typings/lwc/**/*.d.ts"
14 | ],
15 | "typeAcquisition": {
16 | "include": [
17 | "jest"
18 | ]
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/.vscode/tasks.json:
--------------------------------------------------------------------------------
1 | {
2 | // See https://go.microsoft.com/fwlink/?LinkId=733558
3 | // for the documentation about the tasks.json format
4 | "version": "2.0.0",
5 | "tasks": [{
6 | "label": "ELTOROIT PushWhenBuild",
7 | "type": "shell",
8 | "command": "sfdx force:source:push --json",
9 | "group": {
10 | "kind": "build",
11 | "isDefault": true
12 | },
13 | "presentation": {
14 | "reveal": "always",
15 | "panel": "dedicated",
16 | "clear": true,
17 | "focus": false,
18 | "showReuseMessage": true
19 | }
20 | }]
21 | }
22 |
--------------------------------------------------------------------------------
/force-app/main/default/permissionsets/AsyncJS.permissionset-meta.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | AsyncJS
5 | true
6 |
7 | false
8 | AsyncJS
9 |
10 | Demo
11 | Visible
12 |
13 |
14 |
--------------------------------------------------------------------------------
/force-app/main/default/flexipages/Async_JS_UtilityBar.flexipage-meta.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | utilityItems
5 | Region
6 |
7 |
8 | backgroundComponents
9 | Background
10 |
11 | Async JS UtilityBar
12 |
13 | one:utilityBarTemplateDesktop
14 |
15 | UtilityBar
16 |
17 |
--------------------------------------------------------------------------------
/force-app/main/default/applications/AsyncJS.app-meta.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | #0070D2
5 | false
6 |
7 | Large
8 | false
9 | false
10 | Async JS
11 | Standard
12 | standard-home
13 | Demo
14 | Lightning
15 | Async_JS_UtilityBar
16 |
17 |
--------------------------------------------------------------------------------
/force-app/main/default/flexipages/Demo.flexipage-meta.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | region1
5 | Region
6 |
7 |
8 |
9 | demoAsync
10 |
11 | region2
12 | Region
13 |
14 |
15 | region3
16 | Region
17 |
18 | Demo
19 |
20 | flexipage:appHomeTemplateHeaderTwoColumnsLeftSidebar
21 |
22 | AppPage
23 |
24 |
--------------------------------------------------------------------------------
/@ELTOROIT/scripts/CreateOrg.sh:
--------------------------------------------------------------------------------
1 | # Execute in Mac using: ./@ELTOROIT/scripts/CreateOrg.sh
2 | ### START: Functions
3 | function showStatus() {
4 | echo "\033[35m$1\033[0m"
5 | }
6 | function showPrompt() {
7 | echo "\033[31mOperation Completed\033[0m"
8 | # echo "\033[31m$1\033[0m"
9 | # pause 'Press [Enter] key to continue...'
10 | }
11 | function pause(){
12 | read -p "$*"
13 | }
14 | ### END: Functions
15 |
16 | # ---
17 | showStatus "*** Creating scratch Org..."
18 | sfdx force:org:create -f config/project-scratch-def.json --setdefaultusername --setalias AsyncJS -d 1
19 | showPrompt "Confirm..."
20 |
21 | # ---
22 | showStatus "*** Opening scratch Org..."
23 | sfdx force:org:open
24 | showPrompt "Confirm..."
25 |
26 | # ---
27 | ### Winter '20, Org had to be configured for app pages to work on multipe factors. No need for Spring '20
28 | ### sfdx force:org:open --path=/lightning/setup/SalesforceMobileAppQuickStart/home
29 | ### showPrompt "Configure metadata before pushing"
30 |
31 | # ---
32 | showStatus "*** Pushing metadata to scratch Org..."
33 | sfdx force:source:push
34 | showPrompt "Confirm..."
35 |
36 | # ---
37 | showStatus "*** Assigning permission set to your user..."
38 | sfdx force:user:permset:assign --permsetname AsyncJS --json
39 | showPrompt "Confirm..."
40 |
41 | # ---
42 | showStatus "*** Execute Anonymous Apex..."
43 | sfdx force:apex:execute -f './@ELTOROIT/scripts/AnonymousApex.txt'
44 | showPrompt "Confirm..."
45 |
46 | ---
47 | # showStatus "*** Creating data using ETCopyData plugin"
48 | # sfdx ETCopyData:export -c './@ELTOROIT/data' --loglevel trace --json
49 | # sfdx ETCopyData:import -c './@ELTOROIT/data' --loglevel trace --json
50 | # showPrompt "Confirm..."
51 |
52 | # ---
53 | # showStatus "Runing Apex tests"
54 | # sfdx force:apex:test:run --codecoverage --synchronous --verbose --json --resultformat json | jq 'del(.result.tests, .result.coverage)' --json
55 | # showPrompt "Confirm..."
56 |
57 | # ---
58 | # showStatus "*** Generate Password..."
59 | # sfdx force:user:password:generate --json
60 | # sfdx force:user:display
61 | # showPrompt "Confirm..."
62 |
63 |
64 |
65 |
66 |
--------------------------------------------------------------------------------
/force-app/main/default/appMenus/AppSwitcher.appMenu-meta.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | standard__Platform
5 | CustomApplication
6 |
7 |
8 | standard__Sales
9 | CustomApplication
10 |
11 |
12 | standard__Service
13 | CustomApplication
14 |
15 |
16 | standard__Marketing
17 | CustomApplication
18 |
19 |
20 | standard__ServiceConsole
21 | CustomApplication
22 |
23 |
24 | standard__AppLauncher
25 | CustomApplication
26 |
27 |
28 | standard__Community
29 | CustomApplication
30 |
31 |
32 | standard__Sites
33 | CustomApplication
34 |
35 |
36 | standard__Chatter
37 | CustomApplication
38 |
39 |
40 | standard__Content
41 | CustomApplication
42 |
43 |
44 | standard__Insights
45 | CustomApplication
46 |
47 |
48 | standard__LightningSales
49 | CustomApplication
50 |
51 |
52 | standard__AllTabSet
53 | CustomApplication
54 |
55 |
56 | CPQIntegrationUserApp
57 | ConnectedApp
58 |
59 |
60 | standard__LightningBolt
61 | CustomApplication
62 |
63 |
64 | AsyncJS
65 | CustomApplication
66 |
67 |
68 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Asynchronous JavaScript using Salesforce Lightning Web Components (LWC)
2 |
3 |
4 |
5 |
6 |
7 | This week I was teaching [a class on LWC](https://trailhead.salesforce.com/en/academy/classes/dex602-programming-lightning-web-components/) in Chicago, IL and the students asked me about asynchronous JavaScript. Being such an important topic, I built a simple demo that I have cleaned a bit to explains the different ways to work with Asynchronous JavaScript from LWC.
8 |
9 | This is the idea behind this simple demo: We have three operations (A, B, C) which can take any amount of time to complete, therefore we need to execute them asynchronously. As a matter of fact, you control when each of these processes finishes and in which order by toggling their button on the screen, or you can fail the operations to see the exception behavior.
10 |
11 | I have created a repo for this SFDX project with the LWC code ([click here to view it](https://github.com/eltoroit/ETAsyncJS))
12 |
13 |
14 |
15 |
16 |
17 | The operations can be done in three different scenarios:
18 |
19 | - Any Order: The operations run in parallel and we can take some action when any of those finish in the order they are completing. The code can be written with Callbacks _anyOrderCallback()_, Promises _anyOrderPromises()_ but Async/Await can’t be used here.
20 | - Serial: The operations have to be completed in serial mode. We must complete A, before starting B, and finish B before starting C. The operation will only complete if the correct toggle is used. The code can be written with Callbacks _serialCallback()_, Promises _serialPromises()_ or Async/Await _serialAsyncAwait()_.
21 | - After All: This last operation can only be done with Promises _afterAllPromises()_. The idea is that we will wait until all the operations have completed, regardless of the order. This is a good technique if you want to download some files for example, and we do not care about the order in which they arrive, we only care that all of them have arrived.
22 |
23 | I will now wait asynchronously for your feedback and comments :-)
24 |
--------------------------------------------------------------------------------
/force-app/main/default/lwc/demoAsync/demoAsync.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
17 |
18 |
19 |
27 |
28 |
29 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
--------------------------------------------------------------------------------
/force-app/main/default/lwc/demoAsync/demoAsync.js:
--------------------------------------------------------------------------------
1 | /* eslint-disable no-console */
2 | /* eslint-disable @lwc/lwc/no-async-operation */
3 | /* eslint-disable no-alert */
4 | import { LightningElement, track } from "lwc";
5 |
6 | export default class DemoAsync extends LightningElement {
7 | @track stoppedA = false;
8 | @track stoppedB = false;
9 | @track stoppedC = false;
10 | @track failed = false;
11 |
12 | // Toggles
13 | handleChangeA(event) {
14 | this.stoppedA = event.target.checked;
15 | }
16 | handleChangeB(event) {
17 | this.stoppedB = event.target.checked;
18 | }
19 | handleChangeC(event) {
20 | this.stoppedC = event.target.checked;
21 | }
22 |
23 | // Buttons
24 | fail() {
25 | this.failed = true;
26 | }
27 | reset() {
28 | console.log("Reset");
29 | this.stoppedA = false;
30 | this.stoppedB = false;
31 | this.stoppedC = false;
32 | this.failed = false;
33 | }
34 |
35 | // Any Order
36 | anyOrderCallback() {
37 | this.reset();
38 | console.log("Callback started");
39 | this.waitForToggleCallback("A", (whichOne, success) => {
40 | console.log(`${whichOne} completed: Success? ${success}`);
41 | });
42 | this.waitForToggleCallback("B", (whichOne, success) => {
43 | console.log(`${whichOne} completed: Success? ${success}`);
44 | });
45 | this.waitForToggleCallback("C", (whichOne, success) => {
46 | console.log(`${whichOne} completed: Success? ${success}`);
47 | });
48 | }
49 | anyOrderPromises() {
50 | this.reset();
51 | console.log("Promises started");
52 | this.waitForTogglePromise("A")
53 | .then(whichOne => {
54 | console.log(`${whichOne} completed: Success? TRUE`);
55 | })
56 | .catch(whichOne => {
57 | console.log(`${whichOne} completed: Success? FALSE`);
58 | });
59 | this.waitForTogglePromise("B")
60 | .then(whichOne => {
61 | console.log(`${whichOne} completed: Success? TRUE`);
62 | })
63 | .catch(whichOne => {
64 | console.log(`${whichOne} completed: Success? FALSE`);
65 | });
66 | this.waitForTogglePromise("C")
67 | .then(whichOne => {
68 | console.log(`${whichOne} completed: Success? TRUE`);
69 | })
70 | .catch(whichOne => {
71 | console.log(`${whichOne} completed: Success? FALSE`);
72 | });
73 | }
74 |
75 | // Serial
76 | serialCallback() {
77 | this.reset();
78 | console.log("Callback serial");
79 | this.waitForToggleCallback("A", (whichOne1, success1) => {
80 | console.log(`${whichOne1} completed: Success? ${success1}`);
81 | this.stoppedB = false;
82 | this.stoppedC = false;
83 | this.waitForToggleCallback("B", (whichOne2, success2) => {
84 | console.log(`${whichOne2} completed: Success? ${success2}`);
85 | this.stoppedC = false;
86 | this.waitForToggleCallback("C", (whichOne3, success3) => {
87 | console.log(`${whichOne3} completed: Success? ${success3}`);
88 | });
89 | });
90 | });
91 | }
92 | serialPromises() {
93 | this.reset();
94 | console.log("Promises serial");
95 |
96 | this.waitForTogglePromise("A")
97 | .then(whichOne => {
98 | console.log(`${whichOne} completed: Success? TRUE`);
99 | this.stoppedB = false;
100 | this.stoppedC = false;
101 | return this.waitForTogglePromise("B");
102 | })
103 | .then(whichOne => {
104 | console.log(`${whichOne} completed: Success? TRUE`);
105 | this.stoppedC = false;
106 | return this.waitForTogglePromise("C");
107 | })
108 | .then(whichOne => {
109 | console.log(`${whichOne} completed: Success? TRUE`);
110 | })
111 | .catch(whichOne => {
112 | console.log(`${whichOne} completed: Success? FALSE`);
113 | });
114 | }
115 | async serialAsyncAwait() {
116 | this.reset();
117 | console.log("Async/Await started");
118 |
119 | let whichOne;
120 | try {
121 | whichOne = await this.waitForTogglePromise("A");
122 | console.log(`${whichOne} completed: Success? TRUE`);
123 | this.stoppedB = false;
124 | this.stoppedC = false;
125 | whichOne = await this.waitForTogglePromise("B");
126 | console.log(`${whichOne} completed: Success? TRUE`);
127 | this.stoppedC = false;
128 | whichOne = await this.waitForTogglePromise("C");
129 | console.log(`${whichOne} completed: Success? TRUE`);
130 | } catch (ex) {
131 | console.log("Error", ex);
132 | }
133 | }
134 |
135 | // After All
136 | afterAllPromises() {
137 | this.reset();
138 | console.log("All, any order");
139 | let promises = [];
140 | promises.push(this.waitForTogglePromise("A"));
141 | promises.push(this.waitForTogglePromise("B"));
142 | promises.push(this.waitForTogglePromise("C"));
143 | Promise.all(promises).then(values => {
144 | console.log(`${JSON.stringify(values)} completed: Success? TRUE`);
145 | });
146 | }
147 |
148 | // Helper functions
149 | waitForToggleCallback(whichOne, callback) {
150 | const timer = setInterval(() => {
151 | const status = this.checkStatus(whichOne);
152 | if (status.complete) {
153 | clearInterval(timer);
154 | callback(whichOne, status.success);
155 | }
156 | }, 100);
157 | }
158 |
159 | waitForTogglePromise(whichOne) {
160 | return new Promise((resolve, reject) => {
161 | const timer = setInterval(() => {
162 | const status = this.checkStatus(whichOne);
163 | if (status.complete) {
164 | clearInterval(timer);
165 | if (status.success) {
166 | resolve(whichOne);
167 | } else {
168 | reject(whichOne);
169 | }
170 | }
171 | }, 100);
172 | });
173 | }
174 |
175 | checkStatus(whichOne) {
176 | let status = {
177 | complete: false,
178 | success: false
179 | };
180 |
181 | if (this.failed) {
182 | status.success = false;
183 | status.complete = true;
184 | } else {
185 | const check = {
186 | A: this.stoppedA,
187 | B: this.stoppedB,
188 | C: this.stoppedC
189 | };
190 | if (check[whichOne]) {
191 | status.success = true;
192 | status.complete = true;
193 | }
194 | }
195 | return status;
196 | }
197 | }
198 |
--------------------------------------------------------------------------------
/.sfdx/orgs/test-d7njhea2fazi@example.com/sourcePathInfos.json:
--------------------------------------------------------------------------------
1 | [
2 | [
3 | "/Users/aperez/C1MW1077J1WV-2/Projects/2020/01-JAN/AsyncJS/force-app",
4 | {
5 | "sourcePath": "/Users/aperez/C1MW1077J1WV-2/Projects/2020/01-JAN/AsyncJS/force-app",
6 | "isDirectory": true,
7 | "size": 96,
8 | "modifiedTime": 1581103186749,
9 | "changeTime": 1581103186749,
10 | "contentHash": "b28b7af69320201d1cf206ebf28373980add1451",
11 | "isMetadataFile": false,
12 | "state": "u",
13 | "isWorkspace": false,
14 | "isArtifactRoot": true
15 | }
16 | ],
17 | [
18 | "/Users/aperez/C1MW1077J1WV-2/Projects/2020/01-JAN/AsyncJS/force-app/main",
19 | {
20 | "sourcePath": "/Users/aperez/C1MW1077J1WV-2/Projects/2020/01-JAN/AsyncJS/force-app/main",
21 | "isDirectory": true,
22 | "size": 96,
23 | "modifiedTime": 1581103186749,
24 | "changeTime": 1581103186749,
25 | "contentHash": "7505d64a54e061b7acd54ccd58b49dc43500b635",
26 | "isMetadataFile": false,
27 | "state": "u",
28 | "isWorkspace": false,
29 | "isArtifactRoot": false
30 | }
31 | ],
32 | [
33 | "/Users/aperez/C1MW1077J1WV-2/Projects/2020/01-JAN/AsyncJS/force-app/main/default",
34 | {
35 | "sourcePath": "/Users/aperez/C1MW1077J1WV-2/Projects/2020/01-JAN/AsyncJS/force-app/main/default",
36 | "isDirectory": true,
37 | "size": 256,
38 | "modifiedTime": 1581104758463,
39 | "changeTime": 1581104758463,
40 | "contentHash": "605f07c15ab90b9e7b3e271c72eb055bb46d6de8",
41 | "isMetadataFile": false,
42 | "state": "u"
43 | }
44 | ],
45 | [
46 | "/Users/aperez/C1MW1077J1WV-2/Projects/2020/01-JAN/AsyncJS/force-app/main/default/lwc",
47 | {
48 | "sourcePath": "/Users/aperez/C1MW1077J1WV-2/Projects/2020/01-JAN/AsyncJS/force-app/main/default/lwc",
49 | "isDirectory": true,
50 | "size": 192,
51 | "modifiedTime": 1581113779550,
52 | "changeTime": 1581113779550,
53 | "contentHash": "a952a6adb69d9879fb011a39678255f6e8979f2c",
54 | "isMetadataFile": false,
55 | "state": "u",
56 | "isWorkspace": false
57 | }
58 | ],
59 | [
60 | "/Users/aperez/C1MW1077J1WV-2/Projects/2020/01-JAN/AsyncJS/force-app/main/default/lwc/demoAsync",
61 | {
62 | "sourcePath": "/Users/aperez/C1MW1077J1WV-2/Projects/2020/01-JAN/AsyncJS/force-app/main/default/lwc/demoAsync",
63 | "isDirectory": true,
64 | "size": 160,
65 | "modifiedTime": 1581018761000,
66 | "changeTime": 1581103373950,
67 | "contentHash": "2c54df0a15ad9f2e820539f11a43fd6d2df13136",
68 | "isMetadataFile": false,
69 | "state": "u",
70 | "isWorkspace": false,
71 | "isArtifactRoot": false
72 | }
73 | ],
74 | [
75 | "/Users/aperez/C1MW1077J1WV-2/Projects/2020/01-JAN/AsyncJS/force-app/main/default/lwc/demoAsync/demoAsync.html",
76 | {
77 | "sourcePath": "/Users/aperez/C1MW1077J1WV-2/Projects/2020/01-JAN/AsyncJS/force-app/main/default/lwc/demoAsync/demoAsync.html",
78 | "isDirectory": false,
79 | "size": 2282,
80 | "modifiedTime": 1581113523549,
81 | "changeTime": 1581113523549,
82 | "contentHash": "62985e64a4092631d8f35faf6eeccc230da2f24e",
83 | "isMetadataFile": false,
84 | "state": "u",
85 | "isWorkspace": false
86 | }
87 | ],
88 | [
89 | "/Users/aperez/C1MW1077J1WV-2/Projects/2020/01-JAN/AsyncJS/force-app/main/default/lwc/demoAsync/demoAsync.js",
90 | {
91 | "state": "u",
92 | "sourcePath": "/Users/aperez/C1MW1077J1WV-2/Projects/2020/01-JAN/AsyncJS/force-app/main/default/lwc/demoAsync/demoAsync.js",
93 | "isDirectory": false,
94 | "isMetadataFile": false,
95 | "size": 4988,
96 | "modifiedTime": 1581113986096,
97 | "changeTime": 1581113986096,
98 | "isWorkspace": false,
99 | "contentHash": "376989cee4ebaa23f49ddb12131f53e138952fd8"
100 | }
101 | ],
102 | [
103 | "/Users/aperez/C1MW1077J1WV-2/Projects/2020/01-JAN/AsyncJS/force-app/main/default/lwc/demoAsync/demoAsync.js-meta.xml",
104 | {
105 | "sourcePath": "/Users/aperez/C1MW1077J1WV-2/Projects/2020/01-JAN/AsyncJS/force-app/main/default/lwc/demoAsync/demoAsync.js-meta.xml",
106 | "isDirectory": false,
107 | "size": 268,
108 | "modifiedTime": 1581025213000,
109 | "changeTime": 1581103373945,
110 | "contentHash": "d8f3e4ad5b191b8520a786956d63508163be2d86",
111 | "isMetadataFile": true,
112 | "state": "u",
113 | "isWorkspace": false,
114 | "isArtifactRoot": false
115 | }
116 | ],
117 | [
118 | "/Users/aperez/C1MW1077J1WV-2/Projects/2020/01-JAN/AsyncJS",
119 | {
120 | "sourcePath": "/Users/aperez/C1MW1077J1WV-2/Projects/2020/01-JAN/AsyncJS",
121 | "isDirectory": true,
122 | "size": 416,
123 | "modifiedTime": 1581105441488,
124 | "changeTime": 1581105441488,
125 | "contentHash": "d24243e00f2fce2741ad45417adb3fea4ba8ebfb",
126 | "isMetadataFile": false,
127 | "state": "u",
128 | "isWorkspace": true
129 | }
130 | ],
131 | [
132 | "/Users/aperez/C1MW1077J1WV-2/Projects/2020/01-JAN/AsyncJS/force-app/main/default/flexipages/Async_JS_UtilityBar.flexipage-meta.xml",
133 | {
134 | "sourcePath": "/Users/aperez/C1MW1077J1WV-2/Projects/2020/01-JAN/AsyncJS/force-app/main/default/flexipages/Async_JS_UtilityBar.flexipage-meta.xml",
135 | "isDirectory": false,
136 | "size": 503,
137 | "modifiedTime": 1581104758447,
138 | "changeTime": 1581104758447,
139 | "contentHash": "801428cde8b73ede431be885ad2a5f103c547b08",
140 | "isMetadataFile": true,
141 | "state": "u"
142 | }
143 | ],
144 | [
145 | "/Users/aperez/C1MW1077J1WV-2/Projects/2020/01-JAN/AsyncJS/force-app/main/default/flexipages/Demo.flexipage-meta.xml",
146 | {
147 | "sourcePath": "/Users/aperez/C1MW1077J1WV-2/Projects/2020/01-JAN/AsyncJS/force-app/main/default/flexipages/Demo.flexipage-meta.xml",
148 | "isDirectory": false,
149 | "size": 702,
150 | "modifiedTime": 1581104758451,
151 | "changeTime": 1581104758451,
152 | "contentHash": "316227ce093f8e435c3ab4a74fe11c7194bceb78",
153 | "isMetadataFile": true,
154 | "state": "u"
155 | }
156 | ],
157 | [
158 | "/Users/aperez/C1MW1077J1WV-2/Projects/2020/01-JAN/AsyncJS/force-app/main/default/tabs/Demo.tab-meta.xml",
159 | {
160 | "sourcePath": "/Users/aperez/C1MW1077J1WV-2/Projects/2020/01-JAN/AsyncJS/force-app/main/default/tabs/Demo.tab-meta.xml",
161 | "isDirectory": false,
162 | "size": 266,
163 | "modifiedTime": 1581104758454,
164 | "changeTime": 1581104758454,
165 | "contentHash": "68e2c0f8e01f635ff589bf3dbef80bdb896b37ad",
166 | "isMetadataFile": true,
167 | "state": "u"
168 | }
169 | ],
170 | [
171 | "/Users/aperez/C1MW1077J1WV-2/Projects/2020/01-JAN/AsyncJS/force-app/main/default/applications/AsyncJS.app-meta.xml",
172 | {
173 | "sourcePath": "/Users/aperez/C1MW1077J1WV-2/Projects/2020/01-JAN/AsyncJS/force-app/main/default/applications/AsyncJS.app-meta.xml",
174 | "isDirectory": false,
175 | "size": 625,
176 | "modifiedTime": 1581104758457,
177 | "changeTime": 1581104758457,
178 | "contentHash": "e1c9eea9fc83d67a4942e95b87a88ee54214add6",
179 | "isMetadataFile": true,
180 | "state": "u"
181 | }
182 | ],
183 | [
184 | "/Users/aperez/C1MW1077J1WV-2/Projects/2020/01-JAN/AsyncJS/force-app/main/default/permissionsets/AsyncJS.permissionset-meta.xml",
185 | {
186 | "sourcePath": "/Users/aperez/C1MW1077J1WV-2/Projects/2020/01-JAN/AsyncJS/force-app/main/default/permissionsets/AsyncJS.permissionset-meta.xml",
187 | "isDirectory": false,
188 | "size": 442,
189 | "modifiedTime": 1581105166766,
190 | "changeTime": 1581105166766,
191 | "contentHash": "000eaf6f6e3ab9596ca9e2b94c3fd40f629c7651",
192 | "isMetadataFile": true,
193 | "state": "u"
194 | }
195 | ],
196 | [
197 | "/Users/aperez/C1MW1077J1WV-2/Projects/2020/01-JAN/AsyncJS/force-app/main/default/appMenus/AppSwitcher.appMenu-meta.xml",
198 | {
199 | "sourcePath": "/Users/aperez/C1MW1077J1WV-2/Projects/2020/01-JAN/AsyncJS/force-app/main/default/appMenus/AppSwitcher.appMenu-meta.xml",
200 | "isDirectory": false,
201 | "size": 1997,
202 | "modifiedTime": 1581104758464,
203 | "changeTime": 1581104758464,
204 | "contentHash": "f5a9a79b0a51379be4e1ff690518debaff33ecc2",
205 | "isMetadataFile": true,
206 | "state": "u"
207 | }
208 | ],
209 | [
210 | "/Users/aperez/C1MW1077J1WV-2/Projects/2020/01-JAN/AsyncJS/force-app/main/default/flexipages",
211 | {
212 | "sourcePath": "/Users/aperez/C1MW1077J1WV-2/Projects/2020/01-JAN/AsyncJS/force-app/main/default/flexipages",
213 | "isDirectory": true,
214 | "size": 128,
215 | "modifiedTime": 1581104758450,
216 | "changeTime": 1581104758450,
217 | "contentHash": "bc7ab23383d134afa2eb5cd1bb0277c6bdac1fbd",
218 | "isMetadataFile": false,
219 | "state": "u"
220 | }
221 | ],
222 | [
223 | "/Users/aperez/C1MW1077J1WV-2/Projects/2020/01-JAN/AsyncJS/force-app/main/default/tabs",
224 | {
225 | "sourcePath": "/Users/aperez/C1MW1077J1WV-2/Projects/2020/01-JAN/AsyncJS/force-app/main/default/tabs",
226 | "isDirectory": true,
227 | "size": 96,
228 | "modifiedTime": 1581104758454,
229 | "changeTime": 1581104758454,
230 | "contentHash": "27e8f7b485188049a8ccb6bc0edc3694c6635ab6",
231 | "isMetadataFile": false,
232 | "state": "u"
233 | }
234 | ],
235 | [
236 | "/Users/aperez/C1MW1077J1WV-2/Projects/2020/01-JAN/AsyncJS/force-app/main/default/applications",
237 | {
238 | "sourcePath": "/Users/aperez/C1MW1077J1WV-2/Projects/2020/01-JAN/AsyncJS/force-app/main/default/applications",
239 | "isDirectory": true,
240 | "size": 96,
241 | "modifiedTime": 1581104758457,
242 | "changeTime": 1581104758457,
243 | "contentHash": "1ea3bda383b253e4d2ba974abe33872fa3c00583",
244 | "isMetadataFile": false,
245 | "state": "u"
246 | }
247 | ],
248 | [
249 | "/Users/aperez/C1MW1077J1WV-2/Projects/2020/01-JAN/AsyncJS/force-app/main/default/permissionsets",
250 | {
251 | "sourcePath": "/Users/aperez/C1MW1077J1WV-2/Projects/2020/01-JAN/AsyncJS/force-app/main/default/permissionsets",
252 | "isDirectory": true,
253 | "size": 96,
254 | "modifiedTime": 1581104758460,
255 | "changeTime": 1581104758460,
256 | "contentHash": "ce6f149d8382dd702976914d5cd5040c3cfb9684",
257 | "isMetadataFile": false,
258 | "state": "u"
259 | }
260 | ],
261 | [
262 | "/Users/aperez/C1MW1077J1WV-2/Projects/2020/01-JAN/AsyncJS/force-app/main/default/appMenus",
263 | {
264 | "sourcePath": "/Users/aperez/C1MW1077J1WV-2/Projects/2020/01-JAN/AsyncJS/force-app/main/default/appMenus",
265 | "isDirectory": true,
266 | "size": 96,
267 | "modifiedTime": 1581104758464,
268 | "changeTime": 1581104758464,
269 | "contentHash": "7c65d70563206b380e20367663fe2cc611131a2d",
270 | "isMetadataFile": false,
271 | "state": "u"
272 | }
273 | ]
274 | ]
--------------------------------------------------------------------------------
/.sfdx/orgs/test-d7njhea2fazi@example.com/sourcePathInfos.json.bak:
--------------------------------------------------------------------------------
1 | [
2 | [
3 | "/Users/aperez/C1MW1077J1WV-2/Projects/2020/01-JAN/AsyncJS/force-app",
4 | {
5 | "sourcePath": "/Users/aperez/C1MW1077J1WV-2/Projects/2020/01-JAN/AsyncJS/force-app",
6 | "isDirectory": true,
7 | "size": 96,
8 | "modifiedTime": 1581103186749,
9 | "changeTime": 1581103186749,
10 | "contentHash": "b28b7af69320201d1cf206ebf28373980add1451",
11 | "isMetadataFile": false,
12 | "state": "u",
13 | "isWorkspace": false,
14 | "isArtifactRoot": true
15 | }
16 | ],
17 | [
18 | "/Users/aperez/C1MW1077J1WV-2/Projects/2020/01-JAN/AsyncJS/force-app/main",
19 | {
20 | "sourcePath": "/Users/aperez/C1MW1077J1WV-2/Projects/2020/01-JAN/AsyncJS/force-app/main",
21 | "isDirectory": true,
22 | "size": 96,
23 | "modifiedTime": 1581103186749,
24 | "changeTime": 1581103186749,
25 | "contentHash": "7505d64a54e061b7acd54ccd58b49dc43500b635",
26 | "isMetadataFile": false,
27 | "state": "u",
28 | "isWorkspace": false,
29 | "isArtifactRoot": false
30 | }
31 | ],
32 | [
33 | "/Users/aperez/C1MW1077J1WV-2/Projects/2020/01-JAN/AsyncJS/force-app/main/default",
34 | {
35 | "sourcePath": "/Users/aperez/C1MW1077J1WV-2/Projects/2020/01-JAN/AsyncJS/force-app/main/default",
36 | "isDirectory": true,
37 | "size": 256,
38 | "modifiedTime": 1581104758463,
39 | "changeTime": 1581104758463,
40 | "contentHash": "605f07c15ab90b9e7b3e271c72eb055bb46d6de8",
41 | "isMetadataFile": false,
42 | "state": "u"
43 | }
44 | ],
45 | [
46 | "/Users/aperez/C1MW1077J1WV-2/Projects/2020/01-JAN/AsyncJS/force-app/main/default/lwc",
47 | {
48 | "state": "u",
49 | "sourcePath": "/Users/aperez/C1MW1077J1WV-2/Projects/2020/01-JAN/AsyncJS/force-app/main/default/lwc",
50 | "isDirectory": true,
51 | "isMetadataFile": false,
52 | "size": 192,
53 | "modifiedTime": 1581113779550,
54 | "changeTime": 1581113779550,
55 | "isWorkspace": false,
56 | "contentHash": "a952a6adb69d9879fb011a39678255f6e8979f2c"
57 | }
58 | ],
59 | [
60 | "/Users/aperez/C1MW1077J1WV-2/Projects/2020/01-JAN/AsyncJS/force-app/main/default/lwc/demoAsync",
61 | {
62 | "sourcePath": "/Users/aperez/C1MW1077J1WV-2/Projects/2020/01-JAN/AsyncJS/force-app/main/default/lwc/demoAsync",
63 | "isDirectory": true,
64 | "size": 160,
65 | "modifiedTime": 1581018761000,
66 | "changeTime": 1581103373950,
67 | "contentHash": "2c54df0a15ad9f2e820539f11a43fd6d2df13136",
68 | "isMetadataFile": false,
69 | "state": "u",
70 | "isWorkspace": false,
71 | "isArtifactRoot": false
72 | }
73 | ],
74 | [
75 | "/Users/aperez/C1MW1077J1WV-2/Projects/2020/01-JAN/AsyncJS/force-app/main/default/lwc/demoAsync/demoAsync.html",
76 | {
77 | "sourcePath": "/Users/aperez/C1MW1077J1WV-2/Projects/2020/01-JAN/AsyncJS/force-app/main/default/lwc/demoAsync/demoAsync.html",
78 | "isDirectory": false,
79 | "size": 2282,
80 | "modifiedTime": 1581113523549,
81 | "changeTime": 1581113523549,
82 | "contentHash": "62985e64a4092631d8f35faf6eeccc230da2f24e",
83 | "isMetadataFile": false,
84 | "state": "u",
85 | "isWorkspace": false
86 | }
87 | ],
88 | [
89 | "/Users/aperez/C1MW1077J1WV-2/Projects/2020/01-JAN/AsyncJS/force-app/main/default/lwc/demoAsync/demoAsync.js",
90 | {
91 | "state": "u",
92 | "sourcePath": "/Users/aperez/C1MW1077J1WV-2/Projects/2020/01-JAN/AsyncJS/force-app/main/default/lwc/demoAsync/demoAsync.js",
93 | "isDirectory": false,
94 | "isMetadataFile": false,
95 | "size": 4909,
96 | "modifiedTime": 1581113909304,
97 | "changeTime": 1581113909304,
98 | "isWorkspace": false,
99 | "contentHash": "24e292a3c4abe63a25e196d4d8e75841a953ae89"
100 | }
101 | ],
102 | [
103 | "/Users/aperez/C1MW1077J1WV-2/Projects/2020/01-JAN/AsyncJS/force-app/main/default/lwc/demoAsync/demoAsync.js-meta.xml",
104 | {
105 | "sourcePath": "/Users/aperez/C1MW1077J1WV-2/Projects/2020/01-JAN/AsyncJS/force-app/main/default/lwc/demoAsync/demoAsync.js-meta.xml",
106 | "isDirectory": false,
107 | "size": 268,
108 | "modifiedTime": 1581025213000,
109 | "changeTime": 1581103373945,
110 | "contentHash": "d8f3e4ad5b191b8520a786956d63508163be2d86",
111 | "isMetadataFile": true,
112 | "state": "u",
113 | "isWorkspace": false,
114 | "isArtifactRoot": false
115 | }
116 | ],
117 | [
118 | "/Users/aperez/C1MW1077J1WV-2/Projects/2020/01-JAN/AsyncJS",
119 | {
120 | "sourcePath": "/Users/aperez/C1MW1077J1WV-2/Projects/2020/01-JAN/AsyncJS",
121 | "isDirectory": true,
122 | "size": 416,
123 | "modifiedTime": 1581105441488,
124 | "changeTime": 1581105441488,
125 | "contentHash": "d24243e00f2fce2741ad45417adb3fea4ba8ebfb",
126 | "isMetadataFile": false,
127 | "state": "u",
128 | "isWorkspace": true
129 | }
130 | ],
131 | [
132 | "/Users/aperez/C1MW1077J1WV-2/Projects/2020/01-JAN/AsyncJS/force-app/main/default/flexipages/Async_JS_UtilityBar.flexipage-meta.xml",
133 | {
134 | "sourcePath": "/Users/aperez/C1MW1077J1WV-2/Projects/2020/01-JAN/AsyncJS/force-app/main/default/flexipages/Async_JS_UtilityBar.flexipage-meta.xml",
135 | "isDirectory": false,
136 | "size": 503,
137 | "modifiedTime": 1581104758447,
138 | "changeTime": 1581104758447,
139 | "contentHash": "801428cde8b73ede431be885ad2a5f103c547b08",
140 | "isMetadataFile": true,
141 | "state": "u"
142 | }
143 | ],
144 | [
145 | "/Users/aperez/C1MW1077J1WV-2/Projects/2020/01-JAN/AsyncJS/force-app/main/default/flexipages/Demo.flexipage-meta.xml",
146 | {
147 | "sourcePath": "/Users/aperez/C1MW1077J1WV-2/Projects/2020/01-JAN/AsyncJS/force-app/main/default/flexipages/Demo.flexipage-meta.xml",
148 | "isDirectory": false,
149 | "size": 702,
150 | "modifiedTime": 1581104758451,
151 | "changeTime": 1581104758451,
152 | "contentHash": "316227ce093f8e435c3ab4a74fe11c7194bceb78",
153 | "isMetadataFile": true,
154 | "state": "u"
155 | }
156 | ],
157 | [
158 | "/Users/aperez/C1MW1077J1WV-2/Projects/2020/01-JAN/AsyncJS/force-app/main/default/tabs/Demo.tab-meta.xml",
159 | {
160 | "sourcePath": "/Users/aperez/C1MW1077J1WV-2/Projects/2020/01-JAN/AsyncJS/force-app/main/default/tabs/Demo.tab-meta.xml",
161 | "isDirectory": false,
162 | "size": 266,
163 | "modifiedTime": 1581104758454,
164 | "changeTime": 1581104758454,
165 | "contentHash": "68e2c0f8e01f635ff589bf3dbef80bdb896b37ad",
166 | "isMetadataFile": true,
167 | "state": "u"
168 | }
169 | ],
170 | [
171 | "/Users/aperez/C1MW1077J1WV-2/Projects/2020/01-JAN/AsyncJS/force-app/main/default/applications/AsyncJS.app-meta.xml",
172 | {
173 | "sourcePath": "/Users/aperez/C1MW1077J1WV-2/Projects/2020/01-JAN/AsyncJS/force-app/main/default/applications/AsyncJS.app-meta.xml",
174 | "isDirectory": false,
175 | "size": 625,
176 | "modifiedTime": 1581104758457,
177 | "changeTime": 1581104758457,
178 | "contentHash": "e1c9eea9fc83d67a4942e95b87a88ee54214add6",
179 | "isMetadataFile": true,
180 | "state": "u"
181 | }
182 | ],
183 | [
184 | "/Users/aperez/C1MW1077J1WV-2/Projects/2020/01-JAN/AsyncJS/force-app/main/default/permissionsets/AsyncJS.permissionset-meta.xml",
185 | {
186 | "sourcePath": "/Users/aperez/C1MW1077J1WV-2/Projects/2020/01-JAN/AsyncJS/force-app/main/default/permissionsets/AsyncJS.permissionset-meta.xml",
187 | "isDirectory": false,
188 | "size": 442,
189 | "modifiedTime": 1581105166766,
190 | "changeTime": 1581105166766,
191 | "contentHash": "000eaf6f6e3ab9596ca9e2b94c3fd40f629c7651",
192 | "isMetadataFile": true,
193 | "state": "u"
194 | }
195 | ],
196 | [
197 | "/Users/aperez/C1MW1077J1WV-2/Projects/2020/01-JAN/AsyncJS/force-app/main/default/appMenus/AppSwitcher.appMenu-meta.xml",
198 | {
199 | "sourcePath": "/Users/aperez/C1MW1077J1WV-2/Projects/2020/01-JAN/AsyncJS/force-app/main/default/appMenus/AppSwitcher.appMenu-meta.xml",
200 | "isDirectory": false,
201 | "size": 1997,
202 | "modifiedTime": 1581104758464,
203 | "changeTime": 1581104758464,
204 | "contentHash": "f5a9a79b0a51379be4e1ff690518debaff33ecc2",
205 | "isMetadataFile": true,
206 | "state": "u"
207 | }
208 | ],
209 | [
210 | "/Users/aperez/C1MW1077J1WV-2/Projects/2020/01-JAN/AsyncJS/force-app/main/default/flexipages",
211 | {
212 | "sourcePath": "/Users/aperez/C1MW1077J1WV-2/Projects/2020/01-JAN/AsyncJS/force-app/main/default/flexipages",
213 | "isDirectory": true,
214 | "size": 128,
215 | "modifiedTime": 1581104758450,
216 | "changeTime": 1581104758450,
217 | "contentHash": "bc7ab23383d134afa2eb5cd1bb0277c6bdac1fbd",
218 | "isMetadataFile": false,
219 | "state": "u"
220 | }
221 | ],
222 | [
223 | "/Users/aperez/C1MW1077J1WV-2/Projects/2020/01-JAN/AsyncJS/force-app/main/default/tabs",
224 | {
225 | "sourcePath": "/Users/aperez/C1MW1077J1WV-2/Projects/2020/01-JAN/AsyncJS/force-app/main/default/tabs",
226 | "isDirectory": true,
227 | "size": 96,
228 | "modifiedTime": 1581104758454,
229 | "changeTime": 1581104758454,
230 | "contentHash": "27e8f7b485188049a8ccb6bc0edc3694c6635ab6",
231 | "isMetadataFile": false,
232 | "state": "u"
233 | }
234 | ],
235 | [
236 | "/Users/aperez/C1MW1077J1WV-2/Projects/2020/01-JAN/AsyncJS/force-app/main/default/applications",
237 | {
238 | "sourcePath": "/Users/aperez/C1MW1077J1WV-2/Projects/2020/01-JAN/AsyncJS/force-app/main/default/applications",
239 | "isDirectory": true,
240 | "size": 96,
241 | "modifiedTime": 1581104758457,
242 | "changeTime": 1581104758457,
243 | "contentHash": "1ea3bda383b253e4d2ba974abe33872fa3c00583",
244 | "isMetadataFile": false,
245 | "state": "u"
246 | }
247 | ],
248 | [
249 | "/Users/aperez/C1MW1077J1WV-2/Projects/2020/01-JAN/AsyncJS/force-app/main/default/permissionsets",
250 | {
251 | "sourcePath": "/Users/aperez/C1MW1077J1WV-2/Projects/2020/01-JAN/AsyncJS/force-app/main/default/permissionsets",
252 | "isDirectory": true,
253 | "size": 96,
254 | "modifiedTime": 1581104758460,
255 | "changeTime": 1581104758460,
256 | "contentHash": "ce6f149d8382dd702976914d5cd5040c3cfb9684",
257 | "isMetadataFile": false,
258 | "state": "u"
259 | }
260 | ],
261 | [
262 | "/Users/aperez/C1MW1077J1WV-2/Projects/2020/01-JAN/AsyncJS/force-app/main/default/appMenus",
263 | {
264 | "sourcePath": "/Users/aperez/C1MW1077J1WV-2/Projects/2020/01-JAN/AsyncJS/force-app/main/default/appMenus",
265 | "isDirectory": true,
266 | "size": 96,
267 | "modifiedTime": 1581104758464,
268 | "changeTime": 1581104758464,
269 | "contentHash": "7c65d70563206b380e20367663fe2cc611131a2d",
270 | "isMetadataFile": false,
271 | "state": "u"
272 | }
273 | ]
274 | ]
--------------------------------------------------------------------------------