{ "name": "superProductivity", "version": "18.4.2", "description": "ToDo list and Time Tracking", "keywords": [ "ToDo", "Task Management", "Jira", "GitHub", "Time Tracking" ], "homepage": "https://super-productivity.com", "repository": { "type": "git", "url": "git://github.com/super-productivity/super-productivity.git" }, "license": "MIT", "author": "Johannes Millan (http://super-productivity.com)", "main": "./electron/main.js", "scripts": { "env": "node ./tools/load-env.js", "assemble:android:prod": "cd android && ./gradlew assembleRelease && cd ..", "assemble:android:stage": "cd android && ./gradlew assembleDebug && cd ..", "prebuild": "npm run env && node ./tools/git-version.js && npm run build:packages", "prepare": "husky && ts-patch install && npm run env && npm run shared-schema:build && npm run plugin-api:build", "build": "npm run buildAllElectron:noTests:prod", "build:packages": "node ./packages/build-packages.js", "buildAllElectron:noTests:prod": "npm run lint && npm run buildFrontend:prod:es6 && npm run electron:build", "buildAllElectron:prod": "npm run env && npm run preCheck && npm run buildFrontend:prod:es6 && npm run electron:build", "buildAllElectron:stage": "npm run preCheck && npm run buildFrontend:stage:es6 && npm run electron:build", "buildFrontend:dev": "npm run env && ng build --configuration development", "buildFrontend:prod:es6": "npm run prebuild && cross-env BROWSERSLIST_ENV='modern' ng build --configuration production && npm run removeWOFF1", "buildFrontend:prod:watch": "npm run prebuild && ng build --configuration production --watch", "buildFrontend:prodWeb": "npm run prebuild && ng build --configuration productionWeb", "buildFrontend:stage:es6": "npm run prebuild && cross-env BROWSERSLIST_ENV='modern' ng build --configuration stage && npm run removeWOFF1", "buildFrontend:stageWeb": "npm run prebuild && ng build --configuration stageWeb", "buildFrontend:stageWeb:unminified": "npm run prebuild && ng build --configuration stageWeb --optimization=false --aot=false", "dist": "npm run buildAllElectron:prod && electron-builder", "dist:android": "npm run buildFrontend:stageWeb:unminified && npm run sync:android && npm run assemble:android:stage && echo 'Staging Android APK generated at android/app/build/outputs/apk/debug/'", "dist:android:prod": "npm run buildFrontend:prodWeb && npm run sync:android && npm run assemble:android:prod && echo 'Production Android APK generated at android/app/build/outputs/apk/release/'", "dist:linuxAndWin": "npm run buildAllElectron:prod && electron-builder --linux --win", "dist:mac:dl": "cp tools/mac-profiles/dl.provisionprofile embedded.provisionprofile && electron-builder --mac", "dist:mac:mas": "cp tools/mac-profiles/mas.provisionprofile embedded.provisionprofile; electron-builder --mac mas --config=build/electron-builder.mas.yaml", "dist:mac:mas:buildOnly": "electron-builder --config=build/electron-builder.mas.yaml", "dist:mac:mas:dev": "cp tools/mac-profiles/mas-dev.provisionprofile embedded.provisionprofile; electron-builder --mac mas-dev --config=build/electron-builder.mas-dev.yaml", "dist:mac:mas:x64": "cp tools/mac-profiles/mas.provisionprofile embedded.provisionprofile; electron-builder --mac mas --config=build/electron-builder.mas.yaml --x64", "dist:only": "electron-builder", "dist:win": "npm run buildAllElectron:noTests:prod && electron-builder --win", "dist:win:appx": "npm run buildAllElectron:prod && electron-builder --win --config=build/electron-builder.appx.yaml", "dist:win:only": "electron-builder --win", "dist:win:store": "git pull && npm run && copy electron-builder.win-store.yaml electron-builder.yaml && npm run dist:win && git checkout electron-builder.yaml || git checkout electron-builder.yaml", "droid": "npm run buildFrontend:stageWeb:unminified && npx cap sync android", "buildFrontend:e2e": "npm run plugins:build && npm run env && ng build", "serveFrontend:e2e:prod": "npx http-server .tmp/angular-dist/browser -p 4242 -c-1 --proxy http://localhost:4242?", "e2e": "npm run e2e:all -- --grep-invert \"@supersync|@webdav\"", "e2e:all": "npx playwright test --config e2e/playwright.config.ts --reporter=line", "e2e:ci": "npm run e2e", "e2e:ui": "npx playwright test --config e2e/playwright.config.ts --ui", "e2e:file": "npx playwright test --config e2e/playwright.config.ts --reporter=list", "e2e:debug": "npx playwright test --config e2e/playwright.config.ts --debug", "e2e:headed": "npx playwright test --config e2e/playwright.config.ts --headed", "e2e:show-report": "npx playwright show-report .tmp/e2e-test-results/playwright-report", "e2e:report": "PLAYWRIGHT_HTML_REPORT=1 npx playwright test --config e2e/playwright.config.ts", "e2e:webdav": "docker compose up -d webdav && ./scripts/wait-for-webdav.sh && npm run e2e:all -- --grep @webdav; docker compose down", "e2e:webdav:file": "docker compose up -d webdav && ./scripts/wait-for-webdav.sh && E2E_VERBOSE=true npx playwright test --config e2e/playwright.config.ts --reporter=list; docker compose down", "e2e:supersync": "docker compose -f docker-compose.yaml -f docker-compose.supersync.yaml up -d --build supersync && echo 'Waiting for SuperSync server...' && until curl -s http://localhost:1901/health > /dev/null 2>&1; do sleep 1; done && echo 'Server ready!' && npm run e2e:all -- --grep @supersync --workers=3; docker compose -f docker-compose.yaml -f docker-compose.supersync.yaml down supersync", "e2e:supersync:file": "docker compose -f docker-compose.yaml -f docker-compose.supersync.yaml up -d --build supersync && echo 'Waiting for SuperSync server...' && until curl -s http://localhost:1901/health > /dev/null 2>&1; do sleep 1; done && echo 'Server ready!' && E2E_VERBOSE=true npx playwright test --config e2e/playwright.config.ts --reporter=list --workers=3", "supersync:up": "docker compose -f docker-compose.yaml -f docker-compose.supersync.yaml up -d --build supersync && echo 'Waiting for SuperSync server...' && until curl -s http://localhost:1901/health > /dev/null 2>&1; do sleep 1; done && echo 'Server ready!'", "supersync:down": "docker compose -f docker-compose.yaml -f docker-compose.supersync.yaml down supersync", "e2e:docker": "docker compose -f docker-compose.e2e.yaml up -d app && ./scripts/wait-for-app.sh && E2E_BASE_URL=http://localhost:${APP_PORT:-4242} npm run e2e; docker compose -f docker-compose.e2e.yaml down", "e2e:docker:webdav": "docker compose -f docker-compose.e2e.yaml up -d app webdav && ./scripts/wait-for-app.sh && ./scripts/wait-for-webdav.sh && E2E_BASE_URL=http://localhost:${APP_PORT:-4242} npm run e2e:all -- --grep @webdav; docker compose -f docker-compose.e2e.yaml down", "e2e:docker:all": "docker compose -f docker-compose.e2e.yaml -f docker-compose.yaml -f docker-compose.supersync.yaml up -d app webdav db supersync && ./scripts/wait-for-app.sh && ./scripts/wait-for-webdav.sh && ./scripts/wait-for-supersync.sh && E2E_BASE_URL=http://localhost:${APP_PORT:-4242} npm run e2e:all -- --workers=6; EXIT_CODE=$?; docker compose -f docker-compose.e2e.yaml -f docker-compose.yaml -f docker-compose.supersync.yaml down; exit $EXIT_CODE", "electron": "NODE_ENV=PROD electron .", "electron:build": "node ./tools/build-wayland-idle-helper.js && tsc -p electron/tsconfig.electron.json && node electron/scripts/bundle-preload.js", "electron:verify-asar": "node tools/verify-electron-requires.js .tmp/app-builds/linux-unpacked/resources/app.asar", "electron:watch": "tsc -p electron/tsconfig.electron.json --watch", "electronBuilderOnly": "electron-builder", "empty": "echo 'EMPTY YEAH'", "install:android": "adb install -r android/app/build/outputs/apk/fdroid/debug/app-fdroid-debug.apk && echo 'Staging APK installed successfully.'", "install:android:prod": "adb install -r android/app/build/outputs/apk/fdroid/release/app-fdroid-release.apk && echo 'Production APK installed successfully.'", "int": "node ./tools/extract-i18n-single.js", "int:clean": "ngx-translate-extract --input ./src --output ./src/assets/i18n/*.json --clean --sort --format namespaced-json --marker _", "int:find": "ngx-translate-extract --input ./src --output ./src/assets/i18n/*.json --sort --format namespaced-json --marker _", "int:test": "node ./tools/test-lng-files.js", "int:unused": "node ./tools/find-unused-translations.js", "int:watch": "node ./tools/extract-i18n-watch.js", "lint": "npm run lint:ts && npm run lint:scss", "lint:ts": "ng lint", "lint:scss": "stylelint \"**/*.scss\" -- --custom-formatter @csstools/stylelint-formatter-github", "localInstall": "sudo echo 'Starting local install' && rm -Rf ./.tmp/angular-dist/ && rm -Rf ./.tmp/app-builds/ && npm run buildAllElectron:stage && electron-builder --linux deb && sudo dpkg -i .tmp/app-builds/superProductivity*.deb", "localInstall:mac": "sudo echo 'Starting local install MAC. Don`t forget APPLEID & APPLEIDPASS !!' && npm run buildAllElectron:noTests:prod && sudo echo '' && electron-builder && sudo cp -rf .tmp/app-builds/mac/superProductivity.app/ /Applications/superProductivity.app", "localInstall:prod": "sudo echo 'Starting local install PROD' && rm -Rf ./.tmp/angular-dist/ && rm -Rf ./.tmp/app-builds/ && npm run buildAllElectron:prod && electron-builder --linux deb && sudo dpkg -i .tmp/app-builds/superProductivity*.deb", "localInstall:quick": "sudo echo 'Starting local install QUICK' && rm -Rf ./.tmp/angular-dist/ && rm -Rf ./.tmp/app-builds/ && npm run buildFrontend:stage:es6 && npm run electron:build && electron-builder --linux deb && sudo dpkg -i .tmp/app-builds/superProductivity*.deb", "localInstall:test:snap": "sudo echo 'Starting local install SNAP QUICK' && rm -Rf ./.tmp/angular-dist/ && rm -Rf ./.tmp/app-builds/ && npm run buildFrontend:stage:es6 && npm run electron:build && electron-builder --linux snap && sudo snap install --dangerous .tmp/app-builds/superProductivity*.snap", "ng": "ng", "pack": "electron-builder --dir", "preCheck": "npm run lint && npm run test & npm run int:test && npm run e2e", "release": "npm run dist", "removeWOFF1": "node ./tools/remove-woff.js", "serveProd": "node ./tools/load-env.js --ensure && ng serve --configuration production", "start": "npm run electron:build && cross-env NODE_ENV=DEV electron .", "serve": "node ./tools/load-env.js --ensure && ng serve", "startFrontend": "npm run env && ng serve", "startFrontend:e2e": "npm run env && ng serve --port=4242", "startFrontend:prod": "npm run env && ng serve --configuration production", "startFrontend:stage": "npm run env && ng serve --configuration stage", "generate:ios-icon": "node tools/generate-ios-icon.js", "sync:android": "npx cap sync android", "sync:ios": "npx cap sync ios", "dist:ios:prod": "npm run buildFrontend:prodWeb && npm run sync:ios", "stats": "ng build --configuration production --source-map --stats-json && npx esbuild-visualizer --metadata .tmp/angular-dist/stats.json && xdg-open stats.html", "test": "cross-env TZ='Europe/Berlin' ng test --watch=false && npm run test:tz:ci", "test:once": "cross-env TZ='Europe/Berlin' ng test --watch=false", "test:watch": "cross-env TZ='Europe/Berlin' ng test --browsers ChromeHeadless", "test:tz:ci": "npm run test:tz:la", "test:tz:la": "cross-env TZ='America/Los_Angeles' ng test --watch=false --include='**/*.spec.ts'", "test:tz:tokyo": "cross-env TZ='Asia/Tokyo' ng test --watch=false --include='**/*.spec.ts'", "test:tz:sydney": "cross-env TZ='Australia/Sydney' ng test --watch=false --include='**/*.spec.ts'", "test:tz:utc": "cross-env TZ='UTC' ng test --watch=false --include='**/*.spec.ts'", "test:tz:all": "npm run test && npm run test:tz:la && npm run test:tz:tokyo && npm run test:tz:sydney && npm run test:tz:utc", "test:date-utils": "cross-env TZ='Europe/Berlin' ng test --watch=false --include='src/app/util/**/format-*.spec.ts' --include='src/app/util/**/date-*.spec.ts'", "test:date-utils:tz": "npm run test:date-utils && cross-env TZ='America/Los_Angeles' npm run test:date-utils && cross-env TZ='Asia/Tokyo' npm run test:date-utils", "version": "npm run prebuild && node ./tools/bump-android-version.js && git add -A", "prettier": "pretty-quick", "prettier:file": "prettier --write", "lint:file": "ng lint --lint-file-patterns", "test:file": "cross-env TZ='Europe/Berlin' ng test --watch=false --include", "test:electron": "node --test electron/*.test.cjs", "test:fast": "cross-env TZ='Europe/Berlin' NODE_OPTIONS='--max-old-space-size=4096' ng test --watch=false --no-code-coverage --source-map=false", "test:fast:watch": "cross-env TZ='Europe/Berlin' NODE_OPTIONS='--max-old-space-size=4096' ng test --browsers ChromeHeadless --no-code-coverage --source-map=false", "test:shard:features": "cross-env TZ='Europe/Berlin' ng test --watch=false --include='src/app/features/**/*.spec.ts'", "test:shard:ui": "cross-env TZ='Europe/Berlin' ng test --watch=false --include='src/app/ui/**/*.spec.ts'", "test:shard:core": "cross-env TZ='Europe/Berlin' ng test --watch=false --include='src/app/core/**/*.spec.ts'", "test:shard:util": "cross-env TZ='Europe/Berlin' ng test --watch=false --include='src/app/util/**/*.spec.ts'", "checkFile": "node tools/check-file.js", "clean:translations": "node ./tools/clean-translations.js", "plugin-api:build": "cd packages/plugin-api && npm run build", "shared-schema:build": "cd packages/shared-schema && npm run build", "plugin-api:build:watch": "cd packages/plugin-api && npm run build:watch", "vite-plugin:build": "cd packages/vite-plugin && npm run build", "plugins:build": "npm run plugin-api:build && npm run vite-plugin:build && cd packages/plugin-dev && npm run build:all", "plugins:build:silent": "npm run vite-plugin:build && cd packages/plugin-dev && npm run build:all:silent" }, "resolutions": { "sass": "1.32.6", "@ctrl/tinycolor": "4.1.0" }, "dependencies": { "@capacitor/browser": "^7.0.4", "@capacitor/ios": "^7.4.4", "@capacitor/keyboard": "^7.0.4", "@capacitor/status-bar": "^7.0.4", "@material-symbols/font-400": "^0.44.4", "@noble/ciphers": "^2.2.0", "capacitor-plugin-safe-area": "^4.0.3", "electron-dl": "^3.5.2", "electron-localshortcut": "^3.2.1", "electron-log": "^5.4.3", "electron-window-state": "^5.0.3", "hash-wasm": "^4.12.0", "https-proxy-agent": "^7.0.0", "node-fetch": "^2.7.0", "uuidv7": "^1.2.1" }, "devDependencies": { "@angular-devkit/build-angular": "^21.2.9", "@angular-eslint/builder": "^21.3.1", "@angular-eslint/eslint-plugin": "^21.3.1", "@angular-eslint/eslint-plugin-template": "^21.3.1", "@angular-eslint/schematics": "^21.3.1", "@angular-eslint/template-parser": "^21.3.1", "@angular/animations": "^21.2.11", "@angular/cdk": "^21.2.9", "@angular/cli": "^21.2.9", "@angular/common": "^21.2.11", "@angular/compiler": "^21.2.11", "@angular/compiler-cli": "^21.2.11", "@angular/core": "^21.2.11", "@angular/forms": "^21.2.11", "@angular/language-service": "^21.2.11", "@angular/material": "^21.2.9", "@angular/platform-browser": "^21.2.11", "@angular/platform-browser-dynamic": "^21.2.11", "@angular/platform-server": "^21.2.11", "@angular/router": "^21.2.11", "@angular/service-worker": "^21.2.11", "@capacitor/android": "^7.4.4", "@capacitor/app": "^7.1.0", "@capacitor/cli": "^7.5.0", "@capacitor/core": "^7.4.3", "@capacitor/filesystem": "^7.1.1", "@capacitor/local-notifications": "^7.0.1", "@capacitor/share": "^7.0.2", "@capawesome/capacitor-android-dark-mode-support": "^7.0.0", "@capawesome/capacitor-background-task": "^7.0.1", "@csstools/stylelint-formatter-github": "^2.0.0", "@dotenv-run/cli": "^1.3.6", "@electron/notarize": "^3.1.1", "@eslint/js": "^9.39.2", "@fontsource/open-sans": "^5.2.7", "@nextcloud/cdav-library": "^1.5.3", "@ngrx/effects": "^21.1.0", "@ngrx/entity": "^21.1.0", "@ngrx/schematics": "^21.1.0", "@ngrx/store": "21.1.0", "@ngrx/store-devtools": "^21.1.0", "@ngx-formly/core": "^7.1.0", "@ngx-formly/material": "^7.1.0", "@ngx-translate/core": "^17.0.0", "@ngx-translate/http-loader": "^17.0.0", "@playwright/test": "^1.59.1", "@schematics/angular": "^21.2.9", "@types/electron": "^1.6.12", "@types/electron-localshortcut": "^3.1.3", "@types/file-saver": "^2.0.7", "@types/jasmine": "^6.0.0", "@types/jasminewd2": "~2.0.13", "@types/node": "^22.19.17", "@types/node-fetch": "^2.6.13", "@types/object-path": "^0.11.4", "@typescript-eslint/types": "^8.59.1", "@typescript-eslint/utils": "^8.59.1", "angular-eslint": "^21.3.1", "angular-material-css-vars": "^10.0.0", "baseline-browser-mapping": "^2.10.24", "canvas-confetti": "^1.9.4", "chai": "^6.2.2", "chart.js": "^4.5.1", "chrono-node": "^2.9.0", "clipboard": "^2.0.11", "core-js": "^3.49.0", "cross-env": "^10.1.0", "detect-it": "^4.0.1", "dotenv": "^17.4.2", "electron": "41.4.0", "electron-builder": "^26.8.1", "eslint": "^9.39.2", "eslint-config-prettier": "^10.1.8", "eslint-plugin-import": "^2.32.0", "eslint-plugin-jsdoc": "62.9.0", "eslint-plugin-local-rules": "^3.0.2", "eslint-plugin-prefer-arrow": "1.2.3", "eslint-plugin-prettier": "^5.5.5", "fflate": "^0.8.2", "file-saver": "^2.0.5", "fs-extra": "^11.3.4", "glob": "^13.0.6", "http-server": "^14.1.1", "husky": "^9.1.7", "ical.js": "^2.2.1", "idb": "^8.0.3", "jasmine-core": "^6.2.0", "jasmine-marbles": "^0.9.2", "jasmine-spec-reporter": "~7.0.0", "karma": "~6.4.4", "karma-chrome-launcher": "~3.2.0", "karma-cli": "^2.0.0", "karma-coverage-istanbul-reporter": "~3.0.3", "karma-jasmine": "~5.1.0", "karma-jasmine-html-reporter": "^2.2.0", "karma-spec-reporter": "^0.0.36", "marked": "^17.0.1", "nanoid": "^5.1.11", "new-github-issue-url": "^1.1.0", "ng2-charts": "^10.0.0", "ngx-markdown": "^21.2.0", "playwright": "^1.59.1", "prettier": "^3.8.3", "pretty-quick": "^4.2.2", "query-string": "^7.1.3", "rxjs": "^7.8.2", "shepherd.js": "^11.2.0", "spark-md5": "^3.0.2", "stacktrace-js": "^2.0.2", "start-server-and-test": "^2.1.3", "stylelint": "^17.9.1", "stylelint-config-recommended-scss": "^17.0.1", "ts-node": "~10.9.2", "ts-patch": "^3.3.0", "tslib": "^2.8.1", "typescript": "~5.9.3", "typescript-eslint": "^8.59.1", "typia": "^12.0.2" }, "overrides": { "app-builder-lib": { "minimatch": "10.1.1" } }, "optionalDependencies": { "@lmdb/lmdb-darwin-x64": "^3.5.4", "@lmdb/lmdb-linux-x64": "^3.5.4", "@lmdb/lmdb-win32-x64": "^3.5.4", "@rollup/rollup-darwin-x64": "4.60.2", "@rollup/rollup-linux-x64-gnu": "4.60.2", "@rollup/rollup-win32-x64-msvc": "4.60.2" }, "workspaces": [ "packages/*" ], "publish": [ { "provider": "github", "repo": "super-productivity", "owner": "johannesjo" } ], "volta": { "node": "22.18.0" } }