{ "name": "signal-desktop", "productName": "Signal", "description": "Private messaging from your desktop", "desktopName": "signal.desktop", "repository": "https://github.com/signalapp/Signal-Desktop.git", "version": "7.25.0-alpha.1", "license": "AGPL-3.0-only", "author": { "name": "Signal Messenger, LLC", "email": "support@signal.org" }, "browserslist": "last 1 chrome versions", "browser": { "uuid": "uuid-browser" }, "main": "app/main.js", "scripts": { "postinstall": "npm run build:acknowledgments && patch-package --error-on-fail --error-on-warn && npm run electron:install-app-deps", "postuninstall": "npm run build:acknowledgments", "start": "electron .", "generate": "npm-run-all build-protobuf build:esbuild build:icu-types build:compact-locales sass get-expire-time copy-components", "build-release": "npm run build", "sign-release": "node ts/updater/generateSignature.js", "notarize": "echo 'No longer necessary'", "get-strings": "ts-node ts/scripts/get-strings.ts && ts-node ts/scripts/gen-nsis-script.ts && ts-node ts/scripts/gen-locales-config.ts && run-p get-strings:locales get-strings:countries get-strings:emoji mark-unusued-strings-deleted && run-p build:compact-locales", "get-strings:locales": "ts-node ./ts/scripts/build-localized-display-names.ts locales ts/scripts/locale-data/locale-display-names.csv build/locale-display-names.json", "get-strings:countries": "ts-node ./ts/scripts/build-localized-display-names.ts countries ts/scripts/locale-data/country-display-names.csv build/country-display-names.json", "get-strings:emoji": "ts-node ./ts/scripts/get-emoji-locales.ts", "push-strings": "node ts/scripts/remove-strings.js && node ts/scripts/push-strings.js", "mark-unusued-strings-deleted": "ts-node ./ts/scripts/mark-unused-strings-deleted.ts", "get-expire-time": "node ts/scripts/get-expire-time.js", "copy-components": "node ts/scripts/copy.js", "sass": "sass stylesheets/manifest.scss:stylesheets/manifest.css stylesheets/manifest_bridge.scss:stylesheets/manifest_bridge.css", "build-module-protobuf": "pbjs --target static-module --force-long --no-typeurl --no-verify --no-create --no-convert --wrap commonjs --out ts/protobuf/compiled.js protos/*.proto && pbts --no-comments --out ts/protobuf/compiled.d.ts ts/protobuf/compiled.js", "clean-module-protobuf": "rm -f ts/protobuf/compiled.d.ts ts/protobuf/compiled.js", "build-protobuf": "npm run build-module-protobuf", "clean-protobuf": "npm run clean-module-protobuf", "prepare-beta-build": "node scripts/prepare_beta_build.js", "prepare-alpha-build": "node scripts/prepare_alpha_build.js", "prepare-alpha-version": "node scripts/prepare_alpha_version.js", "prepare-staging-build": "node scripts/prepare_staging_build.js", "prepare-windows-cert": "node scripts/prepare_windows_cert.js", "test": "run-s test-node test-electron test-lint-intl test-eslint", "test-electron": "node ts/scripts/test-electron.js", "test-release": "node ts/scripts/test-release.js", "test-node": "cross-env LANG=en-us electron-mocha --timeout 10000 --file test/setup-test-node.js --recursive test/modules ts/test-node ts/test-both", "test-mock": "mocha --require ts/test-mock/setup-ci.js ts/test-mock/**/*_test.js", "test-eslint": "mocha .eslint/rules/**/*.test.js --ignore-leaks", "test-lint-intl": "ts-node ./build/intl-linter/linter.ts --test", "eslint": "eslint --cache . --cache-strategy content --max-warnings 0", "lint": "run-s --print-label lint-prettier lint-css check:types eslint", "lint-deps": "node ts/util/lint/linter.js", "lint-license-comments": "ts-node ts/util/lint/license_comments.ts", "lint-prettier": "pprettier --check '**/*.{ts,tsx,d.ts,js,json,html,scss,md,yml,yaml}' '!node_modules/**'", "lint-intl": "ts-node ./build/intl-linter/linter.ts", "lint-css": "stylelint '**/*.scss' --cache", "danger:local": "./danger/danger.sh local --base main", "danger:ci": "./danger/danger.sh ci --base origin/main", "format": "pprettier --write '**/*.{ts,tsx,d.ts,js,json,html,scss,md,yml,yaml}' '!node_modules/**'", "svgo": "svgo --multipass images/**/*.svg", "transpile": "run-p check:types build:esbuild", "check:types": "tsc --noEmit", "clean-transpile-once": "rimraf sticker-creator/dist app/**/*.js app/*.js ts/**/*.js ts/*.js bundles tsconfig.tsbuildinfo", "clean-transpile": "run-s clean-transpile-once clean-transpile-once", "ready": "npm-run-all --print-label clean-transpile generate --parallel lint lint-deps lint-intl test-node test-electron", "dev": "npm run build-protobuf && cross-env SIGNAL_ENV=storybook storybook dev --port 6006", "dev:transpile": "run-p \"check:types -- --watch\" dev:esbuild dev:icu-types dev:protobuf", "dev:esbuild": "node scripts/esbuild.js --watch", "dev:sass": "npm run sass -- --watch", "dev:icu-types": "chokidar ./_locales/en/messages.json --initial --command \"npm run build:icu-types\"", "dev:protobuf": "chokidar ./protos/**/*.proto --command \"npm run build-protobuf\"", "build:storybook": "npm run build-protobuf && cross-env SIGNAL_ENV=storybook storybook build", "test:storybook": "npm run build:storybook && run-p --race test:storybook:*", "test:storybook:serve": "http-server storybook-static --port 6006 --silent", "test:storybook:test": "wait-on http://127.0.0.1:6006/ --timeout 5000 && test-storybook", "build": "run-s --print-label generate build:esbuild:prod build:release", "build-linux": "run-s generate build:esbuild:prod && npm run build:release -- --publish=never", "build:acknowledgments": "node scripts/generate-acknowledgments.js", "build:dns-fallback": "node ts/scripts/generate-dns-fallback.js", "build:icu-types": "node ts/scripts/generate-icu-types.js", "build:compact-locales": "node ts/scripts/generate-compact-locales.js", "build:dev": "run-s --print-label generate build:esbuild:prod", "build:esbuild": "node scripts/esbuild.js", "build:esbuild:prod": "node scripts/esbuild.js --prod", "build:electron": "electron-builder --config.extraMetadata.environment=$SIGNAL_ENV", "build:release": "cross-env SIGNAL_ENV=production npm run build:electron -- --config.directories.output=release", "verify": "run-p --print-label verify:*", "verify:ts": "tsc --noEmit", "electron:install-app-deps": "electron-builder install-app-deps" }, "optionalDependencies": { "fs-xattr": "0.3.0" }, "dependencies": { "@formatjs/fast-memoize": "1.2.6", "@formatjs/icu-messageformat-parser": "2.3.0", "@formatjs/intl-localematcher": "0.2.32", "@indutny/dicer": "0.3.2", "@indutny/range-finder": "1.3.4", "@indutny/simple-windows-notifications": "2.0.1", "@indutny/sneequals": "4.0.0", "@popperjs/core": "2.11.6", "@react-aria/utils": "3.16.0", "@react-spring/web": "9.5.5", "@signalapp/better-sqlite3": "8.8.1", "@signalapp/libsignal-client": "0.55.1", "@signalapp/ringrtc": "2.46.2", "@types/fabric": "4.5.3", "backbone": "1.4.0", "blob-util": "2.0.2", "blueimp-load-image": "5.14.0", "blurhash": "1.1.3", "buffer": "6.0.3", "changedpi": "1.0.4", "cirbuf": "1.0.1", "classnames": "2.2.5", "config": "1.31.0", "copy-text-to-clipboard": "2.1.0", "dashdash": "1.14.1", "direction": "1.0.4", "emoji-datasource": "15.1.2", "emoji-datasource-apple": "15.1.2", "emoji-regex": "10.3.0", "encoding": "0.1.13", "fabric": "4.6.0", "fast-glob": "3.2.1", "filesize": "3.6.1", "firstline": "1.2.1", "focus-trap-react": "8.8.1", "form-data": "4.0.0", "fs-extra": "5.0.0", "fuse.js": "6.5.3", "glob": "7.1.6", "google-libphonenumber": "3.2.36", "got": "11.8.5", "heic-convert": "2.1.0", "humanize-duration": "3.27.1", "intl-tel-input": "17.0.13", "js-yaml": "3.13.1", "linkify-it": "2.2.0", "lodash": "4.17.21", "long": "4.0.0", "lru-cache": "6.0.0", "mac-screen-capture-permissions": "2.0.0", "memoizee": "0.4.14", "moment": "2.29.4", "mp4box": "0.5.2", "node-fetch": "2.6.7", "nop": "1.0.0", "normalize-path": "3.0.0", "p-map": "2.1.0", "p-queue": "6.6.2", "p-timeout": "4.1.0", "parchment": "1.1.4", "pify": "3.0.0", "pino": "8.6.1", "protobufjs": "7.3.2", "proxy-agent": "6.3.0", "qrcode-generator": "1.4.4", "quill": "1.3.7", "quill-delta": "4.0.1", "react": "17.0.2", "react-aria": "3.24.0", "react-aria-components": "1.0.0-alpha.3", "react-blurhash": "0.1.2", "react-contextmenu": "2.11.0", "react-dom": "17.0.2", "react-hot-loader": "4.13.0", "react-intl": "6.1.1", "react-popper": "2.3.0", "react-quill": "2.0.0-beta.4", "react-redux": "7.2.8", "react-router-dom": "5.0.1", "react-textarea-autosize": "8.3.4", "react-virtualized": "9.22.3", "read-last-lines": "1.8.0", "redux": "4.1.2", "redux-logger": "3.0.6", "redux-promise-middleware": "6.1.0", "redux-thunk": "2.3.0", "redux-ts-utils": "3.2.2", "reselect": "4.1.2", "rimraf": "2.6.2", "sanitize.css": "11.0.0", "semver": "5.7.2", "split2": "4.0.0", "type-fest": "4.23.0", "urlpattern-polyfill": "9.0.0", "uuid": "3.3.2", "uuid-browser": "3.1.0", "websocket": "1.0.34", "write-file-atomic": "5.0.1", "zod": "3.22.3" }, "devDependencies": { "@babel/core": "7.23.0", "@babel/plugin-proposal-class-properties": "7.18.6", "@babel/plugin-proposal-nullish-coalescing-operator": "7.18.6", "@babel/plugin-proposal-optional-chaining": "7.21.0", "@babel/plugin-transform-runtime": "7.22.15", "@babel/plugin-transform-typescript": "7.22.15", "@babel/preset-react": "7.22.15", "@babel/preset-typescript": "7.23.0", "@electron/fuses": "1.5.0", "@electron/notarize": "2.1.0", "@formatjs/intl": "2.6.7", "@indutny/parallel-prettier": "3.0.0", "@indutny/rezip-electron": "1.3.1", "@indutny/symbolicate-mac": "2.3.0", "@signalapp/mock-server": "6.9.0", "@storybook/addon-a11y": "8.1.11", "@storybook/addon-actions": "8.1.11", "@storybook/addon-controls": "8.1.11", "@storybook/addon-interactions": "8.1.11", "@storybook/addon-jest": "8.1.11", "@storybook/addon-measure": "8.1.11", "@storybook/addon-toolbars": "8.1.11", "@storybook/addon-viewport": "8.1.11", "@storybook/addon-webpack5-compiler-swc": "1.0.4", "@storybook/preview-api": "8.1.11", "@storybook/react": "8.1.11", "@storybook/react-webpack5": "8.1.11", "@storybook/test": "8.1.11", "@storybook/test-runner": "0.19.0", "@types/backbone": "1.4.16", "@types/blueimp-load-image": "5.14.1", "@types/chai": "4.3.16", "@types/chai-as-promised": "7.1.4", "@types/classnames": "2.2.3", "@types/config": "0.0.39", "@types/dashdash": "1.14.0", "@types/debug": "4.1.7", "@types/direction": "1.0.0", "@types/filesize": "3.6.0", "@types/fs-extra": "5.0.5", "@types/google-libphonenumber": "7.4.30", "@types/history": "4.7.2", "@types/humanize-duration": "3.18.1", "@types/intl-tel-input": "17.0.4", "@types/js-yaml": "3.12.0", "@types/json-to-ast": "2.1.2", "@types/linkify-it": "2.1.0", "@types/lodash": "4.14.106", "@types/long": "4.0.1", "@types/lru-cache": "5.1.0", "@types/memoizee": "0.4.2", "@types/mocha": "9.0.0", "@types/node": "20.14.10", "@types/node-fetch": "2.6.2", "@types/normalize-path": "3.0.0", "@types/pify": "3.0.2", "@types/pixelmatch": "5.2.6", "@types/pngjs": "6.0.4", "@types/prettier": "2.7.3", "@types/quill": "1.3.10", "@types/react": "17.0.45", "@types/react-dom": "17.0.17", "@types/react-redux": "7.1.24", "@types/react-router-dom": "4.3.4", "@types/react-virtualized": "9.18.12", "@types/redux-logger": "3.0.7", "@types/rimraf": "2.0.2", "@types/semver": "5.5.0", "@types/sinon": "10.0.2", "@types/split2": "3.2.1", "@types/terser-webpack-plugin": "5.0.3", "@types/unzipper": "0.10.9", "@types/uuid": "3.4.4", "@types/websocket": "1.0.0", "@types/write-file-atomic": "4.0.3", "@types/yargs": "17.0.7", "@typescript-eslint/eslint-plugin": "6.18.1", "@typescript-eslint/parser": "6.18.1", "asar": "3.1.0", "axe-core": "4.1.4", "babel-core": "7.0.0-bridge.0", "babel-loader": "9.1.3", "babel-plugin-lodash": "3.3.4", "casual": "1.6.2", "chai": "4.4.1", "chai-as-promised": "7.1.1", "chalk": "4.1.2", "chokidar-cli": "3.0.0", "core-js": "2.6.9", "cross-env": "5.2.0", "css-loader": "3.2.0", "csv-parse": "5.5.2", "danger": "11.3.1", "debug": "4.3.3", "electron": "32.0.1", "electron-builder": "24.13.3", "electron-mocha": "12.2.0", "endanger": "7.0.4", "esbuild": "0.17.11", "eslint": "8.56.0", "eslint-config-airbnb-typescript-prettier": "5.0.0", "eslint-config-prettier": "8.5.0", "eslint-plugin-import": "2.26.0", "eslint-plugin-local-rules": "1.3.2", "eslint-plugin-mocha": "10.1.0", "eslint-plugin-more": "1.0.5", "eslint-plugin-react": "7.31.10", "execa": "5.1.1", "html-webpack-plugin": "5.3.1", "http-server": "14.1.1", "json-to-ast": "2.1.0", "log-symbols": "4.1.0", "mini-css-extract-plugin": "2.7.6", "mocha": "9.2.2", "node-gyp": "10.0.1", "node-gyp-build": "4.8.1", "npm-run-all": "4.1.5", "p-limit": "3.1.0", "patch-package": "8.0.0", "pixelmatch": "5.3.0", "playwright": "1.45.0", "pngjs": "7.0.0", "prettier": "3.3.3", "protobufjs-cli": "1.1.1", "resedit": "2.0.2", "resolve-url-loader": "5.0.0", "sass": "1.49.7", "sass-loader": "10.2.0", "sinon": "11.1.1", "storybook": "8.1.11", "style-loader": "1.0.0", "stylelint": "15.4.0", "stylelint-config-css-modules": "4.2.0", "stylelint-config-recommended-scss": "10.0.0", "stylelint-use-logical-spec": "5.0.0", "svgo": "3.0.2", "terser-webpack-plugin": "5.1.1", "ts-node": "8.3.0", "typed-scss-modules": "4.1.1", "typescript": "5.3.3", "unzipper": "0.10.14", "wait-on": "7.2.0", "webpack": "5.88.2", "webpack-cli": "4.9.2", "webpack-dev-server": "4.11.1" }, "overrides": { "@storybook/react": { "@storybook/core": { "node-fetch": "2.6.1" } }, "@types/react": "17.0.45", "@types/react-dom": "17.0.17", "eslint-config-airbnb-typescript-prettier": { "eslint-plugin-prettier": "5.2.1" }, "fabric": { "canvas": "$nop", "jsdom": "$nop" }, "fast-glob": { "glob-parent": "5.1.2" }, "read-last-lines": { "mz": { "thenify-all": { "thenify": "3.3.1" } } } }, "engines": { "node": "20.16.0" }, "build": { "appId": "org.whispersystems.signal-desktop", "mac": { "artifactName": "${name}-mac-${arch}-${version}.${ext}", "category": "public.app-category.social-networking", "darkModeSupport": true, "hardenedRuntime": true, "entitlements": "./build/entitlements.mac.plist", "entitlementsInherit": "./build/entitlements.mac.inherit.plist", "icon": "build/icons/mac/icon.icns", "publish": [ { "provider": "generic", "url": "https://updates.signal.org/desktop" } ], "mergeASARs": true, "releaseInfo": { "vendor": { "minOSVersion": "19.0.0" } }, "sign": "./ts/scripts/sign-macos.js", "singleArchFiles": "node_modules/@signalapp/{libsignal-client/prebuilds/**,ringrtc/build/**}", "target": [ { "target": "zip", "arch": [ "x64", "arm64" ] }, { "target": "dmg", "arch": [ "x64", "arm64", "universal" ] } ], "bundleVersion": "1" }, "win": { "artifactName": "${name}-win-${version}.${ext}", "certificateSubjectName": "Signal Messenger, LLC", "certificateSha1": "8D5E3CD800736C5E1FE459A1F5AA48287D4F6EC6", "signingHashAlgorithms": [ "sha256" ], "sign": "./ts/scripts/sign-windows.js", "publisherName": "Signal Messenger, LLC", "icon": "build/icons/win/icon.ico", "publish": [ { "provider": "generic", "url": "https://updates.signal.org/desktop" } ], "releaseInfo": { "vendor": { "minOSVersion": "10.0.10240" } }, "signDlls": true, "signExts": [ ".node" ], "target": [ "nsis" ], "asarUnpack": [ "build/icons/win/icon.ico" ] }, "nsis": { "deleteAppDataOnUninstall": true, "differentialPackage": true }, "linux": { "category": "Network;InstantMessaging;Chat", "desktop": { "StartupWMClass": "Signal" }, "target": [ "deb" ], "icon": "build/icons/png", "publish": [] }, "deb": { "depends": [ "libnotify4", "libxtst6", "libnss3", "libasound2", "libxss1", "libc6 (>= 2.31)", "libgtk-3-0", "libgbm1", "libx11-xcb1" ] }, "protocols": { "name": "sgnl-url-scheme", "schemes": [ "sgnl", "signalcaptcha" ] }, "artifactBuildCompleted": "ts/scripts/artifact-build-completed.js", "afterSign": "ts/scripts/after-sign.js", "afterPack": "ts/scripts/after-pack.js", "afterAllArtifactBuild": "ts/scripts/after-all-artifact-build.js", "asar": { "smartUnpack": false }, "asarUnpack": [ "**/*.node" ], "files": [ "package.json", "config/default.json", "config/${env.SIGNAL_ENV}.json", "config/local-${env.SIGNAL_ENV}.json", "bundles/**", "background.html", "about.html", "screenShare.html", "settings.html", "permissions_popup.html", "calling_tools.html", "debug_log.html", "loading.html", { "from": "build/compact-locales", "to": "_locales", "filter": "**/messages.json" }, "js/**", "libtextsecure/**", "ts/**/*.js", "ts/*.js", "!ts/scripts/**", "!build", "!ts/{storybook,test-node,test-mock,test-both,test-electron}", "!**/{tsconfig,bower,component}.json", "!**/.{github,husky,grenrc,npmrc,nycrc,taprc,bithoundrc}", "!**/.testem.json", "!**/.babelrc*", "!**/.eslintrc*", "!**/.prettier*", "!**/.jscs*", "!**/*travis*.yml", "!**/{CHANGES,TODO,CHANGES.md~,README.md~}", "!**/*.stories.js", "!**/*.jest.js", "!**/*.{bak,bnf,flow,patch,markdown,bnf,mli,ts,map}", "!node_modules/intl-tel-input/composer.json", "!js/register.js", "!fixtures", "stylesheets/*.css", "app/*", "!app/*.ts", "preload.bundle.js", "preload_utils.js", "main.js", "images/**", "fonts/**", "sounds/*", "build/icons", "build/available-locales.json", "build/locale-display-names.json", "build/country-display-names.json", "build/dns-fallback.json", "build/optional-resources.json", "build/jumbomoji.json", "node_modules/**", "!node_modules/underscore/**", "!node_modules/emoji-datasource/emoji_pretty.json", "!node_modules/emoji-datasource/**/*.png", "!node_modules/emoji-datasource-apple/emoji_pretty.json", "!node_modules/emoji-datasource-apple/img/apple/sheets*", "!node_modules/spellchecker/vendor/hunspell/**/*", "!node_modules/@formatjs/intl-displaynames/**/*", "!node_modules/@formatjs/intl-listformat/**/*", "!**/node_modules/*/{CHANGELOG.md,README.md,README,readme.md,readme,test,__tests__,tests,powered-test,example,examples,*.d.ts,*d.ts.map,*.js.map,*.gypi,.snyk-*.flag,benchmark}", "!**/node_modules/.bin", "!**/node_modules/**/build/**", "node_modules/intl-tel-input/build/**", "!**/node_modules/**/prebuilds/**", "!**/*.{o,hprof,orig,pyc,pyo,rbc,c,h,m}", "!**/._*", "!**/{.DS_Store,.git,.hg,.svn,CVS,RCS,SCCS,__pycache__,thumbs.db,.gitignore,.gitattributes,.flowconfig,.yarn-metadata.json,.idea,appveyor.yml,.travis.yml,circle.yml,npm-debug.log,.nyc_output,yarn.lock,.yarn-integrity}", "node_modules/spellchecker/build/Release/*.node", "node_modules/websocket/build/Release/*.node", "!node_modules/websocket/builderror.log", "node_modules/socks/build/*.js", "node_modules/socks/build/common/*.js", "node_modules/socks/build/client/*.js", "node_modules/smart-buffer/build/*.js", "!node_modules/@signalapp/better-sqlite3/deps/*", "!node_modules/@signalapp/better-sqlite3/src/*", "node_modules/@signalapp/better-sqlite3/build/Release/better_sqlite3.node", "node_modules/@signalapp/libsignal-client/prebuilds/${platform}-${arch}/*.node", "!node_modules/@signalapp/ringrtc/scripts/*", "node_modules/@signalapp/ringrtc/build/${platform}/*${arch}*.node", "node_modules/mac-screen-capture-permissions/build/Release/*.node", "node_modules/@indutny/simple-windows-notifications/build/Release/*.node", "node_modules/fs-xattr/build/Release/*.node", "!node_modules/@indutny/simple-windows-notifications/*.cpp", "!node_modules/libheif-js/libheif", "!node_modules/libheif-js/libheif-wasm/libheif-bundle.mjs", "!node_modules/libheif-js/libheif-wasm/*.wasm", "!node_modules/@react-aria/**", "!node_modules/react-aria-components/**", "!node_modules/react-virtualized/**", "!node_modules/@react-stately/**", "!node_modules/@popperjs/**", "!node_modules/@internationalized/**", "!node_modules/protobufjs/dist/**", "node_modules/protobufjs/dist/minimal/**", "!**/node_modules/react-dom/*/*.development.js", "!node_modules/mp4box/**", "node_modules/mp4box/package.json", "node_modules/mp4box/dist/mp4box.all.js", "!node_modules/.cache", "sticker-creator/dist/**" ] } }