Bluesky app fork with some witchin' additions 馃挮
1{
2 "name": "witchsky-app",
3 "version": "1.122.0",
4 "private": true,
5 "engines": {
6 "node": ">=18"
7 },
8 "packageManager": "pnpm@10.33.0+sha512.10568bb4a6afb58c9eb3630da90cc9516417abebd3fabbe6739f0ae795728da1491e9db5a544c76ad8eb7570f5c4bb3d6c637b2cb41bfdcdb47fa823c8649319",
9 "expo": {
10 "autolinking": {
11 "android": {
12 "buildFromSource": [
13 "expo-notifications",
14 "expo-haptics",
15 "expo-media-library",
16 "expo-image-picker"
17 ]
18 },
19 "ios": {
20 "exclude": [
21 "@assembless/react-native-material-you"
22 ]
23 }
24 },
25 "install": {
26 "exclude": [
27 "react-native-reanimated",
28 "@sentry/react-native",
29 "react-native-pager-view"
30 ]
31 }
32 },
33 "scripts": {
34 "prepare": "is-ci || husky install",
35 "postinstall": "pnpm intl:compile-if-needed",
36 "prebuild": "EXPO_NO_GIT_STATUS=1 expo prebuild --clean",
37 "windows-prebuild": "set EXPO_NO_GIT_STATUS=1&& expo prebuild --clean",
38 "android": "expo run:android",
39 "android:prod": "expo run:android --variant release",
40 "android:profile": "BSKY_PROFILE=1 expo run:android --variant release",
41 "ios": "expo run:ios",
42 "web": "rspack serve",
43 "use-build-number": "./scripts/useBuildNumberEnv.sh",
44 "use-build-number-with-bump": "./scripts/useBuildNumberEnvWithBump.sh",
45 "build-web": "NODE_ENV=production rspack build && node ./scripts/post-web-build.js",
46 "build-all": "pnpm intl:build && pnpm use-build-number-with-bump eas build --platform all",
47 "build-ios": "pnpm use-build-number-with-bump eas build -p ios",
48 "build-android": "pnpm use-build-number-with-bump eas build -p android",
49 "build": "pnpm use-build-number-with-bump eas build",
50 "build-embed": "cd bskyembed && pnpm build && pnpm build-snippet && cd .. && node ./scripts/post-embed-build.js",
51 "start": "expo start --dev-client",
52 "start:prod": "expo start --dev-client --no-dev --minify",
53 "test": "NODE_ENV=test jest --forceExit --testTimeout=20000 --bail",
54 "test-watch": "NODE_ENV=test jest --watchAll",
55 "test-ci": "NODE_ENV=test jest --ci --forceExit --reporters=default --reporters=jest-junit",
56 "test-coverage": "NODE_ENV=test jest --coverage",
57 "lint": "eslint --cache --quiet src",
58 "lint-native": "swiftlint ./modules && ktlint ./modules",
59 "lint-native:fix": "swiftlint --fix ./modules && ktlint --format ./modules",
60 "typecheck": "tsc --project ./tsconfig.check.json",
61 "e2e:mock-server": "cd dev-env && pnpm start",
62 "e2e:build": "EXPO_PUBLIC_ENV=e2e NODE_ENV=test RN_SRC_EXT=e2e.ts,e2e.tsx expo run:ios",
63 "e2e:build-android": "EXPO_PUBLIC_ENV=e2e NODE_ENV=test RN_SRC_EXT=e2e.ts,e2e.tsx expo run:android",
64 "e2e:start": "EXPO_PUBLIC_ENV=e2e NODE_ENV=test RN_SRC_EXT=e2e.ts,e2e.tsx expo start -c",
65 "e2e:run": "maestro test",
66 "perf:test": "NODE_ENV=test maestro test",
67 "perf:test:run": "NODE_ENV=test maestro test __e2e__/perf-test.yml",
68 "perf:test:measure": "NODE_ENV=test flashlight test --bundleId app.witchsky --testCommand \"pnpm perf:test\" --duration 150000 --resultsFilePath .perf/results.json",
69 "perf:test:results": "NODE_ENV=test flashlight report .perf/results.json",
70 "perf:measure": "NODE_ENV=test flashlight measure",
71 "intl:build": "pnpm intl:extract:all && pnpm intl:compile",
72 "intl:extract": "lingui extract --clean --locale en",
73 "intl:extract:all": "lingui extract --clean",
74 "intl:compile": "lingui compile",
75 "intl:compile-if-needed": "is-ci || [ -f src/locale/locales/en/messages.ts ] || pnpm intl:compile",
76 "intl:pull": "crowdin download translations --verbose -b main",
77 "intl:push": "crowdin push translations --verbose -b main",
78 "intl:push-sources": "crowdin push sources --verbose -b main",
79 "intl:release": "pnpm intl:pull && pnpm intl:extract:all",
80 "nuke": "rm -rf ./node_modules && rm -rf ./ios && rm -rf ./android",
81 "update-extensions": "bash scripts/updateExtensions.sh",
82 "export": "npx expo export --dump-sourcemap && pnpm upload-native-sourcemaps",
83 "upload-native-sourcemaps": "npx sentry-expo-upload-sourcemaps dist",
84 "make-deploy-bundle": "bash scripts/bundleUpdate.sh",
85 "generate-stats-file": "GENERATE_STATS=1 pnpm build-web",
86 "icons:optimize": "svgo -f ./assets/icons",
87 "convert-patches-to-pnpm": "node ./scripts/patch-package-to-pnpm.mjs"
88 },
89 "dependencies": {
90 "@assembless/react-native-material-you": "1.0.0-beta.4",
91 "@atproto/api": "^0.19.11",
92 "@atproto/oauth-client-browser": "^0.3.41",
93 "@atproto/oauth-client-expo": "^0.0.10",
94 "@atproto/syntax": "0.5.2",
95 "@bitdrift/react-native": "^0.6.14",
96 "@braintree/sanitize-url": "^6.0.4",
97 "@bsky.app/alf": "^0.1.8",
98 "@bsky.app/expo-guess-language": "^0.2.8",
99 "@bsky.app/expo-image-crop-tool": "^0.5.0",
100 "@bsky.app/expo-scroll-edge-effect": "^0.1.4",
101 "@bsky.app/expo-translate-text": "^0.2.9",
102 "@bsky.app/sift": "^0.3.3",
103 "@bsky.app/tapper": "^0.5.1",
104 "@bsky.app/video": "0.3.4",
105 "@discord/bottom-sheet": "github:bluesky-social/react-native-bottom-sheet",
106 "@easrng/tr58": "0.0.5",
107 "@emoji-mart/data": "^1.2.1",
108 "@emoji-mart/react": "^1.1.1",
109 "@expo/html-elements": "^0.12.5",
110 "@expo/webpack-config": "^19.0.1",
111 "@floating-ui/dom": "^1.7.6",
112 "@floating-ui/react-dom": "^2.1.8",
113 "@formatjs/intl-displaynames": "^6.8.13",
114 "@formatjs/intl-locale": "^4.2.13",
115 "@formatjs/intl-numberformat": "^8.15.6",
116 "@formatjs/intl-pluralrules": "^5.4.6",
117 "@fortawesome/fontawesome-svg-core": "^6.7.2",
118 "@fortawesome/free-regular-svg-icons": "^6.7.2",
119 "@fortawesome/free-solid-svg-icons": "^6.7.2",
120 "@fortawesome/react-native-fontawesome": "^0.3.2",
121 "@growthbook/growthbook": "^1.6.5",
122 "@growthbook/growthbook-react": "^1.6.5",
123 "@ipld/dag-cbor": "^9.2.6",
124 "@lingui/core": "^5.9.5",
125 "@lingui/react": "^5.9.5",
126 "@miblanchard/react-native-slider": "^2.6.0",
127 "@mozzius/expo-dynamic-app-icon": "^1.8.1",
128 "@react-native-async-storage/async-storage": "2.2.0",
129 "@react-navigation/bottom-tabs": "^7.15.9",
130 "@react-navigation/native": "^7.2.2",
131 "@react-navigation/native-stack": "^7.14.11",
132 "@sentry/react-native": "~6.20.0",
133 "@tanstack/query-async-storage-persister": "^5.100.1",
134 "@tanstack/react-query": "^5.100.1",
135 "@tanstack/react-query-persist-client": "^5.100.1",
136 "@tiptap/core": "^2.27.2",
137 "@tiptap/extension-document": "^2.27.2",
138 "@tiptap/extension-hard-break": "^2.27.2",
139 "@tiptap/extension-history": "^2.27.2",
140 "@tiptap/extension-mention": "^2.27.2",
141 "@tiptap/extension-paragraph": "^2.27.2",
142 "@tiptap/extension-placeholder": "^2.27.2",
143 "@tiptap/extension-text": "^2.27.2",
144 "@tiptap/html": "^2.27.2",
145 "@tiptap/pm": "^2.27.2",
146 "@tiptap/react": "^2.27.2",
147 "@tiptap/suggestion": "^2.27.2",
148 "@types/invariant": "^2.2.37",
149 "@types/lodash.throttle": "^4.1.9",
150 "@types/node": "^20.19.39",
151 "@uwx/exif-be-gone-web": "1.6.7",
152 "array.prototype.findlast": "^1.2.5",
153 "babel-plugin-transform-remove-console": "^6.9.4",
154 "base64-js": "^1.5.1",
155 "bcp-47": "^2.1.0",
156 "bcp-47-match": "^2.0.3",
157 "chroma-js": "^3.2.0",
158 "date-fns": "^2.30.0",
159 "dotenv": "^17.4.2",
160 "email-validator": "^2.0.4",
161 "emoji-mart": "^5.6.0",
162 "emoji-regex": "^10.6.0",
163 "eventemitter3": "^5.0.4",
164 "expo": "^54.0.33",
165 "expo-application": "~7.0.8",
166 "expo-blur": "~15.0.8",
167 "expo-build-properties": "~1.0.10",
168 "expo-camera": "~17.0.10",
169 "expo-clipboard": "~8.0.8",
170 "expo-contacts": "^15.0.11",
171 "expo-dev-client": "~6.0.20",
172 "expo-device": "~8.0.10",
173 "expo-file-system": "~19.0.21",
174 "expo-font": "~14.0.11",
175 "expo-glass-effect": "55.0.8",
176 "expo-haptics": "~15.0.8",
177 "expo-image": "~3.0.11",
178 "expo-image-manipulator": "~14.0.8",
179 "expo-image-picker": "~17.0.10",
180 "expo-intent-launcher": "~13.0.8",
181 "expo-keep-awake": "~15.0.8",
182 "expo-linear-gradient": "~15.0.8",
183 "expo-linking": "~8.0.11",
184 "expo-localization": "~17.0.8",
185 "expo-location": "~19.0.8",
186 "expo-media-library": "~18.2.1",
187 "expo-notifications": "~0.32.16",
188 "expo-paste-input": "^0.1.15",
189 "expo-privacy-sensitive": "^0.1.0",
190 "expo-screen-orientation": "~9.0.8",
191 "expo-sharing": "~14.0.8",
192 "expo-sms": "^14.0.8",
193 "expo-splash-screen": "~31.0.13",
194 "expo-system-ui": "~6.0.9",
195 "expo-updates": "~29.0.16",
196 "expo-video": "~3.0.16",
197 "expo-video-thumbnails": "^10.0.8",
198 "expo-web-browser": "~15.0.10",
199 "fast-deep-equal": "^3.1.3",
200 "fast-text-encoding": "^1.0.6",
201 "fuse.js": "^7.3.0",
202 "hls.js": "^1.6.16",
203 "idb-keyval": "^6.2.2",
204 "js-sha256": "^0.9.0",
205 "jwt-decode": "^4.0.0",
206 "lande": "^1.0.10",
207 "libphonenumber-js": "^1.12.42",
208 "lodash.chunk": "^4.2.0",
209 "lodash.debounce": "^4.0.8",
210 "lodash.shuffle": "^4.2.0",
211 "lodash.throttle": "^4.1.1",
212 "multiformats": "9.9.0",
213 "nanoid": "^5.1.9",
214 "normalize-url": "^8.1.1",
215 "pako": "^2.1.0",
216 "patch-package": "^8.0.1",
217 "postinstall-postinstall": "^2.1.0",
218 "psl": "^1.15.0",
219 "radix-ui": "^1.4.3",
220 "react": "19.1.0",
221 "react-compiler-runtime": "19.1.0-rc.3",
222 "react-dom": "19.1.0",
223 "react-hotkeys-hook": "5.2.4",
224 "react-image-crop": "^11.0.10",
225 "react-is": "^19.2.5",
226 "react-keyed-flatten-children": "^5.1.2",
227 "react-native": "0.81.5",
228 "react-native-compressor": "1.13.0",
229 "react-native-date-picker": "^5.0.13",
230 "react-native-device-attest": "^0.1.6",
231 "react-native-drawer-layout": "^4.2.2",
232 "react-native-edge-to-edge": "^1.8.1",
233 "react-native-gesture-handler": "~2.28.0",
234 "react-native-keyboard-controller": "^1.21.6",
235 "react-native-mmkv": "npm:@bsky.app/react-native-mmkv@2.12.5",
236 "react-native-pager-view": "6.8.0",
237 "react-native-progress": "github:bluesky-social/react-native-progress",
238 "react-native-qrcode-styled": "^0.3.3",
239 "react-native-reanimated": "^3.19.5",
240 "react-native-safe-area-context": "~5.6.2",
241 "react-native-screens": "^4.24.0",
242 "react-native-svg": "15.12.1",
243 "react-native-uitextview": "^1.4.0",
244 "react-native-uuid": "^2.0.4",
245 "react-native-view-shot": "^4.0.3",
246 "react-native-web": "^0.21.2",
247 "react-native-web-webview": "^1.0.2",
248 "react-native-webview": "^13.16.1",
249 "react-remove-scroll-bar": "^2.3.8",
250 "react-responsive": "^10.0.1",
251 "react-textarea-autosize": "^8.5.9",
252 "setimmediate": "^1.0.5",
253 "sonner": "^2.0.7",
254 "sonner-native": "0.21.0",
255 "tippy.js": "^6.3.7",
256 "tlds": "^1.261.0",
257 "tldts": "^6.1.86",
258 "unicode-segmenter": "0.14.5",
259 "uri-js": "^4.4.1",
260 "zod": "^3.25.76"
261 },
262 "devDependencies": {
263 "@babel/core": "7.25.2",
264 "@babel/plugin-transform-flow-strip-types": "^7.27.1",
265 "@babel/preset-env": "^7.29.2",
266 "@babel/runtime": "7.25.9",
267 "@babel/traverse": "7.25.2",
268 "@crowdin/cli": "^4.14.2",
269 "@eslint/js": "^9.39.4",
270 "@lingui/babel-plugin-lingui-macro": "^5.9.5",
271 "@lingui/cli": "^5.9.5",
272 "@lingui/vite-plugin": "^5.9.5",
273 "@pmmmwh/react-refresh-webpack-plugin": "^0.5.17",
274 "@react-native/babel-preset": "0.81.5",
275 "@react-native/typescript-config": "^0.81.6",
276 "@rspack/cli": "^2.0.0",
277 "@rspack/core": "^2.0.0",
278 "@rspack/dev-server": "^2.0.0",
279 "@sentry/vite-plugin": "^5.2.0",
280 "@sentry/webpack-plugin": "^3.6.1",
281 "@swc/core": "^1.15.30",
282 "@testing-library/react-native": "^13.3.3",
283 "@types/chroma-js": "^3.1.2",
284 "@types/culori": "^4.0.1",
285 "@types/jest": "29.5.14",
286 "@types/lodash.chunk": "^4.2.9",
287 "@types/lodash.debounce": "^4.0.9",
288 "@types/lodash.shuffle": "^4.2.9",
289 "@types/pako": "^2.0.4",
290 "@types/psl": "^1.11.0",
291 "@types/react": "^19.2.14",
292 "@types/react-dom": "^19.2.3",
293 "@vitejs/plugin-react": "^6.0.1",
294 "babel-jest": "^29.7.0",
295 "babel-loader": "^10.1.1",
296 "babel-plugin-module-resolver": "^5.0.3",
297 "babel-plugin-react-compiler": "19.1.0-rc.3",
298 "babel-plugin-syntax-hermes-parser": "^0.35.0",
299 "babel-preset-expo": "~54.0.10",
300 "eslint": "^9.39.4",
301 "eslint-import-resolver-typescript": "^4.4.4",
302 "eslint-plugin-bsky-internal": "link:eslint",
303 "eslint-plugin-import-x": "^4.16.2",
304 "eslint-plugin-lingui": "^0.12.0",
305 "eslint-plugin-react": "^7.37.5",
306 "eslint-plugin-react-compiler": "19.1.0-rc.2",
307 "eslint-plugin-react-hooks": "^7.1.1",
308 "eslint-plugin-react-native": "^5.0.0",
309 "eslint-plugin-react-native-a11y": "^3.5.1",
310 "eslint-plugin-simple-import-sort": "^13.0.0",
311 "file-loader": "6.2.0",
312 "globals": "^17.5.0",
313 "husky": "^8.0.3",
314 "is-ci": "^3.0.1",
315 "jest": "^29.7.0",
316 "jest-expo": "~54.0.17",
317 "jest-junit": "^16.0.0",
318 "lint-staged": "^13.3.0",
319 "lockfile-lint": "^4.14.1",
320 "prettier": "^3.8.3",
321 "react-native-dotenv": "^3.4.11",
322 "react-refresh": "^0.14.2",
323 "rspack-manifest-plugin": "^5.2.1",
324 "svgo": "^3.3.3",
325 "swc-loader": "^0.2.7",
326 "ts-plugin-sort-import-suggestions": "^1.0.4",
327 "typescript": "^6.0.3",
328 "typescript-eslint": "8.59.1-alpha.4",
329 "vite": "^8.0.10",
330 "vite-plugin-commonjs": "^0.10.4",
331 "webpack-bundle-analyzer": "^4.10.2"
332 },
333 "jest": {
334 "preset": "jest-expo/ios",
335 "setupFilesAfterEnv": [
336 "./jest/jestSetup.js"
337 ],
338 "moduleFileExtensions": [
339 "ts",
340 "tsx",
341 "js",
342 "jsx",
343 "json",
344 "node"
345 ],
346 "transform": {
347 "\\.[jt]sx?$": "babel-jest"
348 },
349 "transformIgnorePatterns": [
350 "node_modules/(?!((jest-)?react-native|@react-native(-community)?)|@discord|expo(nent)?|@expo(nent)?/.*|@expo-google-fonts/.*|react-navigation|nanoid|@react-navigation/.*|@unimodules/.*|unimodules|sentry-expo|native-base|normalize-url|react-native-svg|@sentry/.*|sentry-expo|bcp-47-match)"
351 ],
352 "modulePathIgnorePatterns": [
353 "__tests__/.*/__mocks__",
354 "__e2e__/.*",
355 "bskylink/.*"
356 ],
357 "coveragePathIgnorePatterns": [
358 "<rootDir>/node_modules/",
359 "<rootDir>/src/platform",
360 "<rootDir>/src/third-party",
361 "<rootDir>/src/view/com/util",
362 "<rootDir>/src/state/lib",
363 "<rootDir>/__tests__/test-utils.js"
364 ],
365 "reporters": [
366 "default",
367 "jest-junit"
368 ]
369 },
370 "browserslist": {
371 "production": [
372 ">0.2%",
373 "not dead",
374 "not op_mini all"
375 ],
376 "development": [
377 "last 1 chrome version",
378 "last 1 firefox version",
379 "last 1 safari version"
380 ]
381 },
382 "lint-staged": {
383 "*{.js,.jsx,.ts,.tsx}": [
384 "eslint --cache --fix"
385 ],
386 "*{.js,.jsx,.ts,.tsx,.css}": [
387 "prettier --cache --write --ignore-unknown"
388 ],
389 "assets/icons/*.svg": [
390 "svgo"
391 ]
392 },
393 "lockfile-lint": {
394 "path": "pnpm-lock.yaml",
395 "allowedHosts": [
396 "npm",
397 "yarn"
398 ],
399 "allowedSchemes": [
400 "https:"
401 ],
402 "allowedPackageNameAliases": [
403 "@babel/traverse--for-generate-function-map:@babel/traverse",
404 "string-width-cjs:string-width",
405 "strip-ansi-cjs:strip-ansi",
406 "wrap-ansi-cjs:wrap-ansi"
407 ],
408 "allowedUrls": [
409 "https://codeload.github.com/bluesky-social/react-native-bottom-sheet/tar.gz/28a87d1bb55e10fc355fa1455545a30734995908",
410 "https://codeload.github.com/bluesky-social/react-native-progress/tar.gz/5a372f4f2ce5feb26f4f47b6a4d187ab9b923ab4",
411 "https://codeload.github.com/mattermost/react-native-paste-input/tar.gz/f260447edc645a817ab1ba7b46d8341d84dba8e9"
412 ],
413 "emptyHostname": false,
414 "validatePackageNames": true,
415 "validateIntegrity": true
416 },
417 "pnpm": {
418 "patchedDependencies": {
419 "@assembless/react-native-material-you": "patches/@assembless__react-native-material-you.patch",
420 "@atproto/api@0.19.11": "patches/@atproto__api.patch",
421 "@atproto/oauth-client": "patches/@atproto__oauth-client.patch",
422 "@atproto/oauth-client-browser": "patches/@atproto__oauth-client-browser.patch",
423 "@atproto/oauth-client-expo": "patches/@atproto__oauth-client-expo.patch",
424 "@discord/bottom-sheet": "patches/@discord__bottom-sheet.patch",
425 "@sentry/react-native": "patches/@sentry__react-native.patch",
426 "expo-font": "patches/expo-font.patch",
427 "expo-glass-effect": "patches/expo-glass-effect.patch",
428 "expo-haptics": "patches/expo-haptics.patch",
429 "expo-image": "patches/expo-image.patch",
430 "expo-media-library": "patches/expo-media-library.patch",
431 "expo-modules-core": "patches/expo-modules-core.patch",
432 "expo-notifications": "patches/expo-notifications.patch",
433 "expo-paste-input": "patches/expo-paste-input.patch",
434 "expo-updates": "patches/expo-updates.patch",
435 "react-native": "patches/react-native.patch",
436 "react-native-compressor": "patches/react-native-compressor.patch",
437 "react-native-date-picker": "patches/react-native-date-picker.patch",
438 "react-native-drawer-layout": "patches/react-native-drawer-layout.patch",
439 "react-native-keyboard-controller": "patches/react-native-keyboard-controller.patch",
440 "react-native-pager-view": "patches/react-native-pager-view.patch",
441 "react-native-reanimated": "patches/react-native-reanimated.patch",
442 "react-native-svg": "patches/react-native-svg.patch",
443 "react-native-uitextview": "patches/react-native-uitextview.patch",
444 "react-native-view-shot": "patches/react-native-view-shot.patch",
445 "sonner-native": "patches/sonner-native.patch"
446 }
447 }
448}