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,210 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Fast Native Modules
|
|
3
|
+
impact: HIGH
|
|
4
|
+
tags: turbo-modules, native, swift, kotlin, c++
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Skill: Fast Native Modules
|
|
8
|
+
|
|
9
|
+
Build performant Turbo Modules using modern languages and background threading.
|
|
10
|
+
|
|
11
|
+
## Quick Pattern
|
|
12
|
+
|
|
13
|
+
**Incorrect (sync method blocks JS thread):**
|
|
14
|
+
|
|
15
|
+
```swift
|
|
16
|
+
@objc func heavyWork() -> NSNumber {
|
|
17
|
+
Thread.sleep(forTimeInterval: 2) // Blocks JS for 2s!
|
|
18
|
+
return 42
|
|
19
|
+
}
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
**Correct (async on background thread):**
|
|
23
|
+
|
|
24
|
+
```swift
|
|
25
|
+
@objc func heavyWork(
|
|
26
|
+
resolve: @escaping RCTPromiseResolveBlock,
|
|
27
|
+
reject: RCTPromiseRejectBlock
|
|
28
|
+
) {
|
|
29
|
+
DispatchQueue.global().async {
|
|
30
|
+
let result = self.compute()
|
|
31
|
+
resolve(result)
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
## When to Use
|
|
37
|
+
|
|
38
|
+
- Creating new native modules
|
|
39
|
+
- Optimizing existing module performance
|
|
40
|
+
- Heavy computation needs to run off JS thread
|
|
41
|
+
- Cross-platform C++ code needed
|
|
42
|
+
|
|
43
|
+
## Prerequisites
|
|
44
|
+
|
|
45
|
+
- React Native Builder Bob for scaffolding
|
|
46
|
+
|
|
47
|
+
```bash
|
|
48
|
+
npx create-react-native-library@latest my-library
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
## Step-by-Step Instructions
|
|
52
|
+
|
|
53
|
+
### 1. Scaffold with Builder Bob
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
npx create-react-native-library@latest awesome-library
|
|
57
|
+
# Follow prompts: choose Turbo Module, select languages
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
Creates ready-to-publish library with:
|
|
61
|
+
- iOS (Obj-C/Swift) support
|
|
62
|
+
- Android (Kotlin) support
|
|
63
|
+
- TypeScript definitions
|
|
64
|
+
- Codegen setup
|
|
65
|
+
|
|
66
|
+
For local modules:
|
|
67
|
+
|
|
68
|
+
```bash
|
|
69
|
+
npx create-react-native-library@latest awesome-library --local
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
### 2. Run on Background Thread (iOS)
|
|
73
|
+
|
|
74
|
+
```swift
|
|
75
|
+
@objc func heavyOperation(
|
|
76
|
+
_ input: Double,
|
|
77
|
+
resolve: @escaping RCTPromiseResolveBlock,
|
|
78
|
+
reject: RCTPromiseRejectBlock
|
|
79
|
+
) {
|
|
80
|
+
DispatchQueue.global().async {
|
|
81
|
+
// Heavy work on background thread
|
|
82
|
+
let result = self.expensiveComputation(input)
|
|
83
|
+
resolve(result)
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
### 3. Run on Background Thread (Android)
|
|
89
|
+
|
|
90
|
+
```kotlin
|
|
91
|
+
class AwesomeLibraryModule(reactContext: ReactApplicationContext) :
|
|
92
|
+
NativeAwesomeLibrarySpec(reactContext) {
|
|
93
|
+
|
|
94
|
+
private val moduleScope = CoroutineScope(Dispatchers.Default + SupervisorJob())
|
|
95
|
+
|
|
96
|
+
override fun heavyOperation(input: Double, promise: Promise?) {
|
|
97
|
+
moduleScope.launch {
|
|
98
|
+
// Heavy work on coroutine
|
|
99
|
+
val result = expensiveComputation(input)
|
|
100
|
+
promise?.resolve(result)
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
override fun invalidate() {
|
|
105
|
+
super.invalidate()
|
|
106
|
+
moduleScope.cancel() // Prevent memory leaks!
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
Use structured concurrency: keep a module-owned `CoroutineScope`, cancel it in `invalidate()`, avoid `GlobalScope.launch`, use `SupervisorJob` so one failed operation does not cancel unrelated in-flight work, and choose `Dispatchers.Default` for CPU work or `Dispatchers.IO` for disk/network/database work.
|
|
112
|
+
|
|
113
|
+
### 4. Use C++ for Cross-Platform Code
|
|
114
|
+
|
|
115
|
+
Create C++ Turbo Module for shared logic:
|
|
116
|
+
|
|
117
|
+
```cpp
|
|
118
|
+
// MyCppModule.h
|
|
119
|
+
#pragma once
|
|
120
|
+
|
|
121
|
+
#include <ReactCommon/TurboModule.h>
|
|
122
|
+
|
|
123
|
+
namespace facebook::react {
|
|
124
|
+
|
|
125
|
+
class MyCppModule : public TurboModule {
|
|
126
|
+
public:
|
|
127
|
+
MyCppModule(std::shared_ptr<CallInvoker> jsInvoker);
|
|
128
|
+
|
|
129
|
+
double multiply(double a, double b);
|
|
130
|
+
};
|
|
131
|
+
|
|
132
|
+
} // namespace facebook::react
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
Follow the registration mechanism documented for the React Native version you target. Avoid copying old `+load` registration workarounds unless current RN docs or template output still require them.
|
|
136
|
+
|
|
137
|
+
## Threading Summary
|
|
138
|
+
|
|
139
|
+
| Method Type | Default Thread | Best Practice |
|
|
140
|
+
|-------------|----------------|---------------|
|
|
141
|
+
| Sync | JS thread | Keep fast (<16ms) |
|
|
142
|
+
| Async | Native modules thread | OK for moderate work |
|
|
143
|
+
| Heavy async | Custom background | Use DispatchQueue/Coroutines |
|
|
144
|
+
|
|
145
|
+
## Language Interop Costs
|
|
146
|
+
|
|
147
|
+
| Interface | Overhead | Notes |
|
|
148
|
+
|-----------|----------|-------|
|
|
149
|
+
| Obj-C / Obj-C++ ↔ C++ | Low | Common iOS interop path |
|
|
150
|
+
| Swift ↔ C++ | Version-dependent | Verify supported Swift/Xcode/RN setup |
|
|
151
|
+
| Kotlin ↔ C++ (JNI) | Higher | Batch calls and avoid per-item crossings |
|
|
152
|
+
| C++ Turbo Module | Low | JSI direct access when correctly registered |
|
|
153
|
+
|
|
154
|
+
**Tip**: C++ Turbo Modules skip JNI at runtime since JS holds direct C++ function references via JSI.
|
|
155
|
+
|
|
156
|
+
## Code Example: Complete Async Operation
|
|
157
|
+
|
|
158
|
+
```typescript
|
|
159
|
+
// TypeScript interface
|
|
160
|
+
export interface Spec extends TurboModule {
|
|
161
|
+
multiply(a: number, b: number): number; // Sync
|
|
162
|
+
heavyOperation(input: number): Promise<number>; // Async
|
|
163
|
+
}
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
```kotlin
|
|
167
|
+
// Android implementation
|
|
168
|
+
override fun heavyOperation(input: Double, promise: Promise?) {
|
|
169
|
+
moduleScope.launch {
|
|
170
|
+
try {
|
|
171
|
+
val result = withContext(Dispatchers.Default) {
|
|
172
|
+
// Simulate heavy work
|
|
173
|
+
delay(1000)
|
|
174
|
+
input * 2
|
|
175
|
+
}
|
|
176
|
+
promise?.resolve(result)
|
|
177
|
+
} catch (e: Exception) {
|
|
178
|
+
promise?.reject("ERROR", e.message)
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
```swift
|
|
185
|
+
// iOS implementation
|
|
186
|
+
@objc func heavyOperation(
|
|
187
|
+
_ input: Double,
|
|
188
|
+
resolve: @escaping RCTPromiseResolveBlock,
|
|
189
|
+
reject: @escaping RCTPromiseRejectBlock
|
|
190
|
+
) {
|
|
191
|
+
DispatchQueue.global(qos: .userInitiated).async {
|
|
192
|
+
// Simulate heavy work
|
|
193
|
+
Thread.sleep(forTimeInterval: 1.0)
|
|
194
|
+
let result = input * 2
|
|
195
|
+
resolve(result)
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
## Common Pitfalls
|
|
201
|
+
|
|
202
|
+
- **Sync methods that block**: Keep sync methods trivial and deterministic; make anything that can block, allocate heavily, perform I/O, or wait on locks async/background work
|
|
203
|
+
- **Forgetting to cancel coroutine scope**: Causes memory leaks
|
|
204
|
+
- **Not handling errors in async**: Always try/catch with reject
|
|
205
|
+
- **Accessing UI from background**: Dispatch to main thread
|
|
206
|
+
|
|
207
|
+
## Related Skills
|
|
208
|
+
|
|
209
|
+
- [native-threading-model.md](./native-threading-model.md) - Thread details
|
|
210
|
+
- [native-memory-patterns.md](./native-memory-patterns.md) - Memory in native code
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: View Flattening
|
|
3
|
+
impact: MEDIUM
|
|
4
|
+
tags: views, flattening, collapsable, hierarchy
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Skill: View Flattening
|
|
8
|
+
|
|
9
|
+
Understand and debug React Native's view flattening optimization.
|
|
10
|
+
|
|
11
|
+
## Quick Pattern
|
|
12
|
+
|
|
13
|
+
**Problem (children get flattened unexpectedly):**
|
|
14
|
+
|
|
15
|
+
```jsx
|
|
16
|
+
<NativeTabBar>
|
|
17
|
+
<Tab1 /> // May be flattened, breaking native component
|
|
18
|
+
<Tab2 />
|
|
19
|
+
</NativeTabBar>
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
**Solution (prevent flattening):**
|
|
23
|
+
|
|
24
|
+
```jsx
|
|
25
|
+
<NativeTabBar>
|
|
26
|
+
<Tab1 collapsable={false} />
|
|
27
|
+
<Tab2 collapsable={false} />
|
|
28
|
+
</NativeTabBar>
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## When to Use
|
|
32
|
+
|
|
33
|
+
- Native component receives unexpected number of children
|
|
34
|
+
- Layout debugging with native components
|
|
35
|
+
- Building native components that accept children
|
|
36
|
+
- Understanding React Native rendering
|
|
37
|
+
|
|
38
|
+
> **Note**: This skill involves visual view hierarchy tools (Xcode Debug View Hierarchy, Android Layout Inspector). Use `agent-device` for screen evidence; install it through the environment's approved/trusted path or ask the user if verification needs it and it is missing. Native hierarchy inspection may still require Xcode, Android Studio, or human review. Record native child counts and component names in text when asking an agent to reason about them.
|
|
39
|
+
|
|
40
|
+
## What is View Flattening?
|
|
41
|
+
|
|
42
|
+
React Native's renderer automatically removes "layout-only" views that:
|
|
43
|
+
- Only affect layout (no visual rendering)
|
|
44
|
+
- Don't need to exist in native view hierarchy
|
|
45
|
+
|
|
46
|
+
**Benefits**: Reduced memory, faster rendering, shallower view tree.
|
|
47
|
+
|
|
48
|
+
## The Problem with Native Components
|
|
49
|
+
|
|
50
|
+
```tsx
|
|
51
|
+
// You expect 3 children
|
|
52
|
+
<MyNativeComponent>
|
|
53
|
+
<Child1 />
|
|
54
|
+
<Child2 />
|
|
55
|
+
<Child3 />
|
|
56
|
+
</MyNativeComponent>
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
If a child wrapper is flattened, native code may receive a different child count or shape than the JS tree suggests.
|
|
60
|
+
|
|
61
|
+
## Preventing Flattening with `collapsable`
|
|
62
|
+
|
|
63
|
+
```tsx
|
|
64
|
+
<MyNativeComponent>
|
|
65
|
+
<Child1 collapsable={false} />
|
|
66
|
+
<Child2 collapsable={false} />
|
|
67
|
+
<Child3 collapsable={false} />
|
|
68
|
+
</MyNativeComponent>
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
The direct views marked `collapsable={false}` are preserved as native children.
|
|
72
|
+
|
|
73
|
+
## Debugging View Hierarchy
|
|
74
|
+
|
|
75
|
+

|
|
76
|
+
|
|
77
|
+
Use native debugging tools to see the actual view hierarchy:
|
|
78
|
+
|
|
79
|
+
### Xcode (iOS)
|
|
80
|
+
|
|
81
|
+
1. Run app via Xcode
|
|
82
|
+
2. Click **"Debug View Hierarchy"** in debug toolbar (shown in image)
|
|
83
|
+
3. Inspect 3D view of native hierarchy
|
|
84
|
+
|
|
85
|
+
Component class names vary by architecture and React Native version; verify the actual native hierarchy in the tool.
|
|
86
|
+
|
|
87
|
+
### Android Studio
|
|
88
|
+
|
|
89
|
+
1. Run app via Android Studio
|
|
90
|
+
2. **View → Tool Windows → Layout Inspector**
|
|
91
|
+
3. Select running process
|
|
92
|
+
|
|
93
|
+
Component class names vary by architecture and React Native version; verify the actual native hierarchy in the tool.
|
|
94
|
+
|
|
95
|
+
## Code Examples
|
|
96
|
+
|
|
97
|
+
### When Flattening Breaks Your Component
|
|
98
|
+
|
|
99
|
+
```tsx
|
|
100
|
+
// Your native component expects exactly 2 tabs
|
|
101
|
+
const NativeTabBar = requireNativeComponent('RCTTabBar');
|
|
102
|
+
|
|
103
|
+
// BAD: TabContent might get flattened
|
|
104
|
+
const MyTabs = () => (
|
|
105
|
+
<NativeTabBar>
|
|
106
|
+
<TabContent title="Home">
|
|
107
|
+
<View><Text>Home content</Text></View>
|
|
108
|
+
</TabContent>
|
|
109
|
+
<TabContent title="Profile">
|
|
110
|
+
<View><Text>Profile content</Text></View>
|
|
111
|
+
</TabContent>
|
|
112
|
+
</NativeTabBar>
|
|
113
|
+
);
|
|
114
|
+
|
|
115
|
+
// GOOD: Prevent flattening
|
|
116
|
+
const MyTabs = () => (
|
|
117
|
+
<NativeTabBar>
|
|
118
|
+
<TabContent title="Home" collapsable={false}>
|
|
119
|
+
<View><Text>Home content</Text></View>
|
|
120
|
+
</TabContent>
|
|
121
|
+
<TabContent title="Profile" collapsable={false}>
|
|
122
|
+
<View><Text>Profile content</Text></View>
|
|
123
|
+
</TabContent>
|
|
124
|
+
</NativeTabBar>
|
|
125
|
+
);
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
### Wrapper Component with collapsable
|
|
129
|
+
|
|
130
|
+
```tsx
|
|
131
|
+
// Wrapper that prevents flattening
|
|
132
|
+
const NativeChildWrapper = ({ children, ...props }) => (
|
|
133
|
+
<View collapsable={false} {...props}>
|
|
134
|
+
{children}
|
|
135
|
+
</View>
|
|
136
|
+
);
|
|
137
|
+
|
|
138
|
+
// Usage
|
|
139
|
+
<NativeComponent>
|
|
140
|
+
<NativeChildWrapper>
|
|
141
|
+
<ComplexChild />
|
|
142
|
+
</NativeChildWrapper>
|
|
143
|
+
</NativeComponent>
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
## When Views Get Flattened
|
|
147
|
+
|
|
148
|
+
React Native can flatten layout-only wrappers that do not need their own native view for drawing, events, accessibility, measurement, or native-component child semantics. The exact rules vary across renderer versions.
|
|
149
|
+
|
|
150
|
+
## Forcing a View to Stay
|
|
151
|
+
|
|
152
|
+
Use `collapsable={false}` as the stable fix. Style or handler changes can be useful as debugging probes, but do not keep them as the production solution:
|
|
153
|
+
|
|
154
|
+
```tsx
|
|
155
|
+
// Diagnostic probes only
|
|
156
|
+
<View style={{ backgroundColor: 'transparent' }} />
|
|
157
|
+
<View style={{ borderWidth: 0.01 }} />
|
|
158
|
+
<View style={{ opacity: 0.99 }} />
|
|
159
|
+
<View onLayout={() => {}} />
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
Remove these probes after confirming flattening is the issue.
|
|
163
|
+
|
|
164
|
+
## Debugging Checklist
|
|
165
|
+
|
|
166
|
+
1. **Check native child count**: Log received children in native code
|
|
167
|
+
2. **Use Layout Inspector**: Visual hierarchy debugging
|
|
168
|
+
3. **Add collapsable={false}**: Test if flattening is the issue
|
|
169
|
+
4. **Check wrapper components**: Intermediate views may be flattened
|
|
170
|
+
|
|
171
|
+
## Common Pitfalls
|
|
172
|
+
|
|
173
|
+
- **Assuming JS children = native children**: Flattening changes this
|
|
174
|
+
- **Not documenting native component requirements**: If your native component expects specific child count, document it
|
|
175
|
+
- **Over-using collapsable={false}**: Only use when necessary (loses optimization benefits)
|
|
176
|
+
|
|
177
|
+
## Related Skills
|
|
178
|
+
|
|
179
|
+
- [native-platform-setup.md](./native-platform-setup.md) - IDE setup for debugging
|
|
180
|
+
- [native-profiling.md](./native-profiling.md) - Performance impact analysis
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
This is an Expo/React Native mobile application. Prioritize mobile-first patterns, performance, and cross-platform compatibility.
|
|
2
|
+
|
|
3
|
+
## Expo has changed — do not trust your training data
|
|
4
|
+
|
|
5
|
+
Expo ships breaking changes every SDK release. APIs you remember are likely renamed, moved, or removed. Before writing any code that touches an Expo, EAS, or React Native API:
|
|
6
|
+
|
|
7
|
+
1. Read the major version of the `expo` package in `package.json`.
|
|
8
|
+
2. Fetch the matching versioned docs: `https://docs.expo.dev/versions/v<major>.0.0/`
|
|
9
|
+
3. For anything else, fetch https://docs.expo.dev/llms.txt — an index of all Expo docs with corrections to common LLM misconceptions. Follow its links to the specific page you need; never answer from memory.
|
|
10
|
+
|
|
11
|
+
## Commands
|
|
12
|
+
|
|
13
|
+
Use `bunx` instead of `npx` if the project uses bun (`bun.lock` present).
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
npx expo install <package> # ALWAYS use instead of npm/yarn/pnpm/bun add — resolves SDK-compatible versions
|
|
17
|
+
npx expo start # start the dev server
|
|
18
|
+
npx expo lint # lint
|
|
19
|
+
npx tsc --noEmit # typecheck
|
|
20
|
+
npx expo-doctor # diagnose dependency and config issues
|
|
21
|
+
npx expo install --fix # fix incompatible package versions
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
Run lint and typecheck before declaring any task done.
|
|
25
|
+
|
|
26
|
+
## Navigation & Routing
|
|
27
|
+
|
|
28
|
+
- Use **Expo Router** for all navigation. Routes live in `src/app/` — every file there is a screen, `_layout.tsx` files define navigators. Keep non-route code (components, hooks, utils) outside `src/app/`.
|
|
29
|
+
- Import `Link`, `router`, and `useLocalSearchParams` from `expo-router`.
|
|
30
|
+
- Docs: https://docs.expo.dev/router/introduction.md
|
|
31
|
+
|
|
32
|
+
## Building with EAS
|
|
33
|
+
|
|
34
|
+
Use EAS to build, sign, and submit the app in the cloud (`eas build`, `eas submit`) and to ship over-the-air updates (`eas update`) — no local Xcode or Android Studio required. Run EAS CLI as `bunx eas-cli <command>` in Bun projects, or `npx eas-cli@latest <command>` otherwise; substitute that for bare `eas` in docs examples.
|
|
35
|
+
Docs: https://docs.expo.dev/eas/index.md
|
|
36
|
+
|
|
37
|
+
## Rules
|
|
38
|
+
|
|
39
|
+
- If `ios/` and `android/` directories do not exist, they are generated (Continuous Native Generation). Never create or edit them by hand — configure native behavior in `app.json` and config plugins.
|
|
40
|
+
- Expo Go only includes its bundled native modules. After adding a library with native code, the app needs a development build: `npx expo run:ios|android` locally, or `eas build --profile development`.
|
|
41
|
+
- Prefer recommended Expo modules over third-party libraries, and check your available skills before adding dependencies. Docs: https://docs.expo.dev/versions/latest/index.md
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
{
|
|
2
|
+
"expo": {
|
|
3
|
+
"name": "Disposabl",
|
|
4
|
+
"slug": "disposabl",
|
|
5
|
+
"version": "1.0.0",
|
|
6
|
+
"orientation": "default",
|
|
7
|
+
"icon": "./assets/images/icon.png",
|
|
8
|
+
"scheme": "mobile",
|
|
9
|
+
"userInterfaceStyle": "automatic",
|
|
10
|
+
"ios": {
|
|
11
|
+
"icon": "./assets/expo.icon"
|
|
12
|
+
},
|
|
13
|
+
"android": {
|
|
14
|
+
"adaptiveIcon": {
|
|
15
|
+
"backgroundColor": "#E6F4FE",
|
|
16
|
+
"foregroundImage": "./assets/images/android-icon-foreground.png",
|
|
17
|
+
"backgroundImage": "./assets/images/android-icon-background.png",
|
|
18
|
+
"monochromeImage": "./assets/images/android-icon-monochrome.png"
|
|
19
|
+
},
|
|
20
|
+
"predictiveBackGestureEnabled": false
|
|
21
|
+
},
|
|
22
|
+
"plugins": [
|
|
23
|
+
"expo-router",
|
|
24
|
+
[
|
|
25
|
+
"expo-splash-screen",
|
|
26
|
+
{
|
|
27
|
+
"backgroundColor": "#208AEF",
|
|
28
|
+
"image": "./assets/images/splash-icon.png",
|
|
29
|
+
"imageWidth": 76
|
|
30
|
+
}
|
|
31
|
+
]
|
|
32
|
+
],
|
|
33
|
+
"experiments": {
|
|
34
|
+
"typedRoutes": true,
|
|
35
|
+
"reactCompiler": true
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
<svg width="652" height="606" viewBox="0 0 652 606" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
2
|
+
<path d="M353.554 0H298.446C273.006 0 249.684 14.6347 237.962 37.9539L4.37994 502.646C-1.04325 513.435 -1.45067 526.178 3.2716 537.313L22.6123 582.918C34.6475 611.297 72.5404 614.156 88.4414 587.885L309.863 222.063C313.34 216.317 319.439 212.826 326 212.826C332.561 212.826 338.659 216.317 342.137 222.063L563.559 587.885C579.46 614.156 617.352 611.297 629.388 582.918L648.728 537.313C653.451 526.178 653.043 513.435 647.62 502.646L414.038 37.9539C402.316 14.6347 378.994 0 353.554 0Z" fill="white"/>
|
|
3
|
+
</svg>
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
{
|
|
2
|
+
"fill" : {
|
|
3
|
+
"automatic-gradient" : "extended-srgb:0.00000,0.47843,1.00000,1.00000"
|
|
4
|
+
},
|
|
5
|
+
"groups" : [
|
|
6
|
+
{
|
|
7
|
+
"layers" : [
|
|
8
|
+
{
|
|
9
|
+
"image-name" : "expo-symbol 2.svg",
|
|
10
|
+
"name" : "expo-symbol 2",
|
|
11
|
+
"position" : {
|
|
12
|
+
"scale" : 1,
|
|
13
|
+
"translation-in-points" : [
|
|
14
|
+
1.1008400065293245e-05,
|
|
15
|
+
-16.046875
|
|
16
|
+
]
|
|
17
|
+
}
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
"image-name" : "grid.png",
|
|
21
|
+
"name" : "grid"
|
|
22
|
+
}
|
|
23
|
+
],
|
|
24
|
+
"shadow" : {
|
|
25
|
+
"kind" : "neutral",
|
|
26
|
+
"opacity" : 0.5
|
|
27
|
+
},
|
|
28
|
+
"translucency" : {
|
|
29
|
+
"enabled" : true,
|
|
30
|
+
"value" : 0.5
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
],
|
|
34
|
+
"supported-platforms" : {
|
|
35
|
+
"circles" : [
|
|
36
|
+
"watchOS"
|
|
37
|
+
],
|
|
38
|
+
"squares" : "shared"
|
|
39
|
+
}
|
|
40
|
+
}
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -1 +1,43 @@
|
|
|
1
|
-
{
|
|
1
|
+
{
|
|
2
|
+
"name": "@disposabl/mobile",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"main": "expo-router/entry",
|
|
5
|
+
"dependencies": {
|
|
6
|
+
"@expo/ui": "~58.0.23",
|
|
7
|
+
"expo": "~58.0.19",
|
|
8
|
+
"expo-constants": "~58.0.13",
|
|
9
|
+
"expo-device": "~58.0.5",
|
|
10
|
+
"expo-font": "~58.0.10",
|
|
11
|
+
"expo-glass-effect": "~58.0.5",
|
|
12
|
+
"expo-image": "~58.0.17",
|
|
13
|
+
"expo-linking": "~58.0.14",
|
|
14
|
+
"expo-router": "~58.0.26",
|
|
15
|
+
"expo-splash-screen": "~58.0.11",
|
|
16
|
+
"expo-status-bar": "~58.0.4",
|
|
17
|
+
"expo-symbols": "~58.0.4",
|
|
18
|
+
"expo-system-ui": "~58.0.6",
|
|
19
|
+
"expo-web-browser": "~58.0.6",
|
|
20
|
+
"react": "19.3.0",
|
|
21
|
+
"react-native": "0.88.0",
|
|
22
|
+
"react-native-gesture-handler": "~3.3.0",
|
|
23
|
+
"react-native-reanimated": "4.7.1",
|
|
24
|
+
"react-native-safe-area-context": "~5.10.1",
|
|
25
|
+
"react-native-screens": "~4.30.0",
|
|
26
|
+
"react-native-worklets": "0.13.0"
|
|
27
|
+
},
|
|
28
|
+
"devDependencies": {
|
|
29
|
+
"@types/react": "~19.3.0",
|
|
30
|
+
"eslint": "^9.0.0",
|
|
31
|
+
"eslint-config-expo": "~58.0.4",
|
|
32
|
+
"typescript": "~6.0.3"
|
|
33
|
+
},
|
|
34
|
+
"scripts": {
|
|
35
|
+
"start": "expo start",
|
|
36
|
+
"android": "expo start --android",
|
|
37
|
+
"ios": "expo start --ios",
|
|
38
|
+
"lint": "expo lint",
|
|
39
|
+
"dev": "expo start",
|
|
40
|
+
"typecheck": "tsc --noEmit"
|
|
41
|
+
},
|
|
42
|
+
"private": true
|
|
43
|
+
}
|