electrify-web 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE.md +10 -0
- package/README.md +351 -0
- package/app/inject/_placeholder +0 -0
- package/app/lib/main.js +11772 -0
- package/app/lib/main.js.map +1 -0
- package/app/lib/preload.js +338 -0
- package/app/lib/preload.js.map +1 -0
- package/app/lib/static/login.css +57 -0
- package/app/lib/static/login.html +24 -0
- package/app/lib/static/login.js +10 -0
- package/app/nativefier.json +8 -0
- package/app/npm-shrinkwrap.json +1170 -0
- package/app/package.json +25 -0
- package/icon-scripts/convertToIcns +56 -0
- package/icon-scripts/convertToIco +39 -0
- package/icon-scripts/convertToIconset +68 -0
- package/icon-scripts/convertToPng +76 -0
- package/icon-scripts/convertToTrayIcon +32 -0
- package/lib/autologin/index.d.ts +25 -0
- package/lib/autologin/index.js +189 -0
- package/lib/autologin/index.js.map +1 -0
- package/lib/build/buildIcon.d.ts +6 -0
- package/lib/build/buildIcon.js +110 -0
- package/lib/build/buildIcon.js.map +1 -0
- package/lib/build/buildNativefierApp.d.ts +2 -0
- package/lib/build/buildNativefierApp.js +234 -0
- package/lib/build/buildNativefierApp.js.map +1 -0
- package/lib/build/prepareElectronApp.d.ts +15 -0
- package/lib/build/prepareElectronApp.js +220 -0
- package/lib/build/prepareElectronApp.js.map +1 -0
- package/lib/cli.d.ts +6 -0
- package/lib/cli.js +783 -0
- package/lib/cli.js.map +1 -0
- package/lib/config/index.d.ts +87 -0
- package/lib/config/index.js +460 -0
- package/lib/config/index.js.map +1 -0
- package/lib/constants.d.ts +11 -0
- package/lib/constants.js +58 -0
- package/lib/constants.js.map +1 -0
- package/lib/helpers/fsHelpers.d.ts +2 -0
- package/lib/helpers/fsHelpers.js +57 -0
- package/lib/helpers/fsHelpers.js.map +1 -0
- package/lib/helpers/helpers.d.ts +29 -0
- package/lib/helpers/helpers.js +225 -0
- package/lib/helpers/helpers.js.map +1 -0
- package/lib/helpers/iconShellHelpers.d.ts +5 -0
- package/lib/helpers/iconShellHelpers.js +91 -0
- package/lib/helpers/iconShellHelpers.js.map +1 -0
- package/lib/helpers/upgrade/executableHelpers.d.ts +2 -0
- package/lib/helpers/upgrade/executableHelpers.js +173 -0
- package/lib/helpers/upgrade/executableHelpers.js.map +1 -0
- package/lib/helpers/upgrade/plistInfoXMLHelpers.d.ts +2 -0
- package/lib/helpers/upgrade/plistInfoXMLHelpers.js +29 -0
- package/lib/helpers/upgrade/plistInfoXMLHelpers.js.map +1 -0
- package/lib/helpers/upgrade/rceditGet.d.ts +1 -0
- package/lib/helpers/upgrade/rceditGet.js +65 -0
- package/lib/helpers/upgrade/rceditGet.js.map +1 -0
- package/lib/helpers/upgrade/upgrade.d.ts +8 -0
- package/lib/helpers/upgrade/upgrade.js +193 -0
- package/lib/helpers/upgrade/upgrade.js.map +1 -0
- package/lib/infer/browsers/inferChromeVersion.d.ts +1 -0
- package/lib/infer/browsers/inferChromeVersion.js +73 -0
- package/lib/infer/browsers/inferChromeVersion.js.map +1 -0
- package/lib/infer/browsers/inferFirefoxVersion.d.ts +1 -0
- package/lib/infer/browsers/inferFirefoxVersion.js +61 -0
- package/lib/infer/browsers/inferFirefoxVersion.js.map +1 -0
- package/lib/infer/browsers/inferSafariVersion.d.ts +6 -0
- package/lib/infer/browsers/inferSafariVersion.js +96 -0
- package/lib/infer/browsers/inferSafariVersion.js.map +1 -0
- package/lib/infer/inferDefaults.d.ts +33 -0
- package/lib/infer/inferDefaults.js +272 -0
- package/lib/infer/inferDefaults.js.map +1 -0
- package/lib/infer/inferIcon.d.ts +1 -0
- package/lib/infer/inferIcon.js +116 -0
- package/lib/infer/inferIcon.js.map +1 -0
- package/lib/infer/inferOs.d.ts +4 -0
- package/lib/infer/inferOs.js +69 -0
- package/lib/infer/inferOs.js.map +1 -0
- package/lib/infer/inferTitle.d.ts +1 -0
- package/lib/infer/inferTitle.js +56 -0
- package/lib/infer/inferTitle.js.map +1 -0
- package/lib/integration-test.d.ts +1 -0
- package/lib/main.d.ts +11 -0
- package/lib/main.js +18 -0
- package/lib/main.js.map +1 -0
- package/lib/options/asyncConfig.d.ts +5 -0
- package/lib/options/asyncConfig.js +46 -0
- package/lib/options/asyncConfig.js.map +1 -0
- package/lib/options/fields/fields.d.ts +2 -0
- package/lib/options/fields/fields.js +32 -0
- package/lib/options/fields/fields.js.map +1 -0
- package/lib/options/fields/icon.d.ts +9 -0
- package/lib/options/fields/icon.js +106 -0
- package/lib/options/fields/icon.js.map +1 -0
- package/lib/options/fields/name.d.ts +9 -0
- package/lib/options/fields/name.js +59 -0
- package/lib/options/fields/name.js.map +1 -0
- package/lib/options/fields/userAgent.d.ts +10 -0
- package/lib/options/fields/userAgent.js +81 -0
- package/lib/options/fields/userAgent.js.map +1 -0
- package/lib/options/normalizeUrl.d.ts +1 -0
- package/lib/options/normalizeUrl.js +62 -0
- package/lib/options/normalizeUrl.js.map +1 -0
- package/lib/options/optionsMain.d.ts +6 -0
- package/lib/options/optionsMain.js +305 -0
- package/lib/options/optionsMain.js.map +1 -0
- package/lib/presets/index.d.ts +27 -0
- package/lib/presets/index.js +162 -0
- package/lib/presets/index.js.map +1 -0
- package/lib/pwa/index.d.ts +57 -0
- package/lib/pwa/index.js +241 -0
- package/lib/pwa/index.js.map +1 -0
- package/lib/security/index.d.ts +27 -0
- package/lib/security/index.js +202 -0
- package/lib/security/index.js.map +1 -0
- package/lib/updater/index.d.ts +34 -0
- package/lib/updater/index.js +264 -0
- package/lib/updater/index.js.map +1 -0
- package/lib/utils/parseUtils.d.ts +3 -0
- package/lib/utils/parseUtils.js +95 -0
- package/lib/utils/parseUtils.js.map +1 -0
- package/lib/utils/sanitizeFilename.d.ts +1 -0
- package/lib/utils/sanitizeFilename.js +53 -0
- package/lib/utils/sanitizeFilename.js.map +1 -0
- package/lib/wizard/index.d.ts +13 -0
- package/lib/wizard/index.js +252 -0
- package/lib/wizard/index.js.map +1 -0
- package/npm-shrinkwrap.json +8144 -0
- package/package.json +148 -0
package/app/package.json
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "nativefier-placeholder",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Placeholder for the nativefier cli to override with a target url",
|
|
5
|
+
"main": "lib/main.js",
|
|
6
|
+
"author": "Jia Hao",
|
|
7
|
+
"license": "MIT",
|
|
8
|
+
"keywords": [
|
|
9
|
+
"desktop",
|
|
10
|
+
"electron",
|
|
11
|
+
"placeholder"
|
|
12
|
+
],
|
|
13
|
+
"scripts": {},
|
|
14
|
+
"dependencies": {
|
|
15
|
+
"electron-context-menu": "^3.6.1",
|
|
16
|
+
"electron-dl": "^3.5.0",
|
|
17
|
+
"electron-squirrel-startup": "^1.0.0",
|
|
18
|
+
"electron-window-state": "^5.0.3",
|
|
19
|
+
"loglevel": "^1.8.1",
|
|
20
|
+
"source-map-support": "^0.5.21"
|
|
21
|
+
},
|
|
22
|
+
"devDependencies": {
|
|
23
|
+
"electron": "^25.7.0"
|
|
24
|
+
}
|
|
25
|
+
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
|
|
3
|
+
### USAGE
|
|
4
|
+
|
|
5
|
+
# ./convertToIcns <input png> <outp icns>
|
|
6
|
+
# Example
|
|
7
|
+
# ./convertToIcns ~/sample.png ~/Desktop/converted.icns
|
|
8
|
+
|
|
9
|
+
# exit the shell script on error immediately
|
|
10
|
+
set -e
|
|
11
|
+
|
|
12
|
+
# Exec Paths
|
|
13
|
+
HAVE_IMAGEMAGICK=
|
|
14
|
+
HAVE_ICONUTIL=
|
|
15
|
+
HAVE_SIPS=
|
|
16
|
+
HAVE_GRAPHICSMAGICK=
|
|
17
|
+
|
|
18
|
+
type convert &>/dev/null && HAVE_IMAGEMAGICK=true
|
|
19
|
+
type iconutil &>/dev/null && HAVE_ICONUTIL=true
|
|
20
|
+
type sips &>/dev/null && HAVE_SIPS=true
|
|
21
|
+
type gm &>/dev/null && gm version | grep GraphicsMagick &>/dev/null && HAVE_GRAPHICSMAGICK=true
|
|
22
|
+
|
|
23
|
+
[[ -z "$HAVE_ICONUTIL" ]] && { echo >&2 "Cannot find required iconutil executable"; exit 1; }
|
|
24
|
+
[[ -z "$HAVE_IMAGEMAGICK" && -z "$HAVE_SIPS" && -z "$HAVE_GRAPHICSMAGICK" ]] && { echo >&2 "Cannot find required image converter, please install sips, imagemagick or graphicsmagick"; exit 1; }
|
|
25
|
+
|
|
26
|
+
# Parameters
|
|
27
|
+
SOURCE="$1"
|
|
28
|
+
DEST="$2"
|
|
29
|
+
|
|
30
|
+
# Check source and destination arguments
|
|
31
|
+
if [ -z "${SOURCE}" ]; then
|
|
32
|
+
echo "No source image specified"
|
|
33
|
+
exit 1
|
|
34
|
+
fi
|
|
35
|
+
|
|
36
|
+
if [ -z "${DEST}" ]; then
|
|
37
|
+
echo "No destination specified"
|
|
38
|
+
exit 1
|
|
39
|
+
fi
|
|
40
|
+
|
|
41
|
+
TEMP_DIR="$(mktemp -d -t nativefier-icns-XXXXXX)"
|
|
42
|
+
ICONSET="${TEMP_DIR}/converted.iconset"
|
|
43
|
+
|
|
44
|
+
function cleanUp() {
|
|
45
|
+
rm -rf "${TEMP_DIR}"
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
trap cleanUp EXIT
|
|
49
|
+
|
|
50
|
+
"${BASH_SOURCE%/*}/convertToIconset" "${SOURCE}" "${ICONSET}"
|
|
51
|
+
|
|
52
|
+
# Create an icns file lefrom the iconset
|
|
53
|
+
iconutil -c icns "${ICONSET}" -o "${DEST}"
|
|
54
|
+
|
|
55
|
+
trap - EXIT
|
|
56
|
+
cleanUp
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
|
|
3
|
+
# USAGE
|
|
4
|
+
|
|
5
|
+
# ./convertToIco <input png or ico> <outfilename>.ico
|
|
6
|
+
# Example
|
|
7
|
+
# ./convertToPng ~/sample.png ~/converted.ico
|
|
8
|
+
|
|
9
|
+
set -e
|
|
10
|
+
|
|
11
|
+
CONVERT=
|
|
12
|
+
|
|
13
|
+
type gm &>/dev/null && gm version | grep GraphicsMagick &>/dev/null && CONVERT="gm convert"
|
|
14
|
+
type convert &>/dev/null && CONVERT="convert"
|
|
15
|
+
|
|
16
|
+
[[ -z "$CONVERT" ]] && { echo >&2 "Cannot find required ImageMagick Convert or GraphicsMagick executable"; exit 1; }
|
|
17
|
+
|
|
18
|
+
SOURCE=$1
|
|
19
|
+
DEST=$2
|
|
20
|
+
|
|
21
|
+
if [ -z "${SOURCE}" ]; then
|
|
22
|
+
echo "No source image specified"
|
|
23
|
+
exit 1
|
|
24
|
+
fi
|
|
25
|
+
|
|
26
|
+
if [ -z "${DEST}" ]; then
|
|
27
|
+
echo "No destination specified"
|
|
28
|
+
exit 1
|
|
29
|
+
fi
|
|
30
|
+
|
|
31
|
+
NAME=$(basename "${SOURCE}")
|
|
32
|
+
EXT="${NAME##*.}"
|
|
33
|
+
|
|
34
|
+
if [ "${EXT}" == "ico" ]; then
|
|
35
|
+
cp "${SOURCE}" "${DEST}"
|
|
36
|
+
exit 0
|
|
37
|
+
fi
|
|
38
|
+
|
|
39
|
+
$CONVERT "${SOURCE}" -resize 256x256 "${DEST}"
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
|
|
3
|
+
### USAGE
|
|
4
|
+
|
|
5
|
+
# ./convertToIconset <input png> <outp iconset>
|
|
6
|
+
# Example
|
|
7
|
+
# ./convertToIconset ~/sample.png ~/Desktop/converted.iconset
|
|
8
|
+
|
|
9
|
+
# exit the shell script on error immediately
|
|
10
|
+
set -e
|
|
11
|
+
|
|
12
|
+
make_iconset_imagemagick() {
|
|
13
|
+
local file iconset
|
|
14
|
+
file="${1}"
|
|
15
|
+
iconset="${2}"
|
|
16
|
+
|
|
17
|
+
mkdir "$iconset"
|
|
18
|
+
|
|
19
|
+
for size in {16,32,64,128,256,512}; do
|
|
20
|
+
$CONVERT "${file}" -define png:big-depth=16 -define png:color-type=6 -sample "${size}x${size}" "${iconset}/icon_${size}x${size}.png"
|
|
21
|
+
$CONVERT "${file}" -define png:big-depth=16 -define png:color-type=6 -sample "$((size * 2))x$((size * 2))" "${iconset}/icon_${size}x${size}@2x.png"
|
|
22
|
+
done
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
make_iconset_sips() {
|
|
26
|
+
local file iconset
|
|
27
|
+
file="${1}"
|
|
28
|
+
iconset="${2}"
|
|
29
|
+
|
|
30
|
+
mkdir "$iconset"
|
|
31
|
+
|
|
32
|
+
for size in {16,32,64,128,256,512}; do
|
|
33
|
+
sips --setProperty format png --resampleHeightWidth "${size}" "${size}" "${file}" --out "${iconset}/icon_${size}x${size}.png" &> /dev/null
|
|
34
|
+
sips --setProperty format png --resampleHeightWidth "$((size * 2))" "$((size * 2))" "${file}" --out "${iconset}/icon_${size}x${size}@2x.png" &> /dev/null
|
|
35
|
+
done
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
# Parameters
|
|
39
|
+
SOURCE="$1"
|
|
40
|
+
DEST="$2"
|
|
41
|
+
|
|
42
|
+
# Check source and destination arguments
|
|
43
|
+
if [ -z "${SOURCE}" ]; then
|
|
44
|
+
echo >&2 "No source image specified"; exit 1
|
|
45
|
+
fi
|
|
46
|
+
|
|
47
|
+
if [ -z "${DEST}" ]; then
|
|
48
|
+
echo >&2 "No destination specified"; exit 1
|
|
49
|
+
fi
|
|
50
|
+
|
|
51
|
+
HAVE_IMAGEMAGICK=
|
|
52
|
+
HAVE_SIPS=
|
|
53
|
+
HAVE_GRAPHICSMAGICK=
|
|
54
|
+
CONVERT=
|
|
55
|
+
|
|
56
|
+
type gm &>/dev/null && gm version | grep GraphicsMagick &>/dev/null && HAVE_GRAPHICSMAGICK=true && CONVERT="gm convert"
|
|
57
|
+
type convert &>/dev/null && HAVE_IMAGEMAGICK=true && CONVERT="convert"
|
|
58
|
+
type sips &>/dev/null && HAVE_SIPS=true
|
|
59
|
+
|
|
60
|
+
if [[ -n "$HAVE_IMAGEMAGICK" || -n "$HAVE_GRAPHICSMAGICK" ]]; then
|
|
61
|
+
PNG_PATH="$(mktemp -d -t nativefier-iconset-XXXXXX)/icon.png"
|
|
62
|
+
"${BASH_SOURCE%/*}/convertToPng" "${SOURCE}" "${PNG_PATH}"
|
|
63
|
+
make_iconset_imagemagick "${PNG_PATH}" "${DEST}"
|
|
64
|
+
elif [[ -n "$HAVE_SIPS" ]]; then
|
|
65
|
+
make_iconset_sips "${SOURCE}" "${DEST}"
|
|
66
|
+
else
|
|
67
|
+
echo >&2 "Cannot find convert or sips executables"; exit 1;
|
|
68
|
+
fi
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
|
|
3
|
+
# USAGE
|
|
4
|
+
|
|
5
|
+
# ./convertToPng <input png or ico> <outfilename>.png
|
|
6
|
+
# Example
|
|
7
|
+
# ./convertToPng ~/sample.ico ~/Desktop/converted.png
|
|
8
|
+
|
|
9
|
+
set -e
|
|
10
|
+
|
|
11
|
+
HAVE_IMAGEMAGICK=
|
|
12
|
+
HAVE_GRAPHICSMAGICK=
|
|
13
|
+
|
|
14
|
+
type convert &>/dev/null && type identify &>/dev/null && HAVE_IMAGEMAGICK=true
|
|
15
|
+
type gm &>/dev/null && gm version | grep GraphicsMagick &>/dev/null && HAVE_GRAPHICSMAGICK=true
|
|
16
|
+
|
|
17
|
+
if [[ -z "$HAVE_IMAGEMAGICK" && -z "$HAVE_GRAPHICSMAGICK" ]]; then
|
|
18
|
+
type convert >/dev/null 2>&1 || echo >&2 "Cannot find required ImageMagick 'convert' executable"
|
|
19
|
+
type identify >/dev/null 2>&1 || echo >&2 "Cannot find required ImageMagick 'identify' executable"
|
|
20
|
+
type gm &>/dev/null && gm version | grep GraphicsMagick &>/dev/null && echo >&2 "Cannot find GraphicsMagick"
|
|
21
|
+
echo >&2 "ImageMagic or GraphicsMagic is required, please ensure they are in your PATH"
|
|
22
|
+
exit 1
|
|
23
|
+
fi
|
|
24
|
+
|
|
25
|
+
CONVERT="convert"
|
|
26
|
+
IDENTIFY="identify"
|
|
27
|
+
if [[ -z "$HAVE_IMAGEMAGICK" ]]; then
|
|
28
|
+
# we must have GraphicsMagick then
|
|
29
|
+
CONVERT="gm convert"
|
|
30
|
+
IDENTIFY="gm identify"
|
|
31
|
+
fi
|
|
32
|
+
|
|
33
|
+
# Parameters
|
|
34
|
+
SOURCE="$1"
|
|
35
|
+
DEST="$2"
|
|
36
|
+
|
|
37
|
+
# Check source and destination arguments
|
|
38
|
+
if [ -z "${SOURCE}" ]; then
|
|
39
|
+
echo "No source image specified"
|
|
40
|
+
exit 1
|
|
41
|
+
fi
|
|
42
|
+
|
|
43
|
+
if [ -z "${DEST}" ]; then
|
|
44
|
+
echo "No destination specified"
|
|
45
|
+
exit 1
|
|
46
|
+
fi
|
|
47
|
+
|
|
48
|
+
# File Infrastructure
|
|
49
|
+
NAME=$(basename "${SOURCE}")
|
|
50
|
+
BASE="${NAME%.*}"
|
|
51
|
+
TEMP_DIR="convert_temp"
|
|
52
|
+
|
|
53
|
+
function cleanUp() {
|
|
54
|
+
rm -rf "${TEMP_DIR}"
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
trap cleanUp EXIT
|
|
58
|
+
|
|
59
|
+
mkdir -p "${TEMP_DIR}"
|
|
60
|
+
|
|
61
|
+
# check if .ico is a sequence
|
|
62
|
+
# pipe into cat so no exit code is given for grep if no matches are found
|
|
63
|
+
IS_ICO_SET="$($IDENTIFY "${SOURCE}" | grep -e "\w\.ico\[0" | cat )"
|
|
64
|
+
|
|
65
|
+
$CONVERT "${SOURCE}" "${TEMP_DIR}/${BASE}.png"
|
|
66
|
+
if [ "${IS_ICO_SET}" ]; then
|
|
67
|
+
# extract the largest(?) image from the set
|
|
68
|
+
cp "${TEMP_DIR}/${BASE}-0.png" "${DEST}"
|
|
69
|
+
else
|
|
70
|
+
cp "${TEMP_DIR}/${BASE}.png" "${DEST}"
|
|
71
|
+
fi
|
|
72
|
+
|
|
73
|
+
rm -rf "${TEMP_DIR}"
|
|
74
|
+
|
|
75
|
+
trap - EXIT
|
|
76
|
+
cleanUp
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
|
|
3
|
+
# USAGE
|
|
4
|
+
|
|
5
|
+
# ./convertToTrayIcon <input png or icns> <outfilename>.png
|
|
6
|
+
# Example
|
|
7
|
+
# ./convertToTrayIcon ~/sample.icns ~/converted.png
|
|
8
|
+
|
|
9
|
+
set -e
|
|
10
|
+
|
|
11
|
+
SOURCE=$1
|
|
12
|
+
DEST=$2
|
|
13
|
+
|
|
14
|
+
if [ -z "${SOURCE}" ]; then
|
|
15
|
+
echo "No source image specified"
|
|
16
|
+
exit 1
|
|
17
|
+
fi
|
|
18
|
+
|
|
19
|
+
if [ -z "${DEST}" ]; then
|
|
20
|
+
echo "No destination specified"
|
|
21
|
+
exit 1
|
|
22
|
+
fi
|
|
23
|
+
|
|
24
|
+
NAME=$(basename "${SOURCE}")
|
|
25
|
+
EXT="${NAME##*.}"
|
|
26
|
+
|
|
27
|
+
if [ "${EXT}" == "png" ]; then
|
|
28
|
+
cp "${SOURCE}" "${DEST}"
|
|
29
|
+
exit 0
|
|
30
|
+
fi
|
|
31
|
+
|
|
32
|
+
sips --setProperty format png --resampleHeightWidth "256" "256" "${SOURCE}" --out "${DEST}"
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 自动登录脚本生成器
|
|
3
|
+
* 生成用于自动填充登录表单的 JS 脚本
|
|
4
|
+
*
|
|
5
|
+
* 安全说明:
|
|
6
|
+
* - 凭据使用 Base64 编码(非加密)
|
|
7
|
+
* - 脚本仅在构建时生成,凭据不会保存到源代码
|
|
8
|
+
* - 建议仅用于内部/私有应用
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* 生成自动登录脚本
|
|
12
|
+
*/
|
|
13
|
+
export declare function generateAutoLoginScript(username: string, password: string): string;
|
|
14
|
+
/**
|
|
15
|
+
* 解析自动登录凭据
|
|
16
|
+
* 格式: username:password
|
|
17
|
+
*/
|
|
18
|
+
export declare function parseAutoLogin(autoLoginStr: string): {
|
|
19
|
+
username: string;
|
|
20
|
+
password: string;
|
|
21
|
+
} | null;
|
|
22
|
+
/**
|
|
23
|
+
* 创建自动登录注入脚本文件
|
|
24
|
+
*/
|
|
25
|
+
export declare function createAutoLoginInjectFile(autoLoginStr: string): string | null;
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* 自动登录脚本生成器
|
|
4
|
+
* 生成用于自动填充登录表单的 JS 脚本
|
|
5
|
+
*
|
|
6
|
+
* 安全说明:
|
|
7
|
+
* - 凭据使用 Base64 编码(非加密)
|
|
8
|
+
* - 脚本仅在构建时生成,凭据不会保存到源代码
|
|
9
|
+
* - 建议仅用于内部/私有应用
|
|
10
|
+
*/
|
|
11
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
12
|
+
if (k2 === undefined) k2 = k;
|
|
13
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
14
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
15
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
16
|
+
}
|
|
17
|
+
Object.defineProperty(o, k2, desc);
|
|
18
|
+
}) : (function(o, m, k, k2) {
|
|
19
|
+
if (k2 === undefined) k2 = k;
|
|
20
|
+
o[k2] = m[k];
|
|
21
|
+
}));
|
|
22
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
23
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
24
|
+
}) : function(o, v) {
|
|
25
|
+
o["default"] = v;
|
|
26
|
+
});
|
|
27
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
28
|
+
var ownKeys = function(o) {
|
|
29
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
30
|
+
var ar = [];
|
|
31
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
32
|
+
return ar;
|
|
33
|
+
};
|
|
34
|
+
return ownKeys(o);
|
|
35
|
+
};
|
|
36
|
+
return function (mod) {
|
|
37
|
+
if (mod && mod.__esModule) return mod;
|
|
38
|
+
var result = {};
|
|
39
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
40
|
+
__setModuleDefault(result, mod);
|
|
41
|
+
return result;
|
|
42
|
+
};
|
|
43
|
+
})();
|
|
44
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
45
|
+
exports.generateAutoLoginScript = generateAutoLoginScript;
|
|
46
|
+
exports.parseAutoLogin = parseAutoLogin;
|
|
47
|
+
exports.createAutoLoginInjectFile = createAutoLoginInjectFile;
|
|
48
|
+
const fs = __importStar(require("fs"));
|
|
49
|
+
const path = __importStar(require("path"));
|
|
50
|
+
const log = __importStar(require("loglevel"));
|
|
51
|
+
const helpers_1 = require("../helpers/helpers");
|
|
52
|
+
/**
|
|
53
|
+
* 生成自动登录脚本
|
|
54
|
+
*/
|
|
55
|
+
function generateAutoLoginScript(username, password) {
|
|
56
|
+
const encodedUsername = Buffer.from(username).toString('base64');
|
|
57
|
+
const encodedPassword = Buffer.from(password).toString('base64');
|
|
58
|
+
return `
|
|
59
|
+
(function() {
|
|
60
|
+
'use strict';
|
|
61
|
+
|
|
62
|
+
var AUTO_LOGIN_KEY = 'nativefier_auto_login_done';
|
|
63
|
+
|
|
64
|
+
function decode(str) {
|
|
65
|
+
return atob(str);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
function simulateInput(element, value) {
|
|
69
|
+
element.focus();
|
|
70
|
+
element.value = value;
|
|
71
|
+
element.dispatchEvent(new Event('input', { bubbles: true }));
|
|
72
|
+
element.dispatchEvent(new Event('change', { bubbles: true }));
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
function autoLogin() {
|
|
76
|
+
if (sessionStorage.getItem(AUTO_LOGIN_KEY)) {
|
|
77
|
+
console.log('[Nativefier] Auto-login already performed');
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
console.log('[Nativefier] Attempting auto-login...');
|
|
82
|
+
|
|
83
|
+
setTimeout(function() {
|
|
84
|
+
try {
|
|
85
|
+
var usernameSelectors = [
|
|
86
|
+
'input[type="text"]',
|
|
87
|
+
'input[type="email"]',
|
|
88
|
+
'input[name="username"]',
|
|
89
|
+
'input[name="email"]',
|
|
90
|
+
'input[id="username"]',
|
|
91
|
+
'input[id="email"]',
|
|
92
|
+
'input[name="user"]',
|
|
93
|
+
'input[autocomplete="username"]'
|
|
94
|
+
];
|
|
95
|
+
|
|
96
|
+
var usernameInput = null;
|
|
97
|
+
for (var i = 0; i < usernameSelectors.length; i++) {
|
|
98
|
+
usernameInput = document.querySelector(usernameSelectors[i]);
|
|
99
|
+
if (usernameInput) break;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
if (!usernameInput) {
|
|
103
|
+
console.log('[Nativefier] Username field not found, may already be logged in');
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
var passwordInput = document.querySelector('input[type="password"]');
|
|
108
|
+
if (!passwordInput) {
|
|
109
|
+
console.log('[Nativefier] Password field not found');
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
simulateInput(usernameInput, decode('${encodedUsername}'));
|
|
114
|
+
|
|
115
|
+
setTimeout(function() {
|
|
116
|
+
simulateInput(passwordInput, decode('${encodedPassword}'));
|
|
117
|
+
|
|
118
|
+
setTimeout(function() {
|
|
119
|
+
var submitBtn = document.querySelector('button[type="submit"]') ||
|
|
120
|
+
document.querySelector('input[type="submit"]') ||
|
|
121
|
+
document.querySelector('button.login') ||
|
|
122
|
+
document.querySelector('button.btn-primary') ||
|
|
123
|
+
document.querySelector('form button');
|
|
124
|
+
|
|
125
|
+
if (submitBtn) {
|
|
126
|
+
console.log('[Nativefier] Clicking submit button...');
|
|
127
|
+
submitBtn.click();
|
|
128
|
+
} else {
|
|
129
|
+
var form = usernameInput.closest('form');
|
|
130
|
+
if (form) {
|
|
131
|
+
console.log('[Nativefier] Submitting form...');
|
|
132
|
+
form.submit();
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
sessionStorage.setItem(AUTO_LOGIN_KEY, 'true');
|
|
137
|
+
console.log('[Nativefier] Auto-login completed');
|
|
138
|
+
}, 300);
|
|
139
|
+
}, 300);
|
|
140
|
+
|
|
141
|
+
} catch (err) {
|
|
142
|
+
console.error('[Nativefier] Auto-login failed:', err);
|
|
143
|
+
}
|
|
144
|
+
}, 1500);
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
if (document.readyState === 'complete') {
|
|
148
|
+
autoLogin();
|
|
149
|
+
} else {
|
|
150
|
+
window.addEventListener('load', autoLogin);
|
|
151
|
+
}
|
|
152
|
+
})();
|
|
153
|
+
`;
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* 解析自动登录凭据
|
|
157
|
+
* 格式: username:password
|
|
158
|
+
*/
|
|
159
|
+
function parseAutoLogin(autoLoginStr) {
|
|
160
|
+
if (!autoLoginStr)
|
|
161
|
+
return null;
|
|
162
|
+
const colonIndex = autoLoginStr.indexOf(':');
|
|
163
|
+
if (colonIndex === -1) {
|
|
164
|
+
log.error('Invalid auto-login format. Use: username:password');
|
|
165
|
+
return null;
|
|
166
|
+
}
|
|
167
|
+
const username = autoLoginStr.substring(0, colonIndex);
|
|
168
|
+
const password = autoLoginStr.substring(colonIndex + 1);
|
|
169
|
+
if (!username || !password) {
|
|
170
|
+
log.error('Invalid auto-login credentials');
|
|
171
|
+
return null;
|
|
172
|
+
}
|
|
173
|
+
return { username, password };
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* 创建自动登录注入脚本文件
|
|
177
|
+
*/
|
|
178
|
+
function createAutoLoginInjectFile(autoLoginStr) {
|
|
179
|
+
const credentials = parseAutoLogin(autoLoginStr);
|
|
180
|
+
if (!credentials)
|
|
181
|
+
return null;
|
|
182
|
+
const script = generateAutoLoginScript(credentials.username, credentials.password);
|
|
183
|
+
const tmpDir = (0, helpers_1.getTempDir)('autologin');
|
|
184
|
+
const scriptPath = path.join(tmpDir, 'auto-login.js');
|
|
185
|
+
fs.writeFileSync(scriptPath, script);
|
|
186
|
+
log.debug('Auto-login script created at:', scriptPath);
|
|
187
|
+
return scriptPath;
|
|
188
|
+
}
|
|
189
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/autologin/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAUH,0DAoGC;AAMD,wCAkBC;AAKD,8DAYC;AArJD,uCAAyB;AACzB,2CAA6B;AAC7B,8CAAgC;AAChC,gDAAgD;AAEhD;;GAEG;AACH,SAAgB,uBAAuB,CAAC,QAAgB,EAAE,QAAgB;IACxE,MAAM,eAAe,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACjE,MAAM,eAAe,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAEjE,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+CAuDsC,eAAe;;;iDAGb,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqC/D,CAAC;AACF,CAAC;AAED;;;GAGG;AACH,SAAgB,cAAc,CAAC,YAAoB;IACjD,IAAI,CAAC,YAAY;QAAE,OAAO,IAAI,CAAC;IAE/B,MAAM,UAAU,GAAG,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC7C,IAAI,UAAU,KAAK,CAAC,CAAC,EAAE,CAAC;QACtB,GAAG,CAAC,KAAK,CAAC,mDAAmD,CAAC,CAAC;QAC/D,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,QAAQ,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;IACvD,MAAM,QAAQ,GAAG,YAAY,CAAC,SAAS,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC;IAExD,IAAI,CAAC,QAAQ,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC3B,GAAG,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC;QAC5C,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;AAChC,CAAC;AAED;;GAEG;AACH,SAAgB,yBAAyB,CAAC,YAAoB;IAC5D,MAAM,WAAW,GAAG,cAAc,CAAC,YAAY,CAAC,CAAC;IACjD,IAAI,CAAC,WAAW;QAAE,OAAO,IAAI,CAAC;IAE9B,MAAM,MAAM,GAAG,uBAAuB,CAAC,WAAW,CAAC,QAAQ,EAAE,WAAW,CAAC,QAAQ,CAAC,CAAC;IACnF,MAAM,MAAM,GAAG,IAAA,oBAAU,EAAC,WAAW,CAAC,CAAC;IACvC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IAEtD,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IACrC,GAAG,CAAC,KAAK,CAAC,+BAA+B,EAAE,UAAU,CAAC,CAAC;IAEvD,OAAO,UAAU,CAAC;AACpB,CAAC"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.convertIconIfNecessary = convertIconIfNecessary;
|
|
37
|
+
const path = __importStar(require("path"));
|
|
38
|
+
const log = __importStar(require("loglevel"));
|
|
39
|
+
const helpers_1 = require("../helpers/helpers");
|
|
40
|
+
const iconShellHelpers_1 = require("../helpers/iconShellHelpers");
|
|
41
|
+
function iconIsIco(iconPath) {
|
|
42
|
+
return path.extname(iconPath) === '.ico';
|
|
43
|
+
}
|
|
44
|
+
function iconIsPng(iconPath) {
|
|
45
|
+
return path.extname(iconPath) === '.png';
|
|
46
|
+
}
|
|
47
|
+
function iconIsIcns(iconPath) {
|
|
48
|
+
return path.extname(iconPath) === '.icns';
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Will convert a `.png` icon to the appropriate arch format (if necessary),
|
|
52
|
+
* and return adjusted options
|
|
53
|
+
*/
|
|
54
|
+
function convertIconIfNecessary(options) {
|
|
55
|
+
if (!options.packager.icon) {
|
|
56
|
+
log.debug('Option "icon" not set, skipping icon conversion.');
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
if (options.packager.platform === 'win32') {
|
|
60
|
+
if (iconIsIco(options.packager.icon)) {
|
|
61
|
+
log.debug('Building for Windows and icon is already a .ico, no conversion needed');
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
try {
|
|
65
|
+
const iconPath = (0, iconShellHelpers_1.convertToIco)(options.packager.icon);
|
|
66
|
+
options.packager.icon = iconPath;
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
catch (err) {
|
|
70
|
+
log.warn('Failed to convert icon to .ico, skipping.', err);
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
if (options.packager.platform === 'linux') {
|
|
75
|
+
if (iconIsPng(options.packager.icon)) {
|
|
76
|
+
log.debug('Building for Linux and icon is already a .png, no conversion needed');
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
try {
|
|
80
|
+
const iconPath = (0, iconShellHelpers_1.convertToPng)(options.packager.icon);
|
|
81
|
+
options.packager.icon = iconPath;
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
catch (err) {
|
|
85
|
+
log.warn('Failed to convert icon to .png, skipping.', err);
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
if (iconIsIcns(options.packager.icon)) {
|
|
90
|
+
log.debug('Building for macOS and icon is already a .icns, no conversion needed');
|
|
91
|
+
}
|
|
92
|
+
if (!(0, helpers_1.isOSX)()) {
|
|
93
|
+
log.warn('Skipping icon conversion to .icns, conversion is only supported on macOS');
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
try {
|
|
97
|
+
if (!iconIsIcns(options.packager.icon)) {
|
|
98
|
+
const iconPath = (0, iconShellHelpers_1.convertToIcns)(options.packager.icon);
|
|
99
|
+
options.packager.icon = iconPath;
|
|
100
|
+
}
|
|
101
|
+
if (options.nativefier.tray !== 'false') {
|
|
102
|
+
(0, iconShellHelpers_1.convertToTrayIcon)(options.packager.icon);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
catch (err) {
|
|
106
|
+
log.warn('Failed to convert icon to .icns, skipping.', err);
|
|
107
|
+
options.packager.icon = undefined;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=buildIcon.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"buildIcon.js","sourceRoot":"","sources":["../../src/build/buildIcon.ts"],"names":[],"mappings":"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"}
|