summaryrefslogtreecommitdiff
path: root/desktop/node_modules/@electron
diff options
context:
space:
mode:
Diffstat (limited to 'desktop/node_modules/@electron')
-rw-r--r--desktop/node_modules/@electron/asar/LICENSE.md20
-rw-r--r--desktop/node_modules/@electron/asar/README.md213
-rwxr-xr-xdesktop/node_modules/@electron/asar/bin/asar.js82
-rw-r--r--desktop/node_modules/@electron/asar/lib/asar.js229
-rw-r--r--desktop/node_modules/@electron/asar/lib/crawlfs.js41
-rw-r--r--desktop/node_modules/@electron/asar/lib/disk.js123
-rw-r--r--desktop/node_modules/@electron/asar/lib/filesystem.js154
-rw-r--r--desktop/node_modules/@electron/asar/lib/index.d.ts250
-rw-r--r--desktop/node_modules/@electron/asar/lib/integrity.js62
-rw-r--r--desktop/node_modules/@electron/asar/lib/pickle.js230
-rw-r--r--desktop/node_modules/@electron/asar/lib/wrapped-fs.js26
-rw-r--r--desktop/node_modules/@electron/asar/package.json61
-rw-r--r--desktop/node_modules/@electron/get/LICENSE21
-rw-r--r--desktop/node_modules/@electron/get/README.md138
-rw-r--r--desktop/node_modules/@electron/get/dist/cjs/Cache.d.ts8
-rw-r--r--desktop/node_modules/@electron/get/dist/cjs/Cache.js60
-rw-r--r--desktop/node_modules/@electron/get/dist/cjs/Cache.js.map1
-rw-r--r--desktop/node_modules/@electron/get/dist/cjs/Downloader.d.ts3
-rw-r--r--desktop/node_modules/@electron/get/dist/cjs/Downloader.js3
-rw-r--r--desktop/node_modules/@electron/get/dist/cjs/Downloader.js.map1
-rw-r--r--desktop/node_modules/@electron/get/dist/cjs/GotDownloader.d.ts21
-rw-r--r--desktop/node_modules/@electron/get/dist/cjs/GotDownloader.js76
-rw-r--r--desktop/node_modules/@electron/get/dist/cjs/GotDownloader.js.map1
-rw-r--r--desktop/node_modules/@electron/get/dist/cjs/artifact-utils.d.ts4
-rw-r--r--desktop/node_modules/@electron/get/dist/cjs/artifact-utils.js66
-rw-r--r--desktop/node_modules/@electron/get/dist/cjs/artifact-utils.js.map1
-rw-r--r--desktop/node_modules/@electron/get/dist/cjs/downloader-resolver.d.ts3
-rw-r--r--desktop/node_modules/@electron/get/dist/cjs/downloader-resolver.js12
-rw-r--r--desktop/node_modules/@electron/get/dist/cjs/downloader-resolver.js.map1
-rw-r--r--desktop/node_modules/@electron/get/dist/cjs/index.d.ts18
-rw-r--r--desktop/node_modules/@electron/get/dist/cjs/index.js140
-rw-r--r--desktop/node_modules/@electron/get/dist/cjs/index.js.map1
-rw-r--r--desktop/node_modules/@electron/get/dist/cjs/proxy.d.ts4
-rw-r--r--desktop/node_modules/@electron/get/dist/cjs/proxy.js27
-rw-r--r--desktop/node_modules/@electron/get/dist/cjs/proxy.js.map1
-rw-r--r--desktop/node_modules/@electron/get/dist/cjs/types.d.ts129
-rw-r--r--desktop/node_modules/@electron/get/dist/cjs/types.js3
-rw-r--r--desktop/node_modules/@electron/get/dist/cjs/types.js.map1
-rw-r--r--desktop/node_modules/@electron/get/dist/cjs/utils.d.ts25
-rw-r--r--desktop/node_modules/@electron/get/dist/cjs/utils.js107
-rw-r--r--desktop/node_modules/@electron/get/dist/cjs/utils.js.map1
-rw-r--r--desktop/node_modules/@electron/get/dist/esm/Cache.d.ts8
-rw-r--r--desktop/node_modules/@electron/get/dist/esm/Cache.js57
-rw-r--r--desktop/node_modules/@electron/get/dist/esm/Cache.js.map1
-rw-r--r--desktop/node_modules/@electron/get/dist/esm/Downloader.d.ts3
-rw-r--r--desktop/node_modules/@electron/get/dist/esm/Downloader.js1
-rw-r--r--desktop/node_modules/@electron/get/dist/esm/Downloader.js.map1
-rw-r--r--desktop/node_modules/@electron/get/dist/esm/GotDownloader.d.ts21
-rw-r--r--desktop/node_modules/@electron/get/dist/esm/GotDownloader.js73
-rw-r--r--desktop/node_modules/@electron/get/dist/esm/GotDownloader.js.map1
-rw-r--r--desktop/node_modules/@electron/get/dist/esm/artifact-utils.d.ts4
-rw-r--r--desktop/node_modules/@electron/get/dist/esm/artifact-utils.js61
-rw-r--r--desktop/node_modules/@electron/get/dist/esm/artifact-utils.js.map1
-rw-r--r--desktop/node_modules/@electron/get/dist/esm/downloader-resolver.d.ts3
-rw-r--r--desktop/node_modules/@electron/get/dist/esm/downloader-resolver.js9
-rw-r--r--desktop/node_modules/@electron/get/dist/esm/downloader-resolver.js.map1
-rw-r--r--desktop/node_modules/@electron/get/dist/esm/index.d.ts18
-rw-r--r--desktop/node_modules/@electron/get/dist/esm/index.js134
-rw-r--r--desktop/node_modules/@electron/get/dist/esm/index.js.map1
-rw-r--r--desktop/node_modules/@electron/get/dist/esm/proxy.d.ts4
-rw-r--r--desktop/node_modules/@electron/get/dist/esm/proxy.js24
-rw-r--r--desktop/node_modules/@electron/get/dist/esm/proxy.js.map1
-rw-r--r--desktop/node_modules/@electron/get/dist/esm/types.d.ts129
-rw-r--r--desktop/node_modules/@electron/get/dist/esm/types.js1
-rw-r--r--desktop/node_modules/@electron/get/dist/esm/types.js.map1
-rw-r--r--desktop/node_modules/@electron/get/dist/esm/utils.d.ts25
-rw-r--r--desktop/node_modules/@electron/get/dist/esm/utils.js95
-rw-r--r--desktop/node_modules/@electron/get/dist/esm/utils.js.map1
-rw-r--r--desktop/node_modules/@electron/get/package.json100
-rw-r--r--desktop/node_modules/@electron/notarize/LICENSE7
-rw-r--r--desktop/node_modules/@electron/notarize/README.md132
-rw-r--r--desktop/node_modules/@electron/notarize/lib/helpers.d.ts13
-rw-r--r--desktop/node_modules/@electron/notarize/lib/helpers.js79
-rw-r--r--desktop/node_modules/@electron/notarize/lib/helpers.js.map1
-rw-r--r--desktop/node_modules/@electron/notarize/lib/index.d.ts4
-rw-r--r--desktop/node_modules/@electron/notarize/lib/index.js63
-rw-r--r--desktop/node_modules/@electron/notarize/lib/index.js.map1
-rw-r--r--desktop/node_modules/@electron/notarize/lib/legacy.d.ts3
-rw-r--r--desktop/node_modules/@electron/notarize/lib/legacy.js116
-rw-r--r--desktop/node_modules/@electron/notarize/lib/legacy.js.map1
-rw-r--r--desktop/node_modules/@electron/notarize/lib/notarytool.d.ts3
-rw-r--r--desktop/node_modules/@electron/notarize/lib/notarytool.js101
-rw-r--r--desktop/node_modules/@electron/notarize/lib/notarytool.js.map1
-rw-r--r--desktop/node_modules/@electron/notarize/lib/spawn.d.ts6
-rw-r--r--desktop/node_modules/@electron/notarize/lib/spawn.js28
-rw-r--r--desktop/node_modules/@electron/notarize/lib/spawn.js.map1
-rw-r--r--desktop/node_modules/@electron/notarize/lib/staple.d.ts2
-rw-r--r--desktop/node_modules/@electron/notarize/lib/staple.js30
-rw-r--r--desktop/node_modules/@electron/notarize/lib/staple.js.map1
-rw-r--r--desktop/node_modules/@electron/notarize/lib/types.d.ts47
-rw-r--r--desktop/node_modules/@electron/notarize/lib/types.js2
-rw-r--r--desktop/node_modules/@electron/notarize/lib/types.js.map1
-rw-r--r--desktop/node_modules/@electron/notarize/lib/validate-args.d.ts8
-rw-r--r--desktop/node_modules/@electron/notarize/lib/validate-args.js102
-rw-r--r--desktop/node_modules/@electron/notarize/lib/validate-args.js.map1
-rw-r--r--desktop/node_modules/@electron/notarize/node_modules/fs-extra/CHANGELOG.md902
-rw-r--r--desktop/node_modules/@electron/notarize/node_modules/fs-extra/LICENSE15
-rw-r--r--desktop/node_modules/@electron/notarize/node_modules/fs-extra/README.md264
-rw-r--r--desktop/node_modules/@electron/notarize/node_modules/fs-extra/lib/copy-sync/copy-sync.js166
-rw-r--r--desktop/node_modules/@electron/notarize/node_modules/fs-extra/lib/copy-sync/index.js5
-rw-r--r--desktop/node_modules/@electron/notarize/node_modules/fs-extra/lib/copy/copy.js232
-rw-r--r--desktop/node_modules/@electron/notarize/node_modules/fs-extra/lib/copy/index.js6
-rw-r--r--desktop/node_modules/@electron/notarize/node_modules/fs-extra/lib/empty/index.js48
-rw-r--r--desktop/node_modules/@electron/notarize/node_modules/fs-extra/lib/ensure/file.js69
-rw-r--r--desktop/node_modules/@electron/notarize/node_modules/fs-extra/lib/ensure/index.js23
-rw-r--r--desktop/node_modules/@electron/notarize/node_modules/fs-extra/lib/ensure/link.js61
-rw-r--r--desktop/node_modules/@electron/notarize/node_modules/fs-extra/lib/ensure/symlink-paths.js99
-rw-r--r--desktop/node_modules/@electron/notarize/node_modules/fs-extra/lib/ensure/symlink-type.js31
-rw-r--r--desktop/node_modules/@electron/notarize/node_modules/fs-extra/lib/ensure/symlink.js63
-rw-r--r--desktop/node_modules/@electron/notarize/node_modules/fs-extra/lib/fs/index.js130
-rw-r--r--desktop/node_modules/@electron/notarize/node_modules/fs-extra/lib/index.js27
-rw-r--r--desktop/node_modules/@electron/notarize/node_modules/fs-extra/lib/json/index.js16
-rw-r--r--desktop/node_modules/@electron/notarize/node_modules/fs-extra/lib/json/jsonfile.js11
-rw-r--r--desktop/node_modules/@electron/notarize/node_modules/fs-extra/lib/json/output-json-sync.js12
-rw-r--r--desktop/node_modules/@electron/notarize/node_modules/fs-extra/lib/json/output-json.js12
-rw-r--r--desktop/node_modules/@electron/notarize/node_modules/fs-extra/lib/mkdirs/index.js14
-rw-r--r--desktop/node_modules/@electron/notarize/node_modules/fs-extra/lib/mkdirs/make-dir.js141
-rw-r--r--desktop/node_modules/@electron/notarize/node_modules/fs-extra/lib/move-sync/index.js5
-rw-r--r--desktop/node_modules/@electron/notarize/node_modules/fs-extra/lib/move-sync/move-sync.js47
-rw-r--r--desktop/node_modules/@electron/notarize/node_modules/fs-extra/lib/move/index.js6
-rw-r--r--desktop/node_modules/@electron/notarize/node_modules/fs-extra/lib/move/move.js65
-rw-r--r--desktop/node_modules/@electron/notarize/node_modules/fs-extra/lib/output/index.js40
-rw-r--r--desktop/node_modules/@electron/notarize/node_modules/fs-extra/lib/path-exists/index.js12
-rw-r--r--desktop/node_modules/@electron/notarize/node_modules/fs-extra/lib/remove/index.js9
-rw-r--r--desktop/node_modules/@electron/notarize/node_modules/fs-extra/lib/remove/rimraf.js302
-rw-r--r--desktop/node_modules/@electron/notarize/node_modules/fs-extra/lib/util/stat.js139
-rw-r--r--desktop/node_modules/@electron/notarize/node_modules/fs-extra/lib/util/utimes.js26
-rw-r--r--desktop/node_modules/@electron/notarize/node_modules/fs-extra/package.json70
-rw-r--r--desktop/node_modules/@electron/notarize/node_modules/jsonfile/CHANGELOG.md171
-rw-r--r--desktop/node_modules/@electron/notarize/node_modules/jsonfile/LICENSE15
-rw-r--r--desktop/node_modules/@electron/notarize/node_modules/jsonfile/README.md230
-rw-r--r--desktop/node_modules/@electron/notarize/node_modules/jsonfile/index.js88
-rw-r--r--desktop/node_modules/@electron/notarize/node_modules/jsonfile/package.json40
-rw-r--r--desktop/node_modules/@electron/notarize/node_modules/jsonfile/utils.js14
-rw-r--r--desktop/node_modules/@electron/notarize/node_modules/universalify/LICENSE20
-rw-r--r--desktop/node_modules/@electron/notarize/node_modules/universalify/README.md76
-rw-r--r--desktop/node_modules/@electron/notarize/node_modules/universalify/index.js24
-rw-r--r--desktop/node_modules/@electron/notarize/node_modules/universalify/package.json34
-rw-r--r--desktop/node_modules/@electron/notarize/package.json44
-rw-r--r--desktop/node_modules/@electron/osx-sign/LICENSE24
-rw-r--r--desktop/node_modules/@electron/osx-sign/README.md322
-rw-r--r--desktop/node_modules/@electron/osx-sign/bin/electron-osx-flat-usage.txt41
-rwxr-xr-xdesktop/node_modules/@electron/osx-sign/bin/electron-osx-flat.js34
-rw-r--r--desktop/node_modules/@electron/osx-sign/bin/electron-osx-sign-usage.txt60
-rwxr-xr-xdesktop/node_modules/@electron/osx-sign/bin/electron-osx-sign.js46
-rw-r--r--desktop/node_modules/@electron/osx-sign/dist/cjs/flat.d.ts11
-rw-r--r--desktop/node_modules/@electron/osx-sign/dist/cjs/flat.js153
-rw-r--r--desktop/node_modules/@electron/osx-sign/dist/cjs/flat.js.map1
-rw-r--r--desktop/node_modules/@electron/osx-sign/dist/cjs/index.d.ts4
-rw-r--r--desktop/node_modules/@electron/osx-sign/dist/cjs/index.js36
-rw-r--r--desktop/node_modules/@electron/osx-sign/dist/cjs/index.js.map1
-rw-r--r--desktop/node_modules/@electron/osx-sign/dist/cjs/sign.d.ts11
-rw-r--r--desktop/node_modules/@electron/osx-sign/dist/cjs/sign.js363
-rw-r--r--desktop/node_modules/@electron/osx-sign/dist/cjs/sign.js.map1
-rw-r--r--desktop/node_modules/@electron/osx-sign/dist/cjs/types.d.ts73
-rw-r--r--desktop/node_modules/@electron/osx-sign/dist/cjs/types.js3
-rw-r--r--desktop/node_modules/@electron/osx-sign/dist/cjs/types.js.map1
-rw-r--r--desktop/node_modules/@electron/osx-sign/dist/cjs/util-entitlements.d.ts17
-rw-r--r--desktop/node_modules/@electron/osx-sign/dist/cjs/util-entitlements.js133
-rw-r--r--desktop/node_modules/@electron/osx-sign/dist/cjs/util-entitlements.js.map1
-rw-r--r--desktop/node_modules/@electron/osx-sign/dist/cjs/util-identities.d.ts6
-rw-r--r--desktop/node_modules/@electron/osx-sign/dist/cjs/util-identities.js35
-rw-r--r--desktop/node_modules/@electron/osx-sign/dist/cjs/util-identities.js.map1
-rw-r--r--desktop/node_modules/@electron/osx-sign/dist/cjs/util-provisioning-profiles.d.ts25
-rw-r--r--desktop/node_modules/@electron/osx-sign/dist/cjs/util-provisioning-profiles.js148
-rw-r--r--desktop/node_modules/@electron/osx-sign/dist/cjs/util-provisioning-profiles.js.map1
-rw-r--r--desktop/node_modules/@electron/osx-sign/dist/cjs/util.d.ts35
-rw-r--r--desktop/node_modules/@electron/osx-sign/dist/cjs/util.js182
-rw-r--r--desktop/node_modules/@electron/osx-sign/dist/cjs/util.js.map1
-rw-r--r--desktop/node_modules/@electron/osx-sign/dist/esm/flat.d.ts11
-rw-r--r--desktop/node_modules/@electron/osx-sign/dist/esm/flat.js125
-rw-r--r--desktop/node_modules/@electron/osx-sign/dist/esm/flat.js.map1
-rw-r--r--desktop/node_modules/@electron/osx-sign/dist/esm/index.d.ts4
-rw-r--r--desktop/node_modules/@electron/osx-sign/dist/esm/index.js14
-rw-r--r--desktop/node_modules/@electron/osx-sign/dist/esm/index.js.map1
-rw-r--r--desktop/node_modules/@electron/osx-sign/dist/esm/sign.d.ts11
-rw-r--r--desktop/node_modules/@electron/osx-sign/dist/esm/sign.js332
-rw-r--r--desktop/node_modules/@electron/osx-sign/dist/esm/sign.js.map1
-rw-r--r--desktop/node_modules/@electron/osx-sign/dist/esm/types.d.ts73
-rw-r--r--desktop/node_modules/@electron/osx-sign/dist/esm/types.js2
-rw-r--r--desktop/node_modules/@electron/osx-sign/dist/esm/types.js.map1
-rw-r--r--desktop/node_modules/@electron/osx-sign/dist/esm/util-entitlements.d.ts17
-rw-r--r--desktop/node_modules/@electron/osx-sign/dist/esm/util-entitlements.js106
-rw-r--r--desktop/node_modules/@electron/osx-sign/dist/esm/util-entitlements.js.map1
-rw-r--r--desktop/node_modules/@electron/osx-sign/dist/esm/util-identities.d.ts6
-rw-r--r--desktop/node_modules/@electron/osx-sign/dist/esm/util-identities.js30
-rw-r--r--desktop/node_modules/@electron/osx-sign/dist/esm/util-identities.js.map1
-rw-r--r--desktop/node_modules/@electron/osx-sign/dist/esm/util-provisioning-profiles.d.ts25
-rw-r--r--desktop/node_modules/@electron/osx-sign/dist/esm/util-provisioning-profiles.js115
-rw-r--r--desktop/node_modules/@electron/osx-sign/dist/esm/util-provisioning-profiles.js.map1
-rw-r--r--desktop/node_modules/@electron/osx-sign/dist/esm/util.d.ts35
-rw-r--r--desktop/node_modules/@electron/osx-sign/dist/esm/util.js145
-rw-r--r--desktop/node_modules/@electron/osx-sign/dist/esm/util.js.map1
-rw-r--r--desktop/node_modules/@electron/osx-sign/entitlements/default.darwin.gpu.plist8
-rw-r--r--desktop/node_modules/@electron/osx-sign/entitlements/default.darwin.plist20
-rw-r--r--desktop/node_modules/@electron/osx-sign/entitlements/default.darwin.plugin.plist10
-rw-r--r--desktop/node_modules/@electron/osx-sign/entitlements/default.darwin.renderer.plist8
-rwxr-xr-xdesktop/node_modules/@electron/osx-sign/entitlements/default.mas.child.plist10
-rwxr-xr-xdesktop/node_modules/@electron/osx-sign/entitlements/default.mas.plist22
-rw-r--r--desktop/node_modules/@electron/osx-sign/node_modules/fs-extra/LICENSE15
-rw-r--r--desktop/node_modules/@electron/osx-sign/node_modules/fs-extra/README.md262
-rw-r--r--desktop/node_modules/@electron/osx-sign/node_modules/fs-extra/lib/copy/copy-sync.js169
-rw-r--r--desktop/node_modules/@electron/osx-sign/node_modules/fs-extra/lib/copy/copy.js235
-rw-r--r--desktop/node_modules/@electron/osx-sign/node_modules/fs-extra/lib/copy/index.js7
-rw-r--r--desktop/node_modules/@electron/osx-sign/node_modules/fs-extra/lib/empty/index.js39
-rw-r--r--desktop/node_modules/@electron/osx-sign/node_modules/fs-extra/lib/ensure/file.js69
-rw-r--r--desktop/node_modules/@electron/osx-sign/node_modules/fs-extra/lib/ensure/index.js23
-rw-r--r--desktop/node_modules/@electron/osx-sign/node_modules/fs-extra/lib/ensure/link.js64
-rw-r--r--desktop/node_modules/@electron/osx-sign/node_modules/fs-extra/lib/ensure/symlink-paths.js99
-rw-r--r--desktop/node_modules/@electron/osx-sign/node_modules/fs-extra/lib/ensure/symlink-type.js31
-rw-r--r--desktop/node_modules/@electron/osx-sign/node_modules/fs-extra/lib/ensure/symlink.js82
-rw-r--r--desktop/node_modules/@electron/osx-sign/node_modules/fs-extra/lib/fs/index.js128
-rw-r--r--desktop/node_modules/@electron/osx-sign/node_modules/fs-extra/lib/index.js16
-rw-r--r--desktop/node_modules/@electron/osx-sign/node_modules/fs-extra/lib/json/index.js16
-rw-r--r--desktop/node_modules/@electron/osx-sign/node_modules/fs-extra/lib/json/jsonfile.js11
-rw-r--r--desktop/node_modules/@electron/osx-sign/node_modules/fs-extra/lib/json/output-json-sync.js12
-rw-r--r--desktop/node_modules/@electron/osx-sign/node_modules/fs-extra/lib/json/output-json.js12
-rw-r--r--desktop/node_modules/@electron/osx-sign/node_modules/fs-extra/lib/mkdirs/index.js14
-rw-r--r--desktop/node_modules/@electron/osx-sign/node_modules/fs-extra/lib/mkdirs/make-dir.js27
-rw-r--r--desktop/node_modules/@electron/osx-sign/node_modules/fs-extra/lib/mkdirs/utils.js21
-rw-r--r--desktop/node_modules/@electron/osx-sign/node_modules/fs-extra/lib/move/index.js7
-rw-r--r--desktop/node_modules/@electron/osx-sign/node_modules/fs-extra/lib/move/move-sync.js54
-rw-r--r--desktop/node_modules/@electron/osx-sign/node_modules/fs-extra/lib/move/move.js75
-rw-r--r--desktop/node_modules/@electron/osx-sign/node_modules/fs-extra/lib/output-file/index.js40
-rw-r--r--desktop/node_modules/@electron/osx-sign/node_modules/fs-extra/lib/path-exists/index.js12
-rw-r--r--desktop/node_modules/@electron/osx-sign/node_modules/fs-extra/lib/remove/index.js22
-rw-r--r--desktop/node_modules/@electron/osx-sign/node_modules/fs-extra/lib/remove/rimraf.js302
-rw-r--r--desktop/node_modules/@electron/osx-sign/node_modules/fs-extra/lib/util/stat.js154
-rw-r--r--desktop/node_modules/@electron/osx-sign/node_modules/fs-extra/lib/util/utimes.js26
-rw-r--r--desktop/node_modules/@electron/osx-sign/node_modules/fs-extra/package.json67
-rw-r--r--desktop/node_modules/@electron/osx-sign/node_modules/jsonfile/CHANGELOG.md171
-rw-r--r--desktop/node_modules/@electron/osx-sign/node_modules/jsonfile/LICENSE15
-rw-r--r--desktop/node_modules/@electron/osx-sign/node_modules/jsonfile/README.md230
-rw-r--r--desktop/node_modules/@electron/osx-sign/node_modules/jsonfile/index.js88
-rw-r--r--desktop/node_modules/@electron/osx-sign/node_modules/jsonfile/package.json40
-rw-r--r--desktop/node_modules/@electron/osx-sign/node_modules/jsonfile/utils.js14
-rw-r--r--desktop/node_modules/@electron/osx-sign/node_modules/universalify/LICENSE20
-rw-r--r--desktop/node_modules/@electron/osx-sign/node_modules/universalify/README.md76
-rw-r--r--desktop/node_modules/@electron/osx-sign/node_modules/universalify/index.js24
-rw-r--r--desktop/node_modules/@electron/osx-sign/node_modules/universalify/package.json34
-rw-r--r--desktop/node_modules/@electron/osx-sign/package.json76
-rw-r--r--desktop/node_modules/@electron/universal/LICENSE21
-rw-r--r--desktop/node_modules/@electron/universal/README.md37
-rw-r--r--desktop/node_modules/@electron/universal/dist/cjs/asar-utils.d.ts16
-rw-r--r--desktop/node_modules/@electron/universal/dist/cjs/asar-utils.js172
-rw-r--r--desktop/node_modules/@electron/universal/dist/cjs/asar-utils.js.map1
-rw-r--r--desktop/node_modules/@electron/universal/dist/cjs/debug.d.ts2
-rw-r--r--desktop/node_modules/@electron/universal/dist/cjs/debug.js6
-rw-r--r--desktop/node_modules/@electron/universal/dist/cjs/debug.js.map1
-rw-r--r--desktop/node_modules/@electron/universal/dist/cjs/file-utils.d.ts16
-rw-r--r--desktop/node_modules/@electron/universal/dist/cjs/file-utils.js71
-rw-r--r--desktop/node_modules/@electron/universal/dist/cjs/file-utils.js.map1
-rw-r--r--desktop/node_modules/@electron/universal/dist/cjs/index.d.ts37
-rw-r--r--desktop/node_modules/@electron/universal/dist/cjs/index.js231
-rw-r--r--desktop/node_modules/@electron/universal/dist/cjs/index.js.map1
-rw-r--r--desktop/node_modules/@electron/universal/dist/cjs/sha.d.ts1
-rw-r--r--desktop/node_modules/@electron/universal/dist/cjs/sha.js19
-rw-r--r--desktop/node_modules/@electron/universal/dist/cjs/sha.js.map1
-rw-r--r--desktop/node_modules/@electron/universal/dist/esm/asar-utils.d.ts16
-rw-r--r--desktop/node_modules/@electron/universal/dist/esm/asar-utils.js169
-rw-r--r--desktop/node_modules/@electron/universal/dist/esm/asar-utils.js.map1
-rw-r--r--desktop/node_modules/@electron/universal/dist/esm/debug.d.ts2
-rw-r--r--desktop/node_modules/@electron/universal/dist/esm/debug.js3
-rw-r--r--desktop/node_modules/@electron/universal/dist/esm/debug.js.map1
-rw-r--r--desktop/node_modules/@electron/universal/dist/esm/file-utils.d.ts16
-rw-r--r--desktop/node_modules/@electron/universal/dist/esm/file-utils.js68
-rw-r--r--desktop/node_modules/@electron/universal/dist/esm/file-utils.js.map1
-rw-r--r--desktop/node_modules/@electron/universal/dist/esm/index.d.ts37
-rw-r--r--desktop/node_modules/@electron/universal/dist/esm/index.js228
-rw-r--r--desktop/node_modules/@electron/universal/dist/esm/index.js.map1
-rw-r--r--desktop/node_modules/@electron/universal/dist/esm/sha.d.ts1
-rw-r--r--desktop/node_modules/@electron/universal/dist/esm/sha.js16
-rw-r--r--desktop/node_modules/@electron/universal/dist/esm/sha.js.map1
-rw-r--r--desktop/node_modules/@electron/universal/entry-asar/has-asar.js26
-rw-r--r--desktop/node_modules/@electron/universal/entry-asar/no-asar.js24
-rw-r--r--desktop/node_modules/@electron/universal/node_modules/fs-extra/CHANGELOG.md902
-rw-r--r--desktop/node_modules/@electron/universal/node_modules/fs-extra/LICENSE15
-rw-r--r--desktop/node_modules/@electron/universal/node_modules/fs-extra/README.md264
-rw-r--r--desktop/node_modules/@electron/universal/node_modules/fs-extra/lib/copy-sync/copy-sync.js166
-rw-r--r--desktop/node_modules/@electron/universal/node_modules/fs-extra/lib/copy-sync/index.js5
-rw-r--r--desktop/node_modules/@electron/universal/node_modules/fs-extra/lib/copy/copy.js232
-rw-r--r--desktop/node_modules/@electron/universal/node_modules/fs-extra/lib/copy/index.js6
-rw-r--r--desktop/node_modules/@electron/universal/node_modules/fs-extra/lib/empty/index.js48
-rw-r--r--desktop/node_modules/@electron/universal/node_modules/fs-extra/lib/ensure/file.js69
-rw-r--r--desktop/node_modules/@electron/universal/node_modules/fs-extra/lib/ensure/index.js23
-rw-r--r--desktop/node_modules/@electron/universal/node_modules/fs-extra/lib/ensure/link.js61
-rw-r--r--desktop/node_modules/@electron/universal/node_modules/fs-extra/lib/ensure/symlink-paths.js99
-rw-r--r--desktop/node_modules/@electron/universal/node_modules/fs-extra/lib/ensure/symlink-type.js31
-rw-r--r--desktop/node_modules/@electron/universal/node_modules/fs-extra/lib/ensure/symlink.js63
-rw-r--r--desktop/node_modules/@electron/universal/node_modules/fs-extra/lib/fs/index.js130
-rw-r--r--desktop/node_modules/@electron/universal/node_modules/fs-extra/lib/index.js27
-rw-r--r--desktop/node_modules/@electron/universal/node_modules/fs-extra/lib/json/index.js16
-rw-r--r--desktop/node_modules/@electron/universal/node_modules/fs-extra/lib/json/jsonfile.js11
-rw-r--r--desktop/node_modules/@electron/universal/node_modules/fs-extra/lib/json/output-json-sync.js12
-rw-r--r--desktop/node_modules/@electron/universal/node_modules/fs-extra/lib/json/output-json.js12
-rw-r--r--desktop/node_modules/@electron/universal/node_modules/fs-extra/lib/mkdirs/index.js14
-rw-r--r--desktop/node_modules/@electron/universal/node_modules/fs-extra/lib/mkdirs/make-dir.js141
-rw-r--r--desktop/node_modules/@electron/universal/node_modules/fs-extra/lib/move-sync/index.js5
-rw-r--r--desktop/node_modules/@electron/universal/node_modules/fs-extra/lib/move-sync/move-sync.js47
-rw-r--r--desktop/node_modules/@electron/universal/node_modules/fs-extra/lib/move/index.js6
-rw-r--r--desktop/node_modules/@electron/universal/node_modules/fs-extra/lib/move/move.js65
-rw-r--r--desktop/node_modules/@electron/universal/node_modules/fs-extra/lib/output/index.js40
-rw-r--r--desktop/node_modules/@electron/universal/node_modules/fs-extra/lib/path-exists/index.js12
-rw-r--r--desktop/node_modules/@electron/universal/node_modules/fs-extra/lib/remove/index.js9
-rw-r--r--desktop/node_modules/@electron/universal/node_modules/fs-extra/lib/remove/rimraf.js302
-rw-r--r--desktop/node_modules/@electron/universal/node_modules/fs-extra/lib/util/stat.js139
-rw-r--r--desktop/node_modules/@electron/universal/node_modules/fs-extra/lib/util/utimes.js26
-rw-r--r--desktop/node_modules/@electron/universal/node_modules/fs-extra/package.json70
-rw-r--r--desktop/node_modules/@electron/universal/node_modules/jsonfile/CHANGELOG.md171
-rw-r--r--desktop/node_modules/@electron/universal/node_modules/jsonfile/LICENSE15
-rw-r--r--desktop/node_modules/@electron/universal/node_modules/jsonfile/README.md230
-rw-r--r--desktop/node_modules/@electron/universal/node_modules/jsonfile/index.js88
-rw-r--r--desktop/node_modules/@electron/universal/node_modules/jsonfile/package.json40
-rw-r--r--desktop/node_modules/@electron/universal/node_modules/jsonfile/utils.js14
-rw-r--r--desktop/node_modules/@electron/universal/node_modules/universalify/LICENSE20
-rw-r--r--desktop/node_modules/@electron/universal/node_modules/universalify/README.md76
-rw-r--r--desktop/node_modules/@electron/universal/node_modules/universalify/index.js24
-rw-r--r--desktop/node_modules/@electron/universal/node_modules/universalify/package.json34
-rw-r--r--desktop/node_modules/@electron/universal/package.json60
319 files changed, 18616 insertions, 0 deletions
diff --git a/desktop/node_modules/@electron/asar/LICENSE.md b/desktop/node_modules/@electron/asar/LICENSE.md
new file mode 100644
index 0000000..4d231b4
--- /dev/null
+++ b/desktop/node_modules/@electron/asar/LICENSE.md
@@ -0,0 +1,20 @@
+Copyright (c) 2014 GitHub Inc.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/desktop/node_modules/@electron/asar/README.md b/desktop/node_modules/@electron/asar/README.md
new file mode 100644
index 0000000..2c223d2
--- /dev/null
+++ b/desktop/node_modules/@electron/asar/README.md
@@ -0,0 +1,213 @@
+# @electron/asar - Electron Archive
+
+[![CircleCI build status](https://circleci.com/gh/electron/asar/tree/main.svg?style=shield)](https://circleci.com/gh/electron/asar/tree/main)
+[![npm version](http://img.shields.io/npm/v/@electron/asar.svg)](https://npmjs.org/package/@electron/asar)
+
+Asar is a simple extensive archive format, it works like `tar` that concatenates
+all files together without compression, while having random access support.
+
+## Features
+
+* Support random access
+* Use JSON to store files' information
+* Very easy to write a parser
+
+## Command line utility
+
+### Install
+
+This module requires Node 10 or later.
+
+```bash
+$ npm install --engine-strict @electron/asar
+```
+
+### Usage
+
+```bash
+$ asar --help
+
+ Usage: asar [options] [command]
+
+ Commands:
+
+ pack|p <dir> <output>
+ create asar archive
+
+ list|l <archive>
+ list files of asar archive
+
+ extract-file|ef <archive> <filename>
+ extract one file from archive
+
+ extract|e <archive> <dest>
+ extract archive
+
+
+ Options:
+
+ -h, --help output usage information
+ -V, --version output the version number
+
+```
+
+#### Excluding multiple resources from being packed
+
+Given:
+```
+ app
+(a) ├── x1
+(b) ├── x2
+(c) ├── y3
+(d) │   ├── x1
+(e) │   └── z1
+(f) │   └── x2
+(g) └── z4
+(h) └── w1
+```
+
+Exclude: a, b
+```bash
+$ asar pack app app.asar --unpack-dir "{x1,x2}"
+```
+
+Exclude: a, b, d, f
+```bash
+$ asar pack app app.asar --unpack-dir "**/{x1,x2}"
+```
+
+Exclude: a, b, d, f, h
+```bash
+$ asar pack app app.asar --unpack-dir "{**/x1,**/x2,z4/w1}"
+```
+
+## Using programatically
+
+### Example
+
+```javascript
+const asar = require('@electron/asar');
+
+const src = 'some/path/';
+const dest = 'name.asar';
+
+await asar.createPackage(src, dest);
+console.log('done.');
+```
+
+Please note that there is currently **no** error handling provided!
+
+### Transform
+You can pass in a `transform` option, that is a function, which either returns
+nothing, or a `stream.Transform`. The latter will be used on files that will be
+in the `.asar` file to transform them (e.g. compress).
+
+```javascript
+const asar = require('@electron/asar');
+
+const src = 'some/path/';
+const dest = 'name.asar';
+
+function transform (filename) {
+ return new CustomTransformStream()
+}
+
+await asar.createPackageWithOptions(src, dest, { transform: transform });
+console.log('done.');
+```
+
+## Using with grunt
+
+There is also an unofficial grunt plugin to generate asar archives at [bwin/grunt-asar][grunt-asar].
+
+## Format
+
+Asar uses [Pickle][pickle] to safely serialize binary value to file.
+
+The format of asar is very flat:
+
+```
+| UInt32: header_size | String: header | Bytes: file1 | ... | Bytes: file42 |
+```
+
+The `header_size` and `header` are serialized with [Pickle][pickle] class, and
+`header_size`'s [Pickle][pickle] object is 8 bytes.
+
+The `header` is a JSON string, and the `header_size` is the size of `header`'s
+`Pickle` object.
+
+Structure of `header` is something like this:
+
+```json
+{
+ "files": {
+ "tmp": {
+ "files": {}
+ },
+ "usr" : {
+ "files": {
+ "bin": {
+ "files": {
+ "ls": {
+ "offset": "0",
+ "size": 100,
+ "executable": true,
+ "integrity": {
+ "algorithm": "SHA256",
+ "hash": "...",
+ "blockSize": 1024,
+ "blocks": ["...", "..."]
+ }
+ },
+ "cd": {
+ "offset": "100",
+ "size": 100,
+ "executable": true,
+ "integrity": {
+ "algorithm": "SHA256",
+ "hash": "...",
+ "blockSize": 1024,
+ "blocks": ["...", "..."]
+ }
+ }
+ }
+ }
+ }
+ },
+ "etc": {
+ "files": {
+ "hosts": {
+ "offset": "200",
+ "size": 32,
+ "integrity": {
+ "algorithm": "SHA256",
+ "hash": "...",
+ "blockSize": 1024,
+ "blocks": ["...", "..."]
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+`offset` and `size` records the information to read the file from archive, the
+`offset` starts from 0 so you have to manually add the size of `header_size` and
+`header` to the `offset` to get the real offset of the file.
+
+`offset` is a UINT64 number represented in string, because there is no way to
+precisely represent UINT64 in JavaScript `Number`. `size` is a JavaScript
+`Number` that is no larger than `Number.MAX_SAFE_INTEGER`, which has a value of
+`9007199254740991` and is about 8PB in size. We didn't store `size` in UINT64
+because file size in Node.js is represented as `Number` and it is not safe to
+convert `Number` to UINT64.
+
+`integrity` is an object consisting of a few keys:
+* A hashing `algorithm`, currently only `SHA256` is supported.
+* A hex encoded `hash` value representing the hash of the entire file.
+* An array of hex encoded hashes for the `blocks` of the file. i.e. for a blockSize of 4KB this array contains the hash of every block if you split the file into N 4KB blocks.
+* A integer value `blockSize` representing the size in bytes of each block in the `blocks` hashes above
+
+[pickle]: https://chromium.googlesource.com/chromium/src/+/main/base/pickle.h
+[grunt-asar]: https://github.com/bwin/grunt-asar
diff --git a/desktop/node_modules/@electron/asar/bin/asar.js b/desktop/node_modules/@electron/asar/bin/asar.js
new file mode 100755
index 0000000..c3d094e
--- /dev/null
+++ b/desktop/node_modules/@electron/asar/bin/asar.js
@@ -0,0 +1,82 @@
+#!/usr/bin/env node
+
+var packageJSON = require('../package.json')
+var splitVersion = function (version) { return version.split('.').map(function (part) { return Number(part) }) }
+var requiredNodeVersion = splitVersion(packageJSON.engines.node.slice(2))
+var actualNodeVersion = splitVersion(process.versions.node)
+
+if (actualNodeVersion[0] < requiredNodeVersion[0] || (actualNodeVersion[0] === requiredNodeVersion[0] && actualNodeVersion[1] < requiredNodeVersion[1])) {
+ console.error('CANNOT RUN WITH NODE ' + process.versions.node)
+ console.error('asar requires Node ' + packageJSON.engines.node + '.')
+ process.exit(1)
+}
+
+// Not consts so that this file can load in Node < 4.0
+var asar = require('../lib/asar')
+var program = require('commander')
+
+program.version('v' + packageJSON.version)
+ .description('Manipulate asar archive files')
+
+program.command('pack <dir> <output>')
+ .alias('p')
+ .description('create asar archive')
+ .option('--ordering <file path>', 'path to a text file for ordering contents')
+ .option('--unpack <expression>', 'do not pack files matching glob <expression>')
+ .option('--unpack-dir <expression>', 'do not pack dirs matching glob <expression> or starting with literal <expression>')
+ .option('--exclude-hidden', 'exclude hidden files')
+ .action(function (dir, output, options) {
+ options = {
+ unpack: options.unpack,
+ unpackDir: options.unpackDir,
+ ordering: options.ordering,
+ version: options.sv,
+ arch: options.sa,
+ builddir: options.sb,
+ dot: !options.excludeHidden
+ }
+ asar.createPackageWithOptions(dir, output, options).catch(error => {
+ console.error(error)
+ process.exit(1)
+ })
+ })
+
+program.command('list <archive>')
+ .alias('l')
+ .description('list files of asar archive')
+ .option('-i, --is-pack', 'each file in the asar is pack or unpack')
+ .action(function (archive, options) {
+ options = {
+ isPack: options.isPack
+ }
+ var files = asar.listPackage(archive, options)
+ for (var i in files) {
+ console.log(files[i])
+ }
+ })
+
+program.command('extract-file <archive> <filename>')
+ .alias('ef')
+ .description('extract one file from archive')
+ .action(function (archive, filename) {
+ require('fs').writeFileSync(require('path').basename(filename),
+ asar.extractFile(archive, filename))
+ })
+
+program.command('extract <archive> <dest>')
+ .alias('e')
+ .description('extract archive')
+ .action(function (archive, dest) {
+ asar.extractAll(archive, dest)
+ })
+
+program.command('*')
+ .action(function (_cmd, args) {
+ console.log('asar: \'%s\' is not an asar command. See \'asar --help\'.', args[0])
+ })
+
+program.parse(process.argv)
+
+if (program.args.length === 0) {
+ program.help()
+}
diff --git a/desktop/node_modules/@electron/asar/lib/asar.js b/desktop/node_modules/@electron/asar/lib/asar.js
new file mode 100644
index 0000000..a0c4563
--- /dev/null
+++ b/desktop/node_modules/@electron/asar/lib/asar.js
@@ -0,0 +1,229 @@
+'use strict'
+
+const fs = require('./wrapped-fs')
+const path = require('path')
+const minimatch = require('minimatch')
+
+const Filesystem = require('./filesystem')
+const disk = require('./disk')
+const crawlFilesystem = require('./crawlfs')
+
+/**
+ * Whether a directory should be excluded from packing due to the `--unpack-dir" option.
+ *
+ * @param {string} dirPath - directory path to check
+ * @param {string} pattern - literal prefix [for backward compatibility] or glob pattern
+ * @param {array} unpackDirs - Array of directory paths previously marked as unpacked
+ */
+function isUnpackedDir (dirPath, pattern, unpackDirs) {
+ if (dirPath.startsWith(pattern) || minimatch(dirPath, pattern)) {
+ if (!unpackDirs.includes(dirPath)) {
+ unpackDirs.push(dirPath)
+ }
+ return true
+ } else {
+ return unpackDirs.some(unpackDir => dirPath.startsWith(unpackDir))
+ }
+}
+
+module.exports.createPackage = async function (src, dest) {
+ return module.exports.createPackageWithOptions(src, dest, {})
+}
+
+module.exports.createPackageWithOptions = async function (src, dest, options) {
+ const globOptions = options.globOptions ? options.globOptions : {}
+ globOptions.dot = options.dot === undefined ? true : options.dot
+
+ const pattern = src + (options.pattern ? options.pattern : '/**/*')
+
+ const [filenames, metadata] = await crawlFilesystem(pattern, globOptions)
+ return module.exports.createPackageFromFiles(src, dest, filenames, metadata, options)
+}
+
+/**
+ * Create an ASAR archive from a list of filenames.
+ *
+ * @param {string} src: Base path. All files are relative to this.
+ * @param {string} dest: Archive filename (& path).
+ * @param {array} filenames: List of filenames relative to src.
+ * @param {object} metadata: Object with filenames as keys and {type='directory|file|link', stat: fs.stat} as values. (Optional)
+ * @param {object} options: Options passed to `createPackageWithOptions`.
+*/
+module.exports.createPackageFromFiles = async function (src, dest, filenames, metadata, options) {
+ if (typeof metadata === 'undefined' || metadata === null) { metadata = {} }
+ if (typeof options === 'undefined' || options === null) { options = {} }
+
+ src = path.normalize(src)
+ dest = path.normalize(dest)
+ filenames = filenames.map(function (filename) { return path.normalize(filename) })
+
+ const filesystem = new Filesystem(src)
+ const files = []
+ const unpackDirs = []
+
+ let filenamesSorted = []
+ if (options.ordering) {
+ const orderingFiles = (await fs.readFile(options.ordering)).toString().split('\n').map(line => {
+ if (line.includes(':')) { line = line.split(':').pop() }
+ line = line.trim()
+ if (line.startsWith('/')) { line = line.slice(1) }
+ return line
+ })
+
+ const ordering = []
+ for (const file of orderingFiles) {
+ const pathComponents = file.split(path.sep)
+ let str = src
+ for (const pathComponent of pathComponents) {
+ str = path.join(str, pathComponent)
+ ordering.push(str)
+ }
+ }
+
+ let missing = 0
+ const total = filenames.length
+
+ for (const file of ordering) {
+ if (!filenamesSorted.includes(file) && filenames.includes(file)) {
+ filenamesSorted.push(file)
+ }
+ }
+
+ for (const file of filenames) {
+ if (!filenamesSorted.includes(file)) {
+ filenamesSorted.push(file)
+ missing += 1
+ }
+ }
+
+ console.log(`Ordering file has ${((total - missing) / total) * 100}% coverage.`)
+ } else {
+ filenamesSorted = filenames
+ }
+
+ const handleFile = async function (filename) {
+ if (!metadata[filename]) {
+ metadata[filename] = await crawlFilesystem.determineFileType(filename)
+ }
+ const file = metadata[filename]
+
+ let shouldUnpack
+ switch (file.type) {
+ case 'directory':
+ if (options.unpackDir) {
+ shouldUnpack = isUnpackedDir(path.relative(src, filename), options.unpackDir, unpackDirs)
+ } else {
+ shouldUnpack = false
+ }
+ filesystem.insertDirectory(filename, shouldUnpack)
+ break
+ case 'file':
+ shouldUnpack = false
+ if (options.unpack) {
+ shouldUnpack = minimatch(filename, options.unpack, { matchBase: true })
+ }
+ if (!shouldUnpack && options.unpackDir) {
+ const dirName = path.relative(src, path.dirname(filename))
+ shouldUnpack = isUnpackedDir(dirName, options.unpackDir, unpackDirs)
+ }
+ files.push({ filename: filename, unpack: shouldUnpack })
+ return filesystem.insertFile(filename, shouldUnpack, file, options)
+ case 'link':
+ filesystem.insertLink(filename)
+ break
+ }
+ return Promise.resolve()
+ }
+
+ const insertsDone = async function () {
+ await fs.mkdirp(path.dirname(dest))
+ return disk.writeFilesystem(dest, filesystem, files, metadata)
+ }
+
+ const names = filenamesSorted.slice()
+
+ const next = async function (name) {
+ if (!name) { return insertsDone() }
+
+ await handleFile(name)
+ return next(names.shift())
+ }
+
+ return next(names.shift())
+}
+
+module.exports.statFile = function (archive, filename, followLinks) {
+ const filesystem = disk.readFilesystemSync(archive)
+ return filesystem.getFile(filename, followLinks)
+}
+
+module.exports.getRawHeader = function (archive) {
+ return disk.readArchiveHeaderSync(archive)
+}
+
+module.exports.listPackage = function (archive, options) {
+ return disk.readFilesystemSync(archive).listFiles(options)
+}
+
+module.exports.extractFile = function (archive, filename) {
+ const filesystem = disk.readFilesystemSync(archive)
+ return disk.readFileSync(filesystem, filename, filesystem.getFile(filename))
+}
+
+module.exports.extractAll = function (archive, dest) {
+ const filesystem = disk.readFilesystemSync(archive)
+ const filenames = filesystem.listFiles()
+
+ // under windows just extract links as regular files
+ const followLinks = process.platform === 'win32'
+
+ // create destination directory
+ fs.mkdirpSync(dest)
+
+ const extractionErrors = []
+ for (const fullPath of filenames) {
+ // Remove leading slash
+ const filename = fullPath.substr(1)
+ const destFilename = path.join(dest, filename)
+ const file = filesystem.getFile(filename, followLinks)
+ if (file.files) {
+ // it's a directory, create it and continue with the next entry
+ fs.mkdirpSync(destFilename)
+ } else if (file.link) {
+ // it's a symlink, create a symlink
+ const linkSrcPath = path.dirname(path.join(dest, file.link))
+ const linkDestPath = path.dirname(destFilename)
+ const relativePath = path.relative(linkDestPath, linkSrcPath)
+ // try to delete output file, because we can't overwrite a link
+ try {
+ fs.unlinkSync(destFilename)
+ } catch {}
+ const linkTo = path.join(relativePath, path.basename(file.link))
+ fs.symlinkSync(linkTo, destFilename)
+ } else {
+ // it's a file, try to extract it
+ try {
+ const content = disk.readFileSync(filesystem, filename, file)
+ fs.writeFileSync(destFilename, content)
+ if (file.executable) {
+ fs.chmodSync(destFilename, '755')
+ }
+ } catch (e) {
+ extractionErrors.push(e)
+ }
+ }
+ }
+ if (extractionErrors.length) {
+ throw new Error(
+ 'Unable to extract some files:\n\n' +
+ extractionErrors.map(error => error.stack).join('\n\n'))
+ }
+}
+
+module.exports.uncache = function (archive) {
+ return disk.uncacheFilesystem(archive)
+}
+
+module.exports.uncacheAll = function () {
+ disk.uncacheAll()
+}
diff --git a/desktop/node_modules/@electron/asar/lib/crawlfs.js b/desktop/node_modules/@electron/asar/lib/crawlfs.js
new file mode 100644
index 0000000..a26c3eb
--- /dev/null
+++ b/desktop/node_modules/@electron/asar/lib/crawlfs.js
@@ -0,0 +1,41 @@
+'use strict'
+
+const { promisify } = require('util')
+
+const fs = require('./wrapped-fs')
+const glob = promisify(require('glob'))
+
+async function determineFileType (filename) {
+ const stat = await fs.lstat(filename)
+ if (stat.isFile()) {
+ return { type: 'file', stat }
+ } else if (stat.isDirectory()) {
+ return { type: 'directory', stat }
+ } else if (stat.isSymbolicLink()) {
+ return { type: 'link', stat }
+ }
+}
+
+module.exports = async function (dir, options) {
+ const metadata = {}
+ const crawled = await glob(dir, options)
+ const results = await Promise.all(crawled.map(async filename => [filename, await determineFileType(filename)]))
+ const links = []
+ const filenames = results.map(([filename, type]) => {
+ if (type) {
+ metadata[filename] = type
+ if (type.type === 'link') links.push(filename)
+ }
+ return filename
+ }).filter((filename) => {
+ // Newer glob can return files inside symlinked directories, to avoid
+ // those appearing in archives we need to manually exclude theme here
+ const exactLinkIndex = links.findIndex(link => filename === link)
+ return links.every((link, index) => {
+ if (index === exactLinkIndex) return true
+ return !filename.startsWith(link)
+ })
+ })
+ return [filenames, metadata]
+}
+module.exports.determineFileType = determineFileType
diff --git a/desktop/node_modules/@electron/asar/lib/disk.js b/desktop/node_modules/@electron/asar/lib/disk.js
new file mode 100644
index 0000000..ad06182
--- /dev/null
+++ b/desktop/node_modules/@electron/asar/lib/disk.js
@@ -0,0 +1,123 @@
+'use strict'
+
+const fs = require('./wrapped-fs')
+const path = require('path')
+const pickle = require('./pickle')
+
+const Filesystem = require('./filesystem')
+let filesystemCache = {}
+
+async function copyFile (dest, src, filename) {
+ const srcFile = path.join(src, filename)
+ const targetFile = path.join(dest, filename)
+
+ const [content, stats] = await Promise.all([fs.readFile(srcFile), fs.stat(srcFile), fs.mkdirp(path.dirname(targetFile))])
+ return fs.writeFile(targetFile, content, { mode: stats.mode })
+}
+
+async function streamTransformedFile (originalFilename, outStream, transformed) {
+ return new Promise((resolve, reject) => {
+ const stream = fs.createReadStream(transformed ? transformed.path : originalFilename)
+ stream.pipe(outStream, { end: false })
+ stream.on('error', reject)
+ stream.on('end', () => resolve())
+ })
+}
+
+const writeFileListToStream = async function (dest, filesystem, out, list, metadata) {
+ for (const file of list) {
+ if (file.unpack) { // the file should not be packed into archive
+ const filename = path.relative(filesystem.src, file.filename)
+ await copyFile(`${dest}.unpacked`, filesystem.src, filename)
+ } else {
+ await streamTransformedFile(file.filename, out, metadata[file.filename].transformed)
+ }
+ }
+ return out.end()
+}
+
+module.exports.writeFilesystem = async function (dest, filesystem, files, metadata) {
+ const headerPickle = pickle.createEmpty()
+ headerPickle.writeString(JSON.stringify(filesystem.header))
+ const headerBuf = headerPickle.toBuffer()
+
+ const sizePickle = pickle.createEmpty()
+ sizePickle.writeUInt32(headerBuf.length)
+ const sizeBuf = sizePickle.toBuffer()
+
+ const out = fs.createWriteStream(dest)
+ await new Promise((resolve, reject) => {
+ out.on('error', reject)
+ out.write(sizeBuf)
+ return out.write(headerBuf, () => resolve())
+ })
+ return writeFileListToStream(dest, filesystem, out, files, metadata)
+}
+
+module.exports.readArchiveHeaderSync = function (archive) {
+ const fd = fs.openSync(archive, 'r')
+ let size
+ let headerBuf
+ try {
+ const sizeBuf = Buffer.alloc(8)
+ if (fs.readSync(fd, sizeBuf, 0, 8, null) !== 8) {
+ throw new Error('Unable to read header size')
+ }
+
+ const sizePickle = pickle.createFromBuffer(sizeBuf)
+ size = sizePickle.createIterator().readUInt32()
+ headerBuf = Buffer.alloc(size)
+ if (fs.readSync(fd, headerBuf, 0, size, null) !== size) {
+ throw new Error('Unable to read header')
+ }
+ } finally {
+ fs.closeSync(fd)
+ }
+
+ const headerPickle = pickle.createFromBuffer(headerBuf)
+ const header = headerPickle.createIterator().readString()
+ return { headerString: header, header: JSON.parse(header), headerSize: size }
+}
+
+module.exports.readFilesystemSync = function (archive) {
+ if (!filesystemCache[archive]) {
+ const header = this.readArchiveHeaderSync(archive)
+ const filesystem = new Filesystem(archive)
+ filesystem.header = header.header
+ filesystem.headerSize = header.headerSize
+ filesystemCache[archive] = filesystem
+ }
+ return filesystemCache[archive]
+}
+
+module.exports.uncacheFilesystem = function (archive) {
+ if (filesystemCache[archive]) {
+ filesystemCache[archive] = undefined
+ return true
+ }
+ return false
+}
+
+module.exports.uncacheAll = function () {
+ filesystemCache = {}
+}
+
+module.exports.readFileSync = function (filesystem, filename, info) {
+ let buffer = Buffer.alloc(info.size)
+ if (info.size <= 0) { return buffer }
+ if (info.unpacked) {
+ // it's an unpacked file, copy it.
+ buffer = fs.readFileSync(path.join(`${filesystem.src}.unpacked`, filename))
+ } else {
+ // Node throws an exception when reading 0 bytes into a 0-size buffer,
+ // so we short-circuit the read in this case.
+ const fd = fs.openSync(filesystem.src, 'r')
+ try {
+ const offset = 8 + filesystem.headerSize + parseInt(info.offset)
+ fs.readSync(fd, buffer, 0, info.size, offset)
+ } finally {
+ fs.closeSync(fd)
+ }
+ }
+ return buffer
+}
diff --git a/desktop/node_modules/@electron/asar/lib/filesystem.js b/desktop/node_modules/@electron/asar/lib/filesystem.js
new file mode 100644
index 0000000..ce10245
--- /dev/null
+++ b/desktop/node_modules/@electron/asar/lib/filesystem.js
@@ -0,0 +1,154 @@
+'use strict'
+
+const fs = require('./wrapped-fs')
+const os = require('os')
+const path = require('path')
+const { promisify } = require('util')
+const stream = require('stream')
+const getFileIntegrity = require('./integrity')
+
+const UINT32_MAX = 2 ** 32 - 1
+
+const pipeline = promisify(stream.pipeline)
+
+class Filesystem {
+ constructor (src) {
+ this.src = path.resolve(src)
+ this.header = { files: Object.create(null) }
+ this.offset = BigInt(0)
+ }
+
+ searchNodeFromDirectory (p) {
+ let json = this.header
+ const dirs = p.split(path.sep)
+ for (const dir of dirs) {
+ if (dir !== '.') {
+ if (!json.files[dir]) {
+ json.files[dir] = { files: Object.create(null) }
+ }
+ json = json.files[dir]
+ }
+ }
+ return json
+ }
+
+ searchNodeFromPath (p) {
+ p = path.relative(this.src, p)
+ if (!p) { return this.header }
+ const name = path.basename(p)
+ const node = this.searchNodeFromDirectory(path.dirname(p))
+ if (node.files == null) {
+ node.files = Object.create(null)
+ }
+ if (node.files[name] == null) {
+ node.files[name] = Object.create(null)
+ }
+ return node.files[name]
+ }
+
+ insertDirectory (p, shouldUnpack) {
+ const node = this.searchNodeFromPath(p)
+ if (shouldUnpack) {
+ node.unpacked = shouldUnpack
+ }
+ node.files = node.files || Object.create(null)
+ return node.files
+ }
+
+ async insertFile (p, shouldUnpack, file, options) {
+ const dirNode = this.searchNodeFromPath(path.dirname(p))
+ const node = this.searchNodeFromPath(p)
+ if (shouldUnpack || dirNode.unpacked) {
+ node.size = file.stat.size
+ node.unpacked = true
+ node.integrity = await getFileIntegrity(p)
+ return Promise.resolve()
+ }
+
+ let size
+
+ const transformed = options.transform && options.transform(p)
+ if (transformed) {
+ const tmpdir = await fs.mkdtemp(path.join(os.tmpdir(), 'asar-'))
+ const tmpfile = path.join(tmpdir, path.basename(p))
+ const out = fs.createWriteStream(tmpfile)
+ const readStream = fs.createReadStream(p)
+
+ await pipeline(readStream, transformed, out)
+ file.transformed = {
+ path: tmpfile,
+ stat: await fs.lstat(tmpfile)
+ }
+ size = file.transformed.stat.size
+ } else {
+ size = file.stat.size
+ }
+
+ // JavaScript cannot precisely present integers >= UINT32_MAX.
+ if (size > UINT32_MAX) {
+ throw new Error(`${p}: file size can not be larger than 4.2GB`)
+ }
+
+ node.size = size
+ node.offset = this.offset.toString()
+ node.integrity = await getFileIntegrity(p)
+ if (process.platform !== 'win32' && (file.stat.mode & 0o100)) {
+ node.executable = true
+ }
+ this.offset += BigInt(size)
+ }
+
+ insertLink (p) {
+ const link = path.relative(fs.realpathSync(this.src), fs.realpathSync(p))
+ if (link.substr(0, 2) === '..') {
+ throw new Error(`${p}: file "${link}" links out of the package`)
+ }
+ const node = this.searchNodeFromPath(p)
+ node.link = link
+ return link
+ }
+
+ listFiles (options) {
+ const files = []
+
+ const fillFilesFromMetadata = function (basePath, metadata) {
+ if (!metadata.files) {
+ return
+ }
+
+ for (const [childPath, childMetadata] of Object.entries(metadata.files)) {
+ const fullPath = path.join(basePath, childPath)
+ const packState = childMetadata.unpacked ? 'unpack' : 'pack '
+ files.push((options && options.isPack) ? `${packState} : ${fullPath}` : fullPath)
+ fillFilesFromMetadata(fullPath, childMetadata)
+ }
+ }
+
+ fillFilesFromMetadata('/', this.header)
+ return files
+ }
+
+ getNode (p) {
+ const node = this.searchNodeFromDirectory(path.dirname(p))
+ const name = path.basename(p)
+ if (name) {
+ return node.files[name]
+ } else {
+ return node
+ }
+ }
+
+ getFile (p, followLinks) {
+ followLinks = typeof followLinks === 'undefined' ? true : followLinks
+ const info = this.getNode(p)
+
+ // if followLinks is false we don't resolve symlinks
+ if (info.link && followLinks) {
+ return this.getFile(info.link)
+ } else {
+ return info
+ }
+ }
+}
+
+module.exports = Filesystem
diff --git a/desktop/node_modules/@electron/asar/lib/index.d.ts b/desktop/node_modules/@electron/asar/lib/index.d.ts
new file mode 100644
index 0000000..b79528b
--- /dev/null
+++ b/desktop/node_modules/@electron/asar/lib/index.d.ts
@@ -0,0 +1,250 @@
+import { Stats } from "fs";
+
+interface IMinimatchOptions {
+ /**
+ * Dump a ton of stuff to stderr.
+ *
+ * @default false
+ */
+ debug?: boolean | undefined;
+
+ /**
+ * Do not expand `{a,b}` and `{1..3}` brace sets.
+ *
+ * @default false
+ */
+ nobrace?: boolean | undefined;
+
+ /**
+ * Disable `**` matching against multiple folder names.
+ *
+ * @default false
+ */
+ noglobstar?: boolean | undefined;
+
+ /**
+ * Allow patterns to match filenames starting with a period,
+ * even if the pattern does not explicitly have a period in that spot.
+ *
+ * Note that by default, `'a/**' + '/b'` will **not** match `a/.d/b`, unless `dot` is set.
+ *
+ * @default false
+ */
+ dot?: boolean | undefined;
+
+ /**
+ * Disable "extglob" style patterns like `+(a|b)`.
+ *
+ * @default false
+ */
+ noext?: boolean | undefined;
+
+ /**
+ * Perform a case-insensitive match.
+ *
+ * @default false
+ */
+ nocase?: boolean | undefined;
+
+ /**
+ * When a match is not found by `minimatch.match`,
+ * return a list containing the pattern itself if this option is set.
+ * Otherwise, an empty list is returned if there are no matches.
+ *
+ * @default false
+ */
+ nonull?: boolean | undefined;
+
+ /**
+ * If set, then patterns without slashes will be matched
+ * against the basename of the path if it contains slashes. For example,
+ * `a?b` would match the path `/xyz/123/acb`, but not `/xyz/acb/123`.
+ *
+ * @default false
+ */
+ matchBase?: boolean | undefined;
+
+ /**
+ * Suppress the behavior of treating `#` at the start of a pattern as a comment.
+ *
+ * @default false
+ */
+ nocomment?: boolean | undefined;
+
+ /**
+ * Suppress the behavior of treating a leading `!` character as negation.
+ *
+ * @default false
+ */
+ nonegate?: boolean | undefined;
+
+ /**
+ * Returns from negate expressions the same as if they were not negated.
+ * (Ie, true on a hit, false on a miss.)
+ *
+ * @default false
+ */
+ flipNegate?: boolean | undefined;
+
+ /**
+ * Compare a partial path to a pattern. As long as the parts of the path that
+ * are present are not contradicted by the pattern, it will be treated as a
+ * match. This is useful in applications where you're walking through a
+ * folder structure, and don't yet have the full path, but want to ensure that
+ * you do not walk down paths that can never be a match.
+ *
+ * @default false
+ *
+ * @example
+ * import minimatch = require("minimatch");
+ *
+ * minimatch('/a/b', '/a/*' + '/c/d', { partial: true }) // true, might be /a/b/c/d
+ * minimatch('/a/b', '/**' + '/d', { partial: true }) // true, might be /a/b/.../d
+ * minimatch('/x/y/z', '/a/**' + '/z', { partial: true }) // false, because x !== a
+ */
+ partial?: boolean;
+
+ /**
+ * Use `\\` as a path separator _only_, and _never_ as an escape
+ * character. If set, all `\\` characters are replaced with `/` in
+ * the pattern. Note that this makes it **impossible** to match
+ * against paths containing literal glob pattern characters, but
+ * allows matching with patterns constructed using `path.join()` and
+ * `path.resolve()` on Windows platforms, mimicking the (buggy!)
+ * behavior of earlier versions on Windows. Please use with
+ * caution, and be mindful of the caveat about Windows paths
+ *
+ * For legacy reasons, this is also set if
+ * `options.allowWindowsEscape` is set to the exact value `false`.
+ *
+ * @default false
+ */
+ windowsPathsNoEscape?: boolean;
+}
+
+import fs = require("fs");
+interface IGlobOptions extends IMinimatchOptions {
+ cwd?: string | undefined;
+ root?: string | undefined;
+ dot?: boolean | undefined;
+ nomount?: boolean | undefined;
+ mark?: boolean | undefined;
+ nosort?: boolean | undefined;
+ stat?: boolean | undefined;
+ silent?: boolean | undefined;
+ strict?: boolean | undefined;
+ cache?:
+ | { [path: string]: boolean | "DIR" | "FILE" | ReadonlyArray<string> }
+ | undefined;
+ statCache?:
+ | { [path: string]: false | { isDirectory(): boolean } | undefined }
+ | undefined;
+ symlinks?: { [path: string]: boolean | undefined } | undefined;
+ realpathCache?: { [path: string]: string } | undefined;
+ sync?: boolean | undefined;
+ nounique?: boolean | undefined;
+ nonull?: boolean | undefined;
+ debug?: boolean | undefined;
+ nobrace?: boolean | undefined;
+ noglobstar?: boolean | undefined;
+ noext?: boolean | undefined;
+ nocase?: boolean | undefined;
+ matchBase?: any;
+ nodir?: boolean | undefined;
+ ignore?: string | ReadonlyArray<string> | undefined;
+ follow?: boolean | undefined;
+ realpath?: boolean | undefined;
+ nonegate?: boolean | undefined;
+ nocomment?: boolean | undefined;
+ absolute?: boolean | undefined;
+ allowWindowsEscape?: boolean | undefined;
+ fs?: typeof fs;
+}
+
+export type CreateOptions = {
+ dot?: boolean;
+ globOptions?: IGlobOptions;
+ ordering?: string;
+ pattern?: string;
+ transform?: (filePath: string) => NodeJS.ReadWriteStream | void;
+ unpack?: string;
+ unpackDir?: string;
+};
+
+export type ListOptions = {
+ isPack: boolean;
+};
+
+export type EntryMetadata = {
+ unpacked: boolean;
+};
+
+export type DirectoryMetadata = EntryMetadata & {
+ files: { [property: string]: EntryMetadata };
+};
+
+export type FileMetadata = EntryMetadata & {
+ executable?: true;
+ offset?: number;
+ size?: number;
+};
+
+export type LinkMetadata = {
+ link: string;
+};
+
+export type Metadata = DirectoryMetadata | FileMetadata | LinkMetadata;
+
+export type InputMetadataType = 'directory' | 'file' | 'link';
+
+export type InputMetadata = {
+ [property: string]: {
+ type: InputMetadataType;
+ stat: Stats;
+ }
+};
+
+export type DirectoryRecord = {
+ files: Record<string, DirectoryRecord | FileRecord>;
+};
+
+export type FileRecord = {
+ offset: string;
+ size: number;
+ executable?: boolean;
+ integrity: {
+ hash: string;
+ algorithm: 'SHA256';
+ blocks: string[];
+ blockSize: number;
+ };
+}
+
+export type ArchiveHeader = {
+ // The JSON parsed header string
+ header: DirectoryRecord;
+ headerString: string;
+ headerSize: number;
+}
+
+export function createPackage(src: string, dest: string): Promise<void>;
+export function createPackageWithOptions(
+ src: string,
+ dest: string,
+ options: CreateOptions
+): Promise<void>;
+export function createPackageFromFiles(
+ src: string,
+ dest: string,
+ filenames: string[],
+ metadata?: InputMetadata,
+ options?: CreateOptions
+): Promise<void>;
+
+export function statFile(archive: string, filename: string, followLinks?: boolean): Metadata;
+export function getRawHeader(archive: string): ArchiveHeader;
+export function listPackage(archive: string, options?: ListOptions): string[];
+export function extractFile(archive: string, filename: string): Buffer;
+export function extractAll(archive: string, dest: string): void;
+export function uncache(archive: string): boolean;
+export function uncacheAll(): void;
diff --git a/desktop/node_modules/@electron/asar/lib/integrity.js b/desktop/node_modules/@electron/asar/lib/integrity.js
new file mode 100644
index 0000000..6fabee4
--- /dev/null
+++ b/desktop/node_modules/@electron/asar/lib/integrity.js
@@ -0,0 +1,62 @@
+const crypto = require('crypto')
+const fs = require('fs')
+const stream = require('stream')
+const { promisify } = require('util')
+
+const ALGORITHM = 'SHA256'
+// 4MB default block size
+const BLOCK_SIZE = 4 * 1024 * 1024
+
+const pipeline = promisify(stream.pipeline)
+
+function hashBlock (block) {
+ return crypto.createHash(ALGORITHM).update(block).digest('hex')
+}
+
+async function getFileIntegrity (path) {
+ const fileHash = crypto.createHash(ALGORITHM)
+
+ const blocks = []
+ let currentBlockSize = 0
+ let currentBlock = []
+
+ await pipeline(
+ fs.createReadStream(path),
+ new stream.PassThrough({
+ decodeStrings: false,
+ transform (_chunk, encoding, callback) {
+ fileHash.update(_chunk)
+
+ function handleChunk (chunk) {
+ const diffToSlice = Math.min(BLOCK_SIZE - currentBlockSize, chunk.byteLength)
+ currentBlockSize += diffToSlice
+ currentBlock.push(chunk.slice(0, diffToSlice))
+ if (currentBlockSize === BLOCK_SIZE) {
+ blocks.push(hashBlock(Buffer.concat(currentBlock)))
+ currentBlock = []
+ currentBlockSize = 0
+ }
+ if (diffToSlice < chunk.byteLength) {
+ handleChunk(chunk.slice(diffToSlice))
+ }
+ }
+ handleChunk(_chunk)
+ callback()
+ },
+ flush (callback) {
+ blocks.push(hashBlock(Buffer.concat(currentBlock)))
+ currentBlock = []
+ callback()
+ }
+ })
+ )
+
+ return {
+ algorithm: ALGORITHM,
+ hash: fileHash.digest('hex'),
+ blockSize: BLOCK_SIZE,
+ blocks: blocks
+ }
+}
+
+module.exports = getFileIntegrity
diff --git a/desktop/node_modules/@electron/asar/lib/pickle.js b/desktop/node_modules/@electron/asar/lib/pickle.js
new file mode 100644
index 0000000..6943655
--- /dev/null
+++ b/desktop/node_modules/@electron/asar/lib/pickle.js
@@ -0,0 +1,230 @@
+// sizeof(T).
+const SIZE_INT32 = 4
+const SIZE_UINT32 = 4
+const SIZE_INT64 = 8
+const SIZE_UINT64 = 8
+const SIZE_FLOAT = 4
+const SIZE_DOUBLE = 8
+
+// The allocation granularity of the payload.
+const PAYLOAD_UNIT = 64
+
+// Largest JS number.
+const CAPACITY_READ_ONLY = 9007199254740992
+
+// Aligns 'i' by rounding it up to the next multiple of 'alignment'.
+const alignInt = function (i, alignment) {
+ return i + (alignment - (i % alignment)) % alignment
+}
+
+// PickleIterator reads data from a Pickle. The Pickle object must remain valid
+// while the PickleIterator object is in use.
+const PickleIterator = (function () {
+ function PickleIterator (pickle) {
+ this.payload = pickle.header
+ this.payloadOffset = pickle.headerSize
+ this.readIndex = 0
+ this.endIndex = pickle.getPayloadSize()
+ }
+
+ PickleIterator.prototype.readBool = function () {
+ return this.readInt() !== 0
+ }
+
+ PickleIterator.prototype.readInt = function () {
+ return this.readBytes(SIZE_INT32, Buffer.prototype.readInt32LE)
+ }
+
+ PickleIterator.prototype.readUInt32 = function () {
+ return this.readBytes(SIZE_UINT32, Buffer.prototype.readUInt32LE)
+ }
+
+ PickleIterator.prototype.readInt64 = function () {
+ return this.readBytes(SIZE_INT64, Buffer.prototype.readInt64LE)
+ }
+
+ PickleIterator.prototype.readUInt64 = function () {
+ return this.readBytes(SIZE_UINT64, Buffer.prototype.readUInt64LE)
+ }
+
+ PickleIterator.prototype.readFloat = function () {
+ return this.readBytes(SIZE_FLOAT, Buffer.prototype.readFloatLE)
+ }
+
+ PickleIterator.prototype.readDouble = function () {
+ return this.readBytes(SIZE_DOUBLE, Buffer.prototype.readDoubleLE)
+ }
+
+ PickleIterator.prototype.readString = function () {
+ return this.readBytes(this.readInt()).toString()
+ }
+
+ PickleIterator.prototype.readBytes = function (length, method) {
+ const readPayloadOffset = this.getReadPayloadOffsetAndAdvance(length)
+ if (method != null) {
+ return method.call(this.payload, readPayloadOffset, length)
+ } else {
+ return this.payload.slice(readPayloadOffset, readPayloadOffset + length)
+ }
+ }
+
+ PickleIterator.prototype.getReadPayloadOffsetAndAdvance = function (length) {
+ if (length > this.endIndex - this.readIndex) {
+ this.readIndex = this.endIndex
+ throw new Error('Failed to read data with length of ' + length)
+ }
+ const readPayloadOffset = this.payloadOffset + this.readIndex
+ this.advance(length)
+ return readPayloadOffset
+ }
+
+ PickleIterator.prototype.advance = function (size) {
+ const alignedSize = alignInt(size, SIZE_UINT32)
+ if (this.endIndex - this.readIndex < alignedSize) {
+ this.readIndex = this.endIndex
+ } else {
+ this.readIndex += alignedSize
+ }
+ }
+
+ return PickleIterator
+})()
+
+// This class provides facilities for basic binary value packing and unpacking.
+//
+// The Pickle class supports appending primitive values (ints, strings, etc.)
+// to a pickle instance. The Pickle instance grows its internal memory buffer
+// dynamically to hold the sequence of primitive values. The internal memory
+// buffer is exposed as the "data" of the Pickle. This "data" can be passed
+// to a Pickle object to initialize it for reading.
+//
+// When reading from a Pickle object, it is important for the consumer to know
+// what value types to read and in what order to read them as the Pickle does
+// not keep track of the type of data written to it.
+//
+// The Pickle's data has a header which contains the size of the Pickle's
+// payload. It can optionally support additional space in the header. That
+// space is controlled by the header_size parameter passed to the Pickle
+// constructor.
+const Pickle = (function () {
+ function Pickle (buffer) {
+ if (buffer) {
+ this.initFromBuffer(buffer)
+ } else {
+ this.initEmpty()
+ }
+ }
+
+ Pickle.prototype.initEmpty = function () {
+ this.header = Buffer.alloc(0)
+ this.headerSize = SIZE_UINT32
+ this.capacityAfterHeader = 0
+ this.writeOffset = 0
+ this.resize(PAYLOAD_UNIT)
+ this.setPayloadSize(0)
+ }
+
+ Pickle.prototype.initFromBuffer = function (buffer) {
+ this.header = buffer
+ this.headerSize = buffer.length - this.getPayloadSize()
+ this.capacityAfterHeader = CAPACITY_READ_ONLY
+ this.writeOffset = 0
+ if (this.headerSize > buffer.length) {
+ this.headerSize = 0
+ }
+ if (this.headerSize !== alignInt(this.headerSize, SIZE_UINT32)) {
+ this.headerSize = 0
+ }
+ if (this.headerSize === 0) {
+ this.header = Buffer.alloc(0)
+ }
+ }
+
+ Pickle.prototype.createIterator = function () {
+ return new PickleIterator(this)
+ }
+
+ Pickle.prototype.toBuffer = function () {
+ return this.header.slice(0, this.headerSize + this.getPayloadSize())
+ }
+
+ Pickle.prototype.writeBool = function (value) {
+ return this.writeInt(value ? 1 : 0)
+ }
+
+ Pickle.prototype.writeInt = function (value) {
+ return this.writeBytes(value, SIZE_INT32, Buffer.prototype.writeInt32LE)
+ }
+
+ Pickle.prototype.writeUInt32 = function (value) {
+ return this.writeBytes(value, SIZE_UINT32, Buffer.prototype.writeUInt32LE)
+ }
+
+ Pickle.prototype.writeInt64 = function (value) {
+ return this.writeBytes(value, SIZE_INT64, Buffer.prototype.writeInt64LE)
+ }
+
+ Pickle.prototype.writeUInt64 = function (value) {
+ return this.writeBytes(value, SIZE_UINT64, Buffer.prototype.writeUInt64LE)
+ }
+
+ Pickle.prototype.writeFloat = function (value) {
+ return this.writeBytes(value, SIZE_FLOAT, Buffer.prototype.writeFloatLE)
+ }
+
+ Pickle.prototype.writeDouble = function (value) {
+ return this.writeBytes(value, SIZE_DOUBLE, Buffer.prototype.writeDoubleLE)
+ }
+
+ Pickle.prototype.writeString = function (value) {
+ const length = Buffer.byteLength(value, 'utf8')
+ if (!this.writeInt(length)) {
+ return false
+ }
+ return this.writeBytes(value, length)
+ }
+
+ Pickle.prototype.setPayloadSize = function (payloadSize) {
+ return this.header.writeUInt32LE(payloadSize, 0)
+ }
+
+ Pickle.prototype.getPayloadSize = function () {
+ return this.header.readUInt32LE(0)
+ }
+
+ Pickle.prototype.writeBytes = function (data, length, method) {
+ const dataLength = alignInt(length, SIZE_UINT32)
+ const newSize = this.writeOffset + dataLength
+ if (newSize > this.capacityAfterHeader) {
+ this.resize(Math.max(this.capacityAfterHeader * 2, newSize))
+ }
+ if (method != null) {
+ method.call(this.header, data, this.headerSize + this.writeOffset)
+ } else {
+ this.header.write(data, this.headerSize + this.writeOffset, length)
+ }
+ const endOffset = this.headerSize + this.writeOffset + length
+ this.header.fill(0, endOffset, endOffset + dataLength - length)
+ this.setPayloadSize(newSize)
+ this.writeOffset = newSize
+ return true
+ }
+
+ Pickle.prototype.resize = function (newCapacity) {
+ newCapacity = alignInt(newCapacity, PAYLOAD_UNIT)
+ this.header = Buffer.concat([this.header, Buffer.alloc(newCapacity)])
+ this.capacityAfterHeader = newCapacity
+ }
+
+ return Pickle
+})()
+
+module.exports = {
+ createEmpty: function () {
+ return new Pickle()
+ },
+
+ createFromBuffer: function (buffer) {
+ return new Pickle(buffer)
+ }
+}
diff --git a/desktop/node_modules/@electron/asar/lib/wrapped-fs.js b/desktop/node_modules/@electron/asar/lib/wrapped-fs.js
new file mode 100644
index 0000000..24f59d0
--- /dev/null
+++ b/desktop/node_modules/@electron/asar/lib/wrapped-fs.js
@@ -0,0 +1,26 @@
+'use strict'
+
+const fs = process.versions.electron ? require('original-fs') : require('fs')
+
+const promisifiedMethods = [
+ 'lstat',
+ 'mkdtemp',
+ 'readFile',
+ 'stat',
+ 'writeFile'
+]
+
+const promisified = {}
+
+for (const method of Object.keys(fs)) {
+ if (promisifiedMethods.includes(method)) {
+ promisified[method] = fs.promises[method]
+ } else {
+ promisified[method] = fs[method]
+ }
+}
+// To make it more like fs-extra
+promisified.mkdirp = (dir) => fs.promises.mkdir(dir, { recursive: true })
+promisified.mkdirpSync = (dir) => fs.mkdirSync(dir, { recursive: true })
+
+module.exports = promisified
diff --git a/desktop/node_modules/@electron/asar/package.json b/desktop/node_modules/@electron/asar/package.json
new file mode 100644
index 0000000..66b75d1
--- /dev/null
+++ b/desktop/node_modules/@electron/asar/package.json
@@ -0,0 +1,61 @@
+{
+ "name": "@electron/asar",
+ "description": "Creating Electron app packages",
+ "version": "3.2.7",
+ "main": "./lib/asar.js",
+ "types": "./lib/index.d.ts",
+ "bin": {
+ "asar": "./bin/asar.js"
+ },
+ "files": [
+ "bin",
+ "lib",
+ "lib/index.d.ts"
+ ],
+ "engines": {
+ "node": ">=10.12.0"
+ },
+ "license": "MIT",
+ "homepage": "https://github.com/electron/asar",
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/electron/asar.git"
+ },
+ "bugs": {
+ "url": "https://github.com/electron/asar/issues"
+ },
+ "scripts": {
+ "mocha": "xvfb-maybe electron-mocha --reporter spec && mocha --reporter spec",
+ "test": "npm run lint && npm run mocha",
+ "lint": "tsd && standard",
+ "standard": "standard",
+ "tsd": "tsd"
+ },
+ "standard": {
+ "env": {
+ "mocha": true
+ },
+ "globals": [
+ "BigInt"
+ ]
+ },
+ "tsd": {
+ "directory": "test"
+ },
+ "dependencies": {
+ "commander": "^5.0.0",
+ "glob": "^7.1.6",
+ "minimatch": "^3.0.4"
+ },
+ "devDependencies": {
+ "@continuous-auth/semantic-release-npm": "^3.0.0",
+ "electron": "^22.0.0",
+ "electron-mocha": "^11.0.2",
+ "lodash": "^4.17.15",
+ "mocha": "^10.1.0",
+ "rimraf": "^3.0.2",
+ "standard": "^14.3.3",
+ "tsd": "^0.25.0",
+ "xvfb-maybe": "^0.2.1"
+ }
+}
diff --git a/desktop/node_modules/@electron/get/LICENSE b/desktop/node_modules/@electron/get/LICENSE
new file mode 100644
index 0000000..dc1402e
--- /dev/null
+++ b/desktop/node_modules/@electron/get/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) Contributors to the Electron project
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/desktop/node_modules/@electron/get/README.md b/desktop/node_modules/@electron/get/README.md
new file mode 100644
index 0000000..dce88ce
--- /dev/null
+++ b/desktop/node_modules/@electron/get/README.md
@@ -0,0 +1,138 @@
+# @electron/get
+
+> Download Electron release artifacts
+
+[![CircleCI](https://circleci.com/gh/electron/get.svg?style=shield)](https://circleci.com/gh/electron/get)
+[![NPM package](https://img.shields.io/npm/v/@electron/get)](https://npm.im/@electron/get)
+
+## Usage
+
+### Simple: Downloading an Electron Binary ZIP
+
+```typescript
+import { download } from '@electron/get';
+
+// NB: Use this syntax within an async function, Node does not have support for
+// top-level await as of Node 12.
+const zipFilePath = await download('4.0.4');
+```
+
+### Advanced: Downloading a macOS Electron Symbol File
+
+
+```typescript
+import { downloadArtifact } from '@electron/get';
+
+// NB: Use this syntax within an async function, Node does not have support for
+// top-level await as of Node 12.
+const zipFilePath = await downloadArtifact({
+ version: '4.0.4',
+ platform: 'darwin',
+ artifactName: 'electron',
+ artifactSuffix: 'symbols',
+ arch: 'x64',
+});
+```
+
+### Specifying a mirror
+
+To specify another location to download Electron assets from, the following options are
+available:
+
+* `mirrorOptions` Object
+ * `mirror` String (optional) - The base URL of the mirror to download from.
+ * `nightlyMirror` String (optional) - The Electron nightly-specific mirror URL.
+ * `customDir` String (optional) - The name of the directory to download from, often scoped by version number.
+ * `customFilename` String (optional) - The name of the asset to download.
+ * `resolveAssetURL` Function (optional) - A function allowing customization of the url used to download the asset.
+
+Anatomy of a download URL, in terms of `mirrorOptions`:
+
+```
+https://github.com/electron/electron/releases/download/v4.0.4/electron-v4.0.4-linux-x64.zip
+| | | |
+------------------------------------------------------- -----------------------------
+ | |
+ mirror / nightlyMirror | | customFilename
+ ------
+ ||
+ customDir
+```
+
+Example:
+
+```typescript
+import { download } from '@electron/get';
+
+const zipFilePath = await download('4.0.4', {
+ mirrorOptions: {
+ mirror: 'https://mirror.example.com/electron/',
+ customDir: 'custom',
+ customFilename: 'unofficial-electron-linux.zip'
+ }
+});
+// Will download from https://mirror.example.com/electron/custom/unofficial-electron-linux.zip
+
+const nightlyZipFilePath = await download('8.0.0-nightly.20190901', {
+ mirrorOptions: {
+ nightlyMirror: 'https://nightly.example.com/',
+ customDir: 'nightlies',
+ customFilename: 'nightly-linux.zip'
+ }
+});
+// Will download from https://nightly.example.com/nightlies/nightly-linux.zip
+```
+
+`customDir` can have the placeholder `{{ version }}`, which will be replaced by the version
+specified (without the leading `v`). For example:
+
+```javascript
+const zipFilePath = await download('4.0.4', {
+ mirrorOptions: {
+ mirror: 'https://mirror.example.com/electron/',
+ customDir: 'version-{{ version }}',
+ platform: 'linux',
+ arch: 'x64'
+ }
+});
+// Will download from https://mirror.example.com/electron/version-4.0.4/electron-v4.0.4-linux-x64.zip
+```
+
+#### Using environment variables for mirror options
+Mirror options can also be specified via the following environment variables:
+* `ELECTRON_CUSTOM_DIR` - Specifies the custom directory to download from.
+* `ELECTRON_CUSTOM_FILENAME` - Specifies the custom file name to download.
+* `ELECTRON_MIRROR` - Specifies the URL of the server to download from if the version is not a nightly version.
+* `ELECTRON_NIGHTLY_MIRROR` - Specifies the URL of the server to download from if the version is a nightly version.
+
+### Overriding the version downloaded
+
+The version downloaded can be overriden by setting the `ELECTRON_CUSTOM_VERSION` environment variable.
+Setting this environment variable will override the version passed in to `download` or `downloadArtifact`.
+
+## How It Works
+
+This module downloads Electron to a known place on your system and caches it
+so that future requests for that asset can be returned instantly. The cache
+locations are:
+
+* Linux: `$XDG_CACHE_HOME` or `~/.cache/electron/`
+* MacOS: `~/Library/Caches/electron/`
+* Windows: `%LOCALAPPDATA%/electron/Cache` or `~/AppData/Local/electron/Cache/`
+
+By default, the module uses [`got`](https://github.com/sindresorhus/got) as the
+downloader. As a result, you can use the same [options](https://github.com/sindresorhus/got#options)
+via `downloadOptions`.
+
+### Progress Bar
+
+By default, a progress bar is shown when downloading an artifact for more than 30 seconds. To
+disable, set the `ELECTRON_GET_NO_PROGRESS` environment variable to any non-empty value, or set
+`quiet` to `true` in `downloadOptions`. If you need to monitor progress yourself via the API, set
+`getProgressCallback` in `downloadOptions`, which has the same function signature as `got`'s
+[`downloadProgress` event callback](https://github.com/sindresorhus/got#ondownloadprogress-progress).
+
+### Proxies
+
+Downstream packages should utilize the `initializeProxy` function to add HTTP(S) proxy support. If
+the environment variable `ELECTRON_GET_USE_PROXY` is set, it is called automatically.
diff --git a/desktop/node_modules/@electron/get/dist/cjs/Cache.d.ts b/desktop/node_modules/@electron/get/dist/cjs/Cache.d.ts
new file mode 100644
index 0000000..626001a
--- /dev/null
+++ b/desktop/node_modules/@electron/get/dist/cjs/Cache.d.ts
@@ -0,0 +1,8 @@
+export declare class Cache {
+ private cacheRoot;
+ constructor(cacheRoot?: string);
+ static getCacheDirectory(downloadUrl: string): string;
+ getCachePath(downloadUrl: string, fileName: string): string;
+ getPathForFileInCache(url: string, fileName: string): Promise<string | null>;
+ putFileInCache(url: string, currentPath: string, fileName: string): Promise<string>;
+}
diff --git a/desktop/node_modules/@electron/get/dist/cjs/Cache.js b/desktop/node_modules/@electron/get/dist/cjs/Cache.js
new file mode 100644
index 0000000..b8cd197
--- /dev/null
+++ b/desktop/node_modules/@electron/get/dist/cjs/Cache.js
@@ -0,0 +1,60 @@
+"use strict";
+var __rest = (this && this.__rest) || function (s, e) {
+ var t = {};
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
+ t[p] = s[p];
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
+ t[p[i]] = s[p[i]];
+ }
+ return t;
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+const debug_1 = require("debug");
+const env_paths_1 = require("env-paths");
+const fs = require("fs-extra");
+const path = require("path");
+const url = require("url");
+const crypto = require("crypto");
+const d = debug_1.default('@electron/get:cache');
+const defaultCacheRoot = env_paths_1.default('electron', {
+ suffix: '',
+}).cache;
+class Cache {
+ constructor(cacheRoot = defaultCacheRoot) {
+ this.cacheRoot = cacheRoot;
+ }
+ static getCacheDirectory(downloadUrl) {
+ const parsedDownloadUrl = url.parse(downloadUrl);
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
+ const { search, hash, pathname } = parsedDownloadUrl, rest = __rest(parsedDownloadUrl, ["search", "hash", "pathname"]);
+ const strippedUrl = url.format(Object.assign(Object.assign({}, rest), { pathname: path.dirname(pathname || 'electron') }));
+ return crypto
+ .createHash('sha256')
+ .update(strippedUrl)
+ .digest('hex');
+ }
+ getCachePath(downloadUrl, fileName) {
+ return path.resolve(this.cacheRoot, Cache.getCacheDirectory(downloadUrl), fileName);
+ }
+ async getPathForFileInCache(url, fileName) {
+ const cachePath = this.getCachePath(url, fileName);
+ if (await fs.pathExists(cachePath)) {
+ return cachePath;
+ }
+ return null;
+ }
+ async putFileInCache(url, currentPath, fileName) {
+ const cachePath = this.getCachePath(url, fileName);
+ d(`Moving ${currentPath} to ${cachePath}`);
+ if (await fs.pathExists(cachePath)) {
+ d('* Replacing existing file');
+ await fs.remove(cachePath);
+ }
+ await fs.move(currentPath, cachePath);
+ return cachePath;
+ }
+}
+exports.Cache = Cache;
+//# sourceMappingURL=Cache.js.map \ No newline at end of file
diff --git a/desktop/node_modules/@electron/get/dist/cjs/Cache.js.map b/desktop/node_modules/@electron/get/dist/cjs/Cache.js.map
new file mode 100644
index 0000000..ec54c24
--- /dev/null
+++ b/desktop/node_modules/@electron/get/dist/cjs/Cache.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"Cache.js","sourceRoot":"","sources":["../../src/Cache.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAAA,iCAA0B;AAC1B,yCAAiC;AACjC,+BAA+B;AAC/B,6BAA6B;AAC7B,2BAA2B;AAC3B,iCAAiC;AAEjC,MAAM,CAAC,GAAG,eAAK,CAAC,qBAAqB,CAAC,CAAC;AAEvC,MAAM,gBAAgB,GAAG,mBAAQ,CAAC,UAAU,EAAE;IAC5C,MAAM,EAAE,EAAE;CACX,CAAC,CAAC,KAAK,CAAC;AAET,MAAa,KAAK;IAChB,YAAoB,YAAY,gBAAgB;QAA5B,cAAS,GAAT,SAAS,CAAmB;IAAG,CAAC;IAE7C,MAAM,CAAC,iBAAiB,CAAC,WAAmB;QACjD,MAAM,iBAAiB,GAAG,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QACjD,6DAA6D;QAC7D,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,KAAc,iBAAiB,EAA7B,gEAA6B,CAAC;QAC9D,MAAM,WAAW,GAAG,GAAG,CAAC,MAAM,iCAAM,IAAI,KAAE,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,QAAQ,IAAI,UAAU,CAAC,IAAG,CAAC;QAE5F,OAAO,MAAM;aACV,UAAU,CAAC,QAAQ,CAAC;aACpB,MAAM,CAAC,WAAW,CAAC;aACnB,MAAM,CAAC,KAAK,CAAC,CAAC;IACnB,CAAC;IAEM,YAAY,CAAC,WAAmB,EAAE,QAAgB;QACvD,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,iBAAiB,CAAC,WAAW,CAAC,EAAE,QAAQ,CAAC,CAAC;IACtF,CAAC;IAEM,KAAK,CAAC,qBAAqB,CAAC,GAAW,EAAE,QAAgB;QAC9D,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QACnD,IAAI,MAAM,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE;YAClC,OAAO,SAAS,CAAC;SAClB;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAEM,KAAK,CAAC,cAAc,CAAC,GAAW,EAAE,WAAmB,EAAE,QAAgB;QAC5E,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QACnD,CAAC,CAAC,UAAU,WAAW,OAAO,SAAS,EAAE,CAAC,CAAC;QAC3C,IAAI,MAAM,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE;YAClC,CAAC,CAAC,2BAA2B,CAAC,CAAC;YAC/B,MAAM,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;SAC5B;QAED,MAAM,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;QAEtC,OAAO,SAAS,CAAC;IACnB,CAAC;CACF;AAxCD,sBAwCC"} \ No newline at end of file
diff --git a/desktop/node_modules/@electron/get/dist/cjs/Downloader.d.ts b/desktop/node_modules/@electron/get/dist/cjs/Downloader.d.ts
new file mode 100644
index 0000000..8e5e40e
--- /dev/null
+++ b/desktop/node_modules/@electron/get/dist/cjs/Downloader.d.ts
@@ -0,0 +1,3 @@
+export interface Downloader<T> {
+ download(url: string, targetFilePath: string, options: T): Promise<void>;
+}
diff --git a/desktop/node_modules/@electron/get/dist/cjs/Downloader.js b/desktop/node_modules/@electron/get/dist/cjs/Downloader.js
new file mode 100644
index 0000000..5940840
--- /dev/null
+++ b/desktop/node_modules/@electron/get/dist/cjs/Downloader.js
@@ -0,0 +1,3 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+//# sourceMappingURL=Downloader.js.map \ No newline at end of file
diff --git a/desktop/node_modules/@electron/get/dist/cjs/Downloader.js.map b/desktop/node_modules/@electron/get/dist/cjs/Downloader.js.map
new file mode 100644
index 0000000..c6199d5
--- /dev/null
+++ b/desktop/node_modules/@electron/get/dist/cjs/Downloader.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"Downloader.js","sourceRoot":"","sources":["../../src/Downloader.ts"],"names":[],"mappings":""} \ No newline at end of file
diff --git a/desktop/node_modules/@electron/get/dist/cjs/GotDownloader.d.ts b/desktop/node_modules/@electron/get/dist/cjs/GotDownloader.d.ts
new file mode 100644
index 0000000..6494756
--- /dev/null
+++ b/desktop/node_modules/@electron/get/dist/cjs/GotDownloader.d.ts
@@ -0,0 +1,21 @@
+import { Progress as GotProgress, Options as GotOptions } from 'got';
+import { Downloader } from './Downloader';
+/**
+ * See [`got#options`](https://github.com/sindresorhus/got#options) for possible keys/values.
+ */
+export declare type GotDownloaderOptions = (GotOptions & {
+ isStream?: true;
+}) & {
+ /**
+ * if defined, triggers every time `got`'s `downloadProgress` event callback is triggered.
+ */
+ getProgressCallback?: (progress: GotProgress) => Promise<void>;
+ /**
+ * if `true`, disables the console progress bar (setting the `ELECTRON_GET_NO_PROGRESS`
+ * environment variable to a non-empty value also does this).
+ */
+ quiet?: boolean;
+};
+export declare class GotDownloader implements Downloader<GotDownloaderOptions> {
+ download(url: string, targetFilePath: string, options?: GotDownloaderOptions): Promise<void>;
+}
diff --git a/desktop/node_modules/@electron/get/dist/cjs/GotDownloader.js b/desktop/node_modules/@electron/get/dist/cjs/GotDownloader.js
new file mode 100644
index 0000000..ddbab14
--- /dev/null
+++ b/desktop/node_modules/@electron/get/dist/cjs/GotDownloader.js
@@ -0,0 +1,76 @@
+"use strict";
+var __rest = (this && this.__rest) || function (s, e) {
+ var t = {};
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
+ t[p] = s[p];
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
+ t[p[i]] = s[p[i]];
+ }
+ return t;
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+const fs = require("fs-extra");
+const got_1 = require("got");
+const path = require("path");
+const ProgressBar = require("progress");
+const PROGRESS_BAR_DELAY_IN_SECONDS = 30;
+class GotDownloader {
+ async download(url, targetFilePath, options) {
+ if (!options) {
+ options = {};
+ }
+ const { quiet, getProgressCallback } = options, gotOptions = __rest(options, ["quiet", "getProgressCallback"]);
+ let downloadCompleted = false;
+ let bar;
+ let progressPercent;
+ let timeout = undefined;
+ await fs.mkdirp(path.dirname(targetFilePath));
+ const writeStream = fs.createWriteStream(targetFilePath);
+ if (!quiet || !process.env.ELECTRON_GET_NO_PROGRESS) {
+ const start = new Date();
+ timeout = setTimeout(() => {
+ if (!downloadCompleted) {
+ bar = new ProgressBar(`Downloading ${path.basename(url)}: [:bar] :percent ETA: :eta seconds `, {
+ curr: progressPercent,
+ total: 100,
+ });
+ // https://github.com/visionmedia/node-progress/issues/159
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
+ bar.start = start;
+ }
+ }, PROGRESS_BAR_DELAY_IN_SECONDS * 1000);
+ }
+ await new Promise((resolve, reject) => {
+ const downloadStream = got_1.default.stream(url, gotOptions);
+ downloadStream.on('downloadProgress', async (progress) => {
+ progressPercent = progress.percent;
+ if (bar) {
+ bar.update(progress.percent);
+ }
+ if (getProgressCallback) {
+ await getProgressCallback(progress);
+ }
+ });
+ downloadStream.on('error', error => {
+ if (error instanceof got_1.HTTPError && error.response.statusCode === 404) {
+ error.message += ` for ${error.response.url}`;
+ }
+ if (writeStream.destroy) {
+ writeStream.destroy(error);
+ }
+ reject(error);
+ });
+ writeStream.on('error', error => reject(error));
+ writeStream.on('close', () => resolve());
+ downloadStream.pipe(writeStream);
+ });
+ downloadCompleted = true;
+ if (timeout) {
+ clearTimeout(timeout);
+ }
+ }
+}
+exports.GotDownloader = GotDownloader;
+//# sourceMappingURL=GotDownloader.js.map \ No newline at end of file
diff --git a/desktop/node_modules/@electron/get/dist/cjs/GotDownloader.js.map b/desktop/node_modules/@electron/get/dist/cjs/GotDownloader.js.map
new file mode 100644
index 0000000..d5cb566
--- /dev/null
+++ b/desktop/node_modules/@electron/get/dist/cjs/GotDownloader.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"GotDownloader.js","sourceRoot":"","sources":["../../src/GotDownloader.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAAA,+BAA+B;AAC/B,6BAAqF;AACrF,6BAA6B;AAC7B,wCAAwC;AAIxC,MAAM,6BAA6B,GAAG,EAAE,CAAC;AAiBzC,MAAa,aAAa;IACxB,KAAK,CAAC,QAAQ,CACZ,GAAW,EACX,cAAsB,EACtB,OAA8B;QAE9B,IAAI,CAAC,OAAO,EAAE;YACZ,OAAO,GAAG,EAAE,CAAC;SACd;QACD,MAAM,EAAE,KAAK,EAAE,mBAAmB,KAAoB,OAAO,EAAzB,8DAAyB,CAAC;QAC9D,IAAI,iBAAiB,GAAG,KAAK,CAAC;QAC9B,IAAI,GAA4B,CAAC;QACjC,IAAI,eAAuB,CAAC;QAC5B,IAAI,OAAO,GAA+B,SAAS,CAAC;QACpD,MAAM,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC;QAC9C,MAAM,WAAW,GAAG,EAAE,CAAC,iBAAiB,CAAC,cAAc,CAAC,CAAC;QAEzD,IAAI,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,wBAAwB,EAAE;YACnD,MAAM,KAAK,GAAG,IAAI,IAAI,EAAE,CAAC;YACzB,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE;gBACxB,IAAI,CAAC,iBAAiB,EAAE;oBACtB,GAAG,GAAG,IAAI,WAAW,CACnB,eAAe,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,sCAAsC,EACvE;wBACE,IAAI,EAAE,eAAe;wBACrB,KAAK,EAAE,GAAG;qBACX,CACF,CAAC;oBACF,0DAA0D;oBAC1D,8DAA8D;oBAC7D,GAAW,CAAC,KAAK,GAAG,KAAK,CAAC;iBAC5B;YACH,CAAC,EAAE,6BAA6B,GAAG,IAAI,CAAC,CAAC;SAC1C;QACD,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC1C,MAAM,cAAc,GAAG,aAAG,CAAC,MAAM,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;YACnD,cAAc,CAAC,EAAE,CAAC,kBAAkB,EAAE,KAAK,EAAC,QAAQ,EAAC,EAAE;gBACrD,eAAe,GAAG,QAAQ,CAAC,OAAO,CAAC;gBACnC,IAAI,GAAG,EAAE;oBACP,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;iBAC9B;gBACD,IAAI,mBAAmB,EAAE;oBACvB,MAAM,mBAAmB,CAAC,QAAQ,CAAC,CAAC;iBACrC;YACH,CAAC,CAAC,CAAC;YACH,cAAc,CAAC,EAAE,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE;gBACjC,IAAI,KAAK,YAAY,eAAS,IAAI,KAAK,CAAC,QAAQ,CAAC,UAAU,KAAK,GAAG,EAAE;oBACnE,KAAK,CAAC,OAAO,IAAI,QAAQ,KAAK,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC;iBAC/C;gBACD,IAAI,WAAW,CAAC,OAAO,EAAE;oBACvB,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;iBAC5B;gBAED,MAAM,CAAC,KAAK,CAAC,CAAC;YAChB,CAAC,CAAC,CAAC;YACH,WAAW,CAAC,EAAE,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YAChD,WAAW,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;YAEzC,cAAc,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACnC,CAAC,CAAC,CAAC;QAEH,iBAAiB,GAAG,IAAI,CAAC;QACzB,IAAI,OAAO,EAAE;YACX,YAAY,CAAC,OAAO,CAAC,CAAC;SACvB;IACH,CAAC;CACF;AAlED,sCAkEC"} \ No newline at end of file
diff --git a/desktop/node_modules/@electron/get/dist/cjs/artifact-utils.d.ts b/desktop/node_modules/@electron/get/dist/cjs/artifact-utils.d.ts
new file mode 100644
index 0000000..e03c96e
--- /dev/null
+++ b/desktop/node_modules/@electron/get/dist/cjs/artifact-utils.d.ts
@@ -0,0 +1,4 @@
+import { ElectronArtifactDetails } from './types';
+export declare function getArtifactFileName(details: ElectronArtifactDetails): string;
+export declare function getArtifactRemoteURL(details: ElectronArtifactDetails): Promise<string>;
+export declare function getArtifactVersion(details: ElectronArtifactDetails): string;
diff --git a/desktop/node_modules/@electron/get/dist/cjs/artifact-utils.js b/desktop/node_modules/@electron/get/dist/cjs/artifact-utils.js
new file mode 100644
index 0000000..5766965
--- /dev/null
+++ b/desktop/node_modules/@electron/get/dist/cjs/artifact-utils.js
@@ -0,0 +1,66 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+const utils_1 = require("./utils");
+const BASE_URL = 'https://github.com/electron/electron/releases/download/';
+const NIGHTLY_BASE_URL = 'https://github.com/electron/nightlies/releases/download/';
+function getArtifactFileName(details) {
+ utils_1.ensureIsTruthyString(details, 'artifactName');
+ if (details.isGeneric) {
+ return details.artifactName;
+ }
+ utils_1.ensureIsTruthyString(details, 'arch');
+ utils_1.ensureIsTruthyString(details, 'platform');
+ utils_1.ensureIsTruthyString(details, 'version');
+ return `${[
+ details.artifactName,
+ details.version,
+ details.platform,
+ details.arch,
+ ...(details.artifactSuffix ? [details.artifactSuffix] : []),
+ ].join('-')}.zip`;
+}
+exports.getArtifactFileName = getArtifactFileName;
+function mirrorVar(name, options, defaultValue) {
+ // Convert camelCase to camel_case for env var reading
+ const snakeName = name.replace(/([a-z])([A-Z])/g, (_, a, b) => `${a}_${b}`).toLowerCase();
+ return (
+ // .npmrc
+ process.env[`npm_config_electron_${name.toLowerCase()}`] ||
+ process.env[`NPM_CONFIG_ELECTRON_${snakeName.toUpperCase()}`] ||
+ process.env[`npm_config_electron_${snakeName}`] ||
+ // package.json
+ process.env[`npm_package_config_electron_${name}`] ||
+ process.env[`npm_package_config_electron_${snakeName.toLowerCase()}`] ||
+ // env
+ process.env[`ELECTRON_${snakeName.toUpperCase()}`] ||
+ options[name] ||
+ defaultValue);
+}
+async function getArtifactRemoteURL(details) {
+ const opts = details.mirrorOptions || {};
+ let base = mirrorVar('mirror', opts, BASE_URL);
+ if (details.version.includes('nightly')) {
+ const nightlyDeprecated = mirrorVar('nightly_mirror', opts, '');
+ if (nightlyDeprecated) {
+ base = nightlyDeprecated;
+ console.warn(`nightly_mirror is deprecated, please use nightlyMirror`);
+ }
+ else {
+ base = mirrorVar('nightlyMirror', opts, NIGHTLY_BASE_URL);
+ }
+ }
+ const path = mirrorVar('customDir', opts, details.version).replace('{{ version }}', details.version.replace(/^v/, ''));
+ const file = mirrorVar('customFilename', opts, getArtifactFileName(details));
+ // Allow customized download URL resolution.
+ if (opts.resolveAssetURL) {
+ const url = await opts.resolveAssetURL(details);
+ return url;
+ }
+ return `${base}${path}/${file}`;
+}
+exports.getArtifactRemoteURL = getArtifactRemoteURL;
+function getArtifactVersion(details) {
+ return utils_1.normalizeVersion(mirrorVar('customVersion', details.mirrorOptions || {}, details.version));
+}
+exports.getArtifactVersion = getArtifactVersion;
+//# sourceMappingURL=artifact-utils.js.map \ No newline at end of file
diff --git a/desktop/node_modules/@electron/get/dist/cjs/artifact-utils.js.map b/desktop/node_modules/@electron/get/dist/cjs/artifact-utils.js.map
new file mode 100644
index 0000000..bafa6f2
--- /dev/null
+++ b/desktop/node_modules/@electron/get/dist/cjs/artifact-utils.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"artifact-utils.js","sourceRoot":"","sources":["../../src/artifact-utils.ts"],"names":[],"mappings":";;AACA,mCAAiE;AAEjE,MAAM,QAAQ,GAAG,yDAAyD,CAAC;AAC3E,MAAM,gBAAgB,GAAG,0DAA0D,CAAC;AAEpF,SAAgB,mBAAmB,CAAC,OAAgC;IAClE,4BAAoB,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;IAE9C,IAAI,OAAO,CAAC,SAAS,EAAE;QACrB,OAAO,OAAO,CAAC,YAAY,CAAC;KAC7B;IAED,4BAAoB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IACtC,4BAAoB,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;IAC1C,4BAAoB,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IAEzC,OAAO,GAAG;QACR,OAAO,CAAC,YAAY;QACpB,OAAO,CAAC,OAAO;QACf,OAAO,CAAC,QAAQ;QAChB,OAAO,CAAC,IAAI;QACZ,GAAG,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;KAC5D,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC;AACpB,CAAC;AAlBD,kDAkBC;AAED,SAAS,SAAS,CAChB,IAAkD,EAClD,OAAsB,EACtB,YAAoB;IAEpB,sDAAsD;IACtD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IAE1F,OAAO;IACL,SAAS;IACT,OAAO,CAAC,GAAG,CAAC,uBAAuB,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;QACxD,OAAO,CAAC,GAAG,CAAC,uBAAuB,SAAS,CAAC,WAAW,EAAE,EAAE,CAAC;QAC7D,OAAO,CAAC,GAAG,CAAC,uBAAuB,SAAS,EAAE,CAAC;QAC/C,eAAe;QACf,OAAO,CAAC,GAAG,CAAC,+BAA+B,IAAI,EAAE,CAAC;QAClD,OAAO,CAAC,GAAG,CAAC,+BAA+B,SAAS,CAAC,WAAW,EAAE,EAAE,CAAC;QACrE,MAAM;QACN,OAAO,CAAC,GAAG,CAAC,YAAY,SAAS,CAAC,WAAW,EAAE,EAAE,CAAC;QAClD,OAAO,CAAC,IAAI,CAAC;QACb,YAAY,CACb,CAAC;AACJ,CAAC;AAEM,KAAK,UAAU,oBAAoB,CAAC,OAAgC;IACzE,MAAM,IAAI,GAAkB,OAAO,CAAC,aAAa,IAAI,EAAE,CAAC;IACxD,IAAI,IAAI,GAAG,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;IAC/C,IAAI,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE;QACvC,MAAM,iBAAiB,GAAG,SAAS,CAAC,gBAAgB,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;QAChE,IAAI,iBAAiB,EAAE;YACrB,IAAI,GAAG,iBAAiB,CAAC;YACzB,OAAO,CAAC,IAAI,CAAC,wDAAwD,CAAC,CAAC;SACxE;aAAM;YACL,IAAI,GAAG,SAAS,CAAC,eAAe,EAAE,IAAI,EAAE,gBAAgB,CAAC,CAAC;SAC3D;KACF;IACD,MAAM,IAAI,GAAG,SAAS,CAAC,WAAW,EAAE,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,OAAO,CAChE,eAAe,EACf,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAClC,CAAC;IACF,MAAM,IAAI,GAAG,SAAS,CAAC,gBAAgB,EAAE,IAAI,EAAE,mBAAmB,CAAC,OAAO,CAAC,CAAC,CAAC;IAE7E,4CAA4C;IAC5C,IAAI,IAAI,CAAC,eAAe,EAAE;QACxB,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;QAChD,OAAO,GAAG,CAAC;KACZ;IAED,OAAO,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,EAAE,CAAC;AAClC,CAAC;AAzBD,oDAyBC;AAED,SAAgB,kBAAkB,CAAC,OAAgC;IACjE,OAAO,wBAAgB,CAAC,SAAS,CAAC,eAAe,EAAE,OAAO,CAAC,aAAa,IAAI,EAAE,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;AACpG,CAAC;AAFD,gDAEC"} \ No newline at end of file
diff --git a/desktop/node_modules/@electron/get/dist/cjs/downloader-resolver.d.ts b/desktop/node_modules/@electron/get/dist/cjs/downloader-resolver.d.ts
new file mode 100644
index 0000000..f7f09b2
--- /dev/null
+++ b/desktop/node_modules/@electron/get/dist/cjs/downloader-resolver.d.ts
@@ -0,0 +1,3 @@
+import { DownloadOptions } from './types';
+import { Downloader } from './Downloader';
+export declare function getDownloaderForSystem(): Promise<Downloader<DownloadOptions>>;
diff --git a/desktop/node_modules/@electron/get/dist/cjs/downloader-resolver.js b/desktop/node_modules/@electron/get/dist/cjs/downloader-resolver.js
new file mode 100644
index 0000000..52a51d3
--- /dev/null
+++ b/desktop/node_modules/@electron/get/dist/cjs/downloader-resolver.js
@@ -0,0 +1,12 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+async function getDownloaderForSystem() {
+ // TODO: Resolve the downloader or default to GotDownloader
+ // Current thoughts are a dot-file traversal for something like
+ // ".electron.downloader" which would be a text file with the name of the
+ // npm module to import() and use as the downloader
+ const { GotDownloader } = await Promise.resolve().then(() => require('./GotDownloader'));
+ return new GotDownloader();
+}
+exports.getDownloaderForSystem = getDownloaderForSystem;
+//# sourceMappingURL=downloader-resolver.js.map \ No newline at end of file
diff --git a/desktop/node_modules/@electron/get/dist/cjs/downloader-resolver.js.map b/desktop/node_modules/@electron/get/dist/cjs/downloader-resolver.js.map
new file mode 100644
index 0000000..586f565
--- /dev/null
+++ b/desktop/node_modules/@electron/get/dist/cjs/downloader-resolver.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"downloader-resolver.js","sourceRoot":"","sources":["../../src/downloader-resolver.ts"],"names":[],"mappings":";;AAGO,KAAK,UAAU,sBAAsB;IAC1C,2DAA2D;IAC3D,+DAA+D;IAC/D,yEAAyE;IACzE,mDAAmD;IACnD,MAAM,EAAE,aAAa,EAAE,GAAG,2CAAa,iBAAiB,EAAC,CAAC;IAC1D,OAAO,IAAI,aAAa,EAAE,CAAC;AAC7B,CAAC;AAPD,wDAOC"} \ No newline at end of file
diff --git a/desktop/node_modules/@electron/get/dist/cjs/index.d.ts b/desktop/node_modules/@electron/get/dist/cjs/index.d.ts
new file mode 100644
index 0000000..93e709e
--- /dev/null
+++ b/desktop/node_modules/@electron/get/dist/cjs/index.d.ts
@@ -0,0 +1,18 @@
+import { ElectronDownloadRequestOptions, ElectronPlatformArtifactDetailsWithDefaults } from './types';
+export { getHostArch } from './utils';
+export { initializeProxy } from './proxy';
+export * from './types';
+/**
+ * Downloads an artifact from an Electron release and returns an absolute path
+ * to the downloaded file.
+ *
+ * @param artifactDetails - The information required to download the artifact
+ */
+export declare function downloadArtifact(_artifactDetails: ElectronPlatformArtifactDetailsWithDefaults): Promise<string>;
+/**
+ * Downloads a specific version of Electron and returns an absolute path to a
+ * ZIP file.
+ *
+ * @param version - The version of Electron you want to download
+ */
+export declare function download(version: string, options?: ElectronDownloadRequestOptions): Promise<string>;
diff --git a/desktop/node_modules/@electron/get/dist/cjs/index.js b/desktop/node_modules/@electron/get/dist/cjs/index.js
new file mode 100644
index 0000000..86954a5
--- /dev/null
+++ b/desktop/node_modules/@electron/get/dist/cjs/index.js
@@ -0,0 +1,140 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+const debug_1 = require("debug");
+const fs = require("fs-extra");
+const path = require("path");
+const semver = require("semver");
+const sumchecker = require("sumchecker");
+const artifact_utils_1 = require("./artifact-utils");
+const Cache_1 = require("./Cache");
+const downloader_resolver_1 = require("./downloader-resolver");
+const proxy_1 = require("./proxy");
+const utils_1 = require("./utils");
+var utils_2 = require("./utils");
+exports.getHostArch = utils_2.getHostArch;
+var proxy_2 = require("./proxy");
+exports.initializeProxy = proxy_2.initializeProxy;
+const d = debug_1.default('@electron/get:index');
+if (process.env.ELECTRON_GET_USE_PROXY) {
+ proxy_1.initializeProxy();
+}
+async function validateArtifact(artifactDetails, downloadedAssetPath, _downloadArtifact) {
+ return await utils_1.withTempDirectoryIn(artifactDetails.tempDirectory, async (tempFolder) => {
+ // Don't try to verify the hash of the hash file itself
+ // and for older versions that don't have a SHASUMS256.txt
+ if (!artifactDetails.artifactName.startsWith('SHASUMS256') &&
+ !artifactDetails.unsafelyDisableChecksums &&
+ semver.gte(artifactDetails.version, '1.3.2')) {
+ let shasumPath;
+ const checksums = artifactDetails.checksums;
+ if (checksums) {
+ shasumPath = path.resolve(tempFolder, 'SHASUMS256.txt');
+ const fileNames = Object.keys(checksums);
+ if (fileNames.length === 0) {
+ throw new Error('Provided "checksums" object is empty, cannot generate a valid SHASUMS256.txt');
+ }
+ const generatedChecksums = fileNames
+ .map(fileName => `${checksums[fileName]} *${fileName}`)
+ .join('\n');
+ await fs.writeFile(shasumPath, generatedChecksums);
+ }
+ else {
+ shasumPath = await _downloadArtifact({
+ isGeneric: true,
+ version: artifactDetails.version,
+ artifactName: 'SHASUMS256.txt',
+ force: artifactDetails.force,
+ downloadOptions: artifactDetails.downloadOptions,
+ cacheRoot: artifactDetails.cacheRoot,
+ downloader: artifactDetails.downloader,
+ mirrorOptions: artifactDetails.mirrorOptions,
+ });
+ }
+ // For versions 1.3.2 - 1.3.4, need to overwrite the `defaultTextEncoding` option:
+ // https://github.com/electron/electron/pull/6676#discussion_r75332120
+ if (semver.satisfies(artifactDetails.version, '1.3.2 - 1.3.4')) {
+ const validatorOptions = {};
+ validatorOptions.defaultTextEncoding = 'binary';
+ const checker = new sumchecker.ChecksumValidator('sha256', shasumPath, validatorOptions);
+ await checker.validate(path.dirname(downloadedAssetPath), path.basename(downloadedAssetPath));
+ }
+ else {
+ await sumchecker('sha256', shasumPath, path.dirname(downloadedAssetPath), [
+ path.basename(downloadedAssetPath),
+ ]);
+ }
+ }
+ });
+}
+/**
+ * Downloads an artifact from an Electron release and returns an absolute path
+ * to the downloaded file.
+ *
+ * @param artifactDetails - The information required to download the artifact
+ */
+async function downloadArtifact(_artifactDetails) {
+ const artifactDetails = Object.assign({}, _artifactDetails);
+ if (!_artifactDetails.isGeneric) {
+ const platformArtifactDetails = artifactDetails;
+ if (!platformArtifactDetails.platform) {
+ d('No platform found, defaulting to the host platform');
+ platformArtifactDetails.platform = process.platform;
+ }
+ if (platformArtifactDetails.arch) {
+ platformArtifactDetails.arch = utils_1.getNodeArch(platformArtifactDetails.arch);
+ }
+ else {
+ d('No arch found, defaulting to the host arch');
+ platformArtifactDetails.arch = utils_1.getHostArch();
+ }
+ }
+ utils_1.ensureIsTruthyString(artifactDetails, 'version');
+ artifactDetails.version = artifact_utils_1.getArtifactVersion(artifactDetails);
+ const fileName = artifact_utils_1.getArtifactFileName(artifactDetails);
+ const url = await artifact_utils_1.getArtifactRemoteURL(artifactDetails);
+ const cache = new Cache_1.Cache(artifactDetails.cacheRoot);
+ // Do not check if the file exists in the cache when force === true
+ if (!artifactDetails.force) {
+ d(`Checking the cache (${artifactDetails.cacheRoot}) for ${fileName} (${url})`);
+ const cachedPath = await cache.getPathForFileInCache(url, fileName);
+ if (cachedPath === null) {
+ d('Cache miss');
+ }
+ else {
+ d('Cache hit');
+ try {
+ await validateArtifact(artifactDetails, cachedPath, downloadArtifact);
+ return cachedPath;
+ }
+ catch (err) {
+ d("Artifact in cache didn't match checksums", err);
+ d('falling back to re-download');
+ }
+ }
+ }
+ if (!artifactDetails.isGeneric &&
+ utils_1.isOfficialLinuxIA32Download(artifactDetails.platform, artifactDetails.arch, artifactDetails.version, artifactDetails.mirrorOptions)) {
+ console.warn('Official Linux/ia32 support is deprecated.');
+ console.warn('For more info: https://electronjs.org/blog/linux-32bit-support');
+ }
+ return await utils_1.withTempDirectoryIn(artifactDetails.tempDirectory, async (tempFolder) => {
+ const tempDownloadPath = path.resolve(tempFolder, artifact_utils_1.getArtifactFileName(artifactDetails));
+ const downloader = artifactDetails.downloader || (await downloader_resolver_1.getDownloaderForSystem());
+ d(`Downloading ${url} to ${tempDownloadPath} with options: ${JSON.stringify(artifactDetails.downloadOptions)}`);
+ await downloader.download(url, tempDownloadPath, artifactDetails.downloadOptions);
+ await validateArtifact(artifactDetails, tempDownloadPath, downloadArtifact);
+ return await cache.putFileInCache(url, tempDownloadPath, fileName);
+ });
+}
+exports.downloadArtifact = downloadArtifact;
+/**
+ * Downloads a specific version of Electron and returns an absolute path to a
+ * ZIP file.
+ *
+ * @param version - The version of Electron you want to download
+ */
+function download(version, options) {
+ return downloadArtifact(Object.assign(Object.assign({}, options), { version, platform: process.platform, arch: process.arch, artifactName: 'electron' }));
+}
+exports.download = download;
+//# sourceMappingURL=index.js.map \ No newline at end of file
diff --git a/desktop/node_modules/@electron/get/dist/cjs/index.js.map b/desktop/node_modules/@electron/get/dist/cjs/index.js.map
new file mode 100644
index 0000000..73c4a53
--- /dev/null
+++ b/desktop/node_modules/@electron/get/dist/cjs/index.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"} \ No newline at end of file
diff --git a/desktop/node_modules/@electron/get/dist/cjs/proxy.d.ts b/desktop/node_modules/@electron/get/dist/cjs/proxy.d.ts
new file mode 100644
index 0000000..df3e16a
--- /dev/null
+++ b/desktop/node_modules/@electron/get/dist/cjs/proxy.d.ts
@@ -0,0 +1,4 @@
+/**
+ * Initializes a third-party proxy module for HTTP(S) requests.
+ */
+export declare function initializeProxy(): void;
diff --git a/desktop/node_modules/@electron/get/dist/cjs/proxy.js b/desktop/node_modules/@electron/get/dist/cjs/proxy.js
new file mode 100644
index 0000000..09c99b5
--- /dev/null
+++ b/desktop/node_modules/@electron/get/dist/cjs/proxy.js
@@ -0,0 +1,27 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+const debug = require("debug");
+const utils_1 = require("./utils");
+const d = debug('@electron/get:proxy');
+/**
+ * Initializes a third-party proxy module for HTTP(S) requests.
+ */
+function initializeProxy() {
+ try {
+ // See: https://github.com/electron/get/pull/214#discussion_r798845713
+ const env = utils_1.getEnv('GLOBAL_AGENT_');
+ utils_1.setEnv('GLOBAL_AGENT_HTTP_PROXY', env('HTTP_PROXY'));
+ utils_1.setEnv('GLOBAL_AGENT_HTTPS_PROXY', env('HTTPS_PROXY'));
+ utils_1.setEnv('GLOBAL_AGENT_NO_PROXY', env('NO_PROXY'));
+ /**
+ * TODO: replace global-agent with a hpagent. @BlackHole1
+ * https://github.com/sindresorhus/got/blob/HEAD/documentation/tips.md#proxying
+ */
+ require('global-agent').bootstrap();
+ }
+ catch (e) {
+ d('Could not load either proxy modules, built-in proxy support not available:', e);
+ }
+}
+exports.initializeProxy = initializeProxy;
+//# sourceMappingURL=proxy.js.map \ No newline at end of file
diff --git a/desktop/node_modules/@electron/get/dist/cjs/proxy.js.map b/desktop/node_modules/@electron/get/dist/cjs/proxy.js.map
new file mode 100644
index 0000000..d909824
--- /dev/null
+++ b/desktop/node_modules/@electron/get/dist/cjs/proxy.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"proxy.js","sourceRoot":"","sources":["../../src/proxy.ts"],"names":[],"mappings":";;AAAA,+BAA+B;AAC/B,mCAAyC;AAEzC,MAAM,CAAC,GAAG,KAAK,CAAC,qBAAqB,CAAC,CAAC;AAEvC;;GAEG;AACH,SAAgB,eAAe;IAC7B,IAAI;QACF,sEAAsE;QACtE,MAAM,GAAG,GAAG,cAAM,CAAC,eAAe,CAAC,CAAC;QAEpC,cAAM,CAAC,yBAAyB,EAAE,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC;QACrD,cAAM,CAAC,0BAA0B,EAAE,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC;QACvD,cAAM,CAAC,uBAAuB,EAAE,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC;QAEjD;;;WAGG;QACH,OAAO,CAAC,cAAc,CAAC,CAAC,SAAS,EAAE,CAAC;KACrC;IAAC,OAAO,CAAC,EAAE;QACV,CAAC,CAAC,4EAA4E,EAAE,CAAC,CAAC,CAAC;KACpF;AACH,CAAC;AAjBD,0CAiBC"} \ No newline at end of file
diff --git a/desktop/node_modules/@electron/get/dist/cjs/types.d.ts b/desktop/node_modules/@electron/get/dist/cjs/types.d.ts
new file mode 100644
index 0000000..a8284bb
--- /dev/null
+++ b/desktop/node_modules/@electron/get/dist/cjs/types.d.ts
@@ -0,0 +1,129 @@
+import { Downloader } from './Downloader';
+export declare type DownloadOptions = any;
+export interface MirrorOptions {
+ /**
+ * DEPRECATED - see nightlyMirror.
+ */
+ nightly_mirror?: string;
+ /**
+ * The Electron nightly-specific mirror URL.
+ */
+ nightlyMirror?: string;
+ /**
+ * The base URL of the mirror to download from,
+ * e.g https://github.com/electron/electron/releases/download
+ */
+ mirror?: string;
+ /**
+ * The name of the directory to download from,
+ * often scoped by version number e.g 'v4.0.4'
+ */
+ customDir?: string;
+ /**
+ * The name of the asset to download,
+ * e.g 'electron-v4.0.4-linux-x64.zip'
+ */
+ customFilename?: string;
+ /**
+ * The version of the asset to download,
+ * e.g '4.0.4'
+ */
+ customVersion?: string;
+ /**
+ * A function allowing customization of the url returned
+ * from getArtifactRemoteURL().
+ */
+ resolveAssetURL?: (opts: DownloadOptions) => Promise<string>;
+}
+export interface ElectronDownloadRequest {
+ /**
+ * The version of Electron associated with the artifact.
+ */
+ version: string;
+ /**
+ * The type of artifact. For example:
+ * * `electron`
+ * * `ffmpeg`
+ */
+ artifactName: string;
+}
+export interface ElectronDownloadRequestOptions {
+ /**
+ * Whether to download an artifact regardless of whether it's in the cache directory.
+ *
+ * Defaults to `false`.
+ */
+ force?: boolean;
+ /**
+ * When set to `true`, disables checking that the artifact download completed successfully
+ * with the correct payload.
+ *
+ * Defaults to `false`.
+ */
+ unsafelyDisableChecksums?: boolean;
+ /**
+ * Provides checksums for the artifact as strings.
+ * Can be used if you already know the checksums of the Electron artifact
+ * you are downloading and want to skip the checksum file download
+ * without skipping the checksum validation.
+ *
+ * This should be an object whose keys are the file names of the artifacts and
+ * the values are their respective SHA256 checksums.
+ */
+ checksums?: Record<string, string>;
+ /**
+ * The directory that caches Electron artifact downloads.
+ *
+ * The default value is dependent upon the host platform:
+ *
+ * * Linux: `$XDG_CACHE_HOME` or `~/.cache/electron/`
+ * * MacOS: `~/Library/Caches/electron/`
+ * * Windows: `%LOCALAPPDATA%/electron/Cache` or `~/AppData/Local/electron/Cache/`
+ */
+ cacheRoot?: string;
+ /**
+ * Options passed to the downloader module.
+ */
+ downloadOptions?: DownloadOptions;
+ /**
+ * Options related to specifying an artifact mirror.
+ */
+ mirrorOptions?: MirrorOptions;
+ /**
+ * The custom [[Downloader]] class used to download artifacts. Defaults to the
+ * built-in [[GotDownloader]].
+ */
+ downloader?: Downloader<DownloadOptions>;
+ /**
+ * A temporary directory for downloads.
+ * It is used before artifacts are put into cache.
+ */
+ tempDirectory?: string;
+}
+export declare type ElectronPlatformArtifactDetails = {
+ /**
+ * The target artifact platform. These are Node-style platform names, for example:
+ * * `win32`
+ * * `darwin`
+ * * `linux`
+ */
+ platform: string;
+ /**
+ * The target artifact architecture. These are Node-style architecture names, for example:
+ * * `ia32`
+ * * `x64`
+ * * `armv7l`
+ */
+ arch: string;
+ artifactSuffix?: string;
+ isGeneric?: false;
+} & ElectronDownloadRequest & ElectronDownloadRequestOptions;
+export declare type ElectronGenericArtifactDetails = {
+ isGeneric: true;
+} & ElectronDownloadRequest & ElectronDownloadRequestOptions;
+export declare type ElectronArtifactDetails = ElectronPlatformArtifactDetails | ElectronGenericArtifactDetails;
+export declare type Omit<T, K> = Pick<T, Exclude<keyof T, K>>;
+export declare type ElectronPlatformArtifactDetailsWithDefaults = (Omit<ElectronPlatformArtifactDetails, 'platform' | 'arch'> & {
+ platform?: string;
+ arch?: string;
+}) | ElectronGenericArtifactDetails;
diff --git a/desktop/node_modules/@electron/get/dist/cjs/types.js b/desktop/node_modules/@electron/get/dist/cjs/types.js
new file mode 100644
index 0000000..11e638d
--- /dev/null
+++ b/desktop/node_modules/@electron/get/dist/cjs/types.js
@@ -0,0 +1,3 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+//# sourceMappingURL=types.js.map \ No newline at end of file
diff --git a/desktop/node_modules/@electron/get/dist/cjs/types.js.map b/desktop/node_modules/@electron/get/dist/cjs/types.js.map
new file mode 100644
index 0000000..7b5fff8
--- /dev/null
+++ b/desktop/node_modules/@electron/get/dist/cjs/types.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":""} \ No newline at end of file
diff --git a/desktop/node_modules/@electron/get/dist/cjs/utils.d.ts b/desktop/node_modules/@electron/get/dist/cjs/utils.d.ts
new file mode 100644
index 0000000..3cc40c1
--- /dev/null
+++ b/desktop/node_modules/@electron/get/dist/cjs/utils.d.ts
@@ -0,0 +1,25 @@
+export declare function withTempDirectoryIn<T>(parentDirectory: string | undefined, fn: (directory: string) => Promise<T>): Promise<T>;
+export declare function withTempDirectory<T>(fn: (directory: string) => Promise<T>): Promise<T>;
+export declare function normalizeVersion(version: string): string;
+/**
+ * Runs the `uname` command and returns the trimmed output.
+ */
+export declare function uname(): string;
+/**
+ * Generates an architecture name that would be used in an Electron or Node.js
+ * download file name.
+ */
+export declare function getNodeArch(arch: string): string;
+/**
+ * Generates an architecture name that would be used in an Electron or Node.js
+ * download file name, from the `process` module information.
+ */
+export declare function getHostArch(): string;
+export declare function ensureIsTruthyString<T, K extends keyof T>(obj: T, key: K): void;
+export declare function isOfficialLinuxIA32Download(platform: string, arch: string, version: string, mirrorOptions?: object): boolean;
+/**
+ * Find the value of a environment variable which may or may not have the
+ * prefix, in a case-insensitive manner.
+ */
+export declare function getEnv(prefix?: string): (name: string) => string | undefined;
+export declare function setEnv(key: string, value: string | undefined): void;
diff --git a/desktop/node_modules/@electron/get/dist/cjs/utils.js b/desktop/node_modules/@electron/get/dist/cjs/utils.js
new file mode 100644
index 0000000..4806842
--- /dev/null
+++ b/desktop/node_modules/@electron/get/dist/cjs/utils.js
@@ -0,0 +1,107 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+const childProcess = require("child_process");
+const fs = require("fs-extra");
+const os = require("os");
+const path = require("path");
+async function useAndRemoveDirectory(directory, fn) {
+ let result;
+ try {
+ result = await fn(directory);
+ }
+ finally {
+ await fs.remove(directory);
+ }
+ return result;
+}
+async function withTempDirectoryIn(parentDirectory = os.tmpdir(), fn) {
+ const tempDirectoryPrefix = 'electron-download-';
+ const tempDirectory = await fs.mkdtemp(path.resolve(parentDirectory, tempDirectoryPrefix));
+ return useAndRemoveDirectory(tempDirectory, fn);
+}
+exports.withTempDirectoryIn = withTempDirectoryIn;
+async function withTempDirectory(fn) {
+ return withTempDirectoryIn(undefined, fn);
+}
+exports.withTempDirectory = withTempDirectory;
+function normalizeVersion(version) {
+ if (!version.startsWith('v')) {
+ return `v${version}`;
+ }
+ return version;
+}
+exports.normalizeVersion = normalizeVersion;
+/**
+ * Runs the `uname` command and returns the trimmed output.
+ */
+function uname() {
+ return childProcess
+ .execSync('uname -m')
+ .toString()
+ .trim();
+}
+exports.uname = uname;
+/**
+ * Generates an architecture name that would be used in an Electron or Node.js
+ * download file name.
+ */
+function getNodeArch(arch) {
+ if (arch === 'arm') {
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
+ switch (process.config.variables.arm_version) {
+ case '6':
+ return uname();
+ case '7':
+ default:
+ return 'armv7l';
+ }
+ }
+ return arch;
+}
+exports.getNodeArch = getNodeArch;
+/**
+ * Generates an architecture name that would be used in an Electron or Node.js
+ * download file name, from the `process` module information.
+ */
+function getHostArch() {
+ return getNodeArch(process.arch);
+}
+exports.getHostArch = getHostArch;
+function ensureIsTruthyString(obj, key) {
+ if (!obj[key] || typeof obj[key] !== 'string') {
+ throw new Error(`Expected property "${key}" to be provided as a string but it was not`);
+ }
+}
+exports.ensureIsTruthyString = ensureIsTruthyString;
+function isOfficialLinuxIA32Download(platform, arch, version, mirrorOptions) {
+ return (platform === 'linux' &&
+ arch === 'ia32' &&
+ Number(version.slice(1).split('.')[0]) >= 4 &&
+ typeof mirrorOptions === 'undefined');
+}
+exports.isOfficialLinuxIA32Download = isOfficialLinuxIA32Download;
+/**
+ * Find the value of a environment variable which may or may not have the
+ * prefix, in a case-insensitive manner.
+ */
+function getEnv(prefix = '') {
+ const envsLowerCase = {};
+ for (const envKey in process.env) {
+ envsLowerCase[envKey.toLowerCase()] = process.env[envKey];
+ }
+ return (name) => {
+ return (envsLowerCase[`${prefix}${name}`.toLowerCase()] ||
+ envsLowerCase[name.toLowerCase()] ||
+ undefined);
+ };
+}
+exports.getEnv = getEnv;
+function setEnv(key, value) {
+ // The `void` operator always returns `undefined`.
+ // See: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/void
+ if (value !== void 0) {
+ process.env[key] = value;
+ }
+}
+exports.setEnv = setEnv;
+//# sourceMappingURL=utils.js.map \ No newline at end of file
diff --git a/desktop/node_modules/@electron/get/dist/cjs/utils.js.map b/desktop/node_modules/@electron/get/dist/cjs/utils.js.map
new file mode 100644
index 0000000..5add151
--- /dev/null
+++ b/desktop/node_modules/@electron/get/dist/cjs/utils.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"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"} \ No newline at end of file
diff --git a/desktop/node_modules/@electron/get/dist/esm/Cache.d.ts b/desktop/node_modules/@electron/get/dist/esm/Cache.d.ts
new file mode 100644
index 0000000..626001a
--- /dev/null
+++ b/desktop/node_modules/@electron/get/dist/esm/Cache.d.ts
@@ -0,0 +1,8 @@
+export declare class Cache {
+ private cacheRoot;
+ constructor(cacheRoot?: string);
+ static getCacheDirectory(downloadUrl: string): string;
+ getCachePath(downloadUrl: string, fileName: string): string;
+ getPathForFileInCache(url: string, fileName: string): Promise<string | null>;
+ putFileInCache(url: string, currentPath: string, fileName: string): Promise<string>;
+}
diff --git a/desktop/node_modules/@electron/get/dist/esm/Cache.js b/desktop/node_modules/@electron/get/dist/esm/Cache.js
new file mode 100644
index 0000000..4801010
--- /dev/null
+++ b/desktop/node_modules/@electron/get/dist/esm/Cache.js
@@ -0,0 +1,57 @@
+var __rest = (this && this.__rest) || function (s, e) {
+ var t = {};
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
+ t[p] = s[p];
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
+ t[p[i]] = s[p[i]];
+ }
+ return t;
+};
+import debug from 'debug';
+import envPaths from 'env-paths';
+import * as fs from 'fs-extra';
+import * as path from 'path';
+import * as url from 'url';
+import * as crypto from 'crypto';
+const d = debug('@electron/get:cache');
+const defaultCacheRoot = envPaths('electron', {
+ suffix: '',
+}).cache;
+export class Cache {
+ constructor(cacheRoot = defaultCacheRoot) {
+ this.cacheRoot = cacheRoot;
+ }
+ static getCacheDirectory(downloadUrl) {
+ const parsedDownloadUrl = url.parse(downloadUrl);
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
+ const { search, hash, pathname } = parsedDownloadUrl, rest = __rest(parsedDownloadUrl, ["search", "hash", "pathname"]);
+ const strippedUrl = url.format(Object.assign(Object.assign({}, rest), { pathname: path.dirname(pathname || 'electron') }));
+ return crypto
+ .createHash('sha256')
+ .update(strippedUrl)
+ .digest('hex');
+ }
+ getCachePath(downloadUrl, fileName) {
+ return path.resolve(this.cacheRoot, Cache.getCacheDirectory(downloadUrl), fileName);
+ }
+ async getPathForFileInCache(url, fileName) {
+ const cachePath = this.getCachePath(url, fileName);
+ if (await fs.pathExists(cachePath)) {
+ return cachePath;
+ }
+ return null;
+ }
+ async putFileInCache(url, currentPath, fileName) {
+ const cachePath = this.getCachePath(url, fileName);
+ d(`Moving ${currentPath} to ${cachePath}`);
+ if (await fs.pathExists(cachePath)) {
+ d('* Replacing existing file');
+ await fs.remove(cachePath);
+ }
+ await fs.move(currentPath, cachePath);
+ return cachePath;
+ }
+}
+//# sourceMappingURL=Cache.js.map \ No newline at end of file
diff --git a/desktop/node_modules/@electron/get/dist/esm/Cache.js.map b/desktop/node_modules/@electron/get/dist/esm/Cache.js.map
new file mode 100644
index 0000000..943403b
--- /dev/null
+++ b/desktop/node_modules/@electron/get/dist/esm/Cache.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"Cache.js","sourceRoot":"","sources":["../../src/Cache.ts"],"names":[],"mappings":";;;;;;;;;;;AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,QAAQ,MAAM,WAAW,CAAC;AACjC,OAAO,KAAK,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,GAAG,MAAM,KAAK,CAAC;AAC3B,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAC;AAEjC,MAAM,CAAC,GAAG,KAAK,CAAC,qBAAqB,CAAC,CAAC;AAEvC,MAAM,gBAAgB,GAAG,QAAQ,CAAC,UAAU,EAAE;IAC5C,MAAM,EAAE,EAAE;CACX,CAAC,CAAC,KAAK,CAAC;AAET,MAAM,OAAO,KAAK;IAChB,YAAoB,YAAY,gBAAgB;QAA5B,cAAS,GAAT,SAAS,CAAmB;IAAG,CAAC;IAE7C,MAAM,CAAC,iBAAiB,CAAC,WAAmB;QACjD,MAAM,iBAAiB,GAAG,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QACjD,6DAA6D;QAC7D,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,KAAc,iBAAiB,EAA7B,gEAA6B,CAAC;QAC9D,MAAM,WAAW,GAAG,GAAG,CAAC,MAAM,iCAAM,IAAI,KAAE,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,QAAQ,IAAI,UAAU,CAAC,IAAG,CAAC;QAE5F,OAAO,MAAM;aACV,UAAU,CAAC,QAAQ,CAAC;aACpB,MAAM,CAAC,WAAW,CAAC;aACnB,MAAM,CAAC,KAAK,CAAC,CAAC;IACnB,CAAC;IAEM,YAAY,CAAC,WAAmB,EAAE,QAAgB;QACvD,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,iBAAiB,CAAC,WAAW,CAAC,EAAE,QAAQ,CAAC,CAAC;IACtF,CAAC;IAEM,KAAK,CAAC,qBAAqB,CAAC,GAAW,EAAE,QAAgB;QAC9D,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QACnD,IAAI,MAAM,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE;YAClC,OAAO,SAAS,CAAC;SAClB;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAEM,KAAK,CAAC,cAAc,CAAC,GAAW,EAAE,WAAmB,EAAE,QAAgB;QAC5E,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QACnD,CAAC,CAAC,UAAU,WAAW,OAAO,SAAS,EAAE,CAAC,CAAC;QAC3C,IAAI,MAAM,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE;YAClC,CAAC,CAAC,2BAA2B,CAAC,CAAC;YAC/B,MAAM,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;SAC5B;QAED,MAAM,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;QAEtC,OAAO,SAAS,CAAC;IACnB,CAAC;CACF"} \ No newline at end of file
diff --git a/desktop/node_modules/@electron/get/dist/esm/Downloader.d.ts b/desktop/node_modules/@electron/get/dist/esm/Downloader.d.ts
new file mode 100644
index 0000000..8e5e40e
--- /dev/null
+++ b/desktop/node_modules/@electron/get/dist/esm/Downloader.d.ts
@@ -0,0 +1,3 @@
+export interface Downloader<T> {
+ download(url: string, targetFilePath: string, options: T): Promise<void>;
+}
diff --git a/desktop/node_modules/@electron/get/dist/esm/Downloader.js b/desktop/node_modules/@electron/get/dist/esm/Downloader.js
new file mode 100644
index 0000000..6ff5866
--- /dev/null
+++ b/desktop/node_modules/@electron/get/dist/esm/Downloader.js
@@ -0,0 +1 @@
+//# sourceMappingURL=Downloader.js.map \ No newline at end of file
diff --git a/desktop/node_modules/@electron/get/dist/esm/Downloader.js.map b/desktop/node_modules/@electron/get/dist/esm/Downloader.js.map
new file mode 100644
index 0000000..c6199d5
--- /dev/null
+++ b/desktop/node_modules/@electron/get/dist/esm/Downloader.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"Downloader.js","sourceRoot":"","sources":["../../src/Downloader.ts"],"names":[],"mappings":""} \ No newline at end of file
diff --git a/desktop/node_modules/@electron/get/dist/esm/GotDownloader.d.ts b/desktop/node_modules/@electron/get/dist/esm/GotDownloader.d.ts
new file mode 100644
index 0000000..6494756
--- /dev/null
+++ b/desktop/node_modules/@electron/get/dist/esm/GotDownloader.d.ts
@@ -0,0 +1,21 @@
+import { Progress as GotProgress, Options as GotOptions } from 'got';
+import { Downloader } from './Downloader';
+/**
+ * See [`got#options`](https://github.com/sindresorhus/got#options) for possible keys/values.
+ */
+export declare type GotDownloaderOptions = (GotOptions & {
+ isStream?: true;
+}) & {
+ /**
+ * if defined, triggers every time `got`'s `downloadProgress` event callback is triggered.
+ */
+ getProgressCallback?: (progress: GotProgress) => Promise<void>;
+ /**
+ * if `true`, disables the console progress bar (setting the `ELECTRON_GET_NO_PROGRESS`
+ * environment variable to a non-empty value also does this).
+ */
+ quiet?: boolean;
+};
+export declare class GotDownloader implements Downloader<GotDownloaderOptions> {
+ download(url: string, targetFilePath: string, options?: GotDownloaderOptions): Promise<void>;
+}
diff --git a/desktop/node_modules/@electron/get/dist/esm/GotDownloader.js b/desktop/node_modules/@electron/get/dist/esm/GotDownloader.js
new file mode 100644
index 0000000..921bbeb
--- /dev/null
+++ b/desktop/node_modules/@electron/get/dist/esm/GotDownloader.js
@@ -0,0 +1,73 @@
+var __rest = (this && this.__rest) || function (s, e) {
+ var t = {};
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
+ t[p] = s[p];
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
+ t[p[i]] = s[p[i]];
+ }
+ return t;
+};
+import * as fs from 'fs-extra';
+import got, { HTTPError } from 'got';
+import * as path from 'path';
+import * as ProgressBar from 'progress';
+const PROGRESS_BAR_DELAY_IN_SECONDS = 30;
+export class GotDownloader {
+ async download(url, targetFilePath, options) {
+ if (!options) {
+ options = {};
+ }
+ const { quiet, getProgressCallback } = options, gotOptions = __rest(options, ["quiet", "getProgressCallback"]);
+ let downloadCompleted = false;
+ let bar;
+ let progressPercent;
+ let timeout = undefined;
+ await fs.mkdirp(path.dirname(targetFilePath));
+ const writeStream = fs.createWriteStream(targetFilePath);
+ if (!quiet || !process.env.ELECTRON_GET_NO_PROGRESS) {
+ const start = new Date();
+ timeout = setTimeout(() => {
+ if (!downloadCompleted) {
+ bar = new ProgressBar(`Downloading ${path.basename(url)}: [:bar] :percent ETA: :eta seconds `, {
+ curr: progressPercent,
+ total: 100,
+ });
+ // https://github.com/visionmedia/node-progress/issues/159
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
+ bar.start = start;
+ }
+ }, PROGRESS_BAR_DELAY_IN_SECONDS * 1000);
+ }
+ await new Promise((resolve, reject) => {
+ const downloadStream = got.stream(url, gotOptions);
+ downloadStream.on('downloadProgress', async (progress) => {
+ progressPercent = progress.percent;
+ if (bar) {
+ bar.update(progress.percent);
+ }
+ if (getProgressCallback) {
+ await getProgressCallback(progress);
+ }
+ });
+ downloadStream.on('error', error => {
+ if (error instanceof HTTPError && error.response.statusCode === 404) {
+ error.message += ` for ${error.response.url}`;
+ }
+ if (writeStream.destroy) {
+ writeStream.destroy(error);
+ }
+ reject(error);
+ });
+ writeStream.on('error', error => reject(error));
+ writeStream.on('close', () => resolve());
+ downloadStream.pipe(writeStream);
+ });
+ downloadCompleted = true;
+ if (timeout) {
+ clearTimeout(timeout);
+ }
+ }
+}
+//# sourceMappingURL=GotDownloader.js.map \ No newline at end of file
diff --git a/desktop/node_modules/@electron/get/dist/esm/GotDownloader.js.map b/desktop/node_modules/@electron/get/dist/esm/GotDownloader.js.map
new file mode 100644
index 0000000..4117388
--- /dev/null
+++ b/desktop/node_modules/@electron/get/dist/esm/GotDownloader.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"GotDownloader.js","sourceRoot":"","sources":["../../src/GotDownloader.ts"],"names":[],"mappings":"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"} \ No newline at end of file
diff --git a/desktop/node_modules/@electron/get/dist/esm/artifact-utils.d.ts b/desktop/node_modules/@electron/get/dist/esm/artifact-utils.d.ts
new file mode 100644
index 0000000..e03c96e
--- /dev/null
+++ b/desktop/node_modules/@electron/get/dist/esm/artifact-utils.d.ts
@@ -0,0 +1,4 @@
+import { ElectronArtifactDetails } from './types';
+export declare function getArtifactFileName(details: ElectronArtifactDetails): string;
+export declare function getArtifactRemoteURL(details: ElectronArtifactDetails): Promise<string>;
+export declare function getArtifactVersion(details: ElectronArtifactDetails): string;
diff --git a/desktop/node_modules/@electron/get/dist/esm/artifact-utils.js b/desktop/node_modules/@electron/get/dist/esm/artifact-utils.js
new file mode 100644
index 0000000..8dc1433
--- /dev/null
+++ b/desktop/node_modules/@electron/get/dist/esm/artifact-utils.js
@@ -0,0 +1,61 @@
+import { ensureIsTruthyString, normalizeVersion } from './utils';
+const BASE_URL = 'https://github.com/electron/electron/releases/download/';
+const NIGHTLY_BASE_URL = 'https://github.com/electron/nightlies/releases/download/';
+export function getArtifactFileName(details) {
+ ensureIsTruthyString(details, 'artifactName');
+ if (details.isGeneric) {
+ return details.artifactName;
+ }
+ ensureIsTruthyString(details, 'arch');
+ ensureIsTruthyString(details, 'platform');
+ ensureIsTruthyString(details, 'version');
+ return `${[
+ details.artifactName,
+ details.version,
+ details.platform,
+ details.arch,
+ ...(details.artifactSuffix ? [details.artifactSuffix] : []),
+ ].join('-')}.zip`;
+}
+function mirrorVar(name, options, defaultValue) {
+ // Convert camelCase to camel_case for env var reading
+ const snakeName = name.replace(/([a-z])([A-Z])/g, (_, a, b) => `${a}_${b}`).toLowerCase();
+ return (
+ // .npmrc
+ process.env[`npm_config_electron_${name.toLowerCase()}`] ||
+ process.env[`NPM_CONFIG_ELECTRON_${snakeName.toUpperCase()}`] ||
+ process.env[`npm_config_electron_${snakeName}`] ||
+ // package.json
+ process.env[`npm_package_config_electron_${name}`] ||
+ process.env[`npm_package_config_electron_${snakeName.toLowerCase()}`] ||
+ // env
+ process.env[`ELECTRON_${snakeName.toUpperCase()}`] ||
+ options[name] ||
+ defaultValue);
+}
+export async function getArtifactRemoteURL(details) {
+ const opts = details.mirrorOptions || {};
+ let base = mirrorVar('mirror', opts, BASE_URL);
+ if (details.version.includes('nightly')) {
+ const nightlyDeprecated = mirrorVar('nightly_mirror', opts, '');
+ if (nightlyDeprecated) {
+ base = nightlyDeprecated;
+ console.warn(`nightly_mirror is deprecated, please use nightlyMirror`);
+ }
+ else {
+ base = mirrorVar('nightlyMirror', opts, NIGHTLY_BASE_URL);
+ }
+ }
+ const path = mirrorVar('customDir', opts, details.version).replace('{{ version }}', details.version.replace(/^v/, ''));
+ const file = mirrorVar('customFilename', opts, getArtifactFileName(details));
+ // Allow customized download URL resolution.
+ if (opts.resolveAssetURL) {
+ const url = await opts.resolveAssetURL(details);
+ return url;
+ }
+ return `${base}${path}/${file}`;
+}
+export function getArtifactVersion(details) {
+ return normalizeVersion(mirrorVar('customVersion', details.mirrorOptions || {}, details.version));
+}
+//# sourceMappingURL=artifact-utils.js.map \ No newline at end of file
diff --git a/desktop/node_modules/@electron/get/dist/esm/artifact-utils.js.map b/desktop/node_modules/@electron/get/dist/esm/artifact-utils.js.map
new file mode 100644
index 0000000..bfaaf9c
--- /dev/null
+++ b/desktop/node_modules/@electron/get/dist/esm/artifact-utils.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"artifact-utils.js","sourceRoot":"","sources":["../../src/artifact-utils.ts"],"names":[],"mappings":"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"} \ No newline at end of file
diff --git a/desktop/node_modules/@electron/get/dist/esm/downloader-resolver.d.ts b/desktop/node_modules/@electron/get/dist/esm/downloader-resolver.d.ts
new file mode 100644
index 0000000..f7f09b2
--- /dev/null
+++ b/desktop/node_modules/@electron/get/dist/esm/downloader-resolver.d.ts
@@ -0,0 +1,3 @@
+import { DownloadOptions } from './types';
+import { Downloader } from './Downloader';
+export declare function getDownloaderForSystem(): Promise<Downloader<DownloadOptions>>;
diff --git a/desktop/node_modules/@electron/get/dist/esm/downloader-resolver.js b/desktop/node_modules/@electron/get/dist/esm/downloader-resolver.js
new file mode 100644
index 0000000..5a87c3c
--- /dev/null
+++ b/desktop/node_modules/@electron/get/dist/esm/downloader-resolver.js
@@ -0,0 +1,9 @@
+export async function getDownloaderForSystem() {
+ // TODO: Resolve the downloader or default to GotDownloader
+ // Current thoughts are a dot-file traversal for something like
+ // ".electron.downloader" which would be a text file with the name of the
+ // npm module to import() and use as the downloader
+ const { GotDownloader } = await import('./GotDownloader');
+ return new GotDownloader();
+}
+//# sourceMappingURL=downloader-resolver.js.map \ No newline at end of file
diff --git a/desktop/node_modules/@electron/get/dist/esm/downloader-resolver.js.map b/desktop/node_modules/@electron/get/dist/esm/downloader-resolver.js.map
new file mode 100644
index 0000000..201069b
--- /dev/null
+++ b/desktop/node_modules/@electron/get/dist/esm/downloader-resolver.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"downloader-resolver.js","sourceRoot":"","sources":["../../src/downloader-resolver.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,KAAK,UAAU,sBAAsB;IAC1C,2DAA2D;IAC3D,+DAA+D;IAC/D,yEAAyE;IACzE,mDAAmD;IACnD,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,iBAAiB,CAAC,CAAC;IAC1D,OAAO,IAAI,aAAa,EAAE,CAAC;AAC7B,CAAC"} \ No newline at end of file
diff --git a/desktop/node_modules/@electron/get/dist/esm/index.d.ts b/desktop/node_modules/@electron/get/dist/esm/index.d.ts
new file mode 100644
index 0000000..93e709e
--- /dev/null
+++ b/desktop/node_modules/@electron/get/dist/esm/index.d.ts
@@ -0,0 +1,18 @@
+import { ElectronDownloadRequestOptions, ElectronPlatformArtifactDetailsWithDefaults } from './types';
+export { getHostArch } from './utils';
+export { initializeProxy } from './proxy';
+export * from './types';
+/**
+ * Downloads an artifact from an Electron release and returns an absolute path
+ * to the downloaded file.
+ *
+ * @param artifactDetails - The information required to download the artifact
+ */
+export declare function downloadArtifact(_artifactDetails: ElectronPlatformArtifactDetailsWithDefaults): Promise<string>;
+/**
+ * Downloads a specific version of Electron and returns an absolute path to a
+ * ZIP file.
+ *
+ * @param version - The version of Electron you want to download
+ */
+export declare function download(version: string, options?: ElectronDownloadRequestOptions): Promise<string>;
diff --git a/desktop/node_modules/@electron/get/dist/esm/index.js b/desktop/node_modules/@electron/get/dist/esm/index.js
new file mode 100644
index 0000000..b87f564
--- /dev/null
+++ b/desktop/node_modules/@electron/get/dist/esm/index.js
@@ -0,0 +1,134 @@
+import debug from 'debug';
+import * as fs from 'fs-extra';
+import * as path from 'path';
+import * as semver from 'semver';
+import * as sumchecker from 'sumchecker';
+import { getArtifactFileName, getArtifactRemoteURL, getArtifactVersion } from './artifact-utils';
+import { Cache } from './Cache';
+import { getDownloaderForSystem } from './downloader-resolver';
+import { initializeProxy } from './proxy';
+import { withTempDirectoryIn, getHostArch, getNodeArch, ensureIsTruthyString, isOfficialLinuxIA32Download, } from './utils';
+export { getHostArch } from './utils';
+export { initializeProxy } from './proxy';
+const d = debug('@electron/get:index');
+if (process.env.ELECTRON_GET_USE_PROXY) {
+ initializeProxy();
+}
+async function validateArtifact(artifactDetails, downloadedAssetPath, _downloadArtifact) {
+ return await withTempDirectoryIn(artifactDetails.tempDirectory, async (tempFolder) => {
+ // Don't try to verify the hash of the hash file itself
+ // and for older versions that don't have a SHASUMS256.txt
+ if (!artifactDetails.artifactName.startsWith('SHASUMS256') &&
+ !artifactDetails.unsafelyDisableChecksums &&
+ semver.gte(artifactDetails.version, '1.3.2')) {
+ let shasumPath;
+ const checksums = artifactDetails.checksums;
+ if (checksums) {
+ shasumPath = path.resolve(tempFolder, 'SHASUMS256.txt');
+ const fileNames = Object.keys(checksums);
+ if (fileNames.length === 0) {
+ throw new Error('Provided "checksums" object is empty, cannot generate a valid SHASUMS256.txt');
+ }
+ const generatedChecksums = fileNames
+ .map(fileName => `${checksums[fileName]} *${fileName}`)
+ .join('\n');
+ await fs.writeFile(shasumPath, generatedChecksums);
+ }
+ else {
+ shasumPath = await _downloadArtifact({
+ isGeneric: true,
+ version: artifactDetails.version,
+ artifactName: 'SHASUMS256.txt',
+ force: artifactDetails.force,
+ downloadOptions: artifactDetails.downloadOptions,
+ cacheRoot: artifactDetails.cacheRoot,
+ downloader: artifactDetails.downloader,
+ mirrorOptions: artifactDetails.mirrorOptions,
+ });
+ }
+ // For versions 1.3.2 - 1.3.4, need to overwrite the `defaultTextEncoding` option:
+ // https://github.com/electron/electron/pull/6676#discussion_r75332120
+ if (semver.satisfies(artifactDetails.version, '1.3.2 - 1.3.4')) {
+ const validatorOptions = {};
+ validatorOptions.defaultTextEncoding = 'binary';
+ const checker = new sumchecker.ChecksumValidator('sha256', shasumPath, validatorOptions);
+ await checker.validate(path.dirname(downloadedAssetPath), path.basename(downloadedAssetPath));
+ }
+ else {
+ await sumchecker('sha256', shasumPath, path.dirname(downloadedAssetPath), [
+ path.basename(downloadedAssetPath),
+ ]);
+ }
+ }
+ });
+}
+/**
+ * Downloads an artifact from an Electron release and returns an absolute path
+ * to the downloaded file.
+ *
+ * @param artifactDetails - The information required to download the artifact
+ */
+export async function downloadArtifact(_artifactDetails) {
+ const artifactDetails = Object.assign({}, _artifactDetails);
+ if (!_artifactDetails.isGeneric) {
+ const platformArtifactDetails = artifactDetails;
+ if (!platformArtifactDetails.platform) {
+ d('No platform found, defaulting to the host platform');
+ platformArtifactDetails.platform = process.platform;
+ }
+ if (platformArtifactDetails.arch) {
+ platformArtifactDetails.arch = getNodeArch(platformArtifactDetails.arch);
+ }
+ else {
+ d('No arch found, defaulting to the host arch');
+ platformArtifactDetails.arch = getHostArch();
+ }
+ }
+ ensureIsTruthyString(artifactDetails, 'version');
+ artifactDetails.version = getArtifactVersion(artifactDetails);
+ const fileName = getArtifactFileName(artifactDetails);
+ const url = await getArtifactRemoteURL(artifactDetails);
+ const cache = new Cache(artifactDetails.cacheRoot);
+ // Do not check if the file exists in the cache when force === true
+ if (!artifactDetails.force) {
+ d(`Checking the cache (${artifactDetails.cacheRoot}) for ${fileName} (${url})`);
+ const cachedPath = await cache.getPathForFileInCache(url, fileName);
+ if (cachedPath === null) {
+ d('Cache miss');
+ }
+ else {
+ d('Cache hit');
+ try {
+ await validateArtifact(artifactDetails, cachedPath, downloadArtifact);
+ return cachedPath;
+ }
+ catch (err) {
+ d("Artifact in cache didn't match checksums", err);
+ d('falling back to re-download');
+ }
+ }
+ }
+ if (!artifactDetails.isGeneric &&
+ isOfficialLinuxIA32Download(artifactDetails.platform, artifactDetails.arch, artifactDetails.version, artifactDetails.mirrorOptions)) {
+ console.warn('Official Linux/ia32 support is deprecated.');
+ console.warn('For more info: https://electronjs.org/blog/linux-32bit-support');
+ }
+ return await withTempDirectoryIn(artifactDetails.tempDirectory, async (tempFolder) => {
+ const tempDownloadPath = path.resolve(tempFolder, getArtifactFileName(artifactDetails));
+ const downloader = artifactDetails.downloader || (await getDownloaderForSystem());
+ d(`Downloading ${url} to ${tempDownloadPath} with options: ${JSON.stringify(artifactDetails.downloadOptions)}`);
+ await downloader.download(url, tempDownloadPath, artifactDetails.downloadOptions);
+ await validateArtifact(artifactDetails, tempDownloadPath, downloadArtifact);
+ return await cache.putFileInCache(url, tempDownloadPath, fileName);
+ });
+}
+/**
+ * Downloads a specific version of Electron and returns an absolute path to a
+ * ZIP file.
+ *
+ * @param version - The version of Electron you want to download
+ */
+export function download(version, options) {
+ return downloadArtifact(Object.assign(Object.assign({}, options), { version, platform: process.platform, arch: process.arch, artifactName: 'electron' }));
+}
+//# sourceMappingURL=index.js.map \ No newline at end of file
diff --git a/desktop/node_modules/@electron/get/dist/esm/index.js.map b/desktop/node_modules/@electron/get/dist/esm/index.js.map
new file mode 100644
index 0000000..8dd8053
--- /dev/null
+++ b/desktop/node_modules/@electron/get/dist/esm/index.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"} \ No newline at end of file
diff --git a/desktop/node_modules/@electron/get/dist/esm/proxy.d.ts b/desktop/node_modules/@electron/get/dist/esm/proxy.d.ts
new file mode 100644
index 0000000..df3e16a
--- /dev/null
+++ b/desktop/node_modules/@electron/get/dist/esm/proxy.d.ts
@@ -0,0 +1,4 @@
+/**
+ * Initializes a third-party proxy module for HTTP(S) requests.
+ */
+export declare function initializeProxy(): void;
diff --git a/desktop/node_modules/@electron/get/dist/esm/proxy.js b/desktop/node_modules/@electron/get/dist/esm/proxy.js
new file mode 100644
index 0000000..c6336c1
--- /dev/null
+++ b/desktop/node_modules/@electron/get/dist/esm/proxy.js
@@ -0,0 +1,24 @@
+import * as debug from 'debug';
+import { getEnv, setEnv } from './utils';
+const d = debug('@electron/get:proxy');
+/**
+ * Initializes a third-party proxy module for HTTP(S) requests.
+ */
+export function initializeProxy() {
+ try {
+ // See: https://github.com/electron/get/pull/214#discussion_r798845713
+ const env = getEnv('GLOBAL_AGENT_');
+ setEnv('GLOBAL_AGENT_HTTP_PROXY', env('HTTP_PROXY'));
+ setEnv('GLOBAL_AGENT_HTTPS_PROXY', env('HTTPS_PROXY'));
+ setEnv('GLOBAL_AGENT_NO_PROXY', env('NO_PROXY'));
+ /**
+ * TODO: replace global-agent with a hpagent. @BlackHole1
+ * https://github.com/sindresorhus/got/blob/HEAD/documentation/tips.md#proxying
+ */
+ require('global-agent').bootstrap();
+ }
+ catch (e) {
+ d('Could not load either proxy modules, built-in proxy support not available:', e);
+ }
+}
+//# sourceMappingURL=proxy.js.map \ No newline at end of file
diff --git a/desktop/node_modules/@electron/get/dist/esm/proxy.js.map b/desktop/node_modules/@electron/get/dist/esm/proxy.js.map
new file mode 100644
index 0000000..8c2f2d7
--- /dev/null
+++ b/desktop/node_modules/@electron/get/dist/esm/proxy.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"proxy.js","sourceRoot":"","sources":["../../src/proxy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAEzC,MAAM,CAAC,GAAG,KAAK,CAAC,qBAAqB,CAAC,CAAC;AAEvC;;GAEG;AACH,MAAM,UAAU,eAAe;IAC7B,IAAI;QACF,sEAAsE;QACtE,MAAM,GAAG,GAAG,MAAM,CAAC,eAAe,CAAC,CAAC;QAEpC,MAAM,CAAC,yBAAyB,EAAE,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC;QACrD,MAAM,CAAC,0BAA0B,EAAE,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC;QACvD,MAAM,CAAC,uBAAuB,EAAE,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC;QAEjD;;;WAGG;QACH,OAAO,CAAC,cAAc,CAAC,CAAC,SAAS,EAAE,CAAC;KACrC;IAAC,OAAO,CAAC,EAAE;QACV,CAAC,CAAC,4EAA4E,EAAE,CAAC,CAAC,CAAC;KACpF;AACH,CAAC"} \ No newline at end of file
diff --git a/desktop/node_modules/@electron/get/dist/esm/types.d.ts b/desktop/node_modules/@electron/get/dist/esm/types.d.ts
new file mode 100644
index 0000000..a8284bb
--- /dev/null
+++ b/desktop/node_modules/@electron/get/dist/esm/types.d.ts
@@ -0,0 +1,129 @@
+import { Downloader } from './Downloader';
+export declare type DownloadOptions = any;
+export interface MirrorOptions {
+ /**
+ * DEPRECATED - see nightlyMirror.
+ */
+ nightly_mirror?: string;
+ /**
+ * The Electron nightly-specific mirror URL.
+ */
+ nightlyMirror?: string;
+ /**
+ * The base URL of the mirror to download from,
+ * e.g https://github.com/electron/electron/releases/download
+ */
+ mirror?: string;
+ /**
+ * The name of the directory to download from,
+ * often scoped by version number e.g 'v4.0.4'
+ */
+ customDir?: string;
+ /**
+ * The name of the asset to download,
+ * e.g 'electron-v4.0.4-linux-x64.zip'
+ */
+ customFilename?: string;
+ /**
+ * The version of the asset to download,
+ * e.g '4.0.4'
+ */
+ customVersion?: string;
+ /**
+ * A function allowing customization of the url returned
+ * from getArtifactRemoteURL().
+ */
+ resolveAssetURL?: (opts: DownloadOptions) => Promise<string>;
+}
+export interface ElectronDownloadRequest {
+ /**
+ * The version of Electron associated with the artifact.
+ */
+ version: string;
+ /**
+ * The type of artifact. For example:
+ * * `electron`
+ * * `ffmpeg`
+ */
+ artifactName: string;
+}
+export interface ElectronDownloadRequestOptions {
+ /**
+ * Whether to download an artifact regardless of whether it's in the cache directory.
+ *
+ * Defaults to `false`.
+ */
+ force?: boolean;
+ /**
+ * When set to `true`, disables checking that the artifact download completed successfully
+ * with the correct payload.
+ *
+ * Defaults to `false`.
+ */
+ unsafelyDisableChecksums?: boolean;
+ /**
+ * Provides checksums for the artifact as strings.
+ * Can be used if you already know the checksums of the Electron artifact
+ * you are downloading and want to skip the checksum file download
+ * without skipping the checksum validation.
+ *
+ * This should be an object whose keys are the file names of the artifacts and
+ * the values are their respective SHA256 checksums.
+ */
+ checksums?: Record<string, string>;
+ /**
+ * The directory that caches Electron artifact downloads.
+ *
+ * The default value is dependent upon the host platform:
+ *
+ * * Linux: `$XDG_CACHE_HOME` or `~/.cache/electron/`
+ * * MacOS: `~/Library/Caches/electron/`
+ * * Windows: `%LOCALAPPDATA%/electron/Cache` or `~/AppData/Local/electron/Cache/`
+ */
+ cacheRoot?: string;
+ /**
+ * Options passed to the downloader module.
+ */
+ downloadOptions?: DownloadOptions;
+ /**
+ * Options related to specifying an artifact mirror.
+ */
+ mirrorOptions?: MirrorOptions;
+ /**
+ * The custom [[Downloader]] class used to download artifacts. Defaults to the
+ * built-in [[GotDownloader]].
+ */
+ downloader?: Downloader<DownloadOptions>;
+ /**
+ * A temporary directory for downloads.
+ * It is used before artifacts are put into cache.
+ */
+ tempDirectory?: string;
+}
+export declare type ElectronPlatformArtifactDetails = {
+ /**
+ * The target artifact platform. These are Node-style platform names, for example:
+ * * `win32`
+ * * `darwin`
+ * * `linux`
+ */
+ platform: string;
+ /**
+ * The target artifact architecture. These are Node-style architecture names, for example:
+ * * `ia32`
+ * * `x64`
+ * * `armv7l`
+ */
+ arch: string;
+ artifactSuffix?: string;
+ isGeneric?: false;
+} & ElectronDownloadRequest & ElectronDownloadRequestOptions;
+export declare type ElectronGenericArtifactDetails = {
+ isGeneric: true;
+} & ElectronDownloadRequest & ElectronDownloadRequestOptions;
+export declare type ElectronArtifactDetails = ElectronPlatformArtifactDetails | ElectronGenericArtifactDetails;
+export declare type Omit<T, K> = Pick<T, Exclude<keyof T, K>>;
+export declare type ElectronPlatformArtifactDetailsWithDefaults = (Omit<ElectronPlatformArtifactDetails, 'platform' | 'arch'> & {
+ platform?: string;
+ arch?: string;
+}) | ElectronGenericArtifactDetails;
diff --git a/desktop/node_modules/@electron/get/dist/esm/types.js b/desktop/node_modules/@electron/get/dist/esm/types.js
new file mode 100644
index 0000000..5b2306a
--- /dev/null
+++ b/desktop/node_modules/@electron/get/dist/esm/types.js
@@ -0,0 +1 @@
+//# sourceMappingURL=types.js.map \ No newline at end of file
diff --git a/desktop/node_modules/@electron/get/dist/esm/types.js.map b/desktop/node_modules/@electron/get/dist/esm/types.js.map
new file mode 100644
index 0000000..7b5fff8
--- /dev/null
+++ b/desktop/node_modules/@electron/get/dist/esm/types.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":""} \ No newline at end of file
diff --git a/desktop/node_modules/@electron/get/dist/esm/utils.d.ts b/desktop/node_modules/@electron/get/dist/esm/utils.d.ts
new file mode 100644
index 0000000..3cc40c1
--- /dev/null
+++ b/desktop/node_modules/@electron/get/dist/esm/utils.d.ts
@@ -0,0 +1,25 @@
+export declare function withTempDirectoryIn<T>(parentDirectory: string | undefined, fn: (directory: string) => Promise<T>): Promise<T>;
+export declare function withTempDirectory<T>(fn: (directory: string) => Promise<T>): Promise<T>;
+export declare function normalizeVersion(version: string): string;
+/**
+ * Runs the `uname` command and returns the trimmed output.
+ */
+export declare function uname(): string;
+/**
+ * Generates an architecture name that would be used in an Electron or Node.js
+ * download file name.
+ */
+export declare function getNodeArch(arch: string): string;
+/**
+ * Generates an architecture name that would be used in an Electron or Node.js
+ * download file name, from the `process` module information.
+ */
+export declare function getHostArch(): string;
+export declare function ensureIsTruthyString<T, K extends keyof T>(obj: T, key: K): void;
+export declare function isOfficialLinuxIA32Download(platform: string, arch: string, version: string, mirrorOptions?: object): boolean;
+/**
+ * Find the value of a environment variable which may or may not have the
+ * prefix, in a case-insensitive manner.
+ */
+export declare function getEnv(prefix?: string): (name: string) => string | undefined;
+export declare function setEnv(key: string, value: string | undefined): void;
diff --git a/desktop/node_modules/@electron/get/dist/esm/utils.js b/desktop/node_modules/@electron/get/dist/esm/utils.js
new file mode 100644
index 0000000..575ea86
--- /dev/null
+++ b/desktop/node_modules/@electron/get/dist/esm/utils.js
@@ -0,0 +1,95 @@
+import * as childProcess from 'child_process';
+import * as fs from 'fs-extra';
+import * as os from 'os';
+import * as path from 'path';
+async function useAndRemoveDirectory(directory, fn) {
+ let result;
+ try {
+ result = await fn(directory);
+ }
+ finally {
+ await fs.remove(directory);
+ }
+ return result;
+}
+export async function withTempDirectoryIn(parentDirectory = os.tmpdir(), fn) {
+ const tempDirectoryPrefix = 'electron-download-';
+ const tempDirectory = await fs.mkdtemp(path.resolve(parentDirectory, tempDirectoryPrefix));
+ return useAndRemoveDirectory(tempDirectory, fn);
+}
+export async function withTempDirectory(fn) {
+ return withTempDirectoryIn(undefined, fn);
+}
+export function normalizeVersion(version) {
+ if (!version.startsWith('v')) {
+ return `v${version}`;
+ }
+ return version;
+}
+/**
+ * Runs the `uname` command and returns the trimmed output.
+ */
+export function uname() {
+ return childProcess
+ .execSync('uname -m')
+ .toString()
+ .trim();
+}
+/**
+ * Generates an architecture name that would be used in an Electron or Node.js
+ * download file name.
+ */
+export function getNodeArch(arch) {
+ if (arch === 'arm') {
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
+ switch (process.config.variables.arm_version) {
+ case '6':
+ return uname();
+ case '7':
+ default:
+ return 'armv7l';
+ }
+ }
+ return arch;
+}
+/**
+ * Generates an architecture name that would be used in an Electron or Node.js
+ * download file name, from the `process` module information.
+ */
+export function getHostArch() {
+ return getNodeArch(process.arch);
+}
+export function ensureIsTruthyString(obj, key) {
+ if (!obj[key] || typeof obj[key] !== 'string') {
+ throw new Error(`Expected property "${key}" to be provided as a string but it was not`);
+ }
+}
+export function isOfficialLinuxIA32Download(platform, arch, version, mirrorOptions) {
+ return (platform === 'linux' &&
+ arch === 'ia32' &&
+ Number(version.slice(1).split('.')[0]) >= 4 &&
+ typeof mirrorOptions === 'undefined');
+}
+/**
+ * Find the value of a environment variable which may or may not have the
+ * prefix, in a case-insensitive manner.
+ */
+export function getEnv(prefix = '') {
+ const envsLowerCase = {};
+ for (const envKey in process.env) {
+ envsLowerCase[envKey.toLowerCase()] = process.env[envKey];
+ }
+ return (name) => {
+ return (envsLowerCase[`${prefix}${name}`.toLowerCase()] ||
+ envsLowerCase[name.toLowerCase()] ||
+ undefined);
+ };
+}
+export function setEnv(key, value) {
+ // The `void` operator always returns `undefined`.
+ // See: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/void
+ if (value !== void 0) {
+ process.env[key] = value;
+ }
+}
+//# sourceMappingURL=utils.js.map \ No newline at end of file
diff --git a/desktop/node_modules/@electron/get/dist/esm/utils.js.map b/desktop/node_modules/@electron/get/dist/esm/utils.js.map
new file mode 100644
index 0000000..6c65992
--- /dev/null
+++ b/desktop/node_modules/@electron/get/dist/esm/utils.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"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"} \ No newline at end of file
diff --git a/desktop/node_modules/@electron/get/package.json b/desktop/node_modules/@electron/get/package.json
new file mode 100644
index 0000000..10e4609
--- /dev/null
+++ b/desktop/node_modules/@electron/get/package.json
@@ -0,0 +1,100 @@
+{
+ "name": "@electron/get",
+ "version": "2.0.3",
+ "description": "Utility for downloading artifacts from different versions of Electron",
+ "main": "dist/cjs/index.js",
+ "module": "dist/esm/index.js",
+ "repository": "https://github.com/electron/get",
+ "author": "Samuel Attard",
+ "license": "MIT",
+ "scripts": {
+ "build": "tsc && tsc -p tsconfig.esm.json",
+ "build:docs": "typedoc --out docs",
+ "eslint": "eslint --ext .ts src test",
+ "jest": "jest --coverage",
+ "lint": "npm run prettier && npm run eslint",
+ "prettier": "prettier --check \"src/**/*.ts\" \"test/**/*.ts\"",
+ "prepublishOnly": "npm run build",
+ "test": "npm run lint && npm run jest",
+ "test:nonetwork": "npm run lint && npm run jest -- --testPathIgnorePatterns network.spec"
+ },
+ "files": [
+ "dist/*",
+ "README.md"
+ ],
+ "engines": {
+ "node": ">=12"
+ },
+ "dependencies": {
+ "debug": "^4.1.1",
+ "env-paths": "^2.2.0",
+ "fs-extra": "^8.1.0",
+ "got": "^11.8.5",
+ "progress": "^2.0.3",
+ "semver": "^6.2.0",
+ "sumchecker": "^3.0.1"
+ },
+ "devDependencies": {
+ "@continuous-auth/semantic-release-npm": "^3.0.0",
+ "@types/debug": "^4.1.4",
+ "@types/fs-extra": "^8.0.0",
+ "@types/jest": "^24.0.13",
+ "@types/node": "^12.20.55",
+ "@types/progress": "^2.0.3",
+ "@types/semver": "^6.2.0",
+ "@typescript-eslint/eslint-plugin": "^2.34.0",
+ "@typescript-eslint/parser": "^2.34.0",
+ "eslint": "^6.8.0",
+ "eslint-config-prettier": "^6.15.0",
+ "eslint-plugin-import": "^2.22.1",
+ "eslint-plugin-jest": "< 24.0.0",
+ "husky": "^2.3.0",
+ "jest": "^24.8.0",
+ "lint-staged": "^8.1.7",
+ "prettier": "^1.17.1",
+ "ts-jest": "^24.0.0",
+ "typedoc": "^0.17.2",
+ "typescript": "^3.8.0"
+ },
+ "eslintConfig": {
+ "parser": "@typescript-eslint/parser",
+ "extends": [
+ "eslint:recommended",
+ "plugin:@typescript-eslint/eslint-recommended",
+ "plugin:@typescript-eslint/recommended",
+ "plugin:jest/recommended",
+ "plugin:import/errors",
+ "plugin:import/warnings",
+ "plugin:import/typescript",
+ "prettier",
+ "prettier/@typescript-eslint"
+ ]
+ },
+ "husky": {
+ "hooks": {
+ "pre-commit": "lint-staged"
+ }
+ },
+ "lint-staged": {
+ "*.ts": [
+ "eslint --fix",
+ "prettier --write",
+ "git add"
+ ]
+ },
+ "keywords": [
+ "electron",
+ "download",
+ "prebuild",
+ "get",
+ "artifact",
+ "release"
+ ],
+ "optionalDependencies": {
+ "global-agent": "^3.0.0"
+ },
+ "resolutions": {
+ "eslint/inquirer": "< 7.3.0",
+ "**/@typescript-eslint/typescript-estree/semver": "^6.3.0"
+ }
+}
diff --git a/desktop/node_modules/@electron/notarize/LICENSE b/desktop/node_modules/@electron/notarize/LICENSE
new file mode 100644
index 0000000..4e3eb8a
--- /dev/null
+++ b/desktop/node_modules/@electron/notarize/LICENSE
@@ -0,0 +1,7 @@
+Copyright 2018 Samuel Attard and contributors
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/desktop/node_modules/@electron/notarize/README.md b/desktop/node_modules/@electron/notarize/README.md
new file mode 100644
index 0000000..f2b1ada
--- /dev/null
+++ b/desktop/node_modules/@electron/notarize/README.md
@@ -0,0 +1,132 @@
+Electron Notarize
+-----------
+
+> Notarize your Electron apps seamlessly for macOS
+
+[![CircleCI status](https://circleci.com/gh/electron/notarize.svg?style=shield)](https://circleci.com/gh/electron/notarize)
+[![NPM package](https://img.shields.io/npm/v/@electron/notarize)](https://npm.im/@electron/notarize)
+
+## Installation
+
+```bash
+# npm
+npm install @electron/notarize --save-dev
+
+# yarn
+yarn add @electron/notarize --dev
+```
+
+## What is app "notarization"?
+
+From Apple's docs in XCode:
+
+> A notarized app is a macOS app that was uploaded to Apple for processing before it was distributed. When you export a notarized app from Xcode, it code signs the app with a Developer ID certificate and staples a ticket from Apple to the app. The ticket confirms that you previously uploaded the app to Apple.
+
+> On macOS 10.14 and later, the user can launch notarized apps when Gatekeeper is enabled. When the user first launches a notarized app, Gatekeeper looks for the app’s ticket online. If the user is offline, Gatekeeper looks for the ticket that was stapled to the app.
+
+Apple has made this a hard requirement as of 10.15 (Catalina).
+
+## Prerequisites
+
+For notarization, you need the following things:
+
+1. Xcode 10 or later installed on your Mac.
+2. An [Apple Developer](https://developer.apple.com/) account.
+3. [An app-specific password for your ADC account’s Apple ID](https://support.apple.com/HT204397).
+4. Your app may need to be signed with `hardened-runtime`, including the following entitlement:
+ 1. `com.apple.security.cs.allow-jit`
+
+ If you are using Electron 11 or below, you must add the `com.apple.security.cs.allow-unsigned-executable-memory` entitlement too.
+ When using version 12+, this entitlement should not be applied as it increases your app's attack surface.
+
+## API
+
+### Method: `notarize(opts): Promise<void>`
+
+* `options` Object
+ * `tool` String - The notarization tool to use, default is `legacy`. Can be `legacy` or `notarytool`. `notarytool` is substantially (10x) faster.
+ * `appPath` String - The absolute path to your `.app` file
+ * There are different options for each tool: Legacy
+ * `appBundleId` String - The app bundle identifier your Electron app is using. E.g. `com.github.electron`
+ * `ascProvider` String (optional) - Your [Team Short Name](#notes-on-your-team-short-name).
+ * There are two authentication methods available: user name with password:
+ * `appleId` String - The username of your apple developer account
+ * `appleIdPassword` String - The [app-specific password](https://support.apple.com/HT204397) (not your Apple ID password).
+ * ... or apiKey with apiIssuer:
+ * `appleApiKey` String - Required for JWT authentication. See Note on JWT authentication below.
+ * `appleApiIssuer` String - Issuer ID. Required if `appleApiKey` is specified.
+ * ... or Notary Tool
+ * There are three authentication methods available: user name with password:
+ * `appleId` String - The username of your apple developer account
+ * `appleIdPassword` String - The [app-specific password](https://support.apple.com/HT204397) (not your Apple ID password).
+ * `teamId` String - The team ID you want to notarize under.
+ * ... or apiKey with apiIssuer:
+ * `appleApiKey` String - Required for JWT authentication. See Note on JWT authentication below.
+ * `appleApiKeyId` String - Required for JWT authentication. See Note on JWT authentication below.
+ * `appleApiIssuer` String - Issuer ID. Required if `appleApiKey` is specified.
+ * ... or keychain with keychainProfile:
+ * `keychain` String - The name of the keychain or path to the keychain you stored notarization credentials in.
+ * `keychainProfile` String - The name of the profile you provided when storing notarization credentials.
+
+## Safety when using `appleIdPassword`
+
+1. Never hard code your password into your packaging scripts, use an environment
+variable at a minimum.
+2. It is possible to provide a keychain reference instead of your actual password (assuming that you have already logged into
+the Application Loader from Xcode). For example:
+
+```javascript
+const password = `@keychain:"Application Loader: ${appleId}"`;
+```
+
+Another option is that you can add a new keychain item using either the Keychain Access app or from the command line using the `security` utility:
+
+```bash
+security add-generic-password -a "AC_USERNAME" -w <app_specific_password> -s "AC_PASSWORD"
+```
+where `AC_USERNAME` should be replaced with your Apple ID, and then in your code you can use:
+
+```javascript
+const password = `@keychain:AC_PASSWORD`;
+```
+
+## Notes on JWT authentication
+
+You can obtain an API key from [Appstore Connect](https://appstoreconnect.apple.com/access/api). Create a key with _App Manager_ access. Note down the Issuer ID and download the `.p8` file. This file is your API key and comes with the name of `AuthKey_<api_key>.p8`. This is the string you have to supply when calling `notarize`.
+
+Based on the `ApiKey`, `altool` will look in the following places for that file:
+
+* `./private_keys`
+* `~/private_keys`
+* `~/.private_keys`
+* `~/.appstoreconnect/private_keys`
+
+## Notes on your Team Short Name
+
+If you are a member of multiple teams or organizations, you have to tell Apple on behalf of which organization you're uploading. To find your [team's short name](https://forums.developer.apple.com/thread/113798)), you can ask `iTMSTransporter`, which is part of the now deprecated `Application Loader` as well as the newer [`Transporter`](https://apps.apple.com/us/app/transporter/id1450874784?mt=12).
+
+With `Transporter` installed, run:
+```sh
+/Applications/Transporter.app/Contents/itms/bin/iTMSTransporter -m provider -u APPLE_DEV_ACCOUNT -p APP_PASSWORD
+```
+
+Alternatively, with older versions of Xcode, run:
+```sh
+/Applications/Xcode.app/Contents/Applications/Application Loader.app/Contents/itms/bin/iTMSTransporter -m provider -u APPLE_DEV_ACCOUNT -p APP_PASSWORD
+```
+## Example Usage
+
+```javascript
+import { notarize } from '@electron/notarize';
+
+async function packageTask () {
+ // Package your app here, and code sign with hardened runtime
+ await notarize({
+ appBundleId,
+ appPath,
+ appleId,
+ appleIdPassword,
+ ascProvider, // This parameter is optional
+ });
+}
+```
diff --git a/desktop/node_modules/@electron/notarize/lib/helpers.d.ts b/desktop/node_modules/@electron/notarize/lib/helpers.d.ts
new file mode 100644
index 0000000..774dc2e
--- /dev/null
+++ b/desktop/node_modules/@electron/notarize/lib/helpers.d.ts
@@ -0,0 +1,13 @@
+export declare function withTempDir<T>(fn: (dir: string) => Promise<T>): Promise<T>;
+export declare function makeSecret(s: string): string;
+export declare function isSecret(s: string): boolean;
+export interface NotarizationInfo {
+ uuid: string;
+ date: Date;
+ status: 'invalid' | 'in progress' | 'success';
+ logFileUrl: string | null;
+ statusCode?: 0 | 2;
+ statusMessage?: string;
+}
+export declare function parseNotarizationInfo(info: string): NotarizationInfo;
+export declare function delay(ms: number): Promise<void>;
diff --git a/desktop/node_modules/@electron/notarize/lib/helpers.js b/desktop/node_modules/@electron/notarize/lib/helpers.js
new file mode 100644
index 0000000..875894f
--- /dev/null
+++ b/desktop/node_modules/@electron/notarize/lib/helpers.js
@@ -0,0 +1,79 @@
+var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.delay = exports.parseNotarizationInfo = exports.isSecret = exports.makeSecret = exports.withTempDir = void 0;
+const debug = require("debug");
+const fs = require("fs-extra");
+const os = require("os");
+const path = require("path");
+const d = debug('electron-notarize:helpers');
+function withTempDir(fn) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const dir = yield fs.mkdtemp(path.resolve(os.tmpdir(), 'electron-notarize-'));
+ d('doing work inside temp dir:', dir);
+ let result;
+ try {
+ result = yield fn(dir);
+ }
+ catch (err) {
+ d('work failed');
+ yield fs.remove(dir);
+ throw err;
+ }
+ d('work succeeded');
+ yield fs.remove(dir);
+ return result;
+ });
+}
+exports.withTempDir = withTempDir;
+class Secret {
+ constructor(value) {
+ this.value = value;
+ }
+ toString() {
+ return this.value;
+ }
+ inspect() {
+ return '******';
+ }
+}
+function makeSecret(s) {
+ return new Secret(s);
+}
+exports.makeSecret = makeSecret;
+function isSecret(s) {
+ return s instanceof Secret;
+}
+exports.isSecret = isSecret;
+function parseNotarizationInfo(info) {
+ const out = {};
+ const matchToProperty = (key, r, modifier) => {
+ const exec = r.exec(info);
+ if (exec) {
+ out[key] = modifier ? modifier(exec[1]) : exec[1];
+ }
+ };
+ matchToProperty('uuid', /\n *RequestUUID: (.+?)\n/);
+ matchToProperty('date', /\n *Date: (.+?)\n/, d => new Date(d));
+ matchToProperty('status', /\n *Status: (.+?)\n/);
+ matchToProperty('logFileUrl', /\n *LogFileURL: (.+?)\n/);
+ matchToProperty('statusCode', /\n *Status Code: (.+?)\n/, n => parseInt(n, 10));
+ matchToProperty('statusMessage', /\n *Status Message: (.+?)\n/);
+ if (out.logFileUrl === '(null)') {
+ out.logFileUrl = null;
+ }
+ return out;
+}
+exports.parseNotarizationInfo = parseNotarizationInfo;
+function delay(ms) {
+ return new Promise(resolve => setTimeout(resolve, ms));
+}
+exports.delay = delay;
+//# sourceMappingURL=helpers.js.map \ No newline at end of file
diff --git a/desktop/node_modules/@electron/notarize/lib/helpers.js.map b/desktop/node_modules/@electron/notarize/lib/helpers.js.map
new file mode 100644
index 0000000..4e58fa3
--- /dev/null
+++ b/desktop/node_modules/@electron/notarize/lib/helpers.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../src/helpers.ts"],"names":[],"mappings":";;;;;;;;;;;AAAA,+BAA+B;AAC/B,+BAA+B;AAC/B,yBAAyB;AACzB,6BAA6B;AAE7B,MAAM,CAAC,GAAG,KAAK,CAAC,2BAA2B,CAAC,CAAC;AAE7C,SAAsB,WAAW,CAAI,EAA+B;;QAClE,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,oBAAoB,CAAC,CAAC,CAAC;QAC9E,CAAC,CAAC,6BAA6B,EAAE,GAAG,CAAC,CAAC;QACtC,IAAI,MAAS,CAAC;QACd,IAAI;YACF,MAAM,GAAG,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC;SACxB;QAAC,OAAO,GAAG,EAAE;YACZ,CAAC,CAAC,aAAa,CAAC,CAAC;YACjB,MAAM,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACrB,MAAM,GAAG,CAAC;SACX;QACD,CAAC,CAAC,gBAAgB,CAAC,CAAC;QACpB,MAAM,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACrB,OAAO,MAAM,CAAC;IAChB,CAAC;CAAA;AAdD,kCAcC;AAED,MAAM,MAAM;IACV,YAAoB,KAAa;QAAb,UAAK,GAAL,KAAK,CAAQ;IAAG,CAAC;IAErC,QAAQ;QACN,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IACD,OAAO;QACL,OAAO,QAAQ,CAAC;IAClB,CAAC;CACF;AAED,SAAgB,UAAU,CAAC,CAAS;IAClC,OAAQ,IAAI,MAAM,CAAC,CAAC,CAAmB,CAAC;AAC1C,CAAC;AAFD,gCAEC;AAED,SAAgB,QAAQ,CAAC,CAAS;IAChC,OAAQ,CAAS,YAAY,MAAM,CAAC;AACtC,CAAC;AAFD,4BAEC;AAYD,SAAgB,qBAAqB,CAAC,IAAY;IAChD,MAAM,GAAG,GAAG,EAAS,CAAC;IACtB,MAAM,eAAe,GAAG,CACtB,GAAM,EACN,CAAS,EACT,QAA6C,EAC7C,EAAE;QACF,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1B,IAAI,IAAI,EAAE;YACR,GAAG,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;SACnD;IACH,CAAC,CAAC;IACF,eAAe,CAAC,MAAM,EAAE,0BAA0B,CAAC,CAAC;IACpD,eAAe,CAAC,MAAM,EAAE,mBAAmB,EAAE,CAAC,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/D,eAAe,CAAC,QAAQ,EAAE,qBAAqB,CAAC,CAAC;IACjD,eAAe,CAAC,YAAY,EAAE,yBAAyB,CAAC,CAAC;IACzD,eAAe,CAAC,YAAY,EAAE,0BAA0B,EAAE,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAQ,CAAC,CAAC;IACvF,eAAe,CAAC,eAAe,EAAE,6BAA6B,CAAC,CAAC;IAEhE,IAAI,GAAG,CAAC,UAAU,KAAK,QAAQ,EAAE;QAC/B,GAAG,CAAC,UAAU,GAAG,IAAI,CAAC;KACvB;IAED,OAAO,GAAG,CAAC;AACb,CAAC;AAxBD,sDAwBC;AAED,SAAgB,KAAK,CAAC,EAAU;IAC9B,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AACzD,CAAC;AAFD,sBAEC"} \ No newline at end of file
diff --git a/desktop/node_modules/@electron/notarize/lib/index.d.ts b/desktop/node_modules/@electron/notarize/lib/index.d.ts
new file mode 100644
index 0000000..b013467
--- /dev/null
+++ b/desktop/node_modules/@electron/notarize/lib/index.d.ts
@@ -0,0 +1,4 @@
+import { NotarizeOptions } from './types';
+export { NotarizeOptions };
+export { validateLegacyAuthorizationArgs as validateAuthorizationArgs } from './validate-args';
+export declare function notarize({ appPath, ...otherOptions }: NotarizeOptions): Promise<void>;
diff --git a/desktop/node_modules/@electron/notarize/lib/index.js b/desktop/node_modules/@electron/notarize/lib/index.js
new file mode 100644
index 0000000..7951823
--- /dev/null
+++ b/desktop/node_modules/@electron/notarize/lib/index.js
@@ -0,0 +1,63 @@
+var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+var __rest = (this && this.__rest) || function (s, e) {
+ var t = {};
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
+ t[p] = s[p];
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
+ t[p[i]] = s[p[i]];
+ }
+ return t;
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.notarize = exports.validateAuthorizationArgs = void 0;
+const debug = require("debug");
+const helpers_1 = require("./helpers");
+const legacy_1 = require("./legacy");
+const notarytool_1 = require("./notarytool");
+const staple_1 = require("./staple");
+const d = debug('electron-notarize');
+var validate_args_1 = require("./validate-args");
+Object.defineProperty(exports, "validateAuthorizationArgs", { enumerable: true, get: function () { return validate_args_1.validateLegacyAuthorizationArgs; } });
+function notarize(_a) {
+ var { appPath } = _a, otherOptions = __rest(_a, ["appPath"]);
+ return __awaiter(this, void 0, void 0, function* () {
+ if (otherOptions.tool === 'notarytool') {
+ d('notarizing using the new notarytool system');
+ if (!(yield (0, notarytool_1.isNotaryToolAvailable)())) {
+ throw new Error('notarytool is not available, you must be on at least Xcode 13');
+ }
+ yield (0, notarytool_1.notarizeAndWaitForNotaryTool)(Object.assign({ appPath }, otherOptions));
+ }
+ else {
+ console.warn('Notarizing using the legacy altool system. The altool system will be disabled on November 1 2023. Please switch to the notarytool system before then.');
+ console.warn('You can do this by setting "tool: notarytool" in your "@electron/notarize" options. Please note that the credentials options may be slightly different between tools.');
+ d('notarizing using the legacy notarization system, this will be slow');
+ const { uuid } = yield (0, legacy_1.startLegacyNotarize)(Object.assign({ appPath }, otherOptions));
+ /**
+ * Wait for Apples API to initialize the status UUID
+ *
+ * If we start checking too quickly the UUID is not ready yet
+ * and this step will fail. It takes Apple a number of minutes
+ * to actually complete the job so an extra 10 second delay here
+ * is not a big deal
+ */
+ d('notarization started, waiting for 10 seconds before pinging Apple for status');
+ yield (0, helpers_1.delay)(10000);
+ d('starting to poll for notarization status');
+ yield (0, legacy_1.waitForLegacyNotarize)(Object.assign({ uuid }, otherOptions));
+ }
+ yield (0, staple_1.stapleApp)({ appPath });
+ });
+}
+exports.notarize = notarize;
+//# sourceMappingURL=index.js.map \ No newline at end of file
diff --git a/desktop/node_modules/@electron/notarize/lib/index.js.map b/desktop/node_modules/@electron/notarize/lib/index.js.map
new file mode 100644
index 0000000..51c2caa
--- /dev/null
+++ b/desktop/node_modules/@electron/notarize/lib/index.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAAA,+BAA+B;AAC/B,uCAAkC;AAClC,qCAAsE;AACtE,6CAAmF;AACnF,qCAAqC;AAGrC,MAAM,CAAC,GAAG,KAAK,CAAC,mBAAmB,CAAC,CAAC;AAIrC,iDAA+F;AAAtF,0HAAA,+BAA+B,OAA6B;AAErE,SAAsB,QAAQ,CAAC,EAA6C;QAA7C,EAAE,OAAO,OAAoC,EAA/B,YAAY,cAA1B,WAA4B,CAAF;;QACvD,IAAI,YAAY,CAAC,IAAI,KAAK,YAAY,EAAE;YACtC,CAAC,CAAC,4CAA4C,CAAC,CAAC;YAChD,IAAI,CAAC,CAAC,MAAM,IAAA,kCAAqB,GAAE,CAAC,EAAE;gBACpC,MAAM,IAAI,KAAK,CAAC,+DAA+D,CAAC,CAAC;aAClF;YAED,MAAM,IAAA,yCAA4B,kBAChC,OAAO,IACJ,YAAY,EACf,CAAC;SACJ;aAAM;YACL,OAAO,CAAC,IAAI,CACV,uJAAuJ,CACxJ,CAAC;YACF,OAAO,CAAC,IAAI,CACV,uKAAuK,CACxK,CAAC;YACF,CAAC,CAAC,oEAAoE,CAAC,CAAC;YACxE,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAA,4BAAmB,kBACxC,OAAO,IACJ,YAAY,EACf,CAAC;YACH;;;;;;;eAOG;YACH,CAAC,CAAC,8EAA8E,CAAC,CAAC;YAClF,MAAM,IAAA,eAAK,EAAC,KAAK,CAAC,CAAC;YACnB,CAAC,CAAC,0CAA0C,CAAC,CAAC;YAC9C,MAAM,IAAA,8BAAqB,kBAAG,IAAI,IAAK,YAAY,EAAG,CAAC;SACxD;QAED,MAAM,IAAA,kBAAS,EAAC,EAAE,OAAO,EAAE,CAAC,CAAC;;CAC9B;AAtCD,4BAsCC"} \ No newline at end of file
diff --git a/desktop/node_modules/@electron/notarize/lib/legacy.d.ts b/desktop/node_modules/@electron/notarize/lib/legacy.d.ts
new file mode 100644
index 0000000..2534eaa
--- /dev/null
+++ b/desktop/node_modules/@electron/notarize/lib/legacy.d.ts
@@ -0,0 +1,3 @@
+import { NotarizeResult, LegacyNotarizeStartOptions, LegacyNotarizeWaitOptions } from './types';
+export declare function startLegacyNotarize(opts: LegacyNotarizeStartOptions): Promise<NotarizeResult>;
+export declare function waitForLegacyNotarize(opts: LegacyNotarizeWaitOptions): Promise<void>;
diff --git a/desktop/node_modules/@electron/notarize/lib/legacy.js b/desktop/node_modules/@electron/notarize/lib/legacy.js
new file mode 100644
index 0000000..48f28f7
--- /dev/null
+++ b/desktop/node_modules/@electron/notarize/lib/legacy.js
@@ -0,0 +1,116 @@
+var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.waitForLegacyNotarize = exports.startLegacyNotarize = void 0;
+const debug = require("debug");
+const path = require("path");
+const spawn_1 = require("./spawn");
+const helpers_1 = require("./helpers");
+const validate_args_1 = require("./validate-args");
+const d = debug('electron-notarize:legacy');
+function authorizationArgs(rawOpts) {
+ const opts = (0, validate_args_1.validateLegacyAuthorizationArgs)(rawOpts);
+ if ((0, validate_args_1.isLegacyPasswordCredentials)(opts)) {
+ return ['-u', (0, helpers_1.makeSecret)(opts.appleId), '-p', (0, helpers_1.makeSecret)(opts.appleIdPassword)];
+ }
+ else {
+ return [
+ '--apiKey',
+ (0, helpers_1.makeSecret)(opts.appleApiKey),
+ '--apiIssuer',
+ (0, helpers_1.makeSecret)(opts.appleApiIssuer),
+ ];
+ }
+}
+function startLegacyNotarize(opts) {
+ return __awaiter(this, void 0, void 0, function* () {
+ d('starting notarize process for app:', opts.appPath);
+ return yield (0, helpers_1.withTempDir)((dir) => __awaiter(this, void 0, void 0, function* () {
+ const zipPath = path.resolve(dir, `${path.basename(opts.appPath, '.app')}.zip`);
+ d('zipping application to:', zipPath);
+ const zipResult = yield (0, spawn_1.spawn)('ditto', ['-c', '-k', '--sequesterRsrc', '--keepParent', path.basename(opts.appPath), zipPath], {
+ cwd: path.dirname(opts.appPath),
+ });
+ if (zipResult.code !== 0) {
+ throw new Error(`Failed to zip application, exited with code: ${zipResult.code}\n\n${zipResult.output}`);
+ }
+ d('zip succeeded, attempting to upload to Apple');
+ const notarizeArgs = [
+ 'altool',
+ '--notarize-app',
+ '-f',
+ zipPath,
+ '--primary-bundle-id',
+ opts.appBundleId,
+ ...authorizationArgs(opts),
+ ];
+ if (opts.ascProvider) {
+ notarizeArgs.push('-itc_provider', opts.ascProvider);
+ }
+ const result = yield (0, spawn_1.spawn)('xcrun', notarizeArgs);
+ if (result.code !== 0) {
+ throw new Error(`Failed to upload app to Apple's notarization servers\n\n${result.output}`);
+ }
+ d('upload success');
+ const uuidMatch = /\nRequestUUID = (.+?)\n/g.exec(result.output);
+ if (!uuidMatch) {
+ throw new Error(`Failed to find request UUID in output:\n\n${result.output}`);
+ }
+ d('found UUID:', uuidMatch[1]);
+ return {
+ uuid: uuidMatch[1],
+ };
+ }));
+ });
+}
+exports.startLegacyNotarize = startLegacyNotarize;
+function waitForLegacyNotarize(opts) {
+ return __awaiter(this, void 0, void 0, function* () {
+ d('checking notarization status:', opts.uuid);
+ const result = yield (0, spawn_1.spawn)('xcrun', [
+ 'altool',
+ '--notarization-info',
+ opts.uuid,
+ ...authorizationArgs(opts),
+ ]);
+ if (result.code !== 0) {
+ // These checks could fail for all sorts of reasons, including:
+ // * The status of a request isn't available as soon as the upload request returns, so
+ // it may just not be ready yet.
+ // * If using keychain password, user's mac went to sleep and keychain locked.
+ // * Regular old connectivity failure.
+ d(`Failed to check status of notarization request, retrying in 30 seconds: ${opts.uuid}\n\n${result.output}`);
+ yield (0, helpers_1.delay)(30000);
+ return waitForLegacyNotarize(opts);
+ }
+ const notarizationInfo = (0, helpers_1.parseNotarizationInfo)(result.output);
+ if (notarizationInfo.status === 'in progress') {
+ d('still in progress, waiting 30 seconds');
+ yield (0, helpers_1.delay)(30000);
+ return waitForLegacyNotarize(opts);
+ }
+ d('notarzation done with info:', notarizationInfo);
+ if (notarizationInfo.status === 'invalid') {
+ d('notarization failed');
+ throw new Error(`Apple failed to notarize your application, check the logs for more info
+
+Status Code: ${notarizationInfo.statusCode || 'No Code'}
+Message: ${notarizationInfo.statusMessage || 'No Message'}
+Logs: ${notarizationInfo.logFileUrl}`);
+ }
+ if (notarizationInfo.status !== 'success') {
+ throw new Error(`Unrecognized notarization status: "${notarizationInfo.status}"`);
+ }
+ d('notarization was successful');
+ return;
+ });
+}
+exports.waitForLegacyNotarize = waitForLegacyNotarize;
+//# sourceMappingURL=legacy.js.map \ No newline at end of file
diff --git a/desktop/node_modules/@electron/notarize/lib/legacy.js.map b/desktop/node_modules/@electron/notarize/lib/legacy.js.map
new file mode 100644
index 0000000..537c4a3
--- /dev/null
+++ b/desktop/node_modules/@electron/notarize/lib/legacy.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"legacy.js","sourceRoot":"","sources":["../src/legacy.ts"],"names":[],"mappings":"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"} \ No newline at end of file
diff --git a/desktop/node_modules/@electron/notarize/lib/notarytool.d.ts b/desktop/node_modules/@electron/notarize/lib/notarytool.d.ts
new file mode 100644
index 0000000..7eab59d
--- /dev/null
+++ b/desktop/node_modules/@electron/notarize/lib/notarytool.d.ts
@@ -0,0 +1,3 @@
+import { NotaryToolStartOptions } from './types';
+export declare function isNotaryToolAvailable(): Promise<boolean>;
+export declare function notarizeAndWaitForNotaryTool(opts: NotaryToolStartOptions): Promise<void>;
diff --git a/desktop/node_modules/@electron/notarize/lib/notarytool.js b/desktop/node_modules/@electron/notarize/lib/notarytool.js
new file mode 100644
index 0000000..4a700e2
--- /dev/null
+++ b/desktop/node_modules/@electron/notarize/lib/notarytool.js
@@ -0,0 +1,101 @@
+var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.notarizeAndWaitForNotaryTool = exports.isNotaryToolAvailable = void 0;
+const debug = require("debug");
+const path = require("path");
+const spawn_1 = require("./spawn");
+const helpers_1 = require("./helpers");
+const validate_args_1 = require("./validate-args");
+const d = debug('electron-notarize:notarytool');
+function authorizationArgs(rawOpts) {
+ const opts = (0, validate_args_1.validateNotaryToolAuthorizationArgs)(rawOpts);
+ if ((0, validate_args_1.isNotaryToolPasswordCredentials)(opts)) {
+ return [
+ '--apple-id',
+ (0, helpers_1.makeSecret)(opts.appleId),
+ '--password',
+ (0, helpers_1.makeSecret)(opts.appleIdPassword),
+ '--team-id',
+ (0, helpers_1.makeSecret)(opts.teamId),
+ ];
+ }
+ else if ((0, validate_args_1.isNotaryToolApiKeyCredentials)(opts)) {
+ return [
+ '--key',
+ (0, helpers_1.makeSecret)(opts.appleApiKey),
+ '--key-id',
+ (0, helpers_1.makeSecret)(opts.appleApiKeyId),
+ '--issuer',
+ (0, helpers_1.makeSecret)(opts.appleApiIssuer),
+ ];
+ }
+ else {
+ // --keychain is optional -- when not specified, the iCloud keychain is used by notarytool
+ if (opts.keychain) {
+ return ['--keychain', opts.keychain, '--keychain-profile', opts.keychainProfile];
+ }
+ return ['--keychain-profile', opts.keychainProfile];
+ }
+}
+function isNotaryToolAvailable() {
+ return __awaiter(this, void 0, void 0, function* () {
+ const result = yield (0, spawn_1.spawn)('xcrun', ['--find', 'notarytool']);
+ return result.code === 0;
+ });
+}
+exports.isNotaryToolAvailable = isNotaryToolAvailable;
+function notarizeAndWaitForNotaryTool(opts) {
+ return __awaiter(this, void 0, void 0, function* () {
+ d('starting notarize process for app:', opts.appPath);
+ return yield (0, helpers_1.withTempDir)((dir) => __awaiter(this, void 0, void 0, function* () {
+ const zipPath = path.resolve(dir, `${path.parse(opts.appPath).name}.zip`);
+ d('zipping application to:', zipPath);
+ const zipResult = yield (0, spawn_1.spawn)('ditto', ['-c', '-k', '--sequesterRsrc', '--keepParent', path.basename(opts.appPath), zipPath], {
+ cwd: path.dirname(opts.appPath),
+ });
+ if (zipResult.code !== 0) {
+ throw new Error(`Failed to zip application, exited with code: ${zipResult.code}\n\n${zipResult.output}`);
+ }
+ d('zip succeeded, attempting to upload to Apple');
+ const notarizeArgs = [
+ 'notarytool',
+ 'submit',
+ zipPath,
+ ...authorizationArgs(opts),
+ '--wait',
+ '--output-format',
+ 'json',
+ ];
+ const result = yield (0, spawn_1.spawn)('xcrun', notarizeArgs);
+ if (result.code !== 0) {
+ try {
+ const parsed = JSON.parse(result.output.trim());
+ if (parsed && parsed.id) {
+ const logResult = yield (0, spawn_1.spawn)('xcrun', [
+ 'notarytool',
+ 'log',
+ parsed.id,
+ ...authorizationArgs(opts),
+ ]);
+ d('notarization log', logResult.output);
+ }
+ }
+ catch (e) {
+ d('failed to pull notarization logs', e);
+ }
+ throw new Error(`Failed to notarize via notarytool\n\n${result.output}`);
+ }
+ d('notarization success');
+ }));
+ });
+}
+exports.notarizeAndWaitForNotaryTool = notarizeAndWaitForNotaryTool;
+//# sourceMappingURL=notarytool.js.map \ No newline at end of file
diff --git a/desktop/node_modules/@electron/notarize/lib/notarytool.js.map b/desktop/node_modules/@electron/notarize/lib/notarytool.js.map
new file mode 100644
index 0000000..c1fb412
--- /dev/null
+++ b/desktop/node_modules/@electron/notarize/lib/notarytool.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"notarytool.js","sourceRoot":"","sources":["../src/notarytool.ts"],"names":[],"mappings":";;;;;;;;;;;AAAA,+BAA+B;AAC/B,6BAA6B;AAE7B,mCAAgC;AAChC,uCAAoD;AACpD,mDAIyB;AAGzB,MAAM,CAAC,GAAG,KAAK,CAAC,8BAA8B,CAAC,CAAC;AAEhD,SAAS,iBAAiB,CAAC,OAA8B;IACvD,MAAM,IAAI,GAAG,IAAA,mDAAmC,EAAC,OAAO,CAAC,CAAC;IAC1D,IAAI,IAAA,+CAA+B,EAAC,IAAI,CAAC,EAAE;QACzC,OAAO;YACL,YAAY;YACZ,IAAA,oBAAU,EAAC,IAAI,CAAC,OAAO,CAAC;YACxB,YAAY;YACZ,IAAA,oBAAU,EAAC,IAAI,CAAC,eAAe,CAAC;YAChC,WAAW;YACX,IAAA,oBAAU,EAAC,IAAI,CAAC,MAAM,CAAC;SACxB,CAAC;KACH;SAAM,IAAI,IAAA,6CAA6B,EAAC,IAAI,CAAC,EAAE;QAC9C,OAAO;YACL,OAAO;YACP,IAAA,oBAAU,EAAC,IAAI,CAAC,WAAW,CAAC;YAC5B,UAAU;YACV,IAAA,oBAAU,EAAC,IAAI,CAAC,aAAa,CAAC;YAC9B,UAAU;YACV,IAAA,oBAAU,EAAC,IAAI,CAAC,cAAc,CAAC;SAChC,CAAC;KACH;SAAM;QACL,0FAA0F;QAC1F,IAAI,IAAI,CAAC,QAAQ,EAAE;YACjB,OAAO,CAAC,YAAY,EAAE,IAAI,CAAC,QAAQ,EAAE,oBAAoB,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;SAClF;QACD,OAAO,CAAC,oBAAoB,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;KACrD;AACH,CAAC;AAED,SAAsB,qBAAqB;;QACzC,MAAM,MAAM,GAAG,MAAM,IAAA,aAAK,EAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC,CAAC;QAC9D,OAAO,MAAM,CAAC,IAAI,KAAK,CAAC,CAAC;IAC3B,CAAC;CAAA;AAHD,sDAGC;AAED,SAAsB,4BAA4B,CAAC,IAA4B;;QAC7E,CAAC,CAAC,oCAAoC,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QACtD,OAAO,MAAM,IAAA,qBAAW,EAAC,CAAM,GAAG,EAAC,EAAE;YACnC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC;YAC1E,CAAC,CAAC,yBAAyB,EAAE,OAAO,CAAC,CAAC;YACtC,MAAM,SAAS,GAAG,MAAM,IAAA,aAAK,EAC3B,OAAO,EACP,CAAC,IAAI,EAAE,IAAI,EAAE,iBAAiB,EAAE,cAAc,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,EACrF;gBACE,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC;aAChC,CACF,CAAC;YACF,IAAI,SAAS,CAAC,IAAI,KAAK,CAAC,EAAE;gBACxB,MAAM,IAAI,KAAK,CACb,gDAAgD,SAAS,CAAC,IAAI,OAAO,SAAS,CAAC,MAAM,EAAE,CACxF,CAAC;aACH;YACD,CAAC,CAAC,8CAA8C,CAAC,CAAC;YAElD,MAAM,YAAY,GAAG;gBACnB,YAAY;gBACZ,QAAQ;gBACR,OAAO;gBACP,GAAG,iBAAiB,CAAC,IAAI,CAAC;gBAC1B,QAAQ;gBACR,iBAAiB;gBACjB,MAAM;aACP,CAAC;YAEF,MAAM,MAAM,GAAG,MAAM,IAAA,aAAK,EAAC,OAAO,EAAE,YAAY,CAAC,CAAC;YAElD,IAAI,MAAM,CAAC,IAAI,KAAK,CAAC,EAAE;gBACrB,IAAI;oBACF,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;oBAChD,IAAI,MAAM,IAAI,MAAM,CAAC,EAAE,EAAE;wBACvB,MAAM,SAAS,GAAG,MAAM,IAAA,aAAK,EAAC,OAAO,EAAE;4BACrC,YAAY;4BACZ,KAAK;4BACL,MAAM,CAAC,EAAE;4BACT,GAAG,iBAAiB,CAAC,IAAI,CAAC;yBAC3B,CAAC,CAAC;wBACH,CAAC,CAAC,kBAAkB,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;qBACzC;iBACF;gBAAC,OAAO,CAAC,EAAE;oBACV,CAAC,CAAC,kCAAkC,EAAE,CAAC,CAAC,CAAC;iBAC1C;gBACD,MAAM,IAAI,KAAK,CAAC,wCAAwC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;aAC1E;YACD,CAAC,CAAC,sBAAsB,CAAC,CAAC;QAC5B,CAAC,CAAA,CAAC,CAAC;IACL,CAAC;CAAA;AAlDD,oEAkDC"} \ No newline at end of file
diff --git a/desktop/node_modules/@electron/notarize/lib/spawn.d.ts b/desktop/node_modules/@electron/notarize/lib/spawn.d.ts
new file mode 100644
index 0000000..e1dfc1e
--- /dev/null
+++ b/desktop/node_modules/@electron/notarize/lib/spawn.d.ts
@@ -0,0 +1,6 @@
+import { SpawnOptions } from 'child_process';
+export interface SpawnResult {
+ code: number | null;
+ output: string;
+}
+export declare const spawn: (cmd: string, args?: string[], opts?: SpawnOptions) => Promise<SpawnResult>;
diff --git a/desktop/node_modules/@electron/notarize/lib/spawn.js b/desktop/node_modules/@electron/notarize/lib/spawn.js
new file mode 100644
index 0000000..2e3947f
--- /dev/null
+++ b/desktop/node_modules/@electron/notarize/lib/spawn.js
@@ -0,0 +1,28 @@
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.spawn = void 0;
+const child_process_1 = require("child_process");
+const debug = require("debug");
+const helpers_1 = require("./helpers");
+const d = debug('electron-notarize:spawn');
+const spawn = (cmd, args = [], opts = {}) => {
+ d('spawning cmd:', cmd, 'args:', args.map(arg => ((0, helpers_1.isSecret)(arg) ? '*********' : arg)), 'opts:', opts);
+ const child = (0, child_process_1.spawn)(cmd, args, opts);
+ const out = [];
+ const dataHandler = (data) => out.push(data.toString());
+ child.stdout.on('data', dataHandler);
+ child.stderr.on('data', dataHandler);
+ return new Promise((resolve, reject) => {
+ child.on('error', err => {
+ reject(err);
+ });
+ child.on('exit', code => {
+ d(`cmd ${cmd} terminated with code: ${code}`);
+ resolve({
+ code,
+ output: out.join(''),
+ });
+ });
+ });
+};
+exports.spawn = spawn;
+//# sourceMappingURL=spawn.js.map \ No newline at end of file
diff --git a/desktop/node_modules/@electron/notarize/lib/spawn.js.map b/desktop/node_modules/@electron/notarize/lib/spawn.js.map
new file mode 100644
index 0000000..bcf35cf
--- /dev/null
+++ b/desktop/node_modules/@electron/notarize/lib/spawn.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"spawn.js","sourceRoot":"","sources":["../src/spawn.ts"],"names":[],"mappings":";;AAAA,iDAA+D;AAC/D,+BAA+B;AAC/B,uCAAqC;AAErC,MAAM,CAAC,GAAG,KAAK,CAAC,yBAAyB,CAAC,CAAC;AAOpC,MAAM,KAAK,GAAG,CACnB,GAAW,EACX,OAAiB,EAAE,EACnB,OAAqB,EAAE,EACD,EAAE;IACxB,CAAC,CACC,eAAe,EACf,GAAG,EACH,OAAO,EACP,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,IAAA,kBAAQ,EAAC,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EACpD,OAAO,EACP,IAAI,CACL,CAAC;IACF,MAAM,KAAK,GAAG,IAAA,qBAAO,EAAC,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IACvC,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,MAAM,WAAW,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;IAChE,KAAK,CAAC,MAAO,CAAC,EAAE,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IACtC,KAAK,CAAC,MAAO,CAAC,EAAE,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IACtC,OAAO,IAAI,OAAO,CAAc,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAClD,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,CAAC,EAAE;YACtB,MAAM,CAAC,GAAG,CAAC,CAAC;QACd,CAAC,CAAC,CAAC;QACH,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE;YACtB,CAAC,CAAC,OAAO,GAAG,0BAA0B,IAAI,EAAE,CAAC,CAAC;YAC9C,OAAO,CAAC;gBACN,IAAI;gBACJ,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;aACrB,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AA9BW,QAAA,KAAK,SA8BhB"} \ No newline at end of file
diff --git a/desktop/node_modules/@electron/notarize/lib/staple.d.ts b/desktop/node_modules/@electron/notarize/lib/staple.d.ts
new file mode 100644
index 0000000..e507c1e
--- /dev/null
+++ b/desktop/node_modules/@electron/notarize/lib/staple.d.ts
@@ -0,0 +1,2 @@
+import { NotarizeStapleOptions } from './types';
+export declare function stapleApp(opts: NotarizeStapleOptions): Promise<void>;
diff --git a/desktop/node_modules/@electron/notarize/lib/staple.js b/desktop/node_modules/@electron/notarize/lib/staple.js
new file mode 100644
index 0000000..4809133
--- /dev/null
+++ b/desktop/node_modules/@electron/notarize/lib/staple.js
@@ -0,0 +1,30 @@
+var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.stapleApp = void 0;
+const debug = require("debug");
+const path = require("path");
+const spawn_1 = require("./spawn");
+const d = debug('electron-notarize:staple');
+function stapleApp(opts) {
+ return __awaiter(this, void 0, void 0, function* () {
+ d('attempting to staple app:', opts.appPath);
+ const result = yield (0, spawn_1.spawn)('xcrun', ['stapler', 'staple', '-v', path.basename(opts.appPath)], {
+ cwd: path.dirname(opts.appPath),
+ });
+ if (result.code !== 0) {
+ throw new Error(`Failed to staple your application with code: ${result.code}\n\n${result.output}`);
+ }
+ d('staple succeeded');
+ return;
+ });
+}
+exports.stapleApp = stapleApp;
+//# sourceMappingURL=staple.js.map \ No newline at end of file
diff --git a/desktop/node_modules/@electron/notarize/lib/staple.js.map b/desktop/node_modules/@electron/notarize/lib/staple.js.map
new file mode 100644
index 0000000..a0a6ebc
--- /dev/null
+++ b/desktop/node_modules/@electron/notarize/lib/staple.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"staple.js","sourceRoot":"","sources":["../src/staple.ts"],"names":[],"mappings":";;;;;;;;;;;AAAA,+BAA+B;AAC/B,6BAA6B;AAE7B,mCAAgC;AAGhC,MAAM,CAAC,GAAG,KAAK,CAAC,0BAA0B,CAAC,CAAC;AAE5C,SAAsB,SAAS,CAAC,IAA2B;;QACzD,CAAC,CAAC,2BAA2B,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QAC7C,MAAM,MAAM,GAAG,MAAM,IAAA,aAAK,EAAC,OAAO,EAAE,CAAC,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE;YAC5F,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC;SAChC,CAAC,CAAC;QAEH,IAAI,MAAM,CAAC,IAAI,KAAK,CAAC,EAAE;YACrB,MAAM,IAAI,KAAK,CACb,gDAAgD,MAAM,CAAC,IAAI,OAAO,MAAM,CAAC,MAAM,EAAE,CAClF,CAAC;SACH;QAED,CAAC,CAAC,kBAAkB,CAAC,CAAC;QACtB,OAAO;IACT,CAAC;CAAA;AAdD,8BAcC"} \ No newline at end of file
diff --git a/desktop/node_modules/@electron/notarize/lib/types.d.ts b/desktop/node_modules/@electron/notarize/lib/types.d.ts
new file mode 100644
index 0000000..b04ec91
--- /dev/null
+++ b/desktop/node_modules/@electron/notarize/lib/types.d.ts
@@ -0,0 +1,47 @@
+export interface LegacyNotarizePasswordCredentials {
+ appleId: string;
+ appleIdPassword: string;
+}
+export interface NotaryToolPasswordCredentials {
+ appleId: string;
+ appleIdPassword: string;
+ teamId: string;
+}
+export interface LegacyNotarizeApiKeyCredentials {
+ appleApiKey: string;
+ appleApiIssuer: string;
+}
+export interface NotaryToolApiKeyCredentials {
+ appleApiKey: string;
+ appleApiKeyId: string;
+ appleApiIssuer: string;
+}
+export interface NotaryToolKeychainCredentials {
+ keychainProfile: string;
+ keychain?: string;
+}
+export type LegacyNotarizeCredentials = LegacyNotarizePasswordCredentials | LegacyNotarizeApiKeyCredentials;
+export type NotaryToolCredentials = NotaryToolPasswordCredentials | NotaryToolApiKeyCredentials | NotaryToolKeychainCredentials;
+export type NotarizeCredentials = LegacyNotarizeCredentials | NotaryToolCredentials;
+export interface LegacyNotarizeAppOptions {
+ appPath: string;
+ appBundleId: string;
+}
+export interface NotaryToolNotarizeAppOptions {
+ appPath: string;
+}
+export interface TransporterOptions {
+ ascProvider?: string;
+}
+export interface NotarizeResult {
+ uuid: string;
+}
+export type LegacyNotarizeStartOptions = LegacyNotarizeAppOptions & LegacyNotarizeCredentials & TransporterOptions;
+export type NotaryToolStartOptions = NotaryToolNotarizeAppOptions & NotaryToolCredentials;
+export type LegacyNotarizeWaitOptions = NotarizeResult & LegacyNotarizeCredentials;
+export type NotarizeStapleOptions = Pick<LegacyNotarizeAppOptions, 'appPath'>;
+export type NotarizeOptions = ({
+ tool?: 'legacy';
+} & LegacyNotarizeStartOptions) | ({
+ tool: 'notarytool';
+} & NotaryToolStartOptions);
diff --git a/desktop/node_modules/@electron/notarize/lib/types.js b/desktop/node_modules/@electron/notarize/lib/types.js
new file mode 100644
index 0000000..5fb9015
--- /dev/null
+++ b/desktop/node_modules/@electron/notarize/lib/types.js
@@ -0,0 +1,2 @@
+Object.defineProperty(exports, "__esModule", { value: true });
+//# sourceMappingURL=types.js.map \ No newline at end of file
diff --git a/desktop/node_modules/@electron/notarize/lib/types.js.map b/desktop/node_modules/@electron/notarize/lib/types.js.map
new file mode 100644
index 0000000..c768b79
--- /dev/null
+++ b/desktop/node_modules/@electron/notarize/lib/types.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""} \ No newline at end of file
diff --git a/desktop/node_modules/@electron/notarize/lib/validate-args.d.ts b/desktop/node_modules/@electron/notarize/lib/validate-args.d.ts
new file mode 100644
index 0000000..20b815b
--- /dev/null
+++ b/desktop/node_modules/@electron/notarize/lib/validate-args.d.ts
@@ -0,0 +1,8 @@
+import { LegacyNotarizeApiKeyCredentials, LegacyNotarizeCredentials, LegacyNotarizePasswordCredentials, NotaryToolApiKeyCredentials, NotaryToolCredentials, NotaryToolKeychainCredentials, NotaryToolPasswordCredentials } from './types';
+export declare function isLegacyPasswordCredentials(opts: LegacyNotarizeCredentials): opts is LegacyNotarizePasswordCredentials;
+export declare function isLegacyApiKeyCredentials(opts: LegacyNotarizeCredentials): opts is LegacyNotarizeApiKeyCredentials;
+export declare function validateLegacyAuthorizationArgs(opts: LegacyNotarizeCredentials): LegacyNotarizeCredentials;
+export declare function isNotaryToolPasswordCredentials(opts: NotaryToolCredentials): opts is NotaryToolPasswordCredentials;
+export declare function isNotaryToolApiKeyCredentials(opts: NotaryToolCredentials): opts is NotaryToolApiKeyCredentials;
+export declare function isNotaryToolKeychainCredentials(opts: NotaryToolCredentials): opts is NotaryToolKeychainCredentials;
+export declare function validateNotaryToolAuthorizationArgs(opts: NotaryToolCredentials): NotaryToolCredentials;
diff --git a/desktop/node_modules/@electron/notarize/lib/validate-args.js b/desktop/node_modules/@electron/notarize/lib/validate-args.js
new file mode 100644
index 0000000..2a4f484
--- /dev/null
+++ b/desktop/node_modules/@electron/notarize/lib/validate-args.js
@@ -0,0 +1,102 @@
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.validateNotaryToolAuthorizationArgs = exports.isNotaryToolKeychainCredentials = exports.isNotaryToolApiKeyCredentials = exports.isNotaryToolPasswordCredentials = exports.validateLegacyAuthorizationArgs = exports.isLegacyApiKeyCredentials = exports.isLegacyPasswordCredentials = void 0;
+function isLegacyPasswordCredentials(opts) {
+ const creds = opts;
+ return creds.appleId !== undefined || creds.appleIdPassword !== undefined;
+}
+exports.isLegacyPasswordCredentials = isLegacyPasswordCredentials;
+function isLegacyApiKeyCredentials(opts) {
+ const creds = opts;
+ return creds.appleApiKey !== undefined || creds.appleApiIssuer !== undefined;
+}
+exports.isLegacyApiKeyCredentials = isLegacyApiKeyCredentials;
+function validateLegacyAuthorizationArgs(opts) {
+ const isPassword = isLegacyPasswordCredentials(opts);
+ const isApiKey = isLegacyApiKeyCredentials(opts);
+ if (isPassword && isApiKey) {
+ throw new Error('Cannot use both password credentials and API key credentials at once');
+ }
+ if (isPassword) {
+ const passwordCreds = opts;
+ if (!passwordCreds.appleId) {
+ throw new Error('The appleId property is required when using notarization with appleIdPassword');
+ }
+ else if (!passwordCreds.appleIdPassword) {
+ throw new Error('The appleIdPassword property is required when using notarization with appleId');
+ }
+ return passwordCreds;
+ }
+ if (isApiKey) {
+ const apiKeyCreds = opts;
+ if (!apiKeyCreds.appleApiKey) {
+ throw new Error('The appleApiKey property is required when using notarization with appleApiIssuer');
+ }
+ else if (!apiKeyCreds.appleApiIssuer) {
+ throw new Error('The appleApiIssuer property is required when using notarization with appleApiKey');
+ }
+ return apiKeyCreds;
+ }
+ throw new Error('No authentication properties provided (e.g. appleId, appleApiKey)');
+}
+exports.validateLegacyAuthorizationArgs = validateLegacyAuthorizationArgs;
+function isNotaryToolPasswordCredentials(opts) {
+ const creds = opts;
+ return (creds.appleId !== undefined || creds.appleIdPassword !== undefined || creds.teamId !== undefined);
+}
+exports.isNotaryToolPasswordCredentials = isNotaryToolPasswordCredentials;
+function isNotaryToolApiKeyCredentials(opts) {
+ const creds = opts;
+ return (creds.appleApiIssuer !== undefined ||
+ creds.appleApiKey !== undefined ||
+ creds.appleApiKeyId !== undefined);
+}
+exports.isNotaryToolApiKeyCredentials = isNotaryToolApiKeyCredentials;
+function isNotaryToolKeychainCredentials(opts) {
+ const creds = opts;
+ return creds.keychain !== undefined || creds.keychainProfile !== undefined;
+}
+exports.isNotaryToolKeychainCredentials = isNotaryToolKeychainCredentials;
+function validateNotaryToolAuthorizationArgs(opts) {
+ const isPassword = isNotaryToolPasswordCredentials(opts);
+ const isApiKey = isNotaryToolApiKeyCredentials(opts);
+ const isKeychain = isNotaryToolKeychainCredentials(opts);
+ if ((isPassword ? 1 : 0) + (isApiKey ? 1 : 0) + (isKeychain ? 1 : 0) > 1) {
+ throw new Error('Cannot use password credentials, API key credentials and keychain credentials at once');
+ }
+ if (isPassword) {
+ const passwordCreds = opts;
+ if (!passwordCreds.appleId) {
+ throw new Error('The appleId property is required when using notarization with password credentials');
+ }
+ else if (!passwordCreds.appleIdPassword) {
+ throw new Error('The appleIdPassword property is required when using notarization with password credentials');
+ }
+ else if (!passwordCreds.teamId) {
+ throw new Error('The teamId property is required when using notarization with password credentials');
+ }
+ return passwordCreds;
+ }
+ if (isApiKey) {
+ const apiKeyCreds = opts;
+ if (!apiKeyCreds.appleApiKey) {
+ throw new Error('The appleApiKey property is required when using notarization with ASC credentials');
+ }
+ else if (!apiKeyCreds.appleApiIssuer) {
+ throw new Error('The appleApiIssuer property is required when using notarization with ASC credentials');
+ }
+ else if (!apiKeyCreds.appleApiKeyId) {
+ throw new Error('The appleApiKeyId property is required when using notarization with ASC credentials');
+ }
+ return apiKeyCreds;
+ }
+ if (isKeychain) {
+ const keychainCreds = opts;
+ if (!keychainCreds.keychainProfile) {
+ throw new Error('The keychainProfile property is required when using notarization with keychain credentials');
+ }
+ return keychainCreds;
+ }
+ throw new Error('No authentication properties provided (e.g. appleId, appleApiKey, keychain)');
+}
+exports.validateNotaryToolAuthorizationArgs = validateNotaryToolAuthorizationArgs;
+//# sourceMappingURL=validate-args.js.map \ No newline at end of file
diff --git a/desktop/node_modules/@electron/notarize/lib/validate-args.js.map b/desktop/node_modules/@electron/notarize/lib/validate-args.js.map
new file mode 100644
index 0000000..fafdd3b
--- /dev/null
+++ b/desktop/node_modules/@electron/notarize/lib/validate-args.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"validate-args.js","sourceRoot":"","sources":["../src/validate-args.ts"],"names":[],"mappings":"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"} \ No newline at end of file
diff --git a/desktop/node_modules/@electron/notarize/node_modules/fs-extra/CHANGELOG.md b/desktop/node_modules/@electron/notarize/node_modules/fs-extra/CHANGELOG.md
new file mode 100644
index 0000000..225fdca
--- /dev/null
+++ b/desktop/node_modules/@electron/notarize/node_modules/fs-extra/CHANGELOG.md
@@ -0,0 +1,902 @@
+9.1.0 / 2021-01-19
+------------------
+
+- Add promise support for `fs.rm()` ([#841](https://github.com/jprichardson/node-fs-extra/issues/841), [#860](https://github.com/jprichardson/node-fs-extra/pull/860))
+- Upgrade universalify for performance improvments ([#825](https://github.com/jprichardson/node-fs-extra/pull/825))
+
+9.0.1 / 2020-06-03
+------------------
+
+- Fix issue with `ensureFile()` when used with Jest on Windows ([#804](https://github.com/jprichardson/node-fs-extra/issues/804), [#805](https://github.com/jprichardson/node-fs-extra/pull/805))
+- Remove unneeded `process.umask()` call ([#791](https://github.com/jprichardson/node-fs-extra/pull/791))
+- Docs improvements ([#753](https://github.com/jprichardson/node-fs-extra/pull/753), [#795](https://github.com/jprichardson/node-fs-extra/pull/795), [#797](https://github.com/jprichardson/node-fs-extra/pull/797))
+
+9.0.0 / 2020-03-19
+------------------
+
+### Breaking changes
+
+- Requires Node.js version 10 or greater ([#725](https://github.com/jprichardson/node-fs-extra/issues/725), [#751](https://github.com/jprichardson/node-fs-extra/pull/751))
+- Switched `ensureDir*` to use a fork of https://github.com/sindresorhus/make-dir to make use of native recursive `fs.mkdir` where possible ([#619](https://github.com/jprichardson/node-fs-extra/issues/619), [#756](https://github.com/jprichardson/node-fs-extra/pull/756))
+- Properly preserve `atime` for `copy*` with `preserveTimestamps` option ([#633](https://github.com/jprichardson/node-fs-extra/pull/633))
+
+**The following changes, allthough technically breaking, will not affect the vast majority of users:**
+
+- `outputJson` now outputs objects as they were when the function was called, even if they are mutated later ([#702](https://github.com/jprichardson/node-fs-extra/issues/702), [#768](https://github.com/jprichardson/node-fs-extra/pull/768))
+- Cannot pass `null` as an options parameter to `*Json*` methods ([#745](https://github.com/jprichardson/node-fs-extra/issues/745), [#768](https://github.com/jprichardson/node-fs-extra/pull/768))
+
+### Improvements
+
+- Add promise shims for `fs.writev` & `fs.opendir` ([#747](https://github.com/jprichardson/node-fs-extra/pull/747))
+- Better errors for `ensureFile` ([#696](https://github.com/jprichardson/node-fs-extra/issues/696), [#744](https://github.com/jprichardson/node-fs-extra/pull/744))
+- Better file comparison for older Node versions ([#694](https://github.com/jprichardson/node-fs-extra/pull/694))
+
+### Miscellaneous changes
+- Peformance optimizations ([#762](https://github.com/jprichardson/node-fs-extra/issues/762), [#764](https://github.com/jprichardson/node-fs-extra/pull/764))
+- Add missing documentation for aliases ([#758](https://github.com/jprichardson/node-fs-extra/issues/758), [#766](https://github.com/jprichardson/node-fs-extra/pull/766))
+- Update `universalify` dependency ([#767](https://github.com/jprichardson/node-fs-extra/pull/767))
+
+8.1.0 / 2019-06-28
+------------------
+
+- Add support for promisified `fs.realpath.native` in Node v9.2+ ([#650](https://github.com/jprichardson/node-fs-extra/issues/650), [#682](https://github.com/jprichardson/node-fs-extra/pull/682))
+- Update `graceful-fs` dependency ([#700](https://github.com/jprichardson/node-fs-extra/pull/700))
+- Use `graceful-fs` everywhere ([#700](https://github.com/jprichardson/node-fs-extra/pull/700))
+
+8.0.1 / 2019-05-13
+------------------
+
+- Fix bug `Maximum call stack size exceeded` error in `util/stat` ([#679](https://github.com/jprichardson/node-fs-extra/pull/679))
+
+8.0.0 / 2019-05-11
+------------------
+
+**NOTE:** Node.js v6 support is deprecated, and will be dropped in the next major release.
+
+- Use `renameSync()` under the hood in `moveSync()`
+- Fix bug with bind-mounted directories in `copy*()` ([#613](https://github.com/jprichardson/node-fs-extra/issues/613), [#618](https://github.com/jprichardson/node-fs-extra/pull/618))
+- Fix bug in `move()` with case-insensitive file systems
+- Use `fs.stat()`'s `bigint` option in `copy*()` & `move*()` where possible ([#657](https://github.com/jprichardson/node-fs-extra/issues/657))
+
+7.0.1 / 2018-11-07
+------------------
+
+- Fix `removeSync()` on Windows, in some cases, it would error out with `ENOTEMPTY` ([#646](https://github.com/jprichardson/node-fs-extra/pull/646))
+- Document `mode` option for `ensureDir*()` ([#587](https://github.com/jprichardson/node-fs-extra/pull/587))
+- Don't include documentation files in npm package tarball ([#642](https://github.com/jprichardson/node-fs-extra/issues/642), [#643](https://github.com/jprichardson/node-fs-extra/pull/643))
+
+7.0.0 / 2018-07-16
+------------------
+
+- **BREAKING:** Refine `copy*()` handling of symlinks to properly detect symlinks that point to the same file. ([#582](https://github.com/jprichardson/node-fs-extra/pull/582))
+- Fix bug with copying write-protected directories ([#600](https://github.com/jprichardson/node-fs-extra/pull/600))
+- Universalify `fs.lchmod()` ([#596](https://github.com/jprichardson/node-fs-extra/pull/596))
+- Add `engines` field to `package.json` ([#580](https://github.com/jprichardson/node-fs-extra/pull/580))
+
+6.0.1 / 2018-05-09
+------------------
+
+- Fix `fs.promises` `ExperimentalWarning` on Node v10.1.0 ([#578](https://github.com/jprichardson/node-fs-extra/pull/578))
+
+6.0.0 / 2018-05-01
+------------------
+
+- Drop support for Node.js versions 4, 5, & 7 ([#564](https://github.com/jprichardson/node-fs-extra/pull/564))
+- Rewrite `move` to use `fs.rename` where possible ([#549](https://github.com/jprichardson/node-fs-extra/pull/549))
+- Don't convert relative paths to absolute paths for `filter` ([#554](https://github.com/jprichardson/node-fs-extra/pull/554))
+- `copy*`'s behavior when `preserveTimestamps` is `false` has been OS-dependent since 5.0.0, but that's now explicitly noted in the docs ([#563](https://github.com/jprichardson/node-fs-extra/pull/563))
+- Fix subdirectory detection for `copy*` & `move*` ([#541](https://github.com/jprichardson/node-fs-extra/pull/541))
+- Handle case-insensitive paths correctly in `copy*` ([#568](https://github.com/jprichardson/node-fs-extra/pull/568))
+
+5.0.0 / 2017-12-11
+------------------
+
+Significant refactor of `copy()` & `copySync()`, including breaking changes. No changes to other functions in this release.
+
+Huge thanks to **[@manidlou](https://github.com/manidlou)** for doing most of the work on this release.
+
+- The `filter` option can no longer be a RegExp (must be a function). This was deprecated since fs-extra v1.0.0. [#512](https://github.com/jprichardson/node-fs-extra/pull/512)
+- `copy()`'s `filter` option can now be a function that returns a Promise. [#518](https://github.com/jprichardson/node-fs-extra/pull/518)
+- `copy()` & `copySync()` now use `fs.copyFile()`/`fs.copyFileSync()` in environments that support it (currently Node 8.5.0+). Older Node versions still get the old implementation. [#505](https://github.com/jprichardson/node-fs-extra/pull/505)
+- Don't allow copying a directory into itself. [#83](https://github.com/jprichardson/node-fs-extra/issues/83)
+- Handle copying between identical files. [#198](https://github.com/jprichardson/node-fs-extra/issues/198)
+- Error out when copying an empty folder to a path that already exists. [#464](https://github.com/jprichardson/node-fs-extra/issues/464)
+- Don't create `dest`'s parent if the `filter` function aborts the `copy()` operation. [#517](https://github.com/jprichardson/node-fs-extra/pull/517)
+- Fix `writeStream` not being closed if there was an error in `copy()`. [#516](https://github.com/jprichardson/node-fs-extra/pull/516)
+
+4.0.3 / 2017-12-05
+------------------
+
+- Fix wrong `chmod` values in `fs.remove()` [#501](https://github.com/jprichardson/node-fs-extra/pull/501)
+- Fix `TypeError` on systems that don't have some `fs` operations like `lchown` [#520](https://github.com/jprichardson/node-fs-extra/pull/520)
+
+4.0.2 / 2017-09-12
+------------------
+
+- Added `EOL` option to `writeJson*` & `outputJson*` (via upgrade to jsonfile v4)
+- Added promise support to [`fs.copyFile()`](https://nodejs.org/api/fs.html#fs_fs_copyfile_src_dest_flags_callback) in Node 8.5+
+- Added `.js` extension to `main` field in `package.json` for better tooling compatibility. [#485](https://github.com/jprichardson/node-fs-extra/pull/485)
+
+4.0.1 / 2017-07-31
+------------------
+
+### Fixed
+
+- Previously, `ensureFile()` & `ensureFileSync()` would do nothing if the path was a directory. Now, they error out for consistency with `ensureDir()`. [#465](https://github.com/jprichardson/node-fs-extra/issues/465), [#466](https://github.com/jprichardson/node-fs-extra/pull/466), [#470](https://github.com/jprichardson/node-fs-extra/issues/470)
+
+4.0.0 / 2017-07-14
+------------------
+
+### Changed
+
+- **BREAKING:** The promisified versions of `fs.read()` & `fs.write()` now return objects. See [the docs](docs/fs-read-write.md) for details. [#436](https://github.com/jprichardson/node-fs-extra/issues/436), [#449](https://github.com/jprichardson/node-fs-extra/pull/449)
+- `fs.move()` now errors out when destination is a subdirectory of source. [#458](https://github.com/jprichardson/node-fs-extra/pull/458)
+- Applied upstream fixes from `rimraf` to `fs.remove()` & `fs.removeSync()`. [#459](https://github.com/jprichardson/node-fs-extra/pull/459)
+
+### Fixed
+
+- Got `fs.outputJSONSync()` working again; it was broken due to refactoring. [#428](https://github.com/jprichardson/node-fs-extra/pull/428)
+
+Also clarified the docs in a few places.
+
+3.0.1 / 2017-05-04
+------------------
+
+- Fix bug in `move()` & `moveSync()` when source and destination are the same, and source does not exist. [#415](https://github.com/jprichardson/node-fs-extra/pull/415)
+
+3.0.0 / 2017-04-27
+------------------
+
+### Added
+
+- **BREAKING:** Added Promise support. All asynchronous native fs methods and fs-extra methods now return a promise if the callback is not passed. [#403](https://github.com/jprichardson/node-fs-extra/pull/403)
+- `pathExists()`, a replacement for the deprecated `fs.exists`. `pathExists` has a normal error-first callback signature. Also added `pathExistsSync`, an alias to `fs.existsSync`, for completeness. [#406](https://github.com/jprichardson/node-fs-extra/pull/406)
+
+### Removed
+
+- **BREAKING:** Removed support for setting the default spaces for `writeJson()`, `writeJsonSync()`, `outputJson()`, & `outputJsonSync()`. This was undocumented. [#402](https://github.com/jprichardson/node-fs-extra/pull/402)
+
+### Changed
+
+- Upgraded jsonfile dependency to v3.0.0:
+ - **BREAKING:** Changed behavior of `throws` option for `readJsonSync()`; now does not throw filesystem errors when `throws` is `false`.
+- **BREAKING:** `writeJson()`, `writeJsonSync()`, `outputJson()`, & `outputJsonSync()` now output minified JSON by default for consistency with `JSON.stringify()`; set the `spaces` option to `2` to override this new behavior. [#402](https://github.com/jprichardson/node-fs-extra/pull/402)
+- Use `Buffer.allocUnsafe()` instead of `new Buffer()` in environments that support it. [#394](https://github.com/jprichardson/node-fs-extra/pull/394)
+
+### Fixed
+
+- `removeSync()` silently failed on Windows in some cases. Now throws an `EBUSY` error. [#408](https://github.com/jprichardson/node-fs-extra/pull/408)
+
+2.1.2 / 2017-03-16
+------------------
+
+### Fixed
+
+- Weird windows bug that resulted in `ensureDir()`'s callback being called twice in some cases. This bug may have also affected `remove()`. See [#392](https://github.com/jprichardson/node-fs-extra/issues/392), [#393](https://github.com/jprichardson/node-fs-extra/pull/393)
+
+2.1.1 / 2017-03-15
+------------------
+
+### Fixed
+
+- Reverted [`5597bd`](https://github.com/jprichardson/node-fs-extra/commit/5597bd5b67f7d060f5f5bf26e9635be48330f5d7), this broke compatibility with Node.js versions v4+ but less than `v4.5.0`.
+- Remove `Buffer.alloc()` usage in `moveSync()`.
+
+2.1.0 / 2017-03-15
+------------------
+
+Thanks to [Mani Maghsoudlou (@manidlou)](https://github.com/manidlou) & [Jan Peer Stöcklmair (@JPeer264)](https://github.com/JPeer264) for their extraordinary help with this release!
+
+### Added
+- `moveSync()` See [#309], [#381](https://github.com/jprichardson/node-fs-extra/pull/381). ([@manidlou](https://github.com/manidlou))
+- `copy()` and `copySync()`'s `filter` option now gets the destination path passed as the second parameter. [#366](https://github.com/jprichardson/node-fs-extra/pull/366) ([@manidlou](https://github.com/manidlou))
+
+### Changed
+- Use `Buffer.alloc()` instead of deprecated `new Buffer()` in `copySync()`. [#380](https://github.com/jprichardson/node-fs-extra/pull/380) ([@manidlou](https://github.com/manidlou))
+- Refactored entire codebase to use ES6 features supported by Node.js v4+ [#355](https://github.com/jprichardson/node-fs-extra/issues/355). [(@JPeer264)](https://github.com/JPeer264)
+- Refactored docs. ([@manidlou](https://github.com/manidlou))
+
+### Fixed
+
+- `move()` shouldn't error out when source and dest are the same. [#377](https://github.com/jprichardson/node-fs-extra/issues/377), [#378](https://github.com/jprichardson/node-fs-extra/pull/378) ([@jdalton](https://github.com/jdalton))
+
+2.0.0 / 2017-01-16
+------------------
+
+### Removed
+- **BREAKING:** Removed support for Node `v0.12`. The Node foundation stopped officially supporting it
+on Jan 1st, 2017.
+- **BREAKING:** Remove `walk()` and `walkSync()`. `walkSync()` was only part of `fs-extra` for a little
+over two months. Use [klaw](https://github.com/jprichardson/node-klaw) instead of `walk()`, in fact, `walk()` was just
+an alias to klaw. For `walkSync()` use [klaw-sync](https://github.com/mawni/node-klaw-sync). See: [#338], [#339]
+
+### Changed
+- **BREAKING:** Renamed `clobber` to `overwrite`. This affects `copy()`, `copySync()`, and `move()`. [#330], [#333]
+- Moved docs, to `docs/`. [#340]
+
+### Fixed
+- Apply filters to directories in `copySync()` like in `copy()`. [#324]
+- A specific condition when disk is under heavy use, `copy()` can fail. [#326]
+
+
+1.0.0 / 2016-11-01
+------------------
+
+After five years of development, we finally have reach the 1.0.0 milestone! Big thanks goes
+to [Ryan Zim](https://github.com/RyanZim) for leading the charge on this release!
+
+### Added
+- `walkSync()`
+
+### Changed
+- **BREAKING**: dropped Node v0.10 support.
+- disabled `rimaf` globbing, wasn't used. [#280]
+- deprecate `copy()/copySync()` option `filter` if it's a `RegExp`. `filter` should now be a function.
+- inline `rimraf`. This is temporary and was done because `rimraf` depended upon the beefy `glob` which `fs-extra` does not use. [#300]
+
+### Fixed
+- bug fix proper closing of file handle on `utimesMillis()` [#271]
+- proper escaping of files with dollar signs [#291]
+- `copySync()` failed if user didn't own file. [#199], [#301]
+
+
+0.30.0 / 2016-04-28
+-------------------
+- Brought back Node v0.10 support. I didn't realize there was still demand. Official support will end **2016-10-01**.
+
+0.29.0 / 2016-04-27
+-------------------
+- **BREAKING**: removed support for Node v0.10. If you still want to use Node v0.10, everything should work except for `ensureLink()/ensureSymlink()`. Node v0.12 is still supported but will be dropped in the near future as well.
+
+0.28.0 / 2016-04-17
+-------------------
+- **BREAKING**: removed `createOutputStream()`. Use https://www.npmjs.com/package/create-output-stream. See: [#192][#192]
+- `mkdirs()/mkdirsSync()` check for invalid win32 path chars. See: [#209][#209], [#237][#237]
+- `mkdirs()/mkdirsSync()` if drive not mounted, error. See: [#93][#93]
+
+0.27.0 / 2016-04-15
+-------------------
+- add `dereference` option to `copySync()`. [#235][#235]
+
+0.26.7 / 2016-03-16
+-------------------
+- fixed `copy()` if source and dest are the same. [#230][#230]
+
+0.26.6 / 2016-03-15
+-------------------
+- fixed if `emptyDir()` does not have a callback: [#229][#229]
+
+0.26.5 / 2016-01-27
+-------------------
+- `copy()` with two arguments (w/o callback) was broken. See: [#215][#215]
+
+0.26.4 / 2016-01-05
+-------------------
+- `copySync()` made `preserveTimestamps` default consistent with `copy()` which is `false`. See: [#208][#208]
+
+0.26.3 / 2015-12-17
+-------------------
+- fixed `copy()` hangup in copying blockDevice / characterDevice / `/dev/null`. See: [#193][#193]
+
+0.26.2 / 2015-11-02
+-------------------
+- fixed `outputJson{Sync}()` spacing adherence to `fs.spaces`
+
+0.26.1 / 2015-11-02
+-------------------
+- fixed `copySync()` when `clogger=true` and the destination is read only. See: [#190][#190]
+
+0.26.0 / 2015-10-25
+-------------------
+- extracted the `walk()` function into its own module [`klaw`](https://github.com/jprichardson/node-klaw).
+
+0.25.0 / 2015-10-24
+-------------------
+- now has a file walker `walk()`
+
+0.24.0 / 2015-08-28
+-------------------
+- removed alias `delete()` and `deleteSync()`. See: [#171][#171]
+
+0.23.1 / 2015-08-07
+-------------------
+- Better handling of errors for `move()` when moving across devices. [#170][#170]
+- `ensureSymlink()` and `ensureLink()` should not throw errors if link exists. [#169][#169]
+
+0.23.0 / 2015-08-06
+-------------------
+- added `ensureLink{Sync}()` and `ensureSymlink{Sync}()`. See: [#165][#165]
+
+0.22.1 / 2015-07-09
+-------------------
+- Prevent calling `hasMillisResSync()` on module load. See: [#149][#149].
+Fixes regression that was introduced in `0.21.0`.
+
+0.22.0 / 2015-07-09
+-------------------
+- preserve permissions / ownership in `copy()`. See: [#54][#54]
+
+0.21.0 / 2015-07-04
+-------------------
+- add option to preserve timestamps in `copy()` and `copySync()`. See: [#141][#141]
+- updated `graceful-fs@3.x` to `4.x`. This brings in features from `amazing-graceful-fs` (much cleaner code / less hacks)
+
+0.20.1 / 2015-06-23
+-------------------
+- fixed regression caused by latest jsonfile update: See: https://github.com/jprichardson/node-jsonfile/issues/26
+
+0.20.0 / 2015-06-19
+-------------------
+- removed `jsonfile` aliases with `File` in the name, they weren't documented and probably weren't in use e.g.
+this package had both `fs.readJsonFile` and `fs.readJson` that were aliases to each other, now use `fs.readJson`.
+- preliminary walker created. Intentionally not documented. If you use it, it will almost certainly change and break your code.
+- started moving tests inline
+- upgraded to `jsonfile@2.1.0`, can now pass JSON revivers/replacers to `readJson()`, `writeJson()`, `outputJson()`
+
+0.19.0 / 2015-06-08
+-------------------
+- `fs.copy()` had support for Node v0.8, dropped support
+
+0.18.4 / 2015-05-22
+-------------------
+- fixed license field according to this: [#136][#136] and https://github.com/npm/npm/releases/tag/v2.10.0
+
+0.18.3 / 2015-05-08
+-------------------
+- bugfix: handle `EEXIST` when clobbering on some Linux systems. [#134][#134]
+
+0.18.2 / 2015-04-17
+-------------------
+- bugfix: allow `F_OK` ([#120][#120])
+
+0.18.1 / 2015-04-15
+-------------------
+- improved windows support for `move()` a bit. https://github.com/jprichardson/node-fs-extra/commit/92838980f25dc2ee4ec46b43ee14d3c4a1d30c1b
+- fixed a lot of tests for Windows (appveyor)
+
+0.18.0 / 2015-03-31
+-------------------
+- added `emptyDir()` and `emptyDirSync()`
+
+0.17.0 / 2015-03-28
+-------------------
+- `copySync` added `clobber` option (before always would clobber, now if `clobber` is `false` it throws an error if the destination exists).
+**Only works with files at the moment.**
+- `createOutputStream()` added. See: [#118][#118]
+
+0.16.5 / 2015-03-08
+-------------------
+- fixed `fs.move` when `clobber` is `true` and destination is a directory, it should clobber. [#114][#114]
+
+0.16.4 / 2015-03-01
+-------------------
+- `fs.mkdirs` fix infinite loop on Windows. See: See https://github.com/substack/node-mkdirp/pull/74 and https://github.com/substack/node-mkdirp/issues/66
+
+0.16.3 / 2015-01-28
+-------------------
+- reverted https://github.com/jprichardson/node-fs-extra/commit/1ee77c8a805eba5b99382a2591ff99667847c9c9
+
+
+0.16.2 / 2015-01-28
+-------------------
+- fixed `fs.copy` for Node v0.8 (support is temporary and will be removed in the near future)
+
+0.16.1 / 2015-01-28
+-------------------
+- if `setImmediate` is not available, fall back to `process.nextTick`
+
+0.16.0 / 2015-01-28
+-------------------
+- bugfix `fs.move()` into itself. Closes [#104]
+- bugfix `fs.move()` moving directory across device. Closes [#108]
+- added coveralls support
+- bugfix: nasty multiple callback `fs.copy()` bug. Closes [#98]
+- misc fs.copy code cleanups
+
+0.15.0 / 2015-01-21
+-------------------
+- dropped `ncp`, imported code in
+- because of previous, now supports `io.js`
+- `graceful-fs` is now a dependency
+
+0.14.0 / 2015-01-05
+-------------------
+- changed `copy`/`copySync` from `fs.copy(src, dest, [filters], callback)` to `fs.copy(src, dest, [options], callback)` [#100][#100]
+- removed mockfs tests for mkdirp (this may be temporary, but was getting in the way of other tests)
+
+0.13.0 / 2014-12-10
+-------------------
+- removed `touch` and `touchSync` methods (they didn't handle permissions like UNIX touch)
+- updated `"ncp": "^0.6.0"` to `"ncp": "^1.0.1"`
+- imported `mkdirp` => `minimist` and `mkdirp` are no longer dependences, should now appease people who wanted `mkdirp` to be `--use_strict` safe. See [#59]([#59][#59])
+
+0.12.0 / 2014-09-22
+-------------------
+- copy symlinks in `copySync()` [#85][#85]
+
+0.11.1 / 2014-09-02
+-------------------
+- bugfix `copySync()` preserve file permissions [#80][#80]
+
+0.11.0 / 2014-08-11
+-------------------
+- upgraded `"ncp": "^0.5.1"` to `"ncp": "^0.6.0"`
+- upgrade `jsonfile": "^1.2.0"` to `jsonfile": "^2.0.0"` => on write, json files now have `\n` at end. Also adds `options.throws` to `readJsonSync()`
+see https://github.com/jprichardson/node-jsonfile#readfilesyncfilename-options for more details.
+
+0.10.0 / 2014-06-29
+------------------
+* bugfix: upgaded `"jsonfile": "~1.1.0"` to `"jsonfile": "^1.2.0"`, bumped minor because of `jsonfile` dep change
+from `~` to `^`. [#67]
+
+0.9.1 / 2014-05-22
+------------------
+* removed Node.js `0.8.x` support, `0.9.0` was published moments ago and should have been done there
+
+0.9.0 / 2014-05-22
+------------------
+* upgraded `ncp` from `~0.4.2` to `^0.5.1`, [#58]
+* upgraded `rimraf` from `~2.2.6` to `^2.2.8`
+* upgraded `mkdirp` from `0.3.x` to `^0.5.0`
+* added methods `ensureFile()`, `ensureFileSync()`
+* added methods `ensureDir()`, `ensureDirSync()` [#31]
+* added `move()` method. From: https://github.com/andrewrk/node-mv
+
+
+0.8.1 / 2013-10-24
+------------------
+* copy failed to return an error to the callback if a file doesn't exist (ulikoehler [#38], [#39])
+
+0.8.0 / 2013-10-14
+------------------
+* `filter` implemented on `copy()` and `copySync()`. (Srirangan / [#36])
+
+0.7.1 / 2013-10-12
+------------------
+* `copySync()` implemented (Srirangan / [#33])
+* updated to the latest `jsonfile` version `1.1.0` which gives `options` params for the JSON methods. Closes [#32]
+
+0.7.0 / 2013-10-07
+------------------
+* update readme conventions
+* `copy()` now works if destination directory does not exist. Closes [#29]
+
+0.6.4 / 2013-09-05
+------------------
+* changed `homepage` field in package.json to remove NPM warning
+
+0.6.3 / 2013-06-28
+------------------
+* changed JSON spacing default from `4` to `2` to follow Node conventions
+* updated `jsonfile` dep
+* updated `rimraf` dep
+
+0.6.2 / 2013-06-28
+------------------
+* added .npmignore, [#25]
+
+0.6.1 / 2013-05-14
+------------------
+* modified for `strict` mode, closes [#24]
+* added `outputJson()/outputJsonSync()`, closes [#23]
+
+0.6.0 / 2013-03-18
+------------------
+* removed node 0.6 support
+* added node 0.10 support
+* upgraded to latest `ncp` and `rimraf`.
+* optional `graceful-fs` support. Closes [#17]
+
+
+0.5.0 / 2013-02-03
+------------------
+* Removed `readTextFile`.
+* Renamed `readJSONFile` to `readJSON` and `readJson`, same with write.
+* Restructured documentation a bit. Added roadmap.
+
+0.4.0 / 2013-01-28
+------------------
+* Set default spaces in `jsonfile` from 4 to 2.
+* Updated `testutil` deps for tests.
+* Renamed `touch()` to `createFile()`
+* Added `outputFile()` and `outputFileSync()`
+* Changed creation of testing diretories so the /tmp dir is not littered.
+* Added `readTextFile()` and `readTextFileSync()`.
+
+0.3.2 / 2012-11-01
+------------------
+* Added `touch()` and `touchSync()` methods.
+
+0.3.1 / 2012-10-11
+------------------
+* Fixed some stray globals.
+
+0.3.0 / 2012-10-09
+------------------
+* Removed all CoffeeScript from tests.
+* Renamed `mkdir` to `mkdirs`/`mkdirp`.
+
+0.2.1 / 2012-09-11
+------------------
+* Updated `rimraf` dep.
+
+0.2.0 / 2012-09-10
+------------------
+* Rewrote module into JavaScript. (Must still rewrite tests into JavaScript)
+* Added all methods of [jsonfile](https://github.com/jprichardson/node-jsonfile)
+* Added Travis-CI.
+
+0.1.3 / 2012-08-13
+------------------
+* Added method `readJSONFile`.
+
+0.1.2 / 2012-06-15
+------------------
+* Bug fix: `deleteSync()` didn't exist.
+* Verified Node v0.8 compatibility.
+
+0.1.1 / 2012-06-15
+------------------
+* Fixed bug in `remove()`/`delete()` that wouldn't execute the function if a callback wasn't passed.
+
+0.1.0 / 2012-05-31
+------------------
+* Renamed `copyFile()` to `copy()`. `copy()` can now copy directories (recursively) too.
+* Renamed `rmrf()` to `remove()`.
+* `remove()` aliased with `delete()`.
+* Added `mkdirp` capabilities. Named: `mkdir()`. Hides Node.js native `mkdir()`.
+* Instead of exporting the native `fs` module with new functions, I now copy over the native methods to a new object and export that instead.
+
+0.0.4 / 2012-03-14
+------------------
+* Removed CoffeeScript dependency
+
+0.0.3 / 2012-01-11
+------------------
+* Added methods rmrf and rmrfSync
+* Moved tests from Jasmine to Mocha
+
+
+[#344]: https://github.com/jprichardson/node-fs-extra/issues/344 "Licence Year"
+[#343]: https://github.com/jprichardson/node-fs-extra/pull/343 "Add klaw-sync link to readme"
+[#342]: https://github.com/jprichardson/node-fs-extra/pull/342 "allow preserveTimestamps when use move"
+[#341]: https://github.com/jprichardson/node-fs-extra/issues/341 "mkdirp(path.dirname(dest) in move() logic needs cleaning up [question]"
+[#340]: https://github.com/jprichardson/node-fs-extra/pull/340 "Move docs to seperate docs folder [documentation]"
+[#339]: https://github.com/jprichardson/node-fs-extra/pull/339 "Remove walk() & walkSync() [feature-walk]"
+[#338]: https://github.com/jprichardson/node-fs-extra/issues/338 "Remove walk() and walkSync() [feature-walk]"
+[#337]: https://github.com/jprichardson/node-fs-extra/issues/337 "copy doesn't return a yieldable value"
+[#336]: https://github.com/jprichardson/node-fs-extra/pull/336 "Docs enhanced walk sync [documentation, feature-walk]"
+[#335]: https://github.com/jprichardson/node-fs-extra/pull/335 "Refactor move() tests [feature-move]"
+[#334]: https://github.com/jprichardson/node-fs-extra/pull/334 "Cleanup lib/move/index.js [feature-move]"
+[#333]: https://github.com/jprichardson/node-fs-extra/pull/333 "Rename clobber to overwrite [feature-copy, feature-move]"
+[#332]: https://github.com/jprichardson/node-fs-extra/pull/332 "BREAKING: Drop Node v0.12 & io.js support"
+[#331]: https://github.com/jprichardson/node-fs-extra/issues/331 "Add support for chmodr [enhancement, future]"
+[#330]: https://github.com/jprichardson/node-fs-extra/pull/330 "BREAKING: Do not error when copy destination exists & clobber: false [feature-copy]"
+[#329]: https://github.com/jprichardson/node-fs-extra/issues/329 "Does .walk() scale to large directories? [question]"
+[#328]: https://github.com/jprichardson/node-fs-extra/issues/328 "Copying files corrupts [feature-copy, needs-confirmed]"
+[#327]: https://github.com/jprichardson/node-fs-extra/pull/327 "Use writeStream 'finish' event instead of 'close' [bug, feature-copy]"
+[#326]: https://github.com/jprichardson/node-fs-extra/issues/326 "fs.copy fails with chmod error when disk under heavy use [bug, feature-copy]"
+[#325]: https://github.com/jprichardson/node-fs-extra/issues/325 "ensureDir is difficult to promisify [enhancement]"
+[#324]: https://github.com/jprichardson/node-fs-extra/pull/324 "copySync() should apply filter to directories like copy() [bug, feature-copy]"
+[#323]: https://github.com/jprichardson/node-fs-extra/issues/323 "Support for `dest` being a directory when using `copy*()`?"
+[#322]: https://github.com/jprichardson/node-fs-extra/pull/322 "Add fs-promise as fs-extra-promise alternative"
+[#321]: https://github.com/jprichardson/node-fs-extra/issues/321 "fs.copy() with clobber set to false return EEXIST error [feature-copy]"
+[#320]: https://github.com/jprichardson/node-fs-extra/issues/320 "fs.copySync: Error: EPERM: operation not permitted, unlink "
+[#319]: https://github.com/jprichardson/node-fs-extra/issues/319 "Create directory if not exists"
+[#318]: https://github.com/jprichardson/node-fs-extra/issues/318 "Support glob patterns [enhancement, future]"
+[#317]: https://github.com/jprichardson/node-fs-extra/pull/317 "Adding copy sync test for src file without write perms"
+[#316]: https://github.com/jprichardson/node-fs-extra/pull/316 "Remove move()'s broken limit option [feature-move]"
+[#315]: https://github.com/jprichardson/node-fs-extra/pull/315 "Fix move clobber tests to work around graceful-fs bug."
+[#314]: https://github.com/jprichardson/node-fs-extra/issues/314 "move() limit option [documentation, enhancement, feature-move]"
+[#313]: https://github.com/jprichardson/node-fs-extra/pull/313 "Test that remove() ignores glob characters."
+[#312]: https://github.com/jprichardson/node-fs-extra/pull/312 "Enhance walkSync() to return items with path and stats [feature-walk]"
+[#311]: https://github.com/jprichardson/node-fs-extra/issues/311 "move() not work when dest name not provided [feature-move]"
+[#310]: https://github.com/jprichardson/node-fs-extra/issues/310 "Edit walkSync to return items like what walk emits [documentation, enhancement, feature-walk]"
+[#309]: https://github.com/jprichardson/node-fs-extra/issues/309 "moveSync support [enhancement, feature-move]"
+[#308]: https://github.com/jprichardson/node-fs-extra/pull/308 "Fix incorrect anchor link"
+[#307]: https://github.com/jprichardson/node-fs-extra/pull/307 "Fix coverage"
+[#306]: https://github.com/jprichardson/node-fs-extra/pull/306 "Update devDeps, fix lint error"
+[#305]: https://github.com/jprichardson/node-fs-extra/pull/305 "Re-add Coveralls"
+[#304]: https://github.com/jprichardson/node-fs-extra/pull/304 "Remove path-is-absolute [enhancement]"
+[#303]: https://github.com/jprichardson/node-fs-extra/pull/303 "Document copySync filter inconsistency [documentation, feature-copy]"
+[#302]: https://github.com/jprichardson/node-fs-extra/pull/302 "fix(console): depreciated -> deprecated"
+[#301]: https://github.com/jprichardson/node-fs-extra/pull/301 "Remove chmod call from copySync [feature-copy]"
+[#300]: https://github.com/jprichardson/node-fs-extra/pull/300 "Inline Rimraf [enhancement, feature-move, feature-remove]"
+[#299]: https://github.com/jprichardson/node-fs-extra/pull/299 "Warn when filter is a RegExp [feature-copy]"
+[#298]: https://github.com/jprichardson/node-fs-extra/issues/298 "API Docs [documentation]"
+[#297]: https://github.com/jprichardson/node-fs-extra/pull/297 "Warn about using preserveTimestamps on 32-bit node"
+[#296]: https://github.com/jprichardson/node-fs-extra/pull/296 "Improve EEXIST error message for copySync [enhancement]"
+[#295]: https://github.com/jprichardson/node-fs-extra/pull/295 "Depreciate using regular expressions for copy's filter option [documentation]"
+[#294]: https://github.com/jprichardson/node-fs-extra/pull/294 "BREAKING: Refactor lib/copy/ncp.js [feature-copy]"
+[#293]: https://github.com/jprichardson/node-fs-extra/pull/293 "Update CI configs"
+[#292]: https://github.com/jprichardson/node-fs-extra/issues/292 "Rewrite lib/copy/ncp.js [enhancement, feature-copy]"
+[#291]: https://github.com/jprichardson/node-fs-extra/pull/291 "Escape '$' in replacement string for async file copying"
+[#290]: https://github.com/jprichardson/node-fs-extra/issues/290 "Exclude files pattern while copying using copy.config.js [question]"
+[#289]: https://github.com/jprichardson/node-fs-extra/pull/289 "(Closes #271) lib/util/utimes: properly close file descriptors in the event of an error"
+[#288]: https://github.com/jprichardson/node-fs-extra/pull/288 "(Closes #271) lib/util/utimes: properly close file descriptors in the event of an error"
+[#287]: https://github.com/jprichardson/node-fs-extra/issues/287 "emptyDir() callback arguments are inconsistent [enhancement, feature-remove]"
+[#286]: https://github.com/jprichardson/node-fs-extra/pull/286 "Added walkSync function"
+[#285]: https://github.com/jprichardson/node-fs-extra/issues/285 "CITGM test failing on s390"
+[#284]: https://github.com/jprichardson/node-fs-extra/issues/284 "outputFile method is missing a check to determine if existing item is a folder or not"
+[#283]: https://github.com/jprichardson/node-fs-extra/pull/283 "Apply filter also on directories and symlinks for copySync()"
+[#282]: https://github.com/jprichardson/node-fs-extra/pull/282 "Apply filter also on directories and symlinks for copySync()"
+[#281]: https://github.com/jprichardson/node-fs-extra/issues/281 "remove function executes 'successfully' but doesn't do anything?"
+[#280]: https://github.com/jprichardson/node-fs-extra/pull/280 "Disable rimraf globbing"
+[#279]: https://github.com/jprichardson/node-fs-extra/issues/279 "Some code is vendored instead of included [awaiting-reply]"
+[#278]: https://github.com/jprichardson/node-fs-extra/issues/278 "copy() does not preserve file/directory ownership"
+[#277]: https://github.com/jprichardson/node-fs-extra/pull/277 "Mention defaults for clobber and dereference options"
+[#276]: https://github.com/jprichardson/node-fs-extra/issues/276 "Cannot connect to Shared Folder [awaiting-reply]"
+[#275]: https://github.com/jprichardson/node-fs-extra/issues/275 "EMFILE, too many open files on Mac OS with JSON API"
+[#274]: https://github.com/jprichardson/node-fs-extra/issues/274 "Use with memory-fs? [enhancement, future]"
+[#273]: https://github.com/jprichardson/node-fs-extra/pull/273 "tests: rename `remote.test.js` to `remove.test.js`"
+[#272]: https://github.com/jprichardson/node-fs-extra/issues/272 "Copy clobber flag never err even when true [bug, feature-copy]"
+[#271]: https://github.com/jprichardson/node-fs-extra/issues/271 "Unclosed file handle on futimes error"
+[#270]: https://github.com/jprichardson/node-fs-extra/issues/270 "copy not working as desired on Windows [feature-copy, platform-windows]"
+[#269]: https://github.com/jprichardson/node-fs-extra/issues/269 "Copying with preserveTimeStamps: true is inaccurate using 32bit node [feature-copy]"
+[#268]: https://github.com/jprichardson/node-fs-extra/pull/268 "port fix for mkdirp issue #111"
+[#267]: https://github.com/jprichardson/node-fs-extra/issues/267 "WARN deprecated wrench@1.5.9: wrench.js is deprecated!"
+[#266]: https://github.com/jprichardson/node-fs-extra/issues/266 "fs-extra"
+[#265]: https://github.com/jprichardson/node-fs-extra/issues/265 "Link the `fs.stat fs.exists` etc. methods for replace the `fs` module forever?"
+[#264]: https://github.com/jprichardson/node-fs-extra/issues/264 "Renaming a file using move fails when a file inside is open (at least on windows) [wont-fix]"
+[#263]: https://github.com/jprichardson/node-fs-extra/issues/263 "ENOSYS: function not implemented, link [needs-confirmed]"
+[#262]: https://github.com/jprichardson/node-fs-extra/issues/262 "Add .exists() and .existsSync()"
+[#261]: https://github.com/jprichardson/node-fs-extra/issues/261 "Cannot read property 'prototype' of undefined"
+[#260]: https://github.com/jprichardson/node-fs-extra/pull/260 "use more specific path for method require"
+[#259]: https://github.com/jprichardson/node-fs-extra/issues/259 "Feature Request: isEmpty"
+[#258]: https://github.com/jprichardson/node-fs-extra/issues/258 "copy files does not preserve file timestamp"
+[#257]: https://github.com/jprichardson/node-fs-extra/issues/257 "Copying a file on windows fails"
+[#256]: https://github.com/jprichardson/node-fs-extra/pull/256 "Updated Readme "
+[#255]: https://github.com/jprichardson/node-fs-extra/issues/255 "Update rimraf required version"
+[#254]: https://github.com/jprichardson/node-fs-extra/issues/254 "request for readTree, readTreeSync, walkSync method"
+[#253]: https://github.com/jprichardson/node-fs-extra/issues/253 "outputFile does not touch mtime when file exists"
+[#252]: https://github.com/jprichardson/node-fs-extra/pull/252 "Fixing problem when copying file with no write permission"
+[#251]: https://github.com/jprichardson/node-fs-extra/issues/251 "Just wanted to say thank you"
+[#250]: https://github.com/jprichardson/node-fs-extra/issues/250 "`fs.remove()` not removing files (works with `rm -rf`)"
+[#249]: https://github.com/jprichardson/node-fs-extra/issues/249 "Just a Question ... Remove Servers"
+[#248]: https://github.com/jprichardson/node-fs-extra/issues/248 "Allow option to not preserve permissions for copy"
+[#247]: https://github.com/jprichardson/node-fs-extra/issues/247 "Add TypeScript typing directly in the fs-extra package"
+[#246]: https://github.com/jprichardson/node-fs-extra/issues/246 "fse.remove() && fse.removeSync() don't throw error on ENOENT file"
+[#245]: https://github.com/jprichardson/node-fs-extra/issues/245 "filter for empty dir [enhancement]"
+[#244]: https://github.com/jprichardson/node-fs-extra/issues/244 "copySync doesn't apply the filter to directories"
+[#243]: https://github.com/jprichardson/node-fs-extra/issues/243 "Can I request fs.walk() to be synchronous?"
+[#242]: https://github.com/jprichardson/node-fs-extra/issues/242 "Accidentally truncates file names ending with $$ [bug, feature-copy]"
+[#241]: https://github.com/jprichardson/node-fs-extra/pull/241 "Remove link to createOutputStream"
+[#240]: https://github.com/jprichardson/node-fs-extra/issues/240 "walkSync request"
+[#239]: https://github.com/jprichardson/node-fs-extra/issues/239 "Depreciate regular expressions for copy's filter [documentation, feature-copy]"
+[#238]: https://github.com/jprichardson/node-fs-extra/issues/238 "Can't write to files while in a worker thread."
+[#237]: https://github.com/jprichardson/node-fs-extra/issues/237 ".ensureDir(..) fails silently when passed an invalid path..."
+[#236]: https://github.com/jprichardson/node-fs-extra/issues/236 "[Removed] Filed under wrong repo"
+[#235]: https://github.com/jprichardson/node-fs-extra/pull/235 "Adds symlink dereference option to `fse.copySync` (#191)"
+[#234]: https://github.com/jprichardson/node-fs-extra/issues/234 "ensureDirSync fails silent when EACCES: permission denied on travis-ci"
+[#233]: https://github.com/jprichardson/node-fs-extra/issues/233 "please make sure the first argument in callback is error object [feature-copy]"
+[#232]: https://github.com/jprichardson/node-fs-extra/issues/232 "Copy a folder content to its child folder. "
+[#231]: https://github.com/jprichardson/node-fs-extra/issues/231 "Adding read/write/output functions for YAML"
+[#230]: https://github.com/jprichardson/node-fs-extra/pull/230 "throw error if src and dest are the same to avoid zeroing out + test"
+[#229]: https://github.com/jprichardson/node-fs-extra/pull/229 "fix 'TypeError: callback is not a function' in emptyDir"
+[#228]: https://github.com/jprichardson/node-fs-extra/pull/228 "Throw error when target is empty so file is not accidentally zeroed out"
+[#227]: https://github.com/jprichardson/node-fs-extra/issues/227 "Uncatchable errors when there are invalid arguments [feature-move]"
+[#226]: https://github.com/jprichardson/node-fs-extra/issues/226 "Moving to the current directory"
+[#225]: https://github.com/jprichardson/node-fs-extra/issues/225 "EBUSY: resource busy or locked, unlink"
+[#224]: https://github.com/jprichardson/node-fs-extra/issues/224 "fse.copy ENOENT error"
+[#223]: https://github.com/jprichardson/node-fs-extra/issues/223 "Suspicious behavior of fs.existsSync"
+[#222]: https://github.com/jprichardson/node-fs-extra/pull/222 "A clearer description of emtpyDir function"
+[#221]: https://github.com/jprichardson/node-fs-extra/pull/221 "Update README.md"
+[#220]: https://github.com/jprichardson/node-fs-extra/pull/220 "Non-breaking feature: add option 'passStats' to copy methods."
+[#219]: https://github.com/jprichardson/node-fs-extra/pull/219 "Add closing parenthesis in copySync example"
+[#218]: https://github.com/jprichardson/node-fs-extra/pull/218 "fix #187 #70 options.filter bug"
+[#217]: https://github.com/jprichardson/node-fs-extra/pull/217 "fix #187 #70 options.filter bug"
+[#216]: https://github.com/jprichardson/node-fs-extra/pull/216 "fix #187 #70 options.filter bug"
+[#215]: https://github.com/jprichardson/node-fs-extra/pull/215 "fse.copy throws error when only src and dest provided [bug, documentation, feature-copy]"
+[#214]: https://github.com/jprichardson/node-fs-extra/pull/214 "Fixing copySync anchor tag"
+[#213]: https://github.com/jprichardson/node-fs-extra/issues/213 "Merge extfs with this repo"
+[#212]: https://github.com/jprichardson/node-fs-extra/pull/212 "Update year to 2016 in README.md and LICENSE"
+[#211]: https://github.com/jprichardson/node-fs-extra/issues/211 "Not copying all files"
+[#210]: https://github.com/jprichardson/node-fs-extra/issues/210 "copy/copySync behave differently when copying a symbolic file [bug, documentation, feature-copy]"
+[#209]: https://github.com/jprichardson/node-fs-extra/issues/209 "In Windows invalid directory name causes infinite loop in ensureDir(). [bug]"
+[#208]: https://github.com/jprichardson/node-fs-extra/pull/208 "fix options.preserveTimestamps to false in copy-sync by default [feature-copy]"
+[#207]: https://github.com/jprichardson/node-fs-extra/issues/207 "Add `compare` suite of functions"
+[#206]: https://github.com/jprichardson/node-fs-extra/issues/206 "outputFileSync"
+[#205]: https://github.com/jprichardson/node-fs-extra/issues/205 "fix documents about copy/copySync [documentation, feature-copy]"
+[#204]: https://github.com/jprichardson/node-fs-extra/pull/204 "allow copy of block and character device files"
+[#203]: https://github.com/jprichardson/node-fs-extra/issues/203 "copy method's argument options couldn't be undefined [bug, feature-copy]"
+[#202]: https://github.com/jprichardson/node-fs-extra/issues/202 "why there is not a walkSync method?"
+[#201]: https://github.com/jprichardson/node-fs-extra/issues/201 "clobber for directories [feature-copy, future]"
+[#200]: https://github.com/jprichardson/node-fs-extra/issues/200 "'copySync' doesn't work in sync"
+[#199]: https://github.com/jprichardson/node-fs-extra/issues/199 "fs.copySync fails if user does not own file [bug, feature-copy]"
+[#198]: https://github.com/jprichardson/node-fs-extra/issues/198 "handle copying between identical files [feature-copy]"
+[#197]: https://github.com/jprichardson/node-fs-extra/issues/197 "Missing documentation for `outputFile` `options` 3rd parameter [documentation]"
+[#196]: https://github.com/jprichardson/node-fs-extra/issues/196 "copy filter: async function and/or function called with `fs.stat` result [future]"
+[#195]: https://github.com/jprichardson/node-fs-extra/issues/195 "How to override with outputFile?"
+[#194]: https://github.com/jprichardson/node-fs-extra/pull/194 "allow ensureFile(Sync) to provide data to be written to created file"
+[#193]: https://github.com/jprichardson/node-fs-extra/issues/193 "`fs.copy` fails silently if source file is /dev/null [bug, feature-copy]"
+[#192]: https://github.com/jprichardson/node-fs-extra/issues/192 "Remove fs.createOutputStream()"
+[#191]: https://github.com/jprichardson/node-fs-extra/issues/191 "How to copy symlinks to target as normal folders [feature-copy]"
+[#190]: https://github.com/jprichardson/node-fs-extra/pull/190 "copySync to overwrite destination file if readonly and clobber true"
+[#189]: https://github.com/jprichardson/node-fs-extra/pull/189 "move.test fix to support CRLF on Windows"
+[#188]: https://github.com/jprichardson/node-fs-extra/issues/188 "move.test failing on windows platform"
+[#187]: https://github.com/jprichardson/node-fs-extra/issues/187 "Not filter each file, stops on first false [feature-copy]"
+[#186]: https://github.com/jprichardson/node-fs-extra/issues/186 "Do you need a .size() function in this module? [future]"
+[#185]: https://github.com/jprichardson/node-fs-extra/issues/185 "Doesn't work on NodeJS v4.x"
+[#184]: https://github.com/jprichardson/node-fs-extra/issues/184 "CLI equivalent for fs-extra"
+[#183]: https://github.com/jprichardson/node-fs-extra/issues/183 "with clobber true, copy and copySync behave differently if destination file is read only [bug, feature-copy]"
+[#182]: https://github.com/jprichardson/node-fs-extra/issues/182 "ensureDir(dir, callback) second callback parameter not specified"
+[#181]: https://github.com/jprichardson/node-fs-extra/issues/181 "Add ability to remove file securely [enhancement, wont-fix]"
+[#180]: https://github.com/jprichardson/node-fs-extra/issues/180 "Filter option doesn't work the same way in copy and copySync [bug, feature-copy]"
+[#179]: https://github.com/jprichardson/node-fs-extra/issues/179 "Include opendir"
+[#178]: https://github.com/jprichardson/node-fs-extra/issues/178 "ENOTEMPTY is thrown on removeSync "
+[#177]: https://github.com/jprichardson/node-fs-extra/issues/177 "fix `remove()` wildcards (introduced by rimraf) [feature-remove]"
+[#176]: https://github.com/jprichardson/node-fs-extra/issues/176 "createOutputStream doesn't emit 'end' event"
+[#175]: https://github.com/jprichardson/node-fs-extra/issues/175 "[Feature Request].moveSync support [feature-move, future]"
+[#174]: https://github.com/jprichardson/node-fs-extra/pull/174 "Fix copy formatting and document options.filter"
+[#173]: https://github.com/jprichardson/node-fs-extra/issues/173 "Feature Request: writeJson should mkdirs"
+[#172]: https://github.com/jprichardson/node-fs-extra/issues/172 "rename `clobber` flags to `overwrite`"
+[#171]: https://github.com/jprichardson/node-fs-extra/issues/171 "remove unnecessary aliases"
+[#170]: https://github.com/jprichardson/node-fs-extra/pull/170 "More robust handling of errors moving across virtual drives"
+[#169]: https://github.com/jprichardson/node-fs-extra/pull/169 "suppress ensureLink & ensureSymlink dest exists error"
+[#168]: https://github.com/jprichardson/node-fs-extra/pull/168 "suppress ensurelink dest exists error"
+[#167]: https://github.com/jprichardson/node-fs-extra/pull/167 "Adds basic (string, buffer) support for ensureFile content [future]"
+[#166]: https://github.com/jprichardson/node-fs-extra/pull/166 "Adds basic (string, buffer) support for ensureFile content"
+[#165]: https://github.com/jprichardson/node-fs-extra/pull/165 "ensure for link & symlink"
+[#164]: https://github.com/jprichardson/node-fs-extra/issues/164 "Feature Request: ensureFile to take optional argument for file content"
+[#163]: https://github.com/jprichardson/node-fs-extra/issues/163 "ouputJson not formatted out of the box [bug]"
+[#162]: https://github.com/jprichardson/node-fs-extra/pull/162 "ensure symlink & link"
+[#161]: https://github.com/jprichardson/node-fs-extra/pull/161 "ensure symlink & link"
+[#160]: https://github.com/jprichardson/node-fs-extra/pull/160 "ensure symlink & link"
+[#159]: https://github.com/jprichardson/node-fs-extra/pull/159 "ensure symlink & link"
+[#158]: https://github.com/jprichardson/node-fs-extra/issues/158 "Feature Request: ensureLink and ensureSymlink methods"
+[#157]: https://github.com/jprichardson/node-fs-extra/issues/157 "writeJson isn't formatted"
+[#156]: https://github.com/jprichardson/node-fs-extra/issues/156 "Promise.promisifyAll doesn't work for some methods"
+[#155]: https://github.com/jprichardson/node-fs-extra/issues/155 "Readme"
+[#154]: https://github.com/jprichardson/node-fs-extra/issues/154 "/tmp/millis-test-sync"
+[#153]: https://github.com/jprichardson/node-fs-extra/pull/153 "Make preserveTimes also work on read-only files. Closes #152"
+[#152]: https://github.com/jprichardson/node-fs-extra/issues/152 "fs.copy fails for read-only files with preserveTimestamp=true [feature-copy]"
+[#151]: https://github.com/jprichardson/node-fs-extra/issues/151 "TOC does not work correctly on npm [documentation]"
+[#150]: https://github.com/jprichardson/node-fs-extra/issues/150 "Remove test file fixtures, create with code."
+[#149]: https://github.com/jprichardson/node-fs-extra/issues/149 "/tmp/millis-test-sync"
+[#148]: https://github.com/jprichardson/node-fs-extra/issues/148 "split out `Sync` methods in documentation"
+[#147]: https://github.com/jprichardson/node-fs-extra/issues/147 "Adding rmdirIfEmpty"
+[#146]: https://github.com/jprichardson/node-fs-extra/pull/146 "ensure test.js works"
+[#145]: https://github.com/jprichardson/node-fs-extra/issues/145 "Add `fs.exists` and `fs.existsSync` if it doesn't exist."
+[#144]: https://github.com/jprichardson/node-fs-extra/issues/144 "tests failing"
+[#143]: https://github.com/jprichardson/node-fs-extra/issues/143 "update graceful-fs"
+[#142]: https://github.com/jprichardson/node-fs-extra/issues/142 "PrependFile Feature"
+[#141]: https://github.com/jprichardson/node-fs-extra/pull/141 "Add option to preserve timestamps"
+[#140]: https://github.com/jprichardson/node-fs-extra/issues/140 "Json file reading fails with 'utf8'"
+[#139]: https://github.com/jprichardson/node-fs-extra/pull/139 "Preserve file timestamp on copy. Closes #138"
+[#138]: https://github.com/jprichardson/node-fs-extra/issues/138 "Preserve timestamps on copying files"
+[#137]: https://github.com/jprichardson/node-fs-extra/issues/137 "outputFile/outputJson: Unexpected end of input"
+[#136]: https://github.com/jprichardson/node-fs-extra/pull/136 "Update license attribute"
+[#135]: https://github.com/jprichardson/node-fs-extra/issues/135 "emptyDir throws Error if no callback is provided"
+[#134]: https://github.com/jprichardson/node-fs-extra/pull/134 "Handle EEXIST error when clobbering dir"
+[#133]: https://github.com/jprichardson/node-fs-extra/pull/133 "Travis runs with `sudo: false`"
+[#132]: https://github.com/jprichardson/node-fs-extra/pull/132 "isDirectory method"
+[#131]: https://github.com/jprichardson/node-fs-extra/issues/131 "copySync is not working iojs 1.8.4 on linux [feature-copy]"
+[#130]: https://github.com/jprichardson/node-fs-extra/pull/130 "Please review additional features."
+[#129]: https://github.com/jprichardson/node-fs-extra/pull/129 "can you review this feature?"
+[#128]: https://github.com/jprichardson/node-fs-extra/issues/128 "fsExtra.move(filepath, newPath) broken;"
+[#127]: https://github.com/jprichardson/node-fs-extra/issues/127 "consider using fs.access to remove deprecated warnings for fs.exists"
+[#126]: https://github.com/jprichardson/node-fs-extra/issues/126 " TypeError: Object #<Object> has no method 'access'"
+[#125]: https://github.com/jprichardson/node-fs-extra/issues/125 "Question: What do the *Sync function do different from non-sync"
+[#124]: https://github.com/jprichardson/node-fs-extra/issues/124 "move with clobber option 'ENOTEMPTY'"
+[#123]: https://github.com/jprichardson/node-fs-extra/issues/123 "Only copy the content of a directory"
+[#122]: https://github.com/jprichardson/node-fs-extra/pull/122 "Update section links in README to match current section ids."
+[#121]: https://github.com/jprichardson/node-fs-extra/issues/121 "emptyDir is undefined"
+[#120]: https://github.com/jprichardson/node-fs-extra/issues/120 "usage bug caused by shallow cloning methods of 'graceful-fs'"
+[#119]: https://github.com/jprichardson/node-fs-extra/issues/119 "mkdirs and ensureDir never invoke callback and consume CPU indefinitely if provided a path with invalid characters on Windows"
+[#118]: https://github.com/jprichardson/node-fs-extra/pull/118 "createOutputStream"
+[#117]: https://github.com/jprichardson/node-fs-extra/pull/117 "Fixed issue with slash separated paths on windows"
+[#116]: https://github.com/jprichardson/node-fs-extra/issues/116 "copySync can only copy directories not files [documentation, feature-copy]"
+[#115]: https://github.com/jprichardson/node-fs-extra/issues/115 ".Copy & .CopySync [feature-copy]"
+[#114]: https://github.com/jprichardson/node-fs-extra/issues/114 "Fails to move (rename) directory to non-empty directory even with clobber: true"
+[#113]: https://github.com/jprichardson/node-fs-extra/issues/113 "fs.copy seems to callback early if the destination file already exists"
+[#112]: https://github.com/jprichardson/node-fs-extra/pull/112 "Copying a file into an existing directory"
+[#111]: https://github.com/jprichardson/node-fs-extra/pull/111 "Moving a file into an existing directory "
+[#110]: https://github.com/jprichardson/node-fs-extra/pull/110 "Moving a file into an existing directory"
+[#109]: https://github.com/jprichardson/node-fs-extra/issues/109 "fs.move across windows drives fails"
+[#108]: https://github.com/jprichardson/node-fs-extra/issues/108 "fse.move directories across multiple devices doesn't work"
+[#107]: https://github.com/jprichardson/node-fs-extra/pull/107 "Check if dest path is an existing dir and copy or move source in it"
+[#106]: https://github.com/jprichardson/node-fs-extra/issues/106 "fse.copySync crashes while copying across devices D: [feature-copy]"
+[#105]: https://github.com/jprichardson/node-fs-extra/issues/105 "fs.copy hangs on iojs"
+[#104]: https://github.com/jprichardson/node-fs-extra/issues/104 "fse.move deletes folders [bug]"
+[#103]: https://github.com/jprichardson/node-fs-extra/issues/103 "Error: EMFILE with copy"
+[#102]: https://github.com/jprichardson/node-fs-extra/issues/102 "touch / touchSync was removed ?"
+[#101]: https://github.com/jprichardson/node-fs-extra/issues/101 "fs-extra promisified"
+[#100]: https://github.com/jprichardson/node-fs-extra/pull/100 "copy: options object or filter to pass to ncp"
+[#99]: https://github.com/jprichardson/node-fs-extra/issues/99 "ensureDir() modes [future]"
+[#98]: https://github.com/jprichardson/node-fs-extra/issues/98 "fs.copy() incorrect async behavior [bug]"
+[#97]: https://github.com/jprichardson/node-fs-extra/pull/97 "use path.join; fix copySync bug"
+[#96]: https://github.com/jprichardson/node-fs-extra/issues/96 "destFolderExists in copySync is always undefined."
+[#95]: https://github.com/jprichardson/node-fs-extra/pull/95 "Using graceful-ncp instead of ncp"
+[#94]: https://github.com/jprichardson/node-fs-extra/issues/94 "Error: EEXIST, file already exists '../mkdirp/bin/cmd.js' on fs.copySync() [enhancement, feature-copy]"
+[#93]: https://github.com/jprichardson/node-fs-extra/issues/93 "Confusing error if drive not mounted [enhancement]"
+[#92]: https://github.com/jprichardson/node-fs-extra/issues/92 "Problems with Bluebird"
+[#91]: https://github.com/jprichardson/node-fs-extra/issues/91 "fs.copySync('/test', '/haha') is different with 'cp -r /test /haha' [enhancement]"
+[#90]: https://github.com/jprichardson/node-fs-extra/issues/90 "Folder creation and file copy is Happening in 64 bit machine but not in 32 bit machine"
+[#89]: https://github.com/jprichardson/node-fs-extra/issues/89 "Error: EEXIST using fs-extra's fs.copy to copy a directory on Windows"
+[#88]: https://github.com/jprichardson/node-fs-extra/issues/88 "Stacking those libraries"
+[#87]: https://github.com/jprichardson/node-fs-extra/issues/87 "createWriteStream + outputFile = ?"
+[#86]: https://github.com/jprichardson/node-fs-extra/issues/86 "no moveSync?"
+[#85]: https://github.com/jprichardson/node-fs-extra/pull/85 "Copy symlinks in copySync"
+[#84]: https://github.com/jprichardson/node-fs-extra/issues/84 "Push latest version to npm ?"
+[#83]: https://github.com/jprichardson/node-fs-extra/issues/83 "Prevent copying a directory into itself [feature-copy]"
+[#82]: https://github.com/jprichardson/node-fs-extra/pull/82 "README updates for move"
+[#81]: https://github.com/jprichardson/node-fs-extra/issues/81 "fd leak after fs.move"
+[#80]: https://github.com/jprichardson/node-fs-extra/pull/80 "Preserve file mode in copySync"
+[#79]: https://github.com/jprichardson/node-fs-extra/issues/79 "fs.copy only .html file empty"
+[#78]: https://github.com/jprichardson/node-fs-extra/pull/78 "copySync was not applying filters to directories"
+[#77]: https://github.com/jprichardson/node-fs-extra/issues/77 "Create README reference to bluebird"
+[#76]: https://github.com/jprichardson/node-fs-extra/issues/76 "Create README reference to typescript"
+[#75]: https://github.com/jprichardson/node-fs-extra/issues/75 "add glob as a dep? [question]"
+[#74]: https://github.com/jprichardson/node-fs-extra/pull/74 "including new emptydir module"
+[#73]: https://github.com/jprichardson/node-fs-extra/pull/73 "add dependency status in readme"
+[#72]: https://github.com/jprichardson/node-fs-extra/pull/72 "Use svg instead of png to get better image quality"
+[#71]: https://github.com/jprichardson/node-fs-extra/issues/71 "fse.copy not working on Windows 7 x64 OS, but, copySync does work"
+[#70]: https://github.com/jprichardson/node-fs-extra/issues/70 "Not filter each file, stops on first false [bug]"
+[#69]: https://github.com/jprichardson/node-fs-extra/issues/69 "How to check if folder exist and read the folder name"
+[#68]: https://github.com/jprichardson/node-fs-extra/issues/68 "consider flag to readJsonSync (throw false) [enhancement]"
+[#67]: https://github.com/jprichardson/node-fs-extra/issues/67 "docs for readJson incorrectly states that is accepts options"
+[#66]: https://github.com/jprichardson/node-fs-extra/issues/66 "ENAMETOOLONG"
+[#65]: https://github.com/jprichardson/node-fs-extra/issues/65 "exclude filter in fs.copy"
+[#64]: https://github.com/jprichardson/node-fs-extra/issues/64 "Announce: mfs - monitor your fs-extra calls"
+[#63]: https://github.com/jprichardson/node-fs-extra/issues/63 "Walk"
+[#62]: https://github.com/jprichardson/node-fs-extra/issues/62 "npm install fs-extra doesn't work"
+[#61]: https://github.com/jprichardson/node-fs-extra/issues/61 "No longer supports node 0.8 due to use of `^` in package.json dependencies"
+[#60]: https://github.com/jprichardson/node-fs-extra/issues/60 "chmod & chown for mkdirs"
+[#59]: https://github.com/jprichardson/node-fs-extra/issues/59 "Consider including mkdirp and making fs-extra '--use_strict' safe [question]"
+[#58]: https://github.com/jprichardson/node-fs-extra/issues/58 "Stack trace not included in fs.copy error"
+[#57]: https://github.com/jprichardson/node-fs-extra/issues/57 "Possible to include wildcards in delete?"
+[#56]: https://github.com/jprichardson/node-fs-extra/issues/56 "Crash when have no access to write to destination file in copy "
+[#55]: https://github.com/jprichardson/node-fs-extra/issues/55 "Is it possible to have any console output similar to Grunt copy module?"
+[#54]: https://github.com/jprichardson/node-fs-extra/issues/54 "`copy` does not preserve file ownership and permissons"
+[#53]: https://github.com/jprichardson/node-fs-extra/issues/53 "outputFile() - ability to write data in appending mode"
+[#52]: https://github.com/jprichardson/node-fs-extra/pull/52 "This fixes (what I think) is a bug in copySync"
+[#51]: https://github.com/jprichardson/node-fs-extra/pull/51 "Add a Bitdeli Badge to README"
+[#50]: https://github.com/jprichardson/node-fs-extra/issues/50 "Replace mechanism in createFile"
+[#49]: https://github.com/jprichardson/node-fs-extra/pull/49 "update rimraf to v2.2.6"
+[#48]: https://github.com/jprichardson/node-fs-extra/issues/48 "fs.copy issue [bug]"
+[#47]: https://github.com/jprichardson/node-fs-extra/issues/47 "Bug in copy - callback called on readStream 'close' - Fixed in ncp 0.5.0"
+[#46]: https://github.com/jprichardson/node-fs-extra/pull/46 "update copyright year"
+[#45]: https://github.com/jprichardson/node-fs-extra/pull/45 "Added note about fse.outputFile() being the one that overwrites"
+[#44]: https://github.com/jprichardson/node-fs-extra/pull/44 "Proposal: Stream support"
+[#43]: https://github.com/jprichardson/node-fs-extra/issues/43 "Better error reporting "
+[#42]: https://github.com/jprichardson/node-fs-extra/issues/42 "Performance issue?"
+[#41]: https://github.com/jprichardson/node-fs-extra/pull/41 "There does seem to be a synchronous version now"
+[#40]: https://github.com/jprichardson/node-fs-extra/issues/40 "fs.copy throw unexplained error ENOENT, utime "
+[#39]: https://github.com/jprichardson/node-fs-extra/pull/39 "Added regression test for copy() return callback on error"
+[#38]: https://github.com/jprichardson/node-fs-extra/pull/38 "Return err in copy() fstat cb, because stat could be undefined or null"
+[#37]: https://github.com/jprichardson/node-fs-extra/issues/37 "Maybe include a line reader? [enhancement, question]"
+[#36]: https://github.com/jprichardson/node-fs-extra/pull/36 "`filter` parameter `fs.copy` and `fs.copySync`"
+[#35]: https://github.com/jprichardson/node-fs-extra/pull/35 "`filter` parameter `fs.copy` and `fs.copySync` "
+[#34]: https://github.com/jprichardson/node-fs-extra/issues/34 "update docs to include options for JSON methods [enhancement]"
+[#33]: https://github.com/jprichardson/node-fs-extra/pull/33 "fs_extra.copySync"
+[#32]: https://github.com/jprichardson/node-fs-extra/issues/32 "update to latest jsonfile [enhancement]"
+[#31]: https://github.com/jprichardson/node-fs-extra/issues/31 "Add ensure methods [enhancement]"
+[#30]: https://github.com/jprichardson/node-fs-extra/issues/30 "update package.json optional dep `graceful-fs`"
+[#29]: https://github.com/jprichardson/node-fs-extra/issues/29 "Copy failing if dest directory doesn't exist. Is this intended?"
+[#28]: https://github.com/jprichardson/node-fs-extra/issues/28 "homepage field must be a string url. Deleted."
+[#27]: https://github.com/jprichardson/node-fs-extra/issues/27 "Update Readme"
+[#26]: https://github.com/jprichardson/node-fs-extra/issues/26 "Add readdir recursive method. [enhancement]"
+[#25]: https://github.com/jprichardson/node-fs-extra/pull/25 "adding an `.npmignore` file"
+[#24]: https://github.com/jprichardson/node-fs-extra/issues/24 "[bug] cannot run in strict mode [bug]"
+[#23]: https://github.com/jprichardson/node-fs-extra/issues/23 "`writeJSON()` should create parent directories"
+[#22]: https://github.com/jprichardson/node-fs-extra/pull/22 "Add a limit option to mkdirs()"
+[#21]: https://github.com/jprichardson/node-fs-extra/issues/21 "touch() in 0.10.0"
+[#20]: https://github.com/jprichardson/node-fs-extra/issues/20 "fs.remove yields callback before directory is really deleted"
+[#19]: https://github.com/jprichardson/node-fs-extra/issues/19 "fs.copy err is empty array"
+[#18]: https://github.com/jprichardson/node-fs-extra/pull/18 "Exposed copyFile Function"
+[#17]: https://github.com/jprichardson/node-fs-extra/issues/17 "Use `require('graceful-fs')` if found instead of `require('fs')`"
+[#16]: https://github.com/jprichardson/node-fs-extra/pull/16 "Update README.md"
+[#15]: https://github.com/jprichardson/node-fs-extra/issues/15 "Implement cp -r but sync aka copySync. [enhancement]"
+[#14]: https://github.com/jprichardson/node-fs-extra/issues/14 "fs.mkdirSync is broken in 0.3.1"
+[#13]: https://github.com/jprichardson/node-fs-extra/issues/13 "Thoughts on including a directory tree / file watcher? [enhancement, question]"
+[#12]: https://github.com/jprichardson/node-fs-extra/issues/12 "copyFile & copyFileSync are global"
+[#11]: https://github.com/jprichardson/node-fs-extra/issues/11 "Thoughts on including a file walker? [enhancement, question]"
+[#10]: https://github.com/jprichardson/node-fs-extra/issues/10 "move / moveFile API [enhancement]"
+[#9]: https://github.com/jprichardson/node-fs-extra/issues/9 "don't import normal fs stuff into fs-extra"
+[#8]: https://github.com/jprichardson/node-fs-extra/pull/8 "Update rimraf to latest version"
+[#6]: https://github.com/jprichardson/node-fs-extra/issues/6 "Remove CoffeeScript development dependency"
+[#5]: https://github.com/jprichardson/node-fs-extra/issues/5 "comments on naming"
+[#4]: https://github.com/jprichardson/node-fs-extra/issues/4 "version bump to 0.2"
+[#3]: https://github.com/jprichardson/node-fs-extra/pull/3 "Hi! I fixed some code for you!"
+[#2]: https://github.com/jprichardson/node-fs-extra/issues/2 "Merge with fs.extra and mkdirp"
+[#1]: https://github.com/jprichardson/node-fs-extra/issues/1 "file-extra npm !exist"
diff --git a/desktop/node_modules/@electron/notarize/node_modules/fs-extra/LICENSE b/desktop/node_modules/@electron/notarize/node_modules/fs-extra/LICENSE
new file mode 100644
index 0000000..93546df
--- /dev/null
+++ b/desktop/node_modules/@electron/notarize/node_modules/fs-extra/LICENSE
@@ -0,0 +1,15 @@
+(The MIT License)
+
+Copyright (c) 2011-2017 JP Richardson
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files
+(the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify,
+ merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
+ furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS
+OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/desktop/node_modules/@electron/notarize/node_modules/fs-extra/README.md b/desktop/node_modules/@electron/notarize/node_modules/fs-extra/README.md
new file mode 100644
index 0000000..b4a5370
--- /dev/null
+++ b/desktop/node_modules/@electron/notarize/node_modules/fs-extra/README.md
@@ -0,0 +1,264 @@
+Node.js: fs-extra
+=================
+
+`fs-extra` adds file system methods that aren't included in the native `fs` module and adds promise support to the `fs` methods. It also uses [`graceful-fs`](https://github.com/isaacs/node-graceful-fs) to prevent `EMFILE` errors. It should be a drop in replacement for `fs`.
+
+[![npm Package](https://img.shields.io/npm/v/fs-extra.svg)](https://www.npmjs.org/package/fs-extra)
+[![License](https://img.shields.io/npm/l/express.svg)](https://github.com/jprichardson/node-fs-extra/blob/master/LICENSE)
+[![build status](https://img.shields.io/travis/jprichardson/node-fs-extra/master.svg)](http://travis-ci.org/jprichardson/node-fs-extra)
+[![windows Build status](https://img.shields.io/appveyor/ci/jprichardson/node-fs-extra/master.svg?label=windows%20build)](https://ci.appveyor.com/project/jprichardson/node-fs-extra/branch/master)
+[![downloads per month](http://img.shields.io/npm/dm/fs-extra.svg)](https://www.npmjs.org/package/fs-extra)
+[![Coverage Status](https://img.shields.io/coveralls/github/jprichardson/node-fs-extra/master.svg)](https://coveralls.io/github/jprichardson/node-fs-extra)
+[![JavaScript Style Guide](https://img.shields.io/badge/code_style-standard-brightgreen.svg)](https://standardjs.com)
+
+Why?
+----
+
+I got tired of including `mkdirp`, `rimraf`, and `ncp` in most of my projects.
+
+
+
+
+Installation
+------------
+
+ npm install fs-extra
+
+
+
+Usage
+-----
+
+`fs-extra` is a drop in replacement for native `fs`. All methods in `fs` are attached to `fs-extra`. All `fs` methods return promises if the callback isn't passed.
+
+You don't ever need to include the original `fs` module again:
+
+```js
+const fs = require('fs') // this is no longer necessary
+```
+
+you can now do this:
+
+```js
+const fs = require('fs-extra')
+```
+
+or if you prefer to make it clear that you're using `fs-extra` and not `fs`, you may want
+to name your `fs` variable `fse` like so:
+
+```js
+const fse = require('fs-extra')
+```
+
+you can also keep both, but it's redundant:
+
+```js
+const fs = require('fs')
+const fse = require('fs-extra')
+```
+
+Sync vs Async vs Async/Await
+-------------
+Most methods are async by default. All async methods will return a promise if the callback isn't passed.
+
+Sync methods on the other hand will throw if an error occurs.
+
+Also Async/Await will throw an error if one occurs.
+
+Example:
+
+```js
+const fs = require('fs-extra')
+
+// Async with promises:
+fs.copy('/tmp/myfile', '/tmp/mynewfile')
+ .then(() => console.log('success!'))
+ .catch(err => console.error(err))
+
+// Async with callbacks:
+fs.copy('/tmp/myfile', '/tmp/mynewfile', err => {
+ if (err) return console.error(err)
+ console.log('success!')
+})
+
+// Sync:
+try {
+ fs.copySync('/tmp/myfile', '/tmp/mynewfile')
+ console.log('success!')
+} catch (err) {
+ console.error(err)
+}
+
+// Async/Await:
+async function copyFiles () {
+ try {
+ await fs.copy('/tmp/myfile', '/tmp/mynewfile')
+ console.log('success!')
+ } catch (err) {
+ console.error(err)
+ }
+}
+
+copyFiles()
+```
+
+
+Methods
+-------
+
+### Async
+
+- [copy](docs/copy.md)
+- [emptyDir](docs/emptyDir.md)
+- [ensureFile](docs/ensureFile.md)
+- [ensureDir](docs/ensureDir.md)
+- [ensureLink](docs/ensureLink.md)
+- [ensureSymlink](docs/ensureSymlink.md)
+- [mkdirp](docs/ensureDir.md)
+- [mkdirs](docs/ensureDir.md)
+- [move](docs/move.md)
+- [outputFile](docs/outputFile.md)
+- [outputJson](docs/outputJson.md)
+- [pathExists](docs/pathExists.md)
+- [readJson](docs/readJson.md)
+- [remove](docs/remove.md)
+- [writeJson](docs/writeJson.md)
+
+### Sync
+
+- [copySync](docs/copy-sync.md)
+- [emptyDirSync](docs/emptyDir-sync.md)
+- [ensureFileSync](docs/ensureFile-sync.md)
+- [ensureDirSync](docs/ensureDir-sync.md)
+- [ensureLinkSync](docs/ensureLink-sync.md)
+- [ensureSymlinkSync](docs/ensureSymlink-sync.md)
+- [mkdirpSync](docs/ensureDir-sync.md)
+- [mkdirsSync](docs/ensureDir-sync.md)
+- [moveSync](docs/move-sync.md)
+- [outputFileSync](docs/outputFile-sync.md)
+- [outputJsonSync](docs/outputJson-sync.md)
+- [pathExistsSync](docs/pathExists-sync.md)
+- [readJsonSync](docs/readJson-sync.md)
+- [removeSync](docs/remove-sync.md)
+- [writeJsonSync](docs/writeJson-sync.md)
+
+
+**NOTE:** You can still use the native Node.js methods. They are promisified and copied over to `fs-extra`. See [notes on `fs.read()`, `fs.write()`, & `fs.writev()`](docs/fs-read-write-writev.md)
+
+### What happened to `walk()` and `walkSync()`?
+
+They were removed from `fs-extra` in v2.0.0. If you need the functionality, `walk` and `walkSync` are available as separate packages, [`klaw`](https://github.com/jprichardson/node-klaw) and [`klaw-sync`](https://github.com/manidlou/node-klaw-sync).
+
+
+Third Party
+-----------
+
+### CLI
+
+[fse-cli](https://www.npmjs.com/package/@atao60/fse-cli) allows you to run `fs-extra` from a console or from [npm](https://www.npmjs.com) scripts.
+
+### TypeScript
+
+If you like TypeScript, you can use `fs-extra` with it: https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/fs-extra
+
+
+### File / Directory Watching
+
+If you want to watch for changes to files or directories, then you should use [chokidar](https://github.com/paulmillr/chokidar).
+
+### Obtain Filesystem (Devices, Partitions) Information
+
+[fs-filesystem](https://github.com/arthurintelligence/node-fs-filesystem) allows you to read the state of the filesystem of the host on which it is run. It returns information about both the devices and the partitions (volumes) of the system.
+
+### Misc.
+
+- [fs-extra-debug](https://github.com/jdxcode/fs-extra-debug) - Send your fs-extra calls to [debug](https://npmjs.org/package/debug).
+- [mfs](https://github.com/cadorn/mfs) - Monitor your fs-extra calls.
+
+
+
+Hacking on fs-extra
+-------------------
+
+Wanna hack on `fs-extra`? Great! Your help is needed! [fs-extra is one of the most depended upon Node.js packages](http://nodei.co/npm/fs-extra.png?downloads=true&downloadRank=true&stars=true). This project
+uses [JavaScript Standard Style](https://github.com/feross/standard) - if the name or style choices bother you,
+you're gonna have to get over it :) If `standard` is good enough for `npm`, it's good enough for `fs-extra`.
+
+[![js-standard-style](https://cdn.rawgit.com/feross/standard/master/badge.svg)](https://github.com/feross/standard)
+
+What's needed?
+- First, take a look at existing issues. Those are probably going to be where the priority lies.
+- More tests for edge cases. Specifically on different platforms. There can never be enough tests.
+- Improve test coverage. See coveralls output for more info.
+
+Note: If you make any big changes, **you should definitely file an issue for discussion first.**
+
+### Running the Test Suite
+
+fs-extra contains hundreds of tests.
+
+- `npm run lint`: runs the linter ([standard](http://standardjs.com/))
+- `npm run unit`: runs the unit tests
+- `npm test`: runs both the linter and the tests
+
+
+### Windows
+
+If you run the tests on the Windows and receive a lot of symbolic link `EPERM` permission errors, it's
+because on Windows you need elevated privilege to create symbolic links. You can add this to your Windows's
+account by following the instructions here: http://superuser.com/questions/104845/permission-to-make-symbolic-links-in-windows-7
+However, I didn't have much luck doing this.
+
+Since I develop on Mac OS X, I use VMWare Fusion for Windows testing. I create a shared folder that I map to a drive on Windows.
+I open the `Node.js command prompt` and run as `Administrator`. I then map the network drive running the following command:
+
+ net use z: "\\vmware-host\Shared Folders"
+
+I can then navigate to my `fs-extra` directory and run the tests.
+
+
+Naming
+------
+
+I put a lot of thought into the naming of these functions. Inspired by @coolaj86's request. So he deserves much of the credit for raising the issue. See discussion(s) here:
+
+* https://github.com/jprichardson/node-fs-extra/issues/2
+* https://github.com/flatiron/utile/issues/11
+* https://github.com/ryanmcgrath/wrench-js/issues/29
+* https://github.com/substack/node-mkdirp/issues/17
+
+First, I believe that in as many cases as possible, the [Node.js naming schemes](http://nodejs.org/api/fs.html) should be chosen. However, there are problems with the Node.js own naming schemes.
+
+For example, `fs.readFile()` and `fs.readdir()`: the **F** is capitalized in *File* and the **d** is not capitalized in *dir*. Perhaps a bit pedantic, but they should still be consistent. Also, Node.js has chosen a lot of POSIX naming schemes, which I believe is great. See: `fs.mkdir()`, `fs.rmdir()`, `fs.chown()`, etc.
+
+We have a dilemma though. How do you consistently name methods that perform the following POSIX commands: `cp`, `cp -r`, `mkdir -p`, and `rm -rf`?
+
+My perspective: when in doubt, err on the side of simplicity. A directory is just a hierarchical grouping of directories and files. Consider that for a moment. So when you want to copy it or remove it, in most cases you'll want to copy or remove all of its contents. When you want to create a directory, if the directory that it's suppose to be contained in does not exist, then in most cases you'll want to create that too.
+
+So, if you want to remove a file or a directory regardless of whether it has contents, just call `fs.remove(path)`. If you want to copy a file or a directory whether it has contents, just call `fs.copy(source, destination)`. If you want to create a directory regardless of whether its parent directories exist, just call `fs.mkdirs(path)` or `fs.mkdirp(path)`.
+
+
+Credit
+------
+
+`fs-extra` wouldn't be possible without using the modules from the following authors:
+
+- [Isaac Shlueter](https://github.com/isaacs)
+- [Charlie McConnel](https://github.com/avianflu)
+- [James Halliday](https://github.com/substack)
+- [Andrew Kelley](https://github.com/andrewrk)
+
+
+
+
+License
+-------
+
+Licensed under MIT
+
+Copyright (c) 2011-2017 [JP Richardson](https://github.com/jprichardson)
+
+[1]: http://nodejs.org/docs/latest/api/fs.html
+
+
+[jsonfile]: https://github.com/jprichardson/node-jsonfile
diff --git a/desktop/node_modules/@electron/notarize/node_modules/fs-extra/lib/copy-sync/copy-sync.js b/desktop/node_modules/@electron/notarize/node_modules/fs-extra/lib/copy-sync/copy-sync.js
new file mode 100644
index 0000000..31f06e4
--- /dev/null
+++ b/desktop/node_modules/@electron/notarize/node_modules/fs-extra/lib/copy-sync/copy-sync.js
@@ -0,0 +1,166 @@
+'use strict'
+
+const fs = require('graceful-fs')
+const path = require('path')
+const mkdirsSync = require('../mkdirs').mkdirsSync
+const utimesMillisSync = require('../util/utimes').utimesMillisSync
+const stat = require('../util/stat')
+
+function copySync (src, dest, opts) {
+ if (typeof opts === 'function') {
+ opts = { filter: opts }
+ }
+
+ opts = opts || {}
+ opts.clobber = 'clobber' in opts ? !!opts.clobber : true // default to true for now
+ opts.overwrite = 'overwrite' in opts ? !!opts.overwrite : opts.clobber // overwrite falls back to clobber
+
+ // Warn about using preserveTimestamps on 32-bit node
+ if (opts.preserveTimestamps && process.arch === 'ia32') {
+ console.warn(`fs-extra: Using the preserveTimestamps option in 32-bit node is not recommended;\n
+ see https://github.com/jprichardson/node-fs-extra/issues/269`)
+ }
+
+ const { srcStat, destStat } = stat.checkPathsSync(src, dest, 'copy')
+ stat.checkParentPathsSync(src, srcStat, dest, 'copy')
+ return handleFilterAndCopy(destStat, src, dest, opts)
+}
+
+function handleFilterAndCopy (destStat, src, dest, opts) {
+ if (opts.filter && !opts.filter(src, dest)) return
+ const destParent = path.dirname(dest)
+ if (!fs.existsSync(destParent)) mkdirsSync(destParent)
+ return startCopy(destStat, src, dest, opts)
+}
+
+function startCopy (destStat, src, dest, opts) {
+ if (opts.filter && !opts.filter(src, dest)) return
+ return getStats(destStat, src, dest, opts)
+}
+
+function getStats (destStat, src, dest, opts) {
+ const statSync = opts.dereference ? fs.statSync : fs.lstatSync
+ const srcStat = statSync(src)
+
+ if (srcStat.isDirectory()) return onDir(srcStat, destStat, src, dest, opts)
+ else if (srcStat.isFile() ||
+ srcStat.isCharacterDevice() ||
+ srcStat.isBlockDevice()) return onFile(srcStat, destStat, src, dest, opts)
+ else if (srcStat.isSymbolicLink()) return onLink(destStat, src, dest, opts)
+}
+
+function onFile (srcStat, destStat, src, dest, opts) {
+ if (!destStat) return copyFile(srcStat, src, dest, opts)
+ return mayCopyFile(srcStat, src, dest, opts)
+}
+
+function mayCopyFile (srcStat, src, dest, opts) {
+ if (opts.overwrite) {
+ fs.unlinkSync(dest)
+ return copyFile(srcStat, src, dest, opts)
+ } else if (opts.errorOnExist) {
+ throw new Error(`'${dest}' already exists`)
+ }
+}
+
+function copyFile (srcStat, src, dest, opts) {
+ fs.copyFileSync(src, dest)
+ if (opts.preserveTimestamps) handleTimestamps(srcStat.mode, src, dest)
+ return setDestMode(dest, srcStat.mode)
+}
+
+function handleTimestamps (srcMode, src, dest) {
+ // Make sure the file is writable before setting the timestamp
+ // otherwise open fails with EPERM when invoked with 'r+'
+ // (through utimes call)
+ if (fileIsNotWritable(srcMode)) makeFileWritable(dest, srcMode)
+ return setDestTimestamps(src, dest)
+}
+
+function fileIsNotWritable (srcMode) {
+ return (srcMode & 0o200) === 0
+}
+
+function makeFileWritable (dest, srcMode) {
+ return setDestMode(dest, srcMode | 0o200)
+}
+
+function setDestMode (dest, srcMode) {
+ return fs.chmodSync(dest, srcMode)
+}
+
+function setDestTimestamps (src, dest) {
+ // The initial srcStat.atime cannot be trusted
+ // because it is modified by the read(2) system call
+ // (See https://nodejs.org/api/fs.html#fs_stat_time_values)
+ const updatedSrcStat = fs.statSync(src)
+ return utimesMillisSync(dest, updatedSrcStat.atime, updatedSrcStat.mtime)
+}
+
+function onDir (srcStat, destStat, src, dest, opts) {
+ if (!destStat) return mkDirAndCopy(srcStat.mode, src, dest, opts)
+ if (destStat && !destStat.isDirectory()) {
+ throw new Error(`Cannot overwrite non-directory '${dest}' with directory '${src}'.`)
+ }
+ return copyDir(src, dest, opts)
+}
+
+function mkDirAndCopy (srcMode, src, dest, opts) {
+ fs.mkdirSync(dest)
+ copyDir(src, dest, opts)
+ return setDestMode(dest, srcMode)
+}
+
+function copyDir (src, dest, opts) {
+ fs.readdirSync(src).forEach(item => copyDirItem(item, src, dest, opts))
+}
+
+function copyDirItem (item, src, dest, opts) {
+ const srcItem = path.join(src, item)
+ const destItem = path.join(dest, item)
+ const { destStat } = stat.checkPathsSync(srcItem, destItem, 'copy')
+ return startCopy(destStat, srcItem, destItem, opts)
+}
+
+function onLink (destStat, src, dest, opts) {
+ let resolvedSrc = fs.readlinkSync(src)
+ if (opts.dereference) {
+ resolvedSrc = path.resolve(process.cwd(), resolvedSrc)
+ }
+
+ if (!destStat) {
+ return fs.symlinkSync(resolvedSrc, dest)
+ } else {
+ let resolvedDest
+ try {
+ resolvedDest = fs.readlinkSync(dest)
+ } catch (err) {
+ // dest exists and is a regular file or directory,
+ // Windows may throw UNKNOWN error. If dest already exists,
+ // fs throws error anyway, so no need to guard against it here.
+ if (err.code === 'EINVAL' || err.code === 'UNKNOWN') return fs.symlinkSync(resolvedSrc, dest)
+ throw err
+ }
+ if (opts.dereference) {
+ resolvedDest = path.resolve(process.cwd(), resolvedDest)
+ }
+ if (stat.isSrcSubdir(resolvedSrc, resolvedDest)) {
+ throw new Error(`Cannot copy '${resolvedSrc}' to a subdirectory of itself, '${resolvedDest}'.`)
+ }
+
+ // prevent copy if src is a subdir of dest since unlinking
+ // dest in this case would result in removing src contents
+ // and therefore a broken symlink would be created.
+ if (fs.statSync(dest).isDirectory() && stat.isSrcSubdir(resolvedDest, resolvedSrc)) {
+ throw new Error(`Cannot overwrite '${resolvedDest}' with '${resolvedSrc}'.`)
+ }
+ return copyLink(resolvedSrc, dest)
+ }
+}
+
+function copyLink (resolvedSrc, dest) {
+ fs.unlinkSync(dest)
+ return fs.symlinkSync(resolvedSrc, dest)
+}
+
+module.exports = copySync
diff --git a/desktop/node_modules/@electron/notarize/node_modules/fs-extra/lib/copy-sync/index.js b/desktop/node_modules/@electron/notarize/node_modules/fs-extra/lib/copy-sync/index.js
new file mode 100644
index 0000000..65945ae
--- /dev/null
+++ b/desktop/node_modules/@electron/notarize/node_modules/fs-extra/lib/copy-sync/index.js
@@ -0,0 +1,5 @@
+'use strict'
+
+module.exports = {
+ copySync: require('./copy-sync')
+}
diff --git a/desktop/node_modules/@electron/notarize/node_modules/fs-extra/lib/copy/copy.js b/desktop/node_modules/@electron/notarize/node_modules/fs-extra/lib/copy/copy.js
new file mode 100644
index 0000000..328f102
--- /dev/null
+++ b/desktop/node_modules/@electron/notarize/node_modules/fs-extra/lib/copy/copy.js
@@ -0,0 +1,232 @@
+'use strict'
+
+const fs = require('graceful-fs')
+const path = require('path')
+const mkdirs = require('../mkdirs').mkdirs
+const pathExists = require('../path-exists').pathExists
+const utimesMillis = require('../util/utimes').utimesMillis
+const stat = require('../util/stat')
+
+function copy (src, dest, opts, cb) {
+ if (typeof opts === 'function' && !cb) {
+ cb = opts
+ opts = {}
+ } else if (typeof opts === 'function') {
+ opts = { filter: opts }
+ }
+
+ cb = cb || function () {}
+ opts = opts || {}
+
+ opts.clobber = 'clobber' in opts ? !!opts.clobber : true // default to true for now
+ opts.overwrite = 'overwrite' in opts ? !!opts.overwrite : opts.clobber // overwrite falls back to clobber
+
+ // Warn about using preserveTimestamps on 32-bit node
+ if (opts.preserveTimestamps && process.arch === 'ia32') {
+ console.warn(`fs-extra: Using the preserveTimestamps option in 32-bit node is not recommended;\n
+ see https://github.com/jprichardson/node-fs-extra/issues/269`)
+ }
+
+ stat.checkPaths(src, dest, 'copy', (err, stats) => {
+ if (err) return cb(err)
+ const { srcStat, destStat } = stats
+ stat.checkParentPaths(src, srcStat, dest, 'copy', err => {
+ if (err) return cb(err)
+ if (opts.filter) return handleFilter(checkParentDir, destStat, src, dest, opts, cb)
+ return checkParentDir(destStat, src, dest, opts, cb)
+ })
+ })
+}
+
+function checkParentDir (destStat, src, dest, opts, cb) {
+ const destParent = path.dirname(dest)
+ pathExists(destParent, (err, dirExists) => {
+ if (err) return cb(err)
+ if (dirExists) return startCopy(destStat, src, dest, opts, cb)
+ mkdirs(destParent, err => {
+ if (err) return cb(err)
+ return startCopy(destStat, src, dest, opts, cb)
+ })
+ })
+}
+
+function handleFilter (onInclude, destStat, src, dest, opts, cb) {
+ Promise.resolve(opts.filter(src, dest)).then(include => {
+ if (include) return onInclude(destStat, src, dest, opts, cb)
+ return cb()
+ }, error => cb(error))
+}
+
+function startCopy (destStat, src, dest, opts, cb) {
+ if (opts.filter) return handleFilter(getStats, destStat, src, dest, opts, cb)
+ return getStats(destStat, src, dest, opts, cb)
+}
+
+function getStats (destStat, src, dest, opts, cb) {
+ const stat = opts.dereference ? fs.stat : fs.lstat
+ stat(src, (err, srcStat) => {
+ if (err) return cb(err)
+
+ if (srcStat.isDirectory()) return onDir(srcStat, destStat, src, dest, opts, cb)
+ else if (srcStat.isFile() ||
+ srcStat.isCharacterDevice() ||
+ srcStat.isBlockDevice()) return onFile(srcStat, destStat, src, dest, opts, cb)
+ else if (srcStat.isSymbolicLink()) return onLink(destStat, src, dest, opts, cb)
+ })
+}
+
+function onFile (srcStat, destStat, src, dest, opts, cb) {
+ if (!destStat) return copyFile(srcStat, src, dest, opts, cb)
+ return mayCopyFile(srcStat, src, dest, opts, cb)
+}
+
+function mayCopyFile (srcStat, src, dest, opts, cb) {
+ if (opts.overwrite) {
+ fs.unlink(dest, err => {
+ if (err) return cb(err)
+ return copyFile(srcStat, src, dest, opts, cb)
+ })
+ } else if (opts.errorOnExist) {
+ return cb(new Error(`'${dest}' already exists`))
+ } else return cb()
+}
+
+function copyFile (srcStat, src, dest, opts, cb) {
+ fs.copyFile(src, dest, err => {
+ if (err) return cb(err)
+ if (opts.preserveTimestamps) return handleTimestampsAndMode(srcStat.mode, src, dest, cb)
+ return setDestMode(dest, srcStat.mode, cb)
+ })
+}
+
+function handleTimestampsAndMode (srcMode, src, dest, cb) {
+ // Make sure the file is writable before setting the timestamp
+ // otherwise open fails with EPERM when invoked with 'r+'
+ // (through utimes call)
+ if (fileIsNotWritable(srcMode)) {
+ return makeFileWritable(dest, srcMode, err => {
+ if (err) return cb(err)
+ return setDestTimestampsAndMode(srcMode, src, dest, cb)
+ })
+ }
+ return setDestTimestampsAndMode(srcMode, src, dest, cb)
+}
+
+function fileIsNotWritable (srcMode) {
+ return (srcMode & 0o200) === 0
+}
+
+function makeFileWritable (dest, srcMode, cb) {
+ return setDestMode(dest, srcMode | 0o200, cb)
+}
+
+function setDestTimestampsAndMode (srcMode, src, dest, cb) {
+ setDestTimestamps(src, dest, err => {
+ if (err) return cb(err)
+ return setDestMode(dest, srcMode, cb)
+ })
+}
+
+function setDestMode (dest, srcMode, cb) {
+ return fs.chmod(dest, srcMode, cb)
+}
+
+function setDestTimestamps (src, dest, cb) {
+ // The initial srcStat.atime cannot be trusted
+ // because it is modified by the read(2) system call
+ // (See https://nodejs.org/api/fs.html#fs_stat_time_values)
+ fs.stat(src, (err, updatedSrcStat) => {
+ if (err) return cb(err)
+ return utimesMillis(dest, updatedSrcStat.atime, updatedSrcStat.mtime, cb)
+ })
+}
+
+function onDir (srcStat, destStat, src, dest, opts, cb) {
+ if (!destStat) return mkDirAndCopy(srcStat.mode, src, dest, opts, cb)
+ if (destStat && !destStat.isDirectory()) {
+ return cb(new Error(`Cannot overwrite non-directory '${dest}' with directory '${src}'.`))
+ }
+ return copyDir(src, dest, opts, cb)
+}
+
+function mkDirAndCopy (srcMode, src, dest, opts, cb) {
+ fs.mkdir(dest, err => {
+ if (err) return cb(err)
+ copyDir(src, dest, opts, err => {
+ if (err) return cb(err)
+ return setDestMode(dest, srcMode, cb)
+ })
+ })
+}
+
+function copyDir (src, dest, opts, cb) {
+ fs.readdir(src, (err, items) => {
+ if (err) return cb(err)
+ return copyDirItems(items, src, dest, opts, cb)
+ })
+}
+
+function copyDirItems (items, src, dest, opts, cb) {
+ const item = items.pop()
+ if (!item) return cb()
+ return copyDirItem(items, item, src, dest, opts, cb)
+}
+
+function copyDirItem (items, item, src, dest, opts, cb) {
+ const srcItem = path.join(src, item)
+ const destItem = path.join(dest, item)
+ stat.checkPaths(srcItem, destItem, 'copy', (err, stats) => {
+ if (err) return cb(err)
+ const { destStat } = stats
+ startCopy(destStat, srcItem, destItem, opts, err => {
+ if (err) return cb(err)
+ return copyDirItems(items, src, dest, opts, cb)
+ })
+ })
+}
+
+function onLink (destStat, src, dest, opts, cb) {
+ fs.readlink(src, (err, resolvedSrc) => {
+ if (err) return cb(err)
+ if (opts.dereference) {
+ resolvedSrc = path.resolve(process.cwd(), resolvedSrc)
+ }
+
+ if (!destStat) {
+ return fs.symlink(resolvedSrc, dest, cb)
+ } else {
+ fs.readlink(dest, (err, resolvedDest) => {
+ if (err) {
+ // dest exists and is a regular file or directory,
+ // Windows may throw UNKNOWN error. If dest already exists,
+ // fs throws error anyway, so no need to guard against it here.
+ if (err.code === 'EINVAL' || err.code === 'UNKNOWN') return fs.symlink(resolvedSrc, dest, cb)
+ return cb(err)
+ }
+ if (opts.dereference) {
+ resolvedDest = path.resolve(process.cwd(), resolvedDest)
+ }
+ if (stat.isSrcSubdir(resolvedSrc, resolvedDest)) {
+ return cb(new Error(`Cannot copy '${resolvedSrc}' to a subdirectory of itself, '${resolvedDest}'.`))
+ }
+
+ // do not copy if src is a subdir of dest since unlinking
+ // dest in this case would result in removing src contents
+ // and therefore a broken symlink would be created.
+ if (destStat.isDirectory() && stat.isSrcSubdir(resolvedDest, resolvedSrc)) {
+ return cb(new Error(`Cannot overwrite '${resolvedDest}' with '${resolvedSrc}'.`))
+ }
+ return copyLink(resolvedSrc, dest, cb)
+ })
+ }
+ })
+}
+
+function copyLink (resolvedSrc, dest, cb) {
+ fs.unlink(dest, err => {
+ if (err) return cb(err)
+ return fs.symlink(resolvedSrc, dest, cb)
+ })
+}
+
+module.exports = copy
diff --git a/desktop/node_modules/@electron/notarize/node_modules/fs-extra/lib/copy/index.js b/desktop/node_modules/@electron/notarize/node_modules/fs-extra/lib/copy/index.js
new file mode 100644
index 0000000..b7e4f7f
--- /dev/null
+++ b/desktop/node_modules/@electron/notarize/node_modules/fs-extra/lib/copy/index.js
@@ -0,0 +1,6 @@
+'use strict'
+
+const u = require('universalify').fromCallback
+module.exports = {
+ copy: u(require('./copy'))
+}
diff --git a/desktop/node_modules/@electron/notarize/node_modules/fs-extra/lib/empty/index.js b/desktop/node_modules/@electron/notarize/node_modules/fs-extra/lib/empty/index.js
new file mode 100644
index 0000000..90fb469
--- /dev/null
+++ b/desktop/node_modules/@electron/notarize/node_modules/fs-extra/lib/empty/index.js
@@ -0,0 +1,48 @@
+'use strict'
+
+const u = require('universalify').fromCallback
+const fs = require('graceful-fs')
+const path = require('path')
+const mkdir = require('../mkdirs')
+const remove = require('../remove')
+
+const emptyDir = u(function emptyDir (dir, callback) {
+ callback = callback || function () {}
+ fs.readdir(dir, (err, items) => {
+ if (err) return mkdir.mkdirs(dir, callback)
+
+ items = items.map(item => path.join(dir, item))
+
+ deleteItem()
+
+ function deleteItem () {
+ const item = items.pop()
+ if (!item) return callback()
+ remove.remove(item, err => {
+ if (err) return callback(err)
+ deleteItem()
+ })
+ }
+ })
+})
+
+function emptyDirSync (dir) {
+ let items
+ try {
+ items = fs.readdirSync(dir)
+ } catch {
+ return mkdir.mkdirsSync(dir)
+ }
+
+ items.forEach(item => {
+ item = path.join(dir, item)
+ remove.removeSync(item)
+ })
+}
+
+module.exports = {
+ emptyDirSync,
+ emptydirSync: emptyDirSync,
+ emptyDir,
+ emptydir: emptyDir
+}
diff --git a/desktop/node_modules/@electron/notarize/node_modules/fs-extra/lib/ensure/file.js b/desktop/node_modules/@electron/notarize/node_modules/fs-extra/lib/ensure/file.js
new file mode 100644
index 0000000..15cc473
--- /dev/null
+++ b/desktop/node_modules/@electron/notarize/node_modules/fs-extra/lib/ensure/file.js
@@ -0,0 +1,69 @@
+'use strict'
+
+const u = require('universalify').fromCallback
+const path = require('path')
+const fs = require('graceful-fs')
+const mkdir = require('../mkdirs')
+
+function createFile (file, callback) {
+ function makeFile () {
+ fs.writeFile(file, '', err => {
+ if (err) return callback(err)
+ callback()
+ })
+ }
+
+ fs.stat(file, (err, stats) => { // eslint-disable-line handle-callback-err
+ if (!err && stats.isFile()) return callback()
+ const dir = path.dirname(file)
+ fs.stat(dir, (err, stats) => {
+ if (err) {
+ // if the directory doesn't exist, make it
+ if (err.code === 'ENOENT') {
+ return mkdir.mkdirs(dir, err => {
+ if (err) return callback(err)
+ makeFile()
+ })
+ }
+ return callback(err)
+ }
+
+ if (stats.isDirectory()) makeFile()
+ else {
+ // parent is not a directory
+ // This is just to cause an internal ENOTDIR error to be thrown
+ fs.readdir(dir, err => {
+ if (err) return callback(err)
+ })
+ }
+ })
+ })
+}
+
+function createFileSync (file) {
+ let stats
+ try {
+ stats = fs.statSync(file)
+ } catch {}
+ if (stats && stats.isFile()) return
+
+ const dir = path.dirname(file)
+ try {
+ if (!fs.statSync(dir).isDirectory()) {
+ // parent is not a directory
+ // This is just to cause an internal ENOTDIR error to be thrown
+ fs.readdirSync(dir)
+ }
+ } catch (err) {
+ // If the stat call above failed because the directory doesn't exist, create it
+ if (err && err.code === 'ENOENT') mkdir.mkdirsSync(dir)
+ else throw err
+ }
+
+ fs.writeFileSync(file, '')
+}
+
+module.exports = {
+ createFile: u(createFile),
+ createFileSync
+}
diff --git a/desktop/node_modules/@electron/notarize/node_modules/fs-extra/lib/ensure/index.js b/desktop/node_modules/@electron/notarize/node_modules/fs-extra/lib/ensure/index.js
new file mode 100644
index 0000000..c1f67b7
--- /dev/null
+++ b/desktop/node_modules/@electron/notarize/node_modules/fs-extra/lib/ensure/index.js
@@ -0,0 +1,23 @@
+'use strict'
+
+const file = require('./file')
+const link = require('./link')
+const symlink = require('./symlink')
+
+module.exports = {
+ // file
+ createFile: file.createFile,
+ createFileSync: file.createFileSync,
+ ensureFile: file.createFile,
+ ensureFileSync: file.createFileSync,
+ // link
+ createLink: link.createLink,
+ createLinkSync: link.createLinkSync,
+ ensureLink: link.createLink,
+ ensureLinkSync: link.createLinkSync,
+ // symlink
+ createSymlink: symlink.createSymlink,
+ createSymlinkSync: symlink.createSymlinkSync,
+ ensureSymlink: symlink.createSymlink,
+ ensureSymlinkSync: symlink.createSymlinkSync
+}
diff --git a/desktop/node_modules/@electron/notarize/node_modules/fs-extra/lib/ensure/link.js b/desktop/node_modules/@electron/notarize/node_modules/fs-extra/lib/ensure/link.js
new file mode 100644
index 0000000..2cd4196
--- /dev/null
+++ b/desktop/node_modules/@electron/notarize/node_modules/fs-extra/lib/ensure/link.js
@@ -0,0 +1,61 @@
+'use strict'
+
+const u = require('universalify').fromCallback
+const path = require('path')
+const fs = require('graceful-fs')
+const mkdir = require('../mkdirs')
+const pathExists = require('../path-exists').pathExists
+
+function createLink (srcpath, dstpath, callback) {
+ function makeLink (srcpath, dstpath) {
+ fs.link(srcpath, dstpath, err => {
+ if (err) return callback(err)
+ callback(null)
+ })
+ }
+
+ pathExists(dstpath, (err, destinationExists) => {
+ if (err) return callback(err)
+ if (destinationExists) return callback(null)
+ fs.lstat(srcpath, (err) => {
+ if (err) {
+ err.message = err.message.replace('lstat', 'ensureLink')
+ return callback(err)
+ }
+
+ const dir = path.dirname(dstpath)
+ pathExists(dir, (err, dirExists) => {
+ if (err) return callback(err)
+ if (dirExists) return makeLink(srcpath, dstpath)
+ mkdir.mkdirs(dir, err => {
+ if (err) return callback(err)
+ makeLink(srcpath, dstpath)
+ })
+ })
+ })
+ })
+}
+
+function createLinkSync (srcpath, dstpath) {
+ const destinationExists = fs.existsSync(dstpath)
+ if (destinationExists) return undefined
+
+ try {
+ fs.lstatSync(srcpath)
+ } catch (err) {
+ err.message = err.message.replace('lstat', 'ensureLink')
+ throw err
+ }
+
+ const dir = path.dirname(dstpath)
+ const dirExists = fs.existsSync(dir)
+ if (dirExists) return fs.linkSync(srcpath, dstpath)
+ mkdir.mkdirsSync(dir)
+
+ return fs.linkSync(srcpath, dstpath)
+}
+
+module.exports = {
+ createLink: u(createLink),
+ createLinkSync
+}
diff --git a/desktop/node_modules/@electron/notarize/node_modules/fs-extra/lib/ensure/symlink-paths.js b/desktop/node_modules/@electron/notarize/node_modules/fs-extra/lib/ensure/symlink-paths.js
new file mode 100644
index 0000000..33cd760
--- /dev/null
+++ b/desktop/node_modules/@electron/notarize/node_modules/fs-extra/lib/ensure/symlink-paths.js
@@ -0,0 +1,99 @@
+'use strict'
+
+const path = require('path')
+const fs = require('graceful-fs')
+const pathExists = require('../path-exists').pathExists
+
+/**
+ * Function that returns two types of paths, one relative to symlink, and one
+ * relative to the current working directory. Checks if path is absolute or
+ * relative. If the path is relative, this function checks if the path is
+ * relative to symlink or relative to current working directory. This is an
+ * initiative to find a smarter `srcpath` to supply when building symlinks.
+ * This allows you to determine which path to use out of one of three possible
+ * types of source paths. The first is an absolute path. This is detected by
+ * `path.isAbsolute()`. When an absolute path is provided, it is checked to
+ * see if it exists. If it does it's used, if not an error is returned
+ * (callback)/ thrown (sync). The other two options for `srcpath` are a
+ * relative url. By default Node's `fs.symlink` works by creating a symlink
+ * using `dstpath` and expects the `srcpath` to be relative to the newly
+ * created symlink. If you provide a `srcpath` that does not exist on the file
+ * system it results in a broken symlink. To minimize this, the function
+ * checks to see if the 'relative to symlink' source file exists, and if it
+ * does it will use it. If it does not, it checks if there's a file that
+ * exists that is relative to the current working directory, if does its used.
+ * This preserves the expectations of the original fs.symlink spec and adds
+ * the ability to pass in `relative to current working direcotry` paths.
+ */
+
+function symlinkPaths (srcpath, dstpath, callback) {
+ if (path.isAbsolute(srcpath)) {
+ return fs.lstat(srcpath, (err) => {
+ if (err) {
+ err.message = err.message.replace('lstat', 'ensureSymlink')
+ return callback(err)
+ }
+ return callback(null, {
+ toCwd: srcpath,
+ toDst: srcpath
+ })
+ })
+ } else {
+ const dstdir = path.dirname(dstpath)
+ const relativeToDst = path.join(dstdir, srcpath)
+ return pathExists(relativeToDst, (err, exists) => {
+ if (err) return callback(err)
+ if (exists) {
+ return callback(null, {
+ toCwd: relativeToDst,
+ toDst: srcpath
+ })
+ } else {
+ return fs.lstat(srcpath, (err) => {
+ if (err) {
+ err.message = err.message.replace('lstat', 'ensureSymlink')
+ return callback(err)
+ }
+ return callback(null, {
+ toCwd: srcpath,
+ toDst: path.relative(dstdir, srcpath)
+ })
+ })
+ }
+ })
+ }
+}
+
+function symlinkPathsSync (srcpath, dstpath) {
+ let exists
+ if (path.isAbsolute(srcpath)) {
+ exists = fs.existsSync(srcpath)
+ if (!exists) throw new Error('absolute srcpath does not exist')
+ return {
+ toCwd: srcpath,
+ toDst: srcpath
+ }
+ } else {
+ const dstdir = path.dirname(dstpath)
+ const relativeToDst = path.join(dstdir, srcpath)
+ exists = fs.existsSync(relativeToDst)
+ if (exists) {
+ return {
+ toCwd: relativeToDst,
+ toDst: srcpath
+ }
+ } else {
+ exists = fs.existsSync(srcpath)
+ if (!exists) throw new Error('relative srcpath does not exist')
+ return {
+ toCwd: srcpath,
+ toDst: path.relative(dstdir, srcpath)
+ }
+ }
+ }
+}
+
+module.exports = {
+ symlinkPaths,
+ symlinkPathsSync
+}
diff --git a/desktop/node_modules/@electron/notarize/node_modules/fs-extra/lib/ensure/symlink-type.js b/desktop/node_modules/@electron/notarize/node_modules/fs-extra/lib/ensure/symlink-type.js
new file mode 100644
index 0000000..42dc0ce
--- /dev/null
+++ b/desktop/node_modules/@electron/notarize/node_modules/fs-extra/lib/ensure/symlink-type.js
@@ -0,0 +1,31 @@
+'use strict'
+
+const fs = require('graceful-fs')
+
+function symlinkType (srcpath, type, callback) {
+ callback = (typeof type === 'function') ? type : callback
+ type = (typeof type === 'function') ? false : type
+ if (type) return callback(null, type)
+ fs.lstat(srcpath, (err, stats) => {
+ if (err) return callback(null, 'file')
+ type = (stats && stats.isDirectory()) ? 'dir' : 'file'
+ callback(null, type)
+ })
+}
+
+function symlinkTypeSync (srcpath, type) {
+ let stats
+
+ if (type) return type
+ try {
+ stats = fs.lstatSync(srcpath)
+ } catch {
+ return 'file'
+ }
+ return (stats && stats.isDirectory()) ? 'dir' : 'file'
+}
+
+module.exports = {
+ symlinkType,
+ symlinkTypeSync
+}
diff --git a/desktop/node_modules/@electron/notarize/node_modules/fs-extra/lib/ensure/symlink.js b/desktop/node_modules/@electron/notarize/node_modules/fs-extra/lib/ensure/symlink.js
new file mode 100644
index 0000000..fe68b79
--- /dev/null
+++ b/desktop/node_modules/@electron/notarize/node_modules/fs-extra/lib/ensure/symlink.js
@@ -0,0 +1,63 @@
+'use strict'
+
+const u = require('universalify').fromCallback
+const path = require('path')
+const fs = require('graceful-fs')
+const _mkdirs = require('../mkdirs')
+const mkdirs = _mkdirs.mkdirs
+const mkdirsSync = _mkdirs.mkdirsSync
+
+const _symlinkPaths = require('./symlink-paths')
+const symlinkPaths = _symlinkPaths.symlinkPaths
+const symlinkPathsSync = _symlinkPaths.symlinkPathsSync
+
+const _symlinkType = require('./symlink-type')
+const symlinkType = _symlinkType.symlinkType
+const symlinkTypeSync = _symlinkType.symlinkTypeSync
+
+const pathExists = require('../path-exists').pathExists
+
+function createSymlink (srcpath, dstpath, type, callback) {
+ callback = (typeof type === 'function') ? type : callback
+ type = (typeof type === 'function') ? false : type
+
+ pathExists(dstpath, (err, destinationExists) => {
+ if (err) return callback(err)
+ if (destinationExists) return callback(null)
+ symlinkPaths(srcpath, dstpath, (err, relative) => {
+ if (err) return callback(err)
+ srcpath = relative.toDst
+ symlinkType(relative.toCwd, type, (err, type) => {
+ if (err) return callback(err)
+ const dir = path.dirname(dstpath)
+ pathExists(dir, (err, dirExists) => {
+ if (err) return callback(err)
+ if (dirExists) return fs.symlink(srcpath, dstpath, type, callback)
+ mkdirs(dir, err => {
+ if (err) return callback(err)
+ fs.symlink(srcpath, dstpath, type, callback)
+ })
+ })
+ })
+ })
+ })
+}
+
+function createSymlinkSync (srcpath, dstpath, type) {
+ const destinationExists = fs.existsSync(dstpath)
+ if (destinationExists) return undefined
+
+ const relative = symlinkPathsSync(srcpath, dstpath)
+ srcpath = relative.toDst
+ type = symlinkTypeSync(relative.toCwd, type)
+ const dir = path.dirname(dstpath)
+ const exists = fs.existsSync(dir)
+ if (exists) return fs.symlinkSync(srcpath, dstpath, type)
+ mkdirsSync(dir)
+ return fs.symlinkSync(srcpath, dstpath, type)
+}
+
+module.exports = {
+ createSymlink: u(createSymlink),
+ createSymlinkSync
+}
diff --git a/desktop/node_modules/@electron/notarize/node_modules/fs-extra/lib/fs/index.js b/desktop/node_modules/@electron/notarize/node_modules/fs-extra/lib/fs/index.js
new file mode 100644
index 0000000..9bbaea4
--- /dev/null
+++ b/desktop/node_modules/@electron/notarize/node_modules/fs-extra/lib/fs/index.js
@@ -0,0 +1,130 @@
+'use strict'
+// This is adapted from https://github.com/normalize/mz
+// Copyright (c) 2014-2016 Jonathan Ong me@jongleberry.com and Contributors
+const u = require('universalify').fromCallback
+const fs = require('graceful-fs')
+
+const api = [
+ 'access',
+ 'appendFile',
+ 'chmod',
+ 'chown',
+ 'close',
+ 'copyFile',
+ 'fchmod',
+ 'fchown',
+ 'fdatasync',
+ 'fstat',
+ 'fsync',
+ 'ftruncate',
+ 'futimes',
+ 'lchmod',
+ 'lchown',
+ 'link',
+ 'lstat',
+ 'mkdir',
+ 'mkdtemp',
+ 'open',
+ 'opendir',
+ 'readdir',
+ 'readFile',
+ 'readlink',
+ 'realpath',
+ 'rename',
+ 'rm',
+ 'rmdir',
+ 'stat',
+ 'symlink',
+ 'truncate',
+ 'unlink',
+ 'utimes',
+ 'writeFile'
+].filter(key => {
+ // Some commands are not available on some systems. Ex:
+ // fs.opendir was added in Node.js v12.12.0
+ // fs.rm was added in Node.js v14.14.0
+ // fs.lchown is not available on at least some Linux
+ return typeof fs[key] === 'function'
+})
+
+// Export all keys:
+Object.keys(fs).forEach(key => {
+ if (key === 'promises') {
+ // fs.promises is a getter property that triggers ExperimentalWarning
+ // Don't re-export it here, the getter is defined in "lib/index.js"
+ return
+ }
+ exports[key] = fs[key]
+})
+
+// Universalify async methods:
+api.forEach(method => {
+ exports[method] = u(fs[method])
+})
+
+// We differ from mz/fs in that we still ship the old, broken, fs.exists()
+// since we are a drop-in replacement for the native module
+exports.exists = function (filename, callback) {
+ if (typeof callback === 'function') {
+ return fs.exists(filename, callback)
+ }
+ return new Promise(resolve => {
+ return fs.exists(filename, resolve)
+ })
+}
+
+// fs.read(), fs.write(), & fs.writev() need special treatment due to multiple callback args
+
+exports.read = function (fd, buffer, offset, length, position, callback) {
+ if (typeof callback === 'function') {
+ return fs.read(fd, buffer, offset, length, position, callback)
+ }
+ return new Promise((resolve, reject) => {
+ fs.read(fd, buffer, offset, length, position, (err, bytesRead, buffer) => {
+ if (err) return reject(err)
+ resolve({ bytesRead, buffer })
+ })
+ })
+}
+
+// Function signature can be
+// fs.write(fd, buffer[, offset[, length[, position]]], callback)
+// OR
+// fs.write(fd, string[, position[, encoding]], callback)
+// We need to handle both cases, so we use ...args
+exports.write = function (fd, buffer, ...args) {
+ if (typeof args[args.length - 1] === 'function') {
+ return fs.write(fd, buffer, ...args)
+ }
+
+ return new Promise((resolve, reject) => {
+ fs.write(fd, buffer, ...args, (err, bytesWritten, buffer) => {
+ if (err) return reject(err)
+ resolve({ bytesWritten, buffer })
+ })
+ })
+}
+
+// fs.writev only available in Node v12.9.0+
+if (typeof fs.writev === 'function') {
+ // Function signature is
+ // s.writev(fd, buffers[, position], callback)
+ // We need to handle the optional arg, so we use ...args
+ exports.writev = function (fd, buffers, ...args) {
+ if (typeof args[args.length - 1] === 'function') {
+ return fs.writev(fd, buffers, ...args)
+ }
+
+ return new Promise((resolve, reject) => {
+ fs.writev(fd, buffers, ...args, (err, bytesWritten, buffers) => {
+ if (err) return reject(err)
+ resolve({ bytesWritten, buffers })
+ })
+ })
+ }
+}
+
+// fs.realpath.native only available in Node v9.2+
+if (typeof fs.realpath.native === 'function') {
+ exports.realpath.native = u(fs.realpath.native)
+}
diff --git a/desktop/node_modules/@electron/notarize/node_modules/fs-extra/lib/index.js b/desktop/node_modules/@electron/notarize/node_modules/fs-extra/lib/index.js
new file mode 100644
index 0000000..d9468e6
--- /dev/null
+++ b/desktop/node_modules/@electron/notarize/node_modules/fs-extra/lib/index.js
@@ -0,0 +1,27 @@
+'use strict'
+
+module.exports = {
+ // Export promiseified graceful-fs:
+ ...require('./fs'),
+ // Export extra methods:
+ ...require('./copy-sync'),
+ ...require('./copy'),
+ ...require('./empty'),
+ ...require('./ensure'),
+ ...require('./json'),
+ ...require('./mkdirs'),
+ ...require('./move-sync'),
+ ...require('./move'),
+ ...require('./output'),
+ ...require('./path-exists'),
+ ...require('./remove')
+}
+
+// Export fs.promises as a getter property so that we don't trigger
+// ExperimentalWarning before fs.promises is actually accessed.
+const fs = require('fs')
+if (Object.getOwnPropertyDescriptor(fs, 'promises')) {
+ Object.defineProperty(module.exports, 'promises', {
+ get () { return fs.promises }
+ })
+}
diff --git a/desktop/node_modules/@electron/notarize/node_modules/fs-extra/lib/json/index.js b/desktop/node_modules/@electron/notarize/node_modules/fs-extra/lib/json/index.js
new file mode 100644
index 0000000..900126a
--- /dev/null
+++ b/desktop/node_modules/@electron/notarize/node_modules/fs-extra/lib/json/index.js
@@ -0,0 +1,16 @@
+'use strict'
+
+const u = require('universalify').fromPromise
+const jsonFile = require('./jsonfile')
+
+jsonFile.outputJson = u(require('./output-json'))
+jsonFile.outputJsonSync = require('./output-json-sync')
+// aliases
+jsonFile.outputJSON = jsonFile.outputJson
+jsonFile.outputJSONSync = jsonFile.outputJsonSync
+jsonFile.writeJSON = jsonFile.writeJson
+jsonFile.writeJSONSync = jsonFile.writeJsonSync
+jsonFile.readJSON = jsonFile.readJson
+jsonFile.readJSONSync = jsonFile.readJsonSync
+
+module.exports = jsonFile
diff --git a/desktop/node_modules/@electron/notarize/node_modules/fs-extra/lib/json/jsonfile.js b/desktop/node_modules/@electron/notarize/node_modules/fs-extra/lib/json/jsonfile.js
new file mode 100644
index 0000000..f11d34d
--- /dev/null
+++ b/desktop/node_modules/@electron/notarize/node_modules/fs-extra/lib/json/jsonfile.js
@@ -0,0 +1,11 @@
+'use strict'
+
+const jsonFile = require('jsonfile')
+
+module.exports = {
+ // jsonfile exports
+ readJson: jsonFile.readFile,
+ readJsonSync: jsonFile.readFileSync,
+ writeJson: jsonFile.writeFile,
+ writeJsonSync: jsonFile.writeFileSync
+}
diff --git a/desktop/node_modules/@electron/notarize/node_modules/fs-extra/lib/json/output-json-sync.js b/desktop/node_modules/@electron/notarize/node_modules/fs-extra/lib/json/output-json-sync.js
new file mode 100644
index 0000000..f76b474
--- /dev/null
+++ b/desktop/node_modules/@electron/notarize/node_modules/fs-extra/lib/json/output-json-sync.js
@@ -0,0 +1,12 @@
+'use strict'
+
+const { stringify } = require('jsonfile/utils')
+const { outputFileSync } = require('../output')
+
+function outputJsonSync (file, data, options) {
+ const str = stringify(data, options)
+
+ outputFileSync(file, str, options)
+}
+
+module.exports = outputJsonSync
diff --git a/desktop/node_modules/@electron/notarize/node_modules/fs-extra/lib/json/output-json.js b/desktop/node_modules/@electron/notarize/node_modules/fs-extra/lib/json/output-json.js
new file mode 100644
index 0000000..0fc6689
--- /dev/null
+++ b/desktop/node_modules/@electron/notarize/node_modules/fs-extra/lib/json/output-json.js
@@ -0,0 +1,12 @@
+'use strict'
+
+const { stringify } = require('jsonfile/utils')
+const { outputFile } = require('../output')
+
+async function outputJson (file, data, options = {}) {
+ const str = stringify(data, options)
+
+ await outputFile(file, str, options)
+}
+
+module.exports = outputJson
diff --git a/desktop/node_modules/@electron/notarize/node_modules/fs-extra/lib/mkdirs/index.js b/desktop/node_modules/@electron/notarize/node_modules/fs-extra/lib/mkdirs/index.js
new file mode 100644
index 0000000..9edecee
--- /dev/null
+++ b/desktop/node_modules/@electron/notarize/node_modules/fs-extra/lib/mkdirs/index.js
@@ -0,0 +1,14 @@
+'use strict'
+const u = require('universalify').fromPromise
+const { makeDir: _makeDir, makeDirSync } = require('./make-dir')
+const makeDir = u(_makeDir)
+
+module.exports = {
+ mkdirs: makeDir,
+ mkdirsSync: makeDirSync,
+ // alias
+ mkdirp: makeDir,
+ mkdirpSync: makeDirSync,
+ ensureDir: makeDir,
+ ensureDirSync: makeDirSync
+}
diff --git a/desktop/node_modules/@electron/notarize/node_modules/fs-extra/lib/mkdirs/make-dir.js b/desktop/node_modules/@electron/notarize/node_modules/fs-extra/lib/mkdirs/make-dir.js
new file mode 100644
index 0000000..3e7e836
--- /dev/null
+++ b/desktop/node_modules/@electron/notarize/node_modules/fs-extra/lib/mkdirs/make-dir.js
@@ -0,0 +1,141 @@
+// Adapted from https://github.com/sindresorhus/make-dir
+// Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)
+// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+'use strict'
+const fs = require('../fs')
+const path = require('path')
+const atLeastNode = require('at-least-node')
+
+const useNativeRecursiveOption = atLeastNode('10.12.0')
+
+// https://github.com/nodejs/node/issues/8987
+// https://github.com/libuv/libuv/pull/1088
+const checkPath = pth => {
+ if (process.platform === 'win32') {
+ const pathHasInvalidWinCharacters = /[<>:"|?*]/.test(pth.replace(path.parse(pth).root, ''))
+
+ if (pathHasInvalidWinCharacters) {
+ const error = new Error(`Path contains invalid characters: ${pth}`)
+ error.code = 'EINVAL'
+ throw error
+ }
+ }
+}
+
+const processOptions = options => {
+ const defaults = { mode: 0o777 }
+ if (typeof options === 'number') options = { mode: options }
+ return { ...defaults, ...options }
+}
+
+const permissionError = pth => {
+ // This replicates the exception of `fs.mkdir` with native the
+ // `recusive` option when run on an invalid drive under Windows.
+ const error = new Error(`operation not permitted, mkdir '${pth}'`)
+ error.code = 'EPERM'
+ error.errno = -4048
+ error.path = pth
+ error.syscall = 'mkdir'
+ return error
+}
+
+module.exports.makeDir = async (input, options) => {
+ checkPath(input)
+ options = processOptions(options)
+
+ if (useNativeRecursiveOption) {
+ const pth = path.resolve(input)
+
+ return fs.mkdir(pth, {
+ mode: options.mode,
+ recursive: true
+ })
+ }
+
+ const make = async pth => {
+ try {
+ await fs.mkdir(pth, options.mode)
+ } catch (error) {
+ if (error.code === 'EPERM') {
+ throw error
+ }
+
+ if (error.code === 'ENOENT') {
+ if (path.dirname(pth) === pth) {
+ throw permissionError(pth)
+ }
+
+ if (error.message.includes('null bytes')) {
+ throw error
+ }
+
+ await make(path.dirname(pth))
+ return make(pth)
+ }
+
+ try {
+ const stats = await fs.stat(pth)
+ if (!stats.isDirectory()) {
+ // This error is never exposed to the user
+ // it is caught below, and the original error is thrown
+ throw new Error('The path is not a directory')
+ }
+ } catch {
+ throw error
+ }
+ }
+ }
+
+ return make(path.resolve(input))
+}
+
+module.exports.makeDirSync = (input, options) => {
+ checkPath(input)
+ options = processOptions(options)
+
+ if (useNativeRecursiveOption) {
+ const pth = path.resolve(input)
+
+ return fs.mkdirSync(pth, {
+ mode: options.mode,
+ recursive: true
+ })
+ }
+
+ const make = pth => {
+ try {
+ fs.mkdirSync(pth, options.mode)
+ } catch (error) {
+ if (error.code === 'EPERM') {
+ throw error
+ }
+
+ if (error.code === 'ENOENT') {
+ if (path.dirname(pth) === pth) {
+ throw permissionError(pth)
+ }
+
+ if (error.message.includes('null bytes')) {
+ throw error
+ }
+
+ make(path.dirname(pth))
+ return make(pth)
+ }
+
+ try {
+ if (!fs.statSync(pth).isDirectory()) {
+ // This error is never exposed to the user
+ // it is caught below, and the original error is thrown
+ throw new Error('The path is not a directory')
+ }
+ } catch {
+ throw error
+ }
+ }
+ }
+
+ return make(path.resolve(input))
+}
diff --git a/desktop/node_modules/@electron/notarize/node_modules/fs-extra/lib/move-sync/index.js b/desktop/node_modules/@electron/notarize/node_modules/fs-extra/lib/move-sync/index.js
new file mode 100644
index 0000000..af90b06
--- /dev/null
+++ b/desktop/node_modules/@electron/notarize/node_modules/fs-extra/lib/move-sync/index.js
@@ -0,0 +1,5 @@
+'use strict'
+
+module.exports = {
+ moveSync: require('./move-sync')
+}
diff --git a/desktop/node_modules/@electron/notarize/node_modules/fs-extra/lib/move-sync/move-sync.js b/desktop/node_modules/@electron/notarize/node_modules/fs-extra/lib/move-sync/move-sync.js
new file mode 100644
index 0000000..20f910c
--- /dev/null
+++ b/desktop/node_modules/@electron/notarize/node_modules/fs-extra/lib/move-sync/move-sync.js
@@ -0,0 +1,47 @@
+'use strict'
+
+const fs = require('graceful-fs')
+const path = require('path')
+const copySync = require('../copy-sync').copySync
+const removeSync = require('../remove').removeSync
+const mkdirpSync = require('../mkdirs').mkdirpSync
+const stat = require('../util/stat')
+
+function moveSync (src, dest, opts) {
+ opts = opts || {}
+ const overwrite = opts.overwrite || opts.clobber || false
+
+ const { srcStat } = stat.checkPathsSync(src, dest, 'move')
+ stat.checkParentPathsSync(src, srcStat, dest, 'move')
+ mkdirpSync(path.dirname(dest))
+ return doRename(src, dest, overwrite)
+}
+
+function doRename (src, dest, overwrite) {
+ if (overwrite) {
+ removeSync(dest)
+ return rename(src, dest, overwrite)
+ }
+ if (fs.existsSync(dest)) throw new Error('dest already exists.')
+ return rename(src, dest, overwrite)
+}
+
+function rename (src, dest, overwrite) {
+ try {
+ fs.renameSync(src, dest)
+ } catch (err) {
+ if (err.code !== 'EXDEV') throw err
+ return moveAcrossDevice(src, dest, overwrite)
+ }
+}
+
+function moveAcrossDevice (src, dest, overwrite) {
+ const opts = {
+ overwrite,
+ errorOnExist: true
+ }
+ copySync(src, dest, opts)
+ return removeSync(src)
+}
+
+module.exports = moveSync
diff --git a/desktop/node_modules/@electron/notarize/node_modules/fs-extra/lib/move/index.js b/desktop/node_modules/@electron/notarize/node_modules/fs-extra/lib/move/index.js
new file mode 100644
index 0000000..3785345
--- /dev/null
+++ b/desktop/node_modules/@electron/notarize/node_modules/fs-extra/lib/move/index.js
@@ -0,0 +1,6 @@
+'use strict'
+
+const u = require('universalify').fromCallback
+module.exports = {
+ move: u(require('./move'))
+}
diff --git a/desktop/node_modules/@electron/notarize/node_modules/fs-extra/lib/move/move.js b/desktop/node_modules/@electron/notarize/node_modules/fs-extra/lib/move/move.js
new file mode 100644
index 0000000..fa3ea61
--- /dev/null
+++ b/desktop/node_modules/@electron/notarize/node_modules/fs-extra/lib/move/move.js
@@ -0,0 +1,65 @@
+'use strict'
+
+const fs = require('graceful-fs')
+const path = require('path')
+const copy = require('../copy').copy
+const remove = require('../remove').remove
+const mkdirp = require('../mkdirs').mkdirp
+const pathExists = require('../path-exists').pathExists
+const stat = require('../util/stat')
+
+function move (src, dest, opts, cb) {
+ if (typeof opts === 'function') {
+ cb = opts
+ opts = {}
+ }
+
+ const overwrite = opts.overwrite || opts.clobber || false
+
+ stat.checkPaths(src, dest, 'move', (err, stats) => {
+ if (err) return cb(err)
+ const { srcStat } = stats
+ stat.checkParentPaths(src, srcStat, dest, 'move', err => {
+ if (err) return cb(err)
+ mkdirp(path.dirname(dest), err => {
+ if (err) return cb(err)
+ return doRename(src, dest, overwrite, cb)
+ })
+ })
+ })
+}
+
+function doRename (src, dest, overwrite, cb) {
+ if (overwrite) {
+ return remove(dest, err => {
+ if (err) return cb(err)
+ return rename(src, dest, overwrite, cb)
+ })
+ }
+ pathExists(dest, (err, destExists) => {
+ if (err) return cb(err)
+ if (destExists) return cb(new Error('dest already exists.'))
+ return rename(src, dest, overwrite, cb)
+ })
+}
+
+function rename (src, dest, overwrite, cb) {
+ fs.rename(src, dest, err => {
+ if (!err) return cb()
+ if (err.code !== 'EXDEV') return cb(err)
+ return moveAcrossDevice(src, dest, overwrite, cb)
+ })
+}
+
+function moveAcrossDevice (src, dest, overwrite, cb) {
+ const opts = {
+ overwrite,
+ errorOnExist: true
+ }
+ copy(src, dest, opts, err => {
+ if (err) return cb(err)
+ return remove(src, cb)
+ })
+}
+
+module.exports = move
diff --git a/desktop/node_modules/@electron/notarize/node_modules/fs-extra/lib/output/index.js b/desktop/node_modules/@electron/notarize/node_modules/fs-extra/lib/output/index.js
new file mode 100644
index 0000000..92297ca
--- /dev/null
+++ b/desktop/node_modules/@electron/notarize/node_modules/fs-extra/lib/output/index.js
@@ -0,0 +1,40 @@
+'use strict'
+
+const u = require('universalify').fromCallback
+const fs = require('graceful-fs')
+const path = require('path')
+const mkdir = require('../mkdirs')
+const pathExists = require('../path-exists').pathExists
+
+function outputFile (file, data, encoding, callback) {
+ if (typeof encoding === 'function') {
+ callback = encoding
+ encoding = 'utf8'
+ }
+
+ const dir = path.dirname(file)
+ pathExists(dir, (err, itDoes) => {
+ if (err) return callback(err)
+ if (itDoes) return fs.writeFile(file, data, encoding, callback)
+
+ mkdir.mkdirs(dir, err => {
+ if (err) return callback(err)
+
+ fs.writeFile(file, data, encoding, callback)
+ })
+ })
+}
+
+function outputFileSync (file, ...args) {
+ const dir = path.dirname(file)
+ if (fs.existsSync(dir)) {
+ return fs.writeFileSync(file, ...args)
+ }
+ mkdir.mkdirsSync(dir)
+ fs.writeFileSync(file, ...args)
+}
+
+module.exports = {
+ outputFile: u(outputFile),
+ outputFileSync
+}
diff --git a/desktop/node_modules/@electron/notarize/node_modules/fs-extra/lib/path-exists/index.js b/desktop/node_modules/@electron/notarize/node_modules/fs-extra/lib/path-exists/index.js
new file mode 100644
index 0000000..ddd9bc7
--- /dev/null
+++ b/desktop/node_modules/@electron/notarize/node_modules/fs-extra/lib/path-exists/index.js
@@ -0,0 +1,12 @@
+'use strict'
+const u = require('universalify').fromPromise
+const fs = require('../fs')
+
+function pathExists (path) {
+ return fs.access(path).then(() => true).catch(() => false)
+}
+
+module.exports = {
+ pathExists: u(pathExists),
+ pathExistsSync: fs.existsSync
+}
diff --git a/desktop/node_modules/@electron/notarize/node_modules/fs-extra/lib/remove/index.js b/desktop/node_modules/@electron/notarize/node_modules/fs-extra/lib/remove/index.js
new file mode 100644
index 0000000..cee5340
--- /dev/null
+++ b/desktop/node_modules/@electron/notarize/node_modules/fs-extra/lib/remove/index.js
@@ -0,0 +1,9 @@
+'use strict'
+
+const u = require('universalify').fromCallback
+const rimraf = require('./rimraf')
+
+module.exports = {
+ remove: u(rimraf),
+ removeSync: rimraf.sync
+}
diff --git a/desktop/node_modules/@electron/notarize/node_modules/fs-extra/lib/remove/rimraf.js b/desktop/node_modules/@electron/notarize/node_modules/fs-extra/lib/remove/rimraf.js
new file mode 100644
index 0000000..2c77102
--- /dev/null
+++ b/desktop/node_modules/@electron/notarize/node_modules/fs-extra/lib/remove/rimraf.js
@@ -0,0 +1,302 @@
+'use strict'
+
+const fs = require('graceful-fs')
+const path = require('path')
+const assert = require('assert')
+
+const isWindows = (process.platform === 'win32')
+
+function defaults (options) {
+ const methods = [
+ 'unlink',
+ 'chmod',
+ 'stat',
+ 'lstat',
+ 'rmdir',
+ 'readdir'
+ ]
+ methods.forEach(m => {
+ options[m] = options[m] || fs[m]
+ m = m + 'Sync'
+ options[m] = options[m] || fs[m]
+ })
+
+ options.maxBusyTries = options.maxBusyTries || 3
+}
+
+function rimraf (p, options, cb) {
+ let busyTries = 0
+
+ if (typeof options === 'function') {
+ cb = options
+ options = {}
+ }
+
+ assert(p, 'rimraf: missing path')
+ assert.strictEqual(typeof p, 'string', 'rimraf: path should be a string')
+ assert.strictEqual(typeof cb, 'function', 'rimraf: callback function required')
+ assert(options, 'rimraf: invalid options argument provided')
+ assert.strictEqual(typeof options, 'object', 'rimraf: options should be object')
+
+ defaults(options)
+
+ rimraf_(p, options, function CB (er) {
+ if (er) {
+ if ((er.code === 'EBUSY' || er.code === 'ENOTEMPTY' || er.code === 'EPERM') &&
+ busyTries < options.maxBusyTries) {
+ busyTries++
+ const time = busyTries * 100
+ // try again, with the same exact callback as this one.
+ return setTimeout(() => rimraf_(p, options, CB), time)
+ }
+
+ // already gone
+ if (er.code === 'ENOENT') er = null
+ }
+
+ cb(er)
+ })
+}
+
+// Two possible strategies.
+// 1. Assume it's a file. unlink it, then do the dir stuff on EPERM or EISDIR
+// 2. Assume it's a directory. readdir, then do the file stuff on ENOTDIR
+//
+// Both result in an extra syscall when you guess wrong. However, there
+// are likely far more normal files in the world than directories. This
+// is based on the assumption that a the average number of files per
+// directory is >= 1.
+//
+// If anyone ever complains about this, then I guess the strategy could
+// be made configurable somehow. But until then, YAGNI.
+function rimraf_ (p, options, cb) {
+ assert(p)
+ assert(options)
+ assert(typeof cb === 'function')
+
+ // sunos lets the root user unlink directories, which is... weird.
+ // so we have to lstat here and make sure it's not a dir.
+ options.lstat(p, (er, st) => {
+ if (er && er.code === 'ENOENT') {
+ return cb(null)
+ }
+
+ // Windows can EPERM on stat. Life is suffering.
+ if (er && er.code === 'EPERM' && isWindows) {
+ return fixWinEPERM(p, options, er, cb)
+ }
+
+ if (st && st.isDirectory()) {
+ return rmdir(p, options, er, cb)
+ }
+
+ options.unlink(p, er => {
+ if (er) {
+ if (er.code === 'ENOENT') {
+ return cb(null)
+ }
+ if (er.code === 'EPERM') {
+ return (isWindows)
+ ? fixWinEPERM(p, options, er, cb)
+ : rmdir(p, options, er, cb)
+ }
+ if (er.code === 'EISDIR') {
+ return rmdir(p, options, er, cb)
+ }
+ }
+ return cb(er)
+ })
+ })
+}
+
+function fixWinEPERM (p, options, er, cb) {
+ assert(p)
+ assert(options)
+ assert(typeof cb === 'function')
+
+ options.chmod(p, 0o666, er2 => {
+ if (er2) {
+ cb(er2.code === 'ENOENT' ? null : er)
+ } else {
+ options.stat(p, (er3, stats) => {
+ if (er3) {
+ cb(er3.code === 'ENOENT' ? null : er)
+ } else if (stats.isDirectory()) {
+ rmdir(p, options, er, cb)
+ } else {
+ options.unlink(p, cb)
+ }
+ })
+ }
+ })
+}
+
+function fixWinEPERMSync (p, options, er) {
+ let stats
+
+ assert(p)
+ assert(options)
+
+ try {
+ options.chmodSync(p, 0o666)
+ } catch (er2) {
+ if (er2.code === 'ENOENT') {
+ return
+ } else {
+ throw er
+ }
+ }
+
+ try {
+ stats = options.statSync(p)
+ } catch (er3) {
+ if (er3.code === 'ENOENT') {
+ return
+ } else {
+ throw er
+ }
+ }
+
+ if (stats.isDirectory()) {
+ rmdirSync(p, options, er)
+ } else {
+ options.unlinkSync(p)
+ }
+}
+
+function rmdir (p, options, originalEr, cb) {
+ assert(p)
+ assert(options)
+ assert(typeof cb === 'function')
+
+ // try to rmdir first, and only readdir on ENOTEMPTY or EEXIST (SunOS)
+ // if we guessed wrong, and it's not a directory, then
+ // raise the original error.
+ options.rmdir(p, er => {
+ if (er && (er.code === 'ENOTEMPTY' || er.code === 'EEXIST' || er.code === 'EPERM')) {
+ rmkids(p, options, cb)
+ } else if (er && er.code === 'ENOTDIR') {
+ cb(originalEr)
+ } else {
+ cb(er)
+ }
+ })
+}
+
+function rmkids (p, options, cb) {
+ assert(p)
+ assert(options)
+ assert(typeof cb === 'function')
+
+ options.readdir(p, (er, files) => {
+ if (er) return cb(er)
+
+ let n = files.length
+ let errState
+
+ if (n === 0) return options.rmdir(p, cb)
+
+ files.forEach(f => {
+ rimraf(path.join(p, f), options, er => {
+ if (errState) {
+ return
+ }
+ if (er) return cb(errState = er)
+ if (--n === 0) {
+ options.rmdir(p, cb)
+ }
+ })
+ })
+ })
+}
+
+// this looks simpler, and is strictly *faster*, but will
+// tie up the JavaScript thread and fail on excessively
+// deep directory trees.
+function rimrafSync (p, options) {
+ let st
+
+ options = options || {}
+ defaults(options)
+
+ assert(p, 'rimraf: missing path')
+ assert.strictEqual(typeof p, 'string', 'rimraf: path should be a string')
+ assert(options, 'rimraf: missing options')
+ assert.strictEqual(typeof options, 'object', 'rimraf: options should be object')
+
+ try {
+ st = options.lstatSync(p)
+ } catch (er) {
+ if (er.code === 'ENOENT') {
+ return
+ }
+
+ // Windows can EPERM on stat. Life is suffering.
+ if (er.code === 'EPERM' && isWindows) {
+ fixWinEPERMSync(p, options, er)
+ }
+ }
+
+ try {
+ // sunos lets the root user unlink directories, which is... weird.
+ if (st && st.isDirectory()) {
+ rmdirSync(p, options, null)
+ } else {
+ options.unlinkSync(p)
+ }
+ } catch (er) {
+ if (er.code === 'ENOENT') {
+ return
+ } else if (er.code === 'EPERM') {
+ return isWindows ? fixWinEPERMSync(p, options, er) : rmdirSync(p, options, er)
+ } else if (er.code !== 'EISDIR') {
+ throw er
+ }
+ rmdirSync(p, options, er)
+ }
+}
+
+function rmdirSync (p, options, originalEr) {
+ assert(p)
+ assert(options)
+
+ try {
+ options.rmdirSync(p)
+ } catch (er) {
+ if (er.code === 'ENOTDIR') {
+ throw originalEr
+ } else if (er.code === 'ENOTEMPTY' || er.code === 'EEXIST' || er.code === 'EPERM') {
+ rmkidsSync(p, options)
+ } else if (er.code !== 'ENOENT') {
+ throw er
+ }
+ }
+}
+
+function rmkidsSync (p, options) {
+ assert(p)
+ assert(options)
+ options.readdirSync(p).forEach(f => rimrafSync(path.join(p, f), options))
+
+ if (isWindows) {
+ // We only end up here once we got ENOTEMPTY at least once, and
+ // at this point, we are guaranteed to have removed all the kids.
+ // So, we know that it won't be ENOENT or ENOTDIR or anything else.
+ // try really hard to delete stuff on windows, because it has a
+ // PROFOUNDLY annoying habit of not closing handles promptly when
+ // files are deleted, resulting in spurious ENOTEMPTY errors.
+ const startTime = Date.now()
+ do {
+ try {
+ const ret = options.rmdirSync(p, options)
+ return ret
+ } catch {}
+ } while (Date.now() - startTime < 500) // give up after 500ms
+ } else {
+ const ret = options.rmdirSync(p, options)
+ return ret
+ }
+}
+
+module.exports = rimraf
+rimraf.sync = rimrafSync
diff --git a/desktop/node_modules/@electron/notarize/node_modules/fs-extra/lib/util/stat.js b/desktop/node_modules/@electron/notarize/node_modules/fs-extra/lib/util/stat.js
new file mode 100644
index 0000000..0b1c1b0
--- /dev/null
+++ b/desktop/node_modules/@electron/notarize/node_modules/fs-extra/lib/util/stat.js
@@ -0,0 +1,139 @@
+'use strict'
+
+const fs = require('../fs')
+const path = require('path')
+const util = require('util')
+const atLeastNode = require('at-least-node')
+
+const nodeSupportsBigInt = atLeastNode('10.5.0')
+const stat = (file) => nodeSupportsBigInt ? fs.stat(file, { bigint: true }) : fs.stat(file)
+const statSync = (file) => nodeSupportsBigInt ? fs.statSync(file, { bigint: true }) : fs.statSync(file)
+
+function getStats (src, dest) {
+ return Promise.all([
+ stat(src),
+ stat(dest).catch(err => {
+ if (err.code === 'ENOENT') return null
+ throw err
+ })
+ ]).then(([srcStat, destStat]) => ({ srcStat, destStat }))
+}
+
+function getStatsSync (src, dest) {
+ let destStat
+ const srcStat = statSync(src)
+ try {
+ destStat = statSync(dest)
+ } catch (err) {
+ if (err.code === 'ENOENT') return { srcStat, destStat: null }
+ throw err
+ }
+ return { srcStat, destStat }
+}
+
+function checkPaths (src, dest, funcName, cb) {
+ util.callbackify(getStats)(src, dest, (err, stats) => {
+ if (err) return cb(err)
+ const { srcStat, destStat } = stats
+ if (destStat && areIdentical(srcStat, destStat)) {
+ return cb(new Error('Source and destination must not be the same.'))
+ }
+ if (srcStat.isDirectory() && isSrcSubdir(src, dest)) {
+ return cb(new Error(errMsg(src, dest, funcName)))
+ }
+ return cb(null, { srcStat, destStat })
+ })
+}
+
+function checkPathsSync (src, dest, funcName) {
+ const { srcStat, destStat } = getStatsSync(src, dest)
+ if (destStat && areIdentical(srcStat, destStat)) {
+ throw new Error('Source and destination must not be the same.')
+ }
+ if (srcStat.isDirectory() && isSrcSubdir(src, dest)) {
+ throw new Error(errMsg(src, dest, funcName))
+ }
+ return { srcStat, destStat }
+}
+
+// recursively check if dest parent is a subdirectory of src.
+// It works for all file types including symlinks since it
+// checks the src and dest inodes. It starts from the deepest
+// parent and stops once it reaches the src parent or the root path.
+function checkParentPaths (src, srcStat, dest, funcName, cb) {
+ const srcParent = path.resolve(path.dirname(src))
+ const destParent = path.resolve(path.dirname(dest))
+ if (destParent === srcParent || destParent === path.parse(destParent).root) return cb()
+ const callback = (err, destStat) => {
+ if (err) {
+ if (err.code === 'ENOENT') return cb()
+ return cb(err)
+ }
+ if (areIdentical(srcStat, destStat)) {
+ return cb(new Error(errMsg(src, dest, funcName)))
+ }
+ return checkParentPaths(src, srcStat, destParent, funcName, cb)
+ }
+ if (nodeSupportsBigInt) fs.stat(destParent, { bigint: true }, callback)
+ else fs.stat(destParent, callback)
+}
+
+function checkParentPathsSync (src, srcStat, dest, funcName) {
+ const srcParent = path.resolve(path.dirname(src))
+ const destParent = path.resolve(path.dirname(dest))
+ if (destParent === srcParent || destParent === path.parse(destParent).root) return
+ let destStat
+ try {
+ destStat = statSync(destParent)
+ } catch (err) {
+ if (err.code === 'ENOENT') return
+ throw err
+ }
+ if (areIdentical(srcStat, destStat)) {
+ throw new Error(errMsg(src, dest, funcName))
+ }
+ return checkParentPathsSync(src, srcStat, destParent, funcName)
+}
+
+function areIdentical (srcStat, destStat) {
+ if (destStat.ino && destStat.dev && destStat.ino === srcStat.ino && destStat.dev === srcStat.dev) {
+ if (nodeSupportsBigInt || destStat.ino < Number.MAX_SAFE_INTEGER) {
+ // definitive answer
+ return true
+ }
+ // Use additional heuristics if we can't use 'bigint'.
+ // Different 'ino' could be represented the same if they are >= Number.MAX_SAFE_INTEGER
+ // See issue 657
+ if (destStat.size === srcStat.size &&
+ destStat.mode === srcStat.mode &&
+ destStat.nlink === srcStat.nlink &&
+ destStat.atimeMs === srcStat.atimeMs &&
+ destStat.mtimeMs === srcStat.mtimeMs &&
+ destStat.ctimeMs === srcStat.ctimeMs &&
+ destStat.birthtimeMs === srcStat.birthtimeMs) {
+ // heuristic answer
+ return true
+ }
+ }
+ return false
+}
+
+// return true if dest is a subdir of src, otherwise false.
+// It only checks the path strings.
+function isSrcSubdir (src, dest) {
+ const srcArr = path.resolve(src).split(path.sep).filter(i => i)
+ const destArr = path.resolve(dest).split(path.sep).filter(i => i)
+ return srcArr.reduce((acc, cur, i) => acc && destArr[i] === cur, true)
+}
+
+function errMsg (src, dest, funcName) {
+ return `Cannot ${funcName} '${src}' to a subdirectory of itself, '${dest}'.`
+}
+
+module.exports = {
+ checkPaths,
+ checkPathsSync,
+ checkParentPaths,
+ checkParentPathsSync,
+ isSrcSubdir
+}
diff --git a/desktop/node_modules/@electron/notarize/node_modules/fs-extra/lib/util/utimes.js b/desktop/node_modules/@electron/notarize/node_modules/fs-extra/lib/util/utimes.js
new file mode 100644
index 0000000..75395de
--- /dev/null
+++ b/desktop/node_modules/@electron/notarize/node_modules/fs-extra/lib/util/utimes.js
@@ -0,0 +1,26 @@
+'use strict'
+
+const fs = require('graceful-fs')
+
+function utimesMillis (path, atime, mtime, callback) {
+ // if (!HAS_MILLIS_RES) return fs.utimes(path, atime, mtime, callback)
+ fs.open(path, 'r+', (err, fd) => {
+ if (err) return callback(err)
+ fs.futimes(fd, atime, mtime, futimesErr => {
+ fs.close(fd, closeErr => {
+ if (callback) callback(futimesErr || closeErr)
+ })
+ })
+ })
+}
+
+function utimesMillisSync (path, atime, mtime) {
+ const fd = fs.openSync(path, 'r+')
+ fs.futimesSync(fd, atime, mtime)
+ return fs.closeSync(fd)
+}
+
+module.exports = {
+ utimesMillis,
+ utimesMillisSync
+}
diff --git a/desktop/node_modules/@electron/notarize/node_modules/fs-extra/package.json b/desktop/node_modules/@electron/notarize/node_modules/fs-extra/package.json
new file mode 100644
index 0000000..6f7d8dd
--- /dev/null
+++ b/desktop/node_modules/@electron/notarize/node_modules/fs-extra/package.json
@@ -0,0 +1,70 @@
+{
+ "name": "fs-extra",
+ "version": "9.1.0",
+ "description": "fs-extra contains methods that aren't included in the vanilla Node.js fs package. Such as recursive mkdir, copy, and remove.",
+ "engines": {
+ "node": ">=10"
+ },
+ "homepage": "https://github.com/jprichardson/node-fs-extra",
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/jprichardson/node-fs-extra"
+ },
+ "keywords": [
+ "fs",
+ "file",
+ "file system",
+ "copy",
+ "directory",
+ "extra",
+ "mkdirp",
+ "mkdir",
+ "mkdirs",
+ "recursive",
+ "json",
+ "read",
+ "write",
+ "extra",
+ "delete",
+ "remove",
+ "touch",
+ "create",
+ "text",
+ "output",
+ "move",
+ "promise"
+ ],
+ "author": "JP Richardson <jprichardson@gmail.com>",
+ "license": "MIT",
+ "dependencies": {
+ "at-least-node": "^1.0.0",
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^6.0.1",
+ "universalify": "^2.0.0"
+ },
+ "devDependencies": {
+ "coveralls": "^3.0.0",
+ "klaw": "^2.1.1",
+ "klaw-sync": "^3.0.2",
+ "minimist": "^1.1.1",
+ "mocha": "^5.0.5",
+ "nyc": "^15.0.0",
+ "proxyquire": "^2.0.1",
+ "read-dir-files": "^0.1.1",
+ "standard": "^14.1.0"
+ },
+ "main": "./lib/index.js",
+ "files": [
+ "lib/",
+ "!lib/**/__tests__/"
+ ],
+ "scripts": {
+ "full-ci": "npm run lint && npm run coverage",
+ "coverage": "nyc -r lcovonly npm run unit",
+ "coveralls": "coveralls < coverage/lcov.info",
+ "lint": "standard",
+ "test-find": "find ./lib/**/__tests__ -name *.test.js | xargs mocha",
+ "test": "npm run lint && npm run unit",
+ "unit": "node test.js"
+ }
+}
diff --git a/desktop/node_modules/@electron/notarize/node_modules/jsonfile/CHANGELOG.md b/desktop/node_modules/@electron/notarize/node_modules/jsonfile/CHANGELOG.md
new file mode 100644
index 0000000..d772e43
--- /dev/null
+++ b/desktop/node_modules/@electron/notarize/node_modules/jsonfile/CHANGELOG.md
@@ -0,0 +1,171 @@
+6.1.0 / 2020-10-31
+------------------
+
+- Add `finalEOL` option to disable writing final EOL ([#115](https://github.com/jprichardson/node-jsonfile/issues/115), [#137](https://github.com/jprichardson/node-jsonfile/pull/137))
+- Update dependency ([#138](https://github.com/jprichardson/node-jsonfile/pull/138))
+
+6.0.1 / 2020-03-07
+------------------
+
+- Update dependency ([#130](https://github.com/jprichardson/node-jsonfile/pull/130))
+- Fix code style ([#129](https://github.com/jprichardson/node-jsonfile/pull/129))
+
+6.0.0 / 2020-02-24
+------------------
+
+- **BREAKING:** Drop support for Node 6 & 8 ([#128](https://github.com/jprichardson/node-jsonfile/pull/128))
+- **BREAKING:** Do not allow passing `null` as options to `readFile()` or `writeFile()` ([#128](https://github.com/jprichardson/node-jsonfile/pull/128))
+- Refactor internals ([#128](https://github.com/jprichardson/node-jsonfile/pull/128))
+
+5.0.0 / 2018-09-08
+------------------
+
+- **BREAKING:** Drop Node 4 support
+- **BREAKING:** If no callback is passed to an asynchronous method, a promise is now returned ([#109](https://github.com/jprichardson/node-jsonfile/pull/109))
+- Cleanup docs
+
+4.0.0 / 2017-07-12
+------------------
+
+- **BREAKING:** Remove global `spaces` option.
+- **BREAKING:** Drop support for Node 0.10, 0.12, and io.js.
+- Remove undocumented `passParsingErrors` option.
+- Added `EOL` override option to `writeFile` when using `spaces`. [#89]
+
+3.0.1 / 2017-07-05
+------------------
+
+- Fixed bug in `writeFile` when there was a serialization error & no callback was passed. In previous versions, an empty file would be written; now no file is written.
+
+3.0.0 / 2017-04-25
+------------------
+
+- Changed behavior of `throws` option for `readFileSync`; now does not throw filesystem errors when `throws` is `false`
+
+2.4.0 / 2016-09-15
+------------------
+### Changed
+- added optional support for `graceful-fs` [#62]
+
+2.3.1 / 2016-05-13
+------------------
+- fix to support BOM. [#45][#45]
+
+2.3.0 / 2016-04-16
+------------------
+- add `throws` to `readFile()`. See [#39][#39]
+- add support for any arbitrary `fs` module. Useful with [mock-fs](https://www.npmjs.com/package/mock-fs)
+
+2.2.3 / 2015-10-14
+------------------
+- include file name in parse error. See: https://github.com/jprichardson/node-jsonfile/pull/34
+
+2.2.2 / 2015-09-16
+------------------
+- split out tests into separate files
+- fixed `throws` when set to `true` in `readFileSync()`. See: https://github.com/jprichardson/node-jsonfile/pull/33
+
+2.2.1 / 2015-06-25
+------------------
+- fixed regression when passing in string as encoding for options in `writeFile()` and `writeFileSync()`. See: https://github.com/jprichardson/node-jsonfile/issues/28
+
+2.2.0 / 2015-06-25
+------------------
+- added `options.spaces` to `writeFile()` and `writeFileSync()`
+
+2.1.2 / 2015-06-22
+------------------
+- fixed if passed `readFileSync(file, 'utf8')`. See: https://github.com/jprichardson/node-jsonfile/issues/25
+
+2.1.1 / 2015-06-19
+------------------
+- fixed regressions if `null` is passed for options. See: https://github.com/jprichardson/node-jsonfile/issues/24
+
+2.1.0 / 2015-06-19
+------------------
+- cleanup: JavaScript Standard Style, rename files, dropped terst for assert
+- methods now support JSON revivers/replacers
+
+2.0.1 / 2015-05-24
+------------------
+- update license attribute https://github.com/jprichardson/node-jsonfile/pull/21
+
+2.0.0 / 2014-07-28
+------------------
+* added `\n` to end of file on write. [#14](https://github.com/jprichardson/node-jsonfile/pull/14)
+* added `options.throws` to `readFileSync()`
+* dropped support for Node v0.8
+
+1.2.0 / 2014-06-29
+------------------
+* removed semicolons
+* bugfix: passed `options` to `fs.readFile` and `fs.readFileSync`. This technically changes behavior, but
+changes it according to docs. [#12][#12]
+
+1.1.1 / 2013-11-11
+------------------
+* fixed catching of callback bug (ffissore / #5)
+
+1.1.0 / 2013-10-11
+------------------
+* added `options` param to methods, (seanodell / #4)
+
+1.0.1 / 2013-09-05
+------------------
+* removed `homepage` field from package.json to remove NPM warning
+
+1.0.0 / 2013-06-28
+------------------
+* added `.npmignore`, #1
+* changed spacing default from `4` to `2` to follow Node conventions
+
+0.0.1 / 2012-09-10
+------------------
+* Initial release.
+
+[#89]: https://github.com/jprichardson/node-jsonfile/pull/89
+[#45]: https://github.com/jprichardson/node-jsonfile/issues/45 "Reading of UTF8-encoded (w/ BOM) files fails"
+[#44]: https://github.com/jprichardson/node-jsonfile/issues/44 "Extra characters in written file"
+[#43]: https://github.com/jprichardson/node-jsonfile/issues/43 "Prettyfy json when written to file"
+[#42]: https://github.com/jprichardson/node-jsonfile/pull/42 "Moved fs.readFileSync within the try/catch"
+[#41]: https://github.com/jprichardson/node-jsonfile/issues/41 "Linux: Hidden file not working"
+[#40]: https://github.com/jprichardson/node-jsonfile/issues/40 "autocreate folder doesn't work from Path-value"
+[#39]: https://github.com/jprichardson/node-jsonfile/pull/39 "Add `throws` option for readFile (async)"
+[#38]: https://github.com/jprichardson/node-jsonfile/pull/38 "Update README.md writeFile[Sync] signature"
+[#37]: https://github.com/jprichardson/node-jsonfile/pull/37 "support append file"
+[#36]: https://github.com/jprichardson/node-jsonfile/pull/36 "Add typescript definition file."
+[#35]: https://github.com/jprichardson/node-jsonfile/pull/35 "Add typescript definition file."
+[#34]: https://github.com/jprichardson/node-jsonfile/pull/34 "readFile JSON parse error includes filename"
+[#33]: https://github.com/jprichardson/node-jsonfile/pull/33 "fix throw->throws typo in readFileSync()"
+[#32]: https://github.com/jprichardson/node-jsonfile/issues/32 "readFile & readFileSync can possible have strip-comments as an option?"
+[#31]: https://github.com/jprichardson/node-jsonfile/pull/31 "[Modify] Support string include is unicode escape string"
+[#30]: https://github.com/jprichardson/node-jsonfile/issues/30 "How to use Jsonfile package in Meteor.js App?"
+[#29]: https://github.com/jprichardson/node-jsonfile/issues/29 "writefile callback if no error?"
+[#28]: https://github.com/jprichardson/node-jsonfile/issues/28 "writeFile options argument broken "
+[#27]: https://github.com/jprichardson/node-jsonfile/pull/27 "Use svg instead of png to get better image quality"
+[#26]: https://github.com/jprichardson/node-jsonfile/issues/26 "Breaking change to fs-extra"
+[#25]: https://github.com/jprichardson/node-jsonfile/issues/25 "support string encoding param for read methods"
+[#24]: https://github.com/jprichardson/node-jsonfile/issues/24 "readFile: Passing in null options with a callback throws an error"
+[#23]: https://github.com/jprichardson/node-jsonfile/pull/23 "Add appendFile and appendFileSync"
+[#22]: https://github.com/jprichardson/node-jsonfile/issues/22 "Default value for spaces in readme.md is outdated"
+[#21]: https://github.com/jprichardson/node-jsonfile/pull/21 "Update license attribute"
+[#20]: https://github.com/jprichardson/node-jsonfile/issues/20 "Add simple caching functionallity"
+[#19]: https://github.com/jprichardson/node-jsonfile/pull/19 "Add appendFileSync method"
+[#18]: https://github.com/jprichardson/node-jsonfile/issues/18 "Add updateFile and updateFileSync methods"
+[#17]: https://github.com/jprichardson/node-jsonfile/issues/17 "seem read & write sync has sequentially problem"
+[#16]: https://github.com/jprichardson/node-jsonfile/pull/16 "export spaces defaulted to null"
+[#15]: https://github.com/jprichardson/node-jsonfile/issues/15 "`jsonfile.spaces` should default to `null`"
+[#14]: https://github.com/jprichardson/node-jsonfile/pull/14 "Add EOL at EOF"
+[#13]: https://github.com/jprichardson/node-jsonfile/issues/13 "Add a final newline"
+[#12]: https://github.com/jprichardson/node-jsonfile/issues/12 "readFile doesn't accept options"
+[#11]: https://github.com/jprichardson/node-jsonfile/pull/11 "Added try,catch to readFileSync"
+[#10]: https://github.com/jprichardson/node-jsonfile/issues/10 "No output or error from writeFile"
+[#9]: https://github.com/jprichardson/node-jsonfile/pull/9 "Change 'js' to 'jf' in example."
+[#8]: https://github.com/jprichardson/node-jsonfile/pull/8 "Updated forgotten module.exports to me."
+[#7]: https://github.com/jprichardson/node-jsonfile/pull/7 "Add file name in error message"
+[#6]: https://github.com/jprichardson/node-jsonfile/pull/6 "Use graceful-fs when possible"
+[#5]: https://github.com/jprichardson/node-jsonfile/pull/5 "Jsonfile doesn't behave nicely when used inside a test suite."
+[#4]: https://github.com/jprichardson/node-jsonfile/pull/4 "Added options parameter to writeFile and writeFileSync"
+[#3]: https://github.com/jprichardson/node-jsonfile/issues/3 "test2"
+[#2]: https://github.com/jprichardson/node-jsonfile/issues/2 "homepage field must be a string url. Deleted."
+[#1]: https://github.com/jprichardson/node-jsonfile/pull/1 "adding an `.npmignore` file"
diff --git a/desktop/node_modules/@electron/notarize/node_modules/jsonfile/LICENSE b/desktop/node_modules/@electron/notarize/node_modules/jsonfile/LICENSE
new file mode 100644
index 0000000..cb7e807
--- /dev/null
+++ b/desktop/node_modules/@electron/notarize/node_modules/jsonfile/LICENSE
@@ -0,0 +1,15 @@
+(The MIT License)
+
+Copyright (c) 2012-2015, JP Richardson <jprichardson@gmail.com>
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files
+(the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify,
+ merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
+ furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS
+OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/desktop/node_modules/@electron/notarize/node_modules/jsonfile/README.md b/desktop/node_modules/@electron/notarize/node_modules/jsonfile/README.md
new file mode 100644
index 0000000..910cde0
--- /dev/null
+++ b/desktop/node_modules/@electron/notarize/node_modules/jsonfile/README.md
@@ -0,0 +1,230 @@
+Node.js - jsonfile
+================
+
+Easily read/write JSON files in Node.js. _Note: this module cannot be used in the browser._
+
+[![npm Package](https://img.shields.io/npm/v/jsonfile.svg?style=flat-square)](https://www.npmjs.org/package/jsonfile)
+[![build status](https://secure.travis-ci.org/jprichardson/node-jsonfile.svg)](http://travis-ci.org/jprichardson/node-jsonfile)
+[![windows Build status](https://img.shields.io/appveyor/ci/jprichardson/node-jsonfile/master.svg?label=windows%20build)](https://ci.appveyor.com/project/jprichardson/node-jsonfile/branch/master)
+
+<a href="https://github.com/feross/standard"><img src="https://cdn.rawgit.com/feross/standard/master/sticker.svg" alt="Standard JavaScript" width="100"></a>
+
+Why?
+----
+
+Writing `JSON.stringify()` and then `fs.writeFile()` and `JSON.parse()` with `fs.readFile()` enclosed in `try/catch` blocks became annoying.
+
+
+
+Installation
+------------
+
+ npm install --save jsonfile
+
+
+
+API
+---
+
+* [`readFile(filename, [options], callback)`](#readfilefilename-options-callback)
+* [`readFileSync(filename, [options])`](#readfilesyncfilename-options)
+* [`writeFile(filename, obj, [options], callback)`](#writefilefilename-obj-options-callback)
+* [`writeFileSync(filename, obj, [options])`](#writefilesyncfilename-obj-options)
+
+----
+
+### readFile(filename, [options], callback)
+
+`options` (`object`, default `undefined`): Pass in any [`fs.readFile`](https://nodejs.org/api/fs.html#fs_fs_readfile_path_options_callback) options or set `reviver` for a [JSON reviver](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/parse).
+ - `throws` (`boolean`, default: `true`). If `JSON.parse` throws an error, pass this error to the callback.
+ If `false`, returns `null` for the object.
+
+
+```js
+const jsonfile = require('jsonfile')
+const file = '/tmp/data.json'
+jsonfile.readFile(file, function (err, obj) {
+ if (err) console.error(err)
+ console.dir(obj)
+})
+```
+
+You can also use this method with promises. The `readFile` method will return a promise if you do not pass a callback function.
+
+```js
+const jsonfile = require('jsonfile')
+const file = '/tmp/data.json'
+jsonfile.readFile(file)
+ .then(obj => console.dir(obj))
+ .catch(error => console.error(error))
+```
+
+----
+
+### readFileSync(filename, [options])
+
+`options` (`object`, default `undefined`): Pass in any [`fs.readFileSync`](https://nodejs.org/api/fs.html#fs_fs_readfilesync_path_options) options or set `reviver` for a [JSON reviver](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/parse).
+- `throws` (`boolean`, default: `true`). If an error is encountered reading or parsing the file, throw the error. If `false`, returns `null` for the object.
+
+```js
+const jsonfile = require('jsonfile')
+const file = '/tmp/data.json'
+
+console.dir(jsonfile.readFileSync(file))
+```
+
+----
+
+### writeFile(filename, obj, [options], callback)
+
+`options`: Pass in any [`fs.writeFile`](https://nodejs.org/api/fs.html#fs_fs_writefile_file_data_options_callback) options or set `replacer` for a [JSON replacer](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify). Can also pass in `spaces`, or override `EOL` string or set `finalEOL` flag as `false` to not save the file with `EOL` at the end.
+
+
+```js
+const jsonfile = require('jsonfile')
+
+const file = '/tmp/data.json'
+const obj = { name: 'JP' }
+
+jsonfile.writeFile(file, obj, function (err) {
+ if (err) console.error(err)
+})
+```
+Or use with promises as follows:
+
+```js
+const jsonfile = require('jsonfile')
+
+const file = '/tmp/data.json'
+const obj = { name: 'JP' }
+
+jsonfile.writeFile(file, obj)
+ .then(res => {
+ console.log('Write complete')
+ })
+ .catch(error => console.error(error))
+```
+
+
+**formatting with spaces:**
+
+```js
+const jsonfile = require('jsonfile')
+
+const file = '/tmp/data.json'
+const obj = { name: 'JP' }
+
+jsonfile.writeFile(file, obj, { spaces: 2 }, function (err) {
+ if (err) console.error(err)
+})
+```
+
+**overriding EOL:**
+
+```js
+const jsonfile = require('jsonfile')
+
+const file = '/tmp/data.json'
+const obj = { name: 'JP' }
+
+jsonfile.writeFile(file, obj, { spaces: 2, EOL: '\r\n' }, function (err) {
+ if (err) console.error(err)
+})
+```
+
+
+**disabling the EOL at the end of file:**
+
+```js
+const jsonfile = require('jsonfile')
+
+const file = '/tmp/data.json'
+const obj = { name: 'JP' }
+
+jsonfile.writeFile(file, obj, { spaces: 2, finalEOL: false }, function (err) {
+ if (err) console.log(err)
+})
+```
+
+**appending to an existing JSON file:**
+
+You can use `fs.writeFile` option `{ flag: 'a' }` to achieve this.
+
+```js
+const jsonfile = require('jsonfile')
+
+const file = '/tmp/mayAlreadyExistedData.json'
+const obj = { name: 'JP' }
+
+jsonfile.writeFile(file, obj, { flag: 'a' }, function (err) {
+ if (err) console.error(err)
+})
+```
+
+----
+
+### writeFileSync(filename, obj, [options])
+
+`options`: Pass in any [`fs.writeFileSync`](https://nodejs.org/api/fs.html#fs_fs_writefilesync_file_data_options) options or set `replacer` for a [JSON replacer](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify). Can also pass in `spaces`, or override `EOL` string or set `finalEOL` flag as `false` to not save the file with `EOL` at the end.
+
+```js
+const jsonfile = require('jsonfile')
+
+const file = '/tmp/data.json'
+const obj = { name: 'JP' }
+
+jsonfile.writeFileSync(file, obj)
+```
+
+**formatting with spaces:**
+
+```js
+const jsonfile = require('jsonfile')
+
+const file = '/tmp/data.json'
+const obj = { name: 'JP' }
+
+jsonfile.writeFileSync(file, obj, { spaces: 2 })
+```
+
+**overriding EOL:**
+
+```js
+const jsonfile = require('jsonfile')
+
+const file = '/tmp/data.json'
+const obj = { name: 'JP' }
+
+jsonfile.writeFileSync(file, obj, { spaces: 2, EOL: '\r\n' })
+```
+
+**disabling the EOL at the end of file:**
+
+```js
+const jsonfile = require('jsonfile')
+
+const file = '/tmp/data.json'
+const obj = { name: 'JP' }
+
+jsonfile.writeFileSync(file, obj, { spaces: 2, finalEOL: false })
+```
+
+**appending to an existing JSON file:**
+
+You can use `fs.writeFileSync` option `{ flag: 'a' }` to achieve this.
+
+```js
+const jsonfile = require('jsonfile')
+
+const file = '/tmp/mayAlreadyExistedData.json'
+const obj = { name: 'JP' }
+
+jsonfile.writeFileSync(file, obj, { flag: 'a' })
+```
+
+License
+-------
+
+(MIT License)
+
+Copyright 2012-2016, JP Richardson <jprichardson@gmail.com>
diff --git a/desktop/node_modules/@electron/notarize/node_modules/jsonfile/index.js b/desktop/node_modules/@electron/notarize/node_modules/jsonfile/index.js
new file mode 100644
index 0000000..0582868
--- /dev/null
+++ b/desktop/node_modules/@electron/notarize/node_modules/jsonfile/index.js
@@ -0,0 +1,88 @@
+let _fs
+try {
+ _fs = require('graceful-fs')
+} catch (_) {
+ _fs = require('fs')
+}
+const universalify = require('universalify')
+const { stringify, stripBom } = require('./utils')
+
+async function _readFile (file, options = {}) {
+ if (typeof options === 'string') {
+ options = { encoding: options }
+ }
+
+ const fs = options.fs || _fs
+
+ const shouldThrow = 'throws' in options ? options.throws : true
+
+ let data = await universalify.fromCallback(fs.readFile)(file, options)
+
+ data = stripBom(data)
+
+ let obj
+ try {
+ obj = JSON.parse(data, options ? options.reviver : null)
+ } catch (err) {
+ if (shouldThrow) {
+ err.message = `${file}: ${err.message}`
+ throw err
+ } else {
+ return null
+ }
+ }
+
+ return obj
+}
+
+const readFile = universalify.fromPromise(_readFile)
+
+function readFileSync (file, options = {}) {
+ if (typeof options === 'string') {
+ options = { encoding: options }
+ }
+
+ const fs = options.fs || _fs
+
+ const shouldThrow = 'throws' in options ? options.throws : true
+
+ try {
+ let content = fs.readFileSync(file, options)
+ content = stripBom(content)
+ return JSON.parse(content, options.reviver)
+ } catch (err) {
+ if (shouldThrow) {
+ err.message = `${file}: ${err.message}`
+ throw err
+ } else {
+ return null
+ }
+ }
+}
+
+async function _writeFile (file, obj, options = {}) {
+ const fs = options.fs || _fs
+
+ const str = stringify(obj, options)
+
+ await universalify.fromCallback(fs.writeFile)(file, str, options)
+}
+
+const writeFile = universalify.fromPromise(_writeFile)
+
+function writeFileSync (file, obj, options = {}) {
+ const fs = options.fs || _fs
+
+ const str = stringify(obj, options)
+ // not sure if fs.writeFileSync returns anything, but just in case
+ return fs.writeFileSync(file, str, options)
+}
+
+const jsonfile = {
+ readFile,
+ readFileSync,
+ writeFile,
+ writeFileSync
+}
+
+module.exports = jsonfile
diff --git a/desktop/node_modules/@electron/notarize/node_modules/jsonfile/package.json b/desktop/node_modules/@electron/notarize/node_modules/jsonfile/package.json
new file mode 100644
index 0000000..4d01eb1
--- /dev/null
+++ b/desktop/node_modules/@electron/notarize/node_modules/jsonfile/package.json
@@ -0,0 +1,40 @@
+{
+ "name": "jsonfile",
+ "version": "6.1.0",
+ "description": "Easily read/write JSON files.",
+ "repository": {
+ "type": "git",
+ "url": "git@github.com:jprichardson/node-jsonfile.git"
+ },
+ "keywords": [
+ "read",
+ "write",
+ "file",
+ "json",
+ "fs",
+ "fs-extra"
+ ],
+ "author": "JP Richardson <jprichardson@gmail.com>",
+ "license": "MIT",
+ "dependencies": {
+ "universalify": "^2.0.0"
+ },
+ "optionalDependencies": {
+ "graceful-fs": "^4.1.6"
+ },
+ "devDependencies": {
+ "mocha": "^8.2.0",
+ "rimraf": "^2.4.0",
+ "standard": "^16.0.1"
+ },
+ "main": "index.js",
+ "files": [
+ "index.js",
+ "utils.js"
+ ],
+ "scripts": {
+ "lint": "standard",
+ "test": "npm run lint && npm run unit",
+ "unit": "mocha"
+ }
+}
diff --git a/desktop/node_modules/@electron/notarize/node_modules/jsonfile/utils.js b/desktop/node_modules/@electron/notarize/node_modules/jsonfile/utils.js
new file mode 100644
index 0000000..b5ff48e
--- /dev/null
+++ b/desktop/node_modules/@electron/notarize/node_modules/jsonfile/utils.js
@@ -0,0 +1,14 @@
+function stringify (obj, { EOL = '\n', finalEOL = true, replacer = null, spaces } = {}) {
+ const EOF = finalEOL ? EOL : ''
+ const str = JSON.stringify(obj, replacer, spaces)
+
+ return str.replace(/\n/g, EOL) + EOF
+}
+
+function stripBom (content) {
+ // we do this because JSON.parse would convert it to a utf8 string if encoding wasn't specified
+ if (Buffer.isBuffer(content)) content = content.toString('utf8')
+ return content.replace(/^\uFEFF/, '')
+}
+
+module.exports = { stringify, stripBom }
diff --git a/desktop/node_modules/@electron/notarize/node_modules/universalify/LICENSE b/desktop/node_modules/@electron/notarize/node_modules/universalify/LICENSE
new file mode 100644
index 0000000..514e84e
--- /dev/null
+++ b/desktop/node_modules/@electron/notarize/node_modules/universalify/LICENSE
@@ -0,0 +1,20 @@
+(The MIT License)
+
+Copyright (c) 2017, Ryan Zimmerman <opensrc@ryanzim.com>
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the 'Software'), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software is furnished to do so,
+subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/desktop/node_modules/@electron/notarize/node_modules/universalify/README.md b/desktop/node_modules/@electron/notarize/node_modules/universalify/README.md
new file mode 100644
index 0000000..aa12474
--- /dev/null
+++ b/desktop/node_modules/@electron/notarize/node_modules/universalify/README.md
@@ -0,0 +1,76 @@
+# universalify
+
+[![Travis branch](https://img.shields.io/travis/RyanZim/universalify/master.svg)](https://travis-ci.org/RyanZim/universalify)
+![Coveralls github branch](https://img.shields.io/coveralls/github/RyanZim/universalify/master.svg)
+![npm](https://img.shields.io/npm/dm/universalify.svg)
+![npm](https://img.shields.io/npm/l/universalify.svg)
+
+Make a callback- or promise-based function support both promises and callbacks.
+
+Uses the native promise implementation.
+
+## Installation
+
+```bash
+npm install universalify
+```
+
+## API
+
+### `universalify.fromCallback(fn)`
+
+Takes a callback-based function to universalify, and returns the universalified function.
+
+Function must take a callback as the last parameter that will be called with the signature `(error, result)`. `universalify` does not support calling the callback with three or more arguments, and does not ensure that the callback is only called once.
+
+```js
+function callbackFn (n, cb) {
+ setTimeout(() => cb(null, n), 15)
+}
+
+const fn = universalify.fromCallback(callbackFn)
+
+// Works with Promises:
+fn('Hello World!')
+.then(result => console.log(result)) // -> Hello World!
+.catch(error => console.error(error))
+
+// Works with Callbacks:
+fn('Hi!', (error, result) => {
+ if (error) return console.error(error)
+ console.log(result)
+ // -> Hi!
+})
+```
+
+### `universalify.fromPromise(fn)`
+
+Takes a promise-based function to universalify, and returns the universalified function.
+
+Function must return a valid JS promise. `universalify` does not ensure that a valid promise is returned.
+
+```js
+function promiseFn (n) {
+ return new Promise(resolve => {
+ setTimeout(() => resolve(n), 15)
+ })
+}
+
+const fn = universalify.fromPromise(promiseFn)
+
+// Works with Promises:
+fn('Hello World!')
+.then(result => console.log(result)) // -> Hello World!
+.catch(error => console.error(error))
+
+// Works with Callbacks:
+fn('Hi!', (error, result) => {
+ if (error) return console.error(error)
+ console.log(result)
+ // -> Hi!
+})
+```
+
+## License
+
+MIT
diff --git a/desktop/node_modules/@electron/notarize/node_modules/universalify/index.js b/desktop/node_modules/@electron/notarize/node_modules/universalify/index.js
new file mode 100644
index 0000000..ba6c662
--- /dev/null
+++ b/desktop/node_modules/@electron/notarize/node_modules/universalify/index.js
@@ -0,0 +1,24 @@
+'use strict'
+
+exports.fromCallback = function (fn) {
+ return Object.defineProperty(function (...args) {
+ if (typeof args[args.length - 1] === 'function') fn.apply(this, args)
+ else {
+ return new Promise((resolve, reject) => {
+ fn.call(
+ this,
+ ...args,
+ (err, res) => (err != null) ? reject(err) : resolve(res)
+ )
+ })
+ }
+ }, 'name', { value: fn.name })
+}
+
+exports.fromPromise = function (fn) {
+ return Object.defineProperty(function (...args) {
+ const cb = args[args.length - 1]
+ if (typeof cb !== 'function') return fn.apply(this, args)
+ else fn.apply(this, args.slice(0, -1)).then(r => cb(null, r), cb)
+ }, 'name', { value: fn.name })
+}
diff --git a/desktop/node_modules/@electron/notarize/node_modules/universalify/package.json b/desktop/node_modules/@electron/notarize/node_modules/universalify/package.json
new file mode 100644
index 0000000..006d4cc
--- /dev/null
+++ b/desktop/node_modules/@electron/notarize/node_modules/universalify/package.json
@@ -0,0 +1,34 @@
+{
+ "name": "universalify",
+ "version": "2.0.0",
+ "description": "Make a callback- or promise-based function support both promises and callbacks.",
+ "keywords": [
+ "callback",
+ "native",
+ "promise"
+ ],
+ "homepage": "https://github.com/RyanZim/universalify#readme",
+ "bugs": "https://github.com/RyanZim/universalify/issues",
+ "license": "MIT",
+ "author": "Ryan Zimmerman <opensrc@ryanzim.com>",
+ "files": [
+ "index.js"
+ ],
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/RyanZim/universalify.git"
+ },
+ "scripts": {
+ "test": "standard && nyc tape test/*.js | colortape"
+ },
+ "devDependencies": {
+ "colortape": "^0.1.2",
+ "coveralls": "^3.0.1",
+ "nyc": "^15.0.0",
+ "standard": "^14.3.1",
+ "tape": "^5.0.1"
+ },
+ "engines": {
+ "node": ">= 10.0.0"
+ }
+}
diff --git a/desktop/node_modules/@electron/notarize/package.json b/desktop/node_modules/@electron/notarize/package.json
new file mode 100644
index 0000000..5eda69a
--- /dev/null
+++ b/desktop/node_modules/@electron/notarize/package.json
@@ -0,0 +1,44 @@
+{
+ "name": "@electron/notarize",
+ "version": "1.2.4",
+ "description": "Notarize your Electron app",
+ "main": "lib/index.js",
+ "typings": "lib/index.d.ts",
+ "author": "Samuel Attard",
+ "license": "MIT",
+ "homepage": "https://github.com/electron/notarize#readme",
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/electron/notarize.git"
+ },
+ "bugs": {
+ "url": "https://github.com/electron/notarize/issues"
+ },
+ "scripts": {
+ "build": "tsc",
+ "lint": "prettier --check \"src/**/*.ts\"",
+ "prepare": "yarn build",
+ "test": "jest"
+ },
+ "files": [
+ "lib"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "devDependencies": {
+ "@continuous-auth/semantic-release-npm": "^3.0.0",
+ "@types/debug": "^4.1.5",
+ "@types/fs-extra": "^9.0.1",
+ "@types/jest": "^29.0.0",
+ "@types/node": "^13.7.7",
+ "jest": "^29.0.0",
+ "prettier": "^1.18.2",
+ "ts-jest": "^29.0.0",
+ "typescript": "^4.8.4"
+ },
+ "dependencies": {
+ "debug": "^4.1.1",
+ "fs-extra": "^9.0.1"
+ }
+}
diff --git a/desktop/node_modules/@electron/osx-sign/LICENSE b/desktop/node_modules/@electron/osx-sign/LICENSE
new file mode 100644
index 0000000..740ca28
--- /dev/null
+++ b/desktop/node_modules/@electron/osx-sign/LICENSE
@@ -0,0 +1,24 @@
+Copyright (c) Electron contributors
+Copyright (c) 2015-2016 Zhuo Lu, Jason Hinkle, et al.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+* Redistributions of source code must retain the above copyright notice, this
+ list of conditions and the following disclaimer.
+
+* 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.
+
+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.
diff --git a/desktop/node_modules/@electron/osx-sign/README.md b/desktop/node_modules/@electron/osx-sign/README.md
new file mode 100644
index 0000000..d13feb6
--- /dev/null
+++ b/desktop/node_modules/@electron/osx-sign/README.md
@@ -0,0 +1,322 @@
+# @electron/osx-sign [![npm][npm_img]][npm_url] [![Build Status][circleci_img]][circleci_url]
+
+Codesign Electron macOS apps
+
+## About
+
+[`@electron/osx-sign`][electron-osx-sign] minimizes the extra work needed to eventually prepare your apps for shipping, providing the most basic tools and assets. Note that the bare necessities here are sufficient for enabling app sandbox, yet other configurations for network access etc. require additional work.
+
+*NB: Since [`@electron/osx-sign`][electron-osx-sign] injects the entry `com.apple.security.application-groups` into the entitlements file as part of the pre-signing process, this would reportedly limit app transfer on iTunes Connect (see [#150](https://github.com/electron/osx-sign/issues/150)). However, opting out entitlements automation `opts['preAutoEntitlements'] === false` may result in worse graphics performance.*
+
+*The signing procedure implemented in this package is based on what described in [Code Signing Guide](https://github.com/electron/electron/blob/main/docs/tutorial/code-signing.md).*
+
+## Installation
+
+```sh
+# For use in npm scripts
+npm install --save @electron/osx-sign
+# yarn
+yarn add @electron/osx-sign
+```
+
+```sh
+# For use from CLI
+npm install -g @electron/osx-sign
+# Yarn
+yarn global add @electron/osx-sign
+```
+
+*Note: `@electron/osx-sign` is a dependency of [`electron-packager`](https://github.com/electron/electron-packager) as of 6.0.0 for signing apps on macOS. However, feel free to install this package globally for more customization beyond specifying identity and entitlements.*
+
+## Usage
+
+### Code Signing
+
+#### From the API
+
+```javascript
+const { signAsync } = require('@electron/osx-sign')
+signAsync({
+ app: 'path/to/my.app'
+})
+ .then(function () {
+ // Application signed
+ })
+ .catch(function (err) {
+ // Handle the error
+ })
+```
+
+###### opts - Options
+
+**Required**
+
+`app` - *String*
+
+Path to the application package.
+Needs file extension `.app`.
+
+**Optional**
+
+`binaries` - *Array*
+
+Path to additional binaries that will be signed along with built-ins of Electron.
+Default to `undefined`.
+
+`optionsForFile` - *Function*
+
+Function that receives the path to a file and can return the entitlements to use for that file to override the default behavior. The
+object this function returns can include any of the following optional keys.
+
+| Option | Description | Usage Example |
+|-------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------|
+| `entitlements` | String specifying the path to an `entitlements.plist` file. Will default to built-in entitlements files. Can also be an array of entitlement keys that osx-sign will write to an entitlements file for you. | `'path/to/entitlements'` |
+| `hardenedRuntime` | Boolean flag to enable the Hardened Runtime when signing the app. Enabled by default. | `false` |
+| `requirements` | String specifying the [requirements](https://developer.apple.com/library/mac/documentation/Security/Conceptual/CodeSigningGuide/RequirementLang/RequirementLang.html) that you recommend to be used to evaluate the code signature. | `'anchor apple or anchor = "/var/db/yourcorporateanchor.cert"'` |
+| `signatureFlags` | List of [code signature flags](https://developer.apple.com/documentation/security/seccodesignatureflags?language=objc). Accepts an array of strings or a comma-separated string. | `['kSecCodeSignatureRestrict']` |
+| `timestamp` | String specifying the URL of the timestamp authority server. Defaults to the server provided by Apple. Please note that this default server may not support signatures not furnished by Apple. Disable the timestamp service with `none`. | `'https://different.timeserver'` |
+
+**Note:** Only available via the JS API
+
+`identity` - *String*
+
+Name of certificate to use when signing.
+Default to be selected with respect to `provisioning-profile` and `platform` from `keychain` or keychain by system default.
+
+Signing platform `mas` will look for `3rd Party Mac Developer Application: * (*)`, and platform `darwin` will look for `Developer ID Application: * (*)` by default.
+
+`identityValidation` - *Boolean*
+
+Flag to enable/disable validation for the signing identity. If enabled, the `identity` provided will be validated in the `keychain` specified.
+Default to `true`.
+
+`keychain` - *String*
+
+The keychain name.
+Default to system default keychain.
+
+`ignore` - *RegExp|Function|Array.<(RegExp|Function)>*
+
+Regex, function or an array of regex's and functions that signal skipping signing a file.
+Elements of other types are treated as `RegExp`.
+Default to `undefined`.
+
+`platform` - *String*
+
+Build platform of Electron.
+Allowed values: `darwin`, `mas`.
+Default to auto detect by presence of `Squirrel.framework` within the application bundle.
+
+`preAutoEntitlements` - *Boolean*
+
+Flag to enable/disable automation of `com.apple.security.application-groups` in entitlements file and update `Info.plist` with `ElectronTeamID`.
+Default to `true`.
+
+`preEmbedProvisioningProfile` - *Boolean*
+
+Flag to enable/disable embedding of provisioning profile in the current working directory.
+Default to `true`.
+
+`provisioningProfile` - *String*
+
+Path to provisioning profile.
+
+`strictVerify` - *Boolean|String|Array.<String>*
+
+Flag to enable/disable `--strict` flag when verifying the signed application bundle.
+If provided as a string, each component should be separated with comma (`,`).
+If provided as an array, each item should be a string corresponding to a component.
+Default to `true`.
+
+`type` - *String*
+
+Specify whether to sign app for development or for distribution.
+Allowed values: `development`, `distribution`.
+Default to `distribution`.
+
+`version` - *String*
+
+Build version of Electron.
+Values may be like: `1.1.1`, `1.2.0`.
+Default to latest Electron version.
+
+It is recommended to utilize this option for best support of specific Electron versions. This may trigger pre/post operations for signing: For example, automation of setting `com.apple.security.application-groups` in entitlements file and of updating `Info.plist` with `ElectronTeamID` is enabled for all versions starting from `1.1.1`; set `preAutoEntitlements` option to `false` to disable this feature.
+
+#### From the Command Line
+
+```sh
+electron-osx-sign app [embedded-binary ...] [options ...]
+```
+
+##### Examples
+
+Since `electron-osx-sign` adds the entry `com.apple.developer.team-identifier` to a temporary copy of the specified entitlements file (with the default option `--pre-auto-entitlements`) distribution builds can no longer be run directly. To run the app codesigned for distribution locally after codesigning, you may manually add `ElectronTeamID` in your `Info.plist` and `com.apple.security.application-groups` in the entitlements file, and provide the flag `--no-pre-auto-entitlements` for `electron-osx-sign` to avoid this extra bit. Note that "certain features are only allowed across apps whose team-identifier value match" ([Technical Note TN2415](https://developer.apple.com/library/content/technotes/tn2415/_index.html#//apple_ref/doc/uid/DTS40016427-CH1-ENTITLEMENTSLIST)).
+
+The examples below assume that `--pre-auto-entitlements` is enabled.
+
+- To sign a distribution version by default:
+ ```sh
+ electron-osx-sign path/to/my.app
+ ```
+ For distribution in the Mac App Store: Have the provisioning profile for distribution placed in the current working directory and the signing identity installed in the default keychain. *The app is not expected to run after codesigning since there is no provisioned device, and it is intended only for submission to iTunes Connect.*
+ For distribution outside the Mac App Store: Have the signing identity for distribution installed in the default keychain and optionally place the provisioning profile in the current working directory. By default App Sandbox is not enabled. *The app should run on all devices.*
+
+- To sign development version:
+ ```sh
+ electron-osx-sign path/to/my.app --type=development
+ ```
+ For testing Mac App Store builds: Have the provisioning profile for development placed in the current working directory and the signing identity installed in the default keychain. *The app will only run on provisioned devices.*
+ For testing apps for distribution outside the Mac App Store, have the signing identity for development installed in the default keychain and optionally the provisioning profile placed in the current working directory. *The app will only run on provisioned devices.* However, you may prefer to just go with signing a distribution version because the app is expected to launch properly after codesigned.
+
+- It is recommended to place the provisioning profile(s) under the working directory for `electron-osx-sign` to pick up automatically; however, to specify provisioning profile to be embedded explicitly:
+ ```sh
+ electron-osx-sign path/to/my.app --provisioning-profile=path/to/my.provisionprofile
+ ```
+
+- To specify custom entitlements files you have to use the JS API.
+
+- It is recommended to make use of `--version` while signing legacy versions of Electron:
+ ```sh
+ electron-osx-sign path/to/my.app --version=0.34.0
+ ```
+
+Run `electron-osx-sign --help` or see [electron-osx-sign-usage.txt](https://github.com/electron/osx-sign/blob/main/bin/electron-osx-sign-usage.txt) for CLI-specific options.
+
+### electron-osx-flat
+
+#### From the API
+
+```javascript
+const { flatAsync } = require('@electron/osx-sign')
+flatAsync({
+ app: 'path/to/my.app'
+})
+ .then(function () {
+ // Application flattened
+ })
+ .catch(function (err) {
+ // Handle the error
+ })
+```
+
+###### opts - Options
+
+**Required**
+
+`app` - *String*
+
+Path to the application bundle.
+Needs file extension `.app`.
+
+**Optional**
+
+`identity` - *String*
+
+Name of certificate to use when signing.
+Default to be selected with respect to `platform` from `keychain` or keychain by system default.
+
+Flattening platform `mas` will look for `3rd Party Mac Developer Installer: * (*)`, and platform `darwin` will look for `Developer ID Installer: * (*)` by default.
+
+`identityValidation` - *Boolean*
+
+Flag to enable/disable validation for signing identity. If enabled, the `identity` provided will be validated in the `keychain` specified.
+Default to `true`.
+
+`install` - *String*
+
+Path to install the bundle.
+Default to `/Applications`.
+
+`keychain` - *String*
+
+The keychain name.
+Default to system default keychain.
+
+`platform` - *String*
+
+Build platform of Electron. Allowed values: `darwin`, `mas`.
+Default to auto detect by presence of `Squirrel.framework` within the application bundle.
+
+`pkg` - *String*
+
+Path to the output the flattened package.
+Needs file extension `.pkg`.
+
+`scripts` - *String*
+Path to a directory containing pre and/or post install scripts.
+#### From the Command Line
+
+```sh
+electron-osx-flat app [options ...]
+```
+
+Example:
+
+```sh
+electron-osx-flat path/to/my.app
+```
+
+Run `electron-osx-flat --help` or see [electron-osx-flat-usage.txt](https://github.com/electron/osx-sign/blob/main/bin/electron-osx-flat-usage.txt) for CLI-specific options.
+
+## Debug
+
+As of release v0.3.1, external module `debug` is used to display logs and messages; remember to `export DEBUG=electron-osx-sign*` when necessary.
+
+## Test
+
+The project's configured to run automated tests on CircleCI.
+
+If you wish to manually test the module, first comment out `opts.identity` in `test/basic.js` to enable auto discovery. Then run the command `npm test` from the dev directory.
+
+When this command is run for the first time: `@electron/get` will download macOS Electron releases defined in `test/config.json`, and save to `~/.electron/`, which might take up less than 1GB of disk space.
+
+A successful testing should look something like:
+
+```
+$ npm test
+
+> electron-osx-sign@0.4.17 pretest electron-osx-sign
+> rimraf test/work
+
+> electron-osx-sign@0.4.17 test electron-osx-sign
+> standard && tape test
+
+Calling @electron/get before running tests...
+Running tests...
+TAP version 13
+# setup
+# defaults-test:v7.0.0-beta.3-darwin-x64
+ok 1 app signed
+# defaults-test:v7.0.0-beta.3-mas-x64
+ok 2 app signed
+# defaults-test:v6.0.3-darwin-x64
+ok 3 app signed
+# defaults-test:v6.0.3-mas-x64
+ok 4 app signed
+# defaults-test:v5.0.10-darwin-x64
+ok 5 app signed
+# defaults-test:v5.0.10-mas-x64
+ok 6 app signed
+# defaults-test:v4.2.9-darwin-x64
+ok 7 app signed
+# defaults-test:v4.2.9-mas-x64
+ok 8 app signed
+# defaults-test:v3.1.2-darwin-x64
+ok 9 app signed
+# defaults-test:v3.1.2-mas-x64
+ok 10 app signed
+# teardown
+
+1..10
+# tests 10
+# pass 10
+
+# ok
+```
+
+[Electron]: https://github.com/electron/electron
+[electron-osx-sign]: https://github.com/electron/osx-sign
+[npm_img]: https://img.shields.io/npm/v/@electron/osx-sign.svg
+[npm_url]: https://npmjs.org/package/@electron/osx-sign
+[circleci_img]: https://img.shields.io/circleci/build/github/electron/osx-sign
+[circleci_url]: https://circleci.com/gh/electron/osx-sign
diff --git a/desktop/node_modules/@electron/osx-sign/bin/electron-osx-flat-usage.txt b/desktop/node_modules/@electron/osx-sign/bin/electron-osx-flat-usage.txt
new file mode 100644
index 0000000..368ce2c
--- /dev/null
+++ b/desktop/node_modules/@electron/osx-sign/bin/electron-osx-flat-usage.txt
@@ -0,0 +1,41 @@
+
+NAME
+ electron-osx-flat -- product building for Electron apps
+
+SYNOPSIS
+ electron-osx-flat app [options ...]
+
+DESCRIPTION
+ app
+ Path to the application package.
+ Needs file extension ``.app''.
+
+ --help
+ Flag to display all commands.
+
+ --identity=identity
+ Name of certificate to use when signing.
+ Default to selected with respect to --platform from --keychain specified or keychain by system default.
+
+ --identityValidation, --no-identityValidation
+ Flag to enable/disable validation for the signing identity.
+
+ --install=install-path
+ Path to install the bundle.
+ Default to ``/Applications''.
+
+ --keychain=keychain
+ The keychain name.
+ Default to system default keychain.
+
+ --platform=platform
+ Build platform of Electron.
+ Allowed values: ``darwin'', ``mas''.
+ Default to auto detect from application bundle.
+
+ --pkg
+ Path to the output the flattened package.
+ Needs file extension ``.pkg''.
+
+ --scripts
+ Path to a directory containing pre and/or post install scripts.
diff --git a/desktop/node_modules/@electron/osx-sign/bin/electron-osx-flat.js b/desktop/node_modules/@electron/osx-sign/bin/electron-osx-flat.js
new file mode 100755
index 0000000..e250489
--- /dev/null
+++ b/desktop/node_modules/@electron/osx-sign/bin/electron-osx-flat.js
@@ -0,0 +1,34 @@
+#!/usr/bin/env node
+
+const fs = require('fs');
+const path = require('path');
+const args = require('minimist')(process.argv.slice(2), {
+ boolean: [
+ 'help'
+ ]
+});
+const usage = fs.readFileSync(path.join(__dirname, 'electron-osx-flat-usage.txt')).toString();
+const flat = require('../').flat;
+
+args.app = args._.shift();
+
+if (!args.app || args.help) {
+ console.log(usage);
+ process.exit(0);
+}
+
+// Remove excess arguments
+delete args._;
+delete args.help;
+
+flat(args, function done (err) {
+ if (err) {
+ console.error('Flat failed:');
+ if (err.message) console.error(err.message);
+ else if (err.stack) console.error(err.stack);
+ else console.log(err);
+ process.exit(1);
+ }
+ console.log('Application flattened, saved to:', args.pkg);
+ process.exit(0);
+});
diff --git a/desktop/node_modules/@electron/osx-sign/bin/electron-osx-sign-usage.txt b/desktop/node_modules/@electron/osx-sign/bin/electron-osx-sign-usage.txt
new file mode 100644
index 0000000..55bd8cc
--- /dev/null
+++ b/desktop/node_modules/@electron/osx-sign/bin/electron-osx-sign-usage.txt
@@ -0,0 +1,60 @@
+
+NAME
+ electron-osx-sign -- code signing for Electron apps
+
+SYNOPSIS
+ electron-osx-sign app [embedded-binary ...] [options ...]
+
+DESCRIPTION
+ app
+ Path to the application package.
+ Needs file extension ``.app''.
+
+ embedded-binary ...
+ Path to additional binaries that will be signed along with built-ins of Electron, spaced.
+
+ --help
+ Flag to display all commands.
+
+ --identity=identity
+ Name of certificate to use when signing.
+ Default to selected with respect to --provisioning-profile and --platform from --keychain specified or keychain by system default.
+
+ --identityValidation, --no-identityValidation
+ Flag to enable/disable validation for the signing identity.
+
+ --ignore=path
+ Path to skip signing. The string will be treated as a regular expression when used to match the file paths.
+
+ --keychain=keychain
+ The keychain name.
+ Default to system default keychain.
+
+ --platform=platform
+ Build platform of Electron.
+ Allowed values: ``darwin'', ``mas''.
+ Default to auto detect from application bundle.
+
+ --pre-auto-entitlements, --no-pre-auto-entitlements
+ Flag to enable/disable automation of entitlements file and Info.plist.
+
+ --pre-embed-provisioning-profile, --no-pre-embed-provisioning-profile
+ Flag to enable/disable embedding of provisioning profile.
+
+ --provisioning-profile=file
+ Path to provisioning profile.
+
+ --strictVerify, --strictVerify=options, --no-strictVerify
+ Flag to enable/disable ``--strict'' flag when verifying the signed application bundle.
+ Each component should be separated in ``options'' with comma (``,'').
+ Enabled by default.
+
+ --type=type
+ Specify whether to sign app for development or for distribution.
+ Allowed values: ``development'', ``distribution''.
+ Default to ``distribution''.
+
+ --version=version
+ Build version of Electron.
+ Values may be: ``1.2.0''.
+ Default to latest Electron version.
diff --git a/desktop/node_modules/@electron/osx-sign/bin/electron-osx-sign.js b/desktop/node_modules/@electron/osx-sign/bin/electron-osx-sign.js
new file mode 100755
index 0000000..95234db
--- /dev/null
+++ b/desktop/node_modules/@electron/osx-sign/bin/electron-osx-sign.js
@@ -0,0 +1,46 @@
+#!/usr/bin/env node
+
+const fs = require('fs');
+const path = require('path');
+const args = require('minimist')(process.argv.slice(2), {
+ string: [
+ 'signature-flags'
+ ],
+ boolean: [
+ 'help',
+ 'pre-auto-entitlements',
+ 'pre-embed-provisioning-profile',
+ 'hardened-runtime',
+ 'restrict'
+ ],
+ default: {
+ 'pre-auto-entitlements': true,
+ 'pre-embed-provisioning-profile': true
+ }
+});
+const usage = fs.readFileSync(path.join(__dirname, 'electron-osx-sign-usage.txt')).toString();
+const sign = require('../').sign;
+
+args.app = args._.shift();
+args.binaries = args._;
+
+if (!args.app || args.help) {
+ console.log(usage);
+ process.exit(0);
+}
+
+// Remove excess arguments
+delete args._;
+delete args.help;
+
+sign(args, function done (err) {
+ if (err) {
+ console.error('Sign failed:');
+ if (err.message) console.error(err.message);
+ else if (err.stack) console.error(err.stack);
+ else console.log(err);
+ process.exit(1);
+ }
+ console.log('Application signed:', args.app);
+ process.exit(0);
+});
diff --git a/desktop/node_modules/@electron/osx-sign/dist/cjs/flat.d.ts b/desktop/node_modules/@electron/osx-sign/dist/cjs/flat.d.ts
new file mode 100644
index 0000000..4d63f07
--- /dev/null
+++ b/desktop/node_modules/@electron/osx-sign/dist/cjs/flat.d.ts
@@ -0,0 +1,11 @@
+import { FlatOptions } from './types';
+/**
+ * This function is exported and returns a promise flattening the application.
+ */
+export declare function buildPkg(_opts: FlatOptions): Promise<void>;
+/**
+ * This function is exported with normal callback implementation.
+ *
+ * @deprecated Please use the promise based "buildPkg" method
+ */
+export declare const flat: (opts: FlatOptions, cb?: ((error?: Error) => void) | undefined) => void;
diff --git a/desktop/node_modules/@electron/osx-sign/dist/cjs/flat.js b/desktop/node_modules/@electron/osx-sign/dist/cjs/flat.js
new file mode 100644
index 0000000..abd7312
--- /dev/null
+++ b/desktop/node_modules/@electron/osx-sign/dist/cjs/flat.js
@@ -0,0 +1,153 @@
+"use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+ if (k2 === undefined) k2 = k;
+ var desc = Object.getOwnPropertyDescriptor(m, k);
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
+ desc = { enumerable: true, get: function() { return m[k]; } };
+ }
+ Object.defineProperty(o, k2, desc);
+}) : (function(o, m, k, k2) {
+ if (k2 === undefined) k2 = k;
+ o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+ o["default"] = v;
+});
+var __importStar = (this && this.__importStar) || function (mod) {
+ if (mod && mod.__esModule) return mod;
+ var result = {};
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+ __setModuleDefault(result, mod);
+ return result;
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.flat = exports.buildPkg = void 0;
+const path = __importStar(require("path"));
+const util_1 = require("./util");
+const util_identities_1 = require("./util-identities");
+const pkgVersion = require('../../package.json').version;
+/**
+ * This function returns a promise validating all options passed in opts.
+ * @function
+ * @param {Object} opts - Options.
+ * @returns {Promise} Promise.
+ */
+async function validateFlatOpts(opts) {
+ await (0, util_1.validateOptsApp)(opts);
+ let pkg = opts.pkg;
+ if (pkg) {
+ if (typeof pkg !== 'string')
+ throw new Error('`pkg` must be a string.');
+ if (path.extname(pkg) !== '.pkg') {
+ throw new Error('Extension of output package must be `.pkg`.');
+ }
+ }
+ else {
+ (0, util_1.debugWarn)('No `pkg` passed in arguments, will fallback to default inferred from the given application.');
+ pkg = path.join(path.dirname(opts.app), path.basename(opts.app, '.app') + '.pkg');
+ }
+ let install = opts.install;
+ if (install) {
+ if (typeof install !== 'string') {
+ return Promise.reject(new Error('`install` must be a string.'));
+ }
+ }
+ else {
+ (0, util_1.debugWarn)('No `install` passed in arguments, will fallback to default `/Applications`.');
+ install = '/Applications';
+ }
+ return Object.assign(Object.assign({}, opts), { pkg,
+ install, platform: await (0, util_1.validateOptsPlatform)(opts) });
+}
+/**
+ * This function returns a promise flattening the application.
+ * @function
+ * @param {Object} opts - Options.
+ * @returns {Promise} Promise.
+ */
+async function buildApplicationPkg(opts, identity) {
+ const args = ['--component', opts.app, opts.install, '--sign', identity.name, opts.pkg];
+ if (opts.keychain) {
+ args.unshift('--keychain', opts.keychain);
+ }
+ if (opts.scripts) {
+ args.unshift('--scripts', opts.scripts);
+ }
+ (0, util_1.debugLog)('Flattening... ' + opts.app);
+ await (0, util_1.execFileAsync)('productbuild', args);
+}
+/**
+ * This function is exported and returns a promise flattening the application.
+ */
+async function buildPkg(_opts) {
+ (0, util_1.debugLog)('@electron/osx-sign@%s', pkgVersion);
+ const validatedOptions = await validateFlatOpts(_opts);
+ let identities = [];
+ let identityInUse = null;
+ if (validatedOptions.identity) {
+ (0, util_1.debugLog)('`identity` passed in arguments.');
+ if (validatedOptions.identityValidation === false) {
+ // Do nothing
+ }
+ else {
+ identities = await (0, util_identities_1.findIdentities)(validatedOptions.keychain || null, validatedOptions.identity);
+ }
+ }
+ else {
+ (0, util_1.debugWarn)('No `identity` passed in arguments...');
+ if (validatedOptions.platform === 'mas') {
+ (0, util_1.debugLog)('Finding `3rd Party Mac Developer Installer` certificate for flattening app distribution in the Mac App Store...');
+ identities = await (0, util_identities_1.findIdentities)(validatedOptions.keychain || null, '3rd Party Mac Developer Installer:');
+ }
+ else {
+ (0, util_1.debugLog)('Finding `Developer ID Application` certificate for distribution outside the Mac App Store...');
+ identities = await (0, util_identities_1.findIdentities)(validatedOptions.keychain || null, 'Developer ID Installer:');
+ }
+ }
+ if (identities.length > 0) {
+ // Provisioning profile(s) found
+ if (identities.length > 1) {
+ (0, util_1.debugWarn)('Multiple identities found, will use the first discovered.');
+ }
+ else {
+ (0, util_1.debugLog)('Found 1 identity.');
+ }
+ identityInUse = identities[0];
+ }
+ else {
+ // No identity found
+ throw new Error('No identity found for signing.');
+ }
+ (0, util_1.debugLog)('Flattening application...', '\n', '> Application:', validatedOptions.app, '\n', '> Package output:', validatedOptions.pkg, '\n', '> Install path:', validatedOptions.install, '\n', '> Identity:', validatedOptions.identity, '\n', '> Scripts:', validatedOptions.scripts);
+ await buildApplicationPkg(validatedOptions, identityInUse);
+ (0, util_1.debugLog)('Application flattened.');
+}
+exports.buildPkg = buildPkg;
+/**
+ * This function is exported with normal callback implementation.
+ *
+ * @deprecated Please use the promise based "buildPkg" method
+ */
+const flat = (opts, cb) => {
+ buildPkg(opts)
+ .then(() => {
+ (0, util_1.debugLog)('Application flattened, saved to: ' + opts.app);
+ if (cb)
+ cb();
+ })
+ .catch((err) => {
+ (0, util_1.debugLog)('Flat failed:');
+ if (err.message)
+ (0, util_1.debugLog)(err.message);
+ else if (err.stack)
+ (0, util_1.debugLog)(err.stack);
+ else
+ (0, util_1.debugLog)(err);
+ if (cb)
+ cb(err);
+ });
+};
+exports.flat = flat;
+//# sourceMappingURL=flat.js.map \ No newline at end of file
diff --git a/desktop/node_modules/@electron/osx-sign/dist/cjs/flat.js.map b/desktop/node_modules/@electron/osx-sign/dist/cjs/flat.js.map
new file mode 100644
index 0000000..406801c
--- /dev/null
+++ b/desktop/node_modules/@electron/osx-sign/dist/cjs/flat.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"flat.js","sourceRoot":"","sources":["../../src/flat.ts"],"names":[],"mappings":"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"} \ No newline at end of file
diff --git a/desktop/node_modules/@electron/osx-sign/dist/cjs/index.d.ts b/desktop/node_modules/@electron/osx-sign/dist/cjs/index.d.ts
new file mode 100644
index 0000000..deb3ca0
--- /dev/null
+++ b/desktop/node_modules/@electron/osx-sign/dist/cjs/index.d.ts
@@ -0,0 +1,4 @@
+import { sign, signApp } from './sign';
+import { flat, buildPkg } from './flat';
+export { sign, flat, signApp as signAsync, signApp, buildPkg as flatAsync, buildPkg };
+export * from './types';
diff --git a/desktop/node_modules/@electron/osx-sign/dist/cjs/index.js b/desktop/node_modules/@electron/osx-sign/dist/cjs/index.js
new file mode 100644
index 0000000..2b59385
--- /dev/null
+++ b/desktop/node_modules/@electron/osx-sign/dist/cjs/index.js
@@ -0,0 +1,36 @@
+"use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+ if (k2 === undefined) k2 = k;
+ var desc = Object.getOwnPropertyDescriptor(m, k);
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
+ desc = { enumerable: true, get: function() { return m[k]; } };
+ }
+ Object.defineProperty(o, k2, desc);
+}) : (function(o, m, k, k2) {
+ if (k2 === undefined) k2 = k;
+ o[k2] = m[k];
+}));
+var __exportStar = (this && this.__exportStar) || function(m, exports) {
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.buildPkg = exports.flatAsync = exports.signApp = exports.signAsync = exports.flat = exports.sign = void 0;
+const sign_1 = require("./sign");
+Object.defineProperty(exports, "sign", { enumerable: true, get: function () { return sign_1.sign; } });
+Object.defineProperty(exports, "signAsync", { enumerable: true, get: function () { return sign_1.signApp; } });
+Object.defineProperty(exports, "signApp", { enumerable: true, get: function () { return sign_1.signApp; } });
+const flat_1 = require("./flat");
+Object.defineProperty(exports, "flat", { enumerable: true, get: function () { return flat_1.flat; } });
+Object.defineProperty(exports, "flatAsync", { enumerable: true, get: function () { return flat_1.buildPkg; } });
+Object.defineProperty(exports, "buildPkg", { enumerable: true, get: function () { return flat_1.buildPkg; } });
+// TODO: Remove and leave only proper named exports, but for non-breaking change reasons
+// we need to keep this weirdness for now
+module.exports = sign_1.sign;
+module.exports.sign = sign_1.sign;
+module.exports.signAsync = sign_1.signApp;
+module.exports.signApp = sign_1.signApp;
+module.exports.flat = flat_1.flat;
+module.exports.flatAsync = flat_1.buildPkg;
+module.exports.buildPkg = flat_1.buildPkg;
+__exportStar(require("./types"), exports);
+//# sourceMappingURL=index.js.map \ No newline at end of file
diff --git a/desktop/node_modules/@electron/osx-sign/dist/cjs/index.js.map b/desktop/node_modules/@electron/osx-sign/dist/cjs/index.js.map
new file mode 100644
index 0000000..4dce983
--- /dev/null
+++ b/desktop/node_modules/@electron/osx-sign/dist/cjs/index.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,iCAAuC;AAa9B,qFAbA,WAAI,OAaA;AAAmB,0FAbjB,cAAO,OAamB;AAAE,wFAb5B,cAAO,OAa4B;AAZlD,iCAAwC;AAYzB,qFAZN,WAAI,OAYM;AAA6C,0FAZjD,eAAQ,OAYkD;AAAE,yFAZ5D,eAAQ,OAY4D;AAVnF,wFAAwF;AACxF,yCAAyC;AACzC,MAAM,CAAC,OAAO,GAAG,WAAI,CAAC;AACtB,MAAM,CAAC,OAAO,CAAC,IAAI,GAAG,WAAI,CAAC;AAC3B,MAAM,CAAC,OAAO,CAAC,SAAS,GAAG,cAAO,CAAC;AACnC,MAAM,CAAC,OAAO,CAAC,OAAO,GAAG,cAAO,CAAC;AACjC,MAAM,CAAC,OAAO,CAAC,IAAI,GAAG,WAAI,CAAC;AAC3B,MAAM,CAAC,OAAO,CAAC,SAAS,GAAG,eAAQ,CAAC;AACpC,MAAM,CAAC,OAAO,CAAC,QAAQ,GAAG,eAAQ,CAAC;AAGnC,0CAAwB"} \ No newline at end of file
diff --git a/desktop/node_modules/@electron/osx-sign/dist/cjs/sign.d.ts b/desktop/node_modules/@electron/osx-sign/dist/cjs/sign.d.ts
new file mode 100644
index 0000000..14eda7e
--- /dev/null
+++ b/desktop/node_modules/@electron/osx-sign/dist/cjs/sign.d.ts
@@ -0,0 +1,11 @@
+import { SignOptions } from './types';
+/**
+ * This function returns a promise signing the application.
+ */
+export declare function signApp(_opts: SignOptions): Promise<void>;
+/**
+ * This function is a legacy callback implementation.
+ *
+ * @deprecated Please use the promise based "signApp" method
+ */
+export declare const sign: (opts: SignOptions, cb?: ((error?: Error) => void) | undefined) => void;
diff --git a/desktop/node_modules/@electron/osx-sign/dist/cjs/sign.js b/desktop/node_modules/@electron/osx-sign/dist/cjs/sign.js
new file mode 100644
index 0000000..2796997
--- /dev/null
+++ b/desktop/node_modules/@electron/osx-sign/dist/cjs/sign.js
@@ -0,0 +1,363 @@
+"use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+ if (k2 === undefined) k2 = k;
+ var desc = Object.getOwnPropertyDescriptor(m, k);
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
+ desc = { enumerable: true, get: function() { return m[k]; } };
+ }
+ Object.defineProperty(o, k2, desc);
+}) : (function(o, m, k, k2) {
+ if (k2 === undefined) k2 = k;
+ o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+ o["default"] = v;
+});
+var __importStar = (this && this.__importStar) || function (mod) {
+ if (mod && mod.__esModule) return mod;
+ var result = {};
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+ __setModuleDefault(result, mod);
+ return result;
+};
+var __importDefault = (this && this.__importDefault) || function (mod) {
+ return (mod && mod.__esModule) ? mod : { "default": mod };
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.sign = exports.signApp = void 0;
+const fs = __importStar(require("fs-extra"));
+const os = __importStar(require("os"));
+const path = __importStar(require("path"));
+const plist = __importStar(require("plist"));
+const compare_version_1 = __importDefault(require("compare-version"));
+const util_1 = require("./util");
+const util_identities_1 = require("./util-identities");
+const util_provisioning_profiles_1 = require("./util-provisioning-profiles");
+const util_entitlements_1 = require("./util-entitlements");
+const pkgVersion = require('../../package.json').version;
+const osRelease = os.release();
+/**
+ * This function returns a promise validating opts.binaries, the additional binaries to be signed along with the discovered enclosed components.
+ */
+async function validateOptsBinaries(opts) {
+ if (opts.binaries) {
+ if (!Array.isArray(opts.binaries)) {
+ throw new Error('Additional binaries should be an Array.');
+ }
+ // TODO: Presence check for binary files, reject if any does not exist
+ }
+}
+function validateOptsIgnore(ignore) {
+ if (ignore && !(ignore instanceof Array)) {
+ return [ignore];
+ }
+}
+/**
+ * This function returns a promise validating all options passed in opts.
+ */
+async function validateSignOpts(opts) {
+ await validateOptsBinaries(opts);
+ await (0, util_1.validateOptsApp)(opts);
+ if (opts.provisioningProfile && typeof opts.provisioningProfile !== 'string') {
+ throw new Error('Path to provisioning profile should be a string.');
+ }
+ if (opts.type && opts.type !== 'development' && opts.type !== 'distribution') {
+ throw new Error('Type must be either `development` or `distribution`.');
+ }
+ const platform = await (0, util_1.validateOptsPlatform)(opts);
+ const cloned = Object.assign(Object.assign({}, opts), { ignore: validateOptsIgnore(opts.ignore), type: opts.type || 'distribution', platform });
+ return cloned;
+}
+/**
+ * This function returns a promise verifying the code sign of application bundle.
+ */
+async function verifySignApplication(opts) {
+ // Verify with codesign
+ (0, util_1.debugLog)('Verifying application bundle with codesign...');
+ await (0, util_1.execFileAsync)('codesign', ['--verify', '--deep'].concat(opts.strictVerify !== false && (0, compare_version_1.default)(osRelease, '15.0.0') >= 0 // Strict flag since darwin 15.0.0 --> OS X 10.11.0 El Capitan
+ ? [
+ '--strict' +
+ (opts.strictVerify
+ ? '=' + opts.strictVerify // Array should be converted to a comma separated string
+ : '')
+ ]
+ : [], ['--verbose=2', opts.app]));
+}
+function defaultOptionsForFile(filePath, platform) {
+ const entitlementsFolder = path.resolve(__dirname, '..', '..', 'entitlements');
+ let entitlementsFile;
+ if (platform === 'darwin') {
+ // Default Entitlements
+ // c.f. https://source.chromium.org/chromium/chromium/src/+/main:chrome/app/app-entitlements.plist
+ // Also include JIT for main process V8
+ entitlementsFile = path.resolve(entitlementsFolder, 'default.darwin.plist');
+ // Plugin helper
+ // c.f. https://source.chromium.org/chromium/chromium/src/+/main:chrome/app/helper-plugin-entitlements.plist
+ if (filePath.includes('(Plugin).app')) {
+ entitlementsFile = path.resolve(entitlementsFolder, 'default.darwin.plugin.plist');
+ // GPU Helper
+ // c.f. https://source.chromium.org/chromium/chromium/src/+/main:chrome/app/helper-gpu-entitlements.plist
+ }
+ else if (filePath.includes('(GPU).app')) {
+ entitlementsFile = path.resolve(entitlementsFolder, 'default.darwin.gpu.plist');
+ // Renderer Helper
+ // c.f. https://source.chromium.org/chromium/chromium/src/+/main:chrome/app/helper-renderer-entitlements.plist
+ }
+ else if (filePath.includes('(Renderer).app')) {
+ entitlementsFile = path.resolve(entitlementsFolder, 'default.darwin.renderer.plist');
+ }
+ }
+ else {
+ // Default entitlements
+ // TODO: Can these be more scoped like the non-mas variant?
+ entitlementsFile = path.resolve(entitlementsFolder, 'default.mas.plist');
+ // If it is not the top level app bundle, we sign with inherit
+ if (filePath.includes('.app/')) {
+ entitlementsFile = path.resolve(entitlementsFolder, 'default.mas.child.plist');
+ }
+ }
+ return {
+ entitlements: entitlementsFile,
+ hardenedRuntime: true,
+ requirements: undefined,
+ signatureFlags: undefined,
+ timestamp: undefined
+ };
+}
+async function mergeOptionsForFile(opts, defaults) {
+ const mergedPerFileOptions = Object.assign({}, defaults);
+ if (opts) {
+ if (opts.entitlements !== undefined) {
+ if (Array.isArray(opts.entitlements)) {
+ const entitlements = opts.entitlements.reduce((dict, entitlementKey) => (Object.assign(Object.assign({}, dict), { [entitlementKey]: true })), {});
+ const dir = await fs.mkdtemp(path.resolve(os.tmpdir(), 'tmp-entitlements-'));
+ const entitlementsPath = path.join(dir, 'entitlements.plist');
+ await fs.writeFile(entitlementsPath, plist.build(entitlements), 'utf8');
+ opts.entitlements = entitlementsPath;
+ }
+ mergedPerFileOptions.entitlements = opts.entitlements;
+ }
+ if (opts.hardenedRuntime !== undefined) {
+ mergedPerFileOptions.hardenedRuntime = opts.hardenedRuntime;
+ }
+ if (opts.requirements !== undefined)
+ mergedPerFileOptions.requirements = opts.requirements;
+ if (opts.signatureFlags !== undefined) {
+ mergedPerFileOptions.signatureFlags = opts.signatureFlags;
+ }
+ if (opts.timestamp !== undefined)
+ mergedPerFileOptions.timestamp = opts.timestamp;
+ }
+ return mergedPerFileOptions;
+}
+/**
+ * This function returns a promise codesigning only.
+ */
+async function signApplication(opts, identity) {
+ function shouldIgnoreFilePath(filePath) {
+ if (opts.ignore) {
+ return opts.ignore.some(function (ignore) {
+ if (typeof ignore === 'function') {
+ return ignore(filePath);
+ }
+ return filePath.match(ignore);
+ });
+ }
+ return false;
+ }
+ const children = await (0, util_1.walkAsync)((0, util_1.getAppContentsPath)(opts));
+ if (opts.binaries)
+ children.push(...opts.binaries);
+ const args = ['--sign', identity.hash || identity.name, '--force'];
+ if (opts.keychain) {
+ args.push('--keychain', opts.keychain);
+ }
+ /**
+ * Sort the child paths by how deep they are in the file tree. Some arcane apple
+ * logic expects the deeper files to be signed first otherwise strange errors get
+ * thrown our way
+ */
+ children.sort((a, b) => {
+ const aDepth = a.split(path.sep).length;
+ const bDepth = b.split(path.sep).length;
+ return bDepth - aDepth;
+ });
+ for (const filePath of [...children, opts.app]) {
+ if (shouldIgnoreFilePath(filePath)) {
+ (0, util_1.debugLog)('Skipped... ' + filePath);
+ continue;
+ }
+ const perFileOptions = await mergeOptionsForFile(opts.optionsForFile ? opts.optionsForFile(filePath) : null, defaultOptionsForFile(filePath, opts.platform));
+ // preAutoEntitlements should only be applied to the top level app bundle.
+ // Applying it other files will cause the app to crash and be rejected by Apple.
+ if (!filePath.includes('.app/')) {
+ if (opts.preAutoEntitlements === false) {
+ (0, util_1.debugWarn)('Pre-sign operation disabled for entitlements automation.');
+ }
+ else {
+ (0, util_1.debugLog)('Pre-sign operation enabled for entitlements automation with versions >= `1.1.1`:', '\n', '* Disable by setting `pre-auto-entitlements` to `false`.');
+ if (!opts.version || (0, compare_version_1.default)(opts.version, '1.1.1') >= 0) {
+ // Enable Mac App Store sandboxing without using temporary-exception, introduced in Electron v1.1.1. Relates to electron#5601
+ const newEntitlements = await (0, util_entitlements_1.preAutoEntitlements)(opts, perFileOptions, {
+ identity,
+ provisioningProfile: opts.provisioningProfile
+ ? await (0, util_provisioning_profiles_1.getProvisioningProfile)(opts.provisioningProfile, opts.keychain)
+ : undefined
+ });
+ // preAutoEntitlements may provide us new entitlements, if so we update our options
+ // and ensure that entitlements-loginhelper has a correct default value
+ if (newEntitlements) {
+ perFileOptions.entitlements = newEntitlements;
+ }
+ }
+ }
+ }
+ (0, util_1.debugLog)('Signing... ' + filePath);
+ const perFileArgs = [...args];
+ if (perFileOptions.requirements) {
+ perFileArgs.push('--requirements', perFileOptions.requirements);
+ }
+ if (perFileOptions.timestamp) {
+ perFileArgs.push('--timestamp=' + perFileOptions.timestamp);
+ }
+ else {
+ perFileArgs.push('--timestamp');
+ }
+ let optionsArguments = [];
+ if (perFileOptions.signatureFlags) {
+ if (Array.isArray(perFileOptions.signatureFlags)) {
+ optionsArguments.push(...perFileOptions.signatureFlags);
+ }
+ else {
+ const flags = perFileOptions.signatureFlags.split(',').map(function (flag) {
+ return flag.trim();
+ });
+ optionsArguments.push(...flags);
+ }
+ }
+ if (perFileOptions.hardenedRuntime || optionsArguments.includes('runtime')) {
+ // Hardened runtime since darwin 17.7.0 --> macOS 10.13.6
+ if ((0, compare_version_1.default)(osRelease, '17.7.0') >= 0) {
+ optionsArguments.push('runtime');
+ }
+ else {
+ // Remove runtime if passed in with --signature-flags
+ (0, util_1.debugLog)('Not enabling hardened runtime, current macOS version too low, requires 10.13.6 and higher');
+ optionsArguments = optionsArguments.filter((arg) => {
+ return arg !== 'runtime';
+ });
+ }
+ }
+ if (optionsArguments.length) {
+ perFileArgs.push('--options', [...new Set(optionsArguments)].join(','));
+ }
+ await (0, util_1.execFileAsync)('codesign', perFileArgs.concat('--entitlements', perFileOptions.entitlements, filePath));
+ }
+ // Verify code sign
+ (0, util_1.debugLog)('Verifying...');
+ await verifySignApplication(opts);
+ (0, util_1.debugLog)('Verified.');
+ // Check entitlements if applicable
+ (0, util_1.debugLog)('Displaying entitlements...');
+ const result = await (0, util_1.execFileAsync)('codesign', [
+ '--display',
+ '--entitlements',
+ ':-',
+ opts.app
+ ]);
+ (0, util_1.debugLog)('Entitlements:', '\n', result);
+}
+/**
+ * This function returns a promise signing the application.
+ */
+async function signApp(_opts) {
+ (0, util_1.debugLog)('electron-osx-sign@%s', pkgVersion);
+ const validatedOpts = await validateSignOpts(_opts);
+ let identities = [];
+ let identityInUse = null;
+ // Determine identity for signing
+ if (validatedOpts.identity) {
+ (0, util_1.debugLog)('`identity` passed in arguments.');
+ if (validatedOpts.identityValidation === false) {
+ identityInUse = new util_identities_1.Identity(validatedOpts.identity);
+ }
+ else {
+ identities = await (0, util_identities_1.findIdentities)(validatedOpts.keychain || null, validatedOpts.identity);
+ }
+ }
+ else {
+ (0, util_1.debugWarn)('No `identity` passed in arguments...');
+ if (validatedOpts.platform === 'mas') {
+ if (validatedOpts.type === 'distribution') {
+ (0, util_1.debugLog)('Finding `3rd Party Mac Developer Application` certificate for signing app distribution in the Mac App Store...');
+ identities = await (0, util_identities_1.findIdentities)(validatedOpts.keychain || null, '3rd Party Mac Developer Application:');
+ }
+ else {
+ (0, util_1.debugLog)('Finding `Mac Developer` certificate for signing app in development for the Mac App Store signing...');
+ identities = await (0, util_identities_1.findIdentities)(validatedOpts.keychain || null, 'Mac Developer:');
+ }
+ }
+ else {
+ (0, util_1.debugLog)('Finding `Developer ID Application` certificate for distribution outside the Mac App Store...');
+ identities = await (0, util_identities_1.findIdentities)(validatedOpts.keychain || null, 'Developer ID Application:');
+ }
+ }
+ if (!identityInUse) {
+ if (identities.length > 0) {
+ // Identity(/ies) found
+ if (identities.length > 1) {
+ (0, util_1.debugWarn)('Multiple identities found, will use the first discovered.');
+ }
+ else {
+ (0, util_1.debugLog)('Found 1 identity.');
+ }
+ identityInUse = identities[0];
+ }
+ else {
+ // No identity found
+ throw new Error('No identity found for signing.');
+ }
+ }
+ // Pre-sign operations
+ if (validatedOpts.preEmbedProvisioningProfile === false) {
+ (0, util_1.debugWarn)('Pre-sign operation disabled for provisioning profile embedding:', '\n', '* Enable by setting `pre-embed-provisioning-profile` to `true`.');
+ }
+ else {
+ (0, util_1.debugLog)('Pre-sign operation enabled for provisioning profile:', '\n', '* Disable by setting `pre-embed-provisioning-profile` to `false`.');
+ await (0, util_provisioning_profiles_1.preEmbedProvisioningProfile)(validatedOpts, validatedOpts.provisioningProfile
+ ? await (0, util_provisioning_profiles_1.getProvisioningProfile)(validatedOpts.provisioningProfile, validatedOpts.keychain)
+ : null);
+ }
+ (0, util_1.debugLog)('Signing application...', '\n', '> Application:', validatedOpts.app, '\n', '> Platform:', validatedOpts.platform, '\n', '> Additional binaries:', validatedOpts.binaries, '\n', '> Identity:', validatedOpts.identity);
+ await signApplication(validatedOpts, identityInUse);
+ // Post-sign operations
+ (0, util_1.debugLog)('Application signed.');
+}
+exports.signApp = signApp;
+/**
+ * This function is a legacy callback implementation.
+ *
+ * @deprecated Please use the promise based "signApp" method
+ */
+const sign = (opts, cb) => {
+ signApp(opts)
+ .then(() => {
+ (0, util_1.debugLog)('Application signed: ' + opts.app);
+ if (cb)
+ cb();
+ })
+ .catch((err) => {
+ if (err.message)
+ (0, util_1.debugLog)(err.message);
+ else if (err.stack)
+ (0, util_1.debugLog)(err.stack);
+ else
+ (0, util_1.debugLog)(err);
+ if (cb)
+ cb(err);
+ });
+};
+exports.sign = sign;
+//# sourceMappingURL=sign.js.map \ No newline at end of file
diff --git a/desktop/node_modules/@electron/osx-sign/dist/cjs/sign.js.map b/desktop/node_modules/@electron/osx-sign/dist/cjs/sign.js.map
new file mode 100644
index 0000000..329d456
--- /dev/null
+++ b/desktop/node_modules/@electron/osx-sign/dist/cjs/sign.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"sign.js","sourceRoot":"","sources":["../../src/sign.ts"],"names":[],"mappings":"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"} \ No newline at end of file
diff --git a/desktop/node_modules/@electron/osx-sign/dist/cjs/types.d.ts b/desktop/node_modules/@electron/osx-sign/dist/cjs/types.d.ts
new file mode 100644
index 0000000..c2ba609
--- /dev/null
+++ b/desktop/node_modules/@electron/osx-sign/dist/cjs/types.d.ts
@@ -0,0 +1,73 @@
+export type ElectronMacPlatform = 'darwin' | 'mas';
+type SigningDistributionType = 'development' | 'distribution';
+export type BaseSignOptions = Readonly<{
+ app: string;
+ identity?: string;
+ platform?: ElectronMacPlatform;
+ keychain?: string;
+}>;
+type OnlyValidatedBaseSignOptions = {
+ platform: ElectronMacPlatform;
+};
+/**
+ * Any missing options will use the default values, providing a partial
+ * structure will shallow merge with the default values.
+ */
+export type PerFileSignOptions = {
+ /**
+ * The entitlements file to use when signing this file
+ */
+ entitlements?: string | string[];
+ /**
+ * Whether to enable hardened runtime for this file. Enabled by default.
+ */
+ hardenedRuntime?: boolean;
+ /**
+ * The designated requirements to embed when signing this file
+ */
+ requirements?: string;
+ /**
+ * See --options of the "codesign" command.
+ *
+ * https://www.manpagez.com/man/1/codesign
+ */
+ signatureFlags?: string | string[];
+ /**
+ * The timestamp server to use when signing, by default uses the Apple provided
+ * timestamp server.
+ */
+ timestamp?: string;
+};
+type OnlySignOptions = {
+ binaries?: string[];
+ optionsForFile?: (filePath: string) => PerFileSignOptions;
+ identityValidation?: boolean;
+ ignore?: string | string[] | ((file: string) => boolean);
+ preAutoEntitlements?: boolean;
+ preEmbedProvisioningProfile?: boolean;
+ provisioningProfile?: string;
+ strictVerify?: boolean;
+ type?: SigningDistributionType;
+ version?: string;
+};
+type OnlyValidatedSignOptions = {
+ ignore?: (string | ((file: string) => boolean))[];
+ type: SigningDistributionType;
+};
+type OnlyFlatOptions = {
+ identityValidation?: boolean;
+ install?: string;
+ pkg?: string;
+ scripts?: string;
+};
+type OnlyValidatedFlatOptions = {
+ install: string;
+ pkg: string;
+};
+type ValidatedForm<UnValidated, Validated> = Omit<UnValidated, keyof Validated> & Validated;
+export type ValidatedBaseSignOptions = Readonly<ValidatedForm<BaseSignOptions, OnlyValidatedBaseSignOptions>>;
+export type SignOptions = Readonly<OnlySignOptions & BaseSignOptions>;
+export type ValidatedSignOptions = Readonly<ValidatedForm<OnlySignOptions, OnlyValidatedSignOptions> & ValidatedBaseSignOptions>;
+export type FlatOptions = Readonly<OnlyFlatOptions & BaseSignOptions>;
+export type ValidatedFlatOptions = Readonly<ValidatedForm<OnlyFlatOptions, OnlyValidatedFlatOptions> & ValidatedBaseSignOptions>;
+export {};
diff --git a/desktop/node_modules/@electron/osx-sign/dist/cjs/types.js b/desktop/node_modules/@electron/osx-sign/dist/cjs/types.js
new file mode 100644
index 0000000..11e638d
--- /dev/null
+++ b/desktop/node_modules/@electron/osx-sign/dist/cjs/types.js
@@ -0,0 +1,3 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+//# sourceMappingURL=types.js.map \ No newline at end of file
diff --git a/desktop/node_modules/@electron/osx-sign/dist/cjs/types.js.map b/desktop/node_modules/@electron/osx-sign/dist/cjs/types.js.map
new file mode 100644
index 0000000..7b5fff8
--- /dev/null
+++ b/desktop/node_modules/@electron/osx-sign/dist/cjs/types.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":""} \ No newline at end of file
diff --git a/desktop/node_modules/@electron/osx-sign/dist/cjs/util-entitlements.d.ts b/desktop/node_modules/@electron/osx-sign/dist/cjs/util-entitlements.d.ts
new file mode 100644
index 0000000..0c4ff73
--- /dev/null
+++ b/desktop/node_modules/@electron/osx-sign/dist/cjs/util-entitlements.d.ts
@@ -0,0 +1,17 @@
+import { PerFileSignOptions, ValidatedSignOptions } from './types';
+import { Identity } from './util-identities';
+import { ProvisioningProfile } from './util-provisioning-profiles';
+type ComputedOptions = {
+ identity: Identity;
+ provisioningProfile?: ProvisioningProfile;
+};
+/**
+ * This function returns a promise completing the entitlements automation: The
+ * process includes checking in `Info.plist` for `ElectronTeamID` or setting
+ * parsed value from identity, and checking in entitlements file for
+ * `com.apple.security.application-groups` or inserting new into array. A
+ * temporary entitlements file may be created to replace the input for any
+ * changes introduced.
+ */
+export declare function preAutoEntitlements(opts: ValidatedSignOptions, perFileOpts: PerFileSignOptions, computed: ComputedOptions): Promise<void | string>;
+export {};
diff --git a/desktop/node_modules/@electron/osx-sign/dist/cjs/util-entitlements.js b/desktop/node_modules/@electron/osx-sign/dist/cjs/util-entitlements.js
new file mode 100644
index 0000000..aed4bce
--- /dev/null
+++ b/desktop/node_modules/@electron/osx-sign/dist/cjs/util-entitlements.js
@@ -0,0 +1,133 @@
+"use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+ if (k2 === undefined) k2 = k;
+ var desc = Object.getOwnPropertyDescriptor(m, k);
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
+ desc = { enumerable: true, get: function() { return m[k]; } };
+ }
+ Object.defineProperty(o, k2, desc);
+}) : (function(o, m, k, k2) {
+ if (k2 === undefined) k2 = k;
+ o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+ o["default"] = v;
+});
+var __importStar = (this && this.__importStar) || function (mod) {
+ if (mod && mod.__esModule) return mod;
+ var result = {};
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+ __setModuleDefault(result, mod);
+ return result;
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.preAutoEntitlements = void 0;
+const fs = __importStar(require("fs-extra"));
+const os = __importStar(require("os"));
+const path = __importStar(require("path"));
+const plist = __importStar(require("plist"));
+const util_1 = require("./util");
+const preAuthMemo = new Map();
+/**
+ * This function returns a promise completing the entitlements automation: The
+ * process includes checking in `Info.plist` for `ElectronTeamID` or setting
+ * parsed value from identity, and checking in entitlements file for
+ * `com.apple.security.application-groups` or inserting new into array. A
+ * temporary entitlements file may be created to replace the input for any
+ * changes introduced.
+ */
+async function preAutoEntitlements(opts, perFileOpts, computed) {
+ var _a;
+ if (!perFileOpts.entitlements)
+ return;
+ const memoKey = [opts.app, perFileOpts.entitlements].join('---');
+ if (preAuthMemo.has(memoKey))
+ return preAuthMemo.get(memoKey);
+ // If entitlements file not provided, default will be used. Fixes #41
+ const appInfoPath = path.join((0, util_1.getAppContentsPath)(opts), 'Info.plist');
+ (0, util_1.debugLog)('Automating entitlement app group...', '\n', '> Info.plist:', appInfoPath, '\n');
+ let entitlements;
+ if (typeof perFileOpts.entitlements === 'string') {
+ const entitlementsContents = await fs.readFile(perFileOpts.entitlements, 'utf8');
+ entitlements = plist.parse(entitlementsContents);
+ }
+ else {
+ entitlements = perFileOpts.entitlements.reduce((dict, entitlementKey) => (Object.assign(Object.assign({}, dict), { [entitlementKey]: true })), {});
+ }
+ if (!entitlements['com.apple.security.app-sandbox']) {
+ // Only automate when app sandbox enabled by user
+ return;
+ }
+ const appInfoContents = await fs.readFile(appInfoPath, 'utf8');
+ const appInfo = plist.parse(appInfoContents);
+ // Use ElectronTeamID in Info.plist if already specified
+ if (appInfo.ElectronTeamID) {
+ (0, util_1.debugLog)('`ElectronTeamID` found in `Info.plist`: ' + appInfo.ElectronTeamID);
+ }
+ else {
+ // The team identifier in signing identity should not be trusted
+ if (computed.provisioningProfile) {
+ appInfo.ElectronTeamID =
+ computed.provisioningProfile.message.Entitlements['com.apple.developer.team-identifier'];
+ (0, util_1.debugLog)('`ElectronTeamID` not found in `Info.plist`, use parsed from provisioning profile: ' +
+ appInfo.ElectronTeamID);
+ }
+ else {
+ const teamID = (_a = /^.+\((.+?)\)$/g.exec(computed.identity.name)) === null || _a === void 0 ? void 0 : _a[1];
+ if (!teamID) {
+ throw new Error(`Could not automatically determine ElectronTeamID from identity: ${computed.identity.name}`);
+ }
+ appInfo.ElectronTeamID = teamID;
+ (0, util_1.debugLog)('`ElectronTeamID` not found in `Info.plist`, use parsed from signing identity: ' +
+ appInfo.ElectronTeamID);
+ }
+ await fs.writeFile(appInfoPath, plist.build(appInfo), 'utf8');
+ (0, util_1.debugLog)('`Info.plist` updated:', '\n', '> Info.plist:', appInfoPath);
+ }
+ const appIdentifier = appInfo.ElectronTeamID + '.' + appInfo.CFBundleIdentifier;
+ // Insert application identifier if not exists
+ if (entitlements['com.apple.application-identifier']) {
+ (0, util_1.debugLog)('`com.apple.application-identifier` found in entitlements file: ' +
+ entitlements['com.apple.application-identifier']);
+ }
+ else {
+ (0, util_1.debugLog)('`com.apple.application-identifier` not found in entitlements file, new inserted: ' +
+ appIdentifier);
+ entitlements['com.apple.application-identifier'] = appIdentifier;
+ }
+ // Insert developer team identifier if not exists
+ if (entitlements['com.apple.developer.team-identifier']) {
+ (0, util_1.debugLog)('`com.apple.developer.team-identifier` found in entitlements file: ' +
+ entitlements['com.apple.developer.team-identifier']);
+ }
+ else {
+ (0, util_1.debugLog)('`com.apple.developer.team-identifier` not found in entitlements file, new inserted: ' +
+ appInfo.ElectronTeamID);
+ entitlements['com.apple.developer.team-identifier'] = appInfo.ElectronTeamID;
+ }
+ // Init entitlements app group key to array if not exists
+ if (!entitlements['com.apple.security.application-groups']) {
+ entitlements['com.apple.security.application-groups'] = [];
+ }
+ // Insert app group if not exists
+ if (Array.isArray(entitlements['com.apple.security.application-groups']) &&
+ entitlements['com.apple.security.application-groups'].indexOf(appIdentifier) === -1) {
+ (0, util_1.debugLog)('`com.apple.security.application-groups` not found in entitlements file, new inserted: ' +
+ appIdentifier);
+ entitlements['com.apple.security.application-groups'].push(appIdentifier);
+ }
+ else {
+ (0, util_1.debugLog)('`com.apple.security.application-groups` found in entitlements file: ' + appIdentifier);
+ }
+ // Create temporary entitlements file
+ const dir = await fs.mkdtemp(path.resolve(os.tmpdir(), 'tmp-entitlements-'));
+ const entitlementsPath = path.join(dir, 'entitlements.plist');
+ await fs.writeFile(entitlementsPath, plist.build(entitlements), 'utf8');
+ (0, util_1.debugLog)('Entitlements file updated:', '\n', '> Entitlements:', entitlementsPath);
+ preAuthMemo.set(memoKey, entitlementsPath);
+ return entitlementsPath;
+}
+exports.preAutoEntitlements = preAutoEntitlements;
+//# sourceMappingURL=util-entitlements.js.map \ No newline at end of file
diff --git a/desktop/node_modules/@electron/osx-sign/dist/cjs/util-entitlements.js.map b/desktop/node_modules/@electron/osx-sign/dist/cjs/util-entitlements.js.map
new file mode 100644
index 0000000..5e125c0
--- /dev/null
+++ b/desktop/node_modules/@electron/osx-sign/dist/cjs/util-entitlements.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"util-entitlements.js","sourceRoot":"","sources":["../../src/util-entitlements.ts"],"names":[],"mappings":"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"} \ No newline at end of file
diff --git a/desktop/node_modules/@electron/osx-sign/dist/cjs/util-identities.d.ts b/desktop/node_modules/@electron/osx-sign/dist/cjs/util-identities.d.ts
new file mode 100644
index 0000000..fe56cdb
--- /dev/null
+++ b/desktop/node_modules/@electron/osx-sign/dist/cjs/util-identities.d.ts
@@ -0,0 +1,6 @@
+export declare class Identity {
+ name: string;
+ hash?: string | undefined;
+ constructor(name: string, hash?: string | undefined);
+}
+export declare function findIdentities(keychain: string | null, identity: string): Promise<Identity[]>;
diff --git a/desktop/node_modules/@electron/osx-sign/dist/cjs/util-identities.js b/desktop/node_modules/@electron/osx-sign/dist/cjs/util-identities.js
new file mode 100644
index 0000000..bf5c128
--- /dev/null
+++ b/desktop/node_modules/@electron/osx-sign/dist/cjs/util-identities.js
@@ -0,0 +1,35 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.findIdentities = exports.Identity = void 0;
+const util_1 = require("./util");
+class Identity {
+ constructor(name, hash) {
+ this.name = name;
+ this.hash = hash;
+ }
+}
+exports.Identity = Identity;
+async function findIdentities(keychain, identity) {
+ // Only to look for valid identities, excluding those flagged with
+ // CSSMERR_TP_CERT_EXPIRED or CSSMERR_TP_NOT_TRUSTED. Fixes #9
+ const args = [
+ 'find-identity',
+ '-v'
+ ];
+ if (keychain) {
+ args.push(keychain);
+ }
+ const result = await (0, util_1.execFileAsync)('security', args);
+ const identities = result.split('\n').map(function (line) {
+ if (line.indexOf(identity) >= 0) {
+ const identityFound = line.substring(line.indexOf('"') + 1, line.lastIndexOf('"'));
+ const identityHashFound = line.substring(line.indexOf(')') + 2, line.indexOf('"') - 1);
+ (0, util_1.debugLog)('Identity:', '\n', '> Name:', identityFound, '\n', '> Hash:', identityHashFound);
+ return new Identity(identityFound, identityHashFound);
+ }
+ return null;
+ });
+ return (0, util_1.compactFlattenedList)(identities);
+}
+exports.findIdentities = findIdentities;
+//# sourceMappingURL=util-identities.js.map \ No newline at end of file
diff --git a/desktop/node_modules/@electron/osx-sign/dist/cjs/util-identities.js.map b/desktop/node_modules/@electron/osx-sign/dist/cjs/util-identities.js.map
new file mode 100644
index 0000000..257ef88
--- /dev/null
+++ b/desktop/node_modules/@electron/osx-sign/dist/cjs/util-identities.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"util-identities.js","sourceRoot":"","sources":["../../src/util-identities.ts"],"names":[],"mappings":";;;AAAA,iCAAuE;AAEvE,MAAa,QAAQ;IACnB,YAAoB,IAAY,EAAS,IAAa;QAAlC,SAAI,GAAJ,IAAI,CAAQ;QAAS,SAAI,GAAJ,IAAI,CAAS;IAAG,CAAC;CAC3D;AAFD,4BAEC;AAEM,KAAK,UAAU,cAAc,CAAE,QAAuB,EAAE,QAAgB;IAC7E,kEAAkE;IAClE,8DAA8D;IAE9D,MAAM,IAAI,GAAG;QACX,eAAe;QACf,IAAI;KACL,CAAC;IACF,IAAI,QAAQ,EAAE;QACZ,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;KACrB;IAED,MAAM,MAAM,GAAG,MAAM,IAAA,oBAAa,EAAC,UAAU,EAAE,IAAI,CAAC,CAAC;IACrD,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,UAAU,IAAI;QACtD,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;YAC/B,MAAM,aAAa,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC;YACnF,MAAM,iBAAiB,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;YACvF,IAAA,eAAQ,EAAC,WAAW,EAAE,IAAI,EACxB,SAAS,EAAE,aAAa,EAAE,IAAI,EAC9B,SAAS,EAAE,iBAAiB,CAAC,CAAC;YAChC,OAAO,IAAI,QAAQ,CAAC,aAAa,EAAE,iBAAiB,CAAC,CAAC;SACvD;QAED,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;IAEH,OAAO,IAAA,2BAAoB,EAAC,UAAU,CAAC,CAAC;AAC1C,CAAC;AA3BD,wCA2BC"} \ No newline at end of file
diff --git a/desktop/node_modules/@electron/osx-sign/dist/cjs/util-provisioning-profiles.d.ts b/desktop/node_modules/@electron/osx-sign/dist/cjs/util-provisioning-profiles.d.ts
new file mode 100644
index 0000000..7c9d9c3
--- /dev/null
+++ b/desktop/node_modules/@electron/osx-sign/dist/cjs/util-provisioning-profiles.d.ts
@@ -0,0 +1,25 @@
+import { ElectronMacPlatform, ValidatedSignOptions } from './types';
+export declare class ProvisioningProfile {
+ filePath: string;
+ message: any;
+ constructor(filePath: string, message: any);
+ get name(): string;
+ get platforms(): ElectronMacPlatform[];
+ get type(): "development" | "distribution";
+}
+/**
+ * Returns a promise resolving to a ProvisioningProfile instance based on file.
+ * @function
+ * @param {string} filePath - Path to provisioning profile.
+ * @param {string} keychain - Keychain to use when unlocking provisioning profile.
+ * @returns {Promise} Promise.
+ */
+export declare function getProvisioningProfile(filePath: string, keychain?: string | null): Promise<ProvisioningProfile>;
+/**
+ * Returns a promise resolving to a list of suitable provisioning profile within the current working directory.
+ */
+export declare function findProvisioningProfiles(opts: ValidatedSignOptions): Promise<ProvisioningProfile[]>;
+/**
+ * Returns a promise embedding the provisioning profile in the app Contents folder.
+ */
+export declare function preEmbedProvisioningProfile(opts: ValidatedSignOptions, profile: ProvisioningProfile | null): Promise<void>;
diff --git a/desktop/node_modules/@electron/osx-sign/dist/cjs/util-provisioning-profiles.js b/desktop/node_modules/@electron/osx-sign/dist/cjs/util-provisioning-profiles.js
new file mode 100644
index 0000000..2c1b7e5
--- /dev/null
+++ b/desktop/node_modules/@electron/osx-sign/dist/cjs/util-provisioning-profiles.js
@@ -0,0 +1,148 @@
+"use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+ if (k2 === undefined) k2 = k;
+ var desc = Object.getOwnPropertyDescriptor(m, k);
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
+ desc = { enumerable: true, get: function() { return m[k]; } };
+ }
+ Object.defineProperty(o, k2, desc);
+}) : (function(o, m, k, k2) {
+ if (k2 === undefined) k2 = k;
+ o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+ o["default"] = v;
+});
+var __importStar = (this && this.__importStar) || function (mod) {
+ if (mod && mod.__esModule) return mod;
+ var result = {};
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+ __setModuleDefault(result, mod);
+ return result;
+};
+var __importDefault = (this && this.__importDefault) || function (mod) {
+ return (mod && mod.__esModule) ? mod : { "default": mod };
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.preEmbedProvisioningProfile = exports.findProvisioningProfiles = exports.getProvisioningProfile = exports.ProvisioningProfile = void 0;
+const fs = __importStar(require("fs-extra"));
+const path = __importStar(require("path"));
+const plist_1 = __importDefault(require("plist"));
+const util_1 = require("./util");
+class ProvisioningProfile {
+ constructor(filePath, message) {
+ this.filePath = filePath;
+ this.message = message;
+ }
+ get name() {
+ return this.message.Name;
+ }
+ get platforms() {
+ if ('ProvisionsAllDevices' in this.message)
+ return ['darwin'];
+ // Developer ID
+ else if (this.type === 'distribution')
+ return ['mas'];
+ // Mac App Store
+ else
+ return ['darwin', 'mas']; // Mac App Development
+ }
+ get type() {
+ if ('ProvisionedDevices' in this.message)
+ return 'development';
+ // Mac App Development
+ else
+ return 'distribution'; // Developer ID or Mac App Store
+ }
+}
+exports.ProvisioningProfile = ProvisioningProfile;
+/**
+ * Returns a promise resolving to a ProvisioningProfile instance based on file.
+ * @function
+ * @param {string} filePath - Path to provisioning profile.
+ * @param {string} keychain - Keychain to use when unlocking provisioning profile.
+ * @returns {Promise} Promise.
+ */
+async function getProvisioningProfile(filePath, keychain = null) {
+ const securityArgs = [
+ 'cms',
+ '-D',
+ '-i',
+ filePath // Use infile as source of data
+ ];
+ if (keychain) {
+ securityArgs.push('-k', keychain);
+ }
+ const result = await (0, util_1.execFileAsync)('security', securityArgs);
+ const provisioningProfile = new ProvisioningProfile(filePath, plist_1.default.parse(result));
+ (0, util_1.debugLog)('Provisioning profile:', '\n', '> Name:', provisioningProfile.name, '\n', '> Platforms:', provisioningProfile.platforms, '\n', '> Type:', provisioningProfile.type, '\n', '> Path:', provisioningProfile.filePath, '\n', '> Message:', provisioningProfile.message);
+ return provisioningProfile;
+}
+exports.getProvisioningProfile = getProvisioningProfile;
+/**
+ * Returns a promise resolving to a list of suitable provisioning profile within the current working directory.
+ */
+async function findProvisioningProfiles(opts) {
+ const cwd = process.cwd();
+ const children = await fs.readdir(cwd);
+ const foundProfiles = (0, util_1.compactFlattenedList)(await Promise.all(children.map(async (child) => {
+ const filePath = path.resolve(cwd, child);
+ const stat = await fs.stat(filePath);
+ if (stat.isFile() && path.extname(filePath) === '.provisionprofile') {
+ return filePath;
+ }
+ return null;
+ })));
+ return (0, util_1.compactFlattenedList)(await Promise.all(foundProfiles.map(async (filePath) => {
+ const profile = await getProvisioningProfile(filePath);
+ if (profile.platforms.indexOf(opts.platform) >= 0 && profile.type === opts.type) {
+ return profile;
+ }
+ (0, util_1.debugWarn)('Provisioning profile above ignored, not for ' + opts.platform + ' ' + opts.type + '.');
+ return null;
+ })));
+}
+exports.findProvisioningProfiles = findProvisioningProfiles;
+/**
+ * Returns a promise embedding the provisioning profile in the app Contents folder.
+ */
+async function preEmbedProvisioningProfile(opts, profile) {
+ async function embedProvisioningProfile(profile) {
+ (0, util_1.debugLog)('Looking for existing provisioning profile...');
+ const embeddedFilePath = path.join((0, util_1.getAppContentsPath)(opts), 'embedded.provisionprofile');
+ if (await fs.pathExists(embeddedFilePath)) {
+ (0, util_1.debugLog)('Found embedded provisioning profile:', '\n', '* Please manually remove the existing file if not wanted.', '\n', '* Current file at:', embeddedFilePath);
+ }
+ else {
+ (0, util_1.debugLog)('Embedding provisioning profile...');
+ await fs.copy(profile.filePath, embeddedFilePath);
+ }
+ }
+ if (profile) {
+ // User input provisioning profile
+ return await embedProvisioningProfile(profile);
+ }
+ else {
+ // Discover provisioning profile
+ (0, util_1.debugLog)('No `provisioning-profile` passed in arguments, will find in current working directory and in user library...');
+ const profiles = await findProvisioningProfiles(opts);
+ if (profiles.length > 0) {
+ // Provisioning profile(s) found
+ if (profiles.length > 1) {
+ (0, util_1.debugLog)('Multiple provisioning profiles found, will use the first discovered.');
+ }
+ else {
+ (0, util_1.debugLog)('Found 1 provisioning profile.');
+ }
+ await embedProvisioningProfile(profiles[0]);
+ }
+ else {
+ // No provisioning profile found
+ (0, util_1.debugLog)('No provisioning profile found, will not embed profile in app contents.');
+ }
+ }
+}
+exports.preEmbedProvisioningProfile = preEmbedProvisioningProfile;
+//# sourceMappingURL=util-provisioning-profiles.js.map \ No newline at end of file
diff --git a/desktop/node_modules/@electron/osx-sign/dist/cjs/util-provisioning-profiles.js.map b/desktop/node_modules/@electron/osx-sign/dist/cjs/util-provisioning-profiles.js.map
new file mode 100644
index 0000000..bc555ff
--- /dev/null
+++ b/desktop/node_modules/@electron/osx-sign/dist/cjs/util-provisioning-profiles.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"util-provisioning-profiles.js","sourceRoot":"","sources":["../../src/util-provisioning-profiles.ts"],"names":[],"mappings":"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"} \ No newline at end of file
diff --git a/desktop/node_modules/@electron/osx-sign/dist/cjs/util.d.ts b/desktop/node_modules/@electron/osx-sign/dist/cjs/util.d.ts
new file mode 100644
index 0000000..d420151
--- /dev/null
+++ b/desktop/node_modules/@electron/osx-sign/dist/cjs/util.d.ts
@@ -0,0 +1,35 @@
+/// <reference types="node" />
+import * as child from 'child_process';
+import debug from 'debug';
+import { BaseSignOptions, ElectronMacPlatform } from './types';
+export declare const debugLog: debug.Debugger;
+export declare const debugWarn: debug.Debugger;
+export declare function execFileAsync(file: string, args: string[], options?: child.ExecFileOptions): Promise<string>;
+type DeepListItem<T> = null | T | DeepListItem<T>[];
+type DeepList<T> = DeepListItem<T>[];
+export declare function compactFlattenedList<T>(list: DeepList<T>): T[];
+/**
+ * Returns the path to the "Contents" folder inside the application bundle
+ */
+export declare function getAppContentsPath(opts: BaseSignOptions): string;
+/**
+ * Returns the path to app "Frameworks" within contents.
+ */
+export declare function getAppFrameworksPath(opts: BaseSignOptions): string;
+export declare function detectElectronPlatform(opts: BaseSignOptions): Promise<ElectronMacPlatform>;
+/**
+ * This function returns a promise validating opts.app, the application to be signed or flattened.
+ */
+export declare function validateOptsApp(opts: BaseSignOptions): Promise<void>;
+/**
+ * This function returns a promise validating opts.platform, the platform of Electron build. It allows auto-discovery if no opts.platform is specified.
+ */
+export declare function validateOptsPlatform(opts: BaseSignOptions): Promise<ElectronMacPlatform>;
+/**
+ * This function returns a promise resolving all child paths within the directory specified.
+ * @function
+ * @param {string} dirPath - Path to directory.
+ * @returns {Promise} Promise resolving child paths needing signing in order.
+ */
+export declare function walkAsync(dirPath: string): Promise<string[]>;
+export {};
diff --git a/desktop/node_modules/@electron/osx-sign/dist/cjs/util.js b/desktop/node_modules/@electron/osx-sign/dist/cjs/util.js
new file mode 100644
index 0000000..8fdd393
--- /dev/null
+++ b/desktop/node_modules/@electron/osx-sign/dist/cjs/util.js
@@ -0,0 +1,182 @@
+"use strict";
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+ if (k2 === undefined) k2 = k;
+ var desc = Object.getOwnPropertyDescriptor(m, k);
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
+ desc = { enumerable: true, get: function() { return m[k]; } };
+ }
+ Object.defineProperty(o, k2, desc);
+}) : (function(o, m, k, k2) {
+ if (k2 === undefined) k2 = k;
+ o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+ o["default"] = v;
+});
+var __importStar = (this && this.__importStar) || function (mod) {
+ if (mod && mod.__esModule) return mod;
+ var result = {};
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+ __setModuleDefault(result, mod);
+ return result;
+};
+var __importDefault = (this && this.__importDefault) || function (mod) {
+ return (mod && mod.__esModule) ? mod : { "default": mod };
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.walkAsync = exports.validateOptsPlatform = exports.validateOptsApp = exports.detectElectronPlatform = exports.getAppFrameworksPath = exports.getAppContentsPath = exports.compactFlattenedList = exports.execFileAsync = exports.debugWarn = exports.debugLog = void 0;
+const child = __importStar(require("child_process"));
+const fs = __importStar(require("fs-extra"));
+const isbinaryfile_1 = require("isbinaryfile");
+const path = __importStar(require("path"));
+const debug_1 = __importDefault(require("debug"));
+exports.debugLog = (0, debug_1.default)('electron-osx-sign');
+exports.debugLog.log = console.log.bind(console);
+exports.debugWarn = (0, debug_1.default)('electron-osx-sign:warn');
+exports.debugWarn.log = console.warn.bind(console);
+const removePassword = function (input) {
+ return input.replace(/(-P |pass:|\/p|-pass )([^ ]+)/, function (_, p1) {
+ return `${p1}***`;
+ });
+};
+async function execFileAsync(file, args, options = {}) {
+ if (exports.debugLog.enabled) {
+ (0, exports.debugLog)('Executing...', file, args && Array.isArray(args) ? removePassword(args.join(' ')) : '');
+ }
+ return new Promise(function (resolve, reject) {
+ child.execFile(file, args, options, function (err, stdout, stderr) {
+ if (err) {
+ (0, exports.debugLog)('Error executing file:', '\n', '> Stdout:', stdout, '\n', '> Stderr:', stderr);
+ reject(err);
+ return;
+ }
+ resolve(stdout);
+ });
+ });
+}
+exports.execFileAsync = execFileAsync;
+function compactFlattenedList(list) {
+ const result = [];
+ function populateResult(list) {
+ if (!Array.isArray(list)) {
+ if (list)
+ result.push(list);
+ }
+ else if (list.length > 0) {
+ for (const item of list)
+ if (item)
+ populateResult(item);
+ }
+ }
+ populateResult(list);
+ return result;
+}
+exports.compactFlattenedList = compactFlattenedList;
+/**
+ * Returns the path to the "Contents" folder inside the application bundle
+ */
+function getAppContentsPath(opts) {
+ return path.join(opts.app, 'Contents');
+}
+exports.getAppContentsPath = getAppContentsPath;
+/**
+ * Returns the path to app "Frameworks" within contents.
+ */
+function getAppFrameworksPath(opts) {
+ return path.join(getAppContentsPath(opts), 'Frameworks');
+}
+exports.getAppFrameworksPath = getAppFrameworksPath;
+async function detectElectronPlatform(opts) {
+ const appFrameworksPath = getAppFrameworksPath(opts);
+ if (await fs.pathExists(path.resolve(appFrameworksPath, 'Squirrel.framework'))) {
+ return 'darwin';
+ }
+ else {
+ return 'mas';
+ }
+}
+exports.detectElectronPlatform = detectElectronPlatform;
+/**
+ * This function returns a promise resolving the file path if file binary.
+ */
+async function getFilePathIfBinary(filePath) {
+ if (await (0, isbinaryfile_1.isBinaryFile)(filePath)) {
+ return filePath;
+ }
+ return null;
+}
+/**
+ * This function returns a promise validating opts.app, the application to be signed or flattened.
+ */
+async function validateOptsApp(opts) {
+ if (!opts.app) {
+ throw new Error('Path to application must be specified.');
+ }
+ if (path.extname(opts.app) !== '.app') {
+ throw new Error('Extension of application must be `.app`.');
+ }
+ if (!(await fs.pathExists(opts.app))) {
+ throw new Error(`Application at path "${opts.app}" could not be found`);
+ }
+}
+exports.validateOptsApp = validateOptsApp;
+/**
+ * This function returns a promise validating opts.platform, the platform of Electron build. It allows auto-discovery if no opts.platform is specified.
+ */
+async function validateOptsPlatform(opts) {
+ if (opts.platform) {
+ if (opts.platform === 'mas' || opts.platform === 'darwin') {
+ return opts.platform;
+ }
+ else {
+ (0, exports.debugWarn)('`platform` passed in arguments not supported, checking Electron platform...');
+ }
+ }
+ else {
+ (0, exports.debugWarn)('No `platform` passed in arguments, checking Electron platform...');
+ }
+ return await detectElectronPlatform(opts);
+}
+exports.validateOptsPlatform = validateOptsPlatform;
+/**
+ * This function returns a promise resolving all child paths within the directory specified.
+ * @function
+ * @param {string} dirPath - Path to directory.
+ * @returns {Promise} Promise resolving child paths needing signing in order.
+ */
+async function walkAsync(dirPath) {
+ (0, exports.debugLog)('Walking... ' + dirPath);
+ async function _walkAsync(dirPath) {
+ const children = await fs.readdir(dirPath);
+ return await Promise.all(children.map(async (child) => {
+ const filePath = path.resolve(dirPath, child);
+ const stat = await fs.stat(filePath);
+ if (stat.isFile()) {
+ switch (path.extname(filePath)) {
+ case '.cstemp': // Temporary file generated from past codesign
+ (0, exports.debugLog)('Removing... ' + filePath);
+ await fs.remove(filePath);
+ return null;
+ default:
+ return await getFilePathIfBinary(filePath);
+ }
+ }
+ else if (stat.isDirectory() && !stat.isSymbolicLink()) {
+ const walkResult = await _walkAsync(filePath);
+ switch (path.extname(filePath)) {
+ case '.app': // Application
+ case '.framework': // Framework
+ walkResult.push(filePath);
+ }
+ return walkResult;
+ }
+ return null;
+ }));
+ }
+ const allPaths = await _walkAsync(dirPath);
+ return compactFlattenedList(allPaths);
+}
+exports.walkAsync = walkAsync;
+//# sourceMappingURL=util.js.map \ No newline at end of file
diff --git a/desktop/node_modules/@electron/osx-sign/dist/cjs/util.js.map b/desktop/node_modules/@electron/osx-sign/dist/cjs/util.js.map
new file mode 100644
index 0000000..2e565d7
--- /dev/null
+++ b/desktop/node_modules/@electron/osx-sign/dist/cjs/util.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"util.js","sourceRoot":"","sources":["../../src/util.ts"],"names":[],"mappings":"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"} \ No newline at end of file
diff --git a/desktop/node_modules/@electron/osx-sign/dist/esm/flat.d.ts b/desktop/node_modules/@electron/osx-sign/dist/esm/flat.d.ts
new file mode 100644
index 0000000..4d63f07
--- /dev/null
+++ b/desktop/node_modules/@electron/osx-sign/dist/esm/flat.d.ts
@@ -0,0 +1,11 @@
+import { FlatOptions } from './types';
+/**
+ * This function is exported and returns a promise flattening the application.
+ */
+export declare function buildPkg(_opts: FlatOptions): Promise<void>;
+/**
+ * This function is exported with normal callback implementation.
+ *
+ * @deprecated Please use the promise based "buildPkg" method
+ */
+export declare const flat: (opts: FlatOptions, cb?: ((error?: Error) => void) | undefined) => void;
diff --git a/desktop/node_modules/@electron/osx-sign/dist/esm/flat.js b/desktop/node_modules/@electron/osx-sign/dist/esm/flat.js
new file mode 100644
index 0000000..3b72803
--- /dev/null
+++ b/desktop/node_modules/@electron/osx-sign/dist/esm/flat.js
@@ -0,0 +1,125 @@
+import * as path from 'path';
+import { debugLog, debugWarn, execFileAsync, validateOptsApp, validateOptsPlatform } from './util';
+import { findIdentities } from './util-identities';
+const pkgVersion = require('../../package.json').version;
+/**
+ * This function returns a promise validating all options passed in opts.
+ * @function
+ * @param {Object} opts - Options.
+ * @returns {Promise} Promise.
+ */
+async function validateFlatOpts(opts) {
+ await validateOptsApp(opts);
+ let pkg = opts.pkg;
+ if (pkg) {
+ if (typeof pkg !== 'string')
+ throw new Error('`pkg` must be a string.');
+ if (path.extname(pkg) !== '.pkg') {
+ throw new Error('Extension of output package must be `.pkg`.');
+ }
+ }
+ else {
+ debugWarn('No `pkg` passed in arguments, will fallback to default inferred from the given application.');
+ pkg = path.join(path.dirname(opts.app), path.basename(opts.app, '.app') + '.pkg');
+ }
+ let install = opts.install;
+ if (install) {
+ if (typeof install !== 'string') {
+ return Promise.reject(new Error('`install` must be a string.'));
+ }
+ }
+ else {
+ debugWarn('No `install` passed in arguments, will fallback to default `/Applications`.');
+ install = '/Applications';
+ }
+ return Object.assign(Object.assign({}, opts), { pkg,
+ install, platform: await validateOptsPlatform(opts) });
+}
+/**
+ * This function returns a promise flattening the application.
+ * @function
+ * @param {Object} opts - Options.
+ * @returns {Promise} Promise.
+ */
+async function buildApplicationPkg(opts, identity) {
+ const args = ['--component', opts.app, opts.install, '--sign', identity.name, opts.pkg];
+ if (opts.keychain) {
+ args.unshift('--keychain', opts.keychain);
+ }
+ if (opts.scripts) {
+ args.unshift('--scripts', opts.scripts);
+ }
+ debugLog('Flattening... ' + opts.app);
+ await execFileAsync('productbuild', args);
+}
+/**
+ * This function is exported and returns a promise flattening the application.
+ */
+export async function buildPkg(_opts) {
+ debugLog('@electron/osx-sign@%s', pkgVersion);
+ const validatedOptions = await validateFlatOpts(_opts);
+ let identities = [];
+ let identityInUse = null;
+ if (validatedOptions.identity) {
+ debugLog('`identity` passed in arguments.');
+ if (validatedOptions.identityValidation === false) {
+ // Do nothing
+ }
+ else {
+ identities = await findIdentities(validatedOptions.keychain || null, validatedOptions.identity);
+ }
+ }
+ else {
+ debugWarn('No `identity` passed in arguments...');
+ if (validatedOptions.platform === 'mas') {
+ debugLog('Finding `3rd Party Mac Developer Installer` certificate for flattening app distribution in the Mac App Store...');
+ identities = await findIdentities(validatedOptions.keychain || null, '3rd Party Mac Developer Installer:');
+ }
+ else {
+ debugLog('Finding `Developer ID Application` certificate for distribution outside the Mac App Store...');
+ identities = await findIdentities(validatedOptions.keychain || null, 'Developer ID Installer:');
+ }
+ }
+ if (identities.length > 0) {
+ // Provisioning profile(s) found
+ if (identities.length > 1) {
+ debugWarn('Multiple identities found, will use the first discovered.');
+ }
+ else {
+ debugLog('Found 1 identity.');
+ }
+ identityInUse = identities[0];
+ }
+ else {
+ // No identity found
+ throw new Error('No identity found for signing.');
+ }
+ debugLog('Flattening application...', '\n', '> Application:', validatedOptions.app, '\n', '> Package output:', validatedOptions.pkg, '\n', '> Install path:', validatedOptions.install, '\n', '> Identity:', validatedOptions.identity, '\n', '> Scripts:', validatedOptions.scripts);
+ await buildApplicationPkg(validatedOptions, identityInUse);
+ debugLog('Application flattened.');
+}
+/**
+ * This function is exported with normal callback implementation.
+ *
+ * @deprecated Please use the promise based "buildPkg" method
+ */
+export const flat = (opts, cb) => {
+ buildPkg(opts)
+ .then(() => {
+ debugLog('Application flattened, saved to: ' + opts.app);
+ if (cb)
+ cb();
+ })
+ .catch((err) => {
+ debugLog('Flat failed:');
+ if (err.message)
+ debugLog(err.message);
+ else if (err.stack)
+ debugLog(err.stack);
+ else
+ debugLog(err);
+ if (cb)
+ cb(err);
+ });
+};
+//# sourceMappingURL=flat.js.map \ No newline at end of file
diff --git a/desktop/node_modules/@electron/osx-sign/dist/esm/flat.js.map b/desktop/node_modules/@electron/osx-sign/dist/esm/flat.js.map
new file mode 100644
index 0000000..2337fb6
--- /dev/null
+++ b/desktop/node_modules/@electron/osx-sign/dist/esm/flat.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"flat.js","sourceRoot":"","sources":["../../src/flat.ts"],"names":[],"mappings":"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"} \ No newline at end of file
diff --git a/desktop/node_modules/@electron/osx-sign/dist/esm/index.d.ts b/desktop/node_modules/@electron/osx-sign/dist/esm/index.d.ts
new file mode 100644
index 0000000..deb3ca0
--- /dev/null
+++ b/desktop/node_modules/@electron/osx-sign/dist/esm/index.d.ts
@@ -0,0 +1,4 @@
+import { sign, signApp } from './sign';
+import { flat, buildPkg } from './flat';
+export { sign, flat, signApp as signAsync, signApp, buildPkg as flatAsync, buildPkg };
+export * from './types';
diff --git a/desktop/node_modules/@electron/osx-sign/dist/esm/index.js b/desktop/node_modules/@electron/osx-sign/dist/esm/index.js
new file mode 100644
index 0000000..de8bd18
--- /dev/null
+++ b/desktop/node_modules/@electron/osx-sign/dist/esm/index.js
@@ -0,0 +1,14 @@
+import { sign, signApp } from './sign';
+import { flat, buildPkg } from './flat';
+// TODO: Remove and leave only proper named exports, but for non-breaking change reasons
+// we need to keep this weirdness for now
+module.exports = sign;
+module.exports.sign = sign;
+module.exports.signAsync = signApp;
+module.exports.signApp = signApp;
+module.exports.flat = flat;
+module.exports.flatAsync = buildPkg;
+module.exports.buildPkg = buildPkg;
+export { sign, flat, signApp as signAsync, signApp, buildPkg as flatAsync, buildPkg };
+export * from './types';
+//# sourceMappingURL=index.js.map \ No newline at end of file
diff --git a/desktop/node_modules/@electron/osx-sign/dist/esm/index.js.map b/desktop/node_modules/@electron/osx-sign/dist/esm/index.js.map
new file mode 100644
index 0000000..616e01e
--- /dev/null
+++ b/desktop/node_modules/@electron/osx-sign/dist/esm/index.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AACvC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAExC,wFAAwF;AACxF,yCAAyC;AACzC,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC;AACtB,MAAM,CAAC,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;AAC3B,MAAM,CAAC,OAAO,CAAC,SAAS,GAAG,OAAO,CAAC;AACnC,MAAM,CAAC,OAAO,CAAC,OAAO,GAAG,OAAO,CAAC;AACjC,MAAM,CAAC,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;AAC3B,MAAM,CAAC,OAAO,CAAC,SAAS,GAAG,QAAQ,CAAC;AACpC,MAAM,CAAC,OAAO,CAAC,QAAQ,GAAG,QAAQ,CAAC;AAEnC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,IAAI,SAAS,EAAE,OAAO,EAAE,QAAQ,IAAI,SAAS,EAAE,QAAQ,EAAE,CAAC;AACtF,cAAc,SAAS,CAAC"} \ No newline at end of file
diff --git a/desktop/node_modules/@electron/osx-sign/dist/esm/sign.d.ts b/desktop/node_modules/@electron/osx-sign/dist/esm/sign.d.ts
new file mode 100644
index 0000000..14eda7e
--- /dev/null
+++ b/desktop/node_modules/@electron/osx-sign/dist/esm/sign.d.ts
@@ -0,0 +1,11 @@
+import { SignOptions } from './types';
+/**
+ * This function returns a promise signing the application.
+ */
+export declare function signApp(_opts: SignOptions): Promise<void>;
+/**
+ * This function is a legacy callback implementation.
+ *
+ * @deprecated Please use the promise based "signApp" method
+ */
+export declare const sign: (opts: SignOptions, cb?: ((error?: Error) => void) | undefined) => void;
diff --git a/desktop/node_modules/@electron/osx-sign/dist/esm/sign.js b/desktop/node_modules/@electron/osx-sign/dist/esm/sign.js
new file mode 100644
index 0000000..856aab4
--- /dev/null
+++ b/desktop/node_modules/@electron/osx-sign/dist/esm/sign.js
@@ -0,0 +1,332 @@
+import * as fs from 'fs-extra';
+import * as os from 'os';
+import * as path from 'path';
+import * as plist from 'plist';
+import compareVersion from 'compare-version';
+import { debugLog, debugWarn, getAppContentsPath, execFileAsync, validateOptsApp, validateOptsPlatform, walkAsync } from './util';
+import { Identity, findIdentities } from './util-identities';
+import { preEmbedProvisioningProfile, getProvisioningProfile } from './util-provisioning-profiles';
+import { preAutoEntitlements } from './util-entitlements';
+const pkgVersion = require('../../package.json').version;
+const osRelease = os.release();
+/**
+ * This function returns a promise validating opts.binaries, the additional binaries to be signed along with the discovered enclosed components.
+ */
+async function validateOptsBinaries(opts) {
+ if (opts.binaries) {
+ if (!Array.isArray(opts.binaries)) {
+ throw new Error('Additional binaries should be an Array.');
+ }
+ // TODO: Presence check for binary files, reject if any does not exist
+ }
+}
+function validateOptsIgnore(ignore) {
+ if (ignore && !(ignore instanceof Array)) {
+ return [ignore];
+ }
+}
+/**
+ * This function returns a promise validating all options passed in opts.
+ */
+async function validateSignOpts(opts) {
+ await validateOptsBinaries(opts);
+ await validateOptsApp(opts);
+ if (opts.provisioningProfile && typeof opts.provisioningProfile !== 'string') {
+ throw new Error('Path to provisioning profile should be a string.');
+ }
+ if (opts.type && opts.type !== 'development' && opts.type !== 'distribution') {
+ throw new Error('Type must be either `development` or `distribution`.');
+ }
+ const platform = await validateOptsPlatform(opts);
+ const cloned = Object.assign(Object.assign({}, opts), { ignore: validateOptsIgnore(opts.ignore), type: opts.type || 'distribution', platform });
+ return cloned;
+}
+/**
+ * This function returns a promise verifying the code sign of application bundle.
+ */
+async function verifySignApplication(opts) {
+ // Verify with codesign
+ debugLog('Verifying application bundle with codesign...');
+ await execFileAsync('codesign', ['--verify', '--deep'].concat(opts.strictVerify !== false && compareVersion(osRelease, '15.0.0') >= 0 // Strict flag since darwin 15.0.0 --> OS X 10.11.0 El Capitan
+ ? [
+ '--strict' +
+ (opts.strictVerify
+ ? '=' + opts.strictVerify // Array should be converted to a comma separated string
+ : '')
+ ]
+ : [], ['--verbose=2', opts.app]));
+}
+function defaultOptionsForFile(filePath, platform) {
+ const entitlementsFolder = path.resolve(__dirname, '..', '..', 'entitlements');
+ let entitlementsFile;
+ if (platform === 'darwin') {
+ // Default Entitlements
+ // c.f. https://source.chromium.org/chromium/chromium/src/+/main:chrome/app/app-entitlements.plist
+ // Also include JIT for main process V8
+ entitlementsFile = path.resolve(entitlementsFolder, 'default.darwin.plist');
+ // Plugin helper
+ // c.f. https://source.chromium.org/chromium/chromium/src/+/main:chrome/app/helper-plugin-entitlements.plist
+ if (filePath.includes('(Plugin).app')) {
+ entitlementsFile = path.resolve(entitlementsFolder, 'default.darwin.plugin.plist');
+ // GPU Helper
+ // c.f. https://source.chromium.org/chromium/chromium/src/+/main:chrome/app/helper-gpu-entitlements.plist
+ }
+ else if (filePath.includes('(GPU).app')) {
+ entitlementsFile = path.resolve(entitlementsFolder, 'default.darwin.gpu.plist');
+ // Renderer Helper
+ // c.f. https://source.chromium.org/chromium/chromium/src/+/main:chrome/app/helper-renderer-entitlements.plist
+ }
+ else if (filePath.includes('(Renderer).app')) {
+ entitlementsFile = path.resolve(entitlementsFolder, 'default.darwin.renderer.plist');
+ }
+ }
+ else {
+ // Default entitlements
+ // TODO: Can these be more scoped like the non-mas variant?
+ entitlementsFile = path.resolve(entitlementsFolder, 'default.mas.plist');
+ // If it is not the top level app bundle, we sign with inherit
+ if (filePath.includes('.app/')) {
+ entitlementsFile = path.resolve(entitlementsFolder, 'default.mas.child.plist');
+ }
+ }
+ return {
+ entitlements: entitlementsFile,
+ hardenedRuntime: true,
+ requirements: undefined,
+ signatureFlags: undefined,
+ timestamp: undefined
+ };
+}
+async function mergeOptionsForFile(opts, defaults) {
+ const mergedPerFileOptions = Object.assign({}, defaults);
+ if (opts) {
+ if (opts.entitlements !== undefined) {
+ if (Array.isArray(opts.entitlements)) {
+ const entitlements = opts.entitlements.reduce((dict, entitlementKey) => (Object.assign(Object.assign({}, dict), { [entitlementKey]: true })), {});
+ const dir = await fs.mkdtemp(path.resolve(os.tmpdir(), 'tmp-entitlements-'));
+ const entitlementsPath = path.join(dir, 'entitlements.plist');
+ await fs.writeFile(entitlementsPath, plist.build(entitlements), 'utf8');
+ opts.entitlements = entitlementsPath;
+ }
+ mergedPerFileOptions.entitlements = opts.entitlements;
+ }
+ if (opts.hardenedRuntime !== undefined) {
+ mergedPerFileOptions.hardenedRuntime = opts.hardenedRuntime;
+ }
+ if (opts.requirements !== undefined)
+ mergedPerFileOptions.requirements = opts.requirements;
+ if (opts.signatureFlags !== undefined) {
+ mergedPerFileOptions.signatureFlags = opts.signatureFlags;
+ }
+ if (opts.timestamp !== undefined)
+ mergedPerFileOptions.timestamp = opts.timestamp;
+ }
+ return mergedPerFileOptions;
+}
+/**
+ * This function returns a promise codesigning only.
+ */
+async function signApplication(opts, identity) {
+ function shouldIgnoreFilePath(filePath) {
+ if (opts.ignore) {
+ return opts.ignore.some(function (ignore) {
+ if (typeof ignore === 'function') {
+ return ignore(filePath);
+ }
+ return filePath.match(ignore);
+ });
+ }
+ return false;
+ }
+ const children = await walkAsync(getAppContentsPath(opts));
+ if (opts.binaries)
+ children.push(...opts.binaries);
+ const args = ['--sign', identity.hash || identity.name, '--force'];
+ if (opts.keychain) {
+ args.push('--keychain', opts.keychain);
+ }
+ /**
+ * Sort the child paths by how deep they are in the file tree. Some arcane apple
+ * logic expects the deeper files to be signed first otherwise strange errors get
+ * thrown our way
+ */
+ children.sort((a, b) => {
+ const aDepth = a.split(path.sep).length;
+ const bDepth = b.split(path.sep).length;
+ return bDepth - aDepth;
+ });
+ for (const filePath of [...children, opts.app]) {
+ if (shouldIgnoreFilePath(filePath)) {
+ debugLog('Skipped... ' + filePath);
+ continue;
+ }
+ const perFileOptions = await mergeOptionsForFile(opts.optionsForFile ? opts.optionsForFile(filePath) : null, defaultOptionsForFile(filePath, opts.platform));
+ // preAutoEntitlements should only be applied to the top level app bundle.
+ // Applying it other files will cause the app to crash and be rejected by Apple.
+ if (!filePath.includes('.app/')) {
+ if (opts.preAutoEntitlements === false) {
+ debugWarn('Pre-sign operation disabled for entitlements automation.');
+ }
+ else {
+ debugLog('Pre-sign operation enabled for entitlements automation with versions >= `1.1.1`:', '\n', '* Disable by setting `pre-auto-entitlements` to `false`.');
+ if (!opts.version || compareVersion(opts.version, '1.1.1') >= 0) {
+ // Enable Mac App Store sandboxing without using temporary-exception, introduced in Electron v1.1.1. Relates to electron#5601
+ const newEntitlements = await preAutoEntitlements(opts, perFileOptions, {
+ identity,
+ provisioningProfile: opts.provisioningProfile
+ ? await getProvisioningProfile(opts.provisioningProfile, opts.keychain)
+ : undefined
+ });
+ // preAutoEntitlements may provide us new entitlements, if so we update our options
+ // and ensure that entitlements-loginhelper has a correct default value
+ if (newEntitlements) {
+ perFileOptions.entitlements = newEntitlements;
+ }
+ }
+ }
+ }
+ debugLog('Signing... ' + filePath);
+ const perFileArgs = [...args];
+ if (perFileOptions.requirements) {
+ perFileArgs.push('--requirements', perFileOptions.requirements);
+ }
+ if (perFileOptions.timestamp) {
+ perFileArgs.push('--timestamp=' + perFileOptions.timestamp);
+ }
+ else {
+ perFileArgs.push('--timestamp');
+ }
+ let optionsArguments = [];
+ if (perFileOptions.signatureFlags) {
+ if (Array.isArray(perFileOptions.signatureFlags)) {
+ optionsArguments.push(...perFileOptions.signatureFlags);
+ }
+ else {
+ const flags = perFileOptions.signatureFlags.split(',').map(function (flag) {
+ return flag.trim();
+ });
+ optionsArguments.push(...flags);
+ }
+ }
+ if (perFileOptions.hardenedRuntime || optionsArguments.includes('runtime')) {
+ // Hardened runtime since darwin 17.7.0 --> macOS 10.13.6
+ if (compareVersion(osRelease, '17.7.0') >= 0) {
+ optionsArguments.push('runtime');
+ }
+ else {
+ // Remove runtime if passed in with --signature-flags
+ debugLog('Not enabling hardened runtime, current macOS version too low, requires 10.13.6 and higher');
+ optionsArguments = optionsArguments.filter((arg) => {
+ return arg !== 'runtime';
+ });
+ }
+ }
+ if (optionsArguments.length) {
+ perFileArgs.push('--options', [...new Set(optionsArguments)].join(','));
+ }
+ await execFileAsync('codesign', perFileArgs.concat('--entitlements', perFileOptions.entitlements, filePath));
+ }
+ // Verify code sign
+ debugLog('Verifying...');
+ await verifySignApplication(opts);
+ debugLog('Verified.');
+ // Check entitlements if applicable
+ debugLog('Displaying entitlements...');
+ const result = await execFileAsync('codesign', [
+ '--display',
+ '--entitlements',
+ ':-',
+ opts.app
+ ]);
+ debugLog('Entitlements:', '\n', result);
+}
+/**
+ * This function returns a promise signing the application.
+ */
+export async function signApp(_opts) {
+ debugLog('electron-osx-sign@%s', pkgVersion);
+ const validatedOpts = await validateSignOpts(_opts);
+ let identities = [];
+ let identityInUse = null;
+ // Determine identity for signing
+ if (validatedOpts.identity) {
+ debugLog('`identity` passed in arguments.');
+ if (validatedOpts.identityValidation === false) {
+ identityInUse = new Identity(validatedOpts.identity);
+ }
+ else {
+ identities = await findIdentities(validatedOpts.keychain || null, validatedOpts.identity);
+ }
+ }
+ else {
+ debugWarn('No `identity` passed in arguments...');
+ if (validatedOpts.platform === 'mas') {
+ if (validatedOpts.type === 'distribution') {
+ debugLog('Finding `3rd Party Mac Developer Application` certificate for signing app distribution in the Mac App Store...');
+ identities = await findIdentities(validatedOpts.keychain || null, '3rd Party Mac Developer Application:');
+ }
+ else {
+ debugLog('Finding `Mac Developer` certificate for signing app in development for the Mac App Store signing...');
+ identities = await findIdentities(validatedOpts.keychain || null, 'Mac Developer:');
+ }
+ }
+ else {
+ debugLog('Finding `Developer ID Application` certificate for distribution outside the Mac App Store...');
+ identities = await findIdentities(validatedOpts.keychain || null, 'Developer ID Application:');
+ }
+ }
+ if (!identityInUse) {
+ if (identities.length > 0) {
+ // Identity(/ies) found
+ if (identities.length > 1) {
+ debugWarn('Multiple identities found, will use the first discovered.');
+ }
+ else {
+ debugLog('Found 1 identity.');
+ }
+ identityInUse = identities[0];
+ }
+ else {
+ // No identity found
+ throw new Error('No identity found for signing.');
+ }
+ }
+ // Pre-sign operations
+ if (validatedOpts.preEmbedProvisioningProfile === false) {
+ debugWarn('Pre-sign operation disabled for provisioning profile embedding:', '\n', '* Enable by setting `pre-embed-provisioning-profile` to `true`.');
+ }
+ else {
+ debugLog('Pre-sign operation enabled for provisioning profile:', '\n', '* Disable by setting `pre-embed-provisioning-profile` to `false`.');
+ await preEmbedProvisioningProfile(validatedOpts, validatedOpts.provisioningProfile
+ ? await getProvisioningProfile(validatedOpts.provisioningProfile, validatedOpts.keychain)
+ : null);
+ }
+ debugLog('Signing application...', '\n', '> Application:', validatedOpts.app, '\n', '> Platform:', validatedOpts.platform, '\n', '> Additional binaries:', validatedOpts.binaries, '\n', '> Identity:', validatedOpts.identity);
+ await signApplication(validatedOpts, identityInUse);
+ // Post-sign operations
+ debugLog('Application signed.');
+}
+/**
+ * This function is a legacy callback implementation.
+ *
+ * @deprecated Please use the promise based "signApp" method
+ */
+export const sign = (opts, cb) => {
+ signApp(opts)
+ .then(() => {
+ debugLog('Application signed: ' + opts.app);
+ if (cb)
+ cb();
+ })
+ .catch((err) => {
+ if (err.message)
+ debugLog(err.message);
+ else if (err.stack)
+ debugLog(err.stack);
+ else
+ debugLog(err);
+ if (cb)
+ cb(err);
+ });
+};
+//# sourceMappingURL=sign.js.map \ No newline at end of file
diff --git a/desktop/node_modules/@electron/osx-sign/dist/esm/sign.js.map b/desktop/node_modules/@electron/osx-sign/dist/esm/sign.js.map
new file mode 100644
index 0000000..fd6f022
--- /dev/null
+++ b/desktop/node_modules/@electron/osx-sign/dist/esm/sign.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"sign.js","sourceRoot":"","sources":["../../src/sign.ts"],"names":[],"mappings":"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"} \ No newline at end of file
diff --git a/desktop/node_modules/@electron/osx-sign/dist/esm/types.d.ts b/desktop/node_modules/@electron/osx-sign/dist/esm/types.d.ts
new file mode 100644
index 0000000..c2ba609
--- /dev/null
+++ b/desktop/node_modules/@electron/osx-sign/dist/esm/types.d.ts
@@ -0,0 +1,73 @@
+export type ElectronMacPlatform = 'darwin' | 'mas';
+type SigningDistributionType = 'development' | 'distribution';
+export type BaseSignOptions = Readonly<{
+ app: string;
+ identity?: string;
+ platform?: ElectronMacPlatform;
+ keychain?: string;
+}>;
+type OnlyValidatedBaseSignOptions = {
+ platform: ElectronMacPlatform;
+};
+/**
+ * Any missing options will use the default values, providing a partial
+ * structure will shallow merge with the default values.
+ */
+export type PerFileSignOptions = {
+ /**
+ * The entitlements file to use when signing this file
+ */
+ entitlements?: string | string[];
+ /**
+ * Whether to enable hardened runtime for this file. Enabled by default.
+ */
+ hardenedRuntime?: boolean;
+ /**
+ * The designated requirements to embed when signing this file
+ */
+ requirements?: string;
+ /**
+ * See --options of the "codesign" command.
+ *
+ * https://www.manpagez.com/man/1/codesign
+ */
+ signatureFlags?: string | string[];
+ /**
+ * The timestamp server to use when signing, by default uses the Apple provided
+ * timestamp server.
+ */
+ timestamp?: string;
+};
+type OnlySignOptions = {
+ binaries?: string[];
+ optionsForFile?: (filePath: string) => PerFileSignOptions;
+ identityValidation?: boolean;
+ ignore?: string | string[] | ((file: string) => boolean);
+ preAutoEntitlements?: boolean;
+ preEmbedProvisioningProfile?: boolean;
+ provisioningProfile?: string;
+ strictVerify?: boolean;
+ type?: SigningDistributionType;
+ version?: string;
+};
+type OnlyValidatedSignOptions = {
+ ignore?: (string | ((file: string) => boolean))[];
+ type: SigningDistributionType;
+};
+type OnlyFlatOptions = {
+ identityValidation?: boolean;
+ install?: string;
+ pkg?: string;
+ scripts?: string;
+};
+type OnlyValidatedFlatOptions = {
+ install: string;
+ pkg: string;
+};
+type ValidatedForm<UnValidated, Validated> = Omit<UnValidated, keyof Validated> & Validated;
+export type ValidatedBaseSignOptions = Readonly<ValidatedForm<BaseSignOptions, OnlyValidatedBaseSignOptions>>;
+export type SignOptions = Readonly<OnlySignOptions & BaseSignOptions>;
+export type ValidatedSignOptions = Readonly<ValidatedForm<OnlySignOptions, OnlyValidatedSignOptions> & ValidatedBaseSignOptions>;
+export type FlatOptions = Readonly<OnlyFlatOptions & BaseSignOptions>;
+export type ValidatedFlatOptions = Readonly<ValidatedForm<OnlyFlatOptions, OnlyValidatedFlatOptions> & ValidatedBaseSignOptions>;
+export {};
diff --git a/desktop/node_modules/@electron/osx-sign/dist/esm/types.js b/desktop/node_modules/@electron/osx-sign/dist/esm/types.js
new file mode 100644
index 0000000..718fd38
--- /dev/null
+++ b/desktop/node_modules/@electron/osx-sign/dist/esm/types.js
@@ -0,0 +1,2 @@
+export {};
+//# sourceMappingURL=types.js.map \ No newline at end of file
diff --git a/desktop/node_modules/@electron/osx-sign/dist/esm/types.js.map b/desktop/node_modules/@electron/osx-sign/dist/esm/types.js.map
new file mode 100644
index 0000000..7b5fff8
--- /dev/null
+++ b/desktop/node_modules/@electron/osx-sign/dist/esm/types.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":""} \ No newline at end of file
diff --git a/desktop/node_modules/@electron/osx-sign/dist/esm/util-entitlements.d.ts b/desktop/node_modules/@electron/osx-sign/dist/esm/util-entitlements.d.ts
new file mode 100644
index 0000000..0c4ff73
--- /dev/null
+++ b/desktop/node_modules/@electron/osx-sign/dist/esm/util-entitlements.d.ts
@@ -0,0 +1,17 @@
+import { PerFileSignOptions, ValidatedSignOptions } from './types';
+import { Identity } from './util-identities';
+import { ProvisioningProfile } from './util-provisioning-profiles';
+type ComputedOptions = {
+ identity: Identity;
+ provisioningProfile?: ProvisioningProfile;
+};
+/**
+ * This function returns a promise completing the entitlements automation: The
+ * process includes checking in `Info.plist` for `ElectronTeamID` or setting
+ * parsed value from identity, and checking in entitlements file for
+ * `com.apple.security.application-groups` or inserting new into array. A
+ * temporary entitlements file may be created to replace the input for any
+ * changes introduced.
+ */
+export declare function preAutoEntitlements(opts: ValidatedSignOptions, perFileOpts: PerFileSignOptions, computed: ComputedOptions): Promise<void | string>;
+export {};
diff --git a/desktop/node_modules/@electron/osx-sign/dist/esm/util-entitlements.js b/desktop/node_modules/@electron/osx-sign/dist/esm/util-entitlements.js
new file mode 100644
index 0000000..8d4455b
--- /dev/null
+++ b/desktop/node_modules/@electron/osx-sign/dist/esm/util-entitlements.js
@@ -0,0 +1,106 @@
+import * as fs from 'fs-extra';
+import * as os from 'os';
+import * as path from 'path';
+import * as plist from 'plist';
+import { debugLog, getAppContentsPath } from './util';
+const preAuthMemo = new Map();
+/**
+ * This function returns a promise completing the entitlements automation: The
+ * process includes checking in `Info.plist` for `ElectronTeamID` or setting
+ * parsed value from identity, and checking in entitlements file for
+ * `com.apple.security.application-groups` or inserting new into array. A
+ * temporary entitlements file may be created to replace the input for any
+ * changes introduced.
+ */
+export async function preAutoEntitlements(opts, perFileOpts, computed) {
+ var _a;
+ if (!perFileOpts.entitlements)
+ return;
+ const memoKey = [opts.app, perFileOpts.entitlements].join('---');
+ if (preAuthMemo.has(memoKey))
+ return preAuthMemo.get(memoKey);
+ // If entitlements file not provided, default will be used. Fixes #41
+ const appInfoPath = path.join(getAppContentsPath(opts), 'Info.plist');
+ debugLog('Automating entitlement app group...', '\n', '> Info.plist:', appInfoPath, '\n');
+ let entitlements;
+ if (typeof perFileOpts.entitlements === 'string') {
+ const entitlementsContents = await fs.readFile(perFileOpts.entitlements, 'utf8');
+ entitlements = plist.parse(entitlementsContents);
+ }
+ else {
+ entitlements = perFileOpts.entitlements.reduce((dict, entitlementKey) => (Object.assign(Object.assign({}, dict), { [entitlementKey]: true })), {});
+ }
+ if (!entitlements['com.apple.security.app-sandbox']) {
+ // Only automate when app sandbox enabled by user
+ return;
+ }
+ const appInfoContents = await fs.readFile(appInfoPath, 'utf8');
+ const appInfo = plist.parse(appInfoContents);
+ // Use ElectronTeamID in Info.plist if already specified
+ if (appInfo.ElectronTeamID) {
+ debugLog('`ElectronTeamID` found in `Info.plist`: ' + appInfo.ElectronTeamID);
+ }
+ else {
+ // The team identifier in signing identity should not be trusted
+ if (computed.provisioningProfile) {
+ appInfo.ElectronTeamID =
+ computed.provisioningProfile.message.Entitlements['com.apple.developer.team-identifier'];
+ debugLog('`ElectronTeamID` not found in `Info.plist`, use parsed from provisioning profile: ' +
+ appInfo.ElectronTeamID);
+ }
+ else {
+ const teamID = (_a = /^.+\((.+?)\)$/g.exec(computed.identity.name)) === null || _a === void 0 ? void 0 : _a[1];
+ if (!teamID) {
+ throw new Error(`Could not automatically determine ElectronTeamID from identity: ${computed.identity.name}`);
+ }
+ appInfo.ElectronTeamID = teamID;
+ debugLog('`ElectronTeamID` not found in `Info.plist`, use parsed from signing identity: ' +
+ appInfo.ElectronTeamID);
+ }
+ await fs.writeFile(appInfoPath, plist.build(appInfo), 'utf8');
+ debugLog('`Info.plist` updated:', '\n', '> Info.plist:', appInfoPath);
+ }
+ const appIdentifier = appInfo.ElectronTeamID + '.' + appInfo.CFBundleIdentifier;
+ // Insert application identifier if not exists
+ if (entitlements['com.apple.application-identifier']) {
+ debugLog('`com.apple.application-identifier` found in entitlements file: ' +
+ entitlements['com.apple.application-identifier']);
+ }
+ else {
+ debugLog('`com.apple.application-identifier` not found in entitlements file, new inserted: ' +
+ appIdentifier);
+ entitlements['com.apple.application-identifier'] = appIdentifier;
+ }
+ // Insert developer team identifier if not exists
+ if (entitlements['com.apple.developer.team-identifier']) {
+ debugLog('`com.apple.developer.team-identifier` found in entitlements file: ' +
+ entitlements['com.apple.developer.team-identifier']);
+ }
+ else {
+ debugLog('`com.apple.developer.team-identifier` not found in entitlements file, new inserted: ' +
+ appInfo.ElectronTeamID);
+ entitlements['com.apple.developer.team-identifier'] = appInfo.ElectronTeamID;
+ }
+ // Init entitlements app group key to array if not exists
+ if (!entitlements['com.apple.security.application-groups']) {
+ entitlements['com.apple.security.application-groups'] = [];
+ }
+ // Insert app group if not exists
+ if (Array.isArray(entitlements['com.apple.security.application-groups']) &&
+ entitlements['com.apple.security.application-groups'].indexOf(appIdentifier) === -1) {
+ debugLog('`com.apple.security.application-groups` not found in entitlements file, new inserted: ' +
+ appIdentifier);
+ entitlements['com.apple.security.application-groups'].push(appIdentifier);
+ }
+ else {
+ debugLog('`com.apple.security.application-groups` found in entitlements file: ' + appIdentifier);
+ }
+ // Create temporary entitlements file
+ const dir = await fs.mkdtemp(path.resolve(os.tmpdir(), 'tmp-entitlements-'));
+ const entitlementsPath = path.join(dir, 'entitlements.plist');
+ await fs.writeFile(entitlementsPath, plist.build(entitlements), 'utf8');
+ debugLog('Entitlements file updated:', '\n', '> Entitlements:', entitlementsPath);
+ preAuthMemo.set(memoKey, entitlementsPath);
+ return entitlementsPath;
+}
+//# sourceMappingURL=util-entitlements.js.map \ No newline at end of file
diff --git a/desktop/node_modules/@electron/osx-sign/dist/esm/util-entitlements.js.map b/desktop/node_modules/@electron/osx-sign/dist/esm/util-entitlements.js.map
new file mode 100644
index 0000000..0b50559
--- /dev/null
+++ b/desktop/node_modules/@electron/osx-sign/dist/esm/util-entitlements.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"util-entitlements.js","sourceRoot":"","sources":["../../src/util-entitlements.ts"],"names":[],"mappings":"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"} \ No newline at end of file
diff --git a/desktop/node_modules/@electron/osx-sign/dist/esm/util-identities.d.ts b/desktop/node_modules/@electron/osx-sign/dist/esm/util-identities.d.ts
new file mode 100644
index 0000000..fe56cdb
--- /dev/null
+++ b/desktop/node_modules/@electron/osx-sign/dist/esm/util-identities.d.ts
@@ -0,0 +1,6 @@
+export declare class Identity {
+ name: string;
+ hash?: string | undefined;
+ constructor(name: string, hash?: string | undefined);
+}
+export declare function findIdentities(keychain: string | null, identity: string): Promise<Identity[]>;
diff --git a/desktop/node_modules/@electron/osx-sign/dist/esm/util-identities.js b/desktop/node_modules/@electron/osx-sign/dist/esm/util-identities.js
new file mode 100644
index 0000000..4fb273d
--- /dev/null
+++ b/desktop/node_modules/@electron/osx-sign/dist/esm/util-identities.js
@@ -0,0 +1,30 @@
+import { debugLog, compactFlattenedList, execFileAsync } from './util';
+export class Identity {
+ constructor(name, hash) {
+ this.name = name;
+ this.hash = hash;
+ }
+}
+export async function findIdentities(keychain, identity) {
+ // Only to look for valid identities, excluding those flagged with
+ // CSSMERR_TP_CERT_EXPIRED or CSSMERR_TP_NOT_TRUSTED. Fixes #9
+ const args = [
+ 'find-identity',
+ '-v'
+ ];
+ if (keychain) {
+ args.push(keychain);
+ }
+ const result = await execFileAsync('security', args);
+ const identities = result.split('\n').map(function (line) {
+ if (line.indexOf(identity) >= 0) {
+ const identityFound = line.substring(line.indexOf('"') + 1, line.lastIndexOf('"'));
+ const identityHashFound = line.substring(line.indexOf(')') + 2, line.indexOf('"') - 1);
+ debugLog('Identity:', '\n', '> Name:', identityFound, '\n', '> Hash:', identityHashFound);
+ return new Identity(identityFound, identityHashFound);
+ }
+ return null;
+ });
+ return compactFlattenedList(identities);
+}
+//# sourceMappingURL=util-identities.js.map \ No newline at end of file
diff --git a/desktop/node_modules/@electron/osx-sign/dist/esm/util-identities.js.map b/desktop/node_modules/@electron/osx-sign/dist/esm/util-identities.js.map
new file mode 100644
index 0000000..18e3c43
--- /dev/null
+++ b/desktop/node_modules/@electron/osx-sign/dist/esm/util-identities.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"util-identities.js","sourceRoot":"","sources":["../../src/util-identities.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,oBAAoB,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AAEvE,MAAM,OAAO,QAAQ;IACnB,YAAoB,IAAY,EAAS,IAAa;QAAlC,SAAI,GAAJ,IAAI,CAAQ;QAAS,SAAI,GAAJ,IAAI,CAAS;IAAG,CAAC;CAC3D;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAE,QAAuB,EAAE,QAAgB;IAC7E,kEAAkE;IAClE,8DAA8D;IAE9D,MAAM,IAAI,GAAG;QACX,eAAe;QACf,IAAI;KACL,CAAC;IACF,IAAI,QAAQ,EAAE;QACZ,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;KACrB;IAED,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;IACrD,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,UAAU,IAAI;QACtD,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;YAC/B,MAAM,aAAa,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC;YACnF,MAAM,iBAAiB,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;YACvF,QAAQ,CAAC,WAAW,EAAE,IAAI,EACxB,SAAS,EAAE,aAAa,EAAE,IAAI,EAC9B,SAAS,EAAE,iBAAiB,CAAC,CAAC;YAChC,OAAO,IAAI,QAAQ,CAAC,aAAa,EAAE,iBAAiB,CAAC,CAAC;SACvD;QAED,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;IAEH,OAAO,oBAAoB,CAAC,UAAU,CAAC,CAAC;AAC1C,CAAC"} \ No newline at end of file
diff --git a/desktop/node_modules/@electron/osx-sign/dist/esm/util-provisioning-profiles.d.ts b/desktop/node_modules/@electron/osx-sign/dist/esm/util-provisioning-profiles.d.ts
new file mode 100644
index 0000000..7c9d9c3
--- /dev/null
+++ b/desktop/node_modules/@electron/osx-sign/dist/esm/util-provisioning-profiles.d.ts
@@ -0,0 +1,25 @@
+import { ElectronMacPlatform, ValidatedSignOptions } from './types';
+export declare class ProvisioningProfile {
+ filePath: string;
+ message: any;
+ constructor(filePath: string, message: any);
+ get name(): string;
+ get platforms(): ElectronMacPlatform[];
+ get type(): "development" | "distribution";
+}
+/**
+ * Returns a promise resolving to a ProvisioningProfile instance based on file.
+ * @function
+ * @param {string} filePath - Path to provisioning profile.
+ * @param {string} keychain - Keychain to use when unlocking provisioning profile.
+ * @returns {Promise} Promise.
+ */
+export declare function getProvisioningProfile(filePath: string, keychain?: string | null): Promise<ProvisioningProfile>;
+/**
+ * Returns a promise resolving to a list of suitable provisioning profile within the current working directory.
+ */
+export declare function findProvisioningProfiles(opts: ValidatedSignOptions): Promise<ProvisioningProfile[]>;
+/**
+ * Returns a promise embedding the provisioning profile in the app Contents folder.
+ */
+export declare function preEmbedProvisioningProfile(opts: ValidatedSignOptions, profile: ProvisioningProfile | null): Promise<void>;
diff --git a/desktop/node_modules/@electron/osx-sign/dist/esm/util-provisioning-profiles.js b/desktop/node_modules/@electron/osx-sign/dist/esm/util-provisioning-profiles.js
new file mode 100644
index 0000000..62d0fea
--- /dev/null
+++ b/desktop/node_modules/@electron/osx-sign/dist/esm/util-provisioning-profiles.js
@@ -0,0 +1,115 @@
+import * as fs from 'fs-extra';
+import * as path from 'path';
+import plist from 'plist';
+import { debugLog, debugWarn, getAppContentsPath, compactFlattenedList, execFileAsync } from './util';
+export class ProvisioningProfile {
+ constructor(filePath, message) {
+ this.filePath = filePath;
+ this.message = message;
+ }
+ get name() {
+ return this.message.Name;
+ }
+ get platforms() {
+ if ('ProvisionsAllDevices' in this.message)
+ return ['darwin'];
+ // Developer ID
+ else if (this.type === 'distribution')
+ return ['mas'];
+ // Mac App Store
+ else
+ return ['darwin', 'mas']; // Mac App Development
+ }
+ get type() {
+ if ('ProvisionedDevices' in this.message)
+ return 'development';
+ // Mac App Development
+ else
+ return 'distribution'; // Developer ID or Mac App Store
+ }
+}
+/**
+ * Returns a promise resolving to a ProvisioningProfile instance based on file.
+ * @function
+ * @param {string} filePath - Path to provisioning profile.
+ * @param {string} keychain - Keychain to use when unlocking provisioning profile.
+ * @returns {Promise} Promise.
+ */
+export async function getProvisioningProfile(filePath, keychain = null) {
+ const securityArgs = [
+ 'cms',
+ '-D',
+ '-i',
+ filePath // Use infile as source of data
+ ];
+ if (keychain) {
+ securityArgs.push('-k', keychain);
+ }
+ const result = await execFileAsync('security', securityArgs);
+ const provisioningProfile = new ProvisioningProfile(filePath, plist.parse(result));
+ debugLog('Provisioning profile:', '\n', '> Name:', provisioningProfile.name, '\n', '> Platforms:', provisioningProfile.platforms, '\n', '> Type:', provisioningProfile.type, '\n', '> Path:', provisioningProfile.filePath, '\n', '> Message:', provisioningProfile.message);
+ return provisioningProfile;
+}
+/**
+ * Returns a promise resolving to a list of suitable provisioning profile within the current working directory.
+ */
+export async function findProvisioningProfiles(opts) {
+ const cwd = process.cwd();
+ const children = await fs.readdir(cwd);
+ const foundProfiles = compactFlattenedList(await Promise.all(children.map(async (child) => {
+ const filePath = path.resolve(cwd, child);
+ const stat = await fs.stat(filePath);
+ if (stat.isFile() && path.extname(filePath) === '.provisionprofile') {
+ return filePath;
+ }
+ return null;
+ })));
+ return compactFlattenedList(await Promise.all(foundProfiles.map(async (filePath) => {
+ const profile = await getProvisioningProfile(filePath);
+ if (profile.platforms.indexOf(opts.platform) >= 0 && profile.type === opts.type) {
+ return profile;
+ }
+ debugWarn('Provisioning profile above ignored, not for ' + opts.platform + ' ' + opts.type + '.');
+ return null;
+ })));
+}
+/**
+ * Returns a promise embedding the provisioning profile in the app Contents folder.
+ */
+export async function preEmbedProvisioningProfile(opts, profile) {
+ async function embedProvisioningProfile(profile) {
+ debugLog('Looking for existing provisioning profile...');
+ const embeddedFilePath = path.join(getAppContentsPath(opts), 'embedded.provisionprofile');
+ if (await fs.pathExists(embeddedFilePath)) {
+ debugLog('Found embedded provisioning profile:', '\n', '* Please manually remove the existing file if not wanted.', '\n', '* Current file at:', embeddedFilePath);
+ }
+ else {
+ debugLog('Embedding provisioning profile...');
+ await fs.copy(profile.filePath, embeddedFilePath);
+ }
+ }
+ if (profile) {
+ // User input provisioning profile
+ return await embedProvisioningProfile(profile);
+ }
+ else {
+ // Discover provisioning profile
+ debugLog('No `provisioning-profile` passed in arguments, will find in current working directory and in user library...');
+ const profiles = await findProvisioningProfiles(opts);
+ if (profiles.length > 0) {
+ // Provisioning profile(s) found
+ if (profiles.length > 1) {
+ debugLog('Multiple provisioning profiles found, will use the first discovered.');
+ }
+ else {
+ debugLog('Found 1 provisioning profile.');
+ }
+ await embedProvisioningProfile(profiles[0]);
+ }
+ else {
+ // No provisioning profile found
+ debugLog('No provisioning profile found, will not embed profile in app contents.');
+ }
+ }
+}
+//# sourceMappingURL=util-provisioning-profiles.js.map \ No newline at end of file
diff --git a/desktop/node_modules/@electron/osx-sign/dist/esm/util-provisioning-profiles.js.map b/desktop/node_modules/@electron/osx-sign/dist/esm/util-provisioning-profiles.js.map
new file mode 100644
index 0000000..6beb366
--- /dev/null
+++ b/desktop/node_modules/@electron/osx-sign/dist/esm/util-provisioning-profiles.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"util-provisioning-profiles.js","sourceRoot":"","sources":["../../src/util-provisioning-profiles.ts"],"names":[],"mappings":"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"} \ No newline at end of file
diff --git a/desktop/node_modules/@electron/osx-sign/dist/esm/util.d.ts b/desktop/node_modules/@electron/osx-sign/dist/esm/util.d.ts
new file mode 100644
index 0000000..d420151
--- /dev/null
+++ b/desktop/node_modules/@electron/osx-sign/dist/esm/util.d.ts
@@ -0,0 +1,35 @@
+/// <reference types="node" />
+import * as child from 'child_process';
+import debug from 'debug';
+import { BaseSignOptions, ElectronMacPlatform } from './types';
+export declare const debugLog: debug.Debugger;
+export declare const debugWarn: debug.Debugger;
+export declare function execFileAsync(file: string, args: string[], options?: child.ExecFileOptions): Promise<string>;
+type DeepListItem<T> = null | T | DeepListItem<T>[];
+type DeepList<T> = DeepListItem<T>[];
+export declare function compactFlattenedList<T>(list: DeepList<T>): T[];
+/**
+ * Returns the path to the "Contents" folder inside the application bundle
+ */
+export declare function getAppContentsPath(opts: BaseSignOptions): string;
+/**
+ * Returns the path to app "Frameworks" within contents.
+ */
+export declare function getAppFrameworksPath(opts: BaseSignOptions): string;
+export declare function detectElectronPlatform(opts: BaseSignOptions): Promise<ElectronMacPlatform>;
+/**
+ * This function returns a promise validating opts.app, the application to be signed or flattened.
+ */
+export declare function validateOptsApp(opts: BaseSignOptions): Promise<void>;
+/**
+ * This function returns a promise validating opts.platform, the platform of Electron build. It allows auto-discovery if no opts.platform is specified.
+ */
+export declare function validateOptsPlatform(opts: BaseSignOptions): Promise<ElectronMacPlatform>;
+/**
+ * This function returns a promise resolving all child paths within the directory specified.
+ * @function
+ * @param {string} dirPath - Path to directory.
+ * @returns {Promise} Promise resolving child paths needing signing in order.
+ */
+export declare function walkAsync(dirPath: string): Promise<string[]>;
+export {};
diff --git a/desktop/node_modules/@electron/osx-sign/dist/esm/util.js b/desktop/node_modules/@electron/osx-sign/dist/esm/util.js
new file mode 100644
index 0000000..76eef43
--- /dev/null
+++ b/desktop/node_modules/@electron/osx-sign/dist/esm/util.js
@@ -0,0 +1,145 @@
+import * as child from 'child_process';
+import * as fs from 'fs-extra';
+import { isBinaryFile } from 'isbinaryfile';
+import * as path from 'path';
+import debug from 'debug';
+export const debugLog = debug('electron-osx-sign');
+debugLog.log = console.log.bind(console);
+export const debugWarn = debug('electron-osx-sign:warn');
+debugWarn.log = console.warn.bind(console);
+const removePassword = function (input) {
+ return input.replace(/(-P |pass:|\/p|-pass )([^ ]+)/, function (_, p1) {
+ return `${p1}***`;
+ });
+};
+export async function execFileAsync(file, args, options = {}) {
+ if (debugLog.enabled) {
+ debugLog('Executing...', file, args && Array.isArray(args) ? removePassword(args.join(' ')) : '');
+ }
+ return new Promise(function (resolve, reject) {
+ child.execFile(file, args, options, function (err, stdout, stderr) {
+ if (err) {
+ debugLog('Error executing file:', '\n', '> Stdout:', stdout, '\n', '> Stderr:', stderr);
+ reject(err);
+ return;
+ }
+ resolve(stdout);
+ });
+ });
+}
+export function compactFlattenedList(list) {
+ const result = [];
+ function populateResult(list) {
+ if (!Array.isArray(list)) {
+ if (list)
+ result.push(list);
+ }
+ else if (list.length > 0) {
+ for (const item of list)
+ if (item)
+ populateResult(item);
+ }
+ }
+ populateResult(list);
+ return result;
+}
+/**
+ * Returns the path to the "Contents" folder inside the application bundle
+ */
+export function getAppContentsPath(opts) {
+ return path.join(opts.app, 'Contents');
+}
+/**
+ * Returns the path to app "Frameworks" within contents.
+ */
+export function getAppFrameworksPath(opts) {
+ return path.join(getAppContentsPath(opts), 'Frameworks');
+}
+export async function detectElectronPlatform(opts) {
+ const appFrameworksPath = getAppFrameworksPath(opts);
+ if (await fs.pathExists(path.resolve(appFrameworksPath, 'Squirrel.framework'))) {
+ return 'darwin';
+ }
+ else {
+ return 'mas';
+ }
+}
+/**
+ * This function returns a promise resolving the file path if file binary.
+ */
+async function getFilePathIfBinary(filePath) {
+ if (await isBinaryFile(filePath)) {
+ return filePath;
+ }
+ return null;
+}
+/**
+ * This function returns a promise validating opts.app, the application to be signed or flattened.
+ */
+export async function validateOptsApp(opts) {
+ if (!opts.app) {
+ throw new Error('Path to application must be specified.');
+ }
+ if (path.extname(opts.app) !== '.app') {
+ throw new Error('Extension of application must be `.app`.');
+ }
+ if (!(await fs.pathExists(opts.app))) {
+ throw new Error(`Application at path "${opts.app}" could not be found`);
+ }
+}
+/**
+ * This function returns a promise validating opts.platform, the platform of Electron build. It allows auto-discovery if no opts.platform is specified.
+ */
+export async function validateOptsPlatform(opts) {
+ if (opts.platform) {
+ if (opts.platform === 'mas' || opts.platform === 'darwin') {
+ return opts.platform;
+ }
+ else {
+ debugWarn('`platform` passed in arguments not supported, checking Electron platform...');
+ }
+ }
+ else {
+ debugWarn('No `platform` passed in arguments, checking Electron platform...');
+ }
+ return await detectElectronPlatform(opts);
+}
+/**
+ * This function returns a promise resolving all child paths within the directory specified.
+ * @function
+ * @param {string} dirPath - Path to directory.
+ * @returns {Promise} Promise resolving child paths needing signing in order.
+ */
+export async function walkAsync(dirPath) {
+ debugLog('Walking... ' + dirPath);
+ async function _walkAsync(dirPath) {
+ const children = await fs.readdir(dirPath);
+ return await Promise.all(children.map(async (child) => {
+ const filePath = path.resolve(dirPath, child);
+ const stat = await fs.stat(filePath);
+ if (stat.isFile()) {
+ switch (path.extname(filePath)) {
+ case '.cstemp': // Temporary file generated from past codesign
+ debugLog('Removing... ' + filePath);
+ await fs.remove(filePath);
+ return null;
+ default:
+ return await getFilePathIfBinary(filePath);
+ }
+ }
+ else if (stat.isDirectory() && !stat.isSymbolicLink()) {
+ const walkResult = await _walkAsync(filePath);
+ switch (path.extname(filePath)) {
+ case '.app': // Application
+ case '.framework': // Framework
+ walkResult.push(filePath);
+ }
+ return walkResult;
+ }
+ return null;
+ }));
+ }
+ const allPaths = await _walkAsync(dirPath);
+ return compactFlattenedList(allPaths);
+}
+//# sourceMappingURL=util.js.map \ No newline at end of file
diff --git a/desktop/node_modules/@electron/osx-sign/dist/esm/util.js.map b/desktop/node_modules/@electron/osx-sign/dist/esm/util.js.map
new file mode 100644
index 0000000..ecc2617
--- /dev/null
+++ b/desktop/node_modules/@electron/osx-sign/dist/esm/util.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"util.js","sourceRoot":"","sources":["../../src/util.ts"],"names":[],"mappings":"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"} \ No newline at end of file
diff --git a/desktop/node_modules/@electron/osx-sign/entitlements/default.darwin.gpu.plist b/desktop/node_modules/@electron/osx-sign/entitlements/default.darwin.gpu.plist
new file mode 100644
index 0000000..446fe17
--- /dev/null
+++ b/desktop/node_modules/@electron/osx-sign/entitlements/default.darwin.gpu.plist
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+ <dict>
+ <key>com.apple.security.cs.allow-jit</key>
+ <true/>
+ </dict>
+</plist>
diff --git a/desktop/node_modules/@electron/osx-sign/entitlements/default.darwin.plist b/desktop/node_modules/@electron/osx-sign/entitlements/default.darwin.plist
new file mode 100644
index 0000000..c762cfb
--- /dev/null
+++ b/desktop/node_modules/@electron/osx-sign/entitlements/default.darwin.plist
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+ <dict>
+ <key>com.apple.security.cs.allow-jit</key>
+ <true/>
+ <key>com.apple.security.device.audio-input</key>
+ <true/>
+ <key>com.apple.security.device.bluetooth</key>
+ <true/>
+ <key>com.apple.security.device.camera</key>
+ <true/>
+ <key>com.apple.security.device.print</key>
+ <true/>
+ <key>com.apple.security.device.usb</key>
+ <true/>
+ <key>com.apple.security.personal-information.location</key>
+ <true/>
+ </dict>
+</plist>
diff --git a/desktop/node_modules/@electron/osx-sign/entitlements/default.darwin.plugin.plist b/desktop/node_modules/@electron/osx-sign/entitlements/default.darwin.plugin.plist
new file mode 100644
index 0000000..67ebe4e
--- /dev/null
+++ b/desktop/node_modules/@electron/osx-sign/entitlements/default.darwin.plugin.plist
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+ <dict>
+ <key>com.apple.security.cs.allow-unsigned-executable-memory</key>
+ <true/>
+ <key>com.apple.security.cs.disable-library-validation</key>
+ <true/>
+ </dict>
+</plist>
diff --git a/desktop/node_modules/@electron/osx-sign/entitlements/default.darwin.renderer.plist b/desktop/node_modules/@electron/osx-sign/entitlements/default.darwin.renderer.plist
new file mode 100644
index 0000000..446fe17
--- /dev/null
+++ b/desktop/node_modules/@electron/osx-sign/entitlements/default.darwin.renderer.plist
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+ <dict>
+ <key>com.apple.security.cs.allow-jit</key>
+ <true/>
+ </dict>
+</plist>
diff --git a/desktop/node_modules/@electron/osx-sign/entitlements/default.mas.child.plist b/desktop/node_modules/@electron/osx-sign/entitlements/default.mas.child.plist
new file mode 100755
index 0000000..d8dc69e
--- /dev/null
+++ b/desktop/node_modules/@electron/osx-sign/entitlements/default.mas.child.plist
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+ <dict>
+ <key>com.apple.security.app-sandbox</key>
+ <true/>
+ <key>com.apple.security.inherit</key>
+ <true/>
+ </dict>
+</plist>
diff --git a/desktop/node_modules/@electron/osx-sign/entitlements/default.mas.plist b/desktop/node_modules/@electron/osx-sign/entitlements/default.mas.plist
new file mode 100755
index 0000000..025064d
--- /dev/null
+++ b/desktop/node_modules/@electron/osx-sign/entitlements/default.mas.plist
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+ <dict>
+ <key>com.apple.security.app-sandbox</key>
+ <true/>
+ <key>com.apple.security.files.user-selected.read-write</key>
+ <true/>
+ <key>com.apple.security.files.bookmarks.app-scope</key>
+ <true/>
+ <key>com.apple.security.network.client</key>
+ <true/>
+ <key>com.apple.security.print</key>
+ <true/>
+ <key>com.apple.security.device.camera</key>
+ <true/>
+ <key>com.apple.security.device.microphone</key>
+ <true/>
+ <key>com.apple.security.device.usb</key>
+ <true/>
+ </dict>
+</plist>
diff --git a/desktop/node_modules/@electron/osx-sign/node_modules/fs-extra/LICENSE b/desktop/node_modules/@electron/osx-sign/node_modules/fs-extra/LICENSE
new file mode 100644
index 0000000..93546df
--- /dev/null
+++ b/desktop/node_modules/@electron/osx-sign/node_modules/fs-extra/LICENSE
@@ -0,0 +1,15 @@
+(The MIT License)
+
+Copyright (c) 2011-2017 JP Richardson
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files
+(the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify,
+ merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
+ furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS
+OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/desktop/node_modules/@electron/osx-sign/node_modules/fs-extra/README.md b/desktop/node_modules/@electron/osx-sign/node_modules/fs-extra/README.md
new file mode 100644
index 0000000..6ed8b6a
--- /dev/null
+++ b/desktop/node_modules/@electron/osx-sign/node_modules/fs-extra/README.md
@@ -0,0 +1,262 @@
+Node.js: fs-extra
+=================
+
+`fs-extra` adds file system methods that aren't included in the native `fs` module and adds promise support to the `fs` methods. It also uses [`graceful-fs`](https://github.com/isaacs/node-graceful-fs) to prevent `EMFILE` errors. It should be a drop in replacement for `fs`.
+
+[![npm Package](https://img.shields.io/npm/v/fs-extra.svg)](https://www.npmjs.org/package/fs-extra)
+[![License](https://img.shields.io/npm/l/fs-extra.svg)](https://github.com/jprichardson/node-fs-extra/blob/master/LICENSE)
+[![build status](https://img.shields.io/github/workflow/status/jprichardson/node-fs-extra/Node.js%20CI/master)](https://github.com/jprichardson/node-fs-extra/actions/workflows/ci.yml?query=branch%3Amaster)
+[![downloads per month](http://img.shields.io/npm/dm/fs-extra.svg)](https://www.npmjs.org/package/fs-extra)
+[![JavaScript Style Guide](https://img.shields.io/badge/code_style-standard-brightgreen.svg)](https://standardjs.com)
+
+Why?
+----
+
+I got tired of including `mkdirp`, `rimraf`, and `ncp` in most of my projects.
+
+
+
+
+Installation
+------------
+
+ npm install fs-extra
+
+
+
+Usage
+-----
+
+`fs-extra` is a drop in replacement for native `fs`. All methods in `fs` are attached to `fs-extra`. All `fs` methods return promises if the callback isn't passed.
+
+You don't ever need to include the original `fs` module again:
+
+```js
+const fs = require('fs') // this is no longer necessary
+```
+
+you can now do this:
+
+```js
+const fs = require('fs-extra')
+```
+
+or if you prefer to make it clear that you're using `fs-extra` and not `fs`, you may want
+to name your `fs` variable `fse` like so:
+
+```js
+const fse = require('fs-extra')
+```
+
+you can also keep both, but it's redundant:
+
+```js
+const fs = require('fs')
+const fse = require('fs-extra')
+```
+
+Sync vs Async vs Async/Await
+-------------
+Most methods are async by default. All async methods will return a promise if the callback isn't passed.
+
+Sync methods on the other hand will throw if an error occurs.
+
+Also Async/Await will throw an error if one occurs.
+
+Example:
+
+```js
+const fs = require('fs-extra')
+
+// Async with promises:
+fs.copy('/tmp/myfile', '/tmp/mynewfile')
+ .then(() => console.log('success!'))
+ .catch(err => console.error(err))
+
+// Async with callbacks:
+fs.copy('/tmp/myfile', '/tmp/mynewfile', err => {
+ if (err) return console.error(err)
+ console.log('success!')
+})
+
+// Sync:
+try {
+ fs.copySync('/tmp/myfile', '/tmp/mynewfile')
+ console.log('success!')
+} catch (err) {
+ console.error(err)
+}
+
+// Async/Await:
+async function copyFiles () {
+ try {
+ await fs.copy('/tmp/myfile', '/tmp/mynewfile')
+ console.log('success!')
+ } catch (err) {
+ console.error(err)
+ }
+}
+
+copyFiles()
+```
+
+
+Methods
+-------
+
+### Async
+
+- [copy](docs/copy.md)
+- [emptyDir](docs/emptyDir.md)
+- [ensureFile](docs/ensureFile.md)
+- [ensureDir](docs/ensureDir.md)
+- [ensureLink](docs/ensureLink.md)
+- [ensureSymlink](docs/ensureSymlink.md)
+- [mkdirp](docs/ensureDir.md)
+- [mkdirs](docs/ensureDir.md)
+- [move](docs/move.md)
+- [outputFile](docs/outputFile.md)
+- [outputJson](docs/outputJson.md)
+- [pathExists](docs/pathExists.md)
+- [readJson](docs/readJson.md)
+- [remove](docs/remove.md)
+- [writeJson](docs/writeJson.md)
+
+### Sync
+
+- [copySync](docs/copy-sync.md)
+- [emptyDirSync](docs/emptyDir-sync.md)
+- [ensureFileSync](docs/ensureFile-sync.md)
+- [ensureDirSync](docs/ensureDir-sync.md)
+- [ensureLinkSync](docs/ensureLink-sync.md)
+- [ensureSymlinkSync](docs/ensureSymlink-sync.md)
+- [mkdirpSync](docs/ensureDir-sync.md)
+- [mkdirsSync](docs/ensureDir-sync.md)
+- [moveSync](docs/move-sync.md)
+- [outputFileSync](docs/outputFile-sync.md)
+- [outputJsonSync](docs/outputJson-sync.md)
+- [pathExistsSync](docs/pathExists-sync.md)
+- [readJsonSync](docs/readJson-sync.md)
+- [removeSync](docs/remove-sync.md)
+- [writeJsonSync](docs/writeJson-sync.md)
+
+
+**NOTE:** You can still use the native Node.js methods. They are promisified and copied over to `fs-extra`. See [notes on `fs.read()`, `fs.write()`, & `fs.writev()`](docs/fs-read-write-writev.md)
+
+### What happened to `walk()` and `walkSync()`?
+
+They were removed from `fs-extra` in v2.0.0. If you need the functionality, `walk` and `walkSync` are available as separate packages, [`klaw`](https://github.com/jprichardson/node-klaw) and [`klaw-sync`](https://github.com/manidlou/node-klaw-sync).
+
+
+Third Party
+-----------
+
+### CLI
+
+[fse-cli](https://www.npmjs.com/package/@atao60/fse-cli) allows you to run `fs-extra` from a console or from [npm](https://www.npmjs.com) scripts.
+
+### TypeScript
+
+If you like TypeScript, you can use `fs-extra` with it: https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/fs-extra
+
+
+### File / Directory Watching
+
+If you want to watch for changes to files or directories, then you should use [chokidar](https://github.com/paulmillr/chokidar).
+
+### Obtain Filesystem (Devices, Partitions) Information
+
+[fs-filesystem](https://github.com/arthurintelligence/node-fs-filesystem) allows you to read the state of the filesystem of the host on which it is run. It returns information about both the devices and the partitions (volumes) of the system.
+
+### Misc.
+
+- [fs-extra-debug](https://github.com/jdxcode/fs-extra-debug) - Send your fs-extra calls to [debug](https://npmjs.org/package/debug).
+- [mfs](https://github.com/cadorn/mfs) - Monitor your fs-extra calls.
+
+
+
+Hacking on fs-extra
+-------------------
+
+Wanna hack on `fs-extra`? Great! Your help is needed! [fs-extra is one of the most depended upon Node.js packages](http://nodei.co/npm/fs-extra.png?downloads=true&downloadRank=true&stars=true). This project
+uses [JavaScript Standard Style](https://github.com/feross/standard) - if the name or style choices bother you,
+you're gonna have to get over it :) If `standard` is good enough for `npm`, it's good enough for `fs-extra`.
+
+[![js-standard-style](https://cdn.rawgit.com/feross/standard/master/badge.svg)](https://github.com/feross/standard)
+
+What's needed?
+- First, take a look at existing issues. Those are probably going to be where the priority lies.
+- More tests for edge cases. Specifically on different platforms. There can never be enough tests.
+- Improve test coverage.
+
+Note: If you make any big changes, **you should definitely file an issue for discussion first.**
+
+### Running the Test Suite
+
+fs-extra contains hundreds of tests.
+
+- `npm run lint`: runs the linter ([standard](http://standardjs.com/))
+- `npm run unit`: runs the unit tests
+- `npm test`: runs both the linter and the tests
+
+
+### Windows
+
+If you run the tests on the Windows and receive a lot of symbolic link `EPERM` permission errors, it's
+because on Windows you need elevated privilege to create symbolic links. You can add this to your Windows's
+account by following the instructions here: http://superuser.com/questions/104845/permission-to-make-symbolic-links-in-windows-7
+However, I didn't have much luck doing this.
+
+Since I develop on Mac OS X, I use VMWare Fusion for Windows testing. I create a shared folder that I map to a drive on Windows.
+I open the `Node.js command prompt` and run as `Administrator`. I then map the network drive running the following command:
+
+ net use z: "\\vmware-host\Shared Folders"
+
+I can then navigate to my `fs-extra` directory and run the tests.
+
+
+Naming
+------
+
+I put a lot of thought into the naming of these functions. Inspired by @coolaj86's request. So he deserves much of the credit for raising the issue. See discussion(s) here:
+
+* https://github.com/jprichardson/node-fs-extra/issues/2
+* https://github.com/flatiron/utile/issues/11
+* https://github.com/ryanmcgrath/wrench-js/issues/29
+* https://github.com/substack/node-mkdirp/issues/17
+
+First, I believe that in as many cases as possible, the [Node.js naming schemes](http://nodejs.org/api/fs.html) should be chosen. However, there are problems with the Node.js own naming schemes.
+
+For example, `fs.readFile()` and `fs.readdir()`: the **F** is capitalized in *File* and the **d** is not capitalized in *dir*. Perhaps a bit pedantic, but they should still be consistent. Also, Node.js has chosen a lot of POSIX naming schemes, which I believe is great. See: `fs.mkdir()`, `fs.rmdir()`, `fs.chown()`, etc.
+
+We have a dilemma though. How do you consistently name methods that perform the following POSIX commands: `cp`, `cp -r`, `mkdir -p`, and `rm -rf`?
+
+My perspective: when in doubt, err on the side of simplicity. A directory is just a hierarchical grouping of directories and files. Consider that for a moment. So when you want to copy it or remove it, in most cases you'll want to copy or remove all of its contents. When you want to create a directory, if the directory that it's suppose to be contained in does not exist, then in most cases you'll want to create that too.
+
+So, if you want to remove a file or a directory regardless of whether it has contents, just call `fs.remove(path)`. If you want to copy a file or a directory whether it has contents, just call `fs.copy(source, destination)`. If you want to create a directory regardless of whether its parent directories exist, just call `fs.mkdirs(path)` or `fs.mkdirp(path)`.
+
+
+Credit
+------
+
+`fs-extra` wouldn't be possible without using the modules from the following authors:
+
+- [Isaac Shlueter](https://github.com/isaacs)
+- [Charlie McConnel](https://github.com/avianflu)
+- [James Halliday](https://github.com/substack)
+- [Andrew Kelley](https://github.com/andrewrk)
+
+
+
+
+License
+-------
+
+Licensed under MIT
+
+Copyright (c) 2011-2017 [JP Richardson](https://github.com/jprichardson)
+
+[1]: http://nodejs.org/docs/latest/api/fs.html
+
+
+[jsonfile]: https://github.com/jprichardson/node-jsonfile
diff --git a/desktop/node_modules/@electron/osx-sign/node_modules/fs-extra/lib/copy/copy-sync.js b/desktop/node_modules/@electron/osx-sign/node_modules/fs-extra/lib/copy/copy-sync.js
new file mode 100644
index 0000000..551abe0
--- /dev/null
+++ b/desktop/node_modules/@electron/osx-sign/node_modules/fs-extra/lib/copy/copy-sync.js
@@ -0,0 +1,169 @@
+'use strict'
+
+const fs = require('graceful-fs')
+const path = require('path')
+const mkdirsSync = require('../mkdirs').mkdirsSync
+const utimesMillisSync = require('../util/utimes').utimesMillisSync
+const stat = require('../util/stat')
+
+function copySync (src, dest, opts) {
+ if (typeof opts === 'function') {
+ opts = { filter: opts }
+ }
+
+ opts = opts || {}
+ opts.clobber = 'clobber' in opts ? !!opts.clobber : true // default to true for now
+ opts.overwrite = 'overwrite' in opts ? !!opts.overwrite : opts.clobber // overwrite falls back to clobber
+
+ // Warn about using preserveTimestamps on 32-bit node
+ if (opts.preserveTimestamps && process.arch === 'ia32') {
+ process.emitWarning(
+ 'Using the preserveTimestamps option in 32-bit node is not recommended;\n\n' +
+ '\tsee https://github.com/jprichardson/node-fs-extra/issues/269',
+ 'Warning', 'fs-extra-WARN0002'
+ )
+ }
+
+ const { srcStat, destStat } = stat.checkPathsSync(src, dest, 'copy', opts)
+ stat.checkParentPathsSync(src, srcStat, dest, 'copy')
+ return handleFilterAndCopy(destStat, src, dest, opts)
+}
+
+function handleFilterAndCopy (destStat, src, dest, opts) {
+ if (opts.filter && !opts.filter(src, dest)) return
+ const destParent = path.dirname(dest)
+ if (!fs.existsSync(destParent)) mkdirsSync(destParent)
+ return getStats(destStat, src, dest, opts)
+}
+
+function startCopy (destStat, src, dest, opts) {
+ if (opts.filter && !opts.filter(src, dest)) return
+ return getStats(destStat, src, dest, opts)
+}
+
+function getStats (destStat, src, dest, opts) {
+ const statSync = opts.dereference ? fs.statSync : fs.lstatSync
+ const srcStat = statSync(src)
+
+ if (srcStat.isDirectory()) return onDir(srcStat, destStat, src, dest, opts)
+ else if (srcStat.isFile() ||
+ srcStat.isCharacterDevice() ||
+ srcStat.isBlockDevice()) return onFile(srcStat, destStat, src, dest, opts)
+ else if (srcStat.isSymbolicLink()) return onLink(destStat, src, dest, opts)
+ else if (srcStat.isSocket()) throw new Error(`Cannot copy a socket file: ${src}`)
+ else if (srcStat.isFIFO()) throw new Error(`Cannot copy a FIFO pipe: ${src}`)
+ throw new Error(`Unknown file: ${src}`)
+}
+
+function onFile (srcStat, destStat, src, dest, opts) {
+ if (!destStat) return copyFile(srcStat, src, dest, opts)
+ return mayCopyFile(srcStat, src, dest, opts)
+}
+
+function mayCopyFile (srcStat, src, dest, opts) {
+ if (opts.overwrite) {
+ fs.unlinkSync(dest)
+ return copyFile(srcStat, src, dest, opts)
+ } else if (opts.errorOnExist) {
+ throw new Error(`'${dest}' already exists`)
+ }
+}
+
+function copyFile (srcStat, src, dest, opts) {
+ fs.copyFileSync(src, dest)
+ if (opts.preserveTimestamps) handleTimestamps(srcStat.mode, src, dest)
+ return setDestMode(dest, srcStat.mode)
+}
+
+function handleTimestamps (srcMode, src, dest) {
+ // Make sure the file is writable before setting the timestamp
+ // otherwise open fails with EPERM when invoked with 'r+'
+ // (through utimes call)
+ if (fileIsNotWritable(srcMode)) makeFileWritable(dest, srcMode)
+ return setDestTimestamps(src, dest)
+}
+
+function fileIsNotWritable (srcMode) {
+ return (srcMode & 0o200) === 0
+}
+
+function makeFileWritable (dest, srcMode) {
+ return setDestMode(dest, srcMode | 0o200)
+}
+
+function setDestMode (dest, srcMode) {
+ return fs.chmodSync(dest, srcMode)
+}
+
+function setDestTimestamps (src, dest) {
+ // The initial srcStat.atime cannot be trusted
+ // because it is modified by the read(2) system call
+ // (See https://nodejs.org/api/fs.html#fs_stat_time_values)
+ const updatedSrcStat = fs.statSync(src)
+ return utimesMillisSync(dest, updatedSrcStat.atime, updatedSrcStat.mtime)
+}
+
+function onDir (srcStat, destStat, src, dest, opts) {
+ if (!destStat) return mkDirAndCopy(srcStat.mode, src, dest, opts)
+ return copyDir(src, dest, opts)
+}
+
+function mkDirAndCopy (srcMode, src, dest, opts) {
+ fs.mkdirSync(dest)
+ copyDir(src, dest, opts)
+ return setDestMode(dest, srcMode)
+}
+
+function copyDir (src, dest, opts) {
+ fs.readdirSync(src).forEach(item => copyDirItem(item, src, dest, opts))
+}
+
+function copyDirItem (item, src, dest, opts) {
+ const srcItem = path.join(src, item)
+ const destItem = path.join(dest, item)
+ const { destStat } = stat.checkPathsSync(srcItem, destItem, 'copy', opts)
+ return startCopy(destStat, srcItem, destItem, opts)
+}
+
+function onLink (destStat, src, dest, opts) {
+ let resolvedSrc = fs.readlinkSync(src)
+ if (opts.dereference) {
+ resolvedSrc = path.resolve(process.cwd(), resolvedSrc)
+ }
+
+ if (!destStat) {
+ return fs.symlinkSync(resolvedSrc, dest)
+ } else {
+ let resolvedDest
+ try {
+ resolvedDest = fs.readlinkSync(dest)
+ } catch (err) {
+ // dest exists and is a regular file or directory,
+ // Windows may throw UNKNOWN error. If dest already exists,
+ // fs throws error anyway, so no need to guard against it here.
+ if (err.code === 'EINVAL' || err.code === 'UNKNOWN') return fs.symlinkSync(resolvedSrc, dest)
+ throw err
+ }
+ if (opts.dereference) {
+ resolvedDest = path.resolve(process.cwd(), resolvedDest)
+ }
+ if (stat.isSrcSubdir(resolvedSrc, resolvedDest)) {
+ throw new Error(`Cannot copy '${resolvedSrc}' to a subdirectory of itself, '${resolvedDest}'.`)
+ }
+
+ // prevent copy if src is a subdir of dest since unlinking
+ // dest in this case would result in removing src contents
+ // and therefore a broken symlink would be created.
+ if (fs.statSync(dest).isDirectory() && stat.isSrcSubdir(resolvedDest, resolvedSrc)) {
+ throw new Error(`Cannot overwrite '${resolvedDest}' with '${resolvedSrc}'.`)
+ }
+ return copyLink(resolvedSrc, dest)
+ }
+}
+
+function copyLink (resolvedSrc, dest) {
+ fs.unlinkSync(dest)
+ return fs.symlinkSync(resolvedSrc, dest)
+}
+
+module.exports = copySync
diff --git a/desktop/node_modules/@electron/osx-sign/node_modules/fs-extra/lib/copy/copy.js b/desktop/node_modules/@electron/osx-sign/node_modules/fs-extra/lib/copy/copy.js
new file mode 100644
index 0000000..09d53df
--- /dev/null
+++ b/desktop/node_modules/@electron/osx-sign/node_modules/fs-extra/lib/copy/copy.js
@@ -0,0 +1,235 @@
+'use strict'
+
+const fs = require('graceful-fs')
+const path = require('path')
+const mkdirs = require('../mkdirs').mkdirs
+const pathExists = require('../path-exists').pathExists
+const utimesMillis = require('../util/utimes').utimesMillis
+const stat = require('../util/stat')
+
+function copy (src, dest, opts, cb) {
+ if (typeof opts === 'function' && !cb) {
+ cb = opts
+ opts = {}
+ } else if (typeof opts === 'function') {
+ opts = { filter: opts }
+ }
+
+ cb = cb || function () {}
+ opts = opts || {}
+
+ opts.clobber = 'clobber' in opts ? !!opts.clobber : true // default to true for now
+ opts.overwrite = 'overwrite' in opts ? !!opts.overwrite : opts.clobber // overwrite falls back to clobber
+
+ // Warn about using preserveTimestamps on 32-bit node
+ if (opts.preserveTimestamps && process.arch === 'ia32') {
+ process.emitWarning(
+ 'Using the preserveTimestamps option in 32-bit node is not recommended;\n\n' +
+ '\tsee https://github.com/jprichardson/node-fs-extra/issues/269',
+ 'Warning', 'fs-extra-WARN0001'
+ )
+ }
+
+ stat.checkPaths(src, dest, 'copy', opts, (err, stats) => {
+ if (err) return cb(err)
+ const { srcStat, destStat } = stats
+ stat.checkParentPaths(src, srcStat, dest, 'copy', err => {
+ if (err) return cb(err)
+ if (opts.filter) return handleFilter(checkParentDir, destStat, src, dest, opts, cb)
+ return checkParentDir(destStat, src, dest, opts, cb)
+ })
+ })
+}
+
+function checkParentDir (destStat, src, dest, opts, cb) {
+ const destParent = path.dirname(dest)
+ pathExists(destParent, (err, dirExists) => {
+ if (err) return cb(err)
+ if (dirExists) return getStats(destStat, src, dest, opts, cb)
+ mkdirs(destParent, err => {
+ if (err) return cb(err)
+ return getStats(destStat, src, dest, opts, cb)
+ })
+ })
+}
+
+function handleFilter (onInclude, destStat, src, dest, opts, cb) {
+ Promise.resolve(opts.filter(src, dest)).then(include => {
+ if (include) return onInclude(destStat, src, dest, opts, cb)
+ return cb()
+ }, error => cb(error))
+}
+
+function startCopy (destStat, src, dest, opts, cb) {
+ if (opts.filter) return handleFilter(getStats, destStat, src, dest, opts, cb)
+ return getStats(destStat, src, dest, opts, cb)
+}
+
+function getStats (destStat, src, dest, opts, cb) {
+ const stat = opts.dereference ? fs.stat : fs.lstat
+ stat(src, (err, srcStat) => {
+ if (err) return cb(err)
+
+ if (srcStat.isDirectory()) return onDir(srcStat, destStat, src, dest, opts, cb)
+ else if (srcStat.isFile() ||
+ srcStat.isCharacterDevice() ||
+ srcStat.isBlockDevice()) return onFile(srcStat, destStat, src, dest, opts, cb)
+ else if (srcStat.isSymbolicLink()) return onLink(destStat, src, dest, opts, cb)
+ else if (srcStat.isSocket()) return cb(new Error(`Cannot copy a socket file: ${src}`))
+ else if (srcStat.isFIFO()) return cb(new Error(`Cannot copy a FIFO pipe: ${src}`))
+ return cb(new Error(`Unknown file: ${src}`))
+ })
+}
+
+function onFile (srcStat, destStat, src, dest, opts, cb) {
+ if (!destStat) return copyFile(srcStat, src, dest, opts, cb)
+ return mayCopyFile(srcStat, src, dest, opts, cb)
+}
+
+function mayCopyFile (srcStat, src, dest, opts, cb) {
+ if (opts.overwrite) {
+ fs.unlink(dest, err => {
+ if (err) return cb(err)
+ return copyFile(srcStat, src, dest, opts, cb)
+ })
+ } else if (opts.errorOnExist) {
+ return cb(new Error(`'${dest}' already exists`))
+ } else return cb()
+}
+
+function copyFile (srcStat, src, dest, opts, cb) {
+ fs.copyFile(src, dest, err => {
+ if (err) return cb(err)
+ if (opts.preserveTimestamps) return handleTimestampsAndMode(srcStat.mode, src, dest, cb)
+ return setDestMode(dest, srcStat.mode, cb)
+ })
+}
+
+function handleTimestampsAndMode (srcMode, src, dest, cb) {
+ // Make sure the file is writable before setting the timestamp
+ // otherwise open fails with EPERM when invoked with 'r+'
+ // (through utimes call)
+ if (fileIsNotWritable(srcMode)) {
+ return makeFileWritable(dest, srcMode, err => {
+ if (err) return cb(err)
+ return setDestTimestampsAndMode(srcMode, src, dest, cb)
+ })
+ }
+ return setDestTimestampsAndMode(srcMode, src, dest, cb)
+}
+
+function fileIsNotWritable (srcMode) {
+ return (srcMode & 0o200) === 0
+}
+
+function makeFileWritable (dest, srcMode, cb) {
+ return setDestMode(dest, srcMode | 0o200, cb)
+}
+
+function setDestTimestampsAndMode (srcMode, src, dest, cb) {
+ setDestTimestamps(src, dest, err => {
+ if (err) return cb(err)
+ return setDestMode(dest, srcMode, cb)
+ })
+}
+
+function setDestMode (dest, srcMode, cb) {
+ return fs.chmod(dest, srcMode, cb)
+}
+
+function setDestTimestamps (src, dest, cb) {
+ // The initial srcStat.atime cannot be trusted
+ // because it is modified by the read(2) system call
+ // (See https://nodejs.org/api/fs.html#fs_stat_time_values)
+ fs.stat(src, (err, updatedSrcStat) => {
+ if (err) return cb(err)
+ return utimesMillis(dest, updatedSrcStat.atime, updatedSrcStat.mtime, cb)
+ })
+}
+
+function onDir (srcStat, destStat, src, dest, opts, cb) {
+ if (!destStat) return mkDirAndCopy(srcStat.mode, src, dest, opts, cb)
+ return copyDir(src, dest, opts, cb)
+}
+
+function mkDirAndCopy (srcMode, src, dest, opts, cb) {
+ fs.mkdir(dest, err => {
+ if (err) return cb(err)
+ copyDir(src, dest, opts, err => {
+ if (err) return cb(err)
+ return setDestMode(dest, srcMode, cb)
+ })
+ })
+}
+
+function copyDir (src, dest, opts, cb) {
+ fs.readdir(src, (err, items) => {
+ if (err) return cb(err)
+ return copyDirItems(items, src, dest, opts, cb)
+ })
+}
+
+function copyDirItems (items, src, dest, opts, cb) {
+ const item = items.pop()
+ if (!item) return cb()
+ return copyDirItem(items, item, src, dest, opts, cb)
+}
+
+function copyDirItem (items, item, src, dest, opts, cb) {
+ const srcItem = path.join(src, item)
+ const destItem = path.join(dest, item)
+ stat.checkPaths(srcItem, destItem, 'copy', opts, (err, stats) => {
+ if (err) return cb(err)
+ const { destStat } = stats
+ startCopy(destStat, srcItem, destItem, opts, err => {
+ if (err) return cb(err)
+ return copyDirItems(items, src, dest, opts, cb)
+ })
+ })
+}
+
+function onLink (destStat, src, dest, opts, cb) {
+ fs.readlink(src, (err, resolvedSrc) => {
+ if (err) return cb(err)
+ if (opts.dereference) {
+ resolvedSrc = path.resolve(process.cwd(), resolvedSrc)
+ }
+
+ if (!destStat) {
+ return fs.symlink(resolvedSrc, dest, cb)
+ } else {
+ fs.readlink(dest, (err, resolvedDest) => {
+ if (err) {
+ // dest exists and is a regular file or directory,
+ // Windows may throw UNKNOWN error. If dest already exists,
+ // fs throws error anyway, so no need to guard against it here.
+ if (err.code === 'EINVAL' || err.code === 'UNKNOWN') return fs.symlink(resolvedSrc, dest, cb)
+ return cb(err)
+ }
+ if (opts.dereference) {
+ resolvedDest = path.resolve(process.cwd(), resolvedDest)
+ }
+ if (stat.isSrcSubdir(resolvedSrc, resolvedDest)) {
+ return cb(new Error(`Cannot copy '${resolvedSrc}' to a subdirectory of itself, '${resolvedDest}'.`))
+ }
+
+ // do not copy if src is a subdir of dest since unlinking
+ // dest in this case would result in removing src contents
+ // and therefore a broken symlink would be created.
+ if (destStat.isDirectory() && stat.isSrcSubdir(resolvedDest, resolvedSrc)) {
+ return cb(new Error(`Cannot overwrite '${resolvedDest}' with '${resolvedSrc}'.`))
+ }
+ return copyLink(resolvedSrc, dest, cb)
+ })
+ }
+ })
+}
+
+function copyLink (resolvedSrc, dest, cb) {
+ fs.unlink(dest, err => {
+ if (err) return cb(err)
+ return fs.symlink(resolvedSrc, dest, cb)
+ })
+}
+
+module.exports = copy
diff --git a/desktop/node_modules/@electron/osx-sign/node_modules/fs-extra/lib/copy/index.js b/desktop/node_modules/@electron/osx-sign/node_modules/fs-extra/lib/copy/index.js
new file mode 100644
index 0000000..45c07a2
--- /dev/null
+++ b/desktop/node_modules/@electron/osx-sign/node_modules/fs-extra/lib/copy/index.js
@@ -0,0 +1,7 @@
+'use strict'
+
+const u = require('universalify').fromCallback
+module.exports = {
+ copy: u(require('./copy')),
+ copySync: require('./copy-sync')
+}
diff --git a/desktop/node_modules/@electron/osx-sign/node_modules/fs-extra/lib/empty/index.js b/desktop/node_modules/@electron/osx-sign/node_modules/fs-extra/lib/empty/index.js
new file mode 100644
index 0000000..b4a2e82
--- /dev/null
+++ b/desktop/node_modules/@electron/osx-sign/node_modules/fs-extra/lib/empty/index.js
@@ -0,0 +1,39 @@
+'use strict'
+
+const u = require('universalify').fromPromise
+const fs = require('../fs')
+const path = require('path')
+const mkdir = require('../mkdirs')
+const remove = require('../remove')
+
+const emptyDir = u(async function emptyDir (dir) {
+ let items
+ try {
+ items = await fs.readdir(dir)
+ } catch {
+ return mkdir.mkdirs(dir)
+ }
+
+ return Promise.all(items.map(item => remove.remove(path.join(dir, item))))
+})
+
+function emptyDirSync (dir) {
+ let items
+ try {
+ items = fs.readdirSync(dir)
+ } catch {
+ return mkdir.mkdirsSync(dir)
+ }
+
+ items.forEach(item => {
+ item = path.join(dir, item)
+ remove.removeSync(item)
+ })
+}
+
+module.exports = {
+ emptyDirSync,
+ emptydirSync: emptyDirSync,
+ emptyDir,
+ emptydir: emptyDir
+}
diff --git a/desktop/node_modules/@electron/osx-sign/node_modules/fs-extra/lib/ensure/file.js b/desktop/node_modules/@electron/osx-sign/node_modules/fs-extra/lib/ensure/file.js
new file mode 100644
index 0000000..15cc473
--- /dev/null
+++ b/desktop/node_modules/@electron/osx-sign/node_modules/fs-extra/lib/ensure/file.js
@@ -0,0 +1,69 @@
+'use strict'
+
+const u = require('universalify').fromCallback
+const path = require('path')
+const fs = require('graceful-fs')
+const mkdir = require('../mkdirs')
+
+function createFile (file, callback) {
+ function makeFile () {
+ fs.writeFile(file, '', err => {
+ if (err) return callback(err)
+ callback()
+ })
+ }
+
+ fs.stat(file, (err, stats) => { // eslint-disable-line handle-callback-err
+ if (!err && stats.isFile()) return callback()
+ const dir = path.dirname(file)
+ fs.stat(dir, (err, stats) => {
+ if (err) {
+ // if the directory doesn't exist, make it
+ if (err.code === 'ENOENT') {
+ return mkdir.mkdirs(dir, err => {
+ if (err) return callback(err)
+ makeFile()
+ })
+ }
+ return callback(err)
+ }
+
+ if (stats.isDirectory()) makeFile()
+ else {
+ // parent is not a directory
+ // This is just to cause an internal ENOTDIR error to be thrown
+ fs.readdir(dir, err => {
+ if (err) return callback(err)
+ })
+ }
+ })
+ })
+}
+
+function createFileSync (file) {
+ let stats
+ try {
+ stats = fs.statSync(file)
+ } catch {}
+ if (stats && stats.isFile()) return
+
+ const dir = path.dirname(file)
+ try {
+ if (!fs.statSync(dir).isDirectory()) {
+ // parent is not a directory
+ // This is just to cause an internal ENOTDIR error to be thrown
+ fs.readdirSync(dir)
+ }
+ } catch (err) {
+ // If the stat call above failed because the directory doesn't exist, create it
+ if (err && err.code === 'ENOENT') mkdir.mkdirsSync(dir)
+ else throw err
+ }
+
+ fs.writeFileSync(file, '')
+}
+
+module.exports = {
+ createFile: u(createFile),
+ createFileSync
+}
diff --git a/desktop/node_modules/@electron/osx-sign/node_modules/fs-extra/lib/ensure/index.js b/desktop/node_modules/@electron/osx-sign/node_modules/fs-extra/lib/ensure/index.js
new file mode 100644
index 0000000..ecbcdd0
--- /dev/null
+++ b/desktop/node_modules/@electron/osx-sign/node_modules/fs-extra/lib/ensure/index.js
@@ -0,0 +1,23 @@
+'use strict'
+
+const { createFile, createFileSync } = require('./file')
+const { createLink, createLinkSync } = require('./link')
+const { createSymlink, createSymlinkSync } = require('./symlink')
+
+module.exports = {
+ // file
+ createFile,
+ createFileSync,
+ ensureFile: createFile,
+ ensureFileSync: createFileSync,
+ // link
+ createLink,
+ createLinkSync,
+ ensureLink: createLink,
+ ensureLinkSync: createLinkSync,
+ // symlink
+ createSymlink,
+ createSymlinkSync,
+ ensureSymlink: createSymlink,
+ ensureSymlinkSync: createSymlinkSync
+}
diff --git a/desktop/node_modules/@electron/osx-sign/node_modules/fs-extra/lib/ensure/link.js b/desktop/node_modules/@electron/osx-sign/node_modules/fs-extra/lib/ensure/link.js
new file mode 100644
index 0000000..f6d6748
--- /dev/null
+++ b/desktop/node_modules/@electron/osx-sign/node_modules/fs-extra/lib/ensure/link.js
@@ -0,0 +1,64 @@
+'use strict'
+
+const u = require('universalify').fromCallback
+const path = require('path')
+const fs = require('graceful-fs')
+const mkdir = require('../mkdirs')
+const pathExists = require('../path-exists').pathExists
+const { areIdentical } = require('../util/stat')
+
+function createLink (srcpath, dstpath, callback) {
+ function makeLink (srcpath, dstpath) {
+ fs.link(srcpath, dstpath, err => {
+ if (err) return callback(err)
+ callback(null)
+ })
+ }
+
+ fs.lstat(dstpath, (_, dstStat) => {
+ fs.lstat(srcpath, (err, srcStat) => {
+ if (err) {
+ err.message = err.message.replace('lstat', 'ensureLink')
+ return callback(err)
+ }
+ if (dstStat && areIdentical(srcStat, dstStat)) return callback(null)
+
+ const dir = path.dirname(dstpath)
+ pathExists(dir, (err, dirExists) => {
+ if (err) return callback(err)
+ if (dirExists) return makeLink(srcpath, dstpath)
+ mkdir.mkdirs(dir, err => {
+ if (err) return callback(err)
+ makeLink(srcpath, dstpath)
+ })
+ })
+ })
+ })
+}
+
+function createLinkSync (srcpath, dstpath) {
+ let dstStat
+ try {
+ dstStat = fs.lstatSync(dstpath)
+ } catch {}
+
+ try {
+ const srcStat = fs.lstatSync(srcpath)
+ if (dstStat && areIdentical(srcStat, dstStat)) return
+ } catch (err) {
+ err.message = err.message.replace('lstat', 'ensureLink')
+ throw err
+ }
+
+ const dir = path.dirname(dstpath)
+ const dirExists = fs.existsSync(dir)
+ if (dirExists) return fs.linkSync(srcpath, dstpath)
+ mkdir.mkdirsSync(dir)
+
+ return fs.linkSync(srcpath, dstpath)
+}
+
+module.exports = {
+ createLink: u(createLink),
+ createLinkSync
+}
diff --git a/desktop/node_modules/@electron/osx-sign/node_modules/fs-extra/lib/ensure/symlink-paths.js b/desktop/node_modules/@electron/osx-sign/node_modules/fs-extra/lib/ensure/symlink-paths.js
new file mode 100644
index 0000000..33cd760
--- /dev/null
+++ b/desktop/node_modules/@electron/osx-sign/node_modules/fs-extra/lib/ensure/symlink-paths.js
@@ -0,0 +1,99 @@
+'use strict'
+
+const path = require('path')
+const fs = require('graceful-fs')
+const pathExists = require('../path-exists').pathExists
+
+/**
+ * Function that returns two types of paths, one relative to symlink, and one
+ * relative to the current working directory. Checks if path is absolute or
+ * relative. If the path is relative, this function checks if the path is
+ * relative to symlink or relative to current working directory. This is an
+ * initiative to find a smarter `srcpath` to supply when building symlinks.
+ * This allows you to determine which path to use out of one of three possible
+ * types of source paths. The first is an absolute path. This is detected by
+ * `path.isAbsolute()`. When an absolute path is provided, it is checked to
+ * see if it exists. If it does it's used, if not an error is returned
+ * (callback)/ thrown (sync). The other two options for `srcpath` are a
+ * relative url. By default Node's `fs.symlink` works by creating a symlink
+ * using `dstpath` and expects the `srcpath` to be relative to the newly
+ * created symlink. If you provide a `srcpath` that does not exist on the file
+ * system it results in a broken symlink. To minimize this, the function
+ * checks to see if the 'relative to symlink' source file exists, and if it
+ * does it will use it. If it does not, it checks if there's a file that
+ * exists that is relative to the current working directory, if does its used.
+ * This preserves the expectations of the original fs.symlink spec and adds
+ * the ability to pass in `relative to current working direcotry` paths.
+ */
+
+function symlinkPaths (srcpath, dstpath, callback) {
+ if (path.isAbsolute(srcpath)) {
+ return fs.lstat(srcpath, (err) => {
+ if (err) {
+ err.message = err.message.replace('lstat', 'ensureSymlink')
+ return callback(err)
+ }
+ return callback(null, {
+ toCwd: srcpath,
+ toDst: srcpath
+ })
+ })
+ } else {
+ const dstdir = path.dirname(dstpath)
+ const relativeToDst = path.join(dstdir, srcpath)
+ return pathExists(relativeToDst, (err, exists) => {
+ if (err) return callback(err)
+ if (exists) {
+ return callback(null, {
+ toCwd: relativeToDst,
+ toDst: srcpath
+ })
+ } else {
+ return fs.lstat(srcpath, (err) => {
+ if (err) {
+ err.message = err.message.replace('lstat', 'ensureSymlink')
+ return callback(err)
+ }
+ return callback(null, {
+ toCwd: srcpath,
+ toDst: path.relative(dstdir, srcpath)
+ })
+ })
+ }
+ })
+ }
+}
+
+function symlinkPathsSync (srcpath, dstpath) {
+ let exists
+ if (path.isAbsolute(srcpath)) {
+ exists = fs.existsSync(srcpath)
+ if (!exists) throw new Error('absolute srcpath does not exist')
+ return {
+ toCwd: srcpath,
+ toDst: srcpath
+ }
+ } else {
+ const dstdir = path.dirname(dstpath)
+ const relativeToDst = path.join(dstdir, srcpath)
+ exists = fs.existsSync(relativeToDst)
+ if (exists) {
+ return {
+ toCwd: relativeToDst,
+ toDst: srcpath
+ }
+ } else {
+ exists = fs.existsSync(srcpath)
+ if (!exists) throw new Error('relative srcpath does not exist')
+ return {
+ toCwd: srcpath,
+ toDst: path.relative(dstdir, srcpath)
+ }
+ }
+ }
+}
+
+module.exports = {
+ symlinkPaths,
+ symlinkPathsSync
+}
diff --git a/desktop/node_modules/@electron/osx-sign/node_modules/fs-extra/lib/ensure/symlink-type.js b/desktop/node_modules/@electron/osx-sign/node_modules/fs-extra/lib/ensure/symlink-type.js
new file mode 100644
index 0000000..42dc0ce
--- /dev/null
+++ b/desktop/node_modules/@electron/osx-sign/node_modules/fs-extra/lib/ensure/symlink-type.js
@@ -0,0 +1,31 @@
+'use strict'
+
+const fs = require('graceful-fs')
+
+function symlinkType (srcpath, type, callback) {
+ callback = (typeof type === 'function') ? type : callback
+ type = (typeof type === 'function') ? false : type
+ if (type) return callback(null, type)
+ fs.lstat(srcpath, (err, stats) => {
+ if (err) return callback(null, 'file')
+ type = (stats && stats.isDirectory()) ? 'dir' : 'file'
+ callback(null, type)
+ })
+}
+
+function symlinkTypeSync (srcpath, type) {
+ let stats
+
+ if (type) return type
+ try {
+ stats = fs.lstatSync(srcpath)
+ } catch {
+ return 'file'
+ }
+ return (stats && stats.isDirectory()) ? 'dir' : 'file'
+}
+
+module.exports = {
+ symlinkType,
+ symlinkTypeSync
+}
diff --git a/desktop/node_modules/@electron/osx-sign/node_modules/fs-extra/lib/ensure/symlink.js b/desktop/node_modules/@electron/osx-sign/node_modules/fs-extra/lib/ensure/symlink.js
new file mode 100644
index 0000000..2b93052
--- /dev/null
+++ b/desktop/node_modules/@electron/osx-sign/node_modules/fs-extra/lib/ensure/symlink.js
@@ -0,0 +1,82 @@
+'use strict'
+
+const u = require('universalify').fromCallback
+const path = require('path')
+const fs = require('../fs')
+const _mkdirs = require('../mkdirs')
+const mkdirs = _mkdirs.mkdirs
+const mkdirsSync = _mkdirs.mkdirsSync
+
+const _symlinkPaths = require('./symlink-paths')
+const symlinkPaths = _symlinkPaths.symlinkPaths
+const symlinkPathsSync = _symlinkPaths.symlinkPathsSync
+
+const _symlinkType = require('./symlink-type')
+const symlinkType = _symlinkType.symlinkType
+const symlinkTypeSync = _symlinkType.symlinkTypeSync
+
+const pathExists = require('../path-exists').pathExists
+
+const { areIdentical } = require('../util/stat')
+
+function createSymlink (srcpath, dstpath, type, callback) {
+ callback = (typeof type === 'function') ? type : callback
+ type = (typeof type === 'function') ? false : type
+
+ fs.lstat(dstpath, (err, stats) => {
+ if (!err && stats.isSymbolicLink()) {
+ Promise.all([
+ fs.stat(srcpath),
+ fs.stat(dstpath)
+ ]).then(([srcStat, dstStat]) => {
+ if (areIdentical(srcStat, dstStat)) return callback(null)
+ _createSymlink(srcpath, dstpath, type, callback)
+ })
+ } else _createSymlink(srcpath, dstpath, type, callback)
+ })
+}
+
+function _createSymlink (srcpath, dstpath, type, callback) {
+ symlinkPaths(srcpath, dstpath, (err, relative) => {
+ if (err) return callback(err)
+ srcpath = relative.toDst
+ symlinkType(relative.toCwd, type, (err, type) => {
+ if (err) return callback(err)
+ const dir = path.dirname(dstpath)
+ pathExists(dir, (err, dirExists) => {
+ if (err) return callback(err)
+ if (dirExists) return fs.symlink(srcpath, dstpath, type, callback)
+ mkdirs(dir, err => {
+ if (err) return callback(err)
+ fs.symlink(srcpath, dstpath, type, callback)
+ })
+ })
+ })
+ })
+}
+
+function createSymlinkSync (srcpath, dstpath, type) {
+ let stats
+ try {
+ stats = fs.lstatSync(dstpath)
+ } catch {}
+ if (stats && stats.isSymbolicLink()) {
+ const srcStat = fs.statSync(srcpath)
+ const dstStat = fs.statSync(dstpath)
+ if (areIdentical(srcStat, dstStat)) return
+ }
+
+ const relative = symlinkPathsSync(srcpath, dstpath)
+ srcpath = relative.toDst
+ type = symlinkTypeSync(relative.toCwd, type)
+ const dir = path.dirname(dstpath)
+ const exists = fs.existsSync(dir)
+ if (exists) return fs.symlinkSync(srcpath, dstpath, type)
+ mkdirsSync(dir)
+ return fs.symlinkSync(srcpath, dstpath, type)
+}
+
+module.exports = {
+ createSymlink: u(createSymlink),
+ createSymlinkSync
+}
diff --git a/desktop/node_modules/@electron/osx-sign/node_modules/fs-extra/lib/fs/index.js b/desktop/node_modules/@electron/osx-sign/node_modules/fs-extra/lib/fs/index.js
new file mode 100644
index 0000000..7b025e2
--- /dev/null
+++ b/desktop/node_modules/@electron/osx-sign/node_modules/fs-extra/lib/fs/index.js
@@ -0,0 +1,128 @@
+'use strict'
+// This is adapted from https://github.com/normalize/mz
+// Copyright (c) 2014-2016 Jonathan Ong me@jongleberry.com and Contributors
+const u = require('universalify').fromCallback
+const fs = require('graceful-fs')
+
+const api = [
+ 'access',
+ 'appendFile',
+ 'chmod',
+ 'chown',
+ 'close',
+ 'copyFile',
+ 'fchmod',
+ 'fchown',
+ 'fdatasync',
+ 'fstat',
+ 'fsync',
+ 'ftruncate',
+ 'futimes',
+ 'lchmod',
+ 'lchown',
+ 'link',
+ 'lstat',
+ 'mkdir',
+ 'mkdtemp',
+ 'open',
+ 'opendir',
+ 'readdir',
+ 'readFile',
+ 'readlink',
+ 'realpath',
+ 'rename',
+ 'rm',
+ 'rmdir',
+ 'stat',
+ 'symlink',
+ 'truncate',
+ 'unlink',
+ 'utimes',
+ 'writeFile'
+].filter(key => {
+ // Some commands are not available on some systems. Ex:
+ // fs.opendir was added in Node.js v12.12.0
+ // fs.rm was added in Node.js v14.14.0
+ // fs.lchown is not available on at least some Linux
+ return typeof fs[key] === 'function'
+})
+
+// Export cloned fs:
+Object.assign(exports, fs)
+
+// Universalify async methods:
+api.forEach(method => {
+ exports[method] = u(fs[method])
+})
+
+// We differ from mz/fs in that we still ship the old, broken, fs.exists()
+// since we are a drop-in replacement for the native module
+exports.exists = function (filename, callback) {
+ if (typeof callback === 'function') {
+ return fs.exists(filename, callback)
+ }
+ return new Promise(resolve => {
+ return fs.exists(filename, resolve)
+ })
+}
+
+// fs.read(), fs.write(), & fs.writev() need special treatment due to multiple callback args
+
+exports.read = function (fd, buffer, offset, length, position, callback) {
+ if (typeof callback === 'function') {
+ return fs.read(fd, buffer, offset, length, position, callback)
+ }
+ return new Promise((resolve, reject) => {
+ fs.read(fd, buffer, offset, length, position, (err, bytesRead, buffer) => {
+ if (err) return reject(err)
+ resolve({ bytesRead, buffer })
+ })
+ })
+}
+
+// Function signature can be
+// fs.write(fd, buffer[, offset[, length[, position]]], callback)
+// OR
+// fs.write(fd, string[, position[, encoding]], callback)
+// We need to handle both cases, so we use ...args
+exports.write = function (fd, buffer, ...args) {
+ if (typeof args[args.length - 1] === 'function') {
+ return fs.write(fd, buffer, ...args)
+ }
+
+ return new Promise((resolve, reject) => {
+ fs.write(fd, buffer, ...args, (err, bytesWritten, buffer) => {
+ if (err) return reject(err)
+ resolve({ bytesWritten, buffer })
+ })
+ })
+}
+
+// fs.writev only available in Node v12.9.0+
+if (typeof fs.writev === 'function') {
+ // Function signature is
+ // s.writev(fd, buffers[, position], callback)
+ // We need to handle the optional arg, so we use ...args
+ exports.writev = function (fd, buffers, ...args) {
+ if (typeof args[args.length - 1] === 'function') {
+ return fs.writev(fd, buffers, ...args)
+ }
+
+ return new Promise((resolve, reject) => {
+ fs.writev(fd, buffers, ...args, (err, bytesWritten, buffers) => {
+ if (err) return reject(err)
+ resolve({ bytesWritten, buffers })
+ })
+ })
+ }
+}
+
+// fs.realpath.native sometimes not available if fs is monkey-patched
+if (typeof fs.realpath.native === 'function') {
+ exports.realpath.native = u(fs.realpath.native)
+} else {
+ process.emitWarning(
+ 'fs.realpath.native is not a function. Is fs being monkey-patched?',
+ 'Warning', 'fs-extra-WARN0003'
+ )
+}
diff --git a/desktop/node_modules/@electron/osx-sign/node_modules/fs-extra/lib/index.js b/desktop/node_modules/@electron/osx-sign/node_modules/fs-extra/lib/index.js
new file mode 100644
index 0000000..da6711a
--- /dev/null
+++ b/desktop/node_modules/@electron/osx-sign/node_modules/fs-extra/lib/index.js
@@ -0,0 +1,16 @@
+'use strict'
+
+module.exports = {
+ // Export promiseified graceful-fs:
+ ...require('./fs'),
+ // Export extra methods:
+ ...require('./copy'),
+ ...require('./empty'),
+ ...require('./ensure'),
+ ...require('./json'),
+ ...require('./mkdirs'),
+ ...require('./move'),
+ ...require('./output-file'),
+ ...require('./path-exists'),
+ ...require('./remove')
+}
diff --git a/desktop/node_modules/@electron/osx-sign/node_modules/fs-extra/lib/json/index.js b/desktop/node_modules/@electron/osx-sign/node_modules/fs-extra/lib/json/index.js
new file mode 100644
index 0000000..900126a
--- /dev/null
+++ b/desktop/node_modules/@electron/osx-sign/node_modules/fs-extra/lib/json/index.js
@@ -0,0 +1,16 @@
+'use strict'
+
+const u = require('universalify').fromPromise
+const jsonFile = require('./jsonfile')
+
+jsonFile.outputJson = u(require('./output-json'))
+jsonFile.outputJsonSync = require('./output-json-sync')
+// aliases
+jsonFile.outputJSON = jsonFile.outputJson
+jsonFile.outputJSONSync = jsonFile.outputJsonSync
+jsonFile.writeJSON = jsonFile.writeJson
+jsonFile.writeJSONSync = jsonFile.writeJsonSync
+jsonFile.readJSON = jsonFile.readJson
+jsonFile.readJSONSync = jsonFile.readJsonSync
+
+module.exports = jsonFile
diff --git a/desktop/node_modules/@electron/osx-sign/node_modules/fs-extra/lib/json/jsonfile.js b/desktop/node_modules/@electron/osx-sign/node_modules/fs-extra/lib/json/jsonfile.js
new file mode 100644
index 0000000..f11d34d
--- /dev/null
+++ b/desktop/node_modules/@electron/osx-sign/node_modules/fs-extra/lib/json/jsonfile.js
@@ -0,0 +1,11 @@
+'use strict'
+
+const jsonFile = require('jsonfile')
+
+module.exports = {
+ // jsonfile exports
+ readJson: jsonFile.readFile,
+ readJsonSync: jsonFile.readFileSync,
+ writeJson: jsonFile.writeFile,
+ writeJsonSync: jsonFile.writeFileSync
+}
diff --git a/desktop/node_modules/@electron/osx-sign/node_modules/fs-extra/lib/json/output-json-sync.js b/desktop/node_modules/@electron/osx-sign/node_modules/fs-extra/lib/json/output-json-sync.js
new file mode 100644
index 0000000..d4e564f
--- /dev/null
+++ b/desktop/node_modules/@electron/osx-sign/node_modules/fs-extra/lib/json/output-json-sync.js
@@ -0,0 +1,12 @@
+'use strict'
+
+const { stringify } = require('jsonfile/utils')
+const { outputFileSync } = require('../output-file')
+
+function outputJsonSync (file, data, options) {
+ const str = stringify(data, options)
+
+ outputFileSync(file, str, options)
+}
+
+module.exports = outputJsonSync
diff --git a/desktop/node_modules/@electron/osx-sign/node_modules/fs-extra/lib/json/output-json.js b/desktop/node_modules/@electron/osx-sign/node_modules/fs-extra/lib/json/output-json.js
new file mode 100644
index 0000000..0afdeb6
--- /dev/null
+++ b/desktop/node_modules/@electron/osx-sign/node_modules/fs-extra/lib/json/output-json.js
@@ -0,0 +1,12 @@
+'use strict'
+
+const { stringify } = require('jsonfile/utils')
+const { outputFile } = require('../output-file')
+
+async function outputJson (file, data, options = {}) {
+ const str = stringify(data, options)
+
+ await outputFile(file, str, options)
+}
+
+module.exports = outputJson
diff --git a/desktop/node_modules/@electron/osx-sign/node_modules/fs-extra/lib/mkdirs/index.js b/desktop/node_modules/@electron/osx-sign/node_modules/fs-extra/lib/mkdirs/index.js
new file mode 100644
index 0000000..9edecee
--- /dev/null
+++ b/desktop/node_modules/@electron/osx-sign/node_modules/fs-extra/lib/mkdirs/index.js
@@ -0,0 +1,14 @@
+'use strict'
+const u = require('universalify').fromPromise
+const { makeDir: _makeDir, makeDirSync } = require('./make-dir')
+const makeDir = u(_makeDir)
+
+module.exports = {
+ mkdirs: makeDir,
+ mkdirsSync: makeDirSync,
+ // alias
+ mkdirp: makeDir,
+ mkdirpSync: makeDirSync,
+ ensureDir: makeDir,
+ ensureDirSync: makeDirSync
+}
diff --git a/desktop/node_modules/@electron/osx-sign/node_modules/fs-extra/lib/mkdirs/make-dir.js b/desktop/node_modules/@electron/osx-sign/node_modules/fs-extra/lib/mkdirs/make-dir.js
new file mode 100644
index 0000000..45ece64
--- /dev/null
+++ b/desktop/node_modules/@electron/osx-sign/node_modules/fs-extra/lib/mkdirs/make-dir.js
@@ -0,0 +1,27 @@
+'use strict'
+const fs = require('../fs')
+const { checkPath } = require('./utils')
+
+const getMode = options => {
+ const defaults = { mode: 0o777 }
+ if (typeof options === 'number') return options
+ return ({ ...defaults, ...options }).mode
+}
+
+module.exports.makeDir = async (dir, options) => {
+ checkPath(dir)
+
+ return fs.mkdir(dir, {
+ mode: getMode(options),
+ recursive: true
+ })
+}
+
+module.exports.makeDirSync = (dir, options) => {
+ checkPath(dir)
+
+ return fs.mkdirSync(dir, {
+ mode: getMode(options),
+ recursive: true
+ })
+}
diff --git a/desktop/node_modules/@electron/osx-sign/node_modules/fs-extra/lib/mkdirs/utils.js b/desktop/node_modules/@electron/osx-sign/node_modules/fs-extra/lib/mkdirs/utils.js
new file mode 100644
index 0000000..a4059ad
--- /dev/null
+++ b/desktop/node_modules/@electron/osx-sign/node_modules/fs-extra/lib/mkdirs/utils.js
@@ -0,0 +1,21 @@
+// Adapted from https://github.com/sindresorhus/make-dir
+// Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)
+// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+'use strict'
+const path = require('path')
+
+// https://github.com/nodejs/node/issues/8987
+// https://github.com/libuv/libuv/pull/1088
+module.exports.checkPath = function checkPath (pth) {
+ if (process.platform === 'win32') {
+ const pathHasInvalidWinCharacters = /[<>:"|?*]/.test(pth.replace(path.parse(pth).root, ''))
+
+ if (pathHasInvalidWinCharacters) {
+ const error = new Error(`Path contains invalid characters: ${pth}`)
+ error.code = 'EINVAL'
+ throw error
+ }
+ }
+}
diff --git a/desktop/node_modules/@electron/osx-sign/node_modules/fs-extra/lib/move/index.js b/desktop/node_modules/@electron/osx-sign/node_modules/fs-extra/lib/move/index.js
new file mode 100644
index 0000000..fcee73c
--- /dev/null
+++ b/desktop/node_modules/@electron/osx-sign/node_modules/fs-extra/lib/move/index.js
@@ -0,0 +1,7 @@
+'use strict'
+
+const u = require('universalify').fromCallback
+module.exports = {
+ move: u(require('./move')),
+ moveSync: require('./move-sync')
+}
diff --git a/desktop/node_modules/@electron/osx-sign/node_modules/fs-extra/lib/move/move-sync.js b/desktop/node_modules/@electron/osx-sign/node_modules/fs-extra/lib/move/move-sync.js
new file mode 100644
index 0000000..8453366
--- /dev/null
+++ b/desktop/node_modules/@electron/osx-sign/node_modules/fs-extra/lib/move/move-sync.js
@@ -0,0 +1,54 @@
+'use strict'
+
+const fs = require('graceful-fs')
+const path = require('path')
+const copySync = require('../copy').copySync
+const removeSync = require('../remove').removeSync
+const mkdirpSync = require('../mkdirs').mkdirpSync
+const stat = require('../util/stat')
+
+function moveSync (src, dest, opts) {
+ opts = opts || {}
+ const overwrite = opts.overwrite || opts.clobber || false
+
+ const { srcStat, isChangingCase = false } = stat.checkPathsSync(src, dest, 'move', opts)
+ stat.checkParentPathsSync(src, srcStat, dest, 'move')
+ if (!isParentRoot(dest)) mkdirpSync(path.dirname(dest))
+ return doRename(src, dest, overwrite, isChangingCase)
+}
+
+function isParentRoot (dest) {
+ const parent = path.dirname(dest)
+ const parsedPath = path.parse(parent)
+ return parsedPath.root === parent
+}
+
+function doRename (src, dest, overwrite, isChangingCase) {
+ if (isChangingCase) return rename(src, dest, overwrite)
+ if (overwrite) {
+ removeSync(dest)
+ return rename(src, dest, overwrite)
+ }
+ if (fs.existsSync(dest)) throw new Error('dest already exists.')
+ return rename(src, dest, overwrite)
+}
+
+function rename (src, dest, overwrite) {
+ try {
+ fs.renameSync(src, dest)
+ } catch (err) {
+ if (err.code !== 'EXDEV') throw err
+ return moveAcrossDevice(src, dest, overwrite)
+ }
+}
+
+function moveAcrossDevice (src, dest, overwrite) {
+ const opts = {
+ overwrite,
+ errorOnExist: true
+ }
+ copySync(src, dest, opts)
+ return removeSync(src)
+}
+
+module.exports = moveSync
diff --git a/desktop/node_modules/@electron/osx-sign/node_modules/fs-extra/lib/move/move.js b/desktop/node_modules/@electron/osx-sign/node_modules/fs-extra/lib/move/move.js
new file mode 100644
index 0000000..7dc6ecd
--- /dev/null
+++ b/desktop/node_modules/@electron/osx-sign/node_modules/fs-extra/lib/move/move.js
@@ -0,0 +1,75 @@
+'use strict'
+
+const fs = require('graceful-fs')
+const path = require('path')
+const copy = require('../copy').copy
+const remove = require('../remove').remove
+const mkdirp = require('../mkdirs').mkdirp
+const pathExists = require('../path-exists').pathExists
+const stat = require('../util/stat')
+
+function move (src, dest, opts, cb) {
+ if (typeof opts === 'function') {
+ cb = opts
+ opts = {}
+ }
+
+ opts = opts || {}
+
+ const overwrite = opts.overwrite || opts.clobber || false
+
+ stat.checkPaths(src, dest, 'move', opts, (err, stats) => {
+ if (err) return cb(err)
+ const { srcStat, isChangingCase = false } = stats
+ stat.checkParentPaths(src, srcStat, dest, 'move', err => {
+ if (err) return cb(err)
+ if (isParentRoot(dest)) return doRename(src, dest, overwrite, isChangingCase, cb)
+ mkdirp(path.dirname(dest), err => {
+ if (err) return cb(err)
+ return doRename(src, dest, overwrite, isChangingCase, cb)
+ })
+ })
+ })
+}
+
+function isParentRoot (dest) {
+ const parent = path.dirname(dest)
+ const parsedPath = path.parse(parent)
+ return parsedPath.root === parent
+}
+
+function doRename (src, dest, overwrite, isChangingCase, cb) {
+ if (isChangingCase) return rename(src, dest, overwrite, cb)
+ if (overwrite) {
+ return remove(dest, err => {
+ if (err) return cb(err)
+ return rename(src, dest, overwrite, cb)
+ })
+ }
+ pathExists(dest, (err, destExists) => {
+ if (err) return cb(err)
+ if (destExists) return cb(new Error('dest already exists.'))
+ return rename(src, dest, overwrite, cb)
+ })
+}
+
+function rename (src, dest, overwrite, cb) {
+ fs.rename(src, dest, err => {
+ if (!err) return cb()
+ if (err.code !== 'EXDEV') return cb(err)
+ return moveAcrossDevice(src, dest, overwrite, cb)
+ })
+}
+
+function moveAcrossDevice (src, dest, overwrite, cb) {
+ const opts = {
+ overwrite,
+ errorOnExist: true
+ }
+ copy(src, dest, opts, err => {
+ if (err) return cb(err)
+ return remove(src, cb)
+ })
+}
+
+module.exports = move
diff --git a/desktop/node_modules/@electron/osx-sign/node_modules/fs-extra/lib/output-file/index.js b/desktop/node_modules/@electron/osx-sign/node_modules/fs-extra/lib/output-file/index.js
new file mode 100644
index 0000000..92297ca
--- /dev/null
+++ b/desktop/node_modules/@electron/osx-sign/node_modules/fs-extra/lib/output-file/index.js
@@ -0,0 +1,40 @@
+'use strict'
+
+const u = require('universalify').fromCallback
+const fs = require('graceful-fs')
+const path = require('path')
+const mkdir = require('../mkdirs')
+const pathExists = require('../path-exists').pathExists
+
+function outputFile (file, data, encoding, callback) {
+ if (typeof encoding === 'function') {
+ callback = encoding
+ encoding = 'utf8'
+ }
+
+ const dir = path.dirname(file)
+ pathExists(dir, (err, itDoes) => {
+ if (err) return callback(err)
+ if (itDoes) return fs.writeFile(file, data, encoding, callback)
+
+ mkdir.mkdirs(dir, err => {
+ if (err) return callback(err)
+
+ fs.writeFile(file, data, encoding, callback)
+ })
+ })
+}
+
+function outputFileSync (file, ...args) {
+ const dir = path.dirname(file)
+ if (fs.existsSync(dir)) {
+ return fs.writeFileSync(file, ...args)
+ }
+ mkdir.mkdirsSync(dir)
+ fs.writeFileSync(file, ...args)
+}
+
+module.exports = {
+ outputFile: u(outputFile),
+ outputFileSync
+}
diff --git a/desktop/node_modules/@electron/osx-sign/node_modules/fs-extra/lib/path-exists/index.js b/desktop/node_modules/@electron/osx-sign/node_modules/fs-extra/lib/path-exists/index.js
new file mode 100644
index 0000000..ddd9bc7
--- /dev/null
+++ b/desktop/node_modules/@electron/osx-sign/node_modules/fs-extra/lib/path-exists/index.js
@@ -0,0 +1,12 @@
+'use strict'
+const u = require('universalify').fromPromise
+const fs = require('../fs')
+
+function pathExists (path) {
+ return fs.access(path).then(() => true).catch(() => false)
+}
+
+module.exports = {
+ pathExists: u(pathExists),
+ pathExistsSync: fs.existsSync
+}
diff --git a/desktop/node_modules/@electron/osx-sign/node_modules/fs-extra/lib/remove/index.js b/desktop/node_modules/@electron/osx-sign/node_modules/fs-extra/lib/remove/index.js
new file mode 100644
index 0000000..4428e59
--- /dev/null
+++ b/desktop/node_modules/@electron/osx-sign/node_modules/fs-extra/lib/remove/index.js
@@ -0,0 +1,22 @@
+'use strict'
+
+const fs = require('graceful-fs')
+const u = require('universalify').fromCallback
+const rimraf = require('./rimraf')
+
+function remove (path, callback) {
+ // Node 14.14.0+
+ if (fs.rm) return fs.rm(path, { recursive: true, force: true }, callback)
+ rimraf(path, callback)
+}
+
+function removeSync (path) {
+ // Node 14.14.0+
+ if (fs.rmSync) return fs.rmSync(path, { recursive: true, force: true })
+ rimraf.sync(path)
+}
+
+module.exports = {
+ remove: u(remove),
+ removeSync
+}
diff --git a/desktop/node_modules/@electron/osx-sign/node_modules/fs-extra/lib/remove/rimraf.js b/desktop/node_modules/@electron/osx-sign/node_modules/fs-extra/lib/remove/rimraf.js
new file mode 100644
index 0000000..2c77102
--- /dev/null
+++ b/desktop/node_modules/@electron/osx-sign/node_modules/fs-extra/lib/remove/rimraf.js
@@ -0,0 +1,302 @@
+'use strict'
+
+const fs = require('graceful-fs')
+const path = require('path')
+const assert = require('assert')
+
+const isWindows = (process.platform === 'win32')
+
+function defaults (options) {
+ const methods = [
+ 'unlink',
+ 'chmod',
+ 'stat',
+ 'lstat',
+ 'rmdir',
+ 'readdir'
+ ]
+ methods.forEach(m => {
+ options[m] = options[m] || fs[m]
+ m = m + 'Sync'
+ options[m] = options[m] || fs[m]
+ })
+
+ options.maxBusyTries = options.maxBusyTries || 3
+}
+
+function rimraf (p, options, cb) {
+ let busyTries = 0
+
+ if (typeof options === 'function') {
+ cb = options
+ options = {}
+ }
+
+ assert(p, 'rimraf: missing path')
+ assert.strictEqual(typeof p, 'string', 'rimraf: path should be a string')
+ assert.strictEqual(typeof cb, 'function', 'rimraf: callback function required')
+ assert(options, 'rimraf: invalid options argument provided')
+ assert.strictEqual(typeof options, 'object', 'rimraf: options should be object')
+
+ defaults(options)
+
+ rimraf_(p, options, function CB (er) {
+ if (er) {
+ if ((er.code === 'EBUSY' || er.code === 'ENOTEMPTY' || er.code === 'EPERM') &&
+ busyTries < options.maxBusyTries) {
+ busyTries++
+ const time = busyTries * 100
+ // try again, with the same exact callback as this one.
+ return setTimeout(() => rimraf_(p, options, CB), time)
+ }
+
+ // already gone
+ if (er.code === 'ENOENT') er = null
+ }
+
+ cb(er)
+ })
+}
+
+// Two possible strategies.
+// 1. Assume it's a file. unlink it, then do the dir stuff on EPERM or EISDIR
+// 2. Assume it's a directory. readdir, then do the file stuff on ENOTDIR
+//
+// Both result in an extra syscall when you guess wrong. However, there
+// are likely far more normal files in the world than directories. This
+// is based on the assumption that a the average number of files per
+// directory is >= 1.
+//
+// If anyone ever complains about this, then I guess the strategy could
+// be made configurable somehow. But until then, YAGNI.
+function rimraf_ (p, options, cb) {
+ assert(p)
+ assert(options)
+ assert(typeof cb === 'function')
+
+ // sunos lets the root user unlink directories, which is... weird.
+ // so we have to lstat here and make sure it's not a dir.
+ options.lstat(p, (er, st) => {
+ if (er && er.code === 'ENOENT') {
+ return cb(null)
+ }
+
+ // Windows can EPERM on stat. Life is suffering.
+ if (er && er.code === 'EPERM' && isWindows) {
+ return fixWinEPERM(p, options, er, cb)
+ }
+
+ if (st && st.isDirectory()) {
+ return rmdir(p, options, er, cb)
+ }
+
+ options.unlink(p, er => {
+ if (er) {
+ if (er.code === 'ENOENT') {
+ return cb(null)
+ }
+ if (er.code === 'EPERM') {
+ return (isWindows)
+ ? fixWinEPERM(p, options, er, cb)
+ : rmdir(p, options, er, cb)
+ }
+ if (er.code === 'EISDIR') {
+ return rmdir(p, options, er, cb)
+ }
+ }
+ return cb(er)
+ })
+ })
+}
+
+function fixWinEPERM (p, options, er, cb) {
+ assert(p)
+ assert(options)
+ assert(typeof cb === 'function')
+
+ options.chmod(p, 0o666, er2 => {
+ if (er2) {
+ cb(er2.code === 'ENOENT' ? null : er)
+ } else {
+ options.stat(p, (er3, stats) => {
+ if (er3) {
+ cb(er3.code === 'ENOENT' ? null : er)
+ } else if (stats.isDirectory()) {
+ rmdir(p, options, er, cb)
+ } else {
+ options.unlink(p, cb)
+ }
+ })
+ }
+ })
+}
+
+function fixWinEPERMSync (p, options, er) {
+ let stats
+
+ assert(p)
+ assert(options)
+
+ try {
+ options.chmodSync(p, 0o666)
+ } catch (er2) {
+ if (er2.code === 'ENOENT') {
+ return
+ } else {
+ throw er
+ }
+ }
+
+ try {
+ stats = options.statSync(p)
+ } catch (er3) {
+ if (er3.code === 'ENOENT') {
+ return
+ } else {
+ throw er
+ }
+ }
+
+ if (stats.isDirectory()) {
+ rmdirSync(p, options, er)
+ } else {
+ options.unlinkSync(p)
+ }
+}
+
+function rmdir (p, options, originalEr, cb) {
+ assert(p)
+ assert(options)
+ assert(typeof cb === 'function')
+
+ // try to rmdir first, and only readdir on ENOTEMPTY or EEXIST (SunOS)
+ // if we guessed wrong, and it's not a directory, then
+ // raise the original error.
+ options.rmdir(p, er => {
+ if (er && (er.code === 'ENOTEMPTY' || er.code === 'EEXIST' || er.code === 'EPERM')) {
+ rmkids(p, options, cb)
+ } else if (er && er.code === 'ENOTDIR') {
+ cb(originalEr)
+ } else {
+ cb(er)
+ }
+ })
+}
+
+function rmkids (p, options, cb) {
+ assert(p)
+ assert(options)
+ assert(typeof cb === 'function')
+
+ options.readdir(p, (er, files) => {
+ if (er) return cb(er)
+
+ let n = files.length
+ let errState
+
+ if (n === 0) return options.rmdir(p, cb)
+
+ files.forEach(f => {
+ rimraf(path.join(p, f), options, er => {
+ if (errState) {
+ return
+ }
+ if (er) return cb(errState = er)
+ if (--n === 0) {
+ options.rmdir(p, cb)
+ }
+ })
+ })
+ })
+}
+
+// this looks simpler, and is strictly *faster*, but will
+// tie up the JavaScript thread and fail on excessively
+// deep directory trees.
+function rimrafSync (p, options) {
+ let st
+
+ options = options || {}
+ defaults(options)
+
+ assert(p, 'rimraf: missing path')
+ assert.strictEqual(typeof p, 'string', 'rimraf: path should be a string')
+ assert(options, 'rimraf: missing options')
+ assert.strictEqual(typeof options, 'object', 'rimraf: options should be object')
+
+ try {
+ st = options.lstatSync(p)
+ } catch (er) {
+ if (er.code === 'ENOENT') {
+ return
+ }
+
+ // Windows can EPERM on stat. Life is suffering.
+ if (er.code === 'EPERM' && isWindows) {
+ fixWinEPERMSync(p, options, er)
+ }
+ }
+
+ try {
+ // sunos lets the root user unlink directories, which is... weird.
+ if (st && st.isDirectory()) {
+ rmdirSync(p, options, null)
+ } else {
+ options.unlinkSync(p)
+ }
+ } catch (er) {
+ if (er.code === 'ENOENT') {
+ return
+ } else if (er.code === 'EPERM') {
+ return isWindows ? fixWinEPERMSync(p, options, er) : rmdirSync(p, options, er)
+ } else if (er.code !== 'EISDIR') {
+ throw er
+ }
+ rmdirSync(p, options, er)
+ }
+}
+
+function rmdirSync (p, options, originalEr) {
+ assert(p)
+ assert(options)
+
+ try {
+ options.rmdirSync(p)
+ } catch (er) {
+ if (er.code === 'ENOTDIR') {
+ throw originalEr
+ } else if (er.code === 'ENOTEMPTY' || er.code === 'EEXIST' || er.code === 'EPERM') {
+ rmkidsSync(p, options)
+ } else if (er.code !== 'ENOENT') {
+ throw er
+ }
+ }
+}
+
+function rmkidsSync (p, options) {
+ assert(p)
+ assert(options)
+ options.readdirSync(p).forEach(f => rimrafSync(path.join(p, f), options))
+
+ if (isWindows) {
+ // We only end up here once we got ENOTEMPTY at least once, and
+ // at this point, we are guaranteed to have removed all the kids.
+ // So, we know that it won't be ENOENT or ENOTDIR or anything else.
+ // try really hard to delete stuff on windows, because it has a
+ // PROFOUNDLY annoying habit of not closing handles promptly when
+ // files are deleted, resulting in spurious ENOTEMPTY errors.
+ const startTime = Date.now()
+ do {
+ try {
+ const ret = options.rmdirSync(p, options)
+ return ret
+ } catch {}
+ } while (Date.now() - startTime < 500) // give up after 500ms
+ } else {
+ const ret = options.rmdirSync(p, options)
+ return ret
+ }
+}
+
+module.exports = rimraf
+rimraf.sync = rimrafSync
diff --git a/desktop/node_modules/@electron/osx-sign/node_modules/fs-extra/lib/util/stat.js b/desktop/node_modules/@electron/osx-sign/node_modules/fs-extra/lib/util/stat.js
new file mode 100644
index 0000000..0ed5aec
--- /dev/null
+++ b/desktop/node_modules/@electron/osx-sign/node_modules/fs-extra/lib/util/stat.js
@@ -0,0 +1,154 @@
+'use strict'
+
+const fs = require('../fs')
+const path = require('path')
+const util = require('util')
+
+function getStats (src, dest, opts) {
+ const statFunc = opts.dereference
+ ? (file) => fs.stat(file, { bigint: true })
+ : (file) => fs.lstat(file, { bigint: true })
+ return Promise.all([
+ statFunc(src),
+ statFunc(dest).catch(err => {
+ if (err.code === 'ENOENT') return null
+ throw err
+ })
+ ]).then(([srcStat, destStat]) => ({ srcStat, destStat }))
+}
+
+function getStatsSync (src, dest, opts) {
+ let destStat
+ const statFunc = opts.dereference
+ ? (file) => fs.statSync(file, { bigint: true })
+ : (file) => fs.lstatSync(file, { bigint: true })
+ const srcStat = statFunc(src)
+ try {
+ destStat = statFunc(dest)
+ } catch (err) {
+ if (err.code === 'ENOENT') return { srcStat, destStat: null }
+ throw err
+ }
+ return { srcStat, destStat }
+}
+
+function checkPaths (src, dest, funcName, opts, cb) {
+ util.callbackify(getStats)(src, dest, opts, (err, stats) => {
+ if (err) return cb(err)
+ const { srcStat, destStat } = stats
+
+ if (destStat) {
+ if (areIdentical(srcStat, destStat)) {
+ const srcBaseName = path.basename(src)
+ const destBaseName = path.basename(dest)
+ if (funcName === 'move' &&
+ srcBaseName !== destBaseName &&
+ srcBaseName.toLowerCase() === destBaseName.toLowerCase()) {
+ return cb(null, { srcStat, destStat, isChangingCase: true })
+ }
+ return cb(new Error('Source and destination must not be the same.'))
+ }
+ if (srcStat.isDirectory() && !destStat.isDirectory()) {
+ return cb(new Error(`Cannot overwrite non-directory '${dest}' with directory '${src}'.`))
+ }
+ if (!srcStat.isDirectory() && destStat.isDirectory()) {
+ return cb(new Error(`Cannot overwrite directory '${dest}' with non-directory '${src}'.`))
+ }
+ }
+
+ if (srcStat.isDirectory() && isSrcSubdir(src, dest)) {
+ return cb(new Error(errMsg(src, dest, funcName)))
+ }
+ return cb(null, { srcStat, destStat })
+ })
+}
+
+function checkPathsSync (src, dest, funcName, opts) {
+ const { srcStat, destStat } = getStatsSync(src, dest, opts)
+
+ if (destStat) {
+ if (areIdentical(srcStat, destStat)) {
+ const srcBaseName = path.basename(src)
+ const destBaseName = path.basename(dest)
+ if (funcName === 'move' &&
+ srcBaseName !== destBaseName &&
+ srcBaseName.toLowerCase() === destBaseName.toLowerCase()) {
+ return { srcStat, destStat, isChangingCase: true }
+ }
+ throw new Error('Source and destination must not be the same.')
+ }
+ if (srcStat.isDirectory() && !destStat.isDirectory()) {
+ throw new Error(`Cannot overwrite non-directory '${dest}' with directory '${src}'.`)
+ }
+ if (!srcStat.isDirectory() && destStat.isDirectory()) {
+ throw new Error(`Cannot overwrite directory '${dest}' with non-directory '${src}'.`)
+ }
+ }
+
+ if (srcStat.isDirectory() && isSrcSubdir(src, dest)) {
+ throw new Error(errMsg(src, dest, funcName))
+ }
+ return { srcStat, destStat }
+}
+
+// recursively check if dest parent is a subdirectory of src.
+// It works for all file types including symlinks since it
+// checks the src and dest inodes. It starts from the deepest
+// parent and stops once it reaches the src parent or the root path.
+function checkParentPaths (src, srcStat, dest, funcName, cb) {
+ const srcParent = path.resolve(path.dirname(src))
+ const destParent = path.resolve(path.dirname(dest))
+ if (destParent === srcParent || destParent === path.parse(destParent).root) return cb()
+ fs.stat(destParent, { bigint: true }, (err, destStat) => {
+ if (err) {
+ if (err.code === 'ENOENT') return cb()
+ return cb(err)
+ }
+ if (areIdentical(srcStat, destStat)) {
+ return cb(new Error(errMsg(src, dest, funcName)))
+ }
+ return checkParentPaths(src, srcStat, destParent, funcName, cb)
+ })
+}
+
+function checkParentPathsSync (src, srcStat, dest, funcName) {
+ const srcParent = path.resolve(path.dirname(src))
+ const destParent = path.resolve(path.dirname(dest))
+ if (destParent === srcParent || destParent === path.parse(destParent).root) return
+ let destStat
+ try {
+ destStat = fs.statSync(destParent, { bigint: true })
+ } catch (err) {
+ if (err.code === 'ENOENT') return
+ throw err
+ }
+ if (areIdentical(srcStat, destStat)) {
+ throw new Error(errMsg(src, dest, funcName))
+ }
+ return checkParentPathsSync(src, srcStat, destParent, funcName)
+}
+
+function areIdentical (srcStat, destStat) {
+ return destStat.ino && destStat.dev && destStat.ino === srcStat.ino && destStat.dev === srcStat.dev
+}
+
+// return true if dest is a subdir of src, otherwise false.
+// It only checks the path strings.
+function isSrcSubdir (src, dest) {
+ const srcArr = path.resolve(src).split(path.sep).filter(i => i)
+ const destArr = path.resolve(dest).split(path.sep).filter(i => i)
+ return srcArr.reduce((acc, cur, i) => acc && destArr[i] === cur, true)
+}
+
+function errMsg (src, dest, funcName) {
+ return `Cannot ${funcName} '${src}' to a subdirectory of itself, '${dest}'.`
+}
+
+module.exports = {
+ checkPaths,
+ checkPathsSync,
+ checkParentPaths,
+ checkParentPathsSync,
+ isSrcSubdir,
+ areIdentical
+}
diff --git a/desktop/node_modules/@electron/osx-sign/node_modules/fs-extra/lib/util/utimes.js b/desktop/node_modules/@electron/osx-sign/node_modules/fs-extra/lib/util/utimes.js
new file mode 100644
index 0000000..75395de
--- /dev/null
+++ b/desktop/node_modules/@electron/osx-sign/node_modules/fs-extra/lib/util/utimes.js
@@ -0,0 +1,26 @@
+'use strict'
+
+const fs = require('graceful-fs')
+
+function utimesMillis (path, atime, mtime, callback) {
+ // if (!HAS_MILLIS_RES) return fs.utimes(path, atime, mtime, callback)
+ fs.open(path, 'r+', (err, fd) => {
+ if (err) return callback(err)
+ fs.futimes(fd, atime, mtime, futimesErr => {
+ fs.close(fd, closeErr => {
+ if (callback) callback(futimesErr || closeErr)
+ })
+ })
+ })
+}
+
+function utimesMillisSync (path, atime, mtime) {
+ const fd = fs.openSync(path, 'r+')
+ fs.futimesSync(fd, atime, mtime)
+ return fs.closeSync(fd)
+}
+
+module.exports = {
+ utimesMillis,
+ utimesMillisSync
+}
diff --git a/desktop/node_modules/@electron/osx-sign/node_modules/fs-extra/package.json b/desktop/node_modules/@electron/osx-sign/node_modules/fs-extra/package.json
new file mode 100644
index 0000000..059000e
--- /dev/null
+++ b/desktop/node_modules/@electron/osx-sign/node_modules/fs-extra/package.json
@@ -0,0 +1,67 @@
+{
+ "name": "fs-extra",
+ "version": "10.1.0",
+ "description": "fs-extra contains methods that aren't included in the vanilla Node.js fs package. Such as recursive mkdir, copy, and remove.",
+ "engines": {
+ "node": ">=12"
+ },
+ "homepage": "https://github.com/jprichardson/node-fs-extra",
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/jprichardson/node-fs-extra"
+ },
+ "keywords": [
+ "fs",
+ "file",
+ "file system",
+ "copy",
+ "directory",
+ "extra",
+ "mkdirp",
+ "mkdir",
+ "mkdirs",
+ "recursive",
+ "json",
+ "read",
+ "write",
+ "extra",
+ "delete",
+ "remove",
+ "touch",
+ "create",
+ "text",
+ "output",
+ "move",
+ "promise"
+ ],
+ "author": "JP Richardson <jprichardson@gmail.com>",
+ "license": "MIT",
+ "dependencies": {
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^6.0.1",
+ "universalify": "^2.0.0"
+ },
+ "devDependencies": {
+ "at-least-node": "^1.0.0",
+ "klaw": "^2.1.1",
+ "klaw-sync": "^3.0.2",
+ "minimist": "^1.1.1",
+ "mocha": "^5.0.5",
+ "nyc": "^15.0.0",
+ "proxyquire": "^2.0.1",
+ "read-dir-files": "^0.1.1",
+ "standard": "^16.0.3"
+ },
+ "main": "./lib/index.js",
+ "files": [
+ "lib/",
+ "!lib/**/__tests__/"
+ ],
+ "scripts": {
+ "lint": "standard",
+ "test-find": "find ./lib/**/__tests__ -name *.test.js | xargs mocha",
+ "test": "npm run lint && npm run unit",
+ "unit": "nyc node test.js"
+ },
+ "sideEffects": false
+}
diff --git a/desktop/node_modules/@electron/osx-sign/node_modules/jsonfile/CHANGELOG.md b/desktop/node_modules/@electron/osx-sign/node_modules/jsonfile/CHANGELOG.md
new file mode 100644
index 0000000..d772e43
--- /dev/null
+++ b/desktop/node_modules/@electron/osx-sign/node_modules/jsonfile/CHANGELOG.md
@@ -0,0 +1,171 @@
+6.1.0 / 2020-10-31
+------------------
+
+- Add `finalEOL` option to disable writing final EOL ([#115](https://github.com/jprichardson/node-jsonfile/issues/115), [#137](https://github.com/jprichardson/node-jsonfile/pull/137))
+- Update dependency ([#138](https://github.com/jprichardson/node-jsonfile/pull/138))
+
+6.0.1 / 2020-03-07
+------------------
+
+- Update dependency ([#130](https://github.com/jprichardson/node-jsonfile/pull/130))
+- Fix code style ([#129](https://github.com/jprichardson/node-jsonfile/pull/129))
+
+6.0.0 / 2020-02-24
+------------------
+
+- **BREAKING:** Drop support for Node 6 & 8 ([#128](https://github.com/jprichardson/node-jsonfile/pull/128))
+- **BREAKING:** Do not allow passing `null` as options to `readFile()` or `writeFile()` ([#128](https://github.com/jprichardson/node-jsonfile/pull/128))
+- Refactor internals ([#128](https://github.com/jprichardson/node-jsonfile/pull/128))
+
+5.0.0 / 2018-09-08
+------------------
+
+- **BREAKING:** Drop Node 4 support
+- **BREAKING:** If no callback is passed to an asynchronous method, a promise is now returned ([#109](https://github.com/jprichardson/node-jsonfile/pull/109))
+- Cleanup docs
+
+4.0.0 / 2017-07-12
+------------------
+
+- **BREAKING:** Remove global `spaces` option.
+- **BREAKING:** Drop support for Node 0.10, 0.12, and io.js.
+- Remove undocumented `passParsingErrors` option.
+- Added `EOL` override option to `writeFile` when using `spaces`. [#89]
+
+3.0.1 / 2017-07-05
+------------------
+
+- Fixed bug in `writeFile` when there was a serialization error & no callback was passed. In previous versions, an empty file would be written; now no file is written.
+
+3.0.0 / 2017-04-25
+------------------
+
+- Changed behavior of `throws` option for `readFileSync`; now does not throw filesystem errors when `throws` is `false`
+
+2.4.0 / 2016-09-15
+------------------
+### Changed
+- added optional support for `graceful-fs` [#62]
+
+2.3.1 / 2016-05-13
+------------------
+- fix to support BOM. [#45][#45]
+
+2.3.0 / 2016-04-16
+------------------
+- add `throws` to `readFile()`. See [#39][#39]
+- add support for any arbitrary `fs` module. Useful with [mock-fs](https://www.npmjs.com/package/mock-fs)
+
+2.2.3 / 2015-10-14
+------------------
+- include file name in parse error. See: https://github.com/jprichardson/node-jsonfile/pull/34
+
+2.2.2 / 2015-09-16
+------------------
+- split out tests into separate files
+- fixed `throws` when set to `true` in `readFileSync()`. See: https://github.com/jprichardson/node-jsonfile/pull/33
+
+2.2.1 / 2015-06-25
+------------------
+- fixed regression when passing in string as encoding for options in `writeFile()` and `writeFileSync()`. See: https://github.com/jprichardson/node-jsonfile/issues/28
+
+2.2.0 / 2015-06-25
+------------------
+- added `options.spaces` to `writeFile()` and `writeFileSync()`
+
+2.1.2 / 2015-06-22
+------------------
+- fixed if passed `readFileSync(file, 'utf8')`. See: https://github.com/jprichardson/node-jsonfile/issues/25
+
+2.1.1 / 2015-06-19
+------------------
+- fixed regressions if `null` is passed for options. See: https://github.com/jprichardson/node-jsonfile/issues/24
+
+2.1.0 / 2015-06-19
+------------------
+- cleanup: JavaScript Standard Style, rename files, dropped terst for assert
+- methods now support JSON revivers/replacers
+
+2.0.1 / 2015-05-24
+------------------
+- update license attribute https://github.com/jprichardson/node-jsonfile/pull/21
+
+2.0.0 / 2014-07-28
+------------------
+* added `\n` to end of file on write. [#14](https://github.com/jprichardson/node-jsonfile/pull/14)
+* added `options.throws` to `readFileSync()`
+* dropped support for Node v0.8
+
+1.2.0 / 2014-06-29
+------------------
+* removed semicolons
+* bugfix: passed `options` to `fs.readFile` and `fs.readFileSync`. This technically changes behavior, but
+changes it according to docs. [#12][#12]
+
+1.1.1 / 2013-11-11
+------------------
+* fixed catching of callback bug (ffissore / #5)
+
+1.1.0 / 2013-10-11
+------------------
+* added `options` param to methods, (seanodell / #4)
+
+1.0.1 / 2013-09-05
+------------------
+* removed `homepage` field from package.json to remove NPM warning
+
+1.0.0 / 2013-06-28
+------------------
+* added `.npmignore`, #1
+* changed spacing default from `4` to `2` to follow Node conventions
+
+0.0.1 / 2012-09-10
+------------------
+* Initial release.
+
+[#89]: https://github.com/jprichardson/node-jsonfile/pull/89
+[#45]: https://github.com/jprichardson/node-jsonfile/issues/45 "Reading of UTF8-encoded (w/ BOM) files fails"
+[#44]: https://github.com/jprichardson/node-jsonfile/issues/44 "Extra characters in written file"
+[#43]: https://github.com/jprichardson/node-jsonfile/issues/43 "Prettyfy json when written to file"
+[#42]: https://github.com/jprichardson/node-jsonfile/pull/42 "Moved fs.readFileSync within the try/catch"
+[#41]: https://github.com/jprichardson/node-jsonfile/issues/41 "Linux: Hidden file not working"
+[#40]: https://github.com/jprichardson/node-jsonfile/issues/40 "autocreate folder doesn't work from Path-value"
+[#39]: https://github.com/jprichardson/node-jsonfile/pull/39 "Add `throws` option for readFile (async)"
+[#38]: https://github.com/jprichardson/node-jsonfile/pull/38 "Update README.md writeFile[Sync] signature"
+[#37]: https://github.com/jprichardson/node-jsonfile/pull/37 "support append file"
+[#36]: https://github.com/jprichardson/node-jsonfile/pull/36 "Add typescript definition file."
+[#35]: https://github.com/jprichardson/node-jsonfile/pull/35 "Add typescript definition file."
+[#34]: https://github.com/jprichardson/node-jsonfile/pull/34 "readFile JSON parse error includes filename"
+[#33]: https://github.com/jprichardson/node-jsonfile/pull/33 "fix throw->throws typo in readFileSync()"
+[#32]: https://github.com/jprichardson/node-jsonfile/issues/32 "readFile & readFileSync can possible have strip-comments as an option?"
+[#31]: https://github.com/jprichardson/node-jsonfile/pull/31 "[Modify] Support string include is unicode escape string"
+[#30]: https://github.com/jprichardson/node-jsonfile/issues/30 "How to use Jsonfile package in Meteor.js App?"
+[#29]: https://github.com/jprichardson/node-jsonfile/issues/29 "writefile callback if no error?"
+[#28]: https://github.com/jprichardson/node-jsonfile/issues/28 "writeFile options argument broken "
+[#27]: https://github.com/jprichardson/node-jsonfile/pull/27 "Use svg instead of png to get better image quality"
+[#26]: https://github.com/jprichardson/node-jsonfile/issues/26 "Breaking change to fs-extra"
+[#25]: https://github.com/jprichardson/node-jsonfile/issues/25 "support string encoding param for read methods"
+[#24]: https://github.com/jprichardson/node-jsonfile/issues/24 "readFile: Passing in null options with a callback throws an error"
+[#23]: https://github.com/jprichardson/node-jsonfile/pull/23 "Add appendFile and appendFileSync"
+[#22]: https://github.com/jprichardson/node-jsonfile/issues/22 "Default value for spaces in readme.md is outdated"
+[#21]: https://github.com/jprichardson/node-jsonfile/pull/21 "Update license attribute"
+[#20]: https://github.com/jprichardson/node-jsonfile/issues/20 "Add simple caching functionallity"
+[#19]: https://github.com/jprichardson/node-jsonfile/pull/19 "Add appendFileSync method"
+[#18]: https://github.com/jprichardson/node-jsonfile/issues/18 "Add updateFile and updateFileSync methods"
+[#17]: https://github.com/jprichardson/node-jsonfile/issues/17 "seem read & write sync has sequentially problem"
+[#16]: https://github.com/jprichardson/node-jsonfile/pull/16 "export spaces defaulted to null"
+[#15]: https://github.com/jprichardson/node-jsonfile/issues/15 "`jsonfile.spaces` should default to `null`"
+[#14]: https://github.com/jprichardson/node-jsonfile/pull/14 "Add EOL at EOF"
+[#13]: https://github.com/jprichardson/node-jsonfile/issues/13 "Add a final newline"
+[#12]: https://github.com/jprichardson/node-jsonfile/issues/12 "readFile doesn't accept options"
+[#11]: https://github.com/jprichardson/node-jsonfile/pull/11 "Added try,catch to readFileSync"
+[#10]: https://github.com/jprichardson/node-jsonfile/issues/10 "No output or error from writeFile"
+[#9]: https://github.com/jprichardson/node-jsonfile/pull/9 "Change 'js' to 'jf' in example."
+[#8]: https://github.com/jprichardson/node-jsonfile/pull/8 "Updated forgotten module.exports to me."
+[#7]: https://github.com/jprichardson/node-jsonfile/pull/7 "Add file name in error message"
+[#6]: https://github.com/jprichardson/node-jsonfile/pull/6 "Use graceful-fs when possible"
+[#5]: https://github.com/jprichardson/node-jsonfile/pull/5 "Jsonfile doesn't behave nicely when used inside a test suite."
+[#4]: https://github.com/jprichardson/node-jsonfile/pull/4 "Added options parameter to writeFile and writeFileSync"
+[#3]: https://github.com/jprichardson/node-jsonfile/issues/3 "test2"
+[#2]: https://github.com/jprichardson/node-jsonfile/issues/2 "homepage field must be a string url. Deleted."
+[#1]: https://github.com/jprichardson/node-jsonfile/pull/1 "adding an `.npmignore` file"
diff --git a/desktop/node_modules/@electron/osx-sign/node_modules/jsonfile/LICENSE b/desktop/node_modules/@electron/osx-sign/node_modules/jsonfile/LICENSE
new file mode 100644
index 0000000..cb7e807
--- /dev/null
+++ b/desktop/node_modules/@electron/osx-sign/node_modules/jsonfile/LICENSE
@@ -0,0 +1,15 @@
+(The MIT License)
+
+Copyright (c) 2012-2015, JP Richardson <jprichardson@gmail.com>
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files
+(the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify,
+ merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
+ furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS
+OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/desktop/node_modules/@electron/osx-sign/node_modules/jsonfile/README.md b/desktop/node_modules/@electron/osx-sign/node_modules/jsonfile/README.md
new file mode 100644
index 0000000..910cde0
--- /dev/null
+++ b/desktop/node_modules/@electron/osx-sign/node_modules/jsonfile/README.md
@@ -0,0 +1,230 @@
+Node.js - jsonfile
+================
+
+Easily read/write JSON files in Node.js. _Note: this module cannot be used in the browser._
+
+[![npm Package](https://img.shields.io/npm/v/jsonfile.svg?style=flat-square)](https://www.npmjs.org/package/jsonfile)
+[![build status](https://secure.travis-ci.org/jprichardson/node-jsonfile.svg)](http://travis-ci.org/jprichardson/node-jsonfile)
+[![windows Build status](https://img.shields.io/appveyor/ci/jprichardson/node-jsonfile/master.svg?label=windows%20build)](https://ci.appveyor.com/project/jprichardson/node-jsonfile/branch/master)
+
+<a href="https://github.com/feross/standard"><img src="https://cdn.rawgit.com/feross/standard/master/sticker.svg" alt="Standard JavaScript" width="100"></a>
+
+Why?
+----
+
+Writing `JSON.stringify()` and then `fs.writeFile()` and `JSON.parse()` with `fs.readFile()` enclosed in `try/catch` blocks became annoying.
+
+
+
+Installation
+------------
+
+ npm install --save jsonfile
+
+
+
+API
+---
+
+* [`readFile(filename, [options], callback)`](#readfilefilename-options-callback)
+* [`readFileSync(filename, [options])`](#readfilesyncfilename-options)
+* [`writeFile(filename, obj, [options], callback)`](#writefilefilename-obj-options-callback)
+* [`writeFileSync(filename, obj, [options])`](#writefilesyncfilename-obj-options)
+
+----
+
+### readFile(filename, [options], callback)
+
+`options` (`object`, default `undefined`): Pass in any [`fs.readFile`](https://nodejs.org/api/fs.html#fs_fs_readfile_path_options_callback) options or set `reviver` for a [JSON reviver](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/parse).
+ - `throws` (`boolean`, default: `true`). If `JSON.parse` throws an error, pass this error to the callback.
+ If `false`, returns `null` for the object.
+
+
+```js
+const jsonfile = require('jsonfile')
+const file = '/tmp/data.json'
+jsonfile.readFile(file, function (err, obj) {
+ if (err) console.error(err)
+ console.dir(obj)
+})
+```
+
+You can also use this method with promises. The `readFile` method will return a promise if you do not pass a callback function.
+
+```js
+const jsonfile = require('jsonfile')
+const file = '/tmp/data.json'
+jsonfile.readFile(file)
+ .then(obj => console.dir(obj))
+ .catch(error => console.error(error))
+```
+
+----
+
+### readFileSync(filename, [options])
+
+`options` (`object`, default `undefined`): Pass in any [`fs.readFileSync`](https://nodejs.org/api/fs.html#fs_fs_readfilesync_path_options) options or set `reviver` for a [JSON reviver](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/parse).
+- `throws` (`boolean`, default: `true`). If an error is encountered reading or parsing the file, throw the error. If `false`, returns `null` for the object.
+
+```js
+const jsonfile = require('jsonfile')
+const file = '/tmp/data.json'
+
+console.dir(jsonfile.readFileSync(file))
+```
+
+----
+
+### writeFile(filename, obj, [options], callback)
+
+`options`: Pass in any [`fs.writeFile`](https://nodejs.org/api/fs.html#fs_fs_writefile_file_data_options_callback) options or set `replacer` for a [JSON replacer](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify). Can also pass in `spaces`, or override `EOL` string or set `finalEOL` flag as `false` to not save the file with `EOL` at the end.
+
+
+```js
+const jsonfile = require('jsonfile')
+
+const file = '/tmp/data.json'
+const obj = { name: 'JP' }
+
+jsonfile.writeFile(file, obj, function (err) {
+ if (err) console.error(err)
+})
+```
+Or use with promises as follows:
+
+```js
+const jsonfile = require('jsonfile')
+
+const file = '/tmp/data.json'
+const obj = { name: 'JP' }
+
+jsonfile.writeFile(file, obj)
+ .then(res => {
+ console.log('Write complete')
+ })
+ .catch(error => console.error(error))
+```
+
+
+**formatting with spaces:**
+
+```js
+const jsonfile = require('jsonfile')
+
+const file = '/tmp/data.json'
+const obj = { name: 'JP' }
+
+jsonfile.writeFile(file, obj, { spaces: 2 }, function (err) {
+ if (err) console.error(err)
+})
+```
+
+**overriding EOL:**
+
+```js
+const jsonfile = require('jsonfile')
+
+const file = '/tmp/data.json'
+const obj = { name: 'JP' }
+
+jsonfile.writeFile(file, obj, { spaces: 2, EOL: '\r\n' }, function (err) {
+ if (err) console.error(err)
+})
+```
+
+
+**disabling the EOL at the end of file:**
+
+```js
+const jsonfile = require('jsonfile')
+
+const file = '/tmp/data.json'
+const obj = { name: 'JP' }
+
+jsonfile.writeFile(file, obj, { spaces: 2, finalEOL: false }, function (err) {
+ if (err) console.log(err)
+})
+```
+
+**appending to an existing JSON file:**
+
+You can use `fs.writeFile` option `{ flag: 'a' }` to achieve this.
+
+```js
+const jsonfile = require('jsonfile')
+
+const file = '/tmp/mayAlreadyExistedData.json'
+const obj = { name: 'JP' }
+
+jsonfile.writeFile(file, obj, { flag: 'a' }, function (err) {
+ if (err) console.error(err)
+})
+```
+
+----
+
+### writeFileSync(filename, obj, [options])
+
+`options`: Pass in any [`fs.writeFileSync`](https://nodejs.org/api/fs.html#fs_fs_writefilesync_file_data_options) options or set `replacer` for a [JSON replacer](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify). Can also pass in `spaces`, or override `EOL` string or set `finalEOL` flag as `false` to not save the file with `EOL` at the end.
+
+```js
+const jsonfile = require('jsonfile')
+
+const file = '/tmp/data.json'
+const obj = { name: 'JP' }
+
+jsonfile.writeFileSync(file, obj)
+```
+
+**formatting with spaces:**
+
+```js
+const jsonfile = require('jsonfile')
+
+const file = '/tmp/data.json'
+const obj = { name: 'JP' }
+
+jsonfile.writeFileSync(file, obj, { spaces: 2 })
+```
+
+**overriding EOL:**
+
+```js
+const jsonfile = require('jsonfile')
+
+const file = '/tmp/data.json'
+const obj = { name: 'JP' }
+
+jsonfile.writeFileSync(file, obj, { spaces: 2, EOL: '\r\n' })
+```
+
+**disabling the EOL at the end of file:**
+
+```js
+const jsonfile = require('jsonfile')
+
+const file = '/tmp/data.json'
+const obj = { name: 'JP' }
+
+jsonfile.writeFileSync(file, obj, { spaces: 2, finalEOL: false })
+```
+
+**appending to an existing JSON file:**
+
+You can use `fs.writeFileSync` option `{ flag: 'a' }` to achieve this.
+
+```js
+const jsonfile = require('jsonfile')
+
+const file = '/tmp/mayAlreadyExistedData.json'
+const obj = { name: 'JP' }
+
+jsonfile.writeFileSync(file, obj, { flag: 'a' })
+```
+
+License
+-------
+
+(MIT License)
+
+Copyright 2012-2016, JP Richardson <jprichardson@gmail.com>
diff --git a/desktop/node_modules/@electron/osx-sign/node_modules/jsonfile/index.js b/desktop/node_modules/@electron/osx-sign/node_modules/jsonfile/index.js
new file mode 100644
index 0000000..0582868
--- /dev/null
+++ b/desktop/node_modules/@electron/osx-sign/node_modules/jsonfile/index.js
@@ -0,0 +1,88 @@
+let _fs
+try {
+ _fs = require('graceful-fs')
+} catch (_) {
+ _fs = require('fs')
+}
+const universalify = require('universalify')
+const { stringify, stripBom } = require('./utils')
+
+async function _readFile (file, options = {}) {
+ if (typeof options === 'string') {
+ options = { encoding: options }
+ }
+
+ const fs = options.fs || _fs
+
+ const shouldThrow = 'throws' in options ? options.throws : true
+
+ let data = await universalify.fromCallback(fs.readFile)(file, options)
+
+ data = stripBom(data)
+
+ let obj
+ try {
+ obj = JSON.parse(data, options ? options.reviver : null)
+ } catch (err) {
+ if (shouldThrow) {
+ err.message = `${file}: ${err.message}`
+ throw err
+ } else {
+ return null
+ }
+ }
+
+ return obj
+}
+
+const readFile = universalify.fromPromise(_readFile)
+
+function readFileSync (file, options = {}) {
+ if (typeof options === 'string') {
+ options = { encoding: options }
+ }
+
+ const fs = options.fs || _fs
+
+ const shouldThrow = 'throws' in options ? options.throws : true
+
+ try {
+ let content = fs.readFileSync(file, options)
+ content = stripBom(content)
+ return JSON.parse(content, options.reviver)
+ } catch (err) {
+ if (shouldThrow) {
+ err.message = `${file}: ${err.message}`
+ throw err
+ } else {
+ return null
+ }
+ }
+}
+
+async function _writeFile (file, obj, options = {}) {
+ const fs = options.fs || _fs
+
+ const str = stringify(obj, options)
+
+ await universalify.fromCallback(fs.writeFile)(file, str, options)
+}
+
+const writeFile = universalify.fromPromise(_writeFile)
+
+function writeFileSync (file, obj, options = {}) {
+ const fs = options.fs || _fs
+
+ const str = stringify(obj, options)
+ // not sure if fs.writeFileSync returns anything, but just in case
+ return fs.writeFileSync(file, str, options)
+}
+
+const jsonfile = {
+ readFile,
+ readFileSync,
+ writeFile,
+ writeFileSync
+}
+
+module.exports = jsonfile
diff --git a/desktop/node_modules/@electron/osx-sign/node_modules/jsonfile/package.json b/desktop/node_modules/@electron/osx-sign/node_modules/jsonfile/package.json
new file mode 100644
index 0000000..4d01eb1
--- /dev/null
+++ b/desktop/node_modules/@electron/osx-sign/node_modules/jsonfile/package.json
@@ -0,0 +1,40 @@
+{
+ "name": "jsonfile",
+ "version": "6.1.0",
+ "description": "Easily read/write JSON files.",
+ "repository": {
+ "type": "git",
+ "url": "git@github.com:jprichardson/node-jsonfile.git"
+ },
+ "keywords": [
+ "read",
+ "write",
+ "file",
+ "json",
+ "fs",
+ "fs-extra"
+ ],
+ "author": "JP Richardson <jprichardson@gmail.com>",
+ "license": "MIT",
+ "dependencies": {
+ "universalify": "^2.0.0"
+ },
+ "optionalDependencies": {
+ "graceful-fs": "^4.1.6"
+ },
+ "devDependencies": {
+ "mocha": "^8.2.0",
+ "rimraf": "^2.4.0",
+ "standard": "^16.0.1"
+ },
+ "main": "index.js",
+ "files": [
+ "index.js",
+ "utils.js"
+ ],
+ "scripts": {
+ "lint": "standard",
+ "test": "npm run lint && npm run unit",
+ "unit": "mocha"
+ }
+}
diff --git a/desktop/node_modules/@electron/osx-sign/node_modules/jsonfile/utils.js b/desktop/node_modules/@electron/osx-sign/node_modules/jsonfile/utils.js
new file mode 100644
index 0000000..b5ff48e
--- /dev/null
+++ b/desktop/node_modules/@electron/osx-sign/node_modules/jsonfile/utils.js
@@ -0,0 +1,14 @@
+function stringify (obj, { EOL = '\n', finalEOL = true, replacer = null, spaces } = {}) {
+ const EOF = finalEOL ? EOL : ''
+ const str = JSON.stringify(obj, replacer, spaces)
+
+ return str.replace(/\n/g, EOL) + EOF
+}
+
+function stripBom (content) {
+ // we do this because JSON.parse would convert it to a utf8 string if encoding wasn't specified
+ if (Buffer.isBuffer(content)) content = content.toString('utf8')
+ return content.replace(/^\uFEFF/, '')
+}
+
+module.exports = { stringify, stripBom }
diff --git a/desktop/node_modules/@electron/osx-sign/node_modules/universalify/LICENSE b/desktop/node_modules/@electron/osx-sign/node_modules/universalify/LICENSE
new file mode 100644
index 0000000..514e84e
--- /dev/null
+++ b/desktop/node_modules/@electron/osx-sign/node_modules/universalify/LICENSE
@@ -0,0 +1,20 @@
+(The MIT License)
+
+Copyright (c) 2017, Ryan Zimmerman <opensrc@ryanzim.com>
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the 'Software'), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software is furnished to do so,
+subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/desktop/node_modules/@electron/osx-sign/node_modules/universalify/README.md b/desktop/node_modules/@electron/osx-sign/node_modules/universalify/README.md
new file mode 100644
index 0000000..aa12474
--- /dev/null
+++ b/desktop/node_modules/@electron/osx-sign/node_modules/universalify/README.md
@@ -0,0 +1,76 @@
+# universalify
+
+[![Travis branch](https://img.shields.io/travis/RyanZim/universalify/master.svg)](https://travis-ci.org/RyanZim/universalify)
+![Coveralls github branch](https://img.shields.io/coveralls/github/RyanZim/universalify/master.svg)
+![npm](https://img.shields.io/npm/dm/universalify.svg)
+![npm](https://img.shields.io/npm/l/universalify.svg)
+
+Make a callback- or promise-based function support both promises and callbacks.
+
+Uses the native promise implementation.
+
+## Installation
+
+```bash
+npm install universalify
+```
+
+## API
+
+### `universalify.fromCallback(fn)`
+
+Takes a callback-based function to universalify, and returns the universalified function.
+
+Function must take a callback as the last parameter that will be called with the signature `(error, result)`. `universalify` does not support calling the callback with three or more arguments, and does not ensure that the callback is only called once.
+
+```js
+function callbackFn (n, cb) {
+ setTimeout(() => cb(null, n), 15)
+}
+
+const fn = universalify.fromCallback(callbackFn)
+
+// Works with Promises:
+fn('Hello World!')
+.then(result => console.log(result)) // -> Hello World!
+.catch(error => console.error(error))
+
+// Works with Callbacks:
+fn('Hi!', (error, result) => {
+ if (error) return console.error(error)
+ console.log(result)
+ // -> Hi!
+})
+```
+
+### `universalify.fromPromise(fn)`
+
+Takes a promise-based function to universalify, and returns the universalified function.
+
+Function must return a valid JS promise. `universalify` does not ensure that a valid promise is returned.
+
+```js
+function promiseFn (n) {
+ return new Promise(resolve => {
+ setTimeout(() => resolve(n), 15)
+ })
+}
+
+const fn = universalify.fromPromise(promiseFn)
+
+// Works with Promises:
+fn('Hello World!')
+.then(result => console.log(result)) // -> Hello World!
+.catch(error => console.error(error))
+
+// Works with Callbacks:
+fn('Hi!', (error, result) => {
+ if (error) return console.error(error)
+ console.log(result)
+ // -> Hi!
+})
+```
+
+## License
+
+MIT
diff --git a/desktop/node_modules/@electron/osx-sign/node_modules/universalify/index.js b/desktop/node_modules/@electron/osx-sign/node_modules/universalify/index.js
new file mode 100644
index 0000000..ba6c662
--- /dev/null
+++ b/desktop/node_modules/@electron/osx-sign/node_modules/universalify/index.js
@@ -0,0 +1,24 @@
+'use strict'
+
+exports.fromCallback = function (fn) {
+ return Object.defineProperty(function (...args) {
+ if (typeof args[args.length - 1] === 'function') fn.apply(this, args)
+ else {
+ return new Promise((resolve, reject) => {
+ fn.call(
+ this,
+ ...args,
+ (err, res) => (err != null) ? reject(err) : resolve(res)
+ )
+ })
+ }
+ }, 'name', { value: fn.name })
+}
+
+exports.fromPromise = function (fn) {
+ return Object.defineProperty(function (...args) {
+ const cb = args[args.length - 1]
+ if (typeof cb !== 'function') return fn.apply(this, args)
+ else fn.apply(this, args.slice(0, -1)).then(r => cb(null, r), cb)
+ }, 'name', { value: fn.name })
+}
diff --git a/desktop/node_modules/@electron/osx-sign/node_modules/universalify/package.json b/desktop/node_modules/@electron/osx-sign/node_modules/universalify/package.json
new file mode 100644
index 0000000..006d4cc
--- /dev/null
+++ b/desktop/node_modules/@electron/osx-sign/node_modules/universalify/package.json
@@ -0,0 +1,34 @@
+{
+ "name": "universalify",
+ "version": "2.0.0",
+ "description": "Make a callback- or promise-based function support both promises and callbacks.",
+ "keywords": [
+ "callback",
+ "native",
+ "promise"
+ ],
+ "homepage": "https://github.com/RyanZim/universalify#readme",
+ "bugs": "https://github.com/RyanZim/universalify/issues",
+ "license": "MIT",
+ "author": "Ryan Zimmerman <opensrc@ryanzim.com>",
+ "files": [
+ "index.js"
+ ],
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/RyanZim/universalify.git"
+ },
+ "scripts": {
+ "test": "standard && nyc tape test/*.js | colortape"
+ },
+ "devDependencies": {
+ "colortape": "^0.1.2",
+ "coveralls": "^3.0.1",
+ "nyc": "^15.0.0",
+ "standard": "^14.3.1",
+ "tape": "^5.0.1"
+ },
+ "engines": {
+ "node": ">= 10.0.0"
+ }
+}
diff --git a/desktop/node_modules/@electron/osx-sign/package.json b/desktop/node_modules/@electron/osx-sign/package.json
new file mode 100644
index 0000000..c7e4d44
--- /dev/null
+++ b/desktop/node_modules/@electron/osx-sign/package.json
@@ -0,0 +1,76 @@
+{
+ "name": "@electron/osx-sign",
+ "version": "1.0.5",
+ "description": "Codesign Electron macOS apps",
+ "main": "dist/cjs/index.js",
+ "module": "dist/esm/index.js",
+ "files": [
+ "dist",
+ "entitlements",
+ "README.md",
+ "LICENSE",
+ "bin"
+ ],
+ "bin": {
+ "electron-osx-flat": "bin/electron-osx-flat.js",
+ "electron-osx-sign": "bin/electron-osx-sign.js"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/electron/osx-sign.git"
+ },
+ "author": "electron",
+ "license": "BSD-2-Clause",
+ "bugs": {
+ "url": "https://github.com/electron/osx-sign/issues"
+ },
+ "homepage": "https://github.com/electron/osx-sign",
+ "dependencies": {
+ "compare-version": "^0.1.2",
+ "debug": "^4.3.4",
+ "fs-extra": "^10.0.0",
+ "isbinaryfile": "^4.0.8",
+ "minimist": "^1.2.6",
+ "plist": "^3.0.5"
+ },
+ "devDependencies": {
+ "@continuous-auth/semantic-release-npm": "^3.0.0",
+ "@electron/get": "^2.0.2",
+ "@types/compare-version": "^0.1.31",
+ "@types/debug": "^4.1.7",
+ "@types/fs-extra": "^9.0.13",
+ "@types/node": "^16.11.6",
+ "@types/plist": "^3.0.2",
+ "@typescript-eslint/eslint-plugin": "^5.45.0",
+ "@typescript-eslint/parser": "^5.45.0",
+ "eslint": "^8.29.0",
+ "eslint-config-eslint": "^7.0.0",
+ "eslint-config-standard": "^17.0.0",
+ "eslint-plugin-import": "^2.26.0",
+ "eslint-plugin-node": "^11.1.0",
+ "eslint-plugin-promise": "^6.1.1",
+ "extract-zip": "^2.0.1",
+ "mkdirp": "^1.0.4",
+ "rimraf": "^3.0.2",
+ "run-series": "^1.1.9",
+ "run-waterfall": "^1.1.7",
+ "standard": "^17.0.0",
+ "tape": "^4.7.1",
+ "typescript": "^4.9.3"
+ },
+ "scripts": {
+ "build": "tsc && tsc -p tsconfig.esm.json",
+ "lint": "eslint --ext .ts,.js src bin test",
+ "pretest": "rimraf test/work",
+ "test": "yarn lint && tape test",
+ "prepublishOnly": "yarn build"
+ },
+ "standard": {
+ "ignore": [
+ "test/work"
+ ]
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ }
+}
diff --git a/desktop/node_modules/@electron/universal/LICENSE b/desktop/node_modules/@electron/universal/LICENSE
new file mode 100644
index 0000000..dc1402e
--- /dev/null
+++ b/desktop/node_modules/@electron/universal/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) Contributors to the Electron project
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/desktop/node_modules/@electron/universal/README.md b/desktop/node_modules/@electron/universal/README.md
new file mode 100644
index 0000000..ee40e57
--- /dev/null
+++ b/desktop/node_modules/@electron/universal/README.md
@@ -0,0 +1,37 @@
+# @electron/universal
+
+> Create universal macOS Electron applications
+
+[![CircleCI](https://circleci.com/gh/electron/universal/tree/main.svg?style=shield)](https://circleci.com/gh/electron/universal)
+[![NPM package](https://img.shields.io/npm/v/@electron/universal)](https://npm.im/@electron/universal)
+
+
+## Usage
+
+```typescript
+import { makeUniversalApp } from '@electron/universal';
+
+await makeUniversalApp({
+ x64AppPath: 'path/to/App_x64.app',
+ arm64AppPath: 'path/to/App_arm64.app',
+ outAppPath: 'path/to/App_universal.app',
+});
+```
+
+## FAQ
+
+#### The app is twice as big now, why?
+
+Well, a Universal app isn't anything magical. It is literally the x64 app and
+the arm64 app glued together into a single application. It's twice as big
+because it contains two apps in one.
+
+#### What about native modules?
+
+The way `@electron/universal` works today means you don't need to worry about
+things like building universal versions of your native modules. As long as
+your x64 and arm64 apps work in isolation the Universal app will work as well.
+
+#### How do I build my app for Apple silicon in the first place?
+
+Check out the [Electron Apple silicon blog post](https://www.electronjs.org/blog/apple-silicon)
diff --git a/desktop/node_modules/@electron/universal/dist/cjs/asar-utils.d.ts b/desktop/node_modules/@electron/universal/dist/cjs/asar-utils.d.ts
new file mode 100644
index 0000000..530b52b
--- /dev/null
+++ b/desktop/node_modules/@electron/universal/dist/cjs/asar-utils.d.ts
@@ -0,0 +1,16 @@
+export declare enum AsarMode {
+ NO_ASAR = 0,
+ HAS_ASAR = 1
+}
+export declare type MergeASARsOptions = {
+ x64AsarPath: string;
+ arm64AsarPath: string;
+ outputAsarPath: string;
+ singleArchFiles?: string;
+};
+export declare const detectAsarMode: (appPath: string) => Promise<AsarMode>;
+export declare const generateAsarIntegrity: (asarPath: string) => {
+ algorithm: "SHA256";
+ hash: string;
+};
+export declare const mergeASARs: ({ x64AsarPath, arm64AsarPath, outputAsarPath, singleArchFiles, }: MergeASARsOptions) => Promise<void>;
diff --git a/desktop/node_modules/@electron/universal/dist/cjs/asar-utils.js b/desktop/node_modules/@electron/universal/dist/cjs/asar-utils.js
new file mode 100644
index 0000000..6752288
--- /dev/null
+++ b/desktop/node_modules/@electron/universal/dist/cjs/asar-utils.js
@@ -0,0 +1,172 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.mergeASARs = exports.generateAsarIntegrity = exports.detectAsarMode = exports.AsarMode = void 0;
+const asar = require("@electron/asar");
+const child_process_1 = require("child_process");
+const crypto = require("crypto");
+const fs = require("fs-extra");
+const path = require("path");
+const minimatch = require("minimatch");
+const os = require("os");
+const debug_1 = require("./debug");
+const LIPO = 'lipo';
+var AsarMode;
+(function (AsarMode) {
+ AsarMode[AsarMode["NO_ASAR"] = 0] = "NO_ASAR";
+ AsarMode[AsarMode["HAS_ASAR"] = 1] = "HAS_ASAR";
+})(AsarMode = exports.AsarMode || (exports.AsarMode = {}));
+// See: https://github.com/apple-opensource-mirror/llvmCore/blob/0c60489d96c87140db9a6a14c6e82b15f5e5d252/include/llvm/Object/MachOFormat.h#L108-L112
+const MACHO_MAGIC = new Set([
+ // 32-bit Mach-O
+ 0xfeedface,
+ 0xcefaedfe,
+ // 64-bit Mach-O
+ 0xfeedfacf,
+ 0xcffaedfe,
+]);
+const MACHO_UNIVERSAL_MAGIC = new Set([
+ // universal
+ 0xcafebabe,
+ 0xbebafeca,
+]);
+exports.detectAsarMode = async (appPath) => {
+ debug_1.d('checking asar mode of', appPath);
+ const asarPath = path.resolve(appPath, 'Contents', 'Resources', 'app.asar');
+ if (!(await fs.pathExists(asarPath))) {
+ debug_1.d('determined no asar');
+ return AsarMode.NO_ASAR;
+ }
+ debug_1.d('determined has asar');
+ return AsarMode.HAS_ASAR;
+};
+exports.generateAsarIntegrity = (asarPath) => {
+ return {
+ algorithm: 'SHA256',
+ hash: crypto
+ .createHash('SHA256')
+ .update(asar.getRawHeader(asarPath).headerString)
+ .digest('hex'),
+ };
+};
+function toRelativePath(file) {
+ return file.replace(/^\//, '');
+}
+function isDirectory(a, file) {
+ return Boolean('files' in asar.statFile(a, file));
+}
+function checkSingleArch(archive, file, allowList) {
+ if (allowList === undefined || !minimatch(file, allowList, { matchBase: true })) {
+ throw new Error(`Detected unique file "${file}" in "${archive}" not covered by ` +
+ `allowList rule: "${allowList}"`);
+ }
+}
+exports.mergeASARs = async ({ x64AsarPath, arm64AsarPath, outputAsarPath, singleArchFiles, }) => {
+ debug_1.d(`merging ${x64AsarPath} and ${arm64AsarPath}`);
+ const x64Files = new Set(asar.listPackage(x64AsarPath).map(toRelativePath));
+ const arm64Files = new Set(asar.listPackage(arm64AsarPath).map(toRelativePath));
+ //
+ // Build set of unpacked directories and files
+ //
+ const unpackedFiles = new Set();
+ function buildUnpacked(a, fileList) {
+ for (const file of fileList) {
+ const stat = asar.statFile(a, file);
+ if (!('unpacked' in stat) || !stat.unpacked) {
+ continue;
+ }
+ if ('files' in stat) {
+ continue;
+ }
+ unpackedFiles.add(file);
+ }
+ }
+ buildUnpacked(x64AsarPath, x64Files);
+ buildUnpacked(arm64AsarPath, arm64Files);
+ //
+ // Build list of files/directories unique to each asar
+ //
+ for (const file of x64Files) {
+ if (!arm64Files.has(file)) {
+ checkSingleArch(x64AsarPath, file, singleArchFiles);
+ }
+ }
+ const arm64Unique = [];
+ for (const file of arm64Files) {
+ if (!x64Files.has(file)) {
+ checkSingleArch(arm64AsarPath, file, singleArchFiles);
+ arm64Unique.push(file);
+ }
+ }
+ //
+ // Find common bindings with different content
+ //
+ const commonBindings = [];
+ for (const file of x64Files) {
+ if (!arm64Files.has(file)) {
+ continue;
+ }
+ // Skip directories
+ if (isDirectory(x64AsarPath, file)) {
+ continue;
+ }
+ const x64Content = asar.extractFile(x64AsarPath, file);
+ const arm64Content = asar.extractFile(arm64AsarPath, file);
+ if (x64Content.compare(arm64Content) === 0) {
+ continue;
+ }
+ if (MACHO_UNIVERSAL_MAGIC.has(x64Content.readUInt32LE(0)) &&
+ MACHO_UNIVERSAL_MAGIC.has(arm64Content.readUInt32LE(0))) {
+ continue;
+ }
+ if (!MACHO_MAGIC.has(x64Content.readUInt32LE(0))) {
+ throw new Error(`Can't reconcile two non-macho files ${file}`);
+ }
+ commonBindings.push(file);
+ }
+ //
+ // Extract both
+ //
+ const x64Dir = await fs.mkdtemp(path.join(os.tmpdir(), 'x64-'));
+ const arm64Dir = await fs.mkdtemp(path.join(os.tmpdir(), 'arm64-'));
+ try {
+ debug_1.d(`extracting ${x64AsarPath} to ${x64Dir}`);
+ asar.extractAll(x64AsarPath, x64Dir);
+ debug_1.d(`extracting ${arm64AsarPath} to ${arm64Dir}`);
+ asar.extractAll(arm64AsarPath, arm64Dir);
+ for (const file of arm64Unique) {
+ const source = path.resolve(arm64Dir, file);
+ const destination = path.resolve(x64Dir, file);
+ if (isDirectory(arm64AsarPath, file)) {
+ debug_1.d(`creating unique directory: ${file}`);
+ await fs.mkdirp(destination);
+ continue;
+ }
+ debug_1.d(`xopying unique file: ${file}`);
+ await fs.mkdirp(path.dirname(destination));
+ await fs.copy(source, destination);
+ }
+ for (const binding of commonBindings) {
+ const source = await fs.realpath(path.resolve(arm64Dir, binding));
+ const destination = await fs.realpath(path.resolve(x64Dir, binding));
+ debug_1.d(`merging binding: ${binding}`);
+ child_process_1.execFileSync(LIPO, [source, destination, '-create', '-output', destination]);
+ }
+ debug_1.d(`creating archive at ${outputAsarPath}`);
+ const resolvedUnpack = Array.from(unpackedFiles).map((file) => path.join(x64Dir, file));
+ let unpack;
+ if (resolvedUnpack.length > 1) {
+ unpack = `{${resolvedUnpack.join(',')}}`;
+ }
+ else if (resolvedUnpack.length === 1) {
+ unpack = resolvedUnpack[0];
+ }
+ await asar.createPackageWithOptions(x64Dir, outputAsarPath, {
+ unpack,
+ });
+ debug_1.d('done merging');
+ }
+ finally {
+ await Promise.all([fs.remove(x64Dir), fs.remove(arm64Dir)]);
+ }
+};
+//# sourceMappingURL=asar-utils.js.map \ No newline at end of file
diff --git a/desktop/node_modules/@electron/universal/dist/cjs/asar-utils.js.map b/desktop/node_modules/@electron/universal/dist/cjs/asar-utils.js.map
new file mode 100644
index 0000000..c6b89fd
--- /dev/null
+++ b/desktop/node_modules/@electron/universal/dist/cjs/asar-utils.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"asar-utils.js","sourceRoot":"","sources":["../../src/asar-utils.ts"],"names":[],"mappings":"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"} \ No newline at end of file
diff --git a/desktop/node_modules/@electron/universal/dist/cjs/debug.d.ts b/desktop/node_modules/@electron/universal/dist/cjs/debug.d.ts
new file mode 100644
index 0000000..ec24d3b
--- /dev/null
+++ b/desktop/node_modules/@electron/universal/dist/cjs/debug.d.ts
@@ -0,0 +1,2 @@
+import * as debug from 'debug';
+export declare const d: debug.Debugger;
diff --git a/desktop/node_modules/@electron/universal/dist/cjs/debug.js b/desktop/node_modules/@electron/universal/dist/cjs/debug.js
new file mode 100644
index 0000000..f3fccb1
--- /dev/null
+++ b/desktop/node_modules/@electron/universal/dist/cjs/debug.js
@@ -0,0 +1,6 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.d = void 0;
+const debug = require("debug");
+exports.d = debug('electron-universal');
+//# sourceMappingURL=debug.js.map \ No newline at end of file
diff --git a/desktop/node_modules/@electron/universal/dist/cjs/debug.js.map b/desktop/node_modules/@electron/universal/dist/cjs/debug.js.map
new file mode 100644
index 0000000..8256675
--- /dev/null
+++ b/desktop/node_modules/@electron/universal/dist/cjs/debug.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"debug.js","sourceRoot":"","sources":["../../src/debug.ts"],"names":[],"mappings":";;;AAAA,+BAA+B;AAElB,QAAA,CAAC,GAAG,KAAK,CAAC,oBAAoB,CAAC,CAAC"} \ No newline at end of file
diff --git a/desktop/node_modules/@electron/universal/dist/cjs/file-utils.d.ts b/desktop/node_modules/@electron/universal/dist/cjs/file-utils.d.ts
new file mode 100644
index 0000000..ff08b0e
--- /dev/null
+++ b/desktop/node_modules/@electron/universal/dist/cjs/file-utils.d.ts
@@ -0,0 +1,16 @@
+export declare enum AppFileType {
+ MACHO = 0,
+ PLAIN = 1,
+ INFO_PLIST = 2,
+ SNAPSHOT = 3,
+ APP_CODE = 4
+}
+export declare type AppFile = {
+ relativePath: string;
+ type: AppFileType;
+};
+/**
+ *
+ * @param appPath Path to the application
+ */
+export declare const getAllAppFiles: (appPath: string) => Promise<AppFile[]>;
diff --git a/desktop/node_modules/@electron/universal/dist/cjs/file-utils.js b/desktop/node_modules/@electron/universal/dist/cjs/file-utils.js
new file mode 100644
index 0000000..bed089e
--- /dev/null
+++ b/desktop/node_modules/@electron/universal/dist/cjs/file-utils.js
@@ -0,0 +1,71 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.getAllAppFiles = exports.AppFileType = void 0;
+const cross_spawn_promise_1 = require("@malept/cross-spawn-promise");
+const fs = require("fs-extra");
+const path = require("path");
+const MACHO_PREFIX = 'Mach-O ';
+var AppFileType;
+(function (AppFileType) {
+ AppFileType[AppFileType["MACHO"] = 0] = "MACHO";
+ AppFileType[AppFileType["PLAIN"] = 1] = "PLAIN";
+ AppFileType[AppFileType["INFO_PLIST"] = 2] = "INFO_PLIST";
+ AppFileType[AppFileType["SNAPSHOT"] = 3] = "SNAPSHOT";
+ AppFileType[AppFileType["APP_CODE"] = 4] = "APP_CODE";
+})(AppFileType = exports.AppFileType || (exports.AppFileType = {}));
+/**
+ *
+ * @param appPath Path to the application
+ */
+exports.getAllAppFiles = async (appPath) => {
+ const files = [];
+ const visited = new Set();
+ const traverse = async (p) => {
+ p = await fs.realpath(p);
+ if (visited.has(p))
+ return;
+ visited.add(p);
+ const info = await fs.stat(p);
+ if (info.isSymbolicLink())
+ return;
+ if (info.isFile()) {
+ let fileType = AppFileType.PLAIN;
+ var fileOutput = '';
+ try {
+ fileOutput = await cross_spawn_promise_1.spawn('file', ['--brief', '--no-pad', p]);
+ }
+ catch (e) {
+ if (e instanceof cross_spawn_promise_1.ExitCodeError) {
+ /* silently accept error codes from "file" */
+ }
+ else {
+ throw e;
+ }
+ }
+ if (p.includes('app.asar')) {
+ fileType = AppFileType.APP_CODE;
+ }
+ else if (fileOutput.startsWith(MACHO_PREFIX)) {
+ fileType = AppFileType.MACHO;
+ }
+ else if (p.endsWith('.bin')) {
+ fileType = AppFileType.SNAPSHOT;
+ }
+ else if (path.basename(p) === 'Info.plist') {
+ fileType = AppFileType.INFO_PLIST;
+ }
+ files.push({
+ relativePath: path.relative(appPath, p),
+ type: fileType,
+ });
+ }
+ if (info.isDirectory()) {
+ for (const child of await fs.readdir(p)) {
+ await traverse(path.resolve(p, child));
+ }
+ }
+ };
+ await traverse(appPath);
+ return files;
+};
+//# sourceMappingURL=file-utils.js.map \ No newline at end of file
diff --git a/desktop/node_modules/@electron/universal/dist/cjs/file-utils.js.map b/desktop/node_modules/@electron/universal/dist/cjs/file-utils.js.map
new file mode 100644
index 0000000..1ca0c18
--- /dev/null
+++ b/desktop/node_modules/@electron/universal/dist/cjs/file-utils.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"file-utils.js","sourceRoot":"","sources":["../../src/file-utils.ts"],"names":[],"mappings":";;;AAAA,qEAAmE;AACnE,+BAA+B;AAC/B,6BAA6B;AAE7B,MAAM,YAAY,GAAG,SAAS,CAAC;AAE/B,IAAY,WAMX;AAND,WAAY,WAAW;IACrB,+CAAK,CAAA;IACL,+CAAK,CAAA;IACL,yDAAU,CAAA;IACV,qDAAQ,CAAA;IACR,qDAAQ,CAAA;AACV,CAAC,EANW,WAAW,GAAX,mBAAW,KAAX,mBAAW,QAMtB;AAOD;;;GAGG;AACU,QAAA,cAAc,GAAG,KAAK,EAAE,OAAe,EAAsB,EAAE;IAC1E,MAAM,KAAK,GAAc,EAAE,CAAC;IAE5B,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAClC,MAAM,QAAQ,GAAG,KAAK,EAAE,CAAS,EAAE,EAAE;QACnC,CAAC,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QACzB,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;YAAE,OAAO;QAC3B,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAEf,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC9B,IAAI,IAAI,CAAC,cAAc,EAAE;YAAE,OAAO;QAClC,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE;YACjB,IAAI,QAAQ,GAAG,WAAW,CAAC,KAAK,CAAC;YAEjC,IAAI,UAAU,GAAG,EAAE,CAAC;YACpB,IAAI;gBACF,UAAU,GAAG,MAAM,2BAAK,CAAC,MAAM,EAAE,CAAC,SAAS,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC;aAC9D;YAAC,OAAO,CAAC,EAAE;gBACV,IAAI,CAAC,YAAY,mCAAa,EAAE;oBAC9B,6CAA6C;iBAC9C;qBAAM;oBACL,MAAM,CAAC,CAAC;iBACT;aACF;YACD,IAAI,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE;gBAC1B,QAAQ,GAAG,WAAW,CAAC,QAAQ,CAAC;aACjC;iBAAM,IAAI,UAAU,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE;gBAC9C,QAAQ,GAAG,WAAW,CAAC,KAAK,CAAC;aAC9B;iBAAM,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE;gBAC7B,QAAQ,GAAG,WAAW,CAAC,QAAQ,CAAC;aACjC;iBAAM,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,YAAY,EAAE;gBAC5C,QAAQ,GAAG,WAAW,CAAC,UAAU,CAAC;aACnC;YAED,KAAK,CAAC,IAAI,CAAC;gBACT,YAAY,EAAE,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;gBACvC,IAAI,EAAE,QAAQ;aACf,CAAC,CAAC;SACJ;QAED,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE;YACtB,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;gBACvC,MAAM,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;aACxC;SACF;IACH,CAAC,CAAC;IACF,MAAM,QAAQ,CAAC,OAAO,CAAC,CAAC;IAExB,OAAO,KAAK,CAAC;AACf,CAAC,CAAC"} \ No newline at end of file
diff --git a/desktop/node_modules/@electron/universal/dist/cjs/index.d.ts b/desktop/node_modules/@electron/universal/dist/cjs/index.d.ts
new file mode 100644
index 0000000..e60bb7d
--- /dev/null
+++ b/desktop/node_modules/@electron/universal/dist/cjs/index.d.ts
@@ -0,0 +1,37 @@
+export declare type MakeUniversalOpts = {
+ /**
+ * Absolute file system path to the x64 version of your application. E.g. /Foo/bar/MyApp_x64.app
+ */
+ x64AppPath: string;
+ /**
+ * Absolute file system path to the arm64 version of your application. E.g. /Foo/bar/MyApp_arm64.app
+ */
+ arm64AppPath: string;
+ /**
+ * Absolute file system path you want the universal app to be written to. E.g. /Foo/var/MyApp_universal.app
+ *
+ * If this file exists it will be overwritten ONLY if "force" is set to true
+ */
+ outAppPath: string;
+ /**
+ * Forcefully overwrite any existing files that are in the way of generating the universal application
+ */
+ force: boolean;
+ /**
+ * Merge x64 and arm64 ASARs into one.
+ */
+ mergeASARs?: boolean;
+ /**
+ * Minimatch pattern of paths that are allowed to be present in one of the ASAR files, but not in the other.
+ */
+ singleArchFiles?: string;
+ /**
+ * Minimatch pattern of binaries that are expected to be the same x64 binary in both of the ASAR files.
+ */
+ x64ArchFiles?: string;
+ /**
+ * Minimatch pattern of paths that should not receive an injected ElectronAsarIntegrity value
+ */
+ infoPlistsToIgnore?: string;
+};
+export declare const makeUniversalApp: (opts: MakeUniversalOpts) => Promise<void>;
diff --git a/desktop/node_modules/@electron/universal/dist/cjs/index.js b/desktop/node_modules/@electron/universal/dist/cjs/index.js
new file mode 100644
index 0000000..0b62702
--- /dev/null
+++ b/desktop/node_modules/@electron/universal/dist/cjs/index.js
@@ -0,0 +1,231 @@
+"use strict";
+var __rest = (this && this.__rest) || function (s, e) {
+ var t = {};
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
+ t[p] = s[p];
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
+ t[p[i]] = s[p[i]];
+ }
+ return t;
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.makeUniversalApp = void 0;
+const cross_spawn_promise_1 = require("@malept/cross-spawn-promise");
+const asar = require("@electron/asar");
+const fs = require("fs-extra");
+const minimatch = require("minimatch");
+const os = require("os");
+const path = require("path");
+const plist = require("plist");
+const dircompare = require("dir-compare");
+const file_utils_1 = require("./file-utils");
+const asar_utils_1 = require("./asar-utils");
+const sha_1 = require("./sha");
+const debug_1 = require("./debug");
+const dupedFiles = (files) => files.filter((f) => f.type !== file_utils_1.AppFileType.SNAPSHOT && f.type !== file_utils_1.AppFileType.APP_CODE);
+exports.makeUniversalApp = async (opts) => {
+ debug_1.d('making a universal app with options', opts);
+ if (process.platform !== 'darwin')
+ throw new Error('@electron/universal is only supported on darwin platforms');
+ if (!opts.x64AppPath || !path.isAbsolute(opts.x64AppPath))
+ throw new Error('Expected opts.x64AppPath to be an absolute path but it was not');
+ if (!opts.arm64AppPath || !path.isAbsolute(opts.arm64AppPath))
+ throw new Error('Expected opts.arm64AppPath to be an absolute path but it was not');
+ if (!opts.outAppPath || !path.isAbsolute(opts.outAppPath))
+ throw new Error('Expected opts.outAppPath to be an absolute path but it was not');
+ if (await fs.pathExists(opts.outAppPath)) {
+ debug_1.d('output path exists already');
+ if (!opts.force) {
+ throw new Error(`The out path "${opts.outAppPath}" already exists and force is not set to true`);
+ }
+ else {
+ debug_1.d('overwriting existing application because force == true');
+ await fs.remove(opts.outAppPath);
+ }
+ }
+ const x64AsarMode = await asar_utils_1.detectAsarMode(opts.x64AppPath);
+ const arm64AsarMode = await asar_utils_1.detectAsarMode(opts.arm64AppPath);
+ debug_1.d('detected x64AsarMode =', x64AsarMode);
+ debug_1.d('detected arm64AsarMode =', arm64AsarMode);
+ if (x64AsarMode !== arm64AsarMode)
+ throw new Error('Both the x64 and arm64 versions of your application need to have been built with the same asar settings (enabled vs disabled)');
+ const tmpDir = await fs.mkdtemp(path.resolve(os.tmpdir(), 'electron-universal-'));
+ debug_1.d('building universal app in', tmpDir);
+ try {
+ debug_1.d('copying x64 app as starter template');
+ const tmpApp = path.resolve(tmpDir, 'Tmp.app');
+ await cross_spawn_promise_1.spawn('cp', ['-R', opts.x64AppPath, tmpApp]);
+ const uniqueToX64 = [];
+ const uniqueToArm64 = [];
+ const x64Files = await file_utils_1.getAllAppFiles(await fs.realpath(tmpApp));
+ const arm64Files = await file_utils_1.getAllAppFiles(await fs.realpath(opts.arm64AppPath));
+ for (const file of dupedFiles(x64Files)) {
+ if (!arm64Files.some((f) => f.relativePath === file.relativePath))
+ uniqueToX64.push(file.relativePath);
+ }
+ for (const file of dupedFiles(arm64Files)) {
+ if (!x64Files.some((f) => f.relativePath === file.relativePath))
+ uniqueToArm64.push(file.relativePath);
+ }
+ if (uniqueToX64.length !== 0 || uniqueToArm64.length !== 0) {
+ debug_1.d('some files were not in both builds, aborting');
+ console.error({
+ uniqueToX64,
+ uniqueToArm64,
+ });
+ throw new Error('While trying to merge mach-o files across your apps we found a mismatch, the number of mach-o files is not the same between the arm64 and x64 builds');
+ }
+ for (const file of x64Files.filter((f) => f.type === file_utils_1.AppFileType.PLAIN)) {
+ const x64Sha = await sha_1.sha(path.resolve(opts.x64AppPath, file.relativePath));
+ const arm64Sha = await sha_1.sha(path.resolve(opts.arm64AppPath, file.relativePath));
+ if (x64Sha !== arm64Sha) {
+ debug_1.d('SHA for file', file.relativePath, `does not match across builds ${x64Sha}!=${arm64Sha}`);
+ // The MainMenu.nib files generated by Xcode13 are deterministic in effect but not deterministic in generated sequence
+ if (path.basename(path.dirname(file.relativePath)) === 'MainMenu.nib') {
+ // The mismatch here is OK so we just move on to the next one
+ continue;
+ }
+ throw new Error(`Expected all non-binary files to have identical SHAs when creating a universal build but "${file.relativePath}" did not`);
+ }
+ }
+ for (const machOFile of x64Files.filter((f) => f.type === file_utils_1.AppFileType.MACHO)) {
+ const first = await fs.realpath(path.resolve(tmpApp, machOFile.relativePath));
+ const second = await fs.realpath(path.resolve(opts.arm64AppPath, machOFile.relativePath));
+ const x64Sha = await sha_1.sha(path.resolve(opts.x64AppPath, machOFile.relativePath));
+ const arm64Sha = await sha_1.sha(path.resolve(opts.arm64AppPath, machOFile.relativePath));
+ if (x64Sha === arm64Sha) {
+ if (opts.x64ArchFiles === undefined ||
+ !minimatch(machOFile.relativePath, opts.x64ArchFiles, { matchBase: true })) {
+ throw new Error(`Detected file "${machOFile.relativePath}" that's the same in both x64 and arm64 builds and not covered by the ` +
+ `x64ArchFiles rule: "${opts.x64ArchFiles}"`);
+ }
+ debug_1.d('SHA for Mach-O file', machOFile.relativePath, `matches across builds ${x64Sha}===${arm64Sha}, skipping lipo`);
+ continue;
+ }
+ debug_1.d('joining two MachO files with lipo', {
+ first,
+ second,
+ });
+ await cross_spawn_promise_1.spawn('lipo', [
+ first,
+ second,
+ '-create',
+ '-output',
+ await fs.realpath(path.resolve(tmpApp, machOFile.relativePath)),
+ ]);
+ }
+ /**
+ * If we don't have an ASAR we need to check if the two "app" folders are identical, if
+ * they are then we can just leave one there and call it a day. If the app folders for x64
+ * and arm64 are different though we need to rename each folder and create a new fake "app"
+ * entrypoint to dynamically load the correct app folder
+ */
+ if (x64AsarMode === asar_utils_1.AsarMode.NO_ASAR) {
+ debug_1.d('checking if the x64 and arm64 app folders are identical');
+ const comparison = await dircompare.compare(path.resolve(tmpApp, 'Contents', 'Resources', 'app'), path.resolve(opts.arm64AppPath, 'Contents', 'Resources', 'app'), { compareSize: true, compareContent: true });
+ if (!comparison.same) {
+ debug_1.d('x64 and arm64 app folders are different, creating dynamic entry ASAR');
+ await fs.move(path.resolve(tmpApp, 'Contents', 'Resources', 'app'), path.resolve(tmpApp, 'Contents', 'Resources', 'app-x64'));
+ await fs.copy(path.resolve(opts.arm64AppPath, 'Contents', 'Resources', 'app'), path.resolve(tmpApp, 'Contents', 'Resources', 'app-arm64'));
+ const entryAsar = path.resolve(tmpDir, 'entry-asar');
+ await fs.mkdir(entryAsar);
+ await fs.copy(path.resolve(__dirname, '..', '..', 'entry-asar', 'no-asar.js'), path.resolve(entryAsar, 'index.js'));
+ let pj = await fs.readJson(path.resolve(opts.x64AppPath, 'Contents', 'Resources', 'app', 'package.json'));
+ pj.main = 'index.js';
+ await fs.writeJson(path.resolve(entryAsar, 'package.json'), pj);
+ await asar.createPackage(entryAsar, path.resolve(tmpApp, 'Contents', 'Resources', 'app.asar'));
+ }
+ else {
+ debug_1.d('x64 and arm64 app folders are the same');
+ }
+ }
+ const generatedIntegrity = {};
+ let didSplitAsar = false;
+ /**
+ * If we have an ASAR we just need to check if the two "app.asar" files have the same hash,
+ * if they are, same as above, we can leave one there and call it a day. If they're different
+ * we have to make a dynamic entrypoint. There is an assumption made here that every file in
+ * app.asar.unpacked is a native node module. This assumption _may_ not be true so we should
+ * look at codifying that assumption as actual logic.
+ */
+ // FIXME: Codify the assumption that app.asar.unpacked only contains native modules
+ if (x64AsarMode === asar_utils_1.AsarMode.HAS_ASAR && opts.mergeASARs) {
+ debug_1.d('merging x64 and arm64 asars');
+ const output = path.resolve(tmpApp, 'Contents', 'Resources', 'app.asar');
+ await asar_utils_1.mergeASARs({
+ x64AsarPath: path.resolve(tmpApp, 'Contents', 'Resources', 'app.asar'),
+ arm64AsarPath: path.resolve(opts.arm64AppPath, 'Contents', 'Resources', 'app.asar'),
+ outputAsarPath: output,
+ singleArchFiles: opts.singleArchFiles,
+ });
+ generatedIntegrity['Resources/app.asar'] = asar_utils_1.generateAsarIntegrity(output);
+ }
+ else if (x64AsarMode === asar_utils_1.AsarMode.HAS_ASAR) {
+ debug_1.d('checking if the x64 and arm64 asars are identical');
+ const x64AsarSha = await sha_1.sha(path.resolve(tmpApp, 'Contents', 'Resources', 'app.asar'));
+ const arm64AsarSha = await sha_1.sha(path.resolve(opts.arm64AppPath, 'Contents', 'Resources', 'app.asar'));
+ if (x64AsarSha !== arm64AsarSha) {
+ didSplitAsar = true;
+ debug_1.d('x64 and arm64 asars are different');
+ const x64AsarPath = path.resolve(tmpApp, 'Contents', 'Resources', 'app-x64.asar');
+ await fs.move(path.resolve(tmpApp, 'Contents', 'Resources', 'app.asar'), x64AsarPath);
+ const x64Unpacked = path.resolve(tmpApp, 'Contents', 'Resources', 'app.asar.unpacked');
+ if (await fs.pathExists(x64Unpacked)) {
+ await fs.move(x64Unpacked, path.resolve(tmpApp, 'Contents', 'Resources', 'app-x64.asar.unpacked'));
+ }
+ const arm64AsarPath = path.resolve(tmpApp, 'Contents', 'Resources', 'app-arm64.asar');
+ await fs.copy(path.resolve(opts.arm64AppPath, 'Contents', 'Resources', 'app.asar'), arm64AsarPath);
+ const arm64Unpacked = path.resolve(opts.arm64AppPath, 'Contents', 'Resources', 'app.asar.unpacked');
+ if (await fs.pathExists(arm64Unpacked)) {
+ await fs.copy(arm64Unpacked, path.resolve(tmpApp, 'Contents', 'Resources', 'app-arm64.asar.unpacked'));
+ }
+ const entryAsar = path.resolve(tmpDir, 'entry-asar');
+ await fs.mkdir(entryAsar);
+ await fs.copy(path.resolve(__dirname, '..', '..', 'entry-asar', 'has-asar.js'), path.resolve(entryAsar, 'index.js'));
+ let pj = JSON.parse((await asar.extractFile(path.resolve(opts.x64AppPath, 'Contents', 'Resources', 'app.asar'), 'package.json')).toString('utf8'));
+ pj.main = 'index.js';
+ await fs.writeJson(path.resolve(entryAsar, 'package.json'), pj);
+ const asarPath = path.resolve(tmpApp, 'Contents', 'Resources', 'app.asar');
+ await asar.createPackage(entryAsar, asarPath);
+ generatedIntegrity['Resources/app.asar'] = asar_utils_1.generateAsarIntegrity(asarPath);
+ generatedIntegrity['Resources/app-x64.asar'] = asar_utils_1.generateAsarIntegrity(x64AsarPath);
+ generatedIntegrity['Resources/app-arm64.asar'] = asar_utils_1.generateAsarIntegrity(arm64AsarPath);
+ }
+ else {
+ debug_1.d('x64 and arm64 asars are the same');
+ generatedIntegrity['Resources/app.asar'] = asar_utils_1.generateAsarIntegrity(path.resolve(tmpApp, 'Contents', 'Resources', 'app.asar'));
+ }
+ }
+ const plistFiles = x64Files.filter((f) => f.type === file_utils_1.AppFileType.INFO_PLIST);
+ for (const plistFile of plistFiles) {
+ const x64PlistPath = path.resolve(opts.x64AppPath, plistFile.relativePath);
+ const arm64PlistPath = path.resolve(opts.arm64AppPath, plistFile.relativePath);
+ const _a = plist.parse(await fs.readFile(x64PlistPath, 'utf8')), { ElectronAsarIntegrity: x64Integrity } = _a, x64Plist = __rest(_a, ["ElectronAsarIntegrity"]);
+ const _b = plist.parse(await fs.readFile(arm64PlistPath, 'utf8')), { ElectronAsarIntegrity: arm64Integrity } = _b, arm64Plist = __rest(_b, ["ElectronAsarIntegrity"]);
+ if (JSON.stringify(x64Plist) !== JSON.stringify(arm64Plist)) {
+ throw new Error(`Expected all Info.plist files to be identical when ignoring integrity when creating a universal build but "${plistFile.relativePath}" was not`);
+ }
+ const injectAsarIntegrity = !opts.infoPlistsToIgnore ||
+ minimatch(plistFile.relativePath, opts.infoPlistsToIgnore, { matchBase: true });
+ const mergedPlist = injectAsarIntegrity
+ ? Object.assign(Object.assign({}, x64Plist), { ElectronAsarIntegrity: generatedIntegrity }) : Object.assign({}, x64Plist);
+ await fs.writeFile(path.resolve(tmpApp, plistFile.relativePath), plist.build(mergedPlist));
+ }
+ for (const snapshotsFile of arm64Files.filter((f) => f.type === file_utils_1.AppFileType.SNAPSHOT)) {
+ debug_1.d('copying snapshot file', snapshotsFile.relativePath, 'to target application');
+ await fs.copy(path.resolve(opts.arm64AppPath, snapshotsFile.relativePath), path.resolve(tmpApp, snapshotsFile.relativePath));
+ }
+ debug_1.d('moving final universal app to target destination');
+ await fs.mkdirp(path.dirname(opts.outAppPath));
+ await cross_spawn_promise_1.spawn('mv', [tmpApp, opts.outAppPath]);
+ }
+ catch (err) {
+ throw err;
+ }
+ finally {
+ await fs.remove(tmpDir);
+ }
+};
+//# sourceMappingURL=index.js.map \ No newline at end of file
diff --git a/desktop/node_modules/@electron/universal/dist/cjs/index.js.map b/desktop/node_modules/@electron/universal/dist/cjs/index.js.map
new file mode 100644
index 0000000..0c3c65c
--- /dev/null
+++ b/desktop/node_modules/@electron/universal/dist/cjs/index.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"} \ No newline at end of file
diff --git a/desktop/node_modules/@electron/universal/dist/cjs/sha.d.ts b/desktop/node_modules/@electron/universal/dist/cjs/sha.d.ts
new file mode 100644
index 0000000..1c0daaa
--- /dev/null
+++ b/desktop/node_modules/@electron/universal/dist/cjs/sha.d.ts
@@ -0,0 +1 @@
+export declare const sha: (filePath: string) => Promise<any>;
diff --git a/desktop/node_modules/@electron/universal/dist/cjs/sha.js b/desktop/node_modules/@electron/universal/dist/cjs/sha.js
new file mode 100644
index 0000000..801fe61
--- /dev/null
+++ b/desktop/node_modules/@electron/universal/dist/cjs/sha.js
@@ -0,0 +1,19 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.sha = void 0;
+const fs = require("fs-extra");
+const crypto = require("crypto");
+const debug_1 = require("./debug");
+exports.sha = async (filePath) => {
+ debug_1.d('hashing', filePath);
+ const hash = crypto.createHash('sha256');
+ hash.setEncoding('hex');
+ const fileStream = fs.createReadStream(filePath);
+ fileStream.pipe(hash);
+ await new Promise((resolve, reject) => {
+ fileStream.on('end', () => resolve());
+ fileStream.on('error', (err) => reject(err));
+ });
+ return hash.read();
+};
+//# sourceMappingURL=sha.js.map \ No newline at end of file
diff --git a/desktop/node_modules/@electron/universal/dist/cjs/sha.js.map b/desktop/node_modules/@electron/universal/dist/cjs/sha.js.map
new file mode 100644
index 0000000..3bfffd8
--- /dev/null
+++ b/desktop/node_modules/@electron/universal/dist/cjs/sha.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"sha.js","sourceRoot":"","sources":["../../src/sha.ts"],"names":[],"mappings":";;;AAAA,+BAA+B;AAC/B,iCAAiC;AACjC,mCAA4B;AAEf,QAAA,GAAG,GAAG,KAAK,EAAE,QAAgB,EAAE,EAAE;IAC5C,SAAC,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IACvB,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;IACzC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IACxB,MAAM,UAAU,GAAG,EAAE,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IACjD,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtB,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACpC,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;QACtC,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IACH,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC;AACrB,CAAC,CAAC"} \ No newline at end of file
diff --git a/desktop/node_modules/@electron/universal/dist/esm/asar-utils.d.ts b/desktop/node_modules/@electron/universal/dist/esm/asar-utils.d.ts
new file mode 100644
index 0000000..530b52b
--- /dev/null
+++ b/desktop/node_modules/@electron/universal/dist/esm/asar-utils.d.ts
@@ -0,0 +1,16 @@
+export declare enum AsarMode {
+ NO_ASAR = 0,
+ HAS_ASAR = 1
+}
+export declare type MergeASARsOptions = {
+ x64AsarPath: string;
+ arm64AsarPath: string;
+ outputAsarPath: string;
+ singleArchFiles?: string;
+};
+export declare const detectAsarMode: (appPath: string) => Promise<AsarMode>;
+export declare const generateAsarIntegrity: (asarPath: string) => {
+ algorithm: "SHA256";
+ hash: string;
+};
+export declare const mergeASARs: ({ x64AsarPath, arm64AsarPath, outputAsarPath, singleArchFiles, }: MergeASARsOptions) => Promise<void>;
diff --git a/desktop/node_modules/@electron/universal/dist/esm/asar-utils.js b/desktop/node_modules/@electron/universal/dist/esm/asar-utils.js
new file mode 100644
index 0000000..efab848
--- /dev/null
+++ b/desktop/node_modules/@electron/universal/dist/esm/asar-utils.js
@@ -0,0 +1,169 @@
+import * as asar from '@electron/asar';
+import { execFileSync } from 'child_process';
+import * as crypto from 'crypto';
+import * as fs from 'fs-extra';
+import * as path from 'path';
+import * as minimatch from 'minimatch';
+import * as os from 'os';
+import { d } from './debug';
+const LIPO = 'lipo';
+export var AsarMode;
+(function (AsarMode) {
+ AsarMode[AsarMode["NO_ASAR"] = 0] = "NO_ASAR";
+ AsarMode[AsarMode["HAS_ASAR"] = 1] = "HAS_ASAR";
+})(AsarMode || (AsarMode = {}));
+// See: https://github.com/apple-opensource-mirror/llvmCore/blob/0c60489d96c87140db9a6a14c6e82b15f5e5d252/include/llvm/Object/MachOFormat.h#L108-L112
+const MACHO_MAGIC = new Set([
+ // 32-bit Mach-O
+ 0xfeedface,
+ 0xcefaedfe,
+ // 64-bit Mach-O
+ 0xfeedfacf,
+ 0xcffaedfe,
+]);
+const MACHO_UNIVERSAL_MAGIC = new Set([
+ // universal
+ 0xcafebabe,
+ 0xbebafeca,
+]);
+export const detectAsarMode = async (appPath) => {
+ d('checking asar mode of', appPath);
+ const asarPath = path.resolve(appPath, 'Contents', 'Resources', 'app.asar');
+ if (!(await fs.pathExists(asarPath))) {
+ d('determined no asar');
+ return AsarMode.NO_ASAR;
+ }
+ d('determined has asar');
+ return AsarMode.HAS_ASAR;
+};
+export const generateAsarIntegrity = (asarPath) => {
+ return {
+ algorithm: 'SHA256',
+ hash: crypto
+ .createHash('SHA256')
+ .update(asar.getRawHeader(asarPath).headerString)
+ .digest('hex'),
+ };
+};
+function toRelativePath(file) {
+ return file.replace(/^\//, '');
+}
+function isDirectory(a, file) {
+ return Boolean('files' in asar.statFile(a, file));
+}
+function checkSingleArch(archive, file, allowList) {
+ if (allowList === undefined || !minimatch(file, allowList, { matchBase: true })) {
+ throw new Error(`Detected unique file "${file}" in "${archive}" not covered by ` +
+ `allowList rule: "${allowList}"`);
+ }
+}
+export const mergeASARs = async ({ x64AsarPath, arm64AsarPath, outputAsarPath, singleArchFiles, }) => {
+ d(`merging ${x64AsarPath} and ${arm64AsarPath}`);
+ const x64Files = new Set(asar.listPackage(x64AsarPath).map(toRelativePath));
+ const arm64Files = new Set(asar.listPackage(arm64AsarPath).map(toRelativePath));
+ //
+ // Build set of unpacked directories and files
+ //
+ const unpackedFiles = new Set();
+ function buildUnpacked(a, fileList) {
+ for (const file of fileList) {
+ const stat = asar.statFile(a, file);
+ if (!('unpacked' in stat) || !stat.unpacked) {
+ continue;
+ }
+ if ('files' in stat) {
+ continue;
+ }
+ unpackedFiles.add(file);
+ }
+ }
+ buildUnpacked(x64AsarPath, x64Files);
+ buildUnpacked(arm64AsarPath, arm64Files);
+ //
+ // Build list of files/directories unique to each asar
+ //
+ for (const file of x64Files) {
+ if (!arm64Files.has(file)) {
+ checkSingleArch(x64AsarPath, file, singleArchFiles);
+ }
+ }
+ const arm64Unique = [];
+ for (const file of arm64Files) {
+ if (!x64Files.has(file)) {
+ checkSingleArch(arm64AsarPath, file, singleArchFiles);
+ arm64Unique.push(file);
+ }
+ }
+ //
+ // Find common bindings with different content
+ //
+ const commonBindings = [];
+ for (const file of x64Files) {
+ if (!arm64Files.has(file)) {
+ continue;
+ }
+ // Skip directories
+ if (isDirectory(x64AsarPath, file)) {
+ continue;
+ }
+ const x64Content = asar.extractFile(x64AsarPath, file);
+ const arm64Content = asar.extractFile(arm64AsarPath, file);
+ if (x64Content.compare(arm64Content) === 0) {
+ continue;
+ }
+ if (MACHO_UNIVERSAL_MAGIC.has(x64Content.readUInt32LE(0)) &&
+ MACHO_UNIVERSAL_MAGIC.has(arm64Content.readUInt32LE(0))) {
+ continue;
+ }
+ if (!MACHO_MAGIC.has(x64Content.readUInt32LE(0))) {
+ throw new Error(`Can't reconcile two non-macho files ${file}`);
+ }
+ commonBindings.push(file);
+ }
+ //
+ // Extract both
+ //
+ const x64Dir = await fs.mkdtemp(path.join(os.tmpdir(), 'x64-'));
+ const arm64Dir = await fs.mkdtemp(path.join(os.tmpdir(), 'arm64-'));
+ try {
+ d(`extracting ${x64AsarPath} to ${x64Dir}`);
+ asar.extractAll(x64AsarPath, x64Dir);
+ d(`extracting ${arm64AsarPath} to ${arm64Dir}`);
+ asar.extractAll(arm64AsarPath, arm64Dir);
+ for (const file of arm64Unique) {
+ const source = path.resolve(arm64Dir, file);
+ const destination = path.resolve(x64Dir, file);
+ if (isDirectory(arm64AsarPath, file)) {
+ d(`creating unique directory: ${file}`);
+ await fs.mkdirp(destination);
+ continue;
+ }
+ d(`xopying unique file: ${file}`);
+ await fs.mkdirp(path.dirname(destination));
+ await fs.copy(source, destination);
+ }
+ for (const binding of commonBindings) {
+ const source = await fs.realpath(path.resolve(arm64Dir, binding));
+ const destination = await fs.realpath(path.resolve(x64Dir, binding));
+ d(`merging binding: ${binding}`);
+ execFileSync(LIPO, [source, destination, '-create', '-output', destination]);
+ }
+ d(`creating archive at ${outputAsarPath}`);
+ const resolvedUnpack = Array.from(unpackedFiles).map((file) => path.join(x64Dir, file));
+ let unpack;
+ if (resolvedUnpack.length > 1) {
+ unpack = `{${resolvedUnpack.join(',')}}`;
+ }
+ else if (resolvedUnpack.length === 1) {
+ unpack = resolvedUnpack[0];
+ }
+ await asar.createPackageWithOptions(x64Dir, outputAsarPath, {
+ unpack,
+ });
+ d('done merging');
+ }
+ finally {
+ await Promise.all([fs.remove(x64Dir), fs.remove(arm64Dir)]);
+ }
+};
+//# sourceMappingURL=asar-utils.js.map \ No newline at end of file
diff --git a/desktop/node_modules/@electron/universal/dist/esm/asar-utils.js.map b/desktop/node_modules/@electron/universal/dist/esm/asar-utils.js.map
new file mode 100644
index 0000000..ca5d07d
--- /dev/null
+++ b/desktop/node_modules/@electron/universal/dist/esm/asar-utils.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"asar-utils.js","sourceRoot":"","sources":["../../src/asar-utils.ts"],"names":[],"mappings":"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"} \ No newline at end of file
diff --git a/desktop/node_modules/@electron/universal/dist/esm/debug.d.ts b/desktop/node_modules/@electron/universal/dist/esm/debug.d.ts
new file mode 100644
index 0000000..ec24d3b
--- /dev/null
+++ b/desktop/node_modules/@electron/universal/dist/esm/debug.d.ts
@@ -0,0 +1,2 @@
+import * as debug from 'debug';
+export declare const d: debug.Debugger;
diff --git a/desktop/node_modules/@electron/universal/dist/esm/debug.js b/desktop/node_modules/@electron/universal/dist/esm/debug.js
new file mode 100644
index 0000000..449f78f
--- /dev/null
+++ b/desktop/node_modules/@electron/universal/dist/esm/debug.js
@@ -0,0 +1,3 @@
+import * as debug from 'debug';
+export const d = debug('electron-universal');
+//# sourceMappingURL=debug.js.map \ No newline at end of file
diff --git a/desktop/node_modules/@electron/universal/dist/esm/debug.js.map b/desktop/node_modules/@electron/universal/dist/esm/debug.js.map
new file mode 100644
index 0000000..7804bed
--- /dev/null
+++ b/desktop/node_modules/@electron/universal/dist/esm/debug.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"debug.js","sourceRoot":"","sources":["../../src/debug.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,MAAM,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC,oBAAoB,CAAC,CAAC"} \ No newline at end of file
diff --git a/desktop/node_modules/@electron/universal/dist/esm/file-utils.d.ts b/desktop/node_modules/@electron/universal/dist/esm/file-utils.d.ts
new file mode 100644
index 0000000..ff08b0e
--- /dev/null
+++ b/desktop/node_modules/@electron/universal/dist/esm/file-utils.d.ts
@@ -0,0 +1,16 @@
+export declare enum AppFileType {
+ MACHO = 0,
+ PLAIN = 1,
+ INFO_PLIST = 2,
+ SNAPSHOT = 3,
+ APP_CODE = 4
+}
+export declare type AppFile = {
+ relativePath: string;
+ type: AppFileType;
+};
+/**
+ *
+ * @param appPath Path to the application
+ */
+export declare const getAllAppFiles: (appPath: string) => Promise<AppFile[]>;
diff --git a/desktop/node_modules/@electron/universal/dist/esm/file-utils.js b/desktop/node_modules/@electron/universal/dist/esm/file-utils.js
new file mode 100644
index 0000000..68eb4b8
--- /dev/null
+++ b/desktop/node_modules/@electron/universal/dist/esm/file-utils.js
@@ -0,0 +1,68 @@
+import { spawn, ExitCodeError } from '@malept/cross-spawn-promise';
+import * as fs from 'fs-extra';
+import * as path from 'path';
+const MACHO_PREFIX = 'Mach-O ';
+export var AppFileType;
+(function (AppFileType) {
+ AppFileType[AppFileType["MACHO"] = 0] = "MACHO";
+ AppFileType[AppFileType["PLAIN"] = 1] = "PLAIN";
+ AppFileType[AppFileType["INFO_PLIST"] = 2] = "INFO_PLIST";
+ AppFileType[AppFileType["SNAPSHOT"] = 3] = "SNAPSHOT";
+ AppFileType[AppFileType["APP_CODE"] = 4] = "APP_CODE";
+})(AppFileType || (AppFileType = {}));
+/**
+ *
+ * @param appPath Path to the application
+ */
+export const getAllAppFiles = async (appPath) => {
+ const files = [];
+ const visited = new Set();
+ const traverse = async (p) => {
+ p = await fs.realpath(p);
+ if (visited.has(p))
+ return;
+ visited.add(p);
+ const info = await fs.stat(p);
+ if (info.isSymbolicLink())
+ return;
+ if (info.isFile()) {
+ let fileType = AppFileType.PLAIN;
+ var fileOutput = '';
+ try {
+ fileOutput = await spawn('file', ['--brief', '--no-pad', p]);
+ }
+ catch (e) {
+ if (e instanceof ExitCodeError) {
+ /* silently accept error codes from "file" */
+ }
+ else {
+ throw e;
+ }
+ }
+ if (p.includes('app.asar')) {
+ fileType = AppFileType.APP_CODE;
+ }
+ else if (fileOutput.startsWith(MACHO_PREFIX)) {
+ fileType = AppFileType.MACHO;
+ }
+ else if (p.endsWith('.bin')) {
+ fileType = AppFileType.SNAPSHOT;
+ }
+ else if (path.basename(p) === 'Info.plist') {
+ fileType = AppFileType.INFO_PLIST;
+ }
+ files.push({
+ relativePath: path.relative(appPath, p),
+ type: fileType,
+ });
+ }
+ if (info.isDirectory()) {
+ for (const child of await fs.readdir(p)) {
+ await traverse(path.resolve(p, child));
+ }
+ }
+ };
+ await traverse(appPath);
+ return files;
+};
+//# sourceMappingURL=file-utils.js.map \ No newline at end of file
diff --git a/desktop/node_modules/@electron/universal/dist/esm/file-utils.js.map b/desktop/node_modules/@electron/universal/dist/esm/file-utils.js.map
new file mode 100644
index 0000000..7b095a5
--- /dev/null
+++ b/desktop/node_modules/@electron/universal/dist/esm/file-utils.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"file-utils.js","sourceRoot":"","sources":["../../src/file-utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,KAAK,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAE7B,MAAM,YAAY,GAAG,SAAS,CAAC;AAE/B,MAAM,CAAN,IAAY,WAMX;AAND,WAAY,WAAW;IACrB,+CAAK,CAAA;IACL,+CAAK,CAAA;IACL,yDAAU,CAAA;IACV,qDAAQ,CAAA;IACR,qDAAQ,CAAA;AACV,CAAC,EANW,WAAW,KAAX,WAAW,QAMtB;AAOD;;;GAGG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,KAAK,EAAE,OAAe,EAAsB,EAAE;IAC1E,MAAM,KAAK,GAAc,EAAE,CAAC;IAE5B,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAClC,MAAM,QAAQ,GAAG,KAAK,EAAE,CAAS,EAAE,EAAE;QACnC,CAAC,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QACzB,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;YAAE,OAAO;QAC3B,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAEf,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC9B,IAAI,IAAI,CAAC,cAAc,EAAE;YAAE,OAAO;QAClC,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE;YACjB,IAAI,QAAQ,GAAG,WAAW,CAAC,KAAK,CAAC;YAEjC,IAAI,UAAU,GAAG,EAAE,CAAC;YACpB,IAAI;gBACF,UAAU,GAAG,MAAM,KAAK,CAAC,MAAM,EAAE,CAAC,SAAS,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC;aAC9D;YAAC,OAAO,CAAC,EAAE;gBACV,IAAI,CAAC,YAAY,aAAa,EAAE;oBAC9B,6CAA6C;iBAC9C;qBAAM;oBACL,MAAM,CAAC,CAAC;iBACT;aACF;YACD,IAAI,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE;gBAC1B,QAAQ,GAAG,WAAW,CAAC,QAAQ,CAAC;aACjC;iBAAM,IAAI,UAAU,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE;gBAC9C,QAAQ,GAAG,WAAW,CAAC,KAAK,CAAC;aAC9B;iBAAM,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE;gBAC7B,QAAQ,GAAG,WAAW,CAAC,QAAQ,CAAC;aACjC;iBAAM,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,YAAY,EAAE;gBAC5C,QAAQ,GAAG,WAAW,CAAC,UAAU,CAAC;aACnC;YAED,KAAK,CAAC,IAAI,CAAC;gBACT,YAAY,EAAE,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;gBACvC,IAAI,EAAE,QAAQ;aACf,CAAC,CAAC;SACJ;QAED,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE;YACtB,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;gBACvC,MAAM,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;aACxC;SACF;IACH,CAAC,CAAC;IACF,MAAM,QAAQ,CAAC,OAAO,CAAC,CAAC;IAExB,OAAO,KAAK,CAAC;AACf,CAAC,CAAC"} \ No newline at end of file
diff --git a/desktop/node_modules/@electron/universal/dist/esm/index.d.ts b/desktop/node_modules/@electron/universal/dist/esm/index.d.ts
new file mode 100644
index 0000000..e60bb7d
--- /dev/null
+++ b/desktop/node_modules/@electron/universal/dist/esm/index.d.ts
@@ -0,0 +1,37 @@
+export declare type MakeUniversalOpts = {
+ /**
+ * Absolute file system path to the x64 version of your application. E.g. /Foo/bar/MyApp_x64.app
+ */
+ x64AppPath: string;
+ /**
+ * Absolute file system path to the arm64 version of your application. E.g. /Foo/bar/MyApp_arm64.app
+ */
+ arm64AppPath: string;
+ /**
+ * Absolute file system path you want the universal app to be written to. E.g. /Foo/var/MyApp_universal.app
+ *
+ * If this file exists it will be overwritten ONLY if "force" is set to true
+ */
+ outAppPath: string;
+ /**
+ * Forcefully overwrite any existing files that are in the way of generating the universal application
+ */
+ force: boolean;
+ /**
+ * Merge x64 and arm64 ASARs into one.
+ */
+ mergeASARs?: boolean;
+ /**
+ * Minimatch pattern of paths that are allowed to be present in one of the ASAR files, but not in the other.
+ */
+ singleArchFiles?: string;
+ /**
+ * Minimatch pattern of binaries that are expected to be the same x64 binary in both of the ASAR files.
+ */
+ x64ArchFiles?: string;
+ /**
+ * Minimatch pattern of paths that should not receive an injected ElectronAsarIntegrity value
+ */
+ infoPlistsToIgnore?: string;
+};
+export declare const makeUniversalApp: (opts: MakeUniversalOpts) => Promise<void>;
diff --git a/desktop/node_modules/@electron/universal/dist/esm/index.js b/desktop/node_modules/@electron/universal/dist/esm/index.js
new file mode 100644
index 0000000..7074398
--- /dev/null
+++ b/desktop/node_modules/@electron/universal/dist/esm/index.js
@@ -0,0 +1,228 @@
+var __rest = (this && this.__rest) || function (s, e) {
+ var t = {};
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
+ t[p] = s[p];
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
+ t[p[i]] = s[p[i]];
+ }
+ return t;
+};
+import { spawn } from '@malept/cross-spawn-promise';
+import * as asar from '@electron/asar';
+import * as fs from 'fs-extra';
+import * as minimatch from 'minimatch';
+import * as os from 'os';
+import * as path from 'path';
+import * as plist from 'plist';
+import * as dircompare from 'dir-compare';
+import { AppFileType, getAllAppFiles } from './file-utils';
+import { AsarMode, detectAsarMode, generateAsarIntegrity, mergeASARs } from './asar-utils';
+import { sha } from './sha';
+import { d } from './debug';
+const dupedFiles = (files) => files.filter((f) => f.type !== AppFileType.SNAPSHOT && f.type !== AppFileType.APP_CODE);
+export const makeUniversalApp = async (opts) => {
+ d('making a universal app with options', opts);
+ if (process.platform !== 'darwin')
+ throw new Error('@electron/universal is only supported on darwin platforms');
+ if (!opts.x64AppPath || !path.isAbsolute(opts.x64AppPath))
+ throw new Error('Expected opts.x64AppPath to be an absolute path but it was not');
+ if (!opts.arm64AppPath || !path.isAbsolute(opts.arm64AppPath))
+ throw new Error('Expected opts.arm64AppPath to be an absolute path but it was not');
+ if (!opts.outAppPath || !path.isAbsolute(opts.outAppPath))
+ throw new Error('Expected opts.outAppPath to be an absolute path but it was not');
+ if (await fs.pathExists(opts.outAppPath)) {
+ d('output path exists already');
+ if (!opts.force) {
+ throw new Error(`The out path "${opts.outAppPath}" already exists and force is not set to true`);
+ }
+ else {
+ d('overwriting existing application because force == true');
+ await fs.remove(opts.outAppPath);
+ }
+ }
+ const x64AsarMode = await detectAsarMode(opts.x64AppPath);
+ const arm64AsarMode = await detectAsarMode(opts.arm64AppPath);
+ d('detected x64AsarMode =', x64AsarMode);
+ d('detected arm64AsarMode =', arm64AsarMode);
+ if (x64AsarMode !== arm64AsarMode)
+ throw new Error('Both the x64 and arm64 versions of your application need to have been built with the same asar settings (enabled vs disabled)');
+ const tmpDir = await fs.mkdtemp(path.resolve(os.tmpdir(), 'electron-universal-'));
+ d('building universal app in', tmpDir);
+ try {
+ d('copying x64 app as starter template');
+ const tmpApp = path.resolve(tmpDir, 'Tmp.app');
+ await spawn('cp', ['-R', opts.x64AppPath, tmpApp]);
+ const uniqueToX64 = [];
+ const uniqueToArm64 = [];
+ const x64Files = await getAllAppFiles(await fs.realpath(tmpApp));
+ const arm64Files = await getAllAppFiles(await fs.realpath(opts.arm64AppPath));
+ for (const file of dupedFiles(x64Files)) {
+ if (!arm64Files.some((f) => f.relativePath === file.relativePath))
+ uniqueToX64.push(file.relativePath);
+ }
+ for (const file of dupedFiles(arm64Files)) {
+ if (!x64Files.some((f) => f.relativePath === file.relativePath))
+ uniqueToArm64.push(file.relativePath);
+ }
+ if (uniqueToX64.length !== 0 || uniqueToArm64.length !== 0) {
+ d('some files were not in both builds, aborting');
+ console.error({
+ uniqueToX64,
+ uniqueToArm64,
+ });
+ throw new Error('While trying to merge mach-o files across your apps we found a mismatch, the number of mach-o files is not the same between the arm64 and x64 builds');
+ }
+ for (const file of x64Files.filter((f) => f.type === AppFileType.PLAIN)) {
+ const x64Sha = await sha(path.resolve(opts.x64AppPath, file.relativePath));
+ const arm64Sha = await sha(path.resolve(opts.arm64AppPath, file.relativePath));
+ if (x64Sha !== arm64Sha) {
+ d('SHA for file', file.relativePath, `does not match across builds ${x64Sha}!=${arm64Sha}`);
+ // The MainMenu.nib files generated by Xcode13 are deterministic in effect but not deterministic in generated sequence
+ if (path.basename(path.dirname(file.relativePath)) === 'MainMenu.nib') {
+ // The mismatch here is OK so we just move on to the next one
+ continue;
+ }
+ throw new Error(`Expected all non-binary files to have identical SHAs when creating a universal build but "${file.relativePath}" did not`);
+ }
+ }
+ for (const machOFile of x64Files.filter((f) => f.type === AppFileType.MACHO)) {
+ const first = await fs.realpath(path.resolve(tmpApp, machOFile.relativePath));
+ const second = await fs.realpath(path.resolve(opts.arm64AppPath, machOFile.relativePath));
+ const x64Sha = await sha(path.resolve(opts.x64AppPath, machOFile.relativePath));
+ const arm64Sha = await sha(path.resolve(opts.arm64AppPath, machOFile.relativePath));
+ if (x64Sha === arm64Sha) {
+ if (opts.x64ArchFiles === undefined ||
+ !minimatch(machOFile.relativePath, opts.x64ArchFiles, { matchBase: true })) {
+ throw new Error(`Detected file "${machOFile.relativePath}" that's the same in both x64 and arm64 builds and not covered by the ` +
+ `x64ArchFiles rule: "${opts.x64ArchFiles}"`);
+ }
+ d('SHA for Mach-O file', machOFile.relativePath, `matches across builds ${x64Sha}===${arm64Sha}, skipping lipo`);
+ continue;
+ }
+ d('joining two MachO files with lipo', {
+ first,
+ second,
+ });
+ await spawn('lipo', [
+ first,
+ second,
+ '-create',
+ '-output',
+ await fs.realpath(path.resolve(tmpApp, machOFile.relativePath)),
+ ]);
+ }
+ /**
+ * If we don't have an ASAR we need to check if the two "app" folders are identical, if
+ * they are then we can just leave one there and call it a day. If the app folders for x64
+ * and arm64 are different though we need to rename each folder and create a new fake "app"
+ * entrypoint to dynamically load the correct app folder
+ */
+ if (x64AsarMode === AsarMode.NO_ASAR) {
+ d('checking if the x64 and arm64 app folders are identical');
+ const comparison = await dircompare.compare(path.resolve(tmpApp, 'Contents', 'Resources', 'app'), path.resolve(opts.arm64AppPath, 'Contents', 'Resources', 'app'), { compareSize: true, compareContent: true });
+ if (!comparison.same) {
+ d('x64 and arm64 app folders are different, creating dynamic entry ASAR');
+ await fs.move(path.resolve(tmpApp, 'Contents', 'Resources', 'app'), path.resolve(tmpApp, 'Contents', 'Resources', 'app-x64'));
+ await fs.copy(path.resolve(opts.arm64AppPath, 'Contents', 'Resources', 'app'), path.resolve(tmpApp, 'Contents', 'Resources', 'app-arm64'));
+ const entryAsar = path.resolve(tmpDir, 'entry-asar');
+ await fs.mkdir(entryAsar);
+ await fs.copy(path.resolve(__dirname, '..', '..', 'entry-asar', 'no-asar.js'), path.resolve(entryAsar, 'index.js'));
+ let pj = await fs.readJson(path.resolve(opts.x64AppPath, 'Contents', 'Resources', 'app', 'package.json'));
+ pj.main = 'index.js';
+ await fs.writeJson(path.resolve(entryAsar, 'package.json'), pj);
+ await asar.createPackage(entryAsar, path.resolve(tmpApp, 'Contents', 'Resources', 'app.asar'));
+ }
+ else {
+ d('x64 and arm64 app folders are the same');
+ }
+ }
+ const generatedIntegrity = {};
+ let didSplitAsar = false;
+ /**
+ * If we have an ASAR we just need to check if the two "app.asar" files have the same hash,
+ * if they are, same as above, we can leave one there and call it a day. If they're different
+ * we have to make a dynamic entrypoint. There is an assumption made here that every file in
+ * app.asar.unpacked is a native node module. This assumption _may_ not be true so we should
+ * look at codifying that assumption as actual logic.
+ */
+ // FIXME: Codify the assumption that app.asar.unpacked only contains native modules
+ if (x64AsarMode === AsarMode.HAS_ASAR && opts.mergeASARs) {
+ d('merging x64 and arm64 asars');
+ const output = path.resolve(tmpApp, 'Contents', 'Resources', 'app.asar');
+ await mergeASARs({
+ x64AsarPath: path.resolve(tmpApp, 'Contents', 'Resources', 'app.asar'),
+ arm64AsarPath: path.resolve(opts.arm64AppPath, 'Contents', 'Resources', 'app.asar'),
+ outputAsarPath: output,
+ singleArchFiles: opts.singleArchFiles,
+ });
+ generatedIntegrity['Resources/app.asar'] = generateAsarIntegrity(output);
+ }
+ else if (x64AsarMode === AsarMode.HAS_ASAR) {
+ d('checking if the x64 and arm64 asars are identical');
+ const x64AsarSha = await sha(path.resolve(tmpApp, 'Contents', 'Resources', 'app.asar'));
+ const arm64AsarSha = await sha(path.resolve(opts.arm64AppPath, 'Contents', 'Resources', 'app.asar'));
+ if (x64AsarSha !== arm64AsarSha) {
+ didSplitAsar = true;
+ d('x64 and arm64 asars are different');
+ const x64AsarPath = path.resolve(tmpApp, 'Contents', 'Resources', 'app-x64.asar');
+ await fs.move(path.resolve(tmpApp, 'Contents', 'Resources', 'app.asar'), x64AsarPath);
+ const x64Unpacked = path.resolve(tmpApp, 'Contents', 'Resources', 'app.asar.unpacked');
+ if (await fs.pathExists(x64Unpacked)) {
+ await fs.move(x64Unpacked, path.resolve(tmpApp, 'Contents', 'Resources', 'app-x64.asar.unpacked'));
+ }
+ const arm64AsarPath = path.resolve(tmpApp, 'Contents', 'Resources', 'app-arm64.asar');
+ await fs.copy(path.resolve(opts.arm64AppPath, 'Contents', 'Resources', 'app.asar'), arm64AsarPath);
+ const arm64Unpacked = path.resolve(opts.arm64AppPath, 'Contents', 'Resources', 'app.asar.unpacked');
+ if (await fs.pathExists(arm64Unpacked)) {
+ await fs.copy(arm64Unpacked, path.resolve(tmpApp, 'Contents', 'Resources', 'app-arm64.asar.unpacked'));
+ }
+ const entryAsar = path.resolve(tmpDir, 'entry-asar');
+ await fs.mkdir(entryAsar);
+ await fs.copy(path.resolve(__dirname, '..', '..', 'entry-asar', 'has-asar.js'), path.resolve(entryAsar, 'index.js'));
+ let pj = JSON.parse((await asar.extractFile(path.resolve(opts.x64AppPath, 'Contents', 'Resources', 'app.asar'), 'package.json')).toString('utf8'));
+ pj.main = 'index.js';
+ await fs.writeJson(path.resolve(entryAsar, 'package.json'), pj);
+ const asarPath = path.resolve(tmpApp, 'Contents', 'Resources', 'app.asar');
+ await asar.createPackage(entryAsar, asarPath);
+ generatedIntegrity['Resources/app.asar'] = generateAsarIntegrity(asarPath);
+ generatedIntegrity['Resources/app-x64.asar'] = generateAsarIntegrity(x64AsarPath);
+ generatedIntegrity['Resources/app-arm64.asar'] = generateAsarIntegrity(arm64AsarPath);
+ }
+ else {
+ d('x64 and arm64 asars are the same');
+ generatedIntegrity['Resources/app.asar'] = generateAsarIntegrity(path.resolve(tmpApp, 'Contents', 'Resources', 'app.asar'));
+ }
+ }
+ const plistFiles = x64Files.filter((f) => f.type === AppFileType.INFO_PLIST);
+ for (const plistFile of plistFiles) {
+ const x64PlistPath = path.resolve(opts.x64AppPath, plistFile.relativePath);
+ const arm64PlistPath = path.resolve(opts.arm64AppPath, plistFile.relativePath);
+ const _a = plist.parse(await fs.readFile(x64PlistPath, 'utf8')), { ElectronAsarIntegrity: x64Integrity } = _a, x64Plist = __rest(_a, ["ElectronAsarIntegrity"]);
+ const _b = plist.parse(await fs.readFile(arm64PlistPath, 'utf8')), { ElectronAsarIntegrity: arm64Integrity } = _b, arm64Plist = __rest(_b, ["ElectronAsarIntegrity"]);
+ if (JSON.stringify(x64Plist) !== JSON.stringify(arm64Plist)) {
+ throw new Error(`Expected all Info.plist files to be identical when ignoring integrity when creating a universal build but "${plistFile.relativePath}" was not`);
+ }
+ const injectAsarIntegrity = !opts.infoPlistsToIgnore ||
+ minimatch(plistFile.relativePath, opts.infoPlistsToIgnore, { matchBase: true });
+ const mergedPlist = injectAsarIntegrity
+ ? Object.assign(Object.assign({}, x64Plist), { ElectronAsarIntegrity: generatedIntegrity }) : Object.assign({}, x64Plist);
+ await fs.writeFile(path.resolve(tmpApp, plistFile.relativePath), plist.build(mergedPlist));
+ }
+ for (const snapshotsFile of arm64Files.filter((f) => f.type === AppFileType.SNAPSHOT)) {
+ d('copying snapshot file', snapshotsFile.relativePath, 'to target application');
+ await fs.copy(path.resolve(opts.arm64AppPath, snapshotsFile.relativePath), path.resolve(tmpApp, snapshotsFile.relativePath));
+ }
+ d('moving final universal app to target destination');
+ await fs.mkdirp(path.dirname(opts.outAppPath));
+ await spawn('mv', [tmpApp, opts.outAppPath]);
+ }
+ catch (err) {
+ throw err;
+ }
+ finally {
+ await fs.remove(tmpDir);
+ }
+};
+//# sourceMappingURL=index.js.map \ No newline at end of file
diff --git a/desktop/node_modules/@electron/universal/dist/esm/index.js.map b/desktop/node_modules/@electron/universal/dist/esm/index.js.map
new file mode 100644
index 0000000..cfef7a3
--- /dev/null
+++ b/desktop/node_modules/@electron/universal/dist/esm/index.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"} \ No newline at end of file
diff --git a/desktop/node_modules/@electron/universal/dist/esm/sha.d.ts b/desktop/node_modules/@electron/universal/dist/esm/sha.d.ts
new file mode 100644
index 0000000..1c0daaa
--- /dev/null
+++ b/desktop/node_modules/@electron/universal/dist/esm/sha.d.ts
@@ -0,0 +1 @@
+export declare const sha: (filePath: string) => Promise<any>;
diff --git a/desktop/node_modules/@electron/universal/dist/esm/sha.js b/desktop/node_modules/@electron/universal/dist/esm/sha.js
new file mode 100644
index 0000000..fbc7498
--- /dev/null
+++ b/desktop/node_modules/@electron/universal/dist/esm/sha.js
@@ -0,0 +1,16 @@
+import * as fs from 'fs-extra';
+import * as crypto from 'crypto';
+import { d } from './debug';
+export const sha = async (filePath) => {
+ d('hashing', filePath);
+ const hash = crypto.createHash('sha256');
+ hash.setEncoding('hex');
+ const fileStream = fs.createReadStream(filePath);
+ fileStream.pipe(hash);
+ await new Promise((resolve, reject) => {
+ fileStream.on('end', () => resolve());
+ fileStream.on('error', (err) => reject(err));
+ });
+ return hash.read();
+};
+//# sourceMappingURL=sha.js.map \ No newline at end of file
diff --git a/desktop/node_modules/@electron/universal/dist/esm/sha.js.map b/desktop/node_modules/@electron/universal/dist/esm/sha.js.map
new file mode 100644
index 0000000..794d901
--- /dev/null
+++ b/desktop/node_modules/@electron/universal/dist/esm/sha.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"sha.js","sourceRoot":"","sources":["../../src/sha.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAC;AACjC,OAAO,EAAE,CAAC,EAAE,MAAM,SAAS,CAAC;AAE5B,MAAM,CAAC,MAAM,GAAG,GAAG,KAAK,EAAE,QAAgB,EAAE,EAAE;IAC5C,CAAC,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IACvB,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;IACzC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IACxB,MAAM,UAAU,GAAG,EAAE,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IACjD,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtB,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACpC,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;QACtC,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IACH,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC;AACrB,CAAC,CAAC"} \ No newline at end of file
diff --git a/desktop/node_modules/@electron/universal/entry-asar/has-asar.js b/desktop/node_modules/@electron/universal/entry-asar/has-asar.js
new file mode 100644
index 0000000..369a7f7
--- /dev/null
+++ b/desktop/node_modules/@electron/universal/entry-asar/has-asar.js
@@ -0,0 +1,26 @@
+const path = require('path');
+
+if (process.arch === 'arm64') {
+ setPaths('arm64');
+} else {
+ setPaths('x64');
+}
+
+function setPaths(platform) {
+ // This should return the full path, ending in something like
+ // Notion.app/Contents/Resources/app.asar
+ const appPath = app.getAppPath();
+ const asarFile = `app-${platform}.asar`;
+
+ // Maybe we'll handle this in Electron one day
+ if (path.basename(appPath) === 'app.asar') {
+ const platformAppPath = path.join(path.dirname(appPath), asarFile);
+
+ // This is an undocumented API. It exists.
+ app.setAppPath(platformAppPath);
+ }
+
+ process._archPath = require.resolve(`../${asarFile}`);
+}
+
+require(process._archPath);
diff --git a/desktop/node_modules/@electron/universal/entry-asar/no-asar.js b/desktop/node_modules/@electron/universal/entry-asar/no-asar.js
new file mode 100644
index 0000000..abe0af5
--- /dev/null
+++ b/desktop/node_modules/@electron/universal/entry-asar/no-asar.js
@@ -0,0 +1,24 @@
+if (process.arch === 'arm64') {
+ setPaths('arm64');
+} else {
+ setPaths('x64');
+}
+
+function setPaths(platform) {
+ // This should return the full path, ending in something like
+ // Notion.app/Contents/Resources/app
+ const appPath = app.getAppPath();
+ const appFolder = `app-${platform}`;
+
+ // Maybe we'll handle this in Electron one day
+ if (path.basename(appPath) === 'app') {
+ const platformAppPath = path.join(path.dirname(appPath), appFolder);
+
+ // This is an undocumented private API. It exists.
+ app.setAppPath(platformAppPath);
+ }
+
+ process._archPath = require.resolve(`../${appFolder}`);
+}
+
+require(process._archPath);
diff --git a/desktop/node_modules/@electron/universal/node_modules/fs-extra/CHANGELOG.md b/desktop/node_modules/@electron/universal/node_modules/fs-extra/CHANGELOG.md
new file mode 100644
index 0000000..225fdca
--- /dev/null
+++ b/desktop/node_modules/@electron/universal/node_modules/fs-extra/CHANGELOG.md
@@ -0,0 +1,902 @@
+9.1.0 / 2021-01-19
+------------------
+
+- Add promise support for `fs.rm()` ([#841](https://github.com/jprichardson/node-fs-extra/issues/841), [#860](https://github.com/jprichardson/node-fs-extra/pull/860))
+- Upgrade universalify for performance improvments ([#825](https://github.com/jprichardson/node-fs-extra/pull/825))
+
+9.0.1 / 2020-06-03
+------------------
+
+- Fix issue with `ensureFile()` when used with Jest on Windows ([#804](https://github.com/jprichardson/node-fs-extra/issues/804), [#805](https://github.com/jprichardson/node-fs-extra/pull/805))
+- Remove unneeded `process.umask()` call ([#791](https://github.com/jprichardson/node-fs-extra/pull/791))
+- Docs improvements ([#753](https://github.com/jprichardson/node-fs-extra/pull/753), [#795](https://github.com/jprichardson/node-fs-extra/pull/795), [#797](https://github.com/jprichardson/node-fs-extra/pull/797))
+
+9.0.0 / 2020-03-19
+------------------
+
+### Breaking changes
+
+- Requires Node.js version 10 or greater ([#725](https://github.com/jprichardson/node-fs-extra/issues/725), [#751](https://github.com/jprichardson/node-fs-extra/pull/751))
+- Switched `ensureDir*` to use a fork of https://github.com/sindresorhus/make-dir to make use of native recursive `fs.mkdir` where possible ([#619](https://github.com/jprichardson/node-fs-extra/issues/619), [#756](https://github.com/jprichardson/node-fs-extra/pull/756))
+- Properly preserve `atime` for `copy*` with `preserveTimestamps` option ([#633](https://github.com/jprichardson/node-fs-extra/pull/633))
+
+**The following changes, allthough technically breaking, will not affect the vast majority of users:**
+
+- `outputJson` now outputs objects as they were when the function was called, even if they are mutated later ([#702](https://github.com/jprichardson/node-fs-extra/issues/702), [#768](https://github.com/jprichardson/node-fs-extra/pull/768))
+- Cannot pass `null` as an options parameter to `*Json*` methods ([#745](https://github.com/jprichardson/node-fs-extra/issues/745), [#768](https://github.com/jprichardson/node-fs-extra/pull/768))
+
+### Improvements
+
+- Add promise shims for `fs.writev` & `fs.opendir` ([#747](https://github.com/jprichardson/node-fs-extra/pull/747))
+- Better errors for `ensureFile` ([#696](https://github.com/jprichardson/node-fs-extra/issues/696), [#744](https://github.com/jprichardson/node-fs-extra/pull/744))
+- Better file comparison for older Node versions ([#694](https://github.com/jprichardson/node-fs-extra/pull/694))
+
+### Miscellaneous changes
+- Peformance optimizations ([#762](https://github.com/jprichardson/node-fs-extra/issues/762), [#764](https://github.com/jprichardson/node-fs-extra/pull/764))
+- Add missing documentation for aliases ([#758](https://github.com/jprichardson/node-fs-extra/issues/758), [#766](https://github.com/jprichardson/node-fs-extra/pull/766))
+- Update `universalify` dependency ([#767](https://github.com/jprichardson/node-fs-extra/pull/767))
+
+8.1.0 / 2019-06-28
+------------------
+
+- Add support for promisified `fs.realpath.native` in Node v9.2+ ([#650](https://github.com/jprichardson/node-fs-extra/issues/650), [#682](https://github.com/jprichardson/node-fs-extra/pull/682))
+- Update `graceful-fs` dependency ([#700](https://github.com/jprichardson/node-fs-extra/pull/700))
+- Use `graceful-fs` everywhere ([#700](https://github.com/jprichardson/node-fs-extra/pull/700))
+
+8.0.1 / 2019-05-13
+------------------
+
+- Fix bug `Maximum call stack size exceeded` error in `util/stat` ([#679](https://github.com/jprichardson/node-fs-extra/pull/679))
+
+8.0.0 / 2019-05-11
+------------------
+
+**NOTE:** Node.js v6 support is deprecated, and will be dropped in the next major release.
+
+- Use `renameSync()` under the hood in `moveSync()`
+- Fix bug with bind-mounted directories in `copy*()` ([#613](https://github.com/jprichardson/node-fs-extra/issues/613), [#618](https://github.com/jprichardson/node-fs-extra/pull/618))
+- Fix bug in `move()` with case-insensitive file systems
+- Use `fs.stat()`'s `bigint` option in `copy*()` & `move*()` where possible ([#657](https://github.com/jprichardson/node-fs-extra/issues/657))
+
+7.0.1 / 2018-11-07
+------------------
+
+- Fix `removeSync()` on Windows, in some cases, it would error out with `ENOTEMPTY` ([#646](https://github.com/jprichardson/node-fs-extra/pull/646))
+- Document `mode` option for `ensureDir*()` ([#587](https://github.com/jprichardson/node-fs-extra/pull/587))
+- Don't include documentation files in npm package tarball ([#642](https://github.com/jprichardson/node-fs-extra/issues/642), [#643](https://github.com/jprichardson/node-fs-extra/pull/643))
+
+7.0.0 / 2018-07-16
+------------------
+
+- **BREAKING:** Refine `copy*()` handling of symlinks to properly detect symlinks that point to the same file. ([#582](https://github.com/jprichardson/node-fs-extra/pull/582))
+- Fix bug with copying write-protected directories ([#600](https://github.com/jprichardson/node-fs-extra/pull/600))
+- Universalify `fs.lchmod()` ([#596](https://github.com/jprichardson/node-fs-extra/pull/596))
+- Add `engines` field to `package.json` ([#580](https://github.com/jprichardson/node-fs-extra/pull/580))
+
+6.0.1 / 2018-05-09
+------------------
+
+- Fix `fs.promises` `ExperimentalWarning` on Node v10.1.0 ([#578](https://github.com/jprichardson/node-fs-extra/pull/578))
+
+6.0.0 / 2018-05-01
+------------------
+
+- Drop support for Node.js versions 4, 5, & 7 ([#564](https://github.com/jprichardson/node-fs-extra/pull/564))
+- Rewrite `move` to use `fs.rename` where possible ([#549](https://github.com/jprichardson/node-fs-extra/pull/549))
+- Don't convert relative paths to absolute paths for `filter` ([#554](https://github.com/jprichardson/node-fs-extra/pull/554))
+- `copy*`'s behavior when `preserveTimestamps` is `false` has been OS-dependent since 5.0.0, but that's now explicitly noted in the docs ([#563](https://github.com/jprichardson/node-fs-extra/pull/563))
+- Fix subdirectory detection for `copy*` & `move*` ([#541](https://github.com/jprichardson/node-fs-extra/pull/541))
+- Handle case-insensitive paths correctly in `copy*` ([#568](https://github.com/jprichardson/node-fs-extra/pull/568))
+
+5.0.0 / 2017-12-11
+------------------
+
+Significant refactor of `copy()` & `copySync()`, including breaking changes. No changes to other functions in this release.
+
+Huge thanks to **[@manidlou](https://github.com/manidlou)** for doing most of the work on this release.
+
+- The `filter` option can no longer be a RegExp (must be a function). This was deprecated since fs-extra v1.0.0. [#512](https://github.com/jprichardson/node-fs-extra/pull/512)
+- `copy()`'s `filter` option can now be a function that returns a Promise. [#518](https://github.com/jprichardson/node-fs-extra/pull/518)
+- `copy()` & `copySync()` now use `fs.copyFile()`/`fs.copyFileSync()` in environments that support it (currently Node 8.5.0+). Older Node versions still get the old implementation. [#505](https://github.com/jprichardson/node-fs-extra/pull/505)
+- Don't allow copying a directory into itself. [#83](https://github.com/jprichardson/node-fs-extra/issues/83)
+- Handle copying between identical files. [#198](https://github.com/jprichardson/node-fs-extra/issues/198)
+- Error out when copying an empty folder to a path that already exists. [#464](https://github.com/jprichardson/node-fs-extra/issues/464)
+- Don't create `dest`'s parent if the `filter` function aborts the `copy()` operation. [#517](https://github.com/jprichardson/node-fs-extra/pull/517)
+- Fix `writeStream` not being closed if there was an error in `copy()`. [#516](https://github.com/jprichardson/node-fs-extra/pull/516)
+
+4.0.3 / 2017-12-05
+------------------
+
+- Fix wrong `chmod` values in `fs.remove()` [#501](https://github.com/jprichardson/node-fs-extra/pull/501)
+- Fix `TypeError` on systems that don't have some `fs` operations like `lchown` [#520](https://github.com/jprichardson/node-fs-extra/pull/520)
+
+4.0.2 / 2017-09-12
+------------------
+
+- Added `EOL` option to `writeJson*` & `outputJson*` (via upgrade to jsonfile v4)
+- Added promise support to [`fs.copyFile()`](https://nodejs.org/api/fs.html#fs_fs_copyfile_src_dest_flags_callback) in Node 8.5+
+- Added `.js` extension to `main` field in `package.json` for better tooling compatibility. [#485](https://github.com/jprichardson/node-fs-extra/pull/485)
+
+4.0.1 / 2017-07-31
+------------------
+
+### Fixed
+
+- Previously, `ensureFile()` & `ensureFileSync()` would do nothing if the path was a directory. Now, they error out for consistency with `ensureDir()`. [#465](https://github.com/jprichardson/node-fs-extra/issues/465), [#466](https://github.com/jprichardson/node-fs-extra/pull/466), [#470](https://github.com/jprichardson/node-fs-extra/issues/470)
+
+4.0.0 / 2017-07-14
+------------------
+
+### Changed
+
+- **BREAKING:** The promisified versions of `fs.read()` & `fs.write()` now return objects. See [the docs](docs/fs-read-write.md) for details. [#436](https://github.com/jprichardson/node-fs-extra/issues/436), [#449](https://github.com/jprichardson/node-fs-extra/pull/449)
+- `fs.move()` now errors out when destination is a subdirectory of source. [#458](https://github.com/jprichardson/node-fs-extra/pull/458)
+- Applied upstream fixes from `rimraf` to `fs.remove()` & `fs.removeSync()`. [#459](https://github.com/jprichardson/node-fs-extra/pull/459)
+
+### Fixed
+
+- Got `fs.outputJSONSync()` working again; it was broken due to refactoring. [#428](https://github.com/jprichardson/node-fs-extra/pull/428)
+
+Also clarified the docs in a few places.
+
+3.0.1 / 2017-05-04
+------------------
+
+- Fix bug in `move()` & `moveSync()` when source and destination are the same, and source does not exist. [#415](https://github.com/jprichardson/node-fs-extra/pull/415)
+
+3.0.0 / 2017-04-27
+------------------
+
+### Added
+
+- **BREAKING:** Added Promise support. All asynchronous native fs methods and fs-extra methods now return a promise if the callback is not passed. [#403](https://github.com/jprichardson/node-fs-extra/pull/403)
+- `pathExists()`, a replacement for the deprecated `fs.exists`. `pathExists` has a normal error-first callback signature. Also added `pathExistsSync`, an alias to `fs.existsSync`, for completeness. [#406](https://github.com/jprichardson/node-fs-extra/pull/406)
+
+### Removed
+
+- **BREAKING:** Removed support for setting the default spaces for `writeJson()`, `writeJsonSync()`, `outputJson()`, & `outputJsonSync()`. This was undocumented. [#402](https://github.com/jprichardson/node-fs-extra/pull/402)
+
+### Changed
+
+- Upgraded jsonfile dependency to v3.0.0:
+ - **BREAKING:** Changed behavior of `throws` option for `readJsonSync()`; now does not throw filesystem errors when `throws` is `false`.
+- **BREAKING:** `writeJson()`, `writeJsonSync()`, `outputJson()`, & `outputJsonSync()` now output minified JSON by default for consistency with `JSON.stringify()`; set the `spaces` option to `2` to override this new behavior. [#402](https://github.com/jprichardson/node-fs-extra/pull/402)
+- Use `Buffer.allocUnsafe()` instead of `new Buffer()` in environments that support it. [#394](https://github.com/jprichardson/node-fs-extra/pull/394)
+
+### Fixed
+
+- `removeSync()` silently failed on Windows in some cases. Now throws an `EBUSY` error. [#408](https://github.com/jprichardson/node-fs-extra/pull/408)
+
+2.1.2 / 2017-03-16
+------------------
+
+### Fixed
+
+- Weird windows bug that resulted in `ensureDir()`'s callback being called twice in some cases. This bug may have also affected `remove()`. See [#392](https://github.com/jprichardson/node-fs-extra/issues/392), [#393](https://github.com/jprichardson/node-fs-extra/pull/393)
+
+2.1.1 / 2017-03-15
+------------------
+
+### Fixed
+
+- Reverted [`5597bd`](https://github.com/jprichardson/node-fs-extra/commit/5597bd5b67f7d060f5f5bf26e9635be48330f5d7), this broke compatibility with Node.js versions v4+ but less than `v4.5.0`.
+- Remove `Buffer.alloc()` usage in `moveSync()`.
+
+2.1.0 / 2017-03-15
+------------------
+
+Thanks to [Mani Maghsoudlou (@manidlou)](https://github.com/manidlou) & [Jan Peer Stöcklmair (@JPeer264)](https://github.com/JPeer264) for their extraordinary help with this release!
+
+### Added
+- `moveSync()` See [#309], [#381](https://github.com/jprichardson/node-fs-extra/pull/381). ([@manidlou](https://github.com/manidlou))
+- `copy()` and `copySync()`'s `filter` option now gets the destination path passed as the second parameter. [#366](https://github.com/jprichardson/node-fs-extra/pull/366) ([@manidlou](https://github.com/manidlou))
+
+### Changed
+- Use `Buffer.alloc()` instead of deprecated `new Buffer()` in `copySync()`. [#380](https://github.com/jprichardson/node-fs-extra/pull/380) ([@manidlou](https://github.com/manidlou))
+- Refactored entire codebase to use ES6 features supported by Node.js v4+ [#355](https://github.com/jprichardson/node-fs-extra/issues/355). [(@JPeer264)](https://github.com/JPeer264)
+- Refactored docs. ([@manidlou](https://github.com/manidlou))
+
+### Fixed
+
+- `move()` shouldn't error out when source and dest are the same. [#377](https://github.com/jprichardson/node-fs-extra/issues/377), [#378](https://github.com/jprichardson/node-fs-extra/pull/378) ([@jdalton](https://github.com/jdalton))
+
+2.0.0 / 2017-01-16
+------------------
+
+### Removed
+- **BREAKING:** Removed support for Node `v0.12`. The Node foundation stopped officially supporting it
+on Jan 1st, 2017.
+- **BREAKING:** Remove `walk()` and `walkSync()`. `walkSync()` was only part of `fs-extra` for a little
+over two months. Use [klaw](https://github.com/jprichardson/node-klaw) instead of `walk()`, in fact, `walk()` was just
+an alias to klaw. For `walkSync()` use [klaw-sync](https://github.com/mawni/node-klaw-sync). See: [#338], [#339]
+
+### Changed
+- **BREAKING:** Renamed `clobber` to `overwrite`. This affects `copy()`, `copySync()`, and `move()`. [#330], [#333]
+- Moved docs, to `docs/`. [#340]
+
+### Fixed
+- Apply filters to directories in `copySync()` like in `copy()`. [#324]
+- A specific condition when disk is under heavy use, `copy()` can fail. [#326]
+
+
+1.0.0 / 2016-11-01
+------------------
+
+After five years of development, we finally have reach the 1.0.0 milestone! Big thanks goes
+to [Ryan Zim](https://github.com/RyanZim) for leading the charge on this release!
+
+### Added
+- `walkSync()`
+
+### Changed
+- **BREAKING**: dropped Node v0.10 support.
+- disabled `rimaf` globbing, wasn't used. [#280]
+- deprecate `copy()/copySync()` option `filter` if it's a `RegExp`. `filter` should now be a function.
+- inline `rimraf`. This is temporary and was done because `rimraf` depended upon the beefy `glob` which `fs-extra` does not use. [#300]
+
+### Fixed
+- bug fix proper closing of file handle on `utimesMillis()` [#271]
+- proper escaping of files with dollar signs [#291]
+- `copySync()` failed if user didn't own file. [#199], [#301]
+
+
+0.30.0 / 2016-04-28
+-------------------
+- Brought back Node v0.10 support. I didn't realize there was still demand. Official support will end **2016-10-01**.
+
+0.29.0 / 2016-04-27
+-------------------
+- **BREAKING**: removed support for Node v0.10. If you still want to use Node v0.10, everything should work except for `ensureLink()/ensureSymlink()`. Node v0.12 is still supported but will be dropped in the near future as well.
+
+0.28.0 / 2016-04-17
+-------------------
+- **BREAKING**: removed `createOutputStream()`. Use https://www.npmjs.com/package/create-output-stream. See: [#192][#192]
+- `mkdirs()/mkdirsSync()` check for invalid win32 path chars. See: [#209][#209], [#237][#237]
+- `mkdirs()/mkdirsSync()` if drive not mounted, error. See: [#93][#93]
+
+0.27.0 / 2016-04-15
+-------------------
+- add `dereference` option to `copySync()`. [#235][#235]
+
+0.26.7 / 2016-03-16
+-------------------
+- fixed `copy()` if source and dest are the same. [#230][#230]
+
+0.26.6 / 2016-03-15
+-------------------
+- fixed if `emptyDir()` does not have a callback: [#229][#229]
+
+0.26.5 / 2016-01-27
+-------------------
+- `copy()` with two arguments (w/o callback) was broken. See: [#215][#215]
+
+0.26.4 / 2016-01-05
+-------------------
+- `copySync()` made `preserveTimestamps` default consistent with `copy()` which is `false`. See: [#208][#208]
+
+0.26.3 / 2015-12-17
+-------------------
+- fixed `copy()` hangup in copying blockDevice / characterDevice / `/dev/null`. See: [#193][#193]
+
+0.26.2 / 2015-11-02
+-------------------
+- fixed `outputJson{Sync}()` spacing adherence to `fs.spaces`
+
+0.26.1 / 2015-11-02
+-------------------
+- fixed `copySync()` when `clogger=true` and the destination is read only. See: [#190][#190]
+
+0.26.0 / 2015-10-25
+-------------------
+- extracted the `walk()` function into its own module [`klaw`](https://github.com/jprichardson/node-klaw).
+
+0.25.0 / 2015-10-24
+-------------------
+- now has a file walker `walk()`
+
+0.24.0 / 2015-08-28
+-------------------
+- removed alias `delete()` and `deleteSync()`. See: [#171][#171]
+
+0.23.1 / 2015-08-07
+-------------------
+- Better handling of errors for `move()` when moving across devices. [#170][#170]
+- `ensureSymlink()` and `ensureLink()` should not throw errors if link exists. [#169][#169]
+
+0.23.0 / 2015-08-06
+-------------------
+- added `ensureLink{Sync}()` and `ensureSymlink{Sync}()`. See: [#165][#165]
+
+0.22.1 / 2015-07-09
+-------------------
+- Prevent calling `hasMillisResSync()` on module load. See: [#149][#149].
+Fixes regression that was introduced in `0.21.0`.
+
+0.22.0 / 2015-07-09
+-------------------
+- preserve permissions / ownership in `copy()`. See: [#54][#54]
+
+0.21.0 / 2015-07-04
+-------------------
+- add option to preserve timestamps in `copy()` and `copySync()`. See: [#141][#141]
+- updated `graceful-fs@3.x` to `4.x`. This brings in features from `amazing-graceful-fs` (much cleaner code / less hacks)
+
+0.20.1 / 2015-06-23
+-------------------
+- fixed regression caused by latest jsonfile update: See: https://github.com/jprichardson/node-jsonfile/issues/26
+
+0.20.0 / 2015-06-19
+-------------------
+- removed `jsonfile` aliases with `File` in the name, they weren't documented and probably weren't in use e.g.
+this package had both `fs.readJsonFile` and `fs.readJson` that were aliases to each other, now use `fs.readJson`.
+- preliminary walker created. Intentionally not documented. If you use it, it will almost certainly change and break your code.
+- started moving tests inline
+- upgraded to `jsonfile@2.1.0`, can now pass JSON revivers/replacers to `readJson()`, `writeJson()`, `outputJson()`
+
+0.19.0 / 2015-06-08
+-------------------
+- `fs.copy()` had support for Node v0.8, dropped support
+
+0.18.4 / 2015-05-22
+-------------------
+- fixed license field according to this: [#136][#136] and https://github.com/npm/npm/releases/tag/v2.10.0
+
+0.18.3 / 2015-05-08
+-------------------
+- bugfix: handle `EEXIST` when clobbering on some Linux systems. [#134][#134]
+
+0.18.2 / 2015-04-17
+-------------------
+- bugfix: allow `F_OK` ([#120][#120])
+
+0.18.1 / 2015-04-15
+-------------------
+- improved windows support for `move()` a bit. https://github.com/jprichardson/node-fs-extra/commit/92838980f25dc2ee4ec46b43ee14d3c4a1d30c1b
+- fixed a lot of tests for Windows (appveyor)
+
+0.18.0 / 2015-03-31
+-------------------
+- added `emptyDir()` and `emptyDirSync()`
+
+0.17.0 / 2015-03-28
+-------------------
+- `copySync` added `clobber` option (before always would clobber, now if `clobber` is `false` it throws an error if the destination exists).
+**Only works with files at the moment.**
+- `createOutputStream()` added. See: [#118][#118]
+
+0.16.5 / 2015-03-08
+-------------------
+- fixed `fs.move` when `clobber` is `true` and destination is a directory, it should clobber. [#114][#114]
+
+0.16.4 / 2015-03-01
+-------------------
+- `fs.mkdirs` fix infinite loop on Windows. See: See https://github.com/substack/node-mkdirp/pull/74 and https://github.com/substack/node-mkdirp/issues/66
+
+0.16.3 / 2015-01-28
+-------------------
+- reverted https://github.com/jprichardson/node-fs-extra/commit/1ee77c8a805eba5b99382a2591ff99667847c9c9
+
+
+0.16.2 / 2015-01-28
+-------------------
+- fixed `fs.copy` for Node v0.8 (support is temporary and will be removed in the near future)
+
+0.16.1 / 2015-01-28
+-------------------
+- if `setImmediate` is not available, fall back to `process.nextTick`
+
+0.16.0 / 2015-01-28
+-------------------
+- bugfix `fs.move()` into itself. Closes [#104]
+- bugfix `fs.move()` moving directory across device. Closes [#108]
+- added coveralls support
+- bugfix: nasty multiple callback `fs.copy()` bug. Closes [#98]
+- misc fs.copy code cleanups
+
+0.15.0 / 2015-01-21
+-------------------
+- dropped `ncp`, imported code in
+- because of previous, now supports `io.js`
+- `graceful-fs` is now a dependency
+
+0.14.0 / 2015-01-05
+-------------------
+- changed `copy`/`copySync` from `fs.copy(src, dest, [filters], callback)` to `fs.copy(src, dest, [options], callback)` [#100][#100]
+- removed mockfs tests for mkdirp (this may be temporary, but was getting in the way of other tests)
+
+0.13.0 / 2014-12-10
+-------------------
+- removed `touch` and `touchSync` methods (they didn't handle permissions like UNIX touch)
+- updated `"ncp": "^0.6.0"` to `"ncp": "^1.0.1"`
+- imported `mkdirp` => `minimist` and `mkdirp` are no longer dependences, should now appease people who wanted `mkdirp` to be `--use_strict` safe. See [#59]([#59][#59])
+
+0.12.0 / 2014-09-22
+-------------------
+- copy symlinks in `copySync()` [#85][#85]
+
+0.11.1 / 2014-09-02
+-------------------
+- bugfix `copySync()` preserve file permissions [#80][#80]
+
+0.11.0 / 2014-08-11
+-------------------
+- upgraded `"ncp": "^0.5.1"` to `"ncp": "^0.6.0"`
+- upgrade `jsonfile": "^1.2.0"` to `jsonfile": "^2.0.0"` => on write, json files now have `\n` at end. Also adds `options.throws` to `readJsonSync()`
+see https://github.com/jprichardson/node-jsonfile#readfilesyncfilename-options for more details.
+
+0.10.0 / 2014-06-29
+------------------
+* bugfix: upgaded `"jsonfile": "~1.1.0"` to `"jsonfile": "^1.2.0"`, bumped minor because of `jsonfile` dep change
+from `~` to `^`. [#67]
+
+0.9.1 / 2014-05-22
+------------------
+* removed Node.js `0.8.x` support, `0.9.0` was published moments ago and should have been done there
+
+0.9.0 / 2014-05-22
+------------------
+* upgraded `ncp` from `~0.4.2` to `^0.5.1`, [#58]
+* upgraded `rimraf` from `~2.2.6` to `^2.2.8`
+* upgraded `mkdirp` from `0.3.x` to `^0.5.0`
+* added methods `ensureFile()`, `ensureFileSync()`
+* added methods `ensureDir()`, `ensureDirSync()` [#31]
+* added `move()` method. From: https://github.com/andrewrk/node-mv
+
+
+0.8.1 / 2013-10-24
+------------------
+* copy failed to return an error to the callback if a file doesn't exist (ulikoehler [#38], [#39])
+
+0.8.0 / 2013-10-14
+------------------
+* `filter` implemented on `copy()` and `copySync()`. (Srirangan / [#36])
+
+0.7.1 / 2013-10-12
+------------------
+* `copySync()` implemented (Srirangan / [#33])
+* updated to the latest `jsonfile` version `1.1.0` which gives `options` params for the JSON methods. Closes [#32]
+
+0.7.0 / 2013-10-07
+------------------
+* update readme conventions
+* `copy()` now works if destination directory does not exist. Closes [#29]
+
+0.6.4 / 2013-09-05
+------------------
+* changed `homepage` field in package.json to remove NPM warning
+
+0.6.3 / 2013-06-28
+------------------
+* changed JSON spacing default from `4` to `2` to follow Node conventions
+* updated `jsonfile` dep
+* updated `rimraf` dep
+
+0.6.2 / 2013-06-28
+------------------
+* added .npmignore, [#25]
+
+0.6.1 / 2013-05-14
+------------------
+* modified for `strict` mode, closes [#24]
+* added `outputJson()/outputJsonSync()`, closes [#23]
+
+0.6.0 / 2013-03-18
+------------------
+* removed node 0.6 support
+* added node 0.10 support
+* upgraded to latest `ncp` and `rimraf`.
+* optional `graceful-fs` support. Closes [#17]
+
+
+0.5.0 / 2013-02-03
+------------------
+* Removed `readTextFile`.
+* Renamed `readJSONFile` to `readJSON` and `readJson`, same with write.
+* Restructured documentation a bit. Added roadmap.
+
+0.4.0 / 2013-01-28
+------------------
+* Set default spaces in `jsonfile` from 4 to 2.
+* Updated `testutil` deps for tests.
+* Renamed `touch()` to `createFile()`
+* Added `outputFile()` and `outputFileSync()`
+* Changed creation of testing diretories so the /tmp dir is not littered.
+* Added `readTextFile()` and `readTextFileSync()`.
+
+0.3.2 / 2012-11-01
+------------------
+* Added `touch()` and `touchSync()` methods.
+
+0.3.1 / 2012-10-11
+------------------
+* Fixed some stray globals.
+
+0.3.0 / 2012-10-09
+------------------
+* Removed all CoffeeScript from tests.
+* Renamed `mkdir` to `mkdirs`/`mkdirp`.
+
+0.2.1 / 2012-09-11
+------------------
+* Updated `rimraf` dep.
+
+0.2.0 / 2012-09-10
+------------------
+* Rewrote module into JavaScript. (Must still rewrite tests into JavaScript)
+* Added all methods of [jsonfile](https://github.com/jprichardson/node-jsonfile)
+* Added Travis-CI.
+
+0.1.3 / 2012-08-13
+------------------
+* Added method `readJSONFile`.
+
+0.1.2 / 2012-06-15
+------------------
+* Bug fix: `deleteSync()` didn't exist.
+* Verified Node v0.8 compatibility.
+
+0.1.1 / 2012-06-15
+------------------
+* Fixed bug in `remove()`/`delete()` that wouldn't execute the function if a callback wasn't passed.
+
+0.1.0 / 2012-05-31
+------------------
+* Renamed `copyFile()` to `copy()`. `copy()` can now copy directories (recursively) too.
+* Renamed `rmrf()` to `remove()`.
+* `remove()` aliased with `delete()`.
+* Added `mkdirp` capabilities. Named: `mkdir()`. Hides Node.js native `mkdir()`.
+* Instead of exporting the native `fs` module with new functions, I now copy over the native methods to a new object and export that instead.
+
+0.0.4 / 2012-03-14
+------------------
+* Removed CoffeeScript dependency
+
+0.0.3 / 2012-01-11
+------------------
+* Added methods rmrf and rmrfSync
+* Moved tests from Jasmine to Mocha
+
+
+[#344]: https://github.com/jprichardson/node-fs-extra/issues/344 "Licence Year"
+[#343]: https://github.com/jprichardson/node-fs-extra/pull/343 "Add klaw-sync link to readme"
+[#342]: https://github.com/jprichardson/node-fs-extra/pull/342 "allow preserveTimestamps when use move"
+[#341]: https://github.com/jprichardson/node-fs-extra/issues/341 "mkdirp(path.dirname(dest) in move() logic needs cleaning up [question]"
+[#340]: https://github.com/jprichardson/node-fs-extra/pull/340 "Move docs to seperate docs folder [documentation]"
+[#339]: https://github.com/jprichardson/node-fs-extra/pull/339 "Remove walk() & walkSync() [feature-walk]"
+[#338]: https://github.com/jprichardson/node-fs-extra/issues/338 "Remove walk() and walkSync() [feature-walk]"
+[#337]: https://github.com/jprichardson/node-fs-extra/issues/337 "copy doesn't return a yieldable value"
+[#336]: https://github.com/jprichardson/node-fs-extra/pull/336 "Docs enhanced walk sync [documentation, feature-walk]"
+[#335]: https://github.com/jprichardson/node-fs-extra/pull/335 "Refactor move() tests [feature-move]"
+[#334]: https://github.com/jprichardson/node-fs-extra/pull/334 "Cleanup lib/move/index.js [feature-move]"
+[#333]: https://github.com/jprichardson/node-fs-extra/pull/333 "Rename clobber to overwrite [feature-copy, feature-move]"
+[#332]: https://github.com/jprichardson/node-fs-extra/pull/332 "BREAKING: Drop Node v0.12 & io.js support"
+[#331]: https://github.com/jprichardson/node-fs-extra/issues/331 "Add support for chmodr [enhancement, future]"
+[#330]: https://github.com/jprichardson/node-fs-extra/pull/330 "BREAKING: Do not error when copy destination exists & clobber: false [feature-copy]"
+[#329]: https://github.com/jprichardson/node-fs-extra/issues/329 "Does .walk() scale to large directories? [question]"
+[#328]: https://github.com/jprichardson/node-fs-extra/issues/328 "Copying files corrupts [feature-copy, needs-confirmed]"
+[#327]: https://github.com/jprichardson/node-fs-extra/pull/327 "Use writeStream 'finish' event instead of 'close' [bug, feature-copy]"
+[#326]: https://github.com/jprichardson/node-fs-extra/issues/326 "fs.copy fails with chmod error when disk under heavy use [bug, feature-copy]"
+[#325]: https://github.com/jprichardson/node-fs-extra/issues/325 "ensureDir is difficult to promisify [enhancement]"
+[#324]: https://github.com/jprichardson/node-fs-extra/pull/324 "copySync() should apply filter to directories like copy() [bug, feature-copy]"
+[#323]: https://github.com/jprichardson/node-fs-extra/issues/323 "Support for `dest` being a directory when using `copy*()`?"
+[#322]: https://github.com/jprichardson/node-fs-extra/pull/322 "Add fs-promise as fs-extra-promise alternative"
+[#321]: https://github.com/jprichardson/node-fs-extra/issues/321 "fs.copy() with clobber set to false return EEXIST error [feature-copy]"
+[#320]: https://github.com/jprichardson/node-fs-extra/issues/320 "fs.copySync: Error: EPERM: operation not permitted, unlink "
+[#319]: https://github.com/jprichardson/node-fs-extra/issues/319 "Create directory if not exists"
+[#318]: https://github.com/jprichardson/node-fs-extra/issues/318 "Support glob patterns [enhancement, future]"
+[#317]: https://github.com/jprichardson/node-fs-extra/pull/317 "Adding copy sync test for src file without write perms"
+[#316]: https://github.com/jprichardson/node-fs-extra/pull/316 "Remove move()'s broken limit option [feature-move]"
+[#315]: https://github.com/jprichardson/node-fs-extra/pull/315 "Fix move clobber tests to work around graceful-fs bug."
+[#314]: https://github.com/jprichardson/node-fs-extra/issues/314 "move() limit option [documentation, enhancement, feature-move]"
+[#313]: https://github.com/jprichardson/node-fs-extra/pull/313 "Test that remove() ignores glob characters."
+[#312]: https://github.com/jprichardson/node-fs-extra/pull/312 "Enhance walkSync() to return items with path and stats [feature-walk]"
+[#311]: https://github.com/jprichardson/node-fs-extra/issues/311 "move() not work when dest name not provided [feature-move]"
+[#310]: https://github.com/jprichardson/node-fs-extra/issues/310 "Edit walkSync to return items like what walk emits [documentation, enhancement, feature-walk]"
+[#309]: https://github.com/jprichardson/node-fs-extra/issues/309 "moveSync support [enhancement, feature-move]"
+[#308]: https://github.com/jprichardson/node-fs-extra/pull/308 "Fix incorrect anchor link"
+[#307]: https://github.com/jprichardson/node-fs-extra/pull/307 "Fix coverage"
+[#306]: https://github.com/jprichardson/node-fs-extra/pull/306 "Update devDeps, fix lint error"
+[#305]: https://github.com/jprichardson/node-fs-extra/pull/305 "Re-add Coveralls"
+[#304]: https://github.com/jprichardson/node-fs-extra/pull/304 "Remove path-is-absolute [enhancement]"
+[#303]: https://github.com/jprichardson/node-fs-extra/pull/303 "Document copySync filter inconsistency [documentation, feature-copy]"
+[#302]: https://github.com/jprichardson/node-fs-extra/pull/302 "fix(console): depreciated -> deprecated"
+[#301]: https://github.com/jprichardson/node-fs-extra/pull/301 "Remove chmod call from copySync [feature-copy]"
+[#300]: https://github.com/jprichardson/node-fs-extra/pull/300 "Inline Rimraf [enhancement, feature-move, feature-remove]"
+[#299]: https://github.com/jprichardson/node-fs-extra/pull/299 "Warn when filter is a RegExp [feature-copy]"
+[#298]: https://github.com/jprichardson/node-fs-extra/issues/298 "API Docs [documentation]"
+[#297]: https://github.com/jprichardson/node-fs-extra/pull/297 "Warn about using preserveTimestamps on 32-bit node"
+[#296]: https://github.com/jprichardson/node-fs-extra/pull/296 "Improve EEXIST error message for copySync [enhancement]"
+[#295]: https://github.com/jprichardson/node-fs-extra/pull/295 "Depreciate using regular expressions for copy's filter option [documentation]"
+[#294]: https://github.com/jprichardson/node-fs-extra/pull/294 "BREAKING: Refactor lib/copy/ncp.js [feature-copy]"
+[#293]: https://github.com/jprichardson/node-fs-extra/pull/293 "Update CI configs"
+[#292]: https://github.com/jprichardson/node-fs-extra/issues/292 "Rewrite lib/copy/ncp.js [enhancement, feature-copy]"
+[#291]: https://github.com/jprichardson/node-fs-extra/pull/291 "Escape '$' in replacement string for async file copying"
+[#290]: https://github.com/jprichardson/node-fs-extra/issues/290 "Exclude files pattern while copying using copy.config.js [question]"
+[#289]: https://github.com/jprichardson/node-fs-extra/pull/289 "(Closes #271) lib/util/utimes: properly close file descriptors in the event of an error"
+[#288]: https://github.com/jprichardson/node-fs-extra/pull/288 "(Closes #271) lib/util/utimes: properly close file descriptors in the event of an error"
+[#287]: https://github.com/jprichardson/node-fs-extra/issues/287 "emptyDir() callback arguments are inconsistent [enhancement, feature-remove]"
+[#286]: https://github.com/jprichardson/node-fs-extra/pull/286 "Added walkSync function"
+[#285]: https://github.com/jprichardson/node-fs-extra/issues/285 "CITGM test failing on s390"
+[#284]: https://github.com/jprichardson/node-fs-extra/issues/284 "outputFile method is missing a check to determine if existing item is a folder or not"
+[#283]: https://github.com/jprichardson/node-fs-extra/pull/283 "Apply filter also on directories and symlinks for copySync()"
+[#282]: https://github.com/jprichardson/node-fs-extra/pull/282 "Apply filter also on directories and symlinks for copySync()"
+[#281]: https://github.com/jprichardson/node-fs-extra/issues/281 "remove function executes 'successfully' but doesn't do anything?"
+[#280]: https://github.com/jprichardson/node-fs-extra/pull/280 "Disable rimraf globbing"
+[#279]: https://github.com/jprichardson/node-fs-extra/issues/279 "Some code is vendored instead of included [awaiting-reply]"
+[#278]: https://github.com/jprichardson/node-fs-extra/issues/278 "copy() does not preserve file/directory ownership"
+[#277]: https://github.com/jprichardson/node-fs-extra/pull/277 "Mention defaults for clobber and dereference options"
+[#276]: https://github.com/jprichardson/node-fs-extra/issues/276 "Cannot connect to Shared Folder [awaiting-reply]"
+[#275]: https://github.com/jprichardson/node-fs-extra/issues/275 "EMFILE, too many open files on Mac OS with JSON API"
+[#274]: https://github.com/jprichardson/node-fs-extra/issues/274 "Use with memory-fs? [enhancement, future]"
+[#273]: https://github.com/jprichardson/node-fs-extra/pull/273 "tests: rename `remote.test.js` to `remove.test.js`"
+[#272]: https://github.com/jprichardson/node-fs-extra/issues/272 "Copy clobber flag never err even when true [bug, feature-copy]"
+[#271]: https://github.com/jprichardson/node-fs-extra/issues/271 "Unclosed file handle on futimes error"
+[#270]: https://github.com/jprichardson/node-fs-extra/issues/270 "copy not working as desired on Windows [feature-copy, platform-windows]"
+[#269]: https://github.com/jprichardson/node-fs-extra/issues/269 "Copying with preserveTimeStamps: true is inaccurate using 32bit node [feature-copy]"
+[#268]: https://github.com/jprichardson/node-fs-extra/pull/268 "port fix for mkdirp issue #111"
+[#267]: https://github.com/jprichardson/node-fs-extra/issues/267 "WARN deprecated wrench@1.5.9: wrench.js is deprecated!"
+[#266]: https://github.com/jprichardson/node-fs-extra/issues/266 "fs-extra"
+[#265]: https://github.com/jprichardson/node-fs-extra/issues/265 "Link the `fs.stat fs.exists` etc. methods for replace the `fs` module forever?"
+[#264]: https://github.com/jprichardson/node-fs-extra/issues/264 "Renaming a file using move fails when a file inside is open (at least on windows) [wont-fix]"
+[#263]: https://github.com/jprichardson/node-fs-extra/issues/263 "ENOSYS: function not implemented, link [needs-confirmed]"
+[#262]: https://github.com/jprichardson/node-fs-extra/issues/262 "Add .exists() and .existsSync()"
+[#261]: https://github.com/jprichardson/node-fs-extra/issues/261 "Cannot read property 'prototype' of undefined"
+[#260]: https://github.com/jprichardson/node-fs-extra/pull/260 "use more specific path for method require"
+[#259]: https://github.com/jprichardson/node-fs-extra/issues/259 "Feature Request: isEmpty"
+[#258]: https://github.com/jprichardson/node-fs-extra/issues/258 "copy files does not preserve file timestamp"
+[#257]: https://github.com/jprichardson/node-fs-extra/issues/257 "Copying a file on windows fails"
+[#256]: https://github.com/jprichardson/node-fs-extra/pull/256 "Updated Readme "
+[#255]: https://github.com/jprichardson/node-fs-extra/issues/255 "Update rimraf required version"
+[#254]: https://github.com/jprichardson/node-fs-extra/issues/254 "request for readTree, readTreeSync, walkSync method"
+[#253]: https://github.com/jprichardson/node-fs-extra/issues/253 "outputFile does not touch mtime when file exists"
+[#252]: https://github.com/jprichardson/node-fs-extra/pull/252 "Fixing problem when copying file with no write permission"
+[#251]: https://github.com/jprichardson/node-fs-extra/issues/251 "Just wanted to say thank you"
+[#250]: https://github.com/jprichardson/node-fs-extra/issues/250 "`fs.remove()` not removing files (works with `rm -rf`)"
+[#249]: https://github.com/jprichardson/node-fs-extra/issues/249 "Just a Question ... Remove Servers"
+[#248]: https://github.com/jprichardson/node-fs-extra/issues/248 "Allow option to not preserve permissions for copy"
+[#247]: https://github.com/jprichardson/node-fs-extra/issues/247 "Add TypeScript typing directly in the fs-extra package"
+[#246]: https://github.com/jprichardson/node-fs-extra/issues/246 "fse.remove() && fse.removeSync() don't throw error on ENOENT file"
+[#245]: https://github.com/jprichardson/node-fs-extra/issues/245 "filter for empty dir [enhancement]"
+[#244]: https://github.com/jprichardson/node-fs-extra/issues/244 "copySync doesn't apply the filter to directories"
+[#243]: https://github.com/jprichardson/node-fs-extra/issues/243 "Can I request fs.walk() to be synchronous?"
+[#242]: https://github.com/jprichardson/node-fs-extra/issues/242 "Accidentally truncates file names ending with $$ [bug, feature-copy]"
+[#241]: https://github.com/jprichardson/node-fs-extra/pull/241 "Remove link to createOutputStream"
+[#240]: https://github.com/jprichardson/node-fs-extra/issues/240 "walkSync request"
+[#239]: https://github.com/jprichardson/node-fs-extra/issues/239 "Depreciate regular expressions for copy's filter [documentation, feature-copy]"
+[#238]: https://github.com/jprichardson/node-fs-extra/issues/238 "Can't write to files while in a worker thread."
+[#237]: https://github.com/jprichardson/node-fs-extra/issues/237 ".ensureDir(..) fails silently when passed an invalid path..."
+[#236]: https://github.com/jprichardson/node-fs-extra/issues/236 "[Removed] Filed under wrong repo"
+[#235]: https://github.com/jprichardson/node-fs-extra/pull/235 "Adds symlink dereference option to `fse.copySync` (#191)"
+[#234]: https://github.com/jprichardson/node-fs-extra/issues/234 "ensureDirSync fails silent when EACCES: permission denied on travis-ci"
+[#233]: https://github.com/jprichardson/node-fs-extra/issues/233 "please make sure the first argument in callback is error object [feature-copy]"
+[#232]: https://github.com/jprichardson/node-fs-extra/issues/232 "Copy a folder content to its child folder. "
+[#231]: https://github.com/jprichardson/node-fs-extra/issues/231 "Adding read/write/output functions for YAML"
+[#230]: https://github.com/jprichardson/node-fs-extra/pull/230 "throw error if src and dest are the same to avoid zeroing out + test"
+[#229]: https://github.com/jprichardson/node-fs-extra/pull/229 "fix 'TypeError: callback is not a function' in emptyDir"
+[#228]: https://github.com/jprichardson/node-fs-extra/pull/228 "Throw error when target is empty so file is not accidentally zeroed out"
+[#227]: https://github.com/jprichardson/node-fs-extra/issues/227 "Uncatchable errors when there are invalid arguments [feature-move]"
+[#226]: https://github.com/jprichardson/node-fs-extra/issues/226 "Moving to the current directory"
+[#225]: https://github.com/jprichardson/node-fs-extra/issues/225 "EBUSY: resource busy or locked, unlink"
+[#224]: https://github.com/jprichardson/node-fs-extra/issues/224 "fse.copy ENOENT error"
+[#223]: https://github.com/jprichardson/node-fs-extra/issues/223 "Suspicious behavior of fs.existsSync"
+[#222]: https://github.com/jprichardson/node-fs-extra/pull/222 "A clearer description of emtpyDir function"
+[#221]: https://github.com/jprichardson/node-fs-extra/pull/221 "Update README.md"
+[#220]: https://github.com/jprichardson/node-fs-extra/pull/220 "Non-breaking feature: add option 'passStats' to copy methods."
+[#219]: https://github.com/jprichardson/node-fs-extra/pull/219 "Add closing parenthesis in copySync example"
+[#218]: https://github.com/jprichardson/node-fs-extra/pull/218 "fix #187 #70 options.filter bug"
+[#217]: https://github.com/jprichardson/node-fs-extra/pull/217 "fix #187 #70 options.filter bug"
+[#216]: https://github.com/jprichardson/node-fs-extra/pull/216 "fix #187 #70 options.filter bug"
+[#215]: https://github.com/jprichardson/node-fs-extra/pull/215 "fse.copy throws error when only src and dest provided [bug, documentation, feature-copy]"
+[#214]: https://github.com/jprichardson/node-fs-extra/pull/214 "Fixing copySync anchor tag"
+[#213]: https://github.com/jprichardson/node-fs-extra/issues/213 "Merge extfs with this repo"
+[#212]: https://github.com/jprichardson/node-fs-extra/pull/212 "Update year to 2016 in README.md and LICENSE"
+[#211]: https://github.com/jprichardson/node-fs-extra/issues/211 "Not copying all files"
+[#210]: https://github.com/jprichardson/node-fs-extra/issues/210 "copy/copySync behave differently when copying a symbolic file [bug, documentation, feature-copy]"
+[#209]: https://github.com/jprichardson/node-fs-extra/issues/209 "In Windows invalid directory name causes infinite loop in ensureDir(). [bug]"
+[#208]: https://github.com/jprichardson/node-fs-extra/pull/208 "fix options.preserveTimestamps to false in copy-sync by default [feature-copy]"
+[#207]: https://github.com/jprichardson/node-fs-extra/issues/207 "Add `compare` suite of functions"
+[#206]: https://github.com/jprichardson/node-fs-extra/issues/206 "outputFileSync"
+[#205]: https://github.com/jprichardson/node-fs-extra/issues/205 "fix documents about copy/copySync [documentation, feature-copy]"
+[#204]: https://github.com/jprichardson/node-fs-extra/pull/204 "allow copy of block and character device files"
+[#203]: https://github.com/jprichardson/node-fs-extra/issues/203 "copy method's argument options couldn't be undefined [bug, feature-copy]"
+[#202]: https://github.com/jprichardson/node-fs-extra/issues/202 "why there is not a walkSync method?"
+[#201]: https://github.com/jprichardson/node-fs-extra/issues/201 "clobber for directories [feature-copy, future]"
+[#200]: https://github.com/jprichardson/node-fs-extra/issues/200 "'copySync' doesn't work in sync"
+[#199]: https://github.com/jprichardson/node-fs-extra/issues/199 "fs.copySync fails if user does not own file [bug, feature-copy]"
+[#198]: https://github.com/jprichardson/node-fs-extra/issues/198 "handle copying between identical files [feature-copy]"
+[#197]: https://github.com/jprichardson/node-fs-extra/issues/197 "Missing documentation for `outputFile` `options` 3rd parameter [documentation]"
+[#196]: https://github.com/jprichardson/node-fs-extra/issues/196 "copy filter: async function and/or function called with `fs.stat` result [future]"
+[#195]: https://github.com/jprichardson/node-fs-extra/issues/195 "How to override with outputFile?"
+[#194]: https://github.com/jprichardson/node-fs-extra/pull/194 "allow ensureFile(Sync) to provide data to be written to created file"
+[#193]: https://github.com/jprichardson/node-fs-extra/issues/193 "`fs.copy` fails silently if source file is /dev/null [bug, feature-copy]"
+[#192]: https://github.com/jprichardson/node-fs-extra/issues/192 "Remove fs.createOutputStream()"
+[#191]: https://github.com/jprichardson/node-fs-extra/issues/191 "How to copy symlinks to target as normal folders [feature-copy]"
+[#190]: https://github.com/jprichardson/node-fs-extra/pull/190 "copySync to overwrite destination file if readonly and clobber true"
+[#189]: https://github.com/jprichardson/node-fs-extra/pull/189 "move.test fix to support CRLF on Windows"
+[#188]: https://github.com/jprichardson/node-fs-extra/issues/188 "move.test failing on windows platform"
+[#187]: https://github.com/jprichardson/node-fs-extra/issues/187 "Not filter each file, stops on first false [feature-copy]"
+[#186]: https://github.com/jprichardson/node-fs-extra/issues/186 "Do you need a .size() function in this module? [future]"
+[#185]: https://github.com/jprichardson/node-fs-extra/issues/185 "Doesn't work on NodeJS v4.x"
+[#184]: https://github.com/jprichardson/node-fs-extra/issues/184 "CLI equivalent for fs-extra"
+[#183]: https://github.com/jprichardson/node-fs-extra/issues/183 "with clobber true, copy and copySync behave differently if destination file is read only [bug, feature-copy]"
+[#182]: https://github.com/jprichardson/node-fs-extra/issues/182 "ensureDir(dir, callback) second callback parameter not specified"
+[#181]: https://github.com/jprichardson/node-fs-extra/issues/181 "Add ability to remove file securely [enhancement, wont-fix]"
+[#180]: https://github.com/jprichardson/node-fs-extra/issues/180 "Filter option doesn't work the same way in copy and copySync [bug, feature-copy]"
+[#179]: https://github.com/jprichardson/node-fs-extra/issues/179 "Include opendir"
+[#178]: https://github.com/jprichardson/node-fs-extra/issues/178 "ENOTEMPTY is thrown on removeSync "
+[#177]: https://github.com/jprichardson/node-fs-extra/issues/177 "fix `remove()` wildcards (introduced by rimraf) [feature-remove]"
+[#176]: https://github.com/jprichardson/node-fs-extra/issues/176 "createOutputStream doesn't emit 'end' event"
+[#175]: https://github.com/jprichardson/node-fs-extra/issues/175 "[Feature Request].moveSync support [feature-move, future]"
+[#174]: https://github.com/jprichardson/node-fs-extra/pull/174 "Fix copy formatting and document options.filter"
+[#173]: https://github.com/jprichardson/node-fs-extra/issues/173 "Feature Request: writeJson should mkdirs"
+[#172]: https://github.com/jprichardson/node-fs-extra/issues/172 "rename `clobber` flags to `overwrite`"
+[#171]: https://github.com/jprichardson/node-fs-extra/issues/171 "remove unnecessary aliases"
+[#170]: https://github.com/jprichardson/node-fs-extra/pull/170 "More robust handling of errors moving across virtual drives"
+[#169]: https://github.com/jprichardson/node-fs-extra/pull/169 "suppress ensureLink & ensureSymlink dest exists error"
+[#168]: https://github.com/jprichardson/node-fs-extra/pull/168 "suppress ensurelink dest exists error"
+[#167]: https://github.com/jprichardson/node-fs-extra/pull/167 "Adds basic (string, buffer) support for ensureFile content [future]"
+[#166]: https://github.com/jprichardson/node-fs-extra/pull/166 "Adds basic (string, buffer) support for ensureFile content"
+[#165]: https://github.com/jprichardson/node-fs-extra/pull/165 "ensure for link & symlink"
+[#164]: https://github.com/jprichardson/node-fs-extra/issues/164 "Feature Request: ensureFile to take optional argument for file content"
+[#163]: https://github.com/jprichardson/node-fs-extra/issues/163 "ouputJson not formatted out of the box [bug]"
+[#162]: https://github.com/jprichardson/node-fs-extra/pull/162 "ensure symlink & link"
+[#161]: https://github.com/jprichardson/node-fs-extra/pull/161 "ensure symlink & link"
+[#160]: https://github.com/jprichardson/node-fs-extra/pull/160 "ensure symlink & link"
+[#159]: https://github.com/jprichardson/node-fs-extra/pull/159 "ensure symlink & link"
+[#158]: https://github.com/jprichardson/node-fs-extra/issues/158 "Feature Request: ensureLink and ensureSymlink methods"
+[#157]: https://github.com/jprichardson/node-fs-extra/issues/157 "writeJson isn't formatted"
+[#156]: https://github.com/jprichardson/node-fs-extra/issues/156 "Promise.promisifyAll doesn't work for some methods"
+[#155]: https://github.com/jprichardson/node-fs-extra/issues/155 "Readme"
+[#154]: https://github.com/jprichardson/node-fs-extra/issues/154 "/tmp/millis-test-sync"
+[#153]: https://github.com/jprichardson/node-fs-extra/pull/153 "Make preserveTimes also work on read-only files. Closes #152"
+[#152]: https://github.com/jprichardson/node-fs-extra/issues/152 "fs.copy fails for read-only files with preserveTimestamp=true [feature-copy]"
+[#151]: https://github.com/jprichardson/node-fs-extra/issues/151 "TOC does not work correctly on npm [documentation]"
+[#150]: https://github.com/jprichardson/node-fs-extra/issues/150 "Remove test file fixtures, create with code."
+[#149]: https://github.com/jprichardson/node-fs-extra/issues/149 "/tmp/millis-test-sync"
+[#148]: https://github.com/jprichardson/node-fs-extra/issues/148 "split out `Sync` methods in documentation"
+[#147]: https://github.com/jprichardson/node-fs-extra/issues/147 "Adding rmdirIfEmpty"
+[#146]: https://github.com/jprichardson/node-fs-extra/pull/146 "ensure test.js works"
+[#145]: https://github.com/jprichardson/node-fs-extra/issues/145 "Add `fs.exists` and `fs.existsSync` if it doesn't exist."
+[#144]: https://github.com/jprichardson/node-fs-extra/issues/144 "tests failing"
+[#143]: https://github.com/jprichardson/node-fs-extra/issues/143 "update graceful-fs"
+[#142]: https://github.com/jprichardson/node-fs-extra/issues/142 "PrependFile Feature"
+[#141]: https://github.com/jprichardson/node-fs-extra/pull/141 "Add option to preserve timestamps"
+[#140]: https://github.com/jprichardson/node-fs-extra/issues/140 "Json file reading fails with 'utf8'"
+[#139]: https://github.com/jprichardson/node-fs-extra/pull/139 "Preserve file timestamp on copy. Closes #138"
+[#138]: https://github.com/jprichardson/node-fs-extra/issues/138 "Preserve timestamps on copying files"
+[#137]: https://github.com/jprichardson/node-fs-extra/issues/137 "outputFile/outputJson: Unexpected end of input"
+[#136]: https://github.com/jprichardson/node-fs-extra/pull/136 "Update license attribute"
+[#135]: https://github.com/jprichardson/node-fs-extra/issues/135 "emptyDir throws Error if no callback is provided"
+[#134]: https://github.com/jprichardson/node-fs-extra/pull/134 "Handle EEXIST error when clobbering dir"
+[#133]: https://github.com/jprichardson/node-fs-extra/pull/133 "Travis runs with `sudo: false`"
+[#132]: https://github.com/jprichardson/node-fs-extra/pull/132 "isDirectory method"
+[#131]: https://github.com/jprichardson/node-fs-extra/issues/131 "copySync is not working iojs 1.8.4 on linux [feature-copy]"
+[#130]: https://github.com/jprichardson/node-fs-extra/pull/130 "Please review additional features."
+[#129]: https://github.com/jprichardson/node-fs-extra/pull/129 "can you review this feature?"
+[#128]: https://github.com/jprichardson/node-fs-extra/issues/128 "fsExtra.move(filepath, newPath) broken;"
+[#127]: https://github.com/jprichardson/node-fs-extra/issues/127 "consider using fs.access to remove deprecated warnings for fs.exists"
+[#126]: https://github.com/jprichardson/node-fs-extra/issues/126 " TypeError: Object #<Object> has no method 'access'"
+[#125]: https://github.com/jprichardson/node-fs-extra/issues/125 "Question: What do the *Sync function do different from non-sync"
+[#124]: https://github.com/jprichardson/node-fs-extra/issues/124 "move with clobber option 'ENOTEMPTY'"
+[#123]: https://github.com/jprichardson/node-fs-extra/issues/123 "Only copy the content of a directory"
+[#122]: https://github.com/jprichardson/node-fs-extra/pull/122 "Update section links in README to match current section ids."
+[#121]: https://github.com/jprichardson/node-fs-extra/issues/121 "emptyDir is undefined"
+[#120]: https://github.com/jprichardson/node-fs-extra/issues/120 "usage bug caused by shallow cloning methods of 'graceful-fs'"
+[#119]: https://github.com/jprichardson/node-fs-extra/issues/119 "mkdirs and ensureDir never invoke callback and consume CPU indefinitely if provided a path with invalid characters on Windows"
+[#118]: https://github.com/jprichardson/node-fs-extra/pull/118 "createOutputStream"
+[#117]: https://github.com/jprichardson/node-fs-extra/pull/117 "Fixed issue with slash separated paths on windows"
+[#116]: https://github.com/jprichardson/node-fs-extra/issues/116 "copySync can only copy directories not files [documentation, feature-copy]"
+[#115]: https://github.com/jprichardson/node-fs-extra/issues/115 ".Copy & .CopySync [feature-copy]"
+[#114]: https://github.com/jprichardson/node-fs-extra/issues/114 "Fails to move (rename) directory to non-empty directory even with clobber: true"
+[#113]: https://github.com/jprichardson/node-fs-extra/issues/113 "fs.copy seems to callback early if the destination file already exists"
+[#112]: https://github.com/jprichardson/node-fs-extra/pull/112 "Copying a file into an existing directory"
+[#111]: https://github.com/jprichardson/node-fs-extra/pull/111 "Moving a file into an existing directory "
+[#110]: https://github.com/jprichardson/node-fs-extra/pull/110 "Moving a file into an existing directory"
+[#109]: https://github.com/jprichardson/node-fs-extra/issues/109 "fs.move across windows drives fails"
+[#108]: https://github.com/jprichardson/node-fs-extra/issues/108 "fse.move directories across multiple devices doesn't work"
+[#107]: https://github.com/jprichardson/node-fs-extra/pull/107 "Check if dest path is an existing dir and copy or move source in it"
+[#106]: https://github.com/jprichardson/node-fs-extra/issues/106 "fse.copySync crashes while copying across devices D: [feature-copy]"
+[#105]: https://github.com/jprichardson/node-fs-extra/issues/105 "fs.copy hangs on iojs"
+[#104]: https://github.com/jprichardson/node-fs-extra/issues/104 "fse.move deletes folders [bug]"
+[#103]: https://github.com/jprichardson/node-fs-extra/issues/103 "Error: EMFILE with copy"
+[#102]: https://github.com/jprichardson/node-fs-extra/issues/102 "touch / touchSync was removed ?"
+[#101]: https://github.com/jprichardson/node-fs-extra/issues/101 "fs-extra promisified"
+[#100]: https://github.com/jprichardson/node-fs-extra/pull/100 "copy: options object or filter to pass to ncp"
+[#99]: https://github.com/jprichardson/node-fs-extra/issues/99 "ensureDir() modes [future]"
+[#98]: https://github.com/jprichardson/node-fs-extra/issues/98 "fs.copy() incorrect async behavior [bug]"
+[#97]: https://github.com/jprichardson/node-fs-extra/pull/97 "use path.join; fix copySync bug"
+[#96]: https://github.com/jprichardson/node-fs-extra/issues/96 "destFolderExists in copySync is always undefined."
+[#95]: https://github.com/jprichardson/node-fs-extra/pull/95 "Using graceful-ncp instead of ncp"
+[#94]: https://github.com/jprichardson/node-fs-extra/issues/94 "Error: EEXIST, file already exists '../mkdirp/bin/cmd.js' on fs.copySync() [enhancement, feature-copy]"
+[#93]: https://github.com/jprichardson/node-fs-extra/issues/93 "Confusing error if drive not mounted [enhancement]"
+[#92]: https://github.com/jprichardson/node-fs-extra/issues/92 "Problems with Bluebird"
+[#91]: https://github.com/jprichardson/node-fs-extra/issues/91 "fs.copySync('/test', '/haha') is different with 'cp -r /test /haha' [enhancement]"
+[#90]: https://github.com/jprichardson/node-fs-extra/issues/90 "Folder creation and file copy is Happening in 64 bit machine but not in 32 bit machine"
+[#89]: https://github.com/jprichardson/node-fs-extra/issues/89 "Error: EEXIST using fs-extra's fs.copy to copy a directory on Windows"
+[#88]: https://github.com/jprichardson/node-fs-extra/issues/88 "Stacking those libraries"
+[#87]: https://github.com/jprichardson/node-fs-extra/issues/87 "createWriteStream + outputFile = ?"
+[#86]: https://github.com/jprichardson/node-fs-extra/issues/86 "no moveSync?"
+[#85]: https://github.com/jprichardson/node-fs-extra/pull/85 "Copy symlinks in copySync"
+[#84]: https://github.com/jprichardson/node-fs-extra/issues/84 "Push latest version to npm ?"
+[#83]: https://github.com/jprichardson/node-fs-extra/issues/83 "Prevent copying a directory into itself [feature-copy]"
+[#82]: https://github.com/jprichardson/node-fs-extra/pull/82 "README updates for move"
+[#81]: https://github.com/jprichardson/node-fs-extra/issues/81 "fd leak after fs.move"
+[#80]: https://github.com/jprichardson/node-fs-extra/pull/80 "Preserve file mode in copySync"
+[#79]: https://github.com/jprichardson/node-fs-extra/issues/79 "fs.copy only .html file empty"
+[#78]: https://github.com/jprichardson/node-fs-extra/pull/78 "copySync was not applying filters to directories"
+[#77]: https://github.com/jprichardson/node-fs-extra/issues/77 "Create README reference to bluebird"
+[#76]: https://github.com/jprichardson/node-fs-extra/issues/76 "Create README reference to typescript"
+[#75]: https://github.com/jprichardson/node-fs-extra/issues/75 "add glob as a dep? [question]"
+[#74]: https://github.com/jprichardson/node-fs-extra/pull/74 "including new emptydir module"
+[#73]: https://github.com/jprichardson/node-fs-extra/pull/73 "add dependency status in readme"
+[#72]: https://github.com/jprichardson/node-fs-extra/pull/72 "Use svg instead of png to get better image quality"
+[#71]: https://github.com/jprichardson/node-fs-extra/issues/71 "fse.copy not working on Windows 7 x64 OS, but, copySync does work"
+[#70]: https://github.com/jprichardson/node-fs-extra/issues/70 "Not filter each file, stops on first false [bug]"
+[#69]: https://github.com/jprichardson/node-fs-extra/issues/69 "How to check if folder exist and read the folder name"
+[#68]: https://github.com/jprichardson/node-fs-extra/issues/68 "consider flag to readJsonSync (throw false) [enhancement]"
+[#67]: https://github.com/jprichardson/node-fs-extra/issues/67 "docs for readJson incorrectly states that is accepts options"
+[#66]: https://github.com/jprichardson/node-fs-extra/issues/66 "ENAMETOOLONG"
+[#65]: https://github.com/jprichardson/node-fs-extra/issues/65 "exclude filter in fs.copy"
+[#64]: https://github.com/jprichardson/node-fs-extra/issues/64 "Announce: mfs - monitor your fs-extra calls"
+[#63]: https://github.com/jprichardson/node-fs-extra/issues/63 "Walk"
+[#62]: https://github.com/jprichardson/node-fs-extra/issues/62 "npm install fs-extra doesn't work"
+[#61]: https://github.com/jprichardson/node-fs-extra/issues/61 "No longer supports node 0.8 due to use of `^` in package.json dependencies"
+[#60]: https://github.com/jprichardson/node-fs-extra/issues/60 "chmod & chown for mkdirs"
+[#59]: https://github.com/jprichardson/node-fs-extra/issues/59 "Consider including mkdirp and making fs-extra '--use_strict' safe [question]"
+[#58]: https://github.com/jprichardson/node-fs-extra/issues/58 "Stack trace not included in fs.copy error"
+[#57]: https://github.com/jprichardson/node-fs-extra/issues/57 "Possible to include wildcards in delete?"
+[#56]: https://github.com/jprichardson/node-fs-extra/issues/56 "Crash when have no access to write to destination file in copy "
+[#55]: https://github.com/jprichardson/node-fs-extra/issues/55 "Is it possible to have any console output similar to Grunt copy module?"
+[#54]: https://github.com/jprichardson/node-fs-extra/issues/54 "`copy` does not preserve file ownership and permissons"
+[#53]: https://github.com/jprichardson/node-fs-extra/issues/53 "outputFile() - ability to write data in appending mode"
+[#52]: https://github.com/jprichardson/node-fs-extra/pull/52 "This fixes (what I think) is a bug in copySync"
+[#51]: https://github.com/jprichardson/node-fs-extra/pull/51 "Add a Bitdeli Badge to README"
+[#50]: https://github.com/jprichardson/node-fs-extra/issues/50 "Replace mechanism in createFile"
+[#49]: https://github.com/jprichardson/node-fs-extra/pull/49 "update rimraf to v2.2.6"
+[#48]: https://github.com/jprichardson/node-fs-extra/issues/48 "fs.copy issue [bug]"
+[#47]: https://github.com/jprichardson/node-fs-extra/issues/47 "Bug in copy - callback called on readStream 'close' - Fixed in ncp 0.5.0"
+[#46]: https://github.com/jprichardson/node-fs-extra/pull/46 "update copyright year"
+[#45]: https://github.com/jprichardson/node-fs-extra/pull/45 "Added note about fse.outputFile() being the one that overwrites"
+[#44]: https://github.com/jprichardson/node-fs-extra/pull/44 "Proposal: Stream support"
+[#43]: https://github.com/jprichardson/node-fs-extra/issues/43 "Better error reporting "
+[#42]: https://github.com/jprichardson/node-fs-extra/issues/42 "Performance issue?"
+[#41]: https://github.com/jprichardson/node-fs-extra/pull/41 "There does seem to be a synchronous version now"
+[#40]: https://github.com/jprichardson/node-fs-extra/issues/40 "fs.copy throw unexplained error ENOENT, utime "
+[#39]: https://github.com/jprichardson/node-fs-extra/pull/39 "Added regression test for copy() return callback on error"
+[#38]: https://github.com/jprichardson/node-fs-extra/pull/38 "Return err in copy() fstat cb, because stat could be undefined or null"
+[#37]: https://github.com/jprichardson/node-fs-extra/issues/37 "Maybe include a line reader? [enhancement, question]"
+[#36]: https://github.com/jprichardson/node-fs-extra/pull/36 "`filter` parameter `fs.copy` and `fs.copySync`"
+[#35]: https://github.com/jprichardson/node-fs-extra/pull/35 "`filter` parameter `fs.copy` and `fs.copySync` "
+[#34]: https://github.com/jprichardson/node-fs-extra/issues/34 "update docs to include options for JSON methods [enhancement]"
+[#33]: https://github.com/jprichardson/node-fs-extra/pull/33 "fs_extra.copySync"
+[#32]: https://github.com/jprichardson/node-fs-extra/issues/32 "update to latest jsonfile [enhancement]"
+[#31]: https://github.com/jprichardson/node-fs-extra/issues/31 "Add ensure methods [enhancement]"
+[#30]: https://github.com/jprichardson/node-fs-extra/issues/30 "update package.json optional dep `graceful-fs`"
+[#29]: https://github.com/jprichardson/node-fs-extra/issues/29 "Copy failing if dest directory doesn't exist. Is this intended?"
+[#28]: https://github.com/jprichardson/node-fs-extra/issues/28 "homepage field must be a string url. Deleted."
+[#27]: https://github.com/jprichardson/node-fs-extra/issues/27 "Update Readme"
+[#26]: https://github.com/jprichardson/node-fs-extra/issues/26 "Add readdir recursive method. [enhancement]"
+[#25]: https://github.com/jprichardson/node-fs-extra/pull/25 "adding an `.npmignore` file"
+[#24]: https://github.com/jprichardson/node-fs-extra/issues/24 "[bug] cannot run in strict mode [bug]"
+[#23]: https://github.com/jprichardson/node-fs-extra/issues/23 "`writeJSON()` should create parent directories"
+[#22]: https://github.com/jprichardson/node-fs-extra/pull/22 "Add a limit option to mkdirs()"
+[#21]: https://github.com/jprichardson/node-fs-extra/issues/21 "touch() in 0.10.0"
+[#20]: https://github.com/jprichardson/node-fs-extra/issues/20 "fs.remove yields callback before directory is really deleted"
+[#19]: https://github.com/jprichardson/node-fs-extra/issues/19 "fs.copy err is empty array"
+[#18]: https://github.com/jprichardson/node-fs-extra/pull/18 "Exposed copyFile Function"
+[#17]: https://github.com/jprichardson/node-fs-extra/issues/17 "Use `require('graceful-fs')` if found instead of `require('fs')`"
+[#16]: https://github.com/jprichardson/node-fs-extra/pull/16 "Update README.md"
+[#15]: https://github.com/jprichardson/node-fs-extra/issues/15 "Implement cp -r but sync aka copySync. [enhancement]"
+[#14]: https://github.com/jprichardson/node-fs-extra/issues/14 "fs.mkdirSync is broken in 0.3.1"
+[#13]: https://github.com/jprichardson/node-fs-extra/issues/13 "Thoughts on including a directory tree / file watcher? [enhancement, question]"
+[#12]: https://github.com/jprichardson/node-fs-extra/issues/12 "copyFile & copyFileSync are global"
+[#11]: https://github.com/jprichardson/node-fs-extra/issues/11 "Thoughts on including a file walker? [enhancement, question]"
+[#10]: https://github.com/jprichardson/node-fs-extra/issues/10 "move / moveFile API [enhancement]"
+[#9]: https://github.com/jprichardson/node-fs-extra/issues/9 "don't import normal fs stuff into fs-extra"
+[#8]: https://github.com/jprichardson/node-fs-extra/pull/8 "Update rimraf to latest version"
+[#6]: https://github.com/jprichardson/node-fs-extra/issues/6 "Remove CoffeeScript development dependency"
+[#5]: https://github.com/jprichardson/node-fs-extra/issues/5 "comments on naming"
+[#4]: https://github.com/jprichardson/node-fs-extra/issues/4 "version bump to 0.2"
+[#3]: https://github.com/jprichardson/node-fs-extra/pull/3 "Hi! I fixed some code for you!"
+[#2]: https://github.com/jprichardson/node-fs-extra/issues/2 "Merge with fs.extra and mkdirp"
+[#1]: https://github.com/jprichardson/node-fs-extra/issues/1 "file-extra npm !exist"
diff --git a/desktop/node_modules/@electron/universal/node_modules/fs-extra/LICENSE b/desktop/node_modules/@electron/universal/node_modules/fs-extra/LICENSE
new file mode 100644
index 0000000..93546df
--- /dev/null
+++ b/desktop/node_modules/@electron/universal/node_modules/fs-extra/LICENSE
@@ -0,0 +1,15 @@
+(The MIT License)
+
+Copyright (c) 2011-2017 JP Richardson
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files
+(the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify,
+ merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
+ furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS
+OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/desktop/node_modules/@electron/universal/node_modules/fs-extra/README.md b/desktop/node_modules/@electron/universal/node_modules/fs-extra/README.md
new file mode 100644
index 0000000..b4a5370
--- /dev/null
+++ b/desktop/node_modules/@electron/universal/node_modules/fs-extra/README.md
@@ -0,0 +1,264 @@
+Node.js: fs-extra
+=================
+
+`fs-extra` adds file system methods that aren't included in the native `fs` module and adds promise support to the `fs` methods. It also uses [`graceful-fs`](https://github.com/isaacs/node-graceful-fs) to prevent `EMFILE` errors. It should be a drop in replacement for `fs`.
+
+[![npm Package](https://img.shields.io/npm/v/fs-extra.svg)](https://www.npmjs.org/package/fs-extra)
+[![License](https://img.shields.io/npm/l/express.svg)](https://github.com/jprichardson/node-fs-extra/blob/master/LICENSE)
+[![build status](https://img.shields.io/travis/jprichardson/node-fs-extra/master.svg)](http://travis-ci.org/jprichardson/node-fs-extra)
+[![windows Build status](https://img.shields.io/appveyor/ci/jprichardson/node-fs-extra/master.svg?label=windows%20build)](https://ci.appveyor.com/project/jprichardson/node-fs-extra/branch/master)
+[![downloads per month](http://img.shields.io/npm/dm/fs-extra.svg)](https://www.npmjs.org/package/fs-extra)
+[![Coverage Status](https://img.shields.io/coveralls/github/jprichardson/node-fs-extra/master.svg)](https://coveralls.io/github/jprichardson/node-fs-extra)
+[![JavaScript Style Guide](https://img.shields.io/badge/code_style-standard-brightgreen.svg)](https://standardjs.com)
+
+Why?
+----
+
+I got tired of including `mkdirp`, `rimraf`, and `ncp` in most of my projects.
+
+
+
+
+Installation
+------------
+
+ npm install fs-extra
+
+
+
+Usage
+-----
+
+`fs-extra` is a drop in replacement for native `fs`. All methods in `fs` are attached to `fs-extra`. All `fs` methods return promises if the callback isn't passed.
+
+You don't ever need to include the original `fs` module again:
+
+```js
+const fs = require('fs') // this is no longer necessary
+```
+
+you can now do this:
+
+```js
+const fs = require('fs-extra')
+```
+
+or if you prefer to make it clear that you're using `fs-extra` and not `fs`, you may want
+to name your `fs` variable `fse` like so:
+
+```js
+const fse = require('fs-extra')
+```
+
+you can also keep both, but it's redundant:
+
+```js
+const fs = require('fs')
+const fse = require('fs-extra')
+```
+
+Sync vs Async vs Async/Await
+-------------
+Most methods are async by default. All async methods will return a promise if the callback isn't passed.
+
+Sync methods on the other hand will throw if an error occurs.
+
+Also Async/Await will throw an error if one occurs.
+
+Example:
+
+```js
+const fs = require('fs-extra')
+
+// Async with promises:
+fs.copy('/tmp/myfile', '/tmp/mynewfile')
+ .then(() => console.log('success!'))
+ .catch(err => console.error(err))
+
+// Async with callbacks:
+fs.copy('/tmp/myfile', '/tmp/mynewfile', err => {
+ if (err) return console.error(err)
+ console.log('success!')
+})
+
+// Sync:
+try {
+ fs.copySync('/tmp/myfile', '/tmp/mynewfile')
+ console.log('success!')
+} catch (err) {
+ console.error(err)
+}
+
+// Async/Await:
+async function copyFiles () {
+ try {
+ await fs.copy('/tmp/myfile', '/tmp/mynewfile')
+ console.log('success!')
+ } catch (err) {
+ console.error(err)
+ }
+}
+
+copyFiles()
+```
+
+
+Methods
+-------
+
+### Async
+
+- [copy](docs/copy.md)
+- [emptyDir](docs/emptyDir.md)
+- [ensureFile](docs/ensureFile.md)
+- [ensureDir](docs/ensureDir.md)
+- [ensureLink](docs/ensureLink.md)
+- [ensureSymlink](docs/ensureSymlink.md)
+- [mkdirp](docs/ensureDir.md)
+- [mkdirs](docs/ensureDir.md)
+- [move](docs/move.md)
+- [outputFile](docs/outputFile.md)
+- [outputJson](docs/outputJson.md)
+- [pathExists](docs/pathExists.md)
+- [readJson](docs/readJson.md)
+- [remove](docs/remove.md)
+- [writeJson](docs/writeJson.md)
+
+### Sync
+
+- [copySync](docs/copy-sync.md)
+- [emptyDirSync](docs/emptyDir-sync.md)
+- [ensureFileSync](docs/ensureFile-sync.md)
+- [ensureDirSync](docs/ensureDir-sync.md)
+- [ensureLinkSync](docs/ensureLink-sync.md)
+- [ensureSymlinkSync](docs/ensureSymlink-sync.md)
+- [mkdirpSync](docs/ensureDir-sync.md)
+- [mkdirsSync](docs/ensureDir-sync.md)
+- [moveSync](docs/move-sync.md)
+- [outputFileSync](docs/outputFile-sync.md)
+- [outputJsonSync](docs/outputJson-sync.md)
+- [pathExistsSync](docs/pathExists-sync.md)
+- [readJsonSync](docs/readJson-sync.md)
+- [removeSync](docs/remove-sync.md)
+- [writeJsonSync](docs/writeJson-sync.md)
+
+
+**NOTE:** You can still use the native Node.js methods. They are promisified and copied over to `fs-extra`. See [notes on `fs.read()`, `fs.write()`, & `fs.writev()`](docs/fs-read-write-writev.md)
+
+### What happened to `walk()` and `walkSync()`?
+
+They were removed from `fs-extra` in v2.0.0. If you need the functionality, `walk` and `walkSync` are available as separate packages, [`klaw`](https://github.com/jprichardson/node-klaw) and [`klaw-sync`](https://github.com/manidlou/node-klaw-sync).
+
+
+Third Party
+-----------
+
+### CLI
+
+[fse-cli](https://www.npmjs.com/package/@atao60/fse-cli) allows you to run `fs-extra` from a console or from [npm](https://www.npmjs.com) scripts.
+
+### TypeScript
+
+If you like TypeScript, you can use `fs-extra` with it: https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/fs-extra
+
+
+### File / Directory Watching
+
+If you want to watch for changes to files or directories, then you should use [chokidar](https://github.com/paulmillr/chokidar).
+
+### Obtain Filesystem (Devices, Partitions) Information
+
+[fs-filesystem](https://github.com/arthurintelligence/node-fs-filesystem) allows you to read the state of the filesystem of the host on which it is run. It returns information about both the devices and the partitions (volumes) of the system.
+
+### Misc.
+
+- [fs-extra-debug](https://github.com/jdxcode/fs-extra-debug) - Send your fs-extra calls to [debug](https://npmjs.org/package/debug).
+- [mfs](https://github.com/cadorn/mfs) - Monitor your fs-extra calls.
+
+
+
+Hacking on fs-extra
+-------------------
+
+Wanna hack on `fs-extra`? Great! Your help is needed! [fs-extra is one of the most depended upon Node.js packages](http://nodei.co/npm/fs-extra.png?downloads=true&downloadRank=true&stars=true). This project
+uses [JavaScript Standard Style](https://github.com/feross/standard) - if the name or style choices bother you,
+you're gonna have to get over it :) If `standard` is good enough for `npm`, it's good enough for `fs-extra`.
+
+[![js-standard-style](https://cdn.rawgit.com/feross/standard/master/badge.svg)](https://github.com/feross/standard)
+
+What's needed?
+- First, take a look at existing issues. Those are probably going to be where the priority lies.
+- More tests for edge cases. Specifically on different platforms. There can never be enough tests.
+- Improve test coverage. See coveralls output for more info.
+
+Note: If you make any big changes, **you should definitely file an issue for discussion first.**
+
+### Running the Test Suite
+
+fs-extra contains hundreds of tests.
+
+- `npm run lint`: runs the linter ([standard](http://standardjs.com/))
+- `npm run unit`: runs the unit tests
+- `npm test`: runs both the linter and the tests
+
+
+### Windows
+
+If you run the tests on the Windows and receive a lot of symbolic link `EPERM` permission errors, it's
+because on Windows you need elevated privilege to create symbolic links. You can add this to your Windows's
+account by following the instructions here: http://superuser.com/questions/104845/permission-to-make-symbolic-links-in-windows-7
+However, I didn't have much luck doing this.
+
+Since I develop on Mac OS X, I use VMWare Fusion for Windows testing. I create a shared folder that I map to a drive on Windows.
+I open the `Node.js command prompt` and run as `Administrator`. I then map the network drive running the following command:
+
+ net use z: "\\vmware-host\Shared Folders"
+
+I can then navigate to my `fs-extra` directory and run the tests.
+
+
+Naming
+------
+
+I put a lot of thought into the naming of these functions. Inspired by @coolaj86's request. So he deserves much of the credit for raising the issue. See discussion(s) here:
+
+* https://github.com/jprichardson/node-fs-extra/issues/2
+* https://github.com/flatiron/utile/issues/11
+* https://github.com/ryanmcgrath/wrench-js/issues/29
+* https://github.com/substack/node-mkdirp/issues/17
+
+First, I believe that in as many cases as possible, the [Node.js naming schemes](http://nodejs.org/api/fs.html) should be chosen. However, there are problems with the Node.js own naming schemes.
+
+For example, `fs.readFile()` and `fs.readdir()`: the **F** is capitalized in *File* and the **d** is not capitalized in *dir*. Perhaps a bit pedantic, but they should still be consistent. Also, Node.js has chosen a lot of POSIX naming schemes, which I believe is great. See: `fs.mkdir()`, `fs.rmdir()`, `fs.chown()`, etc.
+
+We have a dilemma though. How do you consistently name methods that perform the following POSIX commands: `cp`, `cp -r`, `mkdir -p`, and `rm -rf`?
+
+My perspective: when in doubt, err on the side of simplicity. A directory is just a hierarchical grouping of directories and files. Consider that for a moment. So when you want to copy it or remove it, in most cases you'll want to copy or remove all of its contents. When you want to create a directory, if the directory that it's suppose to be contained in does not exist, then in most cases you'll want to create that too.
+
+So, if you want to remove a file or a directory regardless of whether it has contents, just call `fs.remove(path)`. If you want to copy a file or a directory whether it has contents, just call `fs.copy(source, destination)`. If you want to create a directory regardless of whether its parent directories exist, just call `fs.mkdirs(path)` or `fs.mkdirp(path)`.
+
+
+Credit
+------
+
+`fs-extra` wouldn't be possible without using the modules from the following authors:
+
+- [Isaac Shlueter](https://github.com/isaacs)
+- [Charlie McConnel](https://github.com/avianflu)
+- [James Halliday](https://github.com/substack)
+- [Andrew Kelley](https://github.com/andrewrk)
+
+
+
+
+License
+-------
+
+Licensed under MIT
+
+Copyright (c) 2011-2017 [JP Richardson](https://github.com/jprichardson)
+
+[1]: http://nodejs.org/docs/latest/api/fs.html
+
+
+[jsonfile]: https://github.com/jprichardson/node-jsonfile
diff --git a/desktop/node_modules/@electron/universal/node_modules/fs-extra/lib/copy-sync/copy-sync.js b/desktop/node_modules/@electron/universal/node_modules/fs-extra/lib/copy-sync/copy-sync.js
new file mode 100644
index 0000000..31f06e4
--- /dev/null
+++ b/desktop/node_modules/@electron/universal/node_modules/fs-extra/lib/copy-sync/copy-sync.js
@@ -0,0 +1,166 @@
+'use strict'
+
+const fs = require('graceful-fs')
+const path = require('path')
+const mkdirsSync = require('../mkdirs').mkdirsSync
+const utimesMillisSync = require('../util/utimes').utimesMillisSync
+const stat = require('../util/stat')
+
+function copySync (src, dest, opts) {
+ if (typeof opts === 'function') {
+ opts = { filter: opts }
+ }
+
+ opts = opts || {}
+ opts.clobber = 'clobber' in opts ? !!opts.clobber : true // default to true for now
+ opts.overwrite = 'overwrite' in opts ? !!opts.overwrite : opts.clobber // overwrite falls back to clobber
+
+ // Warn about using preserveTimestamps on 32-bit node
+ if (opts.preserveTimestamps && process.arch === 'ia32') {
+ console.warn(`fs-extra: Using the preserveTimestamps option in 32-bit node is not recommended;\n
+ see https://github.com/jprichardson/node-fs-extra/issues/269`)
+ }
+
+ const { srcStat, destStat } = stat.checkPathsSync(src, dest, 'copy')
+ stat.checkParentPathsSync(src, srcStat, dest, 'copy')
+ return handleFilterAndCopy(destStat, src, dest, opts)
+}
+
+function handleFilterAndCopy (destStat, src, dest, opts) {
+ if (opts.filter && !opts.filter(src, dest)) return
+ const destParent = path.dirname(dest)
+ if (!fs.existsSync(destParent)) mkdirsSync(destParent)
+ return startCopy(destStat, src, dest, opts)
+}
+
+function startCopy (destStat, src, dest, opts) {
+ if (opts.filter && !opts.filter(src, dest)) return
+ return getStats(destStat, src, dest, opts)
+}
+
+function getStats (destStat, src, dest, opts) {
+ const statSync = opts.dereference ? fs.statSync : fs.lstatSync
+ const srcStat = statSync(src)
+
+ if (srcStat.isDirectory()) return onDir(srcStat, destStat, src, dest, opts)
+ else if (srcStat.isFile() ||
+ srcStat.isCharacterDevice() ||
+ srcStat.isBlockDevice()) return onFile(srcStat, destStat, src, dest, opts)
+ else if (srcStat.isSymbolicLink()) return onLink(destStat, src, dest, opts)
+}
+
+function onFile (srcStat, destStat, src, dest, opts) {
+ if (!destStat) return copyFile(srcStat, src, dest, opts)
+ return mayCopyFile(srcStat, src, dest, opts)
+}
+
+function mayCopyFile (srcStat, src, dest, opts) {
+ if (opts.overwrite) {
+ fs.unlinkSync(dest)
+ return copyFile(srcStat, src, dest, opts)
+ } else if (opts.errorOnExist) {
+ throw new Error(`'${dest}' already exists`)
+ }
+}
+
+function copyFile (srcStat, src, dest, opts) {
+ fs.copyFileSync(src, dest)
+ if (opts.preserveTimestamps) handleTimestamps(srcStat.mode, src, dest)
+ return setDestMode(dest, srcStat.mode)
+}
+
+function handleTimestamps (srcMode, src, dest) {
+ // Make sure the file is writable before setting the timestamp
+ // otherwise open fails with EPERM when invoked with 'r+'
+ // (through utimes call)
+ if (fileIsNotWritable(srcMode)) makeFileWritable(dest, srcMode)
+ return setDestTimestamps(src, dest)
+}
+
+function fileIsNotWritable (srcMode) {
+ return (srcMode & 0o200) === 0
+}
+
+function makeFileWritable (dest, srcMode) {
+ return setDestMode(dest, srcMode | 0o200)
+}
+
+function setDestMode (dest, srcMode) {
+ return fs.chmodSync(dest, srcMode)
+}
+
+function setDestTimestamps (src, dest) {
+ // The initial srcStat.atime cannot be trusted
+ // because it is modified by the read(2) system call
+ // (See https://nodejs.org/api/fs.html#fs_stat_time_values)
+ const updatedSrcStat = fs.statSync(src)
+ return utimesMillisSync(dest, updatedSrcStat.atime, updatedSrcStat.mtime)
+}
+
+function onDir (srcStat, destStat, src, dest, opts) {
+ if (!destStat) return mkDirAndCopy(srcStat.mode, src, dest, opts)
+ if (destStat && !destStat.isDirectory()) {
+ throw new Error(`Cannot overwrite non-directory '${dest}' with directory '${src}'.`)
+ }
+ return copyDir(src, dest, opts)
+}
+
+function mkDirAndCopy (srcMode, src, dest, opts) {
+ fs.mkdirSync(dest)
+ copyDir(src, dest, opts)
+ return setDestMode(dest, srcMode)
+}
+
+function copyDir (src, dest, opts) {
+ fs.readdirSync(src).forEach(item => copyDirItem(item, src, dest, opts))
+}
+
+function copyDirItem (item, src, dest, opts) {
+ const srcItem = path.join(src, item)
+ const destItem = path.join(dest, item)
+ const { destStat } = stat.checkPathsSync(srcItem, destItem, 'copy')
+ return startCopy(destStat, srcItem, destItem, opts)
+}
+
+function onLink (destStat, src, dest, opts) {
+ let resolvedSrc = fs.readlinkSync(src)
+ if (opts.dereference) {
+ resolvedSrc = path.resolve(process.cwd(), resolvedSrc)
+ }
+
+ if (!destStat) {
+ return fs.symlinkSync(resolvedSrc, dest)
+ } else {
+ let resolvedDest
+ try {
+ resolvedDest = fs.readlinkSync(dest)
+ } catch (err) {
+ // dest exists and is a regular file or directory,
+ // Windows may throw UNKNOWN error. If dest already exists,
+ // fs throws error anyway, so no need to guard against it here.
+ if (err.code === 'EINVAL' || err.code === 'UNKNOWN') return fs.symlinkSync(resolvedSrc, dest)
+ throw err
+ }
+ if (opts.dereference) {
+ resolvedDest = path.resolve(process.cwd(), resolvedDest)
+ }
+ if (stat.isSrcSubdir(resolvedSrc, resolvedDest)) {
+ throw new Error(`Cannot copy '${resolvedSrc}' to a subdirectory of itself, '${resolvedDest}'.`)
+ }
+
+ // prevent copy if src is a subdir of dest since unlinking
+ // dest in this case would result in removing src contents
+ // and therefore a broken symlink would be created.
+ if (fs.statSync(dest).isDirectory() && stat.isSrcSubdir(resolvedDest, resolvedSrc)) {
+ throw new Error(`Cannot overwrite '${resolvedDest}' with '${resolvedSrc}'.`)
+ }
+ return copyLink(resolvedSrc, dest)
+ }
+}
+
+function copyLink (resolvedSrc, dest) {
+ fs.unlinkSync(dest)
+ return fs.symlinkSync(resolvedSrc, dest)
+}
+
+module.exports = copySync
diff --git a/desktop/node_modules/@electron/universal/node_modules/fs-extra/lib/copy-sync/index.js b/desktop/node_modules/@electron/universal/node_modules/fs-extra/lib/copy-sync/index.js
new file mode 100644
index 0000000..65945ae
--- /dev/null
+++ b/desktop/node_modules/@electron/universal/node_modules/fs-extra/lib/copy-sync/index.js
@@ -0,0 +1,5 @@
+'use strict'
+
+module.exports = {
+ copySync: require('./copy-sync')
+}
diff --git a/desktop/node_modules/@electron/universal/node_modules/fs-extra/lib/copy/copy.js b/desktop/node_modules/@electron/universal/node_modules/fs-extra/lib/copy/copy.js
new file mode 100644
index 0000000..328f102
--- /dev/null
+++ b/desktop/node_modules/@electron/universal/node_modules/fs-extra/lib/copy/copy.js
@@ -0,0 +1,232 @@
+'use strict'
+
+const fs = require('graceful-fs')
+const path = require('path')
+const mkdirs = require('../mkdirs').mkdirs
+const pathExists = require('../path-exists').pathExists
+const utimesMillis = require('../util/utimes').utimesMillis
+const stat = require('../util/stat')
+
+function copy (src, dest, opts, cb) {
+ if (typeof opts === 'function' && !cb) {
+ cb = opts
+ opts = {}
+ } else if (typeof opts === 'function') {
+ opts = { filter: opts }
+ }
+
+ cb = cb || function () {}
+ opts = opts || {}
+
+ opts.clobber = 'clobber' in opts ? !!opts.clobber : true // default to true for now
+ opts.overwrite = 'overwrite' in opts ? !!opts.overwrite : opts.clobber // overwrite falls back to clobber
+
+ // Warn about using preserveTimestamps on 32-bit node
+ if (opts.preserveTimestamps && process.arch === 'ia32') {
+ console.warn(`fs-extra: Using the preserveTimestamps option in 32-bit node is not recommended;\n
+ see https://github.com/jprichardson/node-fs-extra/issues/269`)
+ }
+
+ stat.checkPaths(src, dest, 'copy', (err, stats) => {
+ if (err) return cb(err)
+ const { srcStat, destStat } = stats
+ stat.checkParentPaths(src, srcStat, dest, 'copy', err => {
+ if (err) return cb(err)
+ if (opts.filter) return handleFilter(checkParentDir, destStat, src, dest, opts, cb)
+ return checkParentDir(destStat, src, dest, opts, cb)
+ })
+ })
+}
+
+function checkParentDir (destStat, src, dest, opts, cb) {
+ const destParent = path.dirname(dest)
+ pathExists(destParent, (err, dirExists) => {
+ if (err) return cb(err)
+ if (dirExists) return startCopy(destStat, src, dest, opts, cb)
+ mkdirs(destParent, err => {
+ if (err) return cb(err)
+ return startCopy(destStat, src, dest, opts, cb)
+ })
+ })
+}
+
+function handleFilter (onInclude, destStat, src, dest, opts, cb) {
+ Promise.resolve(opts.filter(src, dest)).then(include => {
+ if (include) return onInclude(destStat, src, dest, opts, cb)
+ return cb()
+ }, error => cb(error))
+}
+
+function startCopy (destStat, src, dest, opts, cb) {
+ if (opts.filter) return handleFilter(getStats, destStat, src, dest, opts, cb)
+ return getStats(destStat, src, dest, opts, cb)
+}
+
+function getStats (destStat, src, dest, opts, cb) {
+ const stat = opts.dereference ? fs.stat : fs.lstat
+ stat(src, (err, srcStat) => {
+ if (err) return cb(err)
+
+ if (srcStat.isDirectory()) return onDir(srcStat, destStat, src, dest, opts, cb)
+ else if (srcStat.isFile() ||
+ srcStat.isCharacterDevice() ||
+ srcStat.isBlockDevice()) return onFile(srcStat, destStat, src, dest, opts, cb)
+ else if (srcStat.isSymbolicLink()) return onLink(destStat, src, dest, opts, cb)
+ })
+}
+
+function onFile (srcStat, destStat, src, dest, opts, cb) {
+ if (!destStat) return copyFile(srcStat, src, dest, opts, cb)
+ return mayCopyFile(srcStat, src, dest, opts, cb)
+}
+
+function mayCopyFile (srcStat, src, dest, opts, cb) {
+ if (opts.overwrite) {
+ fs.unlink(dest, err => {
+ if (err) return cb(err)
+ return copyFile(srcStat, src, dest, opts, cb)
+ })
+ } else if (opts.errorOnExist) {
+ return cb(new Error(`'${dest}' already exists`))
+ } else return cb()
+}
+
+function copyFile (srcStat, src, dest, opts, cb) {
+ fs.copyFile(src, dest, err => {
+ if (err) return cb(err)
+ if (opts.preserveTimestamps) return handleTimestampsAndMode(srcStat.mode, src, dest, cb)
+ return setDestMode(dest, srcStat.mode, cb)
+ })
+}
+
+function handleTimestampsAndMode (srcMode, src, dest, cb) {
+ // Make sure the file is writable before setting the timestamp
+ // otherwise open fails with EPERM when invoked with 'r+'
+ // (through utimes call)
+ if (fileIsNotWritable(srcMode)) {
+ return makeFileWritable(dest, srcMode, err => {
+ if (err) return cb(err)
+ return setDestTimestampsAndMode(srcMode, src, dest, cb)
+ })
+ }
+ return setDestTimestampsAndMode(srcMode, src, dest, cb)
+}
+
+function fileIsNotWritable (srcMode) {
+ return (srcMode & 0o200) === 0
+}
+
+function makeFileWritable (dest, srcMode, cb) {
+ return setDestMode(dest, srcMode | 0o200, cb)
+}
+
+function setDestTimestampsAndMode (srcMode, src, dest, cb) {
+ setDestTimestamps(src, dest, err => {
+ if (err) return cb(err)
+ return setDestMode(dest, srcMode, cb)
+ })
+}
+
+function setDestMode (dest, srcMode, cb) {
+ return fs.chmod(dest, srcMode, cb)
+}
+
+function setDestTimestamps (src, dest, cb) {
+ // The initial srcStat.atime cannot be trusted
+ // because it is modified by the read(2) system call
+ // (See https://nodejs.org/api/fs.html#fs_stat_time_values)
+ fs.stat(src, (err, updatedSrcStat) => {
+ if (err) return cb(err)
+ return utimesMillis(dest, updatedSrcStat.atime, updatedSrcStat.mtime, cb)
+ })
+}
+
+function onDir (srcStat, destStat, src, dest, opts, cb) {
+ if (!destStat) return mkDirAndCopy(srcStat.mode, src, dest, opts, cb)
+ if (destStat && !destStat.isDirectory()) {
+ return cb(new Error(`Cannot overwrite non-directory '${dest}' with directory '${src}'.`))
+ }
+ return copyDir(src, dest, opts, cb)
+}
+
+function mkDirAndCopy (srcMode, src, dest, opts, cb) {
+ fs.mkdir(dest, err => {
+ if (err) return cb(err)
+ copyDir(src, dest, opts, err => {
+ if (err) return cb(err)
+ return setDestMode(dest, srcMode, cb)
+ })
+ })
+}
+
+function copyDir (src, dest, opts, cb) {
+ fs.readdir(src, (err, items) => {
+ if (err) return cb(err)
+ return copyDirItems(items, src, dest, opts, cb)
+ })
+}
+
+function copyDirItems (items, src, dest, opts, cb) {
+ const item = items.pop()
+ if (!item) return cb()
+ return copyDirItem(items, item, src, dest, opts, cb)
+}
+
+function copyDirItem (items, item, src, dest, opts, cb) {
+ const srcItem = path.join(src, item)
+ const destItem = path.join(dest, item)
+ stat.checkPaths(srcItem, destItem, 'copy', (err, stats) => {
+ if (err) return cb(err)
+ const { destStat } = stats
+ startCopy(destStat, srcItem, destItem, opts, err => {
+ if (err) return cb(err)
+ return copyDirItems(items, src, dest, opts, cb)
+ })
+ })
+}
+
+function onLink (destStat, src, dest, opts, cb) {
+ fs.readlink(src, (err, resolvedSrc) => {
+ if (err) return cb(err)
+ if (opts.dereference) {
+ resolvedSrc = path.resolve(process.cwd(), resolvedSrc)
+ }
+
+ if (!destStat) {
+ return fs.symlink(resolvedSrc, dest, cb)
+ } else {
+ fs.readlink(dest, (err, resolvedDest) => {
+ if (err) {
+ // dest exists and is a regular file or directory,
+ // Windows may throw UNKNOWN error. If dest already exists,
+ // fs throws error anyway, so no need to guard against it here.
+ if (err.code === 'EINVAL' || err.code === 'UNKNOWN') return fs.symlink(resolvedSrc, dest, cb)
+ return cb(err)
+ }
+ if (opts.dereference) {
+ resolvedDest = path.resolve(process.cwd(), resolvedDest)
+ }
+ if (stat.isSrcSubdir(resolvedSrc, resolvedDest)) {
+ return cb(new Error(`Cannot copy '${resolvedSrc}' to a subdirectory of itself, '${resolvedDest}'.`))
+ }
+
+ // do not copy if src is a subdir of dest since unlinking
+ // dest in this case would result in removing src contents
+ // and therefore a broken symlink would be created.
+ if (destStat.isDirectory() && stat.isSrcSubdir(resolvedDest, resolvedSrc)) {
+ return cb(new Error(`Cannot overwrite '${resolvedDest}' with '${resolvedSrc}'.`))
+ }
+ return copyLink(resolvedSrc, dest, cb)
+ })
+ }
+ })
+}
+
+function copyLink (resolvedSrc, dest, cb) {
+ fs.unlink(dest, err => {
+ if (err) return cb(err)
+ return fs.symlink(resolvedSrc, dest, cb)
+ })
+}
+
+module.exports = copy
diff --git a/desktop/node_modules/@electron/universal/node_modules/fs-extra/lib/copy/index.js b/desktop/node_modules/@electron/universal/node_modules/fs-extra/lib/copy/index.js
new file mode 100644
index 0000000..b7e4f7f
--- /dev/null
+++ b/desktop/node_modules/@electron/universal/node_modules/fs-extra/lib/copy/index.js
@@ -0,0 +1,6 @@
+'use strict'
+
+const u = require('universalify').fromCallback
+module.exports = {
+ copy: u(require('./copy'))
+}
diff --git a/desktop/node_modules/@electron/universal/node_modules/fs-extra/lib/empty/index.js b/desktop/node_modules/@electron/universal/node_modules/fs-extra/lib/empty/index.js
new file mode 100644
index 0000000..90fb469
--- /dev/null
+++ b/desktop/node_modules/@electron/universal/node_modules/fs-extra/lib/empty/index.js
@@ -0,0 +1,48 @@
+'use strict'
+
+const u = require('universalify').fromCallback
+const fs = require('graceful-fs')
+const path = require('path')
+const mkdir = require('../mkdirs')
+const remove = require('../remove')
+
+const emptyDir = u(function emptyDir (dir, callback) {
+ callback = callback || function () {}
+ fs.readdir(dir, (err, items) => {
+ if (err) return mkdir.mkdirs(dir, callback)
+
+ items = items.map(item => path.join(dir, item))
+
+ deleteItem()
+
+ function deleteItem () {
+ const item = items.pop()
+ if (!item) return callback()
+ remove.remove(item, err => {
+ if (err) return callback(err)
+ deleteItem()
+ })
+ }
+ })
+})
+
+function emptyDirSync (dir) {
+ let items
+ try {
+ items = fs.readdirSync(dir)
+ } catch {
+ return mkdir.mkdirsSync(dir)
+ }
+
+ items.forEach(item => {
+ item = path.join(dir, item)
+ remove.removeSync(item)
+ })
+}
+
+module.exports = {
+ emptyDirSync,
+ emptydirSync: emptyDirSync,
+ emptyDir,
+ emptydir: emptyDir
+}
diff --git a/desktop/node_modules/@electron/universal/node_modules/fs-extra/lib/ensure/file.js b/desktop/node_modules/@electron/universal/node_modules/fs-extra/lib/ensure/file.js
new file mode 100644
index 0000000..15cc473
--- /dev/null
+++ b/desktop/node_modules/@electron/universal/node_modules/fs-extra/lib/ensure/file.js
@@ -0,0 +1,69 @@
+'use strict'
+
+const u = require('universalify').fromCallback
+const path = require('path')
+const fs = require('graceful-fs')
+const mkdir = require('../mkdirs')
+
+function createFile (file, callback) {
+ function makeFile () {
+ fs.writeFile(file, '', err => {
+ if (err) return callback(err)
+ callback()
+ })
+ }
+
+ fs.stat(file, (err, stats) => { // eslint-disable-line handle-callback-err
+ if (!err && stats.isFile()) return callback()
+ const dir = path.dirname(file)
+ fs.stat(dir, (err, stats) => {
+ if (err) {
+ // if the directory doesn't exist, make it
+ if (err.code === 'ENOENT') {
+ return mkdir.mkdirs(dir, err => {
+ if (err) return callback(err)
+ makeFile()
+ })
+ }
+ return callback(err)
+ }
+
+ if (stats.isDirectory()) makeFile()
+ else {
+ // parent is not a directory
+ // This is just to cause an internal ENOTDIR error to be thrown
+ fs.readdir(dir, err => {
+ if (err) return callback(err)
+ })
+ }
+ })
+ })
+}
+
+function createFileSync (file) {
+ let stats
+ try {
+ stats = fs.statSync(file)
+ } catch {}
+ if (stats && stats.isFile()) return
+
+ const dir = path.dirname(file)
+ try {
+ if (!fs.statSync(dir).isDirectory()) {
+ // parent is not a directory
+ // This is just to cause an internal ENOTDIR error to be thrown
+ fs.readdirSync(dir)
+ }
+ } catch (err) {
+ // If the stat call above failed because the directory doesn't exist, create it
+ if (err && err.code === 'ENOENT') mkdir.mkdirsSync(dir)
+ else throw err
+ }
+
+ fs.writeFileSync(file, '')
+}
+
+module.exports = {
+ createFile: u(createFile),
+ createFileSync
+}
diff --git a/desktop/node_modules/@electron/universal/node_modules/fs-extra/lib/ensure/index.js b/desktop/node_modules/@electron/universal/node_modules/fs-extra/lib/ensure/index.js
new file mode 100644
index 0000000..c1f67b7
--- /dev/null
+++ b/desktop/node_modules/@electron/universal/node_modules/fs-extra/lib/ensure/index.js
@@ -0,0 +1,23 @@
+'use strict'
+
+const file = require('./file')
+const link = require('./link')
+const symlink = require('./symlink')
+
+module.exports = {
+ // file
+ createFile: file.createFile,
+ createFileSync: file.createFileSync,
+ ensureFile: file.createFile,
+ ensureFileSync: file.createFileSync,
+ // link
+ createLink: link.createLink,
+ createLinkSync: link.createLinkSync,
+ ensureLink: link.createLink,
+ ensureLinkSync: link.createLinkSync,
+ // symlink
+ createSymlink: symlink.createSymlink,
+ createSymlinkSync: symlink.createSymlinkSync,
+ ensureSymlink: symlink.createSymlink,
+ ensureSymlinkSync: symlink.createSymlinkSync
+}
diff --git a/desktop/node_modules/@electron/universal/node_modules/fs-extra/lib/ensure/link.js b/desktop/node_modules/@electron/universal/node_modules/fs-extra/lib/ensure/link.js
new file mode 100644
index 0000000..2cd4196
--- /dev/null
+++ b/desktop/node_modules/@electron/universal/node_modules/fs-extra/lib/ensure/link.js
@@ -0,0 +1,61 @@
+'use strict'
+
+const u = require('universalify').fromCallback
+const path = require('path')
+const fs = require('graceful-fs')
+const mkdir = require('../mkdirs')
+const pathExists = require('../path-exists').pathExists
+
+function createLink (srcpath, dstpath, callback) {
+ function makeLink (srcpath, dstpath) {
+ fs.link(srcpath, dstpath, err => {
+ if (err) return callback(err)
+ callback(null)
+ })
+ }
+
+ pathExists(dstpath, (err, destinationExists) => {
+ if (err) return callback(err)
+ if (destinationExists) return callback(null)
+ fs.lstat(srcpath, (err) => {
+ if (err) {
+ err.message = err.message.replace('lstat', 'ensureLink')
+ return callback(err)
+ }
+
+ const dir = path.dirname(dstpath)
+ pathExists(dir, (err, dirExists) => {
+ if (err) return callback(err)
+ if (dirExists) return makeLink(srcpath, dstpath)
+ mkdir.mkdirs(dir, err => {
+ if (err) return callback(err)
+ makeLink(srcpath, dstpath)
+ })
+ })
+ })
+ })
+}
+
+function createLinkSync (srcpath, dstpath) {
+ const destinationExists = fs.existsSync(dstpath)
+ if (destinationExists) return undefined
+
+ try {
+ fs.lstatSync(srcpath)
+ } catch (err) {
+ err.message = err.message.replace('lstat', 'ensureLink')
+ throw err
+ }
+
+ const dir = path.dirname(dstpath)
+ const dirExists = fs.existsSync(dir)
+ if (dirExists) return fs.linkSync(srcpath, dstpath)
+ mkdir.mkdirsSync(dir)
+
+ return fs.linkSync(srcpath, dstpath)
+}
+
+module.exports = {
+ createLink: u(createLink),
+ createLinkSync
+}
diff --git a/desktop/node_modules/@electron/universal/node_modules/fs-extra/lib/ensure/symlink-paths.js b/desktop/node_modules/@electron/universal/node_modules/fs-extra/lib/ensure/symlink-paths.js
new file mode 100644
index 0000000..33cd760
--- /dev/null
+++ b/desktop/node_modules/@electron/universal/node_modules/fs-extra/lib/ensure/symlink-paths.js
@@ -0,0 +1,99 @@
+'use strict'
+
+const path = require('path')
+const fs = require('graceful-fs')
+const pathExists = require('../path-exists').pathExists
+
+/**
+ * Function that returns two types of paths, one relative to symlink, and one
+ * relative to the current working directory. Checks if path is absolute or
+ * relative. If the path is relative, this function checks if the path is
+ * relative to symlink or relative to current working directory. This is an
+ * initiative to find a smarter `srcpath` to supply when building symlinks.
+ * This allows you to determine which path to use out of one of three possible
+ * types of source paths. The first is an absolute path. This is detected by
+ * `path.isAbsolute()`. When an absolute path is provided, it is checked to
+ * see if it exists. If it does it's used, if not an error is returned
+ * (callback)/ thrown (sync). The other two options for `srcpath` are a
+ * relative url. By default Node's `fs.symlink` works by creating a symlink
+ * using `dstpath` and expects the `srcpath` to be relative to the newly
+ * created symlink. If you provide a `srcpath` that does not exist on the file
+ * system it results in a broken symlink. To minimize this, the function
+ * checks to see if the 'relative to symlink' source file exists, and if it
+ * does it will use it. If it does not, it checks if there's a file that
+ * exists that is relative to the current working directory, if does its used.
+ * This preserves the expectations of the original fs.symlink spec and adds
+ * the ability to pass in `relative to current working direcotry` paths.
+ */
+
+function symlinkPaths (srcpath, dstpath, callback) {
+ if (path.isAbsolute(srcpath)) {
+ return fs.lstat(srcpath, (err) => {
+ if (err) {
+ err.message = err.message.replace('lstat', 'ensureSymlink')
+ return callback(err)
+ }
+ return callback(null, {
+ toCwd: srcpath,
+ toDst: srcpath
+ })
+ })
+ } else {
+ const dstdir = path.dirname(dstpath)
+ const relativeToDst = path.join(dstdir, srcpath)
+ return pathExists(relativeToDst, (err, exists) => {
+ if (err) return callback(err)
+ if (exists) {
+ return callback(null, {
+ toCwd: relativeToDst,
+ toDst: srcpath
+ })
+ } else {
+ return fs.lstat(srcpath, (err) => {
+ if (err) {
+ err.message = err.message.replace('lstat', 'ensureSymlink')
+ return callback(err)
+ }
+ return callback(null, {
+ toCwd: srcpath,
+ toDst: path.relative(dstdir, srcpath)
+ })
+ })
+ }
+ })
+ }
+}
+
+function symlinkPathsSync (srcpath, dstpath) {
+ let exists
+ if (path.isAbsolute(srcpath)) {
+ exists = fs.existsSync(srcpath)
+ if (!exists) throw new Error('absolute srcpath does not exist')
+ return {
+ toCwd: srcpath,
+ toDst: srcpath
+ }
+ } else {
+ const dstdir = path.dirname(dstpath)
+ const relativeToDst = path.join(dstdir, srcpath)
+ exists = fs.existsSync(relativeToDst)
+ if (exists) {
+ return {
+ toCwd: relativeToDst,
+ toDst: srcpath
+ }
+ } else {
+ exists = fs.existsSync(srcpath)
+ if (!exists) throw new Error('relative srcpath does not exist')
+ return {
+ toCwd: srcpath,
+ toDst: path.relative(dstdir, srcpath)
+ }
+ }
+ }
+}
+
+module.exports = {
+ symlinkPaths,
+ symlinkPathsSync
+}
diff --git a/desktop/node_modules/@electron/universal/node_modules/fs-extra/lib/ensure/symlink-type.js b/desktop/node_modules/@electron/universal/node_modules/fs-extra/lib/ensure/symlink-type.js
new file mode 100644
index 0000000..42dc0ce
--- /dev/null
+++ b/desktop/node_modules/@electron/universal/node_modules/fs-extra/lib/ensure/symlink-type.js
@@ -0,0 +1,31 @@
+'use strict'
+
+const fs = require('graceful-fs')
+
+function symlinkType (srcpath, type, callback) {
+ callback = (typeof type === 'function') ? type : callback
+ type = (typeof type === 'function') ? false : type
+ if (type) return callback(null, type)
+ fs.lstat(srcpath, (err, stats) => {
+ if (err) return callback(null, 'file')
+ type = (stats && stats.isDirectory()) ? 'dir' : 'file'
+ callback(null, type)
+ })
+}
+
+function symlinkTypeSync (srcpath, type) {
+ let stats
+
+ if (type) return type
+ try {
+ stats = fs.lstatSync(srcpath)
+ } catch {
+ return 'file'
+ }
+ return (stats && stats.isDirectory()) ? 'dir' : 'file'
+}
+
+module.exports = {
+ symlinkType,
+ symlinkTypeSync
+}
diff --git a/desktop/node_modules/@electron/universal/node_modules/fs-extra/lib/ensure/symlink.js b/desktop/node_modules/@electron/universal/node_modules/fs-extra/lib/ensure/symlink.js
new file mode 100644
index 0000000..fe68b79
--- /dev/null
+++ b/desktop/node_modules/@electron/universal/node_modules/fs-extra/lib/ensure/symlink.js
@@ -0,0 +1,63 @@
+'use strict'
+
+const u = require('universalify').fromCallback
+const path = require('path')
+const fs = require('graceful-fs')
+const _mkdirs = require('../mkdirs')
+const mkdirs = _mkdirs.mkdirs
+const mkdirsSync = _mkdirs.mkdirsSync
+
+const _symlinkPaths = require('./symlink-paths')
+const symlinkPaths = _symlinkPaths.symlinkPaths
+const symlinkPathsSync = _symlinkPaths.symlinkPathsSync
+
+const _symlinkType = require('./symlink-type')
+const symlinkType = _symlinkType.symlinkType
+const symlinkTypeSync = _symlinkType.symlinkTypeSync
+
+const pathExists = require('../path-exists').pathExists
+
+function createSymlink (srcpath, dstpath, type, callback) {
+ callback = (typeof type === 'function') ? type : callback
+ type = (typeof type === 'function') ? false : type
+
+ pathExists(dstpath, (err, destinationExists) => {
+ if (err) return callback(err)
+ if (destinationExists) return callback(null)
+ symlinkPaths(srcpath, dstpath, (err, relative) => {
+ if (err) return callback(err)
+ srcpath = relative.toDst
+ symlinkType(relative.toCwd, type, (err, type) => {
+ if (err) return callback(err)
+ const dir = path.dirname(dstpath)
+ pathExists(dir, (err, dirExists) => {
+ if (err) return callback(err)
+ if (dirExists) return fs.symlink(srcpath, dstpath, type, callback)
+ mkdirs(dir, err => {
+ if (err) return callback(err)
+ fs.symlink(srcpath, dstpath, type, callback)
+ })
+ })
+ })
+ })
+ })
+}
+
+function createSymlinkSync (srcpath, dstpath, type) {
+ const destinationExists = fs.existsSync(dstpath)
+ if (destinationExists) return undefined
+
+ const relative = symlinkPathsSync(srcpath, dstpath)
+ srcpath = relative.toDst
+ type = symlinkTypeSync(relative.toCwd, type)
+ const dir = path.dirname(dstpath)
+ const exists = fs.existsSync(dir)
+ if (exists) return fs.symlinkSync(srcpath, dstpath, type)
+ mkdirsSync(dir)
+ return fs.symlinkSync(srcpath, dstpath, type)
+}
+
+module.exports = {
+ createSymlink: u(createSymlink),
+ createSymlinkSync
+}
diff --git a/desktop/node_modules/@electron/universal/node_modules/fs-extra/lib/fs/index.js b/desktop/node_modules/@electron/universal/node_modules/fs-extra/lib/fs/index.js
new file mode 100644
index 0000000..9bbaea4
--- /dev/null
+++ b/desktop/node_modules/@electron/universal/node_modules/fs-extra/lib/fs/index.js
@@ -0,0 +1,130 @@
+'use strict'
+// This is adapted from https://github.com/normalize/mz
+// Copyright (c) 2014-2016 Jonathan Ong me@jongleberry.com and Contributors
+const u = require('universalify').fromCallback
+const fs = require('graceful-fs')
+
+const api = [
+ 'access',
+ 'appendFile',
+ 'chmod',
+ 'chown',
+ 'close',
+ 'copyFile',
+ 'fchmod',
+ 'fchown',
+ 'fdatasync',
+ 'fstat',
+ 'fsync',
+ 'ftruncate',
+ 'futimes',
+ 'lchmod',
+ 'lchown',
+ 'link',
+ 'lstat',
+ 'mkdir',
+ 'mkdtemp',
+ 'open',
+ 'opendir',
+ 'readdir',
+ 'readFile',
+ 'readlink',
+ 'realpath',
+ 'rename',
+ 'rm',
+ 'rmdir',
+ 'stat',
+ 'symlink',
+ 'truncate',
+ 'unlink',
+ 'utimes',
+ 'writeFile'
+].filter(key => {
+ // Some commands are not available on some systems. Ex:
+ // fs.opendir was added in Node.js v12.12.0
+ // fs.rm was added in Node.js v14.14.0
+ // fs.lchown is not available on at least some Linux
+ return typeof fs[key] === 'function'
+})
+
+// Export all keys:
+Object.keys(fs).forEach(key => {
+ if (key === 'promises') {
+ // fs.promises is a getter property that triggers ExperimentalWarning
+ // Don't re-export it here, the getter is defined in "lib/index.js"
+ return
+ }
+ exports[key] = fs[key]
+})
+
+// Universalify async methods:
+api.forEach(method => {
+ exports[method] = u(fs[method])
+})
+
+// We differ from mz/fs in that we still ship the old, broken, fs.exists()
+// since we are a drop-in replacement for the native module
+exports.exists = function (filename, callback) {
+ if (typeof callback === 'function') {
+ return fs.exists(filename, callback)
+ }
+ return new Promise(resolve => {
+ return fs.exists(filename, resolve)
+ })
+}
+
+// fs.read(), fs.write(), & fs.writev() need special treatment due to multiple callback args
+
+exports.read = function (fd, buffer, offset, length, position, callback) {
+ if (typeof callback === 'function') {
+ return fs.read(fd, buffer, offset, length, position, callback)
+ }
+ return new Promise((resolve, reject) => {
+ fs.read(fd, buffer, offset, length, position, (err, bytesRead, buffer) => {
+ if (err) return reject(err)
+ resolve({ bytesRead, buffer })
+ })
+ })
+}
+
+// Function signature can be
+// fs.write(fd, buffer[, offset[, length[, position]]], callback)
+// OR
+// fs.write(fd, string[, position[, encoding]], callback)
+// We need to handle both cases, so we use ...args
+exports.write = function (fd, buffer, ...args) {
+ if (typeof args[args.length - 1] === 'function') {
+ return fs.write(fd, buffer, ...args)
+ }
+
+ return new Promise((resolve, reject) => {
+ fs.write(fd, buffer, ...args, (err, bytesWritten, buffer) => {
+ if (err) return reject(err)
+ resolve({ bytesWritten, buffer })
+ })
+ })
+}
+
+// fs.writev only available in Node v12.9.0+
+if (typeof fs.writev === 'function') {
+ // Function signature is
+ // s.writev(fd, buffers[, position], callback)
+ // We need to handle the optional arg, so we use ...args
+ exports.writev = function (fd, buffers, ...args) {
+ if (typeof args[args.length - 1] === 'function') {
+ return fs.writev(fd, buffers, ...args)
+ }
+
+ return new Promise((resolve, reject) => {
+ fs.writev(fd, buffers, ...args, (err, bytesWritten, buffers) => {
+ if (err) return reject(err)
+ resolve({ bytesWritten, buffers })
+ })
+ })
+ }
+}
+
+// fs.realpath.native only available in Node v9.2+
+if (typeof fs.realpath.native === 'function') {
+ exports.realpath.native = u(fs.realpath.native)
+}
diff --git a/desktop/node_modules/@electron/universal/node_modules/fs-extra/lib/index.js b/desktop/node_modules/@electron/universal/node_modules/fs-extra/lib/index.js
new file mode 100644
index 0000000..d9468e6
--- /dev/null
+++ b/desktop/node_modules/@electron/universal/node_modules/fs-extra/lib/index.js
@@ -0,0 +1,27 @@
+'use strict'
+
+module.exports = {
+ // Export promiseified graceful-fs:
+ ...require('./fs'),
+ // Export extra methods:
+ ...require('./copy-sync'),
+ ...require('./copy'),
+ ...require('./empty'),
+ ...require('./ensure'),
+ ...require('./json'),
+ ...require('./mkdirs'),
+ ...require('./move-sync'),
+ ...require('./move'),
+ ...require('./output'),
+ ...require('./path-exists'),
+ ...require('./remove')
+}
+
+// Export fs.promises as a getter property so that we don't trigger
+// ExperimentalWarning before fs.promises is actually accessed.
+const fs = require('fs')
+if (Object.getOwnPropertyDescriptor(fs, 'promises')) {
+ Object.defineProperty(module.exports, 'promises', {
+ get () { return fs.promises }
+ })
+}
diff --git a/desktop/node_modules/@electron/universal/node_modules/fs-extra/lib/json/index.js b/desktop/node_modules/@electron/universal/node_modules/fs-extra/lib/json/index.js
new file mode 100644
index 0000000..900126a
--- /dev/null
+++ b/desktop/node_modules/@electron/universal/node_modules/fs-extra/lib/json/index.js
@@ -0,0 +1,16 @@
+'use strict'
+
+const u = require('universalify').fromPromise
+const jsonFile = require('./jsonfile')
+
+jsonFile.outputJson = u(require('./output-json'))
+jsonFile.outputJsonSync = require('./output-json-sync')
+// aliases
+jsonFile.outputJSON = jsonFile.outputJson
+jsonFile.outputJSONSync = jsonFile.outputJsonSync
+jsonFile.writeJSON = jsonFile.writeJson
+jsonFile.writeJSONSync = jsonFile.writeJsonSync
+jsonFile.readJSON = jsonFile.readJson
+jsonFile.readJSONSync = jsonFile.readJsonSync
+
+module.exports = jsonFile
diff --git a/desktop/node_modules/@electron/universal/node_modules/fs-extra/lib/json/jsonfile.js b/desktop/node_modules/@electron/universal/node_modules/fs-extra/lib/json/jsonfile.js
new file mode 100644
index 0000000..f11d34d
--- /dev/null
+++ b/desktop/node_modules/@electron/universal/node_modules/fs-extra/lib/json/jsonfile.js
@@ -0,0 +1,11 @@
+'use strict'
+
+const jsonFile = require('jsonfile')
+
+module.exports = {
+ // jsonfile exports
+ readJson: jsonFile.readFile,
+ readJsonSync: jsonFile.readFileSync,
+ writeJson: jsonFile.writeFile,
+ writeJsonSync: jsonFile.writeFileSync
+}
diff --git a/desktop/node_modules/@electron/universal/node_modules/fs-extra/lib/json/output-json-sync.js b/desktop/node_modules/@electron/universal/node_modules/fs-extra/lib/json/output-json-sync.js
new file mode 100644
index 0000000..f76b474
--- /dev/null
+++ b/desktop/node_modules/@electron/universal/node_modules/fs-extra/lib/json/output-json-sync.js
@@ -0,0 +1,12 @@
+'use strict'
+
+const { stringify } = require('jsonfile/utils')
+const { outputFileSync } = require('../output')
+
+function outputJsonSync (file, data, options) {
+ const str = stringify(data, options)
+
+ outputFileSync(file, str, options)
+}
+
+module.exports = outputJsonSync
diff --git a/desktop/node_modules/@electron/universal/node_modules/fs-extra/lib/json/output-json.js b/desktop/node_modules/@electron/universal/node_modules/fs-extra/lib/json/output-json.js
new file mode 100644
index 0000000..0fc6689
--- /dev/null
+++ b/desktop/node_modules/@electron/universal/node_modules/fs-extra/lib/json/output-json.js
@@ -0,0 +1,12 @@
+'use strict'
+
+const { stringify } = require('jsonfile/utils')
+const { outputFile } = require('../output')
+
+async function outputJson (file, data, options = {}) {
+ const str = stringify(data, options)
+
+ await outputFile(file, str, options)
+}
+
+module.exports = outputJson
diff --git a/desktop/node_modules/@electron/universal/node_modules/fs-extra/lib/mkdirs/index.js b/desktop/node_modules/@electron/universal/node_modules/fs-extra/lib/mkdirs/index.js
new file mode 100644
index 0000000..9edecee
--- /dev/null
+++ b/desktop/node_modules/@electron/universal/node_modules/fs-extra/lib/mkdirs/index.js
@@ -0,0 +1,14 @@
+'use strict'
+const u = require('universalify').fromPromise
+const { makeDir: _makeDir, makeDirSync } = require('./make-dir')
+const makeDir = u(_makeDir)
+
+module.exports = {
+ mkdirs: makeDir,
+ mkdirsSync: makeDirSync,
+ // alias
+ mkdirp: makeDir,
+ mkdirpSync: makeDirSync,
+ ensureDir: makeDir,
+ ensureDirSync: makeDirSync
+}
diff --git a/desktop/node_modules/@electron/universal/node_modules/fs-extra/lib/mkdirs/make-dir.js b/desktop/node_modules/@electron/universal/node_modules/fs-extra/lib/mkdirs/make-dir.js
new file mode 100644
index 0000000..3e7e836
--- /dev/null
+++ b/desktop/node_modules/@electron/universal/node_modules/fs-extra/lib/mkdirs/make-dir.js
@@ -0,0 +1,141 @@
+// Adapted from https://github.com/sindresorhus/make-dir
+// Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)
+// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+'use strict'
+const fs = require('../fs')
+const path = require('path')
+const atLeastNode = require('at-least-node')
+
+const useNativeRecursiveOption = atLeastNode('10.12.0')
+
+// https://github.com/nodejs/node/issues/8987
+// https://github.com/libuv/libuv/pull/1088
+const checkPath = pth => {
+ if (process.platform === 'win32') {
+ const pathHasInvalidWinCharacters = /[<>:"|?*]/.test(pth.replace(path.parse(pth).root, ''))
+
+ if (pathHasInvalidWinCharacters) {
+ const error = new Error(`Path contains invalid characters: ${pth}`)
+ error.code = 'EINVAL'
+ throw error
+ }
+ }
+}
+
+const processOptions = options => {
+ const defaults = { mode: 0o777 }
+ if (typeof options === 'number') options = { mode: options }
+ return { ...defaults, ...options }
+}
+
+const permissionError = pth => {
+ // This replicates the exception of `fs.mkdir` with native the
+ // `recusive` option when run on an invalid drive under Windows.
+ const error = new Error(`operation not permitted, mkdir '${pth}'`)
+ error.code = 'EPERM'
+ error.errno = -4048
+ error.path = pth
+ error.syscall = 'mkdir'
+ return error
+}
+
+module.exports.makeDir = async (input, options) => {
+ checkPath(input)
+ options = processOptions(options)
+
+ if (useNativeRecursiveOption) {
+ const pth = path.resolve(input)
+
+ return fs.mkdir(pth, {
+ mode: options.mode,
+ recursive: true
+ })
+ }
+
+ const make = async pth => {
+ try {
+ await fs.mkdir(pth, options.mode)
+ } catch (error) {
+ if (error.code === 'EPERM') {
+ throw error
+ }
+
+ if (error.code === 'ENOENT') {
+ if (path.dirname(pth) === pth) {
+ throw permissionError(pth)
+ }
+
+ if (error.message.includes('null bytes')) {
+ throw error
+ }
+
+ await make(path.dirname(pth))
+ return make(pth)
+ }
+
+ try {
+ const stats = await fs.stat(pth)
+ if (!stats.isDirectory()) {
+ // This error is never exposed to the user
+ // it is caught below, and the original error is thrown
+ throw new Error('The path is not a directory')
+ }
+ } catch {
+ throw error
+ }
+ }
+ }
+
+ return make(path.resolve(input))
+}
+
+module.exports.makeDirSync = (input, options) => {
+ checkPath(input)
+ options = processOptions(options)
+
+ if (useNativeRecursiveOption) {
+ const pth = path.resolve(input)
+
+ return fs.mkdirSync(pth, {
+ mode: options.mode,
+ recursive: true
+ })
+ }
+
+ const make = pth => {
+ try {
+ fs.mkdirSync(pth, options.mode)
+ } catch (error) {
+ if (error.code === 'EPERM') {
+ throw error
+ }
+
+ if (error.code === 'ENOENT') {
+ if (path.dirname(pth) === pth) {
+ throw permissionError(pth)
+ }
+
+ if (error.message.includes('null bytes')) {
+ throw error
+ }
+
+ make(path.dirname(pth))
+ return make(pth)
+ }
+
+ try {
+ if (!fs.statSync(pth).isDirectory()) {
+ // This error is never exposed to the user
+ // it is caught below, and the original error is thrown
+ throw new Error('The path is not a directory')
+ }
+ } catch {
+ throw error
+ }
+ }
+ }
+
+ return make(path.resolve(input))
+}
diff --git a/desktop/node_modules/@electron/universal/node_modules/fs-extra/lib/move-sync/index.js b/desktop/node_modules/@electron/universal/node_modules/fs-extra/lib/move-sync/index.js
new file mode 100644
index 0000000..af90b06
--- /dev/null
+++ b/desktop/node_modules/@electron/universal/node_modules/fs-extra/lib/move-sync/index.js
@@ -0,0 +1,5 @@
+'use strict'
+
+module.exports = {
+ moveSync: require('./move-sync')
+}
diff --git a/desktop/node_modules/@electron/universal/node_modules/fs-extra/lib/move-sync/move-sync.js b/desktop/node_modules/@electron/universal/node_modules/fs-extra/lib/move-sync/move-sync.js
new file mode 100644
index 0000000..20f910c
--- /dev/null
+++ b/desktop/node_modules/@electron/universal/node_modules/fs-extra/lib/move-sync/move-sync.js
@@ -0,0 +1,47 @@
+'use strict'
+
+const fs = require('graceful-fs')
+const path = require('path')
+const copySync = require('../copy-sync').copySync
+const removeSync = require('../remove').removeSync
+const mkdirpSync = require('../mkdirs').mkdirpSync
+const stat = require('../util/stat')
+
+function moveSync (src, dest, opts) {
+ opts = opts || {}
+ const overwrite = opts.overwrite || opts.clobber || false
+
+ const { srcStat } = stat.checkPathsSync(src, dest, 'move')
+ stat.checkParentPathsSync(src, srcStat, dest, 'move')
+ mkdirpSync(path.dirname(dest))
+ return doRename(src, dest, overwrite)
+}
+
+function doRename (src, dest, overwrite) {
+ if (overwrite) {
+ removeSync(dest)
+ return rename(src, dest, overwrite)
+ }
+ if (fs.existsSync(dest)) throw new Error('dest already exists.')
+ return rename(src, dest, overwrite)
+}
+
+function rename (src, dest, overwrite) {
+ try {
+ fs.renameSync(src, dest)
+ } catch (err) {
+ if (err.code !== 'EXDEV') throw err
+ return moveAcrossDevice(src, dest, overwrite)
+ }
+}
+
+function moveAcrossDevice (src, dest, overwrite) {
+ const opts = {
+ overwrite,
+ errorOnExist: true
+ }
+ copySync(src, dest, opts)
+ return removeSync(src)
+}
+
+module.exports = moveSync
diff --git a/desktop/node_modules/@electron/universal/node_modules/fs-extra/lib/move/index.js b/desktop/node_modules/@electron/universal/node_modules/fs-extra/lib/move/index.js
new file mode 100644
index 0000000..3785345
--- /dev/null
+++ b/desktop/node_modules/@electron/universal/node_modules/fs-extra/lib/move/index.js
@@ -0,0 +1,6 @@
+'use strict'
+
+const u = require('universalify').fromCallback
+module.exports = {
+ move: u(require('./move'))
+}
diff --git a/desktop/node_modules/@electron/universal/node_modules/fs-extra/lib/move/move.js b/desktop/node_modules/@electron/universal/node_modules/fs-extra/lib/move/move.js
new file mode 100644
index 0000000..fa3ea61
--- /dev/null
+++ b/desktop/node_modules/@electron/universal/node_modules/fs-extra/lib/move/move.js
@@ -0,0 +1,65 @@
+'use strict'
+
+const fs = require('graceful-fs')
+const path = require('path')
+const copy = require('../copy').copy
+const remove = require('../remove').remove
+const mkdirp = require('../mkdirs').mkdirp
+const pathExists = require('../path-exists').pathExists
+const stat = require('../util/stat')
+
+function move (src, dest, opts, cb) {
+ if (typeof opts === 'function') {
+ cb = opts
+ opts = {}
+ }
+
+ const overwrite = opts.overwrite || opts.clobber || false
+
+ stat.checkPaths(src, dest, 'move', (err, stats) => {
+ if (err) return cb(err)
+ const { srcStat } = stats
+ stat.checkParentPaths(src, srcStat, dest, 'move', err => {
+ if (err) return cb(err)
+ mkdirp(path.dirname(dest), err => {
+ if (err) return cb(err)
+ return doRename(src, dest, overwrite, cb)
+ })
+ })
+ })
+}
+
+function doRename (src, dest, overwrite, cb) {
+ if (overwrite) {
+ return remove(dest, err => {
+ if (err) return cb(err)
+ return rename(src, dest, overwrite, cb)
+ })
+ }
+ pathExists(dest, (err, destExists) => {
+ if (err) return cb(err)
+ if (destExists) return cb(new Error('dest already exists.'))
+ return rename(src, dest, overwrite, cb)
+ })
+}
+
+function rename (src, dest, overwrite, cb) {
+ fs.rename(src, dest, err => {
+ if (!err) return cb()
+ if (err.code !== 'EXDEV') return cb(err)
+ return moveAcrossDevice(src, dest, overwrite, cb)
+ })
+}
+
+function moveAcrossDevice (src, dest, overwrite, cb) {
+ const opts = {
+ overwrite,
+ errorOnExist: true
+ }
+ copy(src, dest, opts, err => {
+ if (err) return cb(err)
+ return remove(src, cb)
+ })
+}
+
+module.exports = move
diff --git a/desktop/node_modules/@electron/universal/node_modules/fs-extra/lib/output/index.js b/desktop/node_modules/@electron/universal/node_modules/fs-extra/lib/output/index.js
new file mode 100644
index 0000000..92297ca
--- /dev/null
+++ b/desktop/node_modules/@electron/universal/node_modules/fs-extra/lib/output/index.js
@@ -0,0 +1,40 @@
+'use strict'
+
+const u = require('universalify').fromCallback
+const fs = require('graceful-fs')
+const path = require('path')
+const mkdir = require('../mkdirs')
+const pathExists = require('../path-exists').pathExists
+
+function outputFile (file, data, encoding, callback) {
+ if (typeof encoding === 'function') {
+ callback = encoding
+ encoding = 'utf8'
+ }
+
+ const dir = path.dirname(file)
+ pathExists(dir, (err, itDoes) => {
+ if (err) return callback(err)
+ if (itDoes) return fs.writeFile(file, data, encoding, callback)
+
+ mkdir.mkdirs(dir, err => {
+ if (err) return callback(err)
+
+ fs.writeFile(file, data, encoding, callback)
+ })
+ })
+}
+
+function outputFileSync (file, ...args) {
+ const dir = path.dirname(file)
+ if (fs.existsSync(dir)) {
+ return fs.writeFileSync(file, ...args)
+ }
+ mkdir.mkdirsSync(dir)
+ fs.writeFileSync(file, ...args)
+}
+
+module.exports = {
+ outputFile: u(outputFile),
+ outputFileSync
+}
diff --git a/desktop/node_modules/@electron/universal/node_modules/fs-extra/lib/path-exists/index.js b/desktop/node_modules/@electron/universal/node_modules/fs-extra/lib/path-exists/index.js
new file mode 100644
index 0000000..ddd9bc7
--- /dev/null
+++ b/desktop/node_modules/@electron/universal/node_modules/fs-extra/lib/path-exists/index.js
@@ -0,0 +1,12 @@
+'use strict'
+const u = require('universalify').fromPromise
+const fs = require('../fs')
+
+function pathExists (path) {
+ return fs.access(path).then(() => true).catch(() => false)
+}
+
+module.exports = {
+ pathExists: u(pathExists),
+ pathExistsSync: fs.existsSync
+}
diff --git a/desktop/node_modules/@electron/universal/node_modules/fs-extra/lib/remove/index.js b/desktop/node_modules/@electron/universal/node_modules/fs-extra/lib/remove/index.js
new file mode 100644
index 0000000..cee5340
--- /dev/null
+++ b/desktop/node_modules/@electron/universal/node_modules/fs-extra/lib/remove/index.js
@@ -0,0 +1,9 @@
+'use strict'
+
+const u = require('universalify').fromCallback
+const rimraf = require('./rimraf')
+
+module.exports = {
+ remove: u(rimraf),
+ removeSync: rimraf.sync
+}
diff --git a/desktop/node_modules/@electron/universal/node_modules/fs-extra/lib/remove/rimraf.js b/desktop/node_modules/@electron/universal/node_modules/fs-extra/lib/remove/rimraf.js
new file mode 100644
index 0000000..2c77102
--- /dev/null
+++ b/desktop/node_modules/@electron/universal/node_modules/fs-extra/lib/remove/rimraf.js
@@ -0,0 +1,302 @@
+'use strict'
+
+const fs = require('graceful-fs')
+const path = require('path')
+const assert = require('assert')
+
+const isWindows = (process.platform === 'win32')
+
+function defaults (options) {
+ const methods = [
+ 'unlink',
+ 'chmod',
+ 'stat',
+ 'lstat',
+ 'rmdir',
+ 'readdir'
+ ]
+ methods.forEach(m => {
+ options[m] = options[m] || fs[m]
+ m = m + 'Sync'
+ options[m] = options[m] || fs[m]
+ })
+
+ options.maxBusyTries = options.maxBusyTries || 3
+}
+
+function rimraf (p, options, cb) {
+ let busyTries = 0
+
+ if (typeof options === 'function') {
+ cb = options
+ options = {}
+ }
+
+ assert(p, 'rimraf: missing path')
+ assert.strictEqual(typeof p, 'string', 'rimraf: path should be a string')
+ assert.strictEqual(typeof cb, 'function', 'rimraf: callback function required')
+ assert(options, 'rimraf: invalid options argument provided')
+ assert.strictEqual(typeof options, 'object', 'rimraf: options should be object')
+
+ defaults(options)
+
+ rimraf_(p, options, function CB (er) {
+ if (er) {
+ if ((er.code === 'EBUSY' || er.code === 'ENOTEMPTY' || er.code === 'EPERM') &&
+ busyTries < options.maxBusyTries) {
+ busyTries++
+ const time = busyTries * 100
+ // try again, with the same exact callback as this one.
+ return setTimeout(() => rimraf_(p, options, CB), time)
+ }
+
+ // already gone
+ if (er.code === 'ENOENT') er = null
+ }
+
+ cb(er)
+ })
+}
+
+// Two possible strategies.
+// 1. Assume it's a file. unlink it, then do the dir stuff on EPERM or EISDIR
+// 2. Assume it's a directory. readdir, then do the file stuff on ENOTDIR
+//
+// Both result in an extra syscall when you guess wrong. However, there
+// are likely far more normal files in the world than directories. This
+// is based on the assumption that a the average number of files per
+// directory is >= 1.
+//
+// If anyone ever complains about this, then I guess the strategy could
+// be made configurable somehow. But until then, YAGNI.
+function rimraf_ (p, options, cb) {
+ assert(p)
+ assert(options)
+ assert(typeof cb === 'function')
+
+ // sunos lets the root user unlink directories, which is... weird.
+ // so we have to lstat here and make sure it's not a dir.
+ options.lstat(p, (er, st) => {
+ if (er && er.code === 'ENOENT') {
+ return cb(null)
+ }
+
+ // Windows can EPERM on stat. Life is suffering.
+ if (er && er.code === 'EPERM' && isWindows) {
+ return fixWinEPERM(p, options, er, cb)
+ }
+
+ if (st && st.isDirectory()) {
+ return rmdir(p, options, er, cb)
+ }
+
+ options.unlink(p, er => {
+ if (er) {
+ if (er.code === 'ENOENT') {
+ return cb(null)
+ }
+ if (er.code === 'EPERM') {
+ return (isWindows)
+ ? fixWinEPERM(p, options, er, cb)
+ : rmdir(p, options, er, cb)
+ }
+ if (er.code === 'EISDIR') {
+ return rmdir(p, options, er, cb)
+ }
+ }
+ return cb(er)
+ })
+ })
+}
+
+function fixWinEPERM (p, options, er, cb) {
+ assert(p)
+ assert(options)
+ assert(typeof cb === 'function')
+
+ options.chmod(p, 0o666, er2 => {
+ if (er2) {
+ cb(er2.code === 'ENOENT' ? null : er)
+ } else {
+ options.stat(p, (er3, stats) => {
+ if (er3) {
+ cb(er3.code === 'ENOENT' ? null : er)
+ } else if (stats.isDirectory()) {
+ rmdir(p, options, er, cb)
+ } else {
+ options.unlink(p, cb)
+ }
+ })
+ }
+ })
+}
+
+function fixWinEPERMSync (p, options, er) {
+ let stats
+
+ assert(p)
+ assert(options)
+
+ try {
+ options.chmodSync(p, 0o666)
+ } catch (er2) {
+ if (er2.code === 'ENOENT') {
+ return
+ } else {
+ throw er
+ }
+ }
+
+ try {
+ stats = options.statSync(p)
+ } catch (er3) {
+ if (er3.code === 'ENOENT') {
+ return
+ } else {
+ throw er
+ }
+ }
+
+ if (stats.isDirectory()) {
+ rmdirSync(p, options, er)
+ } else {
+ options.unlinkSync(p)
+ }
+}
+
+function rmdir (p, options, originalEr, cb) {
+ assert(p)
+ assert(options)
+ assert(typeof cb === 'function')
+
+ // try to rmdir first, and only readdir on ENOTEMPTY or EEXIST (SunOS)
+ // if we guessed wrong, and it's not a directory, then
+ // raise the original error.
+ options.rmdir(p, er => {
+ if (er && (er.code === 'ENOTEMPTY' || er.code === 'EEXIST' || er.code === 'EPERM')) {
+ rmkids(p, options, cb)
+ } else if (er && er.code === 'ENOTDIR') {
+ cb(originalEr)
+ } else {
+ cb(er)
+ }
+ })
+}
+
+function rmkids (p, options, cb) {
+ assert(p)
+ assert(options)
+ assert(typeof cb === 'function')
+
+ options.readdir(p, (er, files) => {
+ if (er) return cb(er)
+
+ let n = files.length
+ let errState
+
+ if (n === 0) return options.rmdir(p, cb)
+
+ files.forEach(f => {
+ rimraf(path.join(p, f), options, er => {
+ if (errState) {
+ return
+ }
+ if (er) return cb(errState = er)
+ if (--n === 0) {
+ options.rmdir(p, cb)
+ }
+ })
+ })
+ })
+}
+
+// this looks simpler, and is strictly *faster*, but will
+// tie up the JavaScript thread and fail on excessively
+// deep directory trees.
+function rimrafSync (p, options) {
+ let st
+
+ options = options || {}
+ defaults(options)
+
+ assert(p, 'rimraf: missing path')
+ assert.strictEqual(typeof p, 'string', 'rimraf: path should be a string')
+ assert(options, 'rimraf: missing options')
+ assert.strictEqual(typeof options, 'object', 'rimraf: options should be object')
+
+ try {
+ st = options.lstatSync(p)
+ } catch (er) {
+ if (er.code === 'ENOENT') {
+ return
+ }
+
+ // Windows can EPERM on stat. Life is suffering.
+ if (er.code === 'EPERM' && isWindows) {
+ fixWinEPERMSync(p, options, er)
+ }
+ }
+
+ try {
+ // sunos lets the root user unlink directories, which is... weird.
+ if (st && st.isDirectory()) {
+ rmdirSync(p, options, null)
+ } else {
+ options.unlinkSync(p)
+ }
+ } catch (er) {
+ if (er.code === 'ENOENT') {
+ return
+ } else if (er.code === 'EPERM') {
+ return isWindows ? fixWinEPERMSync(p, options, er) : rmdirSync(p, options, er)
+ } else if (er.code !== 'EISDIR') {
+ throw er
+ }
+ rmdirSync(p, options, er)
+ }
+}
+
+function rmdirSync (p, options, originalEr) {
+ assert(p)
+ assert(options)
+
+ try {
+ options.rmdirSync(p)
+ } catch (er) {
+ if (er.code === 'ENOTDIR') {
+ throw originalEr
+ } else if (er.code === 'ENOTEMPTY' || er.code === 'EEXIST' || er.code === 'EPERM') {
+ rmkidsSync(p, options)
+ } else if (er.code !== 'ENOENT') {
+ throw er
+ }
+ }
+}
+
+function rmkidsSync (p, options) {
+ assert(p)
+ assert(options)
+ options.readdirSync(p).forEach(f => rimrafSync(path.join(p, f), options))
+
+ if (isWindows) {
+ // We only end up here once we got ENOTEMPTY at least once, and
+ // at this point, we are guaranteed to have removed all the kids.
+ // So, we know that it won't be ENOENT or ENOTDIR or anything else.
+ // try really hard to delete stuff on windows, because it has a
+ // PROFOUNDLY annoying habit of not closing handles promptly when
+ // files are deleted, resulting in spurious ENOTEMPTY errors.
+ const startTime = Date.now()
+ do {
+ try {
+ const ret = options.rmdirSync(p, options)
+ return ret
+ } catch {}
+ } while (Date.now() - startTime < 500) // give up after 500ms
+ } else {
+ const ret = options.rmdirSync(p, options)
+ return ret
+ }
+}
+
+module.exports = rimraf
+rimraf.sync = rimrafSync
diff --git a/desktop/node_modules/@electron/universal/node_modules/fs-extra/lib/util/stat.js b/desktop/node_modules/@electron/universal/node_modules/fs-extra/lib/util/stat.js
new file mode 100644
index 0000000..0b1c1b0
--- /dev/null
+++ b/desktop/node_modules/@electron/universal/node_modules/fs-extra/lib/util/stat.js
@@ -0,0 +1,139 @@
+'use strict'
+
+const fs = require('../fs')
+const path = require('path')
+const util = require('util')
+const atLeastNode = require('at-least-node')
+
+const nodeSupportsBigInt = atLeastNode('10.5.0')
+const stat = (file) => nodeSupportsBigInt ? fs.stat(file, { bigint: true }) : fs.stat(file)
+const statSync = (file) => nodeSupportsBigInt ? fs.statSync(file, { bigint: true }) : fs.statSync(file)
+
+function getStats (src, dest) {
+ return Promise.all([
+ stat(src),
+ stat(dest).catch(err => {
+ if (err.code === 'ENOENT') return null
+ throw err
+ })
+ ]).then(([srcStat, destStat]) => ({ srcStat, destStat }))
+}
+
+function getStatsSync (src, dest) {
+ let destStat
+ const srcStat = statSync(src)
+ try {
+ destStat = statSync(dest)
+ } catch (err) {
+ if (err.code === 'ENOENT') return { srcStat, destStat: null }
+ throw err
+ }
+ return { srcStat, destStat }
+}
+
+function checkPaths (src, dest, funcName, cb) {
+ util.callbackify(getStats)(src, dest, (err, stats) => {
+ if (err) return cb(err)
+ const { srcStat, destStat } = stats
+ if (destStat && areIdentical(srcStat, destStat)) {
+ return cb(new Error('Source and destination must not be the same.'))
+ }
+ if (srcStat.isDirectory() && isSrcSubdir(src, dest)) {
+ return cb(new Error(errMsg(src, dest, funcName)))
+ }
+ return cb(null, { srcStat, destStat })
+ })
+}
+
+function checkPathsSync (src, dest, funcName) {
+ const { srcStat, destStat } = getStatsSync(src, dest)
+ if (destStat && areIdentical(srcStat, destStat)) {
+ throw new Error('Source and destination must not be the same.')
+ }
+ if (srcStat.isDirectory() && isSrcSubdir(src, dest)) {
+ throw new Error(errMsg(src, dest, funcName))
+ }
+ return { srcStat, destStat }
+}
+
+// recursively check if dest parent is a subdirectory of src.
+// It works for all file types including symlinks since it
+// checks the src and dest inodes. It starts from the deepest
+// parent and stops once it reaches the src parent or the root path.
+function checkParentPaths (src, srcStat, dest, funcName, cb) {
+ const srcParent = path.resolve(path.dirname(src))
+ const destParent = path.resolve(path.dirname(dest))
+ if (destParent === srcParent || destParent === path.parse(destParent).root) return cb()
+ const callback = (err, destStat) => {
+ if (err) {
+ if (err.code === 'ENOENT') return cb()
+ return cb(err)
+ }
+ if (areIdentical(srcStat, destStat)) {
+ return cb(new Error(errMsg(src, dest, funcName)))
+ }
+ return checkParentPaths(src, srcStat, destParent, funcName, cb)
+ }
+ if (nodeSupportsBigInt) fs.stat(destParent, { bigint: true }, callback)
+ else fs.stat(destParent, callback)
+}
+
+function checkParentPathsSync (src, srcStat, dest, funcName) {
+ const srcParent = path.resolve(path.dirname(src))
+ const destParent = path.resolve(path.dirname(dest))
+ if (destParent === srcParent || destParent === path.parse(destParent).root) return
+ let destStat
+ try {
+ destStat = statSync(destParent)
+ } catch (err) {
+ if (err.code === 'ENOENT') return
+ throw err
+ }
+ if (areIdentical(srcStat, destStat)) {
+ throw new Error(errMsg(src, dest, funcName))
+ }
+ return checkParentPathsSync(src, srcStat, destParent, funcName)
+}
+
+function areIdentical (srcStat, destStat) {
+ if (destStat.ino && destStat.dev && destStat.ino === srcStat.ino && destStat.dev === srcStat.dev) {
+ if (nodeSupportsBigInt || destStat.ino < Number.MAX_SAFE_INTEGER) {
+ // definitive answer
+ return true
+ }
+ // Use additional heuristics if we can't use 'bigint'.
+ // Different 'ino' could be represented the same if they are >= Number.MAX_SAFE_INTEGER
+ // See issue 657
+ if (destStat.size === srcStat.size &&
+ destStat.mode === srcStat.mode &&
+ destStat.nlink === srcStat.nlink &&
+ destStat.atimeMs === srcStat.atimeMs &&
+ destStat.mtimeMs === srcStat.mtimeMs &&
+ destStat.ctimeMs === srcStat.ctimeMs &&
+ destStat.birthtimeMs === srcStat.birthtimeMs) {
+ // heuristic answer
+ return true
+ }
+ }
+ return false
+}
+
+// return true if dest is a subdir of src, otherwise false.
+// It only checks the path strings.
+function isSrcSubdir (src, dest) {
+ const srcArr = path.resolve(src).split(path.sep).filter(i => i)
+ const destArr = path.resolve(dest).split(path.sep).filter(i => i)
+ return srcArr.reduce((acc, cur, i) => acc && destArr[i] === cur, true)
+}
+
+function errMsg (src, dest, funcName) {
+ return `Cannot ${funcName} '${src}' to a subdirectory of itself, '${dest}'.`
+}
+
+module.exports = {
+ checkPaths,
+ checkPathsSync,
+ checkParentPaths,
+ checkParentPathsSync,
+ isSrcSubdir
+}
diff --git a/desktop/node_modules/@electron/universal/node_modules/fs-extra/lib/util/utimes.js b/desktop/node_modules/@electron/universal/node_modules/fs-extra/lib/util/utimes.js
new file mode 100644
index 0000000..75395de
--- /dev/null
+++ b/desktop/node_modules/@electron/universal/node_modules/fs-extra/lib/util/utimes.js
@@ -0,0 +1,26 @@
+'use strict'
+
+const fs = require('graceful-fs')
+
+function utimesMillis (path, atime, mtime, callback) {
+ // if (!HAS_MILLIS_RES) return fs.utimes(path, atime, mtime, callback)
+ fs.open(path, 'r+', (err, fd) => {
+ if (err) return callback(err)
+ fs.futimes(fd, atime, mtime, futimesErr => {
+ fs.close(fd, closeErr => {
+ if (callback) callback(futimesErr || closeErr)
+ })
+ })
+ })
+}
+
+function utimesMillisSync (path, atime, mtime) {
+ const fd = fs.openSync(path, 'r+')
+ fs.futimesSync(fd, atime, mtime)
+ return fs.closeSync(fd)
+}
+
+module.exports = {
+ utimesMillis,
+ utimesMillisSync
+}
diff --git a/desktop/node_modules/@electron/universal/node_modules/fs-extra/package.json b/desktop/node_modules/@electron/universal/node_modules/fs-extra/package.json
new file mode 100644
index 0000000..6f7d8dd
--- /dev/null
+++ b/desktop/node_modules/@electron/universal/node_modules/fs-extra/package.json
@@ -0,0 +1,70 @@
+{
+ "name": "fs-extra",
+ "version": "9.1.0",
+ "description": "fs-extra contains methods that aren't included in the vanilla Node.js fs package. Such as recursive mkdir, copy, and remove.",
+ "engines": {
+ "node": ">=10"
+ },
+ "homepage": "https://github.com/jprichardson/node-fs-extra",
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/jprichardson/node-fs-extra"
+ },
+ "keywords": [
+ "fs",
+ "file",
+ "file system",
+ "copy",
+ "directory",
+ "extra",
+ "mkdirp",
+ "mkdir",
+ "mkdirs",
+ "recursive",
+ "json",
+ "read",
+ "write",
+ "extra",
+ "delete",
+ "remove",
+ "touch",
+ "create",
+ "text",
+ "output",
+ "move",
+ "promise"
+ ],
+ "author": "JP Richardson <jprichardson@gmail.com>",
+ "license": "MIT",
+ "dependencies": {
+ "at-least-node": "^1.0.0",
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^6.0.1",
+ "universalify": "^2.0.0"
+ },
+ "devDependencies": {
+ "coveralls": "^3.0.0",
+ "klaw": "^2.1.1",
+ "klaw-sync": "^3.0.2",
+ "minimist": "^1.1.1",
+ "mocha": "^5.0.5",
+ "nyc": "^15.0.0",
+ "proxyquire": "^2.0.1",
+ "read-dir-files": "^0.1.1",
+ "standard": "^14.1.0"
+ },
+ "main": "./lib/index.js",
+ "files": [
+ "lib/",
+ "!lib/**/__tests__/"
+ ],
+ "scripts": {
+ "full-ci": "npm run lint && npm run coverage",
+ "coverage": "nyc -r lcovonly npm run unit",
+ "coveralls": "coveralls < coverage/lcov.info",
+ "lint": "standard",
+ "test-find": "find ./lib/**/__tests__ -name *.test.js | xargs mocha",
+ "test": "npm run lint && npm run unit",
+ "unit": "node test.js"
+ }
+}
diff --git a/desktop/node_modules/@electron/universal/node_modules/jsonfile/CHANGELOG.md b/desktop/node_modules/@electron/universal/node_modules/jsonfile/CHANGELOG.md
new file mode 100644
index 0000000..d772e43
--- /dev/null
+++ b/desktop/node_modules/@electron/universal/node_modules/jsonfile/CHANGELOG.md
@@ -0,0 +1,171 @@
+6.1.0 / 2020-10-31
+------------------
+
+- Add `finalEOL` option to disable writing final EOL ([#115](https://github.com/jprichardson/node-jsonfile/issues/115), [#137](https://github.com/jprichardson/node-jsonfile/pull/137))
+- Update dependency ([#138](https://github.com/jprichardson/node-jsonfile/pull/138))
+
+6.0.1 / 2020-03-07
+------------------
+
+- Update dependency ([#130](https://github.com/jprichardson/node-jsonfile/pull/130))
+- Fix code style ([#129](https://github.com/jprichardson/node-jsonfile/pull/129))
+
+6.0.0 / 2020-02-24
+------------------
+
+- **BREAKING:** Drop support for Node 6 & 8 ([#128](https://github.com/jprichardson/node-jsonfile/pull/128))
+- **BREAKING:** Do not allow passing `null` as options to `readFile()` or `writeFile()` ([#128](https://github.com/jprichardson/node-jsonfile/pull/128))
+- Refactor internals ([#128](https://github.com/jprichardson/node-jsonfile/pull/128))
+
+5.0.0 / 2018-09-08
+------------------
+
+- **BREAKING:** Drop Node 4 support
+- **BREAKING:** If no callback is passed to an asynchronous method, a promise is now returned ([#109](https://github.com/jprichardson/node-jsonfile/pull/109))
+- Cleanup docs
+
+4.0.0 / 2017-07-12
+------------------
+
+- **BREAKING:** Remove global `spaces` option.
+- **BREAKING:** Drop support for Node 0.10, 0.12, and io.js.
+- Remove undocumented `passParsingErrors` option.
+- Added `EOL` override option to `writeFile` when using `spaces`. [#89]
+
+3.0.1 / 2017-07-05
+------------------
+
+- Fixed bug in `writeFile` when there was a serialization error & no callback was passed. In previous versions, an empty file would be written; now no file is written.
+
+3.0.0 / 2017-04-25
+------------------
+
+- Changed behavior of `throws` option for `readFileSync`; now does not throw filesystem errors when `throws` is `false`
+
+2.4.0 / 2016-09-15
+------------------
+### Changed
+- added optional support for `graceful-fs` [#62]
+
+2.3.1 / 2016-05-13
+------------------
+- fix to support BOM. [#45][#45]
+
+2.3.0 / 2016-04-16
+------------------
+- add `throws` to `readFile()`. See [#39][#39]
+- add support for any arbitrary `fs` module. Useful with [mock-fs](https://www.npmjs.com/package/mock-fs)
+
+2.2.3 / 2015-10-14
+------------------
+- include file name in parse error. See: https://github.com/jprichardson/node-jsonfile/pull/34
+
+2.2.2 / 2015-09-16
+------------------
+- split out tests into separate files
+- fixed `throws` when set to `true` in `readFileSync()`. See: https://github.com/jprichardson/node-jsonfile/pull/33
+
+2.2.1 / 2015-06-25
+------------------
+- fixed regression when passing in string as encoding for options in `writeFile()` and `writeFileSync()`. See: https://github.com/jprichardson/node-jsonfile/issues/28
+
+2.2.0 / 2015-06-25
+------------------
+- added `options.spaces` to `writeFile()` and `writeFileSync()`
+
+2.1.2 / 2015-06-22
+------------------
+- fixed if passed `readFileSync(file, 'utf8')`. See: https://github.com/jprichardson/node-jsonfile/issues/25
+
+2.1.1 / 2015-06-19
+------------------
+- fixed regressions if `null` is passed for options. See: https://github.com/jprichardson/node-jsonfile/issues/24
+
+2.1.0 / 2015-06-19
+------------------
+- cleanup: JavaScript Standard Style, rename files, dropped terst for assert
+- methods now support JSON revivers/replacers
+
+2.0.1 / 2015-05-24
+------------------
+- update license attribute https://github.com/jprichardson/node-jsonfile/pull/21
+
+2.0.0 / 2014-07-28
+------------------
+* added `\n` to end of file on write. [#14](https://github.com/jprichardson/node-jsonfile/pull/14)
+* added `options.throws` to `readFileSync()`
+* dropped support for Node v0.8
+
+1.2.0 / 2014-06-29
+------------------
+* removed semicolons
+* bugfix: passed `options` to `fs.readFile` and `fs.readFileSync`. This technically changes behavior, but
+changes it according to docs. [#12][#12]
+
+1.1.1 / 2013-11-11
+------------------
+* fixed catching of callback bug (ffissore / #5)
+
+1.1.0 / 2013-10-11
+------------------
+* added `options` param to methods, (seanodell / #4)
+
+1.0.1 / 2013-09-05
+------------------
+* removed `homepage` field from package.json to remove NPM warning
+
+1.0.0 / 2013-06-28
+------------------
+* added `.npmignore`, #1
+* changed spacing default from `4` to `2` to follow Node conventions
+
+0.0.1 / 2012-09-10
+------------------
+* Initial release.
+
+[#89]: https://github.com/jprichardson/node-jsonfile/pull/89
+[#45]: https://github.com/jprichardson/node-jsonfile/issues/45 "Reading of UTF8-encoded (w/ BOM) files fails"
+[#44]: https://github.com/jprichardson/node-jsonfile/issues/44 "Extra characters in written file"
+[#43]: https://github.com/jprichardson/node-jsonfile/issues/43 "Prettyfy json when written to file"
+[#42]: https://github.com/jprichardson/node-jsonfile/pull/42 "Moved fs.readFileSync within the try/catch"
+[#41]: https://github.com/jprichardson/node-jsonfile/issues/41 "Linux: Hidden file not working"
+[#40]: https://github.com/jprichardson/node-jsonfile/issues/40 "autocreate folder doesn't work from Path-value"
+[#39]: https://github.com/jprichardson/node-jsonfile/pull/39 "Add `throws` option for readFile (async)"
+[#38]: https://github.com/jprichardson/node-jsonfile/pull/38 "Update README.md writeFile[Sync] signature"
+[#37]: https://github.com/jprichardson/node-jsonfile/pull/37 "support append file"
+[#36]: https://github.com/jprichardson/node-jsonfile/pull/36 "Add typescript definition file."
+[#35]: https://github.com/jprichardson/node-jsonfile/pull/35 "Add typescript definition file."
+[#34]: https://github.com/jprichardson/node-jsonfile/pull/34 "readFile JSON parse error includes filename"
+[#33]: https://github.com/jprichardson/node-jsonfile/pull/33 "fix throw->throws typo in readFileSync()"
+[#32]: https://github.com/jprichardson/node-jsonfile/issues/32 "readFile & readFileSync can possible have strip-comments as an option?"
+[#31]: https://github.com/jprichardson/node-jsonfile/pull/31 "[Modify] Support string include is unicode escape string"
+[#30]: https://github.com/jprichardson/node-jsonfile/issues/30 "How to use Jsonfile package in Meteor.js App?"
+[#29]: https://github.com/jprichardson/node-jsonfile/issues/29 "writefile callback if no error?"
+[#28]: https://github.com/jprichardson/node-jsonfile/issues/28 "writeFile options argument broken "
+[#27]: https://github.com/jprichardson/node-jsonfile/pull/27 "Use svg instead of png to get better image quality"
+[#26]: https://github.com/jprichardson/node-jsonfile/issues/26 "Breaking change to fs-extra"
+[#25]: https://github.com/jprichardson/node-jsonfile/issues/25 "support string encoding param for read methods"
+[#24]: https://github.com/jprichardson/node-jsonfile/issues/24 "readFile: Passing in null options with a callback throws an error"
+[#23]: https://github.com/jprichardson/node-jsonfile/pull/23 "Add appendFile and appendFileSync"
+[#22]: https://github.com/jprichardson/node-jsonfile/issues/22 "Default value for spaces in readme.md is outdated"
+[#21]: https://github.com/jprichardson/node-jsonfile/pull/21 "Update license attribute"
+[#20]: https://github.com/jprichardson/node-jsonfile/issues/20 "Add simple caching functionallity"
+[#19]: https://github.com/jprichardson/node-jsonfile/pull/19 "Add appendFileSync method"
+[#18]: https://github.com/jprichardson/node-jsonfile/issues/18 "Add updateFile and updateFileSync methods"
+[#17]: https://github.com/jprichardson/node-jsonfile/issues/17 "seem read & write sync has sequentially problem"
+[#16]: https://github.com/jprichardson/node-jsonfile/pull/16 "export spaces defaulted to null"
+[#15]: https://github.com/jprichardson/node-jsonfile/issues/15 "`jsonfile.spaces` should default to `null`"
+[#14]: https://github.com/jprichardson/node-jsonfile/pull/14 "Add EOL at EOF"
+[#13]: https://github.com/jprichardson/node-jsonfile/issues/13 "Add a final newline"
+[#12]: https://github.com/jprichardson/node-jsonfile/issues/12 "readFile doesn't accept options"
+[#11]: https://github.com/jprichardson/node-jsonfile/pull/11 "Added try,catch to readFileSync"
+[#10]: https://github.com/jprichardson/node-jsonfile/issues/10 "No output or error from writeFile"
+[#9]: https://github.com/jprichardson/node-jsonfile/pull/9 "Change 'js' to 'jf' in example."
+[#8]: https://github.com/jprichardson/node-jsonfile/pull/8 "Updated forgotten module.exports to me."
+[#7]: https://github.com/jprichardson/node-jsonfile/pull/7 "Add file name in error message"
+[#6]: https://github.com/jprichardson/node-jsonfile/pull/6 "Use graceful-fs when possible"
+[#5]: https://github.com/jprichardson/node-jsonfile/pull/5 "Jsonfile doesn't behave nicely when used inside a test suite."
+[#4]: https://github.com/jprichardson/node-jsonfile/pull/4 "Added options parameter to writeFile and writeFileSync"
+[#3]: https://github.com/jprichardson/node-jsonfile/issues/3 "test2"
+[#2]: https://github.com/jprichardson/node-jsonfile/issues/2 "homepage field must be a string url. Deleted."
+[#1]: https://github.com/jprichardson/node-jsonfile/pull/1 "adding an `.npmignore` file"
diff --git a/desktop/node_modules/@electron/universal/node_modules/jsonfile/LICENSE b/desktop/node_modules/@electron/universal/node_modules/jsonfile/LICENSE
new file mode 100644
index 0000000..cb7e807
--- /dev/null
+++ b/desktop/node_modules/@electron/universal/node_modules/jsonfile/LICENSE
@@ -0,0 +1,15 @@
+(The MIT License)
+
+Copyright (c) 2012-2015, JP Richardson <jprichardson@gmail.com>
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files
+(the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify,
+ merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
+ furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS
+OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/desktop/node_modules/@electron/universal/node_modules/jsonfile/README.md b/desktop/node_modules/@electron/universal/node_modules/jsonfile/README.md
new file mode 100644
index 0000000..910cde0
--- /dev/null
+++ b/desktop/node_modules/@electron/universal/node_modules/jsonfile/README.md
@@ -0,0 +1,230 @@
+Node.js - jsonfile
+================
+
+Easily read/write JSON files in Node.js. _Note: this module cannot be used in the browser._
+
+[![npm Package](https://img.shields.io/npm/v/jsonfile.svg?style=flat-square)](https://www.npmjs.org/package/jsonfile)
+[![build status](https://secure.travis-ci.org/jprichardson/node-jsonfile.svg)](http://travis-ci.org/jprichardson/node-jsonfile)
+[![windows Build status](https://img.shields.io/appveyor/ci/jprichardson/node-jsonfile/master.svg?label=windows%20build)](https://ci.appveyor.com/project/jprichardson/node-jsonfile/branch/master)
+
+<a href="https://github.com/feross/standard"><img src="https://cdn.rawgit.com/feross/standard/master/sticker.svg" alt="Standard JavaScript" width="100"></a>
+
+Why?
+----
+
+Writing `JSON.stringify()` and then `fs.writeFile()` and `JSON.parse()` with `fs.readFile()` enclosed in `try/catch` blocks became annoying.
+
+
+
+Installation
+------------
+
+ npm install --save jsonfile
+
+
+
+API
+---
+
+* [`readFile(filename, [options], callback)`](#readfilefilename-options-callback)
+* [`readFileSync(filename, [options])`](#readfilesyncfilename-options)
+* [`writeFile(filename, obj, [options], callback)`](#writefilefilename-obj-options-callback)
+* [`writeFileSync(filename, obj, [options])`](#writefilesyncfilename-obj-options)
+
+----
+
+### readFile(filename, [options], callback)
+
+`options` (`object`, default `undefined`): Pass in any [`fs.readFile`](https://nodejs.org/api/fs.html#fs_fs_readfile_path_options_callback) options or set `reviver` for a [JSON reviver](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/parse).
+ - `throws` (`boolean`, default: `true`). If `JSON.parse` throws an error, pass this error to the callback.
+ If `false`, returns `null` for the object.
+
+
+```js
+const jsonfile = require('jsonfile')
+const file = '/tmp/data.json'
+jsonfile.readFile(file, function (err, obj) {
+ if (err) console.error(err)
+ console.dir(obj)
+})
+```
+
+You can also use this method with promises. The `readFile` method will return a promise if you do not pass a callback function.
+
+```js
+const jsonfile = require('jsonfile')
+const file = '/tmp/data.json'
+jsonfile.readFile(file)
+ .then(obj => console.dir(obj))
+ .catch(error => console.error(error))
+```
+
+----
+
+### readFileSync(filename, [options])
+
+`options` (`object`, default `undefined`): Pass in any [`fs.readFileSync`](https://nodejs.org/api/fs.html#fs_fs_readfilesync_path_options) options or set `reviver` for a [JSON reviver](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/parse).
+- `throws` (`boolean`, default: `true`). If an error is encountered reading or parsing the file, throw the error. If `false`, returns `null` for the object.
+
+```js
+const jsonfile = require('jsonfile')
+const file = '/tmp/data.json'
+
+console.dir(jsonfile.readFileSync(file))
+```
+
+----
+
+### writeFile(filename, obj, [options], callback)
+
+`options`: Pass in any [`fs.writeFile`](https://nodejs.org/api/fs.html#fs_fs_writefile_file_data_options_callback) options or set `replacer` for a [JSON replacer](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify). Can also pass in `spaces`, or override `EOL` string or set `finalEOL` flag as `false` to not save the file with `EOL` at the end.
+
+
+```js
+const jsonfile = require('jsonfile')
+
+const file = '/tmp/data.json'
+const obj = { name: 'JP' }
+
+jsonfile.writeFile(file, obj, function (err) {
+ if (err) console.error(err)
+})
+```
+Or use with promises as follows:
+
+```js
+const jsonfile = require('jsonfile')
+
+const file = '/tmp/data.json'
+const obj = { name: 'JP' }
+
+jsonfile.writeFile(file, obj)
+ .then(res => {
+ console.log('Write complete')
+ })
+ .catch(error => console.error(error))
+```
+
+
+**formatting with spaces:**
+
+```js
+const jsonfile = require('jsonfile')
+
+const file = '/tmp/data.json'
+const obj = { name: 'JP' }
+
+jsonfile.writeFile(file, obj, { spaces: 2 }, function (err) {
+ if (err) console.error(err)
+})
+```
+
+**overriding EOL:**
+
+```js
+const jsonfile = require('jsonfile')
+
+const file = '/tmp/data.json'
+const obj = { name: 'JP' }
+
+jsonfile.writeFile(file, obj, { spaces: 2, EOL: '\r\n' }, function (err) {
+ if (err) console.error(err)
+})
+```
+
+
+**disabling the EOL at the end of file:**
+
+```js
+const jsonfile = require('jsonfile')
+
+const file = '/tmp/data.json'
+const obj = { name: 'JP' }
+
+jsonfile.writeFile(file, obj, { spaces: 2, finalEOL: false }, function (err) {
+ if (err) console.log(err)
+})
+```
+
+**appending to an existing JSON file:**
+
+You can use `fs.writeFile` option `{ flag: 'a' }` to achieve this.
+
+```js
+const jsonfile = require('jsonfile')
+
+const file = '/tmp/mayAlreadyExistedData.json'
+const obj = { name: 'JP' }
+
+jsonfile.writeFile(file, obj, { flag: 'a' }, function (err) {
+ if (err) console.error(err)
+})
+```
+
+----
+
+### writeFileSync(filename, obj, [options])
+
+`options`: Pass in any [`fs.writeFileSync`](https://nodejs.org/api/fs.html#fs_fs_writefilesync_file_data_options) options or set `replacer` for a [JSON replacer](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify). Can also pass in `spaces`, or override `EOL` string or set `finalEOL` flag as `false` to not save the file with `EOL` at the end.
+
+```js
+const jsonfile = require('jsonfile')
+
+const file = '/tmp/data.json'
+const obj = { name: 'JP' }
+
+jsonfile.writeFileSync(file, obj)
+```
+
+**formatting with spaces:**
+
+```js
+const jsonfile = require('jsonfile')
+
+const file = '/tmp/data.json'
+const obj = { name: 'JP' }
+
+jsonfile.writeFileSync(file, obj, { spaces: 2 })
+```
+
+**overriding EOL:**
+
+```js
+const jsonfile = require('jsonfile')
+
+const file = '/tmp/data.json'
+const obj = { name: 'JP' }
+
+jsonfile.writeFileSync(file, obj, { spaces: 2, EOL: '\r\n' })
+```
+
+**disabling the EOL at the end of file:**
+
+```js
+const jsonfile = require('jsonfile')
+
+const file = '/tmp/data.json'
+const obj = { name: 'JP' }
+
+jsonfile.writeFileSync(file, obj, { spaces: 2, finalEOL: false })
+```
+
+**appending to an existing JSON file:**
+
+You can use `fs.writeFileSync` option `{ flag: 'a' }` to achieve this.
+
+```js
+const jsonfile = require('jsonfile')
+
+const file = '/tmp/mayAlreadyExistedData.json'
+const obj = { name: 'JP' }
+
+jsonfile.writeFileSync(file, obj, { flag: 'a' })
+```
+
+License
+-------
+
+(MIT License)
+
+Copyright 2012-2016, JP Richardson <jprichardson@gmail.com>
diff --git a/desktop/node_modules/@electron/universal/node_modules/jsonfile/index.js b/desktop/node_modules/@electron/universal/node_modules/jsonfile/index.js
new file mode 100644
index 0000000..0582868
--- /dev/null
+++ b/desktop/node_modules/@electron/universal/node_modules/jsonfile/index.js
@@ -0,0 +1,88 @@
+let _fs
+try {
+ _fs = require('graceful-fs')
+} catch (_) {
+ _fs = require('fs')
+}
+const universalify = require('universalify')
+const { stringify, stripBom } = require('./utils')
+
+async function _readFile (file, options = {}) {
+ if (typeof options === 'string') {
+ options = { encoding: options }
+ }
+
+ const fs = options.fs || _fs
+
+ const shouldThrow = 'throws' in options ? options.throws : true
+
+ let data = await universalify.fromCallback(fs.readFile)(file, options)
+
+ data = stripBom(data)
+
+ let obj
+ try {
+ obj = JSON.parse(data, options ? options.reviver : null)
+ } catch (err) {
+ if (shouldThrow) {
+ err.message = `${file}: ${err.message}`
+ throw err
+ } else {
+ return null
+ }
+ }
+
+ return obj
+}
+
+const readFile = universalify.fromPromise(_readFile)
+
+function readFileSync (file, options = {}) {
+ if (typeof options === 'string') {
+ options = { encoding: options }
+ }
+
+ const fs = options.fs || _fs
+
+ const shouldThrow = 'throws' in options ? options.throws : true
+
+ try {
+ let content = fs.readFileSync(file, options)
+ content = stripBom(content)
+ return JSON.parse(content, options.reviver)
+ } catch (err) {
+ if (shouldThrow) {
+ err.message = `${file}: ${err.message}`
+ throw err
+ } else {
+ return null
+ }
+ }
+}
+
+async function _writeFile (file, obj, options = {}) {
+ const fs = options.fs || _fs
+
+ const str = stringify(obj, options)
+
+ await universalify.fromCallback(fs.writeFile)(file, str, options)
+}
+
+const writeFile = universalify.fromPromise(_writeFile)
+
+function writeFileSync (file, obj, options = {}) {
+ const fs = options.fs || _fs
+
+ const str = stringify(obj, options)
+ // not sure if fs.writeFileSync returns anything, but just in case
+ return fs.writeFileSync(file, str, options)
+}
+
+const jsonfile = {
+ readFile,
+ readFileSync,
+ writeFile,
+ writeFileSync
+}
+
+module.exports = jsonfile
diff --git a/desktop/node_modules/@electron/universal/node_modules/jsonfile/package.json b/desktop/node_modules/@electron/universal/node_modules/jsonfile/package.json
new file mode 100644
index 0000000..4d01eb1
--- /dev/null
+++ b/desktop/node_modules/@electron/universal/node_modules/jsonfile/package.json
@@ -0,0 +1,40 @@
+{
+ "name": "jsonfile",
+ "version": "6.1.0",
+ "description": "Easily read/write JSON files.",
+ "repository": {
+ "type": "git",
+ "url": "git@github.com:jprichardson/node-jsonfile.git"
+ },
+ "keywords": [
+ "read",
+ "write",
+ "file",
+ "json",
+ "fs",
+ "fs-extra"
+ ],
+ "author": "JP Richardson <jprichardson@gmail.com>",
+ "license": "MIT",
+ "dependencies": {
+ "universalify": "^2.0.0"
+ },
+ "optionalDependencies": {
+ "graceful-fs": "^4.1.6"
+ },
+ "devDependencies": {
+ "mocha": "^8.2.0",
+ "rimraf": "^2.4.0",
+ "standard": "^16.0.1"
+ },
+ "main": "index.js",
+ "files": [
+ "index.js",
+ "utils.js"
+ ],
+ "scripts": {
+ "lint": "standard",
+ "test": "npm run lint && npm run unit",
+ "unit": "mocha"
+ }
+}
diff --git a/desktop/node_modules/@electron/universal/node_modules/jsonfile/utils.js b/desktop/node_modules/@electron/universal/node_modules/jsonfile/utils.js
new file mode 100644
index 0000000..b5ff48e
--- /dev/null
+++ b/desktop/node_modules/@electron/universal/node_modules/jsonfile/utils.js
@@ -0,0 +1,14 @@
+function stringify (obj, { EOL = '\n', finalEOL = true, replacer = null, spaces } = {}) {
+ const EOF = finalEOL ? EOL : ''
+ const str = JSON.stringify(obj, replacer, spaces)
+
+ return str.replace(/\n/g, EOL) + EOF
+}
+
+function stripBom (content) {
+ // we do this because JSON.parse would convert it to a utf8 string if encoding wasn't specified
+ if (Buffer.isBuffer(content)) content = content.toString('utf8')
+ return content.replace(/^\uFEFF/, '')
+}
+
+module.exports = { stringify, stripBom }
diff --git a/desktop/node_modules/@electron/universal/node_modules/universalify/LICENSE b/desktop/node_modules/@electron/universal/node_modules/universalify/LICENSE
new file mode 100644
index 0000000..514e84e
--- /dev/null
+++ b/desktop/node_modules/@electron/universal/node_modules/universalify/LICENSE
@@ -0,0 +1,20 @@
+(The MIT License)
+
+Copyright (c) 2017, Ryan Zimmerman <opensrc@ryanzim.com>
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the 'Software'), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software is furnished to do so,
+subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/desktop/node_modules/@electron/universal/node_modules/universalify/README.md b/desktop/node_modules/@electron/universal/node_modules/universalify/README.md
new file mode 100644
index 0000000..aa12474
--- /dev/null
+++ b/desktop/node_modules/@electron/universal/node_modules/universalify/README.md
@@ -0,0 +1,76 @@
+# universalify
+
+[![Travis branch](https://img.shields.io/travis/RyanZim/universalify/master.svg)](https://travis-ci.org/RyanZim/universalify)
+![Coveralls github branch](https://img.shields.io/coveralls/github/RyanZim/universalify/master.svg)
+![npm](https://img.shields.io/npm/dm/universalify.svg)
+![npm](https://img.shields.io/npm/l/universalify.svg)
+
+Make a callback- or promise-based function support both promises and callbacks.
+
+Uses the native promise implementation.
+
+## Installation
+
+```bash
+npm install universalify
+```
+
+## API
+
+### `universalify.fromCallback(fn)`
+
+Takes a callback-based function to universalify, and returns the universalified function.
+
+Function must take a callback as the last parameter that will be called with the signature `(error, result)`. `universalify` does not support calling the callback with three or more arguments, and does not ensure that the callback is only called once.
+
+```js
+function callbackFn (n, cb) {
+ setTimeout(() => cb(null, n), 15)
+}
+
+const fn = universalify.fromCallback(callbackFn)
+
+// Works with Promises:
+fn('Hello World!')
+.then(result => console.log(result)) // -> Hello World!
+.catch(error => console.error(error))
+
+// Works with Callbacks:
+fn('Hi!', (error, result) => {
+ if (error) return console.error(error)
+ console.log(result)
+ // -> Hi!
+})
+```
+
+### `universalify.fromPromise(fn)`
+
+Takes a promise-based function to universalify, and returns the universalified function.
+
+Function must return a valid JS promise. `universalify` does not ensure that a valid promise is returned.
+
+```js
+function promiseFn (n) {
+ return new Promise(resolve => {
+ setTimeout(() => resolve(n), 15)
+ })
+}
+
+const fn = universalify.fromPromise(promiseFn)
+
+// Works with Promises:
+fn('Hello World!')
+.then(result => console.log(result)) // -> Hello World!
+.catch(error => console.error(error))
+
+// Works with Callbacks:
+fn('Hi!', (error, result) => {
+ if (error) return console.error(error)
+ console.log(result)
+ // -> Hi!
+})
+```
+
+## License
+
+MIT
diff --git a/desktop/node_modules/@electron/universal/node_modules/universalify/index.js b/desktop/node_modules/@electron/universal/node_modules/universalify/index.js
new file mode 100644
index 0000000..ba6c662
--- /dev/null
+++ b/desktop/node_modules/@electron/universal/node_modules/universalify/index.js
@@ -0,0 +1,24 @@
+'use strict'
+
+exports.fromCallback = function (fn) {
+ return Object.defineProperty(function (...args) {
+ if (typeof args[args.length - 1] === 'function') fn.apply(this, args)
+ else {
+ return new Promise((resolve, reject) => {
+ fn.call(
+ this,
+ ...args,
+ (err, res) => (err != null) ? reject(err) : resolve(res)
+ )
+ })
+ }
+ }, 'name', { value: fn.name })
+}
+
+exports.fromPromise = function (fn) {
+ return Object.defineProperty(function (...args) {
+ const cb = args[args.length - 1]
+ if (typeof cb !== 'function') return fn.apply(this, args)
+ else fn.apply(this, args.slice(0, -1)).then(r => cb(null, r), cb)
+ }, 'name', { value: fn.name })
+}
diff --git a/desktop/node_modules/@electron/universal/node_modules/universalify/package.json b/desktop/node_modules/@electron/universal/node_modules/universalify/package.json
new file mode 100644
index 0000000..006d4cc
--- /dev/null
+++ b/desktop/node_modules/@electron/universal/node_modules/universalify/package.json
@@ -0,0 +1,34 @@
+{
+ "name": "universalify",
+ "version": "2.0.0",
+ "description": "Make a callback- or promise-based function support both promises and callbacks.",
+ "keywords": [
+ "callback",
+ "native",
+ "promise"
+ ],
+ "homepage": "https://github.com/RyanZim/universalify#readme",
+ "bugs": "https://github.com/RyanZim/universalify/issues",
+ "license": "MIT",
+ "author": "Ryan Zimmerman <opensrc@ryanzim.com>",
+ "files": [
+ "index.js"
+ ],
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/RyanZim/universalify.git"
+ },
+ "scripts": {
+ "test": "standard && nyc tape test/*.js | colortape"
+ },
+ "devDependencies": {
+ "colortape": "^0.1.2",
+ "coveralls": "^3.0.1",
+ "nyc": "^15.0.0",
+ "standard": "^14.3.1",
+ "tape": "^5.0.1"
+ },
+ "engines": {
+ "node": ">= 10.0.0"
+ }
+}
diff --git a/desktop/node_modules/@electron/universal/package.json b/desktop/node_modules/@electron/universal/package.json
new file mode 100644
index 0000000..a2a7655
--- /dev/null
+++ b/desktop/node_modules/@electron/universal/package.json
@@ -0,0 +1,60 @@
+{
+ "name": "@electron/universal",
+ "version": "1.4.2",
+ "description": "Utility for creating Universal macOS applications from two x64 and arm64 Electron applications",
+ "main": "dist/cjs/index.js",
+ "module": "dist/esm/index.js",
+ "license": "MIT",
+ "keywords": [
+ "electron",
+ "apple silicon",
+ "universal"
+ ],
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/electron/universal.git"
+ },
+ "engines": {
+ "node": ">=8.6"
+ },
+ "files": [
+ "dist/*",
+ "entry-asar/*",
+ "README.md"
+ ],
+ "author": "Samuel Attard",
+ "scripts": {
+ "build": "tsc && tsc -p tsconfig.esm.json",
+ "lint": "prettier --check \"{src,entry-asar}/**/*.{js,ts}\"",
+ "prettier:write": "prettier --write \"{src,entry-asar}/**/*.{js,ts}\"",
+ "prepublishOnly": "npm run build",
+ "test": "exit 0",
+ "prepare": "husky install"
+ },
+ "devDependencies": {
+ "@continuous-auth/semantic-release-npm": "^3.0.0",
+ "@types/debug": "^4.1.5",
+ "@types/fs-extra": "^9.0.4",
+ "@types/minimatch": "^3.0.5",
+ "@types/node": "^14.14.7",
+ "@types/plist": "^3.0.2",
+ "husky": "^8.0.0",
+ "lint-staged": "^10.5.1",
+ "prettier": "^2.1.2",
+ "typescript": "^4.0.5"
+ },
+ "dependencies": {
+ "@electron/asar": "^3.2.1",
+ "@malept/cross-spawn-promise": "^1.1.0",
+ "debug": "^4.3.1",
+ "dir-compare": "^3.0.0",
+ "fs-extra": "^9.0.1",
+ "minimatch": "^3.0.4",
+ "plist": "^3.0.4"
+ },
+ "lint-staged": {
+ "*.ts": [
+ "prettier --write"
+ ]
+ }
+}