create-disposabl-app 0.1.0 → 0.1.1
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/dist/index.js +21 -22
- package/dist/templates/default/apps/desktop/.oxfmtrc.json +5 -0
- package/dist/templates/default/apps/desktop/.oxlintrc.json +6 -0
- package/dist/templates/default/apps/desktop/README.md +58 -0
- package/dist/templates/default/apps/desktop/forge.config.mts +90 -0
- package/dist/templates/default/apps/desktop/index.html +12 -0
- package/dist/templates/default/apps/desktop/package.json +55 -1
- package/dist/templates/default/apps/desktop/src/declarations.d.ts +2 -0
- package/dist/templates/default/apps/desktop/src/index.css +8 -0
- package/dist/templates/default/apps/desktop/src/main.ts +58 -0
- package/dist/templates/default/apps/desktop/src/preload.ts +3 -0
- package/dist/templates/default/apps/desktop/src/renderer.ts +19 -0
- package/dist/templates/default/apps/desktop/tsconfig.json +14 -0
- package/dist/templates/default/apps/desktop/vite.main.config.mts +4 -0
- package/dist/templates/default/apps/desktop/vite.preload.config.mts +4 -0
- package/dist/templates/default/apps/desktop/vite.renderer.config.mts +4 -0
- package/dist/templates/default/apps/mobile/.agents/skills/agent-device/SKILL.md +22 -0
- package/dist/templates/default/apps/mobile/.agents/skills/android-emulator/SKILL.md +32 -0
- package/dist/templates/default/apps/mobile/.agents/skills/dogfood/SKILL.md +27 -0
- package/dist/templates/default/apps/mobile/.agents/skills/eas-app-stores/SKILL.md +176 -0
- package/dist/templates/default/apps/mobile/.agents/skills/eas-app-stores/agents/openai.yaml +4 -0
- package/dist/templates/default/apps/mobile/.agents/skills/eas-app-stores/references/app-store-metadata.md +497 -0
- package/dist/templates/default/apps/mobile/.agents/skills/eas-app-stores/references/ios-app-store.md +376 -0
- package/dist/templates/default/apps/mobile/.agents/skills/eas-app-stores/references/native-ios.md +167 -0
- package/dist/templates/default/apps/mobile/.agents/skills/eas-app-stores/references/play-store.md +244 -0
- package/dist/templates/default/apps/mobile/.agents/skills/eas-app-stores/references/testflight.md +62 -0
- package/dist/templates/default/apps/mobile/.agents/skills/eas-app-stores/references/workflows.md +120 -0
- package/dist/templates/default/apps/mobile/.agents/skills/eas-hosting/SKILL.md +431 -0
- package/dist/templates/default/apps/mobile/.agents/skills/eas-hosting/agents/openai.yaml +4 -0
- package/dist/templates/default/apps/mobile/.agents/skills/eas-observe/SKILL.md +46 -0
- package/dist/templates/default/apps/mobile/.agents/skills/eas-observe/agents/openai.yaml +4 -0
- package/dist/templates/default/apps/mobile/.agents/skills/eas-observe/references/metrics.md +98 -0
- package/dist/templates/default/apps/mobile/.agents/skills/eas-observe/references/queries.md +444 -0
- package/dist/templates/default/apps/mobile/.agents/skills/eas-observe/references/setup.md +529 -0
- package/dist/templates/default/apps/mobile/.agents/skills/eas-observe/references/third-party.md +136 -0
- package/dist/templates/default/apps/mobile/.agents/skills/eas-simulator/SKILL.md +237 -0
- package/dist/templates/default/apps/mobile/.agents/skills/eas-simulator/agents/openai.yaml +4 -0
- package/dist/templates/default/apps/mobile/.agents/skills/eas-simulator/references/controllers.md +139 -0
- package/dist/templates/default/apps/mobile/.agents/skills/eas-simulator/references/logs-and-crashes.md +101 -0
- package/dist/templates/default/apps/mobile/.agents/skills/eas-simulator/references/run-your-app.md +256 -0
- package/dist/templates/default/apps/mobile/.agents/skills/eas-simulator/references/troubleshooting.md +56 -0
- package/dist/templates/default/apps/mobile/.agents/skills/eas-update/SKILL.md +146 -0
- package/dist/templates/default/apps/mobile/.agents/skills/eas-update/agents/openai.yaml +4 -0
- package/dist/templates/default/apps/mobile/.agents/skills/eas-update-insights/SKILL.md +238 -0
- package/dist/templates/default/apps/mobile/.agents/skills/eas-update-insights/agents/openai.yaml +4 -0
- package/dist/templates/default/apps/mobile/.agents/skills/eas-update-insights/references/channel-insights-schema.md +47 -0
- package/dist/templates/default/apps/mobile/.agents/skills/eas-update-insights/references/update-insights-schema.md +69 -0
- package/dist/templates/default/apps/mobile/.agents/skills/eas-workflows/SKILL.md +99 -0
- package/dist/templates/default/apps/mobile/.agents/skills/eas-workflows/agents/openai.yaml +4 -0
- package/dist/templates/default/apps/mobile/.agents/skills/eas-workflows/scripts/fetch.js +109 -0
- package/dist/templates/default/apps/mobile/.agents/skills/eas-workflows/scripts/package.json +6 -0
- package/dist/templates/default/apps/mobile/.agents/skills/expo-animation/LICENSE +21 -0
- package/dist/templates/default/apps/mobile/.agents/skills/expo-animation/RECIPES.md +385 -0
- package/dist/templates/default/apps/mobile/.agents/skills/expo-animation/SKILL.md +274 -0
- package/dist/templates/default/apps/mobile/.agents/skills/expo-animation/agents/openai.yaml +4 -0
- package/dist/templates/default/apps/mobile/.agents/skills/expo-app-clip/SKILL.md +290 -0
- package/dist/templates/default/apps/mobile/.agents/skills/expo-app-clip/agents/openai.yaml +4 -0
- package/dist/templates/default/apps/mobile/.agents/skills/expo-app-clip/references/native-module.md +96 -0
- package/dist/templates/default/apps/mobile/.agents/skills/expo-brownfield/SKILL.md +69 -0
- package/dist/templates/default/apps/mobile/.agents/skills/expo-brownfield/agents/openai.yaml +4 -0
- package/dist/templates/default/apps/mobile/.agents/skills/expo-brownfield/references/brownfield-integrated.md +551 -0
- package/dist/templates/default/apps/mobile/.agents/skills/expo-brownfield/references/brownfield-isolated.md +449 -0
- package/dist/templates/default/apps/mobile/.agents/skills/expo-brownfield/references/comparison.md +63 -0
- package/dist/templates/default/apps/mobile/.agents/skills/expo-brownfield/references/feature-integration.md +163 -0
- package/dist/templates/default/apps/mobile/.agents/skills/expo-brownfield/references/troubleshooting.md +88 -0
- package/dist/templates/default/apps/mobile/.agents/skills/expo-brownfield/references/version-compatibility.md +40 -0
- package/dist/templates/default/apps/mobile/.agents/skills/expo-data-fetching/SKILL.md +478 -0
- package/dist/templates/default/apps/mobile/.agents/skills/expo-data-fetching/agents/openai.yaml +4 -0
- package/dist/templates/default/apps/mobile/.agents/skills/expo-data-fetching/references/expo-router-loaders.md +341 -0
- package/dist/templates/default/apps/mobile/.agents/skills/expo-data-fetching/references/offline-and-cancellation.md +68 -0
- package/dist/templates/default/apps/mobile/.agents/skills/expo-design-system/SKILL.md +376 -0
- package/dist/templates/default/apps/mobile/.agents/skills/expo-design-system/agents/openai.yaml +4 -0
- package/dist/templates/default/apps/mobile/.agents/skills/expo-design-system/references/audit.md +190 -0
- package/dist/templates/default/apps/mobile/.agents/skills/expo-design-system/references/native-slop.md +74 -0
- package/dist/templates/default/apps/mobile/.agents/skills/expo-dev-client/SKILL.md +184 -0
- package/dist/templates/default/apps/mobile/.agents/skills/expo-dev-client/agents/openai.yaml +4 -0
- package/dist/templates/default/apps/mobile/.agents/skills/expo-dom/SKILL.md +425 -0
- package/dist/templates/default/apps/mobile/.agents/skills/expo-dom/agents/openai.yaml +4 -0
- package/dist/templates/default/apps/mobile/.agents/skills/expo-examples/SKILL.md +106 -0
- package/dist/templates/default/apps/mobile/.agents/skills/expo-examples/agents/openai.yaml +4 -0
- package/dist/templates/default/apps/mobile/.agents/skills/expo-examples/references/catalog.md +105 -0
- package/dist/templates/default/apps/mobile/.agents/skills/expo-migrate-module/SKILL.md +124 -0
- package/dist/templates/default/apps/mobile/.agents/skills/expo-migrate-module/agents/openai.yaml +4 -0
- package/dist/templates/default/apps/mobile/.agents/skills/expo-migrate-module/references/compatibility.md +130 -0
- package/dist/templates/default/apps/mobile/.agents/skills/expo-migrate-module/references/example.md +212 -0
- package/dist/templates/default/apps/mobile/.agents/skills/expo-migrate-module/references/migration-map.md +457 -0
- package/dist/templates/default/apps/mobile/.agents/skills/expo-module/SKILL.md +151 -0
- package/dist/templates/default/apps/mobile/.agents/skills/expo-module/agents/openai.yaml +4 -0
- package/dist/templates/default/apps/mobile/.agents/skills/expo-module/references/config-plugin.md +90 -0
- package/dist/templates/default/apps/mobile/.agents/skills/expo-module/references/create-expo-module.md +206 -0
- package/dist/templates/default/apps/mobile/.agents/skills/expo-module/references/lifecycle.md +127 -0
- package/dist/templates/default/apps/mobile/.agents/skills/expo-module/references/module-config.md +48 -0
- package/dist/templates/default/apps/mobile/.agents/skills/expo-module/references/native-module.md +286 -0
- package/dist/templates/default/apps/mobile/.agents/skills/expo-module/references/native-view.md +171 -0
- package/dist/templates/default/apps/mobile/.agents/skills/expo-native-ui/SKILL.md +201 -0
- package/dist/templates/default/apps/mobile/.agents/skills/expo-native-ui/agents/openai.yaml +4 -0
- package/dist/templates/default/apps/mobile/.agents/skills/expo-native-ui/references/controls.md +231 -0
- package/dist/templates/default/apps/mobile/.agents/skills/expo-native-ui/references/gradients.md +106 -0
- package/dist/templates/default/apps/mobile/.agents/skills/expo-native-ui/references/icons.md +232 -0
- package/dist/templates/default/apps/mobile/.agents/skills/expo-native-ui/references/media.md +193 -0
- package/dist/templates/default/apps/mobile/.agents/skills/expo-native-ui/references/storage.md +121 -0
- package/dist/templates/default/apps/mobile/.agents/skills/expo-native-ui/references/visual-effects.md +198 -0
- package/dist/templates/default/apps/mobile/.agents/skills/expo-native-ui/references/webgpu-three.md +605 -0
- package/dist/templates/default/apps/mobile/.agents/skills/expo-overview/SKILL.md +120 -0
- package/dist/templates/default/apps/mobile/.agents/skills/expo-overview/agents/openai.yaml +4 -0
- package/dist/templates/default/apps/mobile/.agents/skills/expo-overview/references/launch-without-dev-menu.md +24 -0
- package/dist/templates/default/apps/mobile/.agents/skills/expo-project-structure/SKILL.md +114 -0
- package/dist/templates/default/apps/mobile/.agents/skills/expo-project-structure/agents/openai.yaml +4 -0
- package/dist/templates/default/apps/mobile/.agents/skills/expo-router/SKILL.md +240 -0
- package/dist/templates/default/apps/mobile/.agents/skills/expo-router/agents/openai.yaml +4 -0
- package/dist/templates/default/apps/mobile/.agents/skills/expo-router/references/form-sheet.md +253 -0
- package/dist/templates/default/apps/mobile/.agents/skills/expo-router/references/route-structure.md +229 -0
- package/dist/templates/default/apps/mobile/.agents/skills/expo-router/references/search.md +248 -0
- package/dist/templates/default/apps/mobile/.agents/skills/expo-router/references/tabs.md +433 -0
- package/dist/templates/default/apps/mobile/.agents/skills/expo-router/references/toolbar-and-headers.md +284 -0
- package/dist/templates/default/apps/mobile/.agents/skills/expo-router/references/zoom-transitions.md +158 -0
- package/dist/templates/default/apps/mobile/.agents/skills/expo-skill-eval/SKILL.md +314 -0
- package/dist/templates/default/apps/mobile/.agents/skills/expo-skill-eval/agents/visual-grader.md +52 -0
- package/dist/templates/default/apps/mobile/.agents/skills/expo-skill-eval/references/design-rubric.md +45 -0
- package/dist/templates/default/apps/mobile/.agents/skills/expo-skill-eval/references/runtime-matrix.md +34 -0
- package/dist/templates/default/apps/mobile/.agents/skills/expo-skill-eval/scripts/check-static.sh +64 -0
- package/dist/templates/default/apps/mobile/.agents/skills/expo-skill-eval/scripts/clean-fixture.sh +56 -0
- package/dist/templates/default/apps/mobile/.agents/skills/expo-skill-eval/scripts/generate_viewer.py +450 -0
- package/dist/templates/default/apps/mobile/.agents/skills/expo-skill-eval/scripts/latest-sdk.sh +46 -0
- package/dist/templates/default/apps/mobile/.agents/skills/expo-skill-eval/scripts/make-fixture.sh +95 -0
- package/dist/templates/default/apps/mobile/.agents/skills/expo-skill-eval/scripts/make-workspace.sh +31 -0
- package/dist/templates/default/apps/mobile/.agents/skills/expo-skill-eval/scripts/snapshot-android.sh +284 -0
- package/dist/templates/default/apps/mobile/.agents/skills/expo-skill-eval/scripts/snapshot-ios.sh +132 -0
- package/dist/templates/default/apps/mobile/.agents/skills/expo-skill-eval/scripts/snapshot-web.sh +61 -0
- package/dist/templates/default/apps/mobile/.agents/skills/expo-ui/SKILL.md +101 -0
- package/dist/templates/default/apps/mobile/.agents/skills/expo-ui/agents/openai.yaml +4 -0
- package/dist/templates/default/apps/mobile/.agents/skills/expo-ui/references/drop-in-replacements.md +27 -0
- package/dist/templates/default/apps/mobile/.agents/skills/expo-ui/references/jetpack-compose.md +73 -0
- package/dist/templates/default/apps/mobile/.agents/skills/expo-ui/references/swift-ui.md +73 -0
- package/dist/templates/default/apps/mobile/.agents/skills/expo-ui/references/universal.md +104 -0
- package/dist/templates/default/apps/mobile/.agents/skills/expo-ui/scripts/list-components.js +193 -0
- package/dist/templates/default/apps/mobile/.agents/skills/expo-upgrade/SKILL.md +150 -0
- package/dist/templates/default/apps/mobile/.agents/skills/expo-upgrade/agents/openai.yaml +4 -0
- package/dist/templates/default/apps/mobile/.agents/skills/expo-upgrade/references/expo-av-to-audio.md +132 -0
- package/dist/templates/default/apps/mobile/.agents/skills/expo-upgrade/references/expo-av-to-video.md +160 -0
- package/dist/templates/default/apps/mobile/.agents/skills/expo-upgrade/references/native-tabs.md +124 -0
- package/dist/templates/default/apps/mobile/.agents/skills/expo-upgrade/references/new-architecture.md +79 -0
- package/dist/templates/default/apps/mobile/.agents/skills/expo-upgrade/references/react-19.md +79 -0
- package/dist/templates/default/apps/mobile/.agents/skills/expo-upgrade/references/react-compiler.md +59 -0
- package/dist/templates/default/apps/mobile/.agents/skills/expo-upgrade/references/react-navigation-to-expo-router.md +61 -0
- package/dist/templates/default/apps/mobile/.agents/skills/expo-web-to-native/SKILL.md +91 -0
- package/dist/templates/default/apps/mobile/.agents/skills/expo-web-to-native/agents/openai.yaml +4 -0
- package/dist/templates/default/apps/mobile/.agents/skills/expo-web-to-native/references/false-friends.md +119 -0
- package/dist/templates/default/apps/mobile/.agents/skills/expo-web-to-native/references/native-patterns.md +39 -0
- package/dist/templates/default/apps/mobile/.agents/skills/expo-web-to-native/references/run-as-goal.md +48 -0
- package/dist/templates/default/apps/mobile/.agents/skills/expo-web-to-native/references/verify-on-device.md +45 -0
- package/dist/templates/default/apps/mobile/.agents/skills/ios-simulator/SKILL.md +32 -0
- package/dist/templates/default/apps/mobile/.agents/skills/react-native-best-practices/POWER.md +172 -0
- package/dist/templates/default/apps/mobile/.agents/skills/react-native-best-practices/SKILL.md +238 -0
- package/dist/templates/default/apps/mobile/.agents/skills/react-native-best-practices/agents/openai.yaml +4 -0
- package/dist/templates/default/apps/mobile/.agents/skills/react-native-best-practices/references/bundle-analyze-app.md +208 -0
- package/dist/templates/default/apps/mobile/.agents/skills/react-native-best-practices/references/bundle-analyze-js.md +264 -0
- package/dist/templates/default/apps/mobile/.agents/skills/react-native-best-practices/references/bundle-barrel-exports.md +250 -0
- package/dist/templates/default/apps/mobile/.agents/skills/react-native-best-practices/references/bundle-code-splitting.md +255 -0
- package/dist/templates/default/apps/mobile/.agents/skills/react-native-best-practices/references/bundle-hermes-mmap.md +167 -0
- package/dist/templates/default/apps/mobile/.agents/skills/react-native-best-practices/references/bundle-library-size.md +164 -0
- package/dist/templates/default/apps/mobile/.agents/skills/react-native-best-practices/references/bundle-native-assets.md +208 -0
- package/dist/templates/default/apps/mobile/.agents/skills/react-native-best-practices/references/bundle-r8-android.md +231 -0
- package/dist/templates/default/apps/mobile/.agents/skills/react-native-best-practices/references/bundle-tree-shaking.md +215 -0
- package/dist/templates/default/apps/mobile/.agents/skills/react-native-best-practices/references/images/bundle-treemap-source-map-explorer.png +0 -0
- package/dist/templates/default/apps/mobile/.agents/skills/react-native-best-practices/references/images/controlled-textinput-pingpong.png +0 -0
- package/dist/templates/default/apps/mobile/.agents/skills/react-native-best-practices/references/images/devtools-flamegraph.png +0 -0
- package/dist/templates/default/apps/mobile/.agents/skills/react-native-best-practices/references/images/emerge-xray-ios.png +0 -0
- package/dist/templates/default/apps/mobile/.agents/skills/react-native-best-practices/references/images/expo-atlas-treemap.png +0 -0
- package/dist/templates/default/apps/mobile/.agents/skills/react-native-best-practices/references/images/flashlight-flatlist-vs-flashlist.png +0 -0
- package/dist/templates/default/apps/mobile/.agents/skills/react-native-best-practices/references/images/fps-drop-graph.png +0 -0
- package/dist/templates/default/apps/mobile/.agents/skills/react-native-best-practices/references/images/memory-heap-snapshot.png +0 -0
- package/dist/templates/default/apps/mobile/.agents/skills/react-native-best-practices/references/images/tti-warm-start-diagram.png +0 -0
- package/dist/templates/default/apps/mobile/.agents/skills/react-native-best-practices/references/images/view-hierarchy-flattening.png +0 -0
- package/dist/templates/default/apps/mobile/.agents/skills/react-native-best-practices/references/images/xcode-instruments-templates.png +0 -0
- package/dist/templates/default/apps/mobile/.agents/skills/react-native-best-practices/references/images/xcode-thread-view.png +0 -0
- package/dist/templates/default/apps/mobile/.agents/skills/react-native-best-practices/references/js-animations-reanimated.md +273 -0
- package/dist/templates/default/apps/mobile/.agents/skills/react-native-best-practices/references/js-atomic-state.md +190 -0
- package/dist/templates/default/apps/mobile/.agents/skills/react-native-best-practices/references/js-bottomsheet.md +339 -0
- package/dist/templates/default/apps/mobile/.agents/skills/react-native-best-practices/references/js-concurrent-react.md +238 -0
- package/dist/templates/default/apps/mobile/.agents/skills/react-native-best-practices/references/js-lists-flatlist-flashlist.md +223 -0
- package/dist/templates/default/apps/mobile/.agents/skills/react-native-best-practices/references/js-measure-fps.md +178 -0
- package/dist/templates/default/apps/mobile/.agents/skills/react-native-best-practices/references/js-memory-leaks.md +168 -0
- package/dist/templates/default/apps/mobile/.agents/skills/react-native-best-practices/references/js-profile-react.md +138 -0
- package/dist/templates/default/apps/mobile/.agents/skills/react-native-best-practices/references/js-react-compiler.md +261 -0
- package/dist/templates/default/apps/mobile/.agents/skills/react-native-best-practices/references/js-uncontrolled-components.md +219 -0
- package/dist/templates/default/apps/mobile/.agents/skills/react-native-best-practices/references/native-android-16kb-alignment.md +114 -0
- package/dist/templates/default/apps/mobile/.agents/skills/react-native-best-practices/references/native-measure-tti.md +221 -0
- package/dist/templates/default/apps/mobile/.agents/skills/react-native-best-practices/references/native-memory-leaks.md +206 -0
- package/dist/templates/default/apps/mobile/.agents/skills/react-native-best-practices/references/native-memory-patterns.md +240 -0
- package/dist/templates/default/apps/mobile/.agents/skills/react-native-best-practices/references/native-platform-setup.md +112 -0
- package/dist/templates/default/apps/mobile/.agents/skills/react-native-best-practices/references/native-profiling.md +140 -0
- package/dist/templates/default/apps/mobile/.agents/skills/react-native-best-practices/references/native-sdks-over-polyfills.md +192 -0
- package/dist/templates/default/apps/mobile/.agents/skills/react-native-best-practices/references/native-threading-model.md +230 -0
- package/dist/templates/default/apps/mobile/.agents/skills/react-native-best-practices/references/native-turbo-modules.md +210 -0
- package/dist/templates/default/apps/mobile/.agents/skills/react-native-best-practices/references/native-view-flattening.md +180 -0
- package/dist/templates/default/apps/mobile/AGENTS.md +41 -0
- package/dist/templates/default/apps/mobile/app.json +38 -0
- package/dist/templates/default/apps/mobile/assets/expo.icon/Assets/expo-symbol 2.svg +3 -0
- package/dist/templates/default/apps/mobile/assets/expo.icon/Assets/grid.png +0 -0
- package/dist/templates/default/apps/mobile/assets/expo.icon/icon.json +40 -0
- package/dist/templates/default/apps/mobile/assets/images/android-icon-background.png +0 -0
- package/dist/templates/default/apps/mobile/assets/images/android-icon-foreground.png +0 -0
- package/dist/templates/default/apps/mobile/assets/images/android-icon-monochrome.png +0 -0
- package/dist/templates/default/apps/mobile/assets/images/icon.png +0 -0
- package/dist/templates/default/apps/mobile/assets/images/splash-icon.png +0 -0
- package/dist/templates/default/apps/mobile/eslint.config.js +10 -0
- package/dist/templates/default/apps/mobile/package.json +43 -1
- package/dist/templates/default/apps/mobile/skills-lock.json +185 -0
- package/dist/templates/default/apps/mobile/src/app/_layout.tsx +5 -0
- package/dist/templates/default/apps/mobile/src/app/index.tsx +17 -0
- package/dist/templates/default/apps/mobile/tsconfig.json +20 -0
- package/dist/templates/default/apps/web/.agents/skills/frontend-design/SKILL.md +71 -0
- package/dist/templates/default/apps/web/.agents/skills/web-design-guidelines/SKILL.md +39 -0
- package/dist/templates/default/apps/web/.env.example +3 -0
- package/dist/templates/default/apps/web/components.json +23 -0
- package/dist/templates/default/apps/web/eslint.config.ts +21 -0
- package/dist/templates/default/apps/web/package.json +39 -1
- package/dist/templates/default/apps/web/public/disposabl-logo.svg +8 -0
- package/dist/templates/default/apps/web/public/favicon.ico +0 -0
- package/dist/templates/default/apps/web/public/manifest.json +25 -0
- package/dist/templates/default/apps/web/skills-lock.json +17 -0
- package/dist/templates/default/apps/web/src/index.css +92 -0
- package/dist/templates/default/apps/web/src/routeTree.gen.ts +282 -0
- package/dist/templates/default/apps/web/src/router/__root.tsx +63 -0
- package/dist/templates/default/apps/web/src/router/_authenticated/dashboard.tsx +9 -0
- package/dist/templates/default/apps/web/src/router/_authenticated/todos/$id.tsx +27 -0
- package/dist/templates/default/apps/web/src/router/_authenticated/todos/index.tsx +33 -0
- package/dist/templates/default/apps/web/src/router/index.tsx +15 -0
- package/dist/templates/default/apps/web/src/router.tsx +20 -0
- package/dist/templates/default/apps/web/tsconfig.json +33 -0
- package/dist/templates/default/apps/web/tsr.config.json +6 -0
- package/dist/templates/default/apps/web/vite.config.ts +67 -0
- package/dist/templates/default/bun.lock +3932 -0
- package/dist/templates/default/bunfig.toml +5 -0
- package/dist/templates/default/disposabl.json +5 -0
- package/dist/templates/default/gitignore +9 -1
- package/dist/templates/default/package.json +29 -4
- package/dist/templates/default/packages/backend/.agents/skills/convex/SKILL.md +69 -0
- package/dist/templates/default/packages/backend/.agents/skills/convex-add/SKILL.md +26 -0
- package/dist/templates/default/packages/backend/.agents/skills/convex-advisor/SKILL.md +32 -0
- package/dist/templates/default/packages/backend/.agents/skills/convex-agent/SKILL.md +25 -0
- package/dist/templates/default/packages/backend/.agents/skills/convex-auth/SKILL.md +29 -0
- package/dist/templates/default/packages/backend/.agents/skills/convex-authz/SKILL.md +36 -0
- package/dist/templates/default/packages/backend/.agents/skills/convex-backup/SKILL.md +33 -0
- package/dist/templates/default/packages/backend/.agents/skills/convex-billing/SKILL.md +69 -0
- package/dist/templates/default/packages/backend/.agents/skills/convex-cost/SKILL.md +29 -0
- package/dist/templates/default/packages/backend/.agents/skills/convex-create-component/SKILL.md +325 -0
- package/dist/templates/default/packages/backend/.agents/skills/convex-create-component/agents/openai.yaml +14 -0
- package/dist/templates/default/packages/backend/.agents/skills/convex-create-component/assets/icon.svg +3 -0
- package/dist/templates/default/packages/backend/.agents/skills/convex-create-component/references/advanced-patterns.md +146 -0
- package/dist/templates/default/packages/backend/.agents/skills/convex-create-component/references/hybrid-components.md +38 -0
- package/dist/templates/default/packages/backend/.agents/skills/convex-create-component/references/local-components.md +39 -0
- package/dist/templates/default/packages/backend/.agents/skills/convex-create-component/references/packaged-components.md +54 -0
- package/dist/templates/default/packages/backend/.agents/skills/convex-crons/SKILL.md +23 -0
- package/dist/templates/default/packages/backend/.agents/skills/convex-deploy-guard/SKILL.md +29 -0
- package/dist/templates/default/packages/backend/.agents/skills/convex-design/SKILL.md +30 -0
- package/dist/templates/default/packages/backend/.agents/skills/convex-docs/SKILL.md +31 -0
- package/dist/templates/default/packages/backend/.agents/skills/convex-domains/SKILL.md +26 -0
- package/dist/templates/default/packages/backend/.agents/skills/convex-env/SKILL.md +24 -0
- package/dist/templates/default/packages/backend/.agents/skills/convex-expert/SKILL.md +38 -0
- package/dist/templates/default/packages/backend/.agents/skills/convex-explain-app/SKILL.md +29 -0
- package/dist/templates/default/packages/backend/.agents/skills/convex-improve-convex-plugin/SKILL.md +24 -0
- package/dist/templates/default/packages/backend/.agents/skills/convex-insights/SKILL.md +32 -0
- package/dist/templates/default/packages/backend/.agents/skills/convex-launch-readiness/SKILL.md +35 -0
- package/dist/templates/default/packages/backend/.agents/skills/convex-migrate/SKILL.md +23 -0
- package/dist/templates/default/packages/backend/.agents/skills/convex-migrate-rehearse/SKILL.md +31 -0
- package/dist/templates/default/packages/backend/.agents/skills/convex-monitor/SKILL.md +22 -0
- package/dist/templates/default/packages/backend/.agents/skills/convex-optimize/SKILL.md +26 -0
- package/dist/templates/default/packages/backend/.agents/skills/convex-quickstart/SKILL.md +29 -0
- package/dist/templates/default/packages/backend/.agents/skills/convex-quickstart/agents/openai.yaml +14 -0
- package/dist/templates/default/packages/backend/.agents/skills/convex-quickstart/assets/icon.svg +4 -0
- package/dist/templates/default/packages/backend/.agents/skills/convex-reviewer/SKILL.md +26 -0
- package/dist/templates/default/packages/backend/.agents/skills/convex-seed/SKILL.md +23 -0
- package/dist/templates/default/packages/backend/.agents/skills/convex-self-heal/SKILL.md +38 -0
- package/dist/templates/default/packages/backend/.agents/skills/convex-sentinel/SKILL.md +25 -0
- package/dist/templates/default/packages/backend/.agents/skills/convex-suggest/SKILL.md +27 -0
- package/dist/templates/default/packages/backend/.agents/skills/convex-test/SKILL.md +23 -0
- package/dist/templates/default/packages/backend/.agents/skills/convex-verify/SKILL.md +34 -0
- package/dist/templates/default/packages/backend/.prettierignore +4 -0
- package/dist/templates/default/packages/backend/AGENTS.md +18 -0
- package/dist/templates/default/packages/backend/CLAUDE.md +13 -0
- package/dist/templates/default/packages/backend/README.md +25 -0
- package/dist/templates/default/packages/backend/convex/_generated/ai/ai-files.state.json +6 -0
- package/dist/templates/default/packages/backend/convex/_generated/ai/guidelines.md +286 -0
- package/dist/templates/default/packages/backend/convex/_generated/api.d.ts +66 -0
- package/dist/templates/default/packages/backend/convex/_generated/api.js +23 -0
- package/dist/templates/default/packages/backend/convex/_generated/dataModel.d.ts +60 -0
- package/dist/templates/default/packages/backend/convex/_generated/server.d.ts +164 -0
- package/dist/templates/default/packages/backend/convex/_generated/server.js +101 -0
- package/dist/templates/default/packages/backend/convex/auth.config.ts +14 -0
- package/dist/templates/default/packages/backend/convex/auth.ts +15 -0
- package/dist/templates/default/packages/backend/convex/convex.config.ts +30 -0
- package/dist/templates/default/packages/backend/convex/http.ts +5 -0
- package/dist/templates/default/packages/backend/convex/mcp.ts +8 -0
- package/dist/templates/default/packages/backend/convex/schema.ts +10 -0
- package/dist/templates/default/packages/backend/convex/todos/index.ts +26 -0
- package/dist/templates/default/packages/backend/convex/todos/internal.ts +43 -0
- package/dist/templates/default/packages/backend/convex/tsconfig.json +27 -0
- package/dist/templates/default/packages/backend/convex/users.ts +20 -0
- package/dist/templates/default/packages/backend/eslint.config.mjs +62 -0
- package/dist/templates/default/packages/backend/package.json +36 -0
- package/dist/templates/default/packages/backend/skills-lock.json +203 -0
- package/dist/templates/default/packages/disposabl-kit/client/components/ui/accordion.tsx +77 -0
- package/dist/templates/default/packages/disposabl-kit/client/components/ui/alert-dialog.tsx +185 -0
- package/dist/templates/default/packages/disposabl-kit/client/components/ui/alert.tsx +75 -0
- package/dist/templates/default/packages/disposabl-kit/client/components/ui/aspect-ratio.tsx +22 -0
- package/dist/templates/default/packages/disposabl-kit/client/components/ui/attachment.tsx +207 -0
- package/dist/templates/default/packages/disposabl-kit/client/components/ui/avatar.tsx +106 -0
- package/dist/templates/default/packages/disposabl-kit/client/components/ui/badge.tsx +51 -0
- package/dist/templates/default/packages/disposabl-kit/client/components/ui/breadcrumb.tsx +121 -0
- package/dist/templates/default/packages/disposabl-kit/client/components/ui/bubble.tsx +127 -0
- package/dist/templates/default/packages/disposabl-kit/client/components/ui/button-group.tsx +87 -0
- package/dist/templates/default/packages/disposabl-kit/client/components/ui/button.tsx +57 -0
- package/dist/templates/default/packages/disposabl-kit/client/components/ui/calendar.tsx +241 -0
- package/dist/templates/default/packages/disposabl-kit/client/components/ui/card.tsx +102 -0
- package/dist/templates/default/packages/disposabl-kit/client/components/ui/carousel.tsx +239 -0
- package/dist/templates/default/packages/disposabl-kit/client/components/ui/chart.tsx +368 -0
- package/dist/templates/default/packages/disposabl-kit/client/components/ui/checkbox.tsx +27 -0
- package/dist/templates/default/packages/disposabl-kit/client/components/ui/code-block.tsx +243 -0
- package/dist/templates/default/packages/disposabl-kit/client/components/ui/collapsible.tsx +19 -0
- package/dist/templates/default/packages/disposabl-kit/client/components/ui/combobox.tsx +300 -0
- package/dist/templates/default/packages/disposabl-kit/client/components/ui/command.tsx +194 -0
- package/dist/templates/default/packages/disposabl-kit/client/components/ui/context-menu.tsx +271 -0
- package/dist/templates/default/packages/disposabl-kit/client/components/ui/dialog.tsx +156 -0
- package/dist/templates/default/packages/disposabl-kit/client/components/ui/direction.tsx +4 -0
- package/dist/templates/default/packages/disposabl-kit/client/components/ui/drawer.tsx +224 -0
- package/dist/templates/default/packages/disposabl-kit/client/components/ui/dropdown-menu.tsx +269 -0
- package/dist/templates/default/packages/disposabl-kit/client/components/ui/empty.tsx +103 -0
- package/dist/templates/default/packages/disposabl-kit/client/components/ui/field.tsx +236 -0
- package/dist/templates/default/packages/disposabl-kit/client/components/ui/hover-card.tsx +50 -0
- package/dist/templates/default/packages/disposabl-kit/client/components/ui/input-group.tsx +158 -0
- package/dist/templates/default/packages/disposabl-kit/client/components/ui/input-otp.tsx +83 -0
- package/dist/templates/default/packages/disposabl-kit/client/components/ui/input.tsx +19 -0
- package/dist/templates/default/packages/disposabl-kit/client/components/ui/item.tsx +201 -0
- package/dist/templates/default/packages/disposabl-kit/client/components/ui/kbd.tsx +26 -0
- package/dist/templates/default/packages/disposabl-kit/client/components/ui/label.tsx +19 -0
- package/dist/templates/default/packages/disposabl-kit/client/components/ui/marker.tsx +70 -0
- package/dist/templates/default/packages/disposabl-kit/client/components/ui/menubar.tsx +284 -0
- package/dist/templates/default/packages/disposabl-kit/client/components/ui/message-scroller.tsx +128 -0
- package/dist/templates/default/packages/disposabl-kit/client/components/ui/message.tsx +91 -0
- package/dist/templates/default/packages/disposabl-kit/client/components/ui/native-select.tsx +64 -0
- package/dist/templates/default/packages/disposabl-kit/client/components/ui/navigation-menu.tsx +170 -0
- package/dist/templates/default/packages/disposabl-kit/client/components/ui/pagination.tsx +133 -0
- package/dist/templates/default/packages/disposabl-kit/client/components/ui/popover.tsx +87 -0
- package/dist/templates/default/packages/disposabl-kit/client/components/ui/progress.tsx +82 -0
- package/dist/templates/default/packages/disposabl-kit/client/components/ui/questionnaire.tsx +330 -0
- package/dist/templates/default/packages/disposabl-kit/client/components/ui/radio-group.tsx +35 -0
- package/dist/templates/default/packages/disposabl-kit/client/components/ui/resizable.tsx +49 -0
- package/dist/templates/default/packages/disposabl-kit/client/components/ui/scroll-area.tsx +51 -0
- package/dist/templates/default/packages/disposabl-kit/client/components/ui/select.tsx +201 -0
- package/dist/templates/default/packages/disposabl-kit/client/components/ui/separator.tsx +22 -0
- package/dist/templates/default/packages/disposabl-kit/client/components/ui/sheet.tsx +132 -0
- package/dist/templates/default/packages/disposabl-kit/client/components/ui/sidebar.tsx +723 -0
- package/dist/templates/default/packages/disposabl-kit/client/components/ui/skeleton.tsx +13 -0
- package/dist/templates/default/packages/disposabl-kit/client/components/ui/slider.tsx +51 -0
- package/dist/templates/default/packages/disposabl-kit/client/components/ui/spinner.tsx +16 -0
- package/dist/templates/default/packages/disposabl-kit/client/components/ui/switch.tsx +31 -0
- package/dist/templates/default/packages/disposabl-kit/client/components/ui/table.tsx +113 -0
- package/dist/templates/default/packages/disposabl-kit/client/components/ui/tabs.tsx +81 -0
- package/dist/templates/default/packages/disposabl-kit/client/components/ui/textarea.tsx +17 -0
- package/dist/templates/default/packages/disposabl-kit/client/components/ui/toast.tsx +229 -0
- package/dist/templates/default/packages/disposabl-kit/client/components/ui/toggle-group.tsx +87 -0
- package/dist/templates/default/packages/disposabl-kit/client/components/ui/toggle.tsx +42 -0
- package/dist/templates/default/packages/disposabl-kit/client/components/ui/tooltip.tsx +65 -0
- package/dist/templates/default/packages/disposabl-kit/client/components/ui/trace.tsx +161 -0
- package/dist/templates/default/packages/disposabl-kit/client/hooks/use-mobile.ts +21 -0
- package/dist/templates/default/packages/disposabl-kit/client/lib/prerender.ts +89 -0
- package/dist/templates/default/packages/disposabl-kit/client/lib/return-to.ts +12 -0
- package/dist/templates/default/packages/disposabl-kit/client/lib/utils.ts +1 -0
- package/dist/templates/default/packages/disposabl-kit/client/routes/_auth-pages/login.tsx +114 -0
- package/dist/templates/default/packages/disposabl-kit/client/routes/_auth-pages/signUp.tsx +120 -0
- package/dist/templates/default/packages/disposabl-kit/client/routes/_authenticated/route.tsx +38 -0
- package/dist/templates/default/packages/disposabl-kit/client/routes/consent.tsx +137 -0
- package/dist/templates/default/packages/disposabl-kit/client/routes/route.tsx +30 -0
- package/dist/templates/default/packages/disposabl-kit/client/styles/globals.css +60 -0
- package/dist/templates/default/packages/disposabl-kit/client/vite.config.ts +32 -0
- package/dist/templates/default/packages/disposabl-kit/components.json +23 -0
- package/dist/templates/default/packages/disposabl-kit/eslint.config.js +21 -0
- package/dist/templates/default/packages/disposabl-kit/package.json +60 -0
- package/dist/templates/default/packages/disposabl-kit/server/http.ts +86 -0
- package/dist/templates/default/packages/disposabl-kit/server/lib/functions.ts +40 -0
- package/dist/templates/default/packages/disposabl-kit/server/lib/platforms.ts +20 -0
- package/dist/templates/default/packages/disposabl-kit/server/lib/static-routes.ts +56 -0
- package/dist/templates/default/packages/disposabl-kit/tsconfig.json +17 -0
- package/dist/templates/default/patches/@convex-dev%2Fauth@2.0.0-beta.0.patch +310 -0
- package/dist/templates/default/patches/@convex-dev%2Fstatic-hosting@0.2.1.patch +187 -0
- package/dist/templates/default/tsconfig.json +9 -0
- package/dist/templates/default/turbo.json +51 -0
- package/package.json +1 -2
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Platform Differences
|
|
3
|
+
impact: MEDIUM
|
|
4
|
+
tags: ios, android, xcode, gradle, cocoapods
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Skill: Platform Differences
|
|
8
|
+
|
|
9
|
+
Navigate iOS and Android tooling, dependency management, and build systems in React Native.
|
|
10
|
+
|
|
11
|
+
## Quick Reference
|
|
12
|
+
|
|
13
|
+
| Platform | IDE | Package Manager | Build System |
|
|
14
|
+
|----------|-----|-----------------|--------------|
|
|
15
|
+
| JavaScript | VS Code | npm/yarn/pnpm/bun | Metro |
|
|
16
|
+
| iOS | Xcode | CocoaPods | xcodebuild |
|
|
17
|
+
| Android | Android Studio | Gradle | Gradle |
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
# Common commands
|
|
21
|
+
bundle install # Install ruby bundler
|
|
22
|
+
cd ios && bundle exec pod install # Install CocoaPods deps
|
|
23
|
+
cd android && ./gradlew tasks # Verify Gradle wrapper and tasks
|
|
24
|
+
xed ios/ # Open Xcode
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## When to Use
|
|
28
|
+
|
|
29
|
+
- Setting up native development environment
|
|
30
|
+
- Adding native dependencies
|
|
31
|
+
- Debugging platform-specific issues
|
|
32
|
+
- Understanding build processes
|
|
33
|
+
|
|
34
|
+
## Dependency Management
|
|
35
|
+
|
|
36
|
+
React Native autolinking only handles libraries structured as React Native modules. React Native packages often ship native iOS/Android code through npm, then CocoaPods/Gradle reference local files from `node_modules`. Pure native dependencies still need Podfile or Gradle changes.
|
|
37
|
+
|
|
38
|
+
### JavaScript (npm/yarn/pnpm/bun)
|
|
39
|
+
|
|
40
|
+
Infer package manager from lockfile: `package-lock.json`, `yarn.lock`, `pnpm-lock.yaml`, `bun.lockb`.
|
|
41
|
+
|
|
42
|
+
### iOS (CocoaPods)
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
# Install pods after npm install
|
|
46
|
+
bundle install
|
|
47
|
+
cd ios && bundle exec pod install
|
|
48
|
+
|
|
49
|
+
# Key files
|
|
50
|
+
ios/Podfile # Pod dependencies
|
|
51
|
+
ios/Pods/ # Installed pods (gitignored)
|
|
52
|
+
ios/*.xcworkspace # Open this in Xcode (not .xcodeproj)
|
|
53
|
+
Gemfile # Ruby/CocoaPods version
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
### Android (Gradle)
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
# Verify Gradle after adding dependencies
|
|
61
|
+
cd android && ./gradlew tasks
|
|
62
|
+
|
|
63
|
+
# Key files
|
|
64
|
+
android/build.gradle # Project-level config
|
|
65
|
+
android/app/build.gradle # App dependencies
|
|
66
|
+
android/gradle.properties # Build flags
|
|
67
|
+
android/gradlew # Gradle wrapper
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
Use exact Gradle dependency versions in production. Avoid dynamic `+` versions because they can change builds unpredictably.
|
|
71
|
+
|
|
72
|
+
## Common Commands
|
|
73
|
+
|
|
74
|
+
```bash
|
|
75
|
+
# iOS
|
|
76
|
+
bundle install # Install ruby bundler
|
|
77
|
+
cd ios && bundle exec pod install # Install pods
|
|
78
|
+
xcrun simctl list # List simulators
|
|
79
|
+
|
|
80
|
+
# Android
|
|
81
|
+
cd android && ./gradlew clean # Clean build
|
|
82
|
+
./gradlew tasks # List available tasks
|
|
83
|
+
./gradlew assembleRelease # Build release APK
|
|
84
|
+
|
|
85
|
+
# React Native CLI
|
|
86
|
+
npx react-native start # Start Metro
|
|
87
|
+
npx react-native run-ios # Run on iOS
|
|
88
|
+
npx react-native run-android # Run on Android
|
|
89
|
+
|
|
90
|
+
# Expo
|
|
91
|
+
npx expo start # Start Metro (Expo)
|
|
92
|
+
npx expo run:ios # Run on iOS (dev client)
|
|
93
|
+
npx expo run:android # Run on Android (dev client)
|
|
94
|
+
npx expo prebuild # Generate native projects
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
## Troubleshooting
|
|
98
|
+
|
|
99
|
+
| Issue | Solution |
|
|
100
|
+
|-------|----------|
|
|
101
|
+
| Pod install fails | `cd ios && bundle exec pod install --repo-update` |
|
|
102
|
+
| Xcode build fails | `cd ios && xcodebuild clean` |
|
|
103
|
+
| Android Gradle sync fails | Open Android Studio sync details, then run the failing Gradle task directly |
|
|
104
|
+
| Can't find simulator | `xcrun simctl list` to verify name |
|
|
105
|
+
| Metro cache issues | `npx react-native start --reset-cache` |
|
|
106
|
+
| React Native cache issues | Clear the specific cache reported by the failing tool |
|
|
107
|
+
|
|
108
|
+
## Related Skills
|
|
109
|
+
|
|
110
|
+
- [native-profiling.md](./native-profiling.md) - Use IDE profilers
|
|
111
|
+
- [native-turbo-modules.md](./native-turbo-modules.md) - Build native modules
|
|
112
|
+
- [upgrading-react-native.md](../../upgrading-react-native/references/upgrading-react-native.md) - Upgrade React Native safely
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Profile Native Code
|
|
3
|
+
impact: MEDIUM
|
|
4
|
+
tags: xcode, instruments, android-studio, profiler
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Skill: Profile Native Code
|
|
8
|
+
|
|
9
|
+
Use Xcode Instruments and Android Studio Profiler to identify native performance bottlenecks.
|
|
10
|
+
|
|
11
|
+
## Quick Command
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
# iOS: Open Instruments
|
|
15
|
+
# Xcode → Open Developer Tool → Instruments → Time Profiler
|
|
16
|
+
|
|
17
|
+
# Android: Open Profiler
|
|
18
|
+
# Android Studio → View → Tool Windows → Profiler
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
## When to Use
|
|
22
|
+
|
|
23
|
+
- App is slow but JS profiler shows no issues
|
|
24
|
+
- Investigating native module performance
|
|
25
|
+
- Startup feels slow (native init)
|
|
26
|
+
- Battery drain concerns
|
|
27
|
+
- Need CPU/memory breakdown by thread
|
|
28
|
+
|
|
29
|
+
> **Note**: This skill involves visual profiler output (Xcode Instruments, Android Studio Profiler). Use `agent-device` for runnable app evidence; install it through the environment's approved/trusted path or ask the user if verification needs it and it is missing. Profiler-specific GUI analysis may still require exported traces or human review. Record concrete thread names, stack frames, and durations in text when asking an agent to reason about them.
|
|
30
|
+
|
|
31
|
+
## iOS Profiling with Xcode
|
|
32
|
+
|
|
33
|
+
### Quick Check: Debug Navigator
|
|
34
|
+
|
|
35
|
+
Use Xcode's Debug Navigator for quick CPU, memory, disk, and network signals before collecting a full Instruments trace.
|
|
36
|
+
|
|
37
|
+
**CPU percentage can exceed 100%** (multi-core usage).
|
|
38
|
+
|
|
39
|
+
### Deep Profiling: Instruments
|
|
40
|
+
|
|
41
|
+
Record a Time Profiler trace on the target device, perform the suspect interaction, and inspect the relevant threads and call stacks.
|
|
42
|
+
|
|
43
|
+
### Analyzing Time Profiler Results
|
|
44
|
+
|
|
45
|
+
**Key views:**
|
|
46
|
+
- **Flame Graph**: Visual call stack over time
|
|
47
|
+
- **Call Tree**: Hierarchical function breakdown
|
|
48
|
+
- **Ranked**: Functions sorted by time (Bottom-Up)
|
|
49
|
+
|
|
50
|
+
**Useful filters:**
|
|
51
|
+
- Hide System Libraries
|
|
52
|
+
- Invert Call Tree (bottom-up view)
|
|
53
|
+
- Filter by thread (main, JS, etc.)
|
|
54
|
+
|
|
55
|
+
**Identifying problems:**
|
|
56
|
+
- **Microhang**: Brief UI unresponsiveness
|
|
57
|
+
- **Hang**: Full UI thread block (critical)
|
|
58
|
+
- Yellow = most time spent
|
|
59
|
+
|
|
60
|
+
### Thread Breakdown
|
|
61
|
+
|
|
62
|
+
Pin threads to compare:
|
|
63
|
+
- **Main thread** (SampleApp): UI rendering
|
|
64
|
+
- **JavaScript thread**: React/JS execution
|
|
65
|
+
- **Background threads**: Native modules
|
|
66
|
+
|
|
67
|
+
JS thread blocking and UI thread blocking are different signals; inspect both before choosing a fix.
|
|
68
|
+
|
|
69
|
+
## Android Profiling with Android Studio
|
|
70
|
+
|
|
71
|
+
### Launch Profiler
|
|
72
|
+
|
|
73
|
+
Use Android Studio Profiler on the target device or emulator.
|
|
74
|
+
|
|
75
|
+
### CPU Profiling
|
|
76
|
+
|
|
77
|
+
Record CPU hotspots while performing the suspect interaction, then inspect flame graph, bottom-up, and timeline views.
|
|
78
|
+
|
|
79
|
+
### Analyzing Results
|
|
80
|
+
|
|
81
|
+
**Flame Graph:**
|
|
82
|
+
- Zoom with scroll/pinch
|
|
83
|
+
- Click to expand call stacks
|
|
84
|
+
- Filter by keyword (e.g., "hermes")
|
|
85
|
+
|
|
86
|
+
**Views:**
|
|
87
|
+
- **Top Down**: From entry points down
|
|
88
|
+
- **Bottom Up**: From slowest functions up
|
|
89
|
+
- **Flame Chart**: Timeline visualization
|
|
90
|
+
|
|
91
|
+
### Reading the Call Stack
|
|
92
|
+
|
|
93
|
+
Example analysis:
|
|
94
|
+
```
|
|
95
|
+
JS Thread activity after button press:
|
|
96
|
+
- Event handler on main thread
|
|
97
|
+
- Triggers JS work via sync JSI calls
|
|
98
|
+
- Hermes processes React reconciliation
|
|
99
|
+
- Significant time in commit/layout-related work
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
## Platform Tools Summary
|
|
103
|
+
|
|
104
|
+
| Tool | Platform | Use Case |
|
|
105
|
+
|------|----------|----------|
|
|
106
|
+
| Time Profiler | iOS | CPU hotspots |
|
|
107
|
+
| Leaks | iOS | Memory leaks |
|
|
108
|
+
| Hangs | iOS | UI thread blocks |
|
|
109
|
+
| CPU Profiler | Android | CPU hotspots |
|
|
110
|
+
| Memory Profiler | Android | Memory tracking |
|
|
111
|
+
| Perfetto | Android | Advanced trace analysis |
|
|
112
|
+
|
|
113
|
+
## Perfetto (Advanced Android)
|
|
114
|
+
|
|
115
|
+
Export traces from Android Studio and analyze at [ui.perfetto.dev](https://ui.perfetto.dev/):
|
|
116
|
+
|
|
117
|
+
- Cross-process analysis
|
|
118
|
+
- Custom trace events
|
|
119
|
+
- Additional visualizations
|
|
120
|
+
|
|
121
|
+
## Expo Notes
|
|
122
|
+
|
|
123
|
+
- **Expo Go**: Cannot profile native code directly; JS profiling only
|
|
124
|
+
- **Dev Client / Prebuild**: Full native profiling supported via Xcode/Android Studio
|
|
125
|
+
- Run `npx expo prebuild` to generate native projects, then profile as bare React Native
|
|
126
|
+
|
|
127
|
+
## Common Findings
|
|
128
|
+
|
|
129
|
+
| Symptom | Likely Cause |
|
|
130
|
+
|---------|--------------|
|
|
131
|
+
| Main thread hangs | Heavy UI work, blocked operations |
|
|
132
|
+
| JS thread spikes | React re-renders, heavy computation |
|
|
133
|
+
| Background thread busy | Native module work |
|
|
134
|
+
| Memory climbing | Leak (see memory profiling skills) |
|
|
135
|
+
|
|
136
|
+
## Related Skills
|
|
137
|
+
|
|
138
|
+
- [native-measure-tti.md](./native-measure-tti.md) - Profile startup specifically
|
|
139
|
+
- [native-memory-leaks.md](./native-memory-leaks.md) - Memory profiling
|
|
140
|
+
- [js-profile-react.md](./js-profile-react.md) - JS/React profiling
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Native SDKs
|
|
3
|
+
impact: HIGH
|
|
4
|
+
tags: polyfills, intl, crypto, navigation, native
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Skill: Native SDKs
|
|
8
|
+
|
|
9
|
+
Replace web polyfills and JS navigators with native React Native implementations for better performance.
|
|
10
|
+
|
|
11
|
+
## Quick Pattern
|
|
12
|
+
|
|
13
|
+
**Before (JS polyfills - 430+ KB):**
|
|
14
|
+
|
|
15
|
+
```tsx
|
|
16
|
+
import '@formatjs/intl-datetimeformat/polyfill';
|
|
17
|
+
import CryptoJS from 'crypto-js';
|
|
18
|
+
import { createStackNavigator } from '@react-navigation/stack';
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
**After (native implementations):**
|
|
22
|
+
|
|
23
|
+
```tsx
|
|
24
|
+
// Keep this polyfill only if the app uses DateTimeFormat options/locales
|
|
25
|
+
// unsupported by the target Hermes/platform combination.
|
|
26
|
+
import { createHash } from 'react-native-quick-crypto';
|
|
27
|
+
import { createNativeStackNavigator } from '@react-navigation/native-stack';
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
## When to Use
|
|
31
|
+
|
|
32
|
+
- Large JS bundle from polyfills
|
|
33
|
+
- Navigation feels non-native
|
|
34
|
+
- Crypto operations are slow
|
|
35
|
+
- Internationalization bloating bundle
|
|
36
|
+
|
|
37
|
+
## Step-by-Step Instructions
|
|
38
|
+
|
|
39
|
+
### 1. Remove Unnecessary Intl Polyfills
|
|
40
|
+
|
|
41
|
+
Hermes supports many `Intl` APIs natively, but not every constructor and method combination across platforms. Audit the exact APIs and methods you use before removing polyfills:
|
|
42
|
+
|
|
43
|
+
```tsx
|
|
44
|
+
// BEFORE: All these polyfills (430+ KB)
|
|
45
|
+
import '@formatjs/intl-getcanonicallocales/polyfill';
|
|
46
|
+
import '@formatjs/intl-locale/polyfill';
|
|
47
|
+
import '@formatjs/intl-numberformat/polyfill';
|
|
48
|
+
import '@formatjs/intl-numberformat/locale-data/en';
|
|
49
|
+
import '@formatjs/intl-datetimeformat/polyfill';
|
|
50
|
+
import '@formatjs/intl-datetimeformat/locale-data/en';
|
|
51
|
+
import '@formatjs/intl-pluralrules/polyfill';
|
|
52
|
+
import '@formatjs/intl-pluralrules/locale-data/en';
|
|
53
|
+
import '@formatjs/intl-relativetimeformat/polyfill';
|
|
54
|
+
import '@formatjs/intl-relativetimeformat/locale-data/en';
|
|
55
|
+
import '@formatjs/intl-displaynames/polyfill';
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
**Hermes Intl support must be checked against the Hermes version in the app:**
|
|
59
|
+
|
|
60
|
+
| API | Hermes | Keep Polyfill? |
|
|
61
|
+
|-----|--------|----------------|
|
|
62
|
+
| `Intl.Collator` | ✅ | No |
|
|
63
|
+
| `Intl.DateTimeFormat` | ⚠️ Partial | Maybe |
|
|
64
|
+
| `Intl.NumberFormat` | ⚠️ Partial | Maybe |
|
|
65
|
+
| `Intl.getCanonicalLocales()` | ✅ | No |
|
|
66
|
+
| `Intl.supportedValuesOf()` | ✅ | No |
|
|
67
|
+
| `Intl.Locale` | ❌ | Yes |
|
|
68
|
+
| `Intl.PluralRules` | ❌ | Yes |
|
|
69
|
+
| `Intl.RelativeTimeFormat` | ❌ | Yes |
|
|
70
|
+
| `Intl.DisplayNames` | ❌ | Yes |
|
|
71
|
+
| `Intl.ListFormat` | ❌ | Yes |
|
|
72
|
+
| `Intl.Segmenter` | ❌ | Yes |
|
|
73
|
+
|
|
74
|
+
Constructor support does not guarantee every option or method your app uses. Keep polyfills for any API, option, locale data, or method the app depends on but Hermes does not fully support on the target platform.
|
|
75
|
+
|
|
76
|
+
```tsx
|
|
77
|
+
// AFTER: Keep only the polyfills your app still needs
|
|
78
|
+
import '@formatjs/intl-locale/polyfill';
|
|
79
|
+
import '@formatjs/intl-pluralrules/polyfill';
|
|
80
|
+
import '@formatjs/intl-pluralrules/locale-data/en';
|
|
81
|
+
import '@formatjs/intl-relativetimeformat/polyfill';
|
|
82
|
+
import '@formatjs/intl-relativetimeformat/locale-data/en';
|
|
83
|
+
import '@formatjs/intl-displaynames/polyfill';
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
If you use `Intl.NumberFormat.prototype.formatToParts()` on Hermes/iOS, also keep:
|
|
87
|
+
|
|
88
|
+
```tsx
|
|
89
|
+
import '@formatjs/intl-numberformat/polyfill';
|
|
90
|
+
import '@formatjs/intl-numberformat/locale-data/en';
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
### 2. Use Native Crypto
|
|
94
|
+
|
|
95
|
+
Replace JS crypto with native C++ implementation:
|
|
96
|
+
|
|
97
|
+
```bash
|
|
98
|
+
npm install react-native-quick-crypto
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
```tsx
|
|
102
|
+
// BEFORE: Slow JS implementation
|
|
103
|
+
import CryptoJS from 'crypto-js';
|
|
104
|
+
|
|
105
|
+
// AFTER: Native C++ implementation
|
|
106
|
+
import { createHash } from 'react-native-quick-crypto';
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
Essential for:
|
|
110
|
+
- Web3 wallet seed generation
|
|
111
|
+
- CSPRNG (Cryptographically Secure Random Numbers)
|
|
112
|
+
- Any heavy cryptographic operations
|
|
113
|
+
|
|
114
|
+
Benchmark crypto changes on the target device class. Native implementations usually reduce JS-thread work, but the exact win depends on algorithm, payload size, and bridge/JSI overhead.
|
|
115
|
+
|
|
116
|
+
### 3. Use Native Stack Navigator
|
|
117
|
+
|
|
118
|
+
```bash
|
|
119
|
+
npm install @react-navigation/native-stack react-native-screens
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
```tsx
|
|
123
|
+
// BEFORE: JS-based stack (more flexible, less native)
|
|
124
|
+
import { createStackNavigator } from '@react-navigation/stack';
|
|
125
|
+
const Stack = createStackNavigator();
|
|
126
|
+
|
|
127
|
+
// AFTER: Native stack (native feel, better performance)
|
|
128
|
+
import { createNativeStackNavigator } from '@react-navigation/native-stack';
|
|
129
|
+
const Stack = createNativeStackNavigator();
|
|
130
|
+
|
|
131
|
+
// Usage is nearly identical
|
|
132
|
+
<Stack.Navigator>
|
|
133
|
+
<Stack.Screen name="Home" component={HomeScreen} />
|
|
134
|
+
<Stack.Screen name="Details" component={DetailsScreen} />
|
|
135
|
+
</Stack.Navigator>
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
**Benefits:**
|
|
139
|
+
- Native navigation animations
|
|
140
|
+
- Platform-specific headers (large titles on iOS)
|
|
141
|
+
- Lower memory usage
|
|
142
|
+
- Offloads work from JS thread
|
|
143
|
+
|
|
144
|
+
### 4. Use Native Bottom Tabs
|
|
145
|
+
|
|
146
|
+
```bash
|
|
147
|
+
npm install @bottom-tabs/react-navigation react-native-bottom-tabs
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
```tsx
|
|
151
|
+
// BEFORE: JS tabs
|
|
152
|
+
import { createBottomTabNavigator } from '@react-navigation/bottom-tabs';
|
|
153
|
+
const Tabs = createBottomTabNavigator();
|
|
154
|
+
|
|
155
|
+
// AFTER: Native tabs
|
|
156
|
+
import { createNativeBottomTabNavigator } from '@bottom-tabs/react-navigation';
|
|
157
|
+
const Tabs = createNativeBottomTabNavigator();
|
|
158
|
+
|
|
159
|
+
<Tabs.Navigator>
|
|
160
|
+
<Tabs.Screen name="Home" component={HomeScreen} />
|
|
161
|
+
<Tabs.Screen name="Profile" component={ProfileScreen} />
|
|
162
|
+
</Tabs.Navigator>
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
## Recommended Native Libraries
|
|
166
|
+
|
|
167
|
+
| Category | Library | Description |
|
|
168
|
+
|----------|---------|-------------|
|
|
169
|
+
| Navigation | `react-native-screens` | Native screen containers |
|
|
170
|
+
| Menus | `zeego` | Native menus (Radix-like API) |
|
|
171
|
+
| Slider | `@react-native-community/slider` | Native slider |
|
|
172
|
+
| Date Picker | `react-native-date-picker` | Native date/time picker |
|
|
173
|
+
|
|
174
|
+
## Decision Matrix
|
|
175
|
+
|
|
176
|
+
| Scenario | Use Native? | Tradeoff |
|
|
177
|
+
|----------|-------------|----------|
|
|
178
|
+
| Standard navigation | ✅ Yes | Slight API differences |
|
|
179
|
+
| Custom transition animations | ⚠️ Maybe | Native is more limited |
|
|
180
|
+
| Platform-consistent UI | ✅ Yes | Less customization |
|
|
181
|
+
| Unique/branded design | ⚠️ Consider JS | Native may not support |
|
|
182
|
+
|
|
183
|
+
## Common Pitfalls
|
|
184
|
+
|
|
185
|
+
- **Assuming constructor support means full method coverage**: Check the specific Hermes API and methods you call
|
|
186
|
+
- **Ignoring migration effort**: Native navigators have slightly different APIs
|
|
187
|
+
- **Over-customizing native components**: If design requires heavy customization, JS might be better
|
|
188
|
+
|
|
189
|
+
## Related Skills
|
|
190
|
+
|
|
191
|
+
- [bundle-analyze-js.md](./bundle-analyze-js.md) - Measure polyfill impact
|
|
192
|
+
- [bundle-library-size.md](./bundle-library-size.md) - Compare library sizes
|
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Threading Model
|
|
3
|
+
impact: HIGH
|
|
4
|
+
tags: threads, turbo-modules, fabric, async, sync
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Skill: Threading Model
|
|
8
|
+
|
|
9
|
+
Understand which threads Turbo Modules and Fabric use for initialization, method calls, and view updates.
|
|
10
|
+
|
|
11
|
+
## Quick Reference
|
|
12
|
+
|
|
13
|
+
Thread names and exact scheduling can vary by React Native version, architecture, and host app setup. Use this as a default mental model, then confirm with a profiler when the exact thread matters.
|
|
14
|
+
|
|
15
|
+
| Action | Default assumption |
|
|
16
|
+
|--------|--------------------|
|
|
17
|
+
| UI view creation/updates | Main/UI thread |
|
|
18
|
+
| Sync value-returning Turbo Module method | Blocks the JS caller until it returns |
|
|
19
|
+
| Async Turbo Module method | Does not block JS, but may run on a shared native modules executor |
|
|
20
|
+
| Heavy CPU/I/O work | Move to a module-owned background queue/coroutine |
|
|
21
|
+
|
|
22
|
+
**Key rule**: Sync methods should be trivial and deterministic. Move anything that can block, allocate heavily, perform I/O, or wait on locks to async/background work.
|
|
23
|
+
|
|
24
|
+
## When to Use
|
|
25
|
+
|
|
26
|
+
- Building native modules
|
|
27
|
+
- Debugging threading issues
|
|
28
|
+
- Accessing UI from native code
|
|
29
|
+
- Understanding async vs sync method behavior
|
|
30
|
+
|
|
31
|
+
## Available Threads
|
|
32
|
+
|
|
33
|
+
| Thread | Name in Debugger | Purpose |
|
|
34
|
+
|--------|------------------|---------|
|
|
35
|
+
| Main/UI | Main thread | UI rendering, UIKit/Android Views |
|
|
36
|
+
| JavaScript | `mqt_v_js` | JS execution, React |
|
|
37
|
+
| Native Modules | `mqt_v_native` | Async Turbo Module calls |
|
|
38
|
+
| Custom | Various | Your background threads |
|
|
39
|
+
|
|
40
|
+
## Turbo Modules Threading
|
|
41
|
+
|
|
42
|
+
### Initialization
|
|
43
|
+
|
|
44
|
+
| Platform | Thread | Notes |
|
|
45
|
+
|----------|--------|-------|
|
|
46
|
+
| iOS | Main thread | Assumes UIKit access needed |
|
|
47
|
+
| Android (lazy) | JS thread | Default behavior |
|
|
48
|
+
| Android (eager) | Native modules thread | When `needsEagerInit = true` |
|
|
49
|
+
|
|
50
|
+
**iOS**: React Native runs `init` on main thread assuming UIKit access.
|
|
51
|
+
|
|
52
|
+
**Android Eager Loading:**
|
|
53
|
+
|
|
54
|
+
```kotlin
|
|
55
|
+
// ReactModuleInfo constructor params:
|
|
56
|
+
// canOverrideExistingModule, needsEagerInit, isCxxModule, isTurboModule
|
|
57
|
+
ReactModuleInfo(
|
|
58
|
+
AwesomeModule.NAME,
|
|
59
|
+
AwesomeModule.NAME,
|
|
60
|
+
false,
|
|
61
|
+
true, // needsEagerInit = true → runs on native modules thread
|
|
62
|
+
false,
|
|
63
|
+
true
|
|
64
|
+
)
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
### Synchronous Method Calls
|
|
68
|
+
|
|
69
|
+
Synchronous value-returning Turbo Module methods block the JS caller until they return. Treat them as JS-critical even if a platform implementation dispatches through an internal executor.
|
|
70
|
+
|
|
71
|
+
```swift
|
|
72
|
+
// iOS - runs on JS thread
|
|
73
|
+
@objc func multiply(_ a: Double, b: Double) -> NSNumber {
|
|
74
|
+
// This blocks JS for entire duration!
|
|
75
|
+
return a * b as NSNumber
|
|
76
|
+
}
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
**Danger**: Long sync operations freeze the app:
|
|
80
|
+
|
|
81
|
+
```swift
|
|
82
|
+
// BAD: Blocks JS for 20 seconds
|
|
83
|
+
@objc func multiply(_ a: Double, b: Double) -> NSNumber {
|
|
84
|
+
Thread.sleep(forTimeInterval: 20) // App frozen!
|
|
85
|
+
return a * b as NSNumber
|
|
86
|
+
}
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
### Asynchronous Method Calls
|
|
90
|
+
|
|
91
|
+
**Usually dispatched off the JS thread** - does not block JS while the native work is pending.
|
|
92
|
+
|
|
93
|
+
The native modules thread is shared across modules. If async work is CPU-heavy or long-running, move it to a module-owned queue/coroutine scope rather than occupying the shared React Native native modules thread.
|
|
94
|
+
|
|
95
|
+
```swift
|
|
96
|
+
// iOS - runs on mqt_v_native thread
|
|
97
|
+
@objc func asyncOperation(
|
|
98
|
+
_ a: Double,
|
|
99
|
+
resolve: @escaping RCTPromiseResolveBlock,
|
|
100
|
+
reject: RCTPromiseRejectBlock
|
|
101
|
+
) {
|
|
102
|
+
// Already on background thread
|
|
103
|
+
resolve(a * 2)
|
|
104
|
+
}
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
```kotlin
|
|
108
|
+
// Android - runs on native modules thread
|
|
109
|
+
override fun asyncOperation(a: Double, promise: Promise?) {
|
|
110
|
+
// Already on background thread
|
|
111
|
+
promise?.resolve(a * 2)
|
|
112
|
+
}
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
### Module Invalidation
|
|
116
|
+
|
|
117
|
+
Called when React Native instance is torn down (e.g., Metro reload):
|
|
118
|
+
|
|
119
|
+
| Platform | Thread |
|
|
120
|
+
|----------|--------|
|
|
121
|
+
| iOS | Native modules thread |
|
|
122
|
+
| Android | ReactHost thread pool |
|
|
123
|
+
|
|
124
|
+
**iOS**: Implement `RCTInvalidating` protocol.
|
|
125
|
+
|
|
126
|
+
## Fabric (Native Views) Threading
|
|
127
|
+
|
|
128
|
+
### View Lifecycle
|
|
129
|
+
|
|
130
|
+
| Operation | Default assumption |
|
|
131
|
+
|-----------|--------------------|
|
|
132
|
+
| View init | Main thread |
|
|
133
|
+
| Prop updates | Main thread |
|
|
134
|
+
| Layout/shadow tree work | Architecture-dependent; profile before assuming thread ownership |
|
|
135
|
+
|
|
136
|
+
Views always manipulate UI on main thread (UIKit/Android requirement).
|
|
137
|
+
|
|
138
|
+
Do not use a hard-coded "Yoga runs on X thread" rule when diagnosing performance. React Native's renderer and scheduler details change across New Architecture releases; use Instruments, Perfetto, or Android Studio profiler to identify the actual bottleneck.
|
|
139
|
+
|
|
140
|
+
## Moving Work to Background
|
|
141
|
+
|
|
142
|
+
### iOS: DispatchQueue
|
|
143
|
+
|
|
144
|
+
```swift
|
|
145
|
+
@objc func heavyWork(
|
|
146
|
+
resolve: @escaping RCTPromiseResolveBlock,
|
|
147
|
+
reject: RCTPromiseRejectBlock
|
|
148
|
+
) {
|
|
149
|
+
DispatchQueue.global().async {
|
|
150
|
+
// Heavy computation here
|
|
151
|
+
let result = self.compute()
|
|
152
|
+
resolve(result)
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
### Android: Coroutines
|
|
158
|
+
|
|
159
|
+
```kotlin
|
|
160
|
+
class MyModule(reactContext: ReactApplicationContext) :
|
|
161
|
+
NativeMyModuleSpec(reactContext) {
|
|
162
|
+
|
|
163
|
+
private val moduleScope = CoroutineScope(Dispatchers.Default + SupervisorJob())
|
|
164
|
+
|
|
165
|
+
override fun heavyWork(promise: Promise?) {
|
|
166
|
+
moduleScope.launch {
|
|
167
|
+
// Heavy computation here
|
|
168
|
+
val result = compute()
|
|
169
|
+
promise?.resolve(result)
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
override fun invalidate() {
|
|
174
|
+
super.invalidate()
|
|
175
|
+
moduleScope.cancel() // Important: cancel to prevent leaks
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
## Thread Safety Checklist
|
|
181
|
+
|
|
182
|
+
| Scenario | Safe? | Solution |
|
|
183
|
+
|----------|-------|----------|
|
|
184
|
+
| Sync method accessing shared state | ⚠️ | Use locks/synchronized |
|
|
185
|
+
| Async method accessing UI | ❌ | Dispatch to main thread |
|
|
186
|
+
| Multiple async calls to same resource | ⚠️ | Queue or mutex |
|
|
187
|
+
| Accessing JS from background | ❌ | Use CallInvoker |
|
|
188
|
+
|
|
189
|
+
### Accessing UI from Background (iOS)
|
|
190
|
+
|
|
191
|
+
```swift
|
|
192
|
+
DispatchQueue.global().async {
|
|
193
|
+
let result = self.heavyComputation()
|
|
194
|
+
|
|
195
|
+
DispatchQueue.main.async {
|
|
196
|
+
// Safe to update UI here
|
|
197
|
+
self.updateUI(with: result)
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
### Accessing UI from Background (Android)
|
|
203
|
+
|
|
204
|
+
```kotlin
|
|
205
|
+
moduleScope.launch(Dispatchers.Default) {
|
|
206
|
+
val result = heavyComputation()
|
|
207
|
+
|
|
208
|
+
withContext(Dispatchers.Main) {
|
|
209
|
+
// Safe to update UI here
|
|
210
|
+
updateUI(result)
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
## Summary Table
|
|
216
|
+
|
|
217
|
+
| Action | iOS Thread | Android Thread |
|
|
218
|
+
|--------|------------|----------------|
|
|
219
|
+
| Module init | Version/setup dependent; avoid blocking | Version/setup dependent; avoid blocking |
|
|
220
|
+
| Sync method | Blocks JS caller | Blocks JS caller |
|
|
221
|
+
| Async method | Shared native executor or implementation-defined | Shared native executor or implementation-defined |
|
|
222
|
+
| View init | Main | Main |
|
|
223
|
+
| Prop update | Main | Main |
|
|
224
|
+
| Yoga/layout | Profile; do not assume fixed ownership | Profile; do not assume fixed ownership |
|
|
225
|
+
| Invalidate | Native modules | ReactHost pool |
|
|
226
|
+
|
|
227
|
+
## Related Skills
|
|
228
|
+
|
|
229
|
+
- [native-turbo-modules.md](./native-turbo-modules.md) - Implement background threads
|
|
230
|
+
- [native-profiling.md](./native-profiling.md) - Debug thread issues
|