create-disposabl-app 0.0.4 → 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 +490 -105
- package/dist/templates/default/LICENSE +21 -0
- package/dist/templates/default/apps/blog/package.json +1 -0
- package/dist/templates/default/apps/changelog/package.json +1 -0
- 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 -0
- 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/docs/package.json +1 -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 -0
- 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 -0
- 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 +10 -0
- package/dist/templates/default/package.json +31 -10
- 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 +21 -5
- package/README.md +0 -34
- package/dist/templates/default/README.md +0 -12
- package/dist/templates/default/docs/index.html +0 -8
- package/dist/templates/default/eslint.config.js +0 -18
- package/dist/templates/default/index.ts +0 -14
|
@@ -0,0 +1,261 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: React Compiler
|
|
3
|
+
impact: HIGH
|
|
4
|
+
tags: memoization, react-compiler, memo, useMemo, useCallback
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Skill: React Compiler
|
|
8
|
+
|
|
9
|
+
Set up React Compiler to automatically memoize components and eliminate unnecessary re-renders.
|
|
10
|
+
|
|
11
|
+
## Quick Pattern
|
|
12
|
+
|
|
13
|
+
**Before (manual memoization):**
|
|
14
|
+
|
|
15
|
+
```jsx
|
|
16
|
+
const MemoizedButton = memo(({ onPress }) => <Pressable onPress={onPress} />);
|
|
17
|
+
const handler = useCallback(() => doSomething(), []);
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
**After (automatic with React Compiler):**
|
|
21
|
+
|
|
22
|
+
```jsx
|
|
23
|
+
// No memo/useCallback needed - compiler handles it
|
|
24
|
+
const Button = ({ onPress }) => <Pressable onPress={onPress} />;
|
|
25
|
+
const handler = () => doSomething();
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
## When to Use
|
|
29
|
+
|
|
30
|
+
- Want automatic performance optimization without manual `memo`/`useMemo`/`useCallback`
|
|
31
|
+
- Codebase follows Rules of React
|
|
32
|
+
- React Native 0.76+ or Expo SDK 52+
|
|
33
|
+
- Ready to remove boilerplate memoization code
|
|
34
|
+
|
|
35
|
+
## Prerequisites
|
|
36
|
+
|
|
37
|
+
- Babel-based build system
|
|
38
|
+
- Code follows [Rules of React](https://react.dev/reference/rules)
|
|
39
|
+
- Check current React Native, Expo, and React Compiler release notes before copying version-specific setup
|
|
40
|
+
|
|
41
|
+
## Step-by-Step Instructions
|
|
42
|
+
|
|
43
|
+
### Step 1: Check Compatibility
|
|
44
|
+
|
|
45
|
+
Before enabling the compiler, verify your project is compatible:
|
|
46
|
+
|
|
47
|
+
```bash
|
|
48
|
+
npx react-compiler-healthcheck@latest
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
This checks if your app follows the Rules of React and identifies potential issues.
|
|
52
|
+
|
|
53
|
+
### Step 2: Install React Compiler
|
|
54
|
+
|
|
55
|
+
#### Expo
|
|
56
|
+
|
|
57
|
+
Use Expo's SDK-specific path:
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
# SDK 54 and later: Babel is auto-configured
|
|
61
|
+
npx expo install babel-plugin-react-compiler@beta
|
|
62
|
+
|
|
63
|
+
# SDK 53: install runtime too
|
|
64
|
+
npx expo install babel-plugin-react-compiler@beta react-compiler-runtime@beta
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
Then enable the experiment in app config:
|
|
68
|
+
|
|
69
|
+
```json
|
|
70
|
+
{
|
|
71
|
+
"expo": {
|
|
72
|
+
"experiments": {
|
|
73
|
+
"reactCompiler": true
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
#### React Native without Expo
|
|
80
|
+
|
|
81
|
+
```bash
|
|
82
|
+
npm install -D babel-plugin-react-compiler@latest
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
For React 17 or 18 targets, also install the compiler runtime:
|
|
86
|
+
|
|
87
|
+
```bash
|
|
88
|
+
npm install react-compiler-runtime@latest
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
Prefer the setup path documented for the app's exact Expo SDK, React Native, and React versions.
|
|
92
|
+
|
|
93
|
+
### Step 3: Configure Babel (React Native without Expo)
|
|
94
|
+
|
|
95
|
+
For non-Expo React Native projects, configure Babel manually and keep the compiler first in the plugin pipeline:
|
|
96
|
+
|
|
97
|
+
```javascript
|
|
98
|
+
// babel.config.js
|
|
99
|
+
const ReactCompilerConfig = {
|
|
100
|
+
target: '19', // Use '18' for React Native < 0.78
|
|
101
|
+
};
|
|
102
|
+
|
|
103
|
+
module.exports = function (api) {
|
|
104
|
+
api.cache(true);
|
|
105
|
+
return {
|
|
106
|
+
presets: ['module:@react-native/babel-preset'],
|
|
107
|
+
plugins: [
|
|
108
|
+
['babel-plugin-react-compiler', ReactCompilerConfig],
|
|
109
|
+
// ... other plugins
|
|
110
|
+
],
|
|
111
|
+
};
|
|
112
|
+
};
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
### Step 4: Set Up ESLint (Recommended)
|
|
116
|
+
|
|
117
|
+
Use the React Hooks/Compiler lint rules that match the app's React version. For Expo, SDK 55+ includes React Compiler lint rules through `eslint-config-expo`; SDK 54 and earlier need `eslint-plugin-react-compiler`. Fix rule violations before treating a component as compiler-optimized; skipped components are safe but do not get the intended memoization.
|
|
118
|
+
|
|
119
|
+
### Step 5: Verify Optimizations
|
|
120
|
+
|
|
121
|
+
Verify with `agent-device react-devtools` before/after render measurements. For release-build verification, connect [`@callstack/inspector`](https://github.com/callstackincubator/inspector#inspector) first so React DevTools can attach. Some visual DevTools versions show compiler memoization badges, but profiler evidence is the stable signal.
|
|
122
|
+
|
|
123
|
+
## Incremental Adoption
|
|
124
|
+
|
|
125
|
+
You can incrementally adopt React Compiler using two strategies:
|
|
126
|
+
|
|
127
|
+
### Strategy 1: Limit to Specific Directories
|
|
128
|
+
|
|
129
|
+
Configure the Babel plugin to only run on specific files, e.g. `src/path/to/dir` in the following examples:
|
|
130
|
+
|
|
131
|
+
**Expo** (create `babel.config.js` with `npx expo customize babel.config.js`):
|
|
132
|
+
|
|
133
|
+
```javascript
|
|
134
|
+
// babel.config.js
|
|
135
|
+
module.exports = function (api) {
|
|
136
|
+
api.cache(true);
|
|
137
|
+
return {
|
|
138
|
+
presets: [
|
|
139
|
+
[
|
|
140
|
+
'babel-preset-expo',
|
|
141
|
+
{
|
|
142
|
+
'react-compiler': {
|
|
143
|
+
sources: (filename) => {
|
|
144
|
+
return filename.includes('src/path/to/dir');
|
|
145
|
+
},
|
|
146
|
+
},
|
|
147
|
+
},
|
|
148
|
+
],
|
|
149
|
+
],
|
|
150
|
+
};
|
|
151
|
+
};
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
**React Native (without Expo)**:
|
|
155
|
+
|
|
156
|
+
```javascript
|
|
157
|
+
// babel.config.js
|
|
158
|
+
const ReactCompilerConfig = {
|
|
159
|
+
target: '19',
|
|
160
|
+
sources: (filename) => {
|
|
161
|
+
return filename.includes('src/path/to/dir');
|
|
162
|
+
},
|
|
163
|
+
};
|
|
164
|
+
|
|
165
|
+
module.exports = function (api) {
|
|
166
|
+
api.cache(true);
|
|
167
|
+
return {
|
|
168
|
+
presets: ['module:@react-native/babel-preset'],
|
|
169
|
+
plugins: [['babel-plugin-react-compiler', ReactCompilerConfig]],
|
|
170
|
+
};
|
|
171
|
+
};
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
After changing Babel config, restart Metro with a cleared cache.
|
|
175
|
+
|
|
176
|
+
### Strategy 2: Opt Out Specific Components
|
|
177
|
+
|
|
178
|
+
Use the `"use no memo"` directive to skip optimization for specific components or files:
|
|
179
|
+
|
|
180
|
+
```jsx
|
|
181
|
+
function ProblematicComponent() {
|
|
182
|
+
'use no memo';
|
|
183
|
+
|
|
184
|
+
return <Text>Will not be optimized</Text>;
|
|
185
|
+
}
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
This is useful for temporarily opting out components that cause issues. Fix the underlying problem and remove the directive once resolved.
|
|
189
|
+
|
|
190
|
+
## Code Examples
|
|
191
|
+
|
|
192
|
+
### React Compiler Playground
|
|
193
|
+
|
|
194
|
+
Test transformations at [React Playground](https://playground.react.dev/).
|
|
195
|
+
|
|
196
|
+
### What Gets Optimized
|
|
197
|
+
|
|
198
|
+
```jsx
|
|
199
|
+
// Components - auto-memoized
|
|
200
|
+
const Button = ({ onPress, label }) => (
|
|
201
|
+
<Pressable onPress={onPress}>
|
|
202
|
+
<Text>{label}</Text>
|
|
203
|
+
</Pressable>
|
|
204
|
+
);
|
|
205
|
+
|
|
206
|
+
// Callbacks - auto-cached (no useCallback needed)
|
|
207
|
+
const handlePress = () => {
|
|
208
|
+
console.log('pressed');
|
|
209
|
+
};
|
|
210
|
+
|
|
211
|
+
// Expensive computations - auto-cached (no useMemo needed)
|
|
212
|
+
const filtered = items.filter((item) => item.active);
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
### What Breaks Compilation
|
|
216
|
+
|
|
217
|
+
```jsx
|
|
218
|
+
// BAD: Mutating props
|
|
219
|
+
const BadComponent = ({ items }) => {
|
|
220
|
+
items.push('new item'); // Mutation!
|
|
221
|
+
return <List data={items} />;
|
|
222
|
+
};
|
|
223
|
+
|
|
224
|
+
// BAD: Mutating during render
|
|
225
|
+
const BadMutation = () => {
|
|
226
|
+
const [items, setItems] = useState([]);
|
|
227
|
+
items.push('new'); // Mutation during render!
|
|
228
|
+
return <List data={items} />;
|
|
229
|
+
};
|
|
230
|
+
|
|
231
|
+
// BAD: Non-idempotent render
|
|
232
|
+
let counter = 0;
|
|
233
|
+
const BadRender = () => {
|
|
234
|
+
counter++; // Side effect during render!
|
|
235
|
+
return <Text>{counter}</Text>;
|
|
236
|
+
};
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
## Should You Remove Manual Memoization?
|
|
240
|
+
|
|
241
|
+
Improvements are primarily automatic. You can remove instances of `useCallback`, `useMemo`, and `React.memo` in favor of automatic memoization once the compiler is working correctly in your project.
|
|
242
|
+
|
|
243
|
+
**Note**: Class components will not be optimized. Migrate to function components for full benefits.
|
|
244
|
+
|
|
245
|
+
Expo's implementation only runs on application code (not node_modules), and only when bundling for the client (disabled in server rendering).
|
|
246
|
+
|
|
247
|
+
## Expected Performance Improvements
|
|
248
|
+
|
|
249
|
+
Expect the largest wins in components that currently rely on manual memoization discipline or have cascading re-renders. Already well-memoized code may show little change; keep the compiler only when profiling or maintenance cost justifies it.
|
|
250
|
+
|
|
251
|
+
## Common Pitfalls
|
|
252
|
+
|
|
253
|
+
- **Not fixing ESLint errors first**: When ESLint reports an error, the compiler skips that component—this is safe but means you miss optimization
|
|
254
|
+
- **Expecting it to fix bad patterns**: Compiler optimizes good code, doesn't fix bad code
|
|
255
|
+
- **Forgetting shallow comparison**: Like `memo`, compiler uses shallow comparison for objects/arrays
|
|
256
|
+
- **Not running healthcheck**: Always run `npx react-compiler-healthcheck@latest` before enabling
|
|
257
|
+
|
|
258
|
+
## Related Skills
|
|
259
|
+
|
|
260
|
+
- [js-profile-react.md](./js-profile-react.md) - Verify optimization impact
|
|
261
|
+
- [js-atomic-state.md](./js-atomic-state.md) - Alternative for state-related re-renders
|
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Uncontrolled Components
|
|
3
|
+
impact: HIGH
|
|
4
|
+
tags: textinput, forms, controlled, uncontrolled
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Skill: Uncontrolled Components
|
|
8
|
+
|
|
9
|
+
Fix TextInput synchronization and flickering issues by using the uncontrolled component pattern where React does not need to own every keystroke.
|
|
10
|
+
|
|
11
|
+
## Quick Pattern
|
|
12
|
+
|
|
13
|
+
**Before (controlled - may flicker on legacy arch):**
|
|
14
|
+
|
|
15
|
+
```jsx
|
|
16
|
+
<TextInput value={text} onChangeText={setText} />
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
**After (uncontrolled - native owns state):**
|
|
20
|
+
|
|
21
|
+
```jsx
|
|
22
|
+
<TextInput defaultValue={text} onChangeText={setText} />
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## When to Use
|
|
26
|
+
|
|
27
|
+
- TextInput flickers or shows wrong characters during fast typing
|
|
28
|
+
- Text input lags behind user input on low-end devices
|
|
29
|
+
- Using legacy (non-New Architecture) React Native
|
|
30
|
+
- Need maximum input responsiveness
|
|
31
|
+
- React does not need to transform, mask, validate, or own the value on every keystroke
|
|
32
|
+
|
|
33
|
+
## Prerequisites
|
|
34
|
+
|
|
35
|
+
- Understanding of React controlled vs uncontrolled components
|
|
36
|
+
- TextInput component in use
|
|
37
|
+
|
|
38
|
+
## Problem Description
|
|
39
|
+
|
|
40
|
+

|
|
41
|
+
|
|
42
|
+
The diagram shows what happens when typing "TEST" with a controlled `TextInput`:
|
|
43
|
+
|
|
44
|
+
1. User types "T" → `onChangeText('T')` fires
|
|
45
|
+
2. React calls `setValue('T')` → native updates to "T"
|
|
46
|
+
3. User types "E" → `onChangeText('TE')` fires
|
|
47
|
+
4. React calls `setValue('TE')` → native updates to "TE"
|
|
48
|
+
5. ...continues for each character
|
|
49
|
+
|
|
50
|
+
**The problem**: Each character requires a round-trip between native and JavaScript. On legacy architecture, if React state update is slow, native may show intermediate states (flicker).
|
|
51
|
+
|
|
52
|
+
**New Architecture note:** This issue is largely resolved in New Architecture, but uncontrolled pattern still provides best performance.
|
|
53
|
+
|
|
54
|
+
Use uncontrolled TextInput primarily as a responsiveness or legacy-architecture escape hatch. Keep controlled inputs when React must transform, mask, validate, or own the value on every keystroke.
|
|
55
|
+
|
|
56
|
+
## Step-by-Step Instructions
|
|
57
|
+
|
|
58
|
+
### 1. Identify Controlled TextInput
|
|
59
|
+
|
|
60
|
+
```jsx
|
|
61
|
+
// Controlled - value prop syncs state to native
|
|
62
|
+
const ControlledInput = () => {
|
|
63
|
+
const [value, setValue] = useState('');
|
|
64
|
+
|
|
65
|
+
return (
|
|
66
|
+
<TextInput
|
|
67
|
+
value={value} // This causes sync issues
|
|
68
|
+
onChangeText={setValue}
|
|
69
|
+
/>
|
|
70
|
+
);
|
|
71
|
+
};
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
### 2. Convert to Uncontrolled
|
|
75
|
+
|
|
76
|
+
Remove the `value` prop to make it uncontrolled:
|
|
77
|
+
|
|
78
|
+
```jsx
|
|
79
|
+
// Uncontrolled - native owns the state
|
|
80
|
+
const UncontrolledInput = () => {
|
|
81
|
+
const [value, setValue] = useState('');
|
|
82
|
+
|
|
83
|
+
return (
|
|
84
|
+
<TextInput
|
|
85
|
+
defaultValue={value} // Only sets initial value
|
|
86
|
+
onChangeText={setValue} // Still updates React state
|
|
87
|
+
/>
|
|
88
|
+
);
|
|
89
|
+
};
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
### 3. Use Ref for Programmatic Control
|
|
93
|
+
|
|
94
|
+
If you need to read/set value programmatically:
|
|
95
|
+
|
|
96
|
+
```jsx
|
|
97
|
+
const UncontrolledWithRef = () => {
|
|
98
|
+
const inputRef = useRef(null);
|
|
99
|
+
|
|
100
|
+
const clearInput = () => {
|
|
101
|
+
inputRef.current?.clear();
|
|
102
|
+
};
|
|
103
|
+
|
|
104
|
+
const getValue = () => {
|
|
105
|
+
// Use onChangeText to track value, or native methods
|
|
106
|
+
};
|
|
107
|
+
|
|
108
|
+
return (
|
|
109
|
+
<TextInput
|
|
110
|
+
ref={inputRef}
|
|
111
|
+
defaultValue=""
|
|
112
|
+
onChangeText={(text) => console.log('Current:', text)}
|
|
113
|
+
/>
|
|
114
|
+
);
|
|
115
|
+
};
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
## Code Examples
|
|
119
|
+
|
|
120
|
+
### Full Migration Example
|
|
121
|
+
|
|
122
|
+
**Before (Controlled):**
|
|
123
|
+
|
|
124
|
+
```jsx
|
|
125
|
+
const SearchInput = () => {
|
|
126
|
+
const [query, setQuery] = useState('');
|
|
127
|
+
const [results, setResults] = useState([]);
|
|
128
|
+
|
|
129
|
+
const handleChange = (text) => {
|
|
130
|
+
setQuery(text);
|
|
131
|
+
fetchResults(text).then(setResults);
|
|
132
|
+
};
|
|
133
|
+
|
|
134
|
+
return (
|
|
135
|
+
<View>
|
|
136
|
+
<TextInput
|
|
137
|
+
value={query} // Remove this
|
|
138
|
+
onChangeText={handleChange}
|
|
139
|
+
placeholder="Search..."
|
|
140
|
+
/>
|
|
141
|
+
<ResultsList data={results} />
|
|
142
|
+
</View>
|
|
143
|
+
);
|
|
144
|
+
};
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
**After (Uncontrolled):**
|
|
148
|
+
|
|
149
|
+
```jsx
|
|
150
|
+
const SearchInput = () => {
|
|
151
|
+
const [query, setQuery] = useState('');
|
|
152
|
+
const [results, setResults] = useState([]);
|
|
153
|
+
|
|
154
|
+
const handleChange = (text) => {
|
|
155
|
+
setQuery(text);
|
|
156
|
+
fetchResults(text).then(setResults);
|
|
157
|
+
};
|
|
158
|
+
|
|
159
|
+
return (
|
|
160
|
+
<View>
|
|
161
|
+
<TextInput
|
|
162
|
+
defaultValue="" // Initial value only
|
|
163
|
+
onChangeText={handleChange}
|
|
164
|
+
placeholder="Search..."
|
|
165
|
+
/>
|
|
166
|
+
<ResultsList data={results} />
|
|
167
|
+
</View>
|
|
168
|
+
);
|
|
169
|
+
};
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
### When You Need Value Control
|
|
173
|
+
|
|
174
|
+
For input masking or validation that modifies input:
|
|
175
|
+
|
|
176
|
+
```jsx
|
|
177
|
+
// Option 1: Accept the controlled behavior (may flicker)
|
|
178
|
+
const MaskedInput = () => {
|
|
179
|
+
const [value, setValue] = useState('');
|
|
180
|
+
|
|
181
|
+
const handleChange = (text) => {
|
|
182
|
+
// Phone mask: (123) 456-7890
|
|
183
|
+
const masked = maskPhone(text);
|
|
184
|
+
setValue(masked);
|
|
185
|
+
};
|
|
186
|
+
|
|
187
|
+
return (
|
|
188
|
+
<TextInput
|
|
189
|
+
value={value} // Necessary for masking
|
|
190
|
+
onChangeText={handleChange}
|
|
191
|
+
/>
|
|
192
|
+
);
|
|
193
|
+
};
|
|
194
|
+
|
|
195
|
+
// Option 2: Use a native masked input library
|
|
196
|
+
// react-native-masked-text handles this natively
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
## Decision Matrix
|
|
200
|
+
|
|
201
|
+
| Scenario | Recommendation |
|
|
202
|
+
|----------|---------------|
|
|
203
|
+
| Simple text input | Uncontrolled |
|
|
204
|
+
| Search/filter input | Uncontrolled |
|
|
205
|
+
| Form with validation on submit | Uncontrolled |
|
|
206
|
+
| Input masking (phone, credit card) | Controlled or native library |
|
|
207
|
+
| Character-by-character validation | Controlled |
|
|
208
|
+
| New Architecture app | Either works well |
|
|
209
|
+
|
|
210
|
+
## Common Pitfalls
|
|
211
|
+
|
|
212
|
+
- **Forgetting `defaultValue`**: Without it, input starts empty
|
|
213
|
+
- **Trying to clear with state**: Use `ref.current.clear()` instead
|
|
214
|
+
- **Mixing patterns**: Don't use both `value` and `defaultValue`
|
|
215
|
+
|
|
216
|
+
## Related Skills
|
|
217
|
+
|
|
218
|
+
- [js-profile-react.md](./js-profile-react.md) - Profile input performance
|
|
219
|
+
- [js-concurrent-react.md](./js-concurrent-react.md) - Defer expensive search operations
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Android 16 KB Page Size Alignment
|
|
3
|
+
impact: CRITICAL
|
|
4
|
+
tags: android, native, 16kb, alignment, page-size, google-play, third-party
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Android 16 KB page size alignment
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## Quick Reference
|
|
12
|
+
|
|
13
|
+
| Item | Details |
|
|
14
|
+
| ---------------------- | ---------------------------------------------------- |
|
|
15
|
+
| Google Play requirement | Apps and updates targeting Android 15+ must support 16 KB page sizes on 64-bit devices |
|
|
16
|
+
| React Native support | RN 0.79+ includes aligned RN-provided native binaries; still verify third-party `.so` files |
|
|
17
|
+
| What to check | Third-party native libraries (`.so` files) |
|
|
18
|
+
| Official documentation | [developer.android.com/guide/practices/page-sizes][] |
|
|
19
|
+
|
|
20
|
+
[developer.android.com/guide/practices/page-sizes]: https://developer.android.com/guide/practices/page-sizes
|
|
21
|
+
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
## Quick Command
|
|
25
|
+
|
|
26
|
+
Verify generated APK alignment using Android's official `zipalign` tool:
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
zipalign -c -P 16 -v 4 app-release.apk
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
If any 64-bit libraries (`arm64-v8a`, `x86_64`) show misalignment, they need updating.
|
|
33
|
+
|
|
34
|
+
For deeper ELF-level inspection, use Android's [check_elf_alignment.sh][] script.
|
|
35
|
+
|
|
36
|
+
[check_elf_alignment.sh]: https://cs.android.com/android/platform/superproject/main/+/main:system/extras/tools/check_elf_alignment.sh
|
|
37
|
+
|
|
38
|
+
---
|
|
39
|
+
|
|
40
|
+
## When to Check
|
|
41
|
+
|
|
42
|
+
React Native 0.79+ builds core binaries with correct alignment. However, **third-party
|
|
43
|
+
native libraries** may still be misaligned. Check alignment when:
|
|
44
|
+
|
|
45
|
+
* Adding or updating SDKs with native code
|
|
46
|
+
* Preparing a release for Google Play
|
|
47
|
+
* Investigating crashes on Android 15+ devices with 16 KB page size
|
|
48
|
+
|
|
49
|
+
---
|
|
50
|
+
|
|
51
|
+
## CI Integration
|
|
52
|
+
|
|
53
|
+
Add alignment checks to your release pipeline after producing release APKs. If you ship AABs, generate device APKs with your normal release tooling or `bundletool`, then run `zipalign` on those APKs:
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
zipalign -c -P 16 -v 4 app-release.apk 2>&1 | tee alignment.log
|
|
57
|
+
if grep -q "Verification FAILED" alignment.log; then exit 1; fi
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
## Step-by-Step
|
|
61
|
+
|
|
62
|
+
1. Build your release artifact
|
|
63
|
+
2. Generate or locate the release APK(s)
|
|
64
|
+
3. Run `zipalign` verification (see Quick Command)
|
|
65
|
+
4. If misaligned libraries are found, trace them to source packages (see below)
|
|
66
|
+
5. Update, replace, or remove the affected dependencies
|
|
67
|
+
|
|
68
|
+
For runtime testing, use the [16KB Android Emulator image][] or enable
|
|
69
|
+
"Boot with 16KB page size" on Pixel 8/8a/9 devices.
|
|
70
|
+
|
|
71
|
+
[16KB Android Emulator image]: https://developer.android.com/guide/practices/page-sizes#set-up-the-android-emulator-with-a-16-kb-based-system-image
|
|
72
|
+
|
|
73
|
+
---
|
|
74
|
+
|
|
75
|
+
## Tracing Misaligned Libraries
|
|
76
|
+
|
|
77
|
+
When `zipalign` reports a misaligned library like `libfoo.so`, find its source package:
|
|
78
|
+
|
|
79
|
+
```bash
|
|
80
|
+
# Find the .so file in node_modules
|
|
81
|
+
find node_modules -name "libfoo.so" 2>/dev/null
|
|
82
|
+
|
|
83
|
+
# Or search gradle files for references
|
|
84
|
+
grep -r "foo" node_modules/*/android --include="*.gradle" 2>/dev/null
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
Once identified, update the dependency or contact the vendor for a 16KB-compatible build.
|
|
88
|
+
|
|
89
|
+
---
|
|
90
|
+
|
|
91
|
+
## Common Pitfalls
|
|
92
|
+
|
|
93
|
+
* Waiting for Play Store rejection instead of checking in CI
|
|
94
|
+
* Assuming a React Native upgrade rebuilds third-party native binaries
|
|
95
|
+
* Only checking 32-bit ABIs (`armeabi-v7a`, `x86`) — these are not affected
|
|
96
|
+
* Using `zipalign` without the `-P 16` flag (checks 4 KB, not 16 KB)
|
|
97
|
+
* Validating only debug builds
|
|
98
|
+
|
|
99
|
+
---
|
|
100
|
+
|
|
101
|
+
## Fixing Alignment Issues
|
|
102
|
+
|
|
103
|
+
Alignment issues require **rebuilding** the native library with a compatible toolchain.
|
|
104
|
+
Repackaging alone does not fix them.
|
|
105
|
+
|
|
106
|
+
See [official remediation steps][] for detailed guidance.
|
|
107
|
+
|
|
108
|
+
[official remediation steps]: https://developer.android.com/guide/practices/page-sizes#build-app-16kb
|
|
109
|
+
|
|
110
|
+
---
|
|
111
|
+
|
|
112
|
+
## Related Skills
|
|
113
|
+
|
|
114
|
+
* [native-profiling.md](./native-profiling.md) — Native debugging tools
|