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,255 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Remote Chunk Loading
|
|
3
|
+
impact: MEDIUM
|
|
4
|
+
tags: code-splitting, lazy-loading, chunks, release-artifacts, remote-code
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Skill: Remote Chunk Loading
|
|
8
|
+
|
|
9
|
+
Harden remote JavaScript chunk loading when a React Native app already uses Re.Pack or has an explicit remote-code-loading requirement.
|
|
10
|
+
|
|
11
|
+
## Quick Pattern
|
|
12
|
+
|
|
13
|
+
**Before (static import):**
|
|
14
|
+
|
|
15
|
+
```jsx
|
|
16
|
+
import SettingsScreen from './screens/SettingsScreen';
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
**After (lazy loaded chunk):**
|
|
20
|
+
|
|
21
|
+
```jsx
|
|
22
|
+
const SettingsScreen = React.lazy(() =>
|
|
23
|
+
import(/* webpackChunkName: "settings" */ './screens/SettingsScreen')
|
|
24
|
+
);
|
|
25
|
+
|
|
26
|
+
<Suspense fallback={<Loading />}>
|
|
27
|
+
<SettingsScreen />
|
|
28
|
+
</Suspense>
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## When to Use
|
|
32
|
+
|
|
33
|
+
Consider code splitting when:
|
|
34
|
+
- **Not using Hermes** (JSC/V8 benefits more)
|
|
35
|
+
- App size approaches app-store or base-module limits
|
|
36
|
+
- The app already has a micro-frontend architecture
|
|
37
|
+
- Loading features based on user permissions
|
|
38
|
+
- Other bundle-size optimizations are exhausted
|
|
39
|
+
- Remote delivery is an explicit product or release requirement
|
|
40
|
+
|
|
41
|
+
Do not recommend adopting Re.Pack for ordinary bundle-size work. Keep the default path on Metro/Expo unless remote chunk loading is already present or specifically required.
|
|
42
|
+
|
|
43
|
+
**Note**: Hermes already uses memory mapping for efficient bundle reading. Benefits of code splitting are minimal with Hermes or even counterproductive in some cases.
|
|
44
|
+
|
|
45
|
+
## Security Model
|
|
46
|
+
|
|
47
|
+
Chunks are executable application code. Prefer chunks packaged with the app or resolved from a release manifest produced by your CI. Hosted chunks are acceptable only when they are first-party release artifacts, not arbitrary runtime URLs.
|
|
48
|
+
|
|
49
|
+
Keep these guardrails in place:
|
|
50
|
+
- Serve chunks only from a first-party, HTTPS-only origin you control
|
|
51
|
+
- Resolve `scriptId` through a fixed allowlist or signed release manifest
|
|
52
|
+
- If using Re.Pack, enable code signing for remotely hosted chunks and use strict signature verification in production
|
|
53
|
+
- Fail closed if a chunk is missing or unexpected
|
|
54
|
+
- Do not load chunks from user-controlled input, query params, or third-party domains
|
|
55
|
+
|
|
56
|
+
## Prerequisites
|
|
57
|
+
|
|
58
|
+
- Project already uses Re.Pack, or remote chunk loading is an explicit requirement approved after measuring simpler alternatives
|
|
59
|
+
- Remote chunks are produced by the same release pipeline as the app
|
|
60
|
+
- Chunk locations come from a fixed allowlist or signed release manifest
|
|
61
|
+
|
|
62
|
+
If the project does not already use Re.Pack, do not start here. First confirm Metro/Expo bundle analysis, import cleanup, asset cleanup, native app-size work, and store delivery constraints.
|
|
63
|
+
|
|
64
|
+
## Step-by-Step Instructions
|
|
65
|
+
|
|
66
|
+
### 1. Create Split Point with React.lazy
|
|
67
|
+
|
|
68
|
+
```tsx
|
|
69
|
+
// BEFORE: Static import
|
|
70
|
+
import SettingsScreen from './screens/SettingsScreen';
|
|
71
|
+
|
|
72
|
+
// AFTER: Dynamic import (creates split point)
|
|
73
|
+
const SettingsScreen = React.lazy(() =>
|
|
74
|
+
import(/* webpackChunkName: "settings" */ './screens/SettingsScreen')
|
|
75
|
+
);
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
### 2. Wrap with Suspense
|
|
79
|
+
|
|
80
|
+
```tsx
|
|
81
|
+
import React, { Suspense } from 'react';
|
|
82
|
+
|
|
83
|
+
const App = () => {
|
|
84
|
+
return (
|
|
85
|
+
<Suspense fallback={<LoadingSpinner />}>
|
|
86
|
+
<SettingsScreen />
|
|
87
|
+
</Suspense>
|
|
88
|
+
);
|
|
89
|
+
};
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
### 3. Configure Chunk Loading
|
|
93
|
+
|
|
94
|
+
```jsx
|
|
95
|
+
// index.js (before AppRegistry)
|
|
96
|
+
import { ScriptManager, Script } from '@callstack/repack/client';
|
|
97
|
+
|
|
98
|
+
const RELEASE_CHUNKS = Object.freeze({
|
|
99
|
+
settings: {
|
|
100
|
+
release: '42',
|
|
101
|
+
},
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
ScriptManager.shared.addResolver(async (scriptId) => {
|
|
105
|
+
if (__DEV__) {
|
|
106
|
+
return {
|
|
107
|
+
url: Script.getDevServerURL(scriptId),
|
|
108
|
+
cache: false,
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
const chunk = RELEASE_CHUNKS[scriptId];
|
|
113
|
+
|
|
114
|
+
if (!chunk) {
|
|
115
|
+
throw new Error(`Unknown chunk: ${scriptId}`);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
return {
|
|
119
|
+
url: Script.getRemoteURL(
|
|
120
|
+
getFirstPartyChunkBaseURL(scriptId, chunk.release)
|
|
121
|
+
),
|
|
122
|
+
verifyScriptSignature: 'strict',
|
|
123
|
+
};
|
|
124
|
+
});
|
|
125
|
+
|
|
126
|
+
function getFirstPartyChunkBaseURL(scriptId, release) {
|
|
127
|
+
// App-owned helper: read a signed CI manifest and return the first-party
|
|
128
|
+
// base URL without ".chunk.bundle"; Script.getRemoteURL appends it.
|
|
129
|
+
// Do not accept hostnames, paths, or script IDs from runtime input.
|
|
130
|
+
return ReleaseManifest.getChunkBaseURL({ scriptId, release });
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
AppRegistry.registerComponent(appName, () => App);
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
For app-bundled chunks in a Re.Pack project, configure `extraChunks` with `type: 'local'` and resolve those script IDs from the filesystem:
|
|
137
|
+
|
|
138
|
+
```jsx
|
|
139
|
+
if (LOCAL_CHUNKS.has(scriptId)) {
|
|
140
|
+
return {
|
|
141
|
+
url: Script.getFileSystemURL(scriptId),
|
|
142
|
+
absolute: true,
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
### 4. Build and Deploy Chunks
|
|
148
|
+
|
|
149
|
+
Build generates:
|
|
150
|
+
- `index.bundle` - Main bundle
|
|
151
|
+
- `settings.chunk.bundle` - Lazy-loaded chunk
|
|
152
|
+
|
|
153
|
+
Remote chunks are written to `build/output/<platform>/remotes` by default. Deploy chunks as first-party release artifacts. Prefer app-bundled assets; if hosted, publish them through CI to an app-owned HTTPS origin and keep the allowlist or signed manifest in sync with the app release.
|
|
154
|
+
|
|
155
|
+
## Complete Example
|
|
156
|
+
|
|
157
|
+
```tsx
|
|
158
|
+
// App.tsx
|
|
159
|
+
import React, { Suspense, useState } from 'react';
|
|
160
|
+
import { Button, View, ActivityIndicator } from 'react-native';
|
|
161
|
+
|
|
162
|
+
// Lazy load heavy feature
|
|
163
|
+
const HeavyFeature = React.lazy(() =>
|
|
164
|
+
import(/* webpackChunkName: "heavy-feature" */ './HeavyFeature')
|
|
165
|
+
);
|
|
166
|
+
|
|
167
|
+
const App = () => {
|
|
168
|
+
const [showFeature, setShowFeature] = useState(false);
|
|
169
|
+
|
|
170
|
+
return (
|
|
171
|
+
<View>
|
|
172
|
+
<Button
|
|
173
|
+
title="Load Feature"
|
|
174
|
+
onPress={() => setShowFeature(true)}
|
|
175
|
+
/>
|
|
176
|
+
|
|
177
|
+
{showFeature && (
|
|
178
|
+
<Suspense fallback={<ActivityIndicator />}>
|
|
179
|
+
<HeavyFeature />
|
|
180
|
+
</Suspense>
|
|
181
|
+
)}
|
|
182
|
+
</View>
|
|
183
|
+
);
|
|
184
|
+
};
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
## Module Federation
|
|
188
|
+
|
|
189
|
+
Only use Module Federation when the app already has a micro-frontend architecture and the organizational boundary is worth the runtime trust boundary:
|
|
190
|
+
|
|
191
|
+
```tsx
|
|
192
|
+
// Host app loads remote module
|
|
193
|
+
const RemoteModule = React.lazy(() =>
|
|
194
|
+
import('remote-app/Module')
|
|
195
|
+
);
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
Federation increases the trust boundary. Keep the same first-party origin, release-manifest, code-signing, and allowlist rules as above.
|
|
199
|
+
|
|
200
|
+
## Caching Strategy
|
|
201
|
+
|
|
202
|
+
```tsx
|
|
203
|
+
import AsyncStorage from '@react-native-async-storage/async-storage';
|
|
204
|
+
|
|
205
|
+
ScriptManager.shared.setStorage(AsyncStorage);
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
Set storage before adding resolvers so Re.Pack can cache resolved script locator data. Return `cache: false` for dev server chunks or any script that should bypass caching.
|
|
209
|
+
|
|
210
|
+
## When NOT to Use
|
|
211
|
+
|
|
212
|
+
| Scenario | Why Not |
|
|
213
|
+
|----------|---------|
|
|
214
|
+
| Using Hermes | mmap already efficient |
|
|
215
|
+
| Small app | Overhead not worth it |
|
|
216
|
+
| Simple navigation | Native navigation better |
|
|
217
|
+
| Quick iteration needed | Added complexity |
|
|
218
|
+
|
|
219
|
+
## Hermes Memory Mapping
|
|
220
|
+
|
|
221
|
+
Hermes reads bytecode lazily via mmap:
|
|
222
|
+
- Only loads executed code into memory
|
|
223
|
+
- No parse step needed
|
|
224
|
+
- Code splitting provides marginal benefit
|
|
225
|
+
|
|
226
|
+
## Verification
|
|
227
|
+
|
|
228
|
+
```tsx
|
|
229
|
+
// Check if chunk loaded correctly
|
|
230
|
+
ScriptManager.shared.on('loading', (script) => {
|
|
231
|
+
console.log(`Loading: ${script.scriptId}`);
|
|
232
|
+
});
|
|
233
|
+
|
|
234
|
+
ScriptManager.shared.on('loaded', (script) => {
|
|
235
|
+
console.log(`Loaded: ${script.scriptId}`);
|
|
236
|
+
});
|
|
237
|
+
|
|
238
|
+
ScriptManager.shared.on('error', (error) => {
|
|
239
|
+
console.error('Script loading failed:', error);
|
|
240
|
+
});
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
## Common Pitfalls
|
|
244
|
+
|
|
245
|
+
- **Forgetting Suspense**: Lazy components need fallback
|
|
246
|
+
- **Wrong CDN path**: Chunks 404 in production
|
|
247
|
+
- **No caching**: Re-downloads on every load
|
|
248
|
+
- **Too many chunks**: Network overhead exceeds savings
|
|
249
|
+
- **Untrusted chunk source**: JS chunks from third-party or user-controlled origins are equivalent to remote code execution
|
|
250
|
+
|
|
251
|
+
## Related Skills
|
|
252
|
+
|
|
253
|
+
- [bundle-tree-shaking.md](./bundle-tree-shaking.md) - Tree-shaking caveats
|
|
254
|
+
- [bundle-analyze-js.md](./bundle-analyze-js.md) - Measure chunk sizes
|
|
255
|
+
- [native-measure-tti.md](./native-measure-tti.md) - Verify TTI impact
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Disable JS Bundle Compression
|
|
3
|
+
impact: HIGH
|
|
4
|
+
tags: android, hermes, mmap, tti, startup
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Skill: Disable JS Bundle Compression
|
|
8
|
+
|
|
9
|
+
Disable Android JS bundle compression to enable Hermes memory mapping for faster startup on React Native 0.78 and earlier.
|
|
10
|
+
|
|
11
|
+
## Quick Config
|
|
12
|
+
|
|
13
|
+
```groovy
|
|
14
|
+
// android/app/build.gradle, React Native 0.78 and earlier fallback
|
|
15
|
+
android {
|
|
16
|
+
androidResources {
|
|
17
|
+
noCompress += ["bundle"]
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
**Note**: React Native 0.79+ defaults to uncompressed Android JS bundles. Prefer checking/toggling `react { enableBundleCompression = false }` there instead of adding `androidResources.noCompress` manually.
|
|
23
|
+
|
|
24
|
+
## When to Use
|
|
25
|
+
|
|
26
|
+
- Android app using Hermes
|
|
27
|
+
- Want faster TTI (Time to Interactive)
|
|
28
|
+
- Willing to trade install size for startup speed
|
|
29
|
+
- React Native version is 0.78 or earlier, skip otherwise (see applicability)
|
|
30
|
+
|
|
31
|
+
## Background
|
|
32
|
+
|
|
33
|
+
Android compresses most files in APK/AAB by default, including `index.android.bundle`.
|
|
34
|
+
|
|
35
|
+
**Problem**: Compressed files can't be memory-mapped (mmap).
|
|
36
|
+
|
|
37
|
+
**Impact**: Hermes must decompress before reading, losing one of its key optimizations.
|
|
38
|
+
|
|
39
|
+
## How Hermes Memory Mapping Works
|
|
40
|
+
|
|
41
|
+
Without compression:
|
|
42
|
+
1. Hermes opens bytecode file
|
|
43
|
+
2. OS memory-maps directly to disk
|
|
44
|
+
3. Only pages actually accessed are loaded
|
|
45
|
+
4. **Result**: Fast startup, low memory
|
|
46
|
+
|
|
47
|
+
With compression:
|
|
48
|
+
1. Android decompresses entire bundle
|
|
49
|
+
2. Loaded into memory
|
|
50
|
+
3. Then Hermes processes
|
|
51
|
+
4. **Result**: Slower startup, higher memory
|
|
52
|
+
|
|
53
|
+
## Step-by-Step Implementation
|
|
54
|
+
|
|
55
|
+
### Edit build.gradle
|
|
56
|
+
|
|
57
|
+
For React Native 0.78 and earlier, edit `android/app/build.gradle`:
|
|
58
|
+
|
|
59
|
+
```groovy
|
|
60
|
+
android {
|
|
61
|
+
androidResources {
|
|
62
|
+
noCompress += ["bundle"]
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
### Full Context
|
|
68
|
+
|
|
69
|
+
```groovy
|
|
70
|
+
android {
|
|
71
|
+
namespace "com.myapp"
|
|
72
|
+
defaultConfig {
|
|
73
|
+
applicationId "com.myapp"
|
|
74
|
+
// ...
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
androidResources {
|
|
78
|
+
noCompress += ["bundle"]
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
buildTypes {
|
|
82
|
+
release {
|
|
83
|
+
minifyEnabled true
|
|
84
|
+
// ...
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
### Rebuild
|
|
91
|
+
|
|
92
|
+
```bash
|
|
93
|
+
cd android
|
|
94
|
+
./gradlew clean
|
|
95
|
+
./gradlew bundleRelease
|
|
96
|
+
# or
|
|
97
|
+
./gradlew assembleRelease
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
## Trade-offs
|
|
101
|
+
|
|
102
|
+
| Metric | Without Change | With Change |
|
|
103
|
+
|--------|----------------|-------------|
|
|
104
|
+
| Download size | Same | Same |
|
|
105
|
+
| Install size | Smaller | **+8% larger** |
|
|
106
|
+
| TTI | Slower | **-16% faster** |
|
|
107
|
+
|
|
108
|
+
**Real example**: 75.9 MB install → 82 MB install, but 450ms faster startup.
|
|
109
|
+
|
|
110
|
+
## Applicability
|
|
111
|
+
|
|
112
|
+
**React Native 0.78 and earlier**: Apply this optimization manually.
|
|
113
|
+
|
|
114
|
+
**React Native 0.79+**: Skip this unless the project explicitly enabled bundle compression.
|
|
115
|
+
|
|
116
|
+
## Verification
|
|
117
|
+
|
|
118
|
+
### Check APK Contents
|
|
119
|
+
|
|
120
|
+
```bash
|
|
121
|
+
# Unzip APK
|
|
122
|
+
unzip app-release.apk -d apk-contents
|
|
123
|
+
|
|
124
|
+
# Check if bundle is compressed
|
|
125
|
+
file apk-contents/assets/index.android.bundle
|
|
126
|
+
# Should show: "data" (not "gzip compressed")
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
### Measure TTI Impact
|
|
130
|
+
|
|
131
|
+
Use performance markers (see [native-measure-tti.md](./native-measure-tti.md)) to compare before/after.
|
|
132
|
+
|
|
133
|
+
## Multiple File Types
|
|
134
|
+
|
|
135
|
+
If you have other files that benefit from mmap:
|
|
136
|
+
|
|
137
|
+
```groovy
|
|
138
|
+
androidResources {
|
|
139
|
+
noCompress += ["bundle", "hbc", "data"]
|
|
140
|
+
}
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
## Common Pitfalls
|
|
144
|
+
|
|
145
|
+
- **Not rebuilding**: Change requires clean build
|
|
146
|
+
- **Wrong config location**: Must be in `android` block
|
|
147
|
+
- **Ignoring size increase**: Monitor user feedback on install size
|
|
148
|
+
- **Already default**: Check if React Native version includes this
|
|
149
|
+
|
|
150
|
+
## Expo Notes
|
|
151
|
+
|
|
152
|
+
For Expo projects, run `npx expo prebuild` first to generate `android/` folder, then apply the `build.gradle` changes. Add `android/` to version control or use a [config plugin](https://docs.expo.dev/config-plugins/introduction/) for persistent changes.
|
|
153
|
+
|
|
154
|
+
## Should You Enable This?
|
|
155
|
+
|
|
156
|
+
| Scenario | Recommendation |
|
|
157
|
+
|----------|---------------|
|
|
158
|
+
| RN 0.78 or earlier startup-critical app | ✅ Enable |
|
|
159
|
+
| Storage-sensitive users | ⚠️ Test impact |
|
|
160
|
+
| Already fast TTI | Maybe not worth it |
|
|
161
|
+
| RN 0.79+ default config | Skip |
|
|
162
|
+
|
|
163
|
+
## Related Skills
|
|
164
|
+
|
|
165
|
+
- [native-measure-tti.md](./native-measure-tti.md) - Measure TTI improvement
|
|
166
|
+
- [bundle-analyze-app.md](./bundle-analyze-app.md) - Check size impact
|
|
167
|
+
- [bundle-r8-android.md](./bundle-r8-android.md) - Offset size increase
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Determine Library Size
|
|
3
|
+
impact: MEDIUM
|
|
4
|
+
tags: dependencies, bundlephobia, library-size
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Skill: Determine Library Size
|
|
8
|
+
|
|
9
|
+
Evaluate third-party library size impact before adding to your project.
|
|
10
|
+
|
|
11
|
+
## Quick Command
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
# Check size before installing
|
|
15
|
+
# Visit: https://bundlephobia.com/package/[package-name]
|
|
16
|
+
|
|
17
|
+
# Or use CLI
|
|
18
|
+
npx bundle-phobia-cli <package-name>
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
## When to Use
|
|
22
|
+
|
|
23
|
+
- Evaluating new dependencies
|
|
24
|
+
- Comparing alternative libraries
|
|
25
|
+
- Auditing existing dependencies
|
|
26
|
+
- Investigating bundle bloat
|
|
27
|
+
|
|
28
|
+
## Tools Overview
|
|
29
|
+
|
|
30
|
+
| Tool | Type | Best For |
|
|
31
|
+
|------|------|----------|
|
|
32
|
+
| bundlephobia.com | Web | Quick size check |
|
|
33
|
+
| pkg-size.dev | Web | Backup/alternative |
|
|
34
|
+
| Import Cost (VS Code) | IDE extension | Rough JS import feedback |
|
|
35
|
+
|
|
36
|
+
## bundlephobia.com
|
|
37
|
+
|
|
38
|
+
### Usage
|
|
39
|
+
|
|
40
|
+
Visit [bundlephobia.com](https://bundlephobia.com) and enter package name.
|
|
41
|
+
|
|
42
|
+
### Shows
|
|
43
|
+
|
|
44
|
+
- **Minified size**: Raw JS size
|
|
45
|
+
- **Minified + Gzipped**: Network transfer size
|
|
46
|
+
- **Download time**: Estimated on various connections
|
|
47
|
+
- **Dependencies**: What else gets pulled in
|
|
48
|
+
- **Composition**: Breakdown by dependency
|
|
49
|
+
|
|
50
|
+
### Example Analysis
|
|
51
|
+
|
|
52
|
+
```
|
|
53
|
+
react-native-paper
|
|
54
|
+
├── Minified: 312 kB
|
|
55
|
+
├── Gzipped: 78 kB
|
|
56
|
+
└── Dependencies: 12 packages
|
|
57
|
+
├── @callstack/react-theme-provider
|
|
58
|
+
├── color
|
|
59
|
+
└── ...
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
## pkg-size.dev
|
|
63
|
+
|
|
64
|
+
Backup when bundlephobia fails.
|
|
65
|
+
|
|
66
|
+
Visit [pkg-size.dev](https://pkg-size.dev) with package name.
|
|
67
|
+
|
|
68
|
+
**Difference**: Actually installs package in web container, may be more accurate for edge cases.
|
|
69
|
+
|
|
70
|
+
## Import Cost (VS Code Extension)
|
|
71
|
+
|
|
72
|
+
### Install
|
|
73
|
+
|
|
74
|
+
Search "Import Cost" in VS Code extensions or:
|
|
75
|
+
|
|
76
|
+
```bash
|
|
77
|
+
code --install-extension wix.vscode-import-cost
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
### Usage
|
|
81
|
+
|
|
82
|
+
Shows inline size next to imports:
|
|
83
|
+
|
|
84
|
+
```tsx
|
|
85
|
+
import React from 'react'; // 6.5K (gzipped)
|
|
86
|
+
import lodash from 'lodash'; // 71.5K (gzipped: 24.7K)
|
|
87
|
+
import get from 'lodash/get'; // 8K (gzipped: 2.9K)
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
### Limitations
|
|
91
|
+
|
|
92
|
+
- Uses Webpack internally (not Metro)
|
|
93
|
+
- May fail on React Native-specific packages
|
|
94
|
+
- Doesn't account for tree shaking
|
|
95
|
+
|
|
96
|
+
Bundlephobia, pkg-size.dev, and Import Cost measure JavaScript package cost. They do not capture native code added by React Native libraries such as maps, Reanimated, Firebase, camera, video, or analytics SDKs. For native dependencies, always verify the actual IPA/AAB/APK size after installation.
|
|
97
|
+
|
|
98
|
+
## Comparison Workflow
|
|
99
|
+
|
|
100
|
+
### Before Adding Dependency
|
|
101
|
+
|
|
102
|
+
1. Check on bundlephobia:
|
|
103
|
+
```
|
|
104
|
+
https://bundlephobia.com/package/[package-name]
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
2. Compare alternatives:
|
|
108
|
+
```
|
|
109
|
+
moment (289 kB) vs date-fns (75 kB) vs dayjs (6 kB)
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
3. Check what you actually need:
|
|
113
|
+
- Full library import vs specific functions
|
|
114
|
+
- Native alternative available?
|
|
115
|
+
|
|
116
|
+
### After Adding
|
|
117
|
+
|
|
118
|
+
1. Analyze bundle (see [bundle-analyze-js.md](./bundle-analyze-js.md))
|
|
119
|
+
2. Verify actual impact matches expected
|
|
120
|
+
3. Check for duplicate dependencies
|
|
121
|
+
|
|
122
|
+
## Common Large Dependencies
|
|
123
|
+
|
|
124
|
+
| Library | Size (gzipped) | Alternative |
|
|
125
|
+
|---------|----------------|-------------|
|
|
126
|
+
| moment | ~70 KB | dayjs (~3 KB) |
|
|
127
|
+
| lodash (full) | ~25 KB | Built-ins or direct imports |
|
|
128
|
+
| aws-sdk (full) | 200+ KB | @aws-sdk/client-* |
|
|
129
|
+
| crypto-js | ~15 KB | react-native-quick-crypto |
|
|
130
|
+
|
|
131
|
+
## Quick Size Check Script
|
|
132
|
+
|
|
133
|
+
```bash
|
|
134
|
+
# Check size before installing
|
|
135
|
+
npx bundle-phobia-cli <package-name>
|
|
136
|
+
|
|
137
|
+
# Or use npm directly (less accurate)
|
|
138
|
+
npm pack <package-name> --dry-run 2>&1 | grep "total files"
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
## Decision Rule
|
|
142
|
+
|
|
143
|
+
Prefer the smallest option that satisfies correctness and platform requirements, then verify the real app artifact. JS package size alone is not enough for React Native dependencies with native code.
|
|
144
|
+
|
|
145
|
+
## Code Example: Optimizing Imports
|
|
146
|
+
|
|
147
|
+
```tsx
|
|
148
|
+
// BAD: Full library
|
|
149
|
+
import _ from 'lodash';
|
|
150
|
+
_.get(obj, 'path.to.value');
|
|
151
|
+
|
|
152
|
+
// BETTER: Specific import
|
|
153
|
+
import get from 'lodash/get';
|
|
154
|
+
get(obj, 'path.to.value');
|
|
155
|
+
|
|
156
|
+
// BEST: Native JS
|
|
157
|
+
obj?.path?.to?.value;
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
## Related Skills
|
|
161
|
+
|
|
162
|
+
- [bundle-analyze-js.md](./bundle-analyze-js.md) - Verify actual bundle impact
|
|
163
|
+
- [bundle-barrel-exports.md](./bundle-barrel-exports.md) - Optimize how you import
|
|
164
|
+
- [native-sdks-over-polyfills.md](./native-sdks-over-polyfills.md) - Native alternatives to JS libs
|