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,208 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Native Assets
|
|
3
|
+
impact: HIGH
|
|
4
|
+
tags: assets, images, asset-catalog, app-thinning
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Skill: Native Assets
|
|
8
|
+
|
|
9
|
+
Configure platform-specific asset delivery to reduce app download size.
|
|
10
|
+
|
|
11
|
+
## Quick Config
|
|
12
|
+
|
|
13
|
+
**iOS Asset Catalog (Build Phase):**
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
# Default RN template: the Xcode bundle script cd's to PROJECT_ROOT first.
|
|
17
|
+
export EXTRA_PACKAGER_ARGS="--asset-catalog-dest ios"
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
**Android**: Automatic via AAB — Play Store delivers correct density per device.
|
|
21
|
+
|
|
22
|
+
## When to Use
|
|
23
|
+
|
|
24
|
+
- Images bloating app size
|
|
25
|
+
- Different device densities need different assets
|
|
26
|
+
- Want to leverage App Store/Play Store optimization
|
|
27
|
+
- Using high-resolution images
|
|
28
|
+
|
|
29
|
+
## Concept: Size Suffixes
|
|
30
|
+
|
|
31
|
+
React Native convention for multiple resolutions:
|
|
32
|
+
|
|
33
|
+
```
|
|
34
|
+
assets/
|
|
35
|
+
├── image.jpg # 1x resolution (base)
|
|
36
|
+
├── image@2x.jpg # 2x resolution
|
|
37
|
+
└── image@3x.jpg # 3x resolution
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
```tsx
|
|
41
|
+
// React Native selects best one for device
|
|
42
|
+
<Image source={require('./assets/image.jpg')} />
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
## Android: Automatic Optimization
|
|
46
|
+
|
|
47
|
+
Android handles this automatically.
|
|
48
|
+
|
|
49
|
+
### How It Works
|
|
50
|
+
|
|
51
|
+
1. Build AAB:
|
|
52
|
+
```bash
|
|
53
|
+
cd android && ./gradlew bundleRelease
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
2. Metro places images in density folders:
|
|
57
|
+
```
|
|
58
|
+
android/app/build/outputs/bundle/release/
|
|
59
|
+
└── base/
|
|
60
|
+
└── res/
|
|
61
|
+
├── drawable-mdpi-v4/ # 1x
|
|
62
|
+
├── drawable-hdpi-v4/ # 1.5x
|
|
63
|
+
├── drawable-xhdpi-v4/ # 2x
|
|
64
|
+
├── drawable-xxhdpi-v4/ # 3x
|
|
65
|
+
└── drawable-xxxhdpi-v4/ # 4x
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
3. Play Store delivers only needed density per device.
|
|
69
|
+
|
|
70
|
+
**No configuration required** for Android.
|
|
71
|
+
|
|
72
|
+
## iOS: Asset Catalog Setup
|
|
73
|
+
|
|
74
|
+
iOS requires explicit configuration.
|
|
75
|
+
|
|
76
|
+
### Step 1: Create Asset Catalog
|
|
77
|
+
|
|
78
|
+
Create an asset catalog in the same directory you pass to `--asset-catalog-dest`:
|
|
79
|
+
|
|
80
|
+
```
|
|
81
|
+
ios/RNAssets.xcassets/
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
React Native's bundler writes image sets into `RNAssets.xcassets` under the destination directory. Keep the manual command and Xcode build phase destination consistent.
|
|
85
|
+
|
|
86
|
+
### Step 2: Configure Build Phase
|
|
87
|
+
|
|
88
|
+
In Xcode, add this before the React Native bundle command in the **Bundle React Native code and images** build phase:
|
|
89
|
+
|
|
90
|
+
```bash
|
|
91
|
+
export EXTRA_PACKAGER_ARGS="--asset-catalog-dest ios"
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
This assumes the default React Native build script, which changes directory to `PROJECT_ROOT` before invoking Metro. If a custom build phase runs from a different working directory, set `--asset-catalog-dest` relative to that working directory and verify the generated `RNAssets.xcassets` path.
|
|
95
|
+
|
|
96
|
+
### Step 3: Build
|
|
97
|
+
|
|
98
|
+
Run build to populate asset catalog:
|
|
99
|
+
|
|
100
|
+
```bash
|
|
101
|
+
npx react-native run-ios --mode Release
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
Or manually:
|
|
105
|
+
|
|
106
|
+
```bash
|
|
107
|
+
npx react-native bundle \
|
|
108
|
+
--entry-file index.js \
|
|
109
|
+
--bundle-output ios-bundle.js \
|
|
110
|
+
--platform ios \
|
|
111
|
+
--dev false \
|
|
112
|
+
--asset-catalog-dest ios \
|
|
113
|
+
--assets-dest ios/assets
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
### Step 4: Verify
|
|
117
|
+
|
|
118
|
+
After build, `RNAssets.xcassets` contains:
|
|
119
|
+
|
|
120
|
+
```
|
|
121
|
+
ios/RNAssets.xcassets/
|
|
122
|
+
└── assets_image_image.imageset/
|
|
123
|
+
├── Contents.json
|
|
124
|
+
├── image.jpg
|
|
125
|
+
├── image@2x.jpg
|
|
126
|
+
└── image@3x.jpg
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
App Store then delivers only needed resolution.
|
|
130
|
+
|
|
131
|
+
## Before/After Comparison
|
|
132
|
+
|
|
133
|
+
### Without Asset Catalog (All Variants)
|
|
134
|
+
|
|
135
|
+
```
|
|
136
|
+
App bundle contains:
|
|
137
|
+
├── image.jpg (100 KB)
|
|
138
|
+
├── image@2x.jpg (300 KB)
|
|
139
|
+
└── image@3x.jpg (600 KB)
|
|
140
|
+
Total: 1 MB
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
### With Asset Catalog (Device-Specific)
|
|
144
|
+
|
|
145
|
+
```
|
|
146
|
+
iPhone 15 Pro receives:
|
|
147
|
+
└── image@3x.jpg (600 KB)
|
|
148
|
+
Total: 600 KB (40% smaller)
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
## Asset Optimization Tips
|
|
152
|
+
|
|
153
|
+
### 1. Compress Images
|
|
154
|
+
|
|
155
|
+
Use tools before adding to project:
|
|
156
|
+
|
|
157
|
+
```bash
|
|
158
|
+
# ImageOptim (macOS)
|
|
159
|
+
# TinyPNG (web)
|
|
160
|
+
# sharp (programmatic)
|
|
161
|
+
|
|
162
|
+
npx sharp-cli input.jpg -o output.jpg --quality 80
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
### 2. Use Appropriate Formats
|
|
166
|
+
|
|
167
|
+
| Format | Best For |
|
|
168
|
+
|--------|----------|
|
|
169
|
+
| JPEG | Photos |
|
|
170
|
+
| PNG | Icons, transparency |
|
|
171
|
+
| WebP | Both (smaller) |
|
|
172
|
+
| SVG | Vector icons |
|
|
173
|
+
|
|
174
|
+
### 3. Separate Bundled Assets from Remote Images
|
|
175
|
+
|
|
176
|
+
Remote image caching libraries can help runtime image performance, but they do not reduce the size of images already bundled into the app.
|
|
177
|
+
|
|
178
|
+
## Verification
|
|
179
|
+
|
|
180
|
+
### iOS App Thinning Report
|
|
181
|
+
|
|
182
|
+
After export, check `App Thinning Size Report.txt`:
|
|
183
|
+
|
|
184
|
+
```
|
|
185
|
+
Variant: MyApp-<UUID>.ipa
|
|
186
|
+
Supported variant descriptors: iPhone15,2 ...
|
|
187
|
+
App size: 3.5 MB compressed, 10.6 MB uncompressed
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
### Use Emerge Tools
|
|
191
|
+
|
|
192
|
+
Upload IPA to see asset breakdown.
|
|
193
|
+
|
|
194
|
+
## Common Pitfalls
|
|
195
|
+
|
|
196
|
+
- **Inconsistent destination paths**: The build phase and manual bundle command should point at the same asset catalog parent directory
|
|
197
|
+
- **Missing build phase config**: Assets not processed
|
|
198
|
+
- **Not using size suffixes**: All variants included anyway
|
|
199
|
+
- **Forgetting to rebuild**: Changes need fresh build
|
|
200
|
+
|
|
201
|
+
## Future Note
|
|
202
|
+
|
|
203
|
+
As of the March 2026 book export, iOS asset catalog generation is not described as default. Verify current React Native release notes before applying this manually.
|
|
204
|
+
|
|
205
|
+
## Related Skills
|
|
206
|
+
|
|
207
|
+
- [bundle-analyze-app.md](./bundle-analyze-app.md) - Verify asset impact
|
|
208
|
+
- [bundle-r8-android.md](./bundle-r8-android.md) - Android code optimization
|
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: R8 Code Shrinking
|
|
3
|
+
impact: HIGH
|
|
4
|
+
tags: android, r8, proguard, minify, shrink
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Skill: R8 Code Shrinking
|
|
8
|
+
|
|
9
|
+
Enable R8 for Android to shrink, optimize, and obfuscate native code.
|
|
10
|
+
|
|
11
|
+
## Quick Config
|
|
12
|
+
|
|
13
|
+
```groovy
|
|
14
|
+
// android/app/build.gradle
|
|
15
|
+
def enableProguardInReleaseBuilds = true
|
|
16
|
+
|
|
17
|
+
android {
|
|
18
|
+
buildTypes {
|
|
19
|
+
release {
|
|
20
|
+
minifyEnabled true
|
|
21
|
+
shrinkResources true
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## When to Use
|
|
28
|
+
|
|
29
|
+
- Android app size too large
|
|
30
|
+
- Want basic obfuscation to raise reverse-engineering effort, not as a security boundary
|
|
31
|
+
- Building release APK/AAB
|
|
32
|
+
|
|
33
|
+
## What is R8?
|
|
34
|
+
|
|
35
|
+
R8 replaces ProGuard in Android:
|
|
36
|
+
- **Shrinks**: Removes unused code
|
|
37
|
+
- **Optimizes**: Improves bytecode
|
|
38
|
+
- **Obfuscates**: Renames classes/methods
|
|
39
|
+
|
|
40
|
+
**Compatibility**: Uses ProGuard configuration format.
|
|
41
|
+
|
|
42
|
+
## Step-by-Step Instructions
|
|
43
|
+
|
|
44
|
+
### 1. Enable R8
|
|
45
|
+
|
|
46
|
+
Edit `android/app/build.gradle`:
|
|
47
|
+
|
|
48
|
+
```groovy
|
|
49
|
+
def enableProguardInReleaseBuilds = true
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
This sets `minifyEnabled = true` for release builds.
|
|
53
|
+
|
|
54
|
+
### 2. Enable Resource Shrinking (Optional)
|
|
55
|
+
|
|
56
|
+
Further reduces size by removing unused resources:
|
|
57
|
+
|
|
58
|
+
```groovy
|
|
59
|
+
android {
|
|
60
|
+
buildTypes {
|
|
61
|
+
release {
|
|
62
|
+
minifyEnabled true
|
|
63
|
+
shrinkResources true // Requires minifyEnabled
|
|
64
|
+
|
|
65
|
+
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
For Expo projects, wire release minification through `android.enableMinifyInReleaseBuilds` and resource shrinking through `android.enableShrinkResourcesInReleaseBuilds`. In managed/prebuild projects, set these through `expo-build-properties` so they survive `expo prebuild`.
|
|
72
|
+
|
|
73
|
+
### 3. Configure ProGuard Rules (If Needed)
|
|
74
|
+
|
|
75
|
+
Edit `android/app/proguard-rules.pro`. React Native defaults are usually sufficient—only add rules when specific libraries break after enabling R8.
|
|
76
|
+
|
|
77
|
+
**Only add if using Firebase (`@react-native-firebase/*`):**
|
|
78
|
+
|
|
79
|
+
```proguard
|
|
80
|
+
-keep class io.invertase.firebase.** { *; }
|
|
81
|
+
-dontwarn io.invertase.firebase.**
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
**Only add if using Retrofit:**
|
|
85
|
+
|
|
86
|
+
```proguard
|
|
87
|
+
-keepattributes Signature
|
|
88
|
+
-keepattributes *Annotation*
|
|
89
|
+
-keep class retrofit2.** { *; }
|
|
90
|
+
-dontwarn retrofit2.**
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
See [Common Library Rules](#common-library-rules) and [Troubleshooting](#troubleshooting) for more examples.
|
|
94
|
+
|
|
95
|
+
### 4. Build and Test
|
|
96
|
+
|
|
97
|
+
```bash
|
|
98
|
+
cd android
|
|
99
|
+
./gradlew assembleRelease
|
|
100
|
+
# or
|
|
101
|
+
./gradlew bundleRelease
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
**Critical**: Test thoroughly! R8 can remove code it thinks is unused.
|
|
105
|
+
|
|
106
|
+
## ProGuard Rules Reference
|
|
107
|
+
|
|
108
|
+
| Rule | Effect |
|
|
109
|
+
|------|--------|
|
|
110
|
+
| `-keep class X` | Don't remove class X |
|
|
111
|
+
| `-keepclassmembers` | Keep members but allow rename |
|
|
112
|
+
| `-keepnames` | Keep names but allow removal if unused |
|
|
113
|
+
| `-dontwarn X` | Suppress warnings for X |
|
|
114
|
+
| `-dontobfuscate` | Disable obfuscation |
|
|
115
|
+
|
|
116
|
+
### Keep Entire Package
|
|
117
|
+
|
|
118
|
+
```proguard
|
|
119
|
+
-keep class com.mypackage.** { *; }
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
### Keep Classes with Annotation
|
|
123
|
+
|
|
124
|
+
```proguard
|
|
125
|
+
-keep @interface com.facebook.proguard.annotations.DoNotStrip
|
|
126
|
+
-keep @com.facebook.proguard.annotations.DoNotStrip class *
|
|
127
|
+
-keepclassmembers class * {
|
|
128
|
+
@com.facebook.proguard.annotations.DoNotStrip *;
|
|
129
|
+
}
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
## Disable Obfuscation (If Needed)
|
|
133
|
+
|
|
134
|
+
```proguard
|
|
135
|
+
# proguard-rules.pro
|
|
136
|
+
-dontobfuscate
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
Use when:
|
|
140
|
+
- Debugging crashes (stack traces more readable)
|
|
141
|
+
- Library requires class names
|
|
142
|
+
|
|
143
|
+
## Size Impact
|
|
144
|
+
|
|
145
|
+
Example from guide:
|
|
146
|
+
- **Without R8**: 9.5 MB
|
|
147
|
+
- **With R8**: 6.3 MB
|
|
148
|
+
- **Savings**: 33%
|
|
149
|
+
|
|
150
|
+
Larger apps may see 20-30% reduction.
|
|
151
|
+
|
|
152
|
+
## Troubleshooting
|
|
153
|
+
|
|
154
|
+
### App Crashes After R8
|
|
155
|
+
|
|
156
|
+
Usually means needed class was removed.
|
|
157
|
+
|
|
158
|
+
**Debug steps**:
|
|
159
|
+
|
|
160
|
+
1. Check crash log for class name
|
|
161
|
+
2. Add keep rule:
|
|
162
|
+
```proguard
|
|
163
|
+
-keep class com.example.CrashedClass { *; }
|
|
164
|
+
```
|
|
165
|
+
3. Rebuild and test
|
|
166
|
+
|
|
167
|
+
### Library Specific Rules
|
|
168
|
+
|
|
169
|
+
Many libraries provide ProGuard rules. Check:
|
|
170
|
+
- Library README
|
|
171
|
+
- Library's `consumer-proguard-rules.pro`
|
|
172
|
+
- Stack Overflow for library + proguard
|
|
173
|
+
|
|
174
|
+
### Common Library Rules
|
|
175
|
+
|
|
176
|
+
```proguard
|
|
177
|
+
# Hermes (usually auto-included)
|
|
178
|
+
-keep class com.facebook.hermes.unicode.** { *; }
|
|
179
|
+
|
|
180
|
+
# React Native
|
|
181
|
+
-keep class com.facebook.react.** { *; }
|
|
182
|
+
|
|
183
|
+
# Gson
|
|
184
|
+
-keepattributes Signature
|
|
185
|
+
-keep class com.google.gson.** { *; }
|
|
186
|
+
|
|
187
|
+
# OkHttp
|
|
188
|
+
-dontwarn okhttp3.**
|
|
189
|
+
-dontwarn okio.**
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
## Verification
|
|
193
|
+
|
|
194
|
+
### Check APK Size
|
|
195
|
+
|
|
196
|
+
```bash
|
|
197
|
+
# Build
|
|
198
|
+
./gradlew assembleRelease
|
|
199
|
+
|
|
200
|
+
# Check size
|
|
201
|
+
ls -la android/app/build/outputs/apk/release/
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
### Use Ruler for Detailed Analysis
|
|
205
|
+
|
|
206
|
+
See [bundle-analyze-app.md](./bundle-analyze-app.md).
|
|
207
|
+
|
|
208
|
+
### Verify Obfuscation
|
|
209
|
+
|
|
210
|
+
Decompile APK to check class names are obfuscated:
|
|
211
|
+
|
|
212
|
+
```bash
|
|
213
|
+
# Using jadx or similar
|
|
214
|
+
jadx android/app/build/outputs/apk/release/app-release.apk
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
### Verify Runtime Behavior
|
|
218
|
+
|
|
219
|
+
Use `agent-device` to install or open the release build, navigate critical flows, capture snapshots/screenshots, and collect logs. If it is missing and release verification is needed, install it through the environment's approved/trusted path or ask the user to install or enable it. Read the `agent-device` skill or CLI help when available before writing exact commands.
|
|
220
|
+
|
|
221
|
+
## Common Pitfalls
|
|
222
|
+
|
|
223
|
+
- **Not testing release build**: Always QA with R8 enabled
|
|
224
|
+
- **Missing library rules**: Check library docs
|
|
225
|
+
- **Over-keeping**: Too many keep rules negates benefits
|
|
226
|
+
- **Reflection**: Code using reflection may break
|
|
227
|
+
|
|
228
|
+
## Related Skills
|
|
229
|
+
|
|
230
|
+
- [bundle-analyze-app.md](./bundle-analyze-app.md) - Measure size impact
|
|
231
|
+
- [bundle-native-assets.md](./bundle-native-assets.md) - Further size reduction
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Tree Shaking
|
|
3
|
+
impact: HIGH
|
|
4
|
+
tags: bundle, tree-shaking, dead-code, metro, repack
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Skill: Tree Shaking
|
|
8
|
+
|
|
9
|
+
Enable dead code elimination to remove unused exports from your JavaScript bundle.
|
|
10
|
+
|
|
11
|
+
## Quick Config
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
# .env (Expo SDK 52+)
|
|
15
|
+
EXPO_UNSTABLE_METRO_OPTIMIZE_GRAPH=1
|
|
16
|
+
EXPO_UNSTABLE_TREE_SHAKING=1
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
```javascript
|
|
20
|
+
// metro.config.js
|
|
21
|
+
config.transformer.getTransformOptions = async () => ({
|
|
22
|
+
transform: { experimentalImportSupport: true },
|
|
23
|
+
});
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
```javascript
|
|
27
|
+
// babel.config.js (non-Expo projects must set `disableImportExportTransform`)
|
|
28
|
+
module.exports = {
|
|
29
|
+
presets: [
|
|
30
|
+
[
|
|
31
|
+
'module:@react-native/babel-preset',
|
|
32
|
+
{ disableImportExportTransform: true },
|
|
33
|
+
],
|
|
34
|
+
],
|
|
35
|
+
};
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
## When to Use
|
|
39
|
+
|
|
40
|
+
- Bundle includes unused library code
|
|
41
|
+
- Want automatic barrel export optimization
|
|
42
|
+
- Using Expo SDK 52+ (recommended approach)
|
|
43
|
+
- Project already uses Re.Pack (`@callstack/repack`)
|
|
44
|
+
|
|
45
|
+
## Platform Support
|
|
46
|
+
|
|
47
|
+
| Bundler | Tree Shaking | Notes |
|
|
48
|
+
|---------|--------------|-------|
|
|
49
|
+
| Metro | No general tree shaking | Platform/dev-only shaking exists; use specialized tooling for unused exports |
|
|
50
|
+
| Expo SDK 52+ | Experimental unused import/export removal | Production only; requires ESM and side-effect-safe modules |
|
|
51
|
+
| Expo SDK 54+ | Verify defaults | Import support is documented as default; tree-shaking env toggles may still be required |
|
|
52
|
+
| Re.Pack | Yes | Via Webpack/Rspack optimizations and minification |
|
|
53
|
+
|
|
54
|
+
## Setup: Expo SDK 52+
|
|
55
|
+
|
|
56
|
+
### 1. Enable Import Support
|
|
57
|
+
|
|
58
|
+
```javascript
|
|
59
|
+
// metro.config.js
|
|
60
|
+
const { getDefaultConfig } = require('expo/metro-config');
|
|
61
|
+
|
|
62
|
+
const config = getDefaultConfig(__dirname);
|
|
63
|
+
|
|
64
|
+
config.transformer.getTransformOptions = async () => ({
|
|
65
|
+
transform: {
|
|
66
|
+
experimentalImportSupport: true,
|
|
67
|
+
},
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
module.exports = config;
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
### 2. Enable Tree Shaking
|
|
74
|
+
|
|
75
|
+
Create/edit `.env`:
|
|
76
|
+
|
|
77
|
+
```bash
|
|
78
|
+
EXPO_UNSTABLE_METRO_OPTIMIZE_GRAPH=1
|
|
79
|
+
EXPO_UNSTABLE_TREE_SHAKING=1
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
**Note**: Only applies in production builds.
|
|
83
|
+
|
|
84
|
+
## Setup: Metro with ESBuild
|
|
85
|
+
|
|
86
|
+
```bash
|
|
87
|
+
npm install @rnx-kit/metro-serializer-esbuild
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
Configure in metro.config.js.
|
|
91
|
+
|
|
92
|
+
## Setup: Re.Pack (Only If Already Installed)
|
|
93
|
+
|
|
94
|
+
> **Important**: Re.Pack (`@callstack/repack`) is a custom bundler using Rspack/Webpack. Only apply these instructions if the project already has Re.Pack configured. Do not suggest migrating a codebase to Re.Pack—it's rarely necessary and requires significant setup.
|
|
95
|
+
|
|
96
|
+
**If project has `@callstack/repack` in dependencies:**
|
|
97
|
+
|
|
98
|
+
Tree shaking is enabled by default with Rspack. Verify in config:
|
|
99
|
+
|
|
100
|
+
```javascript
|
|
101
|
+
// rspack.config.js or webpack.config.js
|
|
102
|
+
module.exports = {
|
|
103
|
+
optimization: {
|
|
104
|
+
usedExports: true, // Mark unused exports
|
|
105
|
+
minimize: true, // Remove during minification
|
|
106
|
+
},
|
|
107
|
+
};
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
## Platform Shaking
|
|
111
|
+
|
|
112
|
+
Code inside `Platform.OS` and `Platform.select` checks is removed for other platforms:
|
|
113
|
+
|
|
114
|
+
```tsx
|
|
115
|
+
// IMPORTANT: import Platform directly from 'react-native'
|
|
116
|
+
import { Platform } from 'react-native';
|
|
117
|
+
|
|
118
|
+
if (Platform.OS === 'ios') {
|
|
119
|
+
// Removed from Android bundle
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
if (Platform.select({ ios: true, android: false }) === 'ios') {
|
|
123
|
+
// Removed from Android bundle
|
|
124
|
+
}
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
**Critical**: Must use direct import. This does NOT work:
|
|
128
|
+
|
|
129
|
+
```tsx
|
|
130
|
+
import * as RN from 'react-native';
|
|
131
|
+
if (RN.Platform.OS === 'ios') {
|
|
132
|
+
// NOT removed - optimization fails
|
|
133
|
+
}
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
For non-Expo projects, requires both `experimentalImportSupport: true` in Metro config and `disableImportExportTransform: true` in Babel config.
|
|
137
|
+
|
|
138
|
+
Impact: Savings from enabling platform shaking on a bare React Native Community CLI project are:
|
|
139
|
+
- 5% smaller Hermes bytecode (2.79 MB → 2.64 MB)
|
|
140
|
+
- 15% smaller minified JS bundle (1 MB → 0.85 MB)
|
|
141
|
+
|
|
142
|
+
## Requirements for Tree Shaking
|
|
143
|
+
|
|
144
|
+
### ESM Imports Required
|
|
145
|
+
|
|
146
|
+
```tsx
|
|
147
|
+
// ✅ ESM - Tree shakeable
|
|
148
|
+
import { foo } from './module';
|
|
149
|
+
|
|
150
|
+
// ❌ CommonJS - Not tree shakeable
|
|
151
|
+
const { foo } = require('./module');
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
### Side Effects Declaration
|
|
155
|
+
|
|
156
|
+
Libraries must declare side-effect-free in `package.json`:
|
|
157
|
+
|
|
158
|
+
```json
|
|
159
|
+
{
|
|
160
|
+
"sideEffects": false
|
|
161
|
+
}
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
Or specify files with side effects:
|
|
165
|
+
|
|
166
|
+
```json
|
|
167
|
+
{
|
|
168
|
+
"sideEffects": ["*.css", "./src/polyfills.js"]
|
|
169
|
+
}
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
## Size Impact
|
|
173
|
+
|
|
174
|
+
| Bundle Type | Metro (MB) | Re.Pack (MB) | Change |
|
|
175
|
+
| ----------------- | ---------- | ------------ | -------- |
|
|
176
|
+
| Production | 35.63 | 38.48 | +8% |
|
|
177
|
+
| Prod Minified | 15.54 | 13.36 | **-14%** |
|
|
178
|
+
| Prod HBC | 21.79 | 19.35 | **-11%** |
|
|
179
|
+
| Prod Minified HBC | 21.62 | 19.05 | **-12%** |
|
|
180
|
+
|
|
181
|
+
**Expected improvement**: 10-15% bundle size reduction.
|
|
182
|
+
|
|
183
|
+
## Verification
|
|
184
|
+
|
|
185
|
+
1. Build production bundle (see [bundle-analyze-js.md](./bundle-analyze-js.md))
|
|
186
|
+
2. Analyze with source-map-explorer (see [bundle-analyze-js.md](./bundle-analyze-js.md))
|
|
187
|
+
3. Search for functions you know are unused
|
|
188
|
+
4. If found → tree shaking not working
|
|
189
|
+
|
|
190
|
+
### Test Example
|
|
191
|
+
|
|
192
|
+
```tsx
|
|
193
|
+
// test-treeshake.js
|
|
194
|
+
export const usedFunction = () => 'used';
|
|
195
|
+
export const unusedFunction = () => 'unused'; // Should be removed
|
|
196
|
+
|
|
197
|
+
// app.js
|
|
198
|
+
import { usedFunction } from './test-treeshake';
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
After building, search bundle for `unusedFunction`. Should not exist.
|
|
202
|
+
|
|
203
|
+
## Common Pitfalls
|
|
204
|
+
|
|
205
|
+
- **Not using production build**: Tree shaking only in prod
|
|
206
|
+
- **CommonJS modules**: Need ESM for full effectiveness
|
|
207
|
+
- **Side effects not declared**: Library may not be shakeable
|
|
208
|
+
- **Dynamic imports**: `require(variable)` prevents analysis
|
|
209
|
+
- **Babel/Metro config mismatch**: `disableImportExportTransform` must match `experimentalImportSupport`
|
|
210
|
+
|
|
211
|
+
## Related Skills
|
|
212
|
+
|
|
213
|
+
- [bundle-analyze-js.md](./bundle-analyze-js.md) - Verify tree shaking effect
|
|
214
|
+
- [bundle-barrel-exports.md](./bundle-barrel-exports.md) - Manual alternative
|
|
215
|
+
- [bundle-code-splitting.md](./bundle-code-splitting.md) - Remote chunk loading safeguards
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|