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.
Files changed (399) hide show
  1. package/dist/index.js +490 -105
  2. package/dist/templates/default/LICENSE +21 -0
  3. package/dist/templates/default/apps/blog/package.json +1 -0
  4. package/dist/templates/default/apps/changelog/package.json +1 -0
  5. package/dist/templates/default/apps/desktop/.oxfmtrc.json +5 -0
  6. package/dist/templates/default/apps/desktop/.oxlintrc.json +6 -0
  7. package/dist/templates/default/apps/desktop/README.md +58 -0
  8. package/dist/templates/default/apps/desktop/forge.config.mts +90 -0
  9. package/dist/templates/default/apps/desktop/index.html +12 -0
  10. package/dist/templates/default/apps/desktop/package.json +55 -0
  11. package/dist/templates/default/apps/desktop/src/declarations.d.ts +2 -0
  12. package/dist/templates/default/apps/desktop/src/index.css +8 -0
  13. package/dist/templates/default/apps/desktop/src/main.ts +58 -0
  14. package/dist/templates/default/apps/desktop/src/preload.ts +3 -0
  15. package/dist/templates/default/apps/desktop/src/renderer.ts +19 -0
  16. package/dist/templates/default/apps/desktop/tsconfig.json +14 -0
  17. package/dist/templates/default/apps/desktop/vite.main.config.mts +4 -0
  18. package/dist/templates/default/apps/desktop/vite.preload.config.mts +4 -0
  19. package/dist/templates/default/apps/desktop/vite.renderer.config.mts +4 -0
  20. package/dist/templates/default/apps/docs/package.json +1 -0
  21. package/dist/templates/default/apps/mobile/.agents/skills/agent-device/SKILL.md +22 -0
  22. package/dist/templates/default/apps/mobile/.agents/skills/android-emulator/SKILL.md +32 -0
  23. package/dist/templates/default/apps/mobile/.agents/skills/dogfood/SKILL.md +27 -0
  24. package/dist/templates/default/apps/mobile/.agents/skills/eas-app-stores/SKILL.md +176 -0
  25. package/dist/templates/default/apps/mobile/.agents/skills/eas-app-stores/agents/openai.yaml +4 -0
  26. package/dist/templates/default/apps/mobile/.agents/skills/eas-app-stores/references/app-store-metadata.md +497 -0
  27. package/dist/templates/default/apps/mobile/.agents/skills/eas-app-stores/references/ios-app-store.md +376 -0
  28. package/dist/templates/default/apps/mobile/.agents/skills/eas-app-stores/references/native-ios.md +167 -0
  29. package/dist/templates/default/apps/mobile/.agents/skills/eas-app-stores/references/play-store.md +244 -0
  30. package/dist/templates/default/apps/mobile/.agents/skills/eas-app-stores/references/testflight.md +62 -0
  31. package/dist/templates/default/apps/mobile/.agents/skills/eas-app-stores/references/workflows.md +120 -0
  32. package/dist/templates/default/apps/mobile/.agents/skills/eas-hosting/SKILL.md +431 -0
  33. package/dist/templates/default/apps/mobile/.agents/skills/eas-hosting/agents/openai.yaml +4 -0
  34. package/dist/templates/default/apps/mobile/.agents/skills/eas-observe/SKILL.md +46 -0
  35. package/dist/templates/default/apps/mobile/.agents/skills/eas-observe/agents/openai.yaml +4 -0
  36. package/dist/templates/default/apps/mobile/.agents/skills/eas-observe/references/metrics.md +98 -0
  37. package/dist/templates/default/apps/mobile/.agents/skills/eas-observe/references/queries.md +444 -0
  38. package/dist/templates/default/apps/mobile/.agents/skills/eas-observe/references/setup.md +529 -0
  39. package/dist/templates/default/apps/mobile/.agents/skills/eas-observe/references/third-party.md +136 -0
  40. package/dist/templates/default/apps/mobile/.agents/skills/eas-simulator/SKILL.md +237 -0
  41. package/dist/templates/default/apps/mobile/.agents/skills/eas-simulator/agents/openai.yaml +4 -0
  42. package/dist/templates/default/apps/mobile/.agents/skills/eas-simulator/references/controllers.md +139 -0
  43. package/dist/templates/default/apps/mobile/.agents/skills/eas-simulator/references/logs-and-crashes.md +101 -0
  44. package/dist/templates/default/apps/mobile/.agents/skills/eas-simulator/references/run-your-app.md +256 -0
  45. package/dist/templates/default/apps/mobile/.agents/skills/eas-simulator/references/troubleshooting.md +56 -0
  46. package/dist/templates/default/apps/mobile/.agents/skills/eas-update/SKILL.md +146 -0
  47. package/dist/templates/default/apps/mobile/.agents/skills/eas-update/agents/openai.yaml +4 -0
  48. package/dist/templates/default/apps/mobile/.agents/skills/eas-update-insights/SKILL.md +238 -0
  49. package/dist/templates/default/apps/mobile/.agents/skills/eas-update-insights/agents/openai.yaml +4 -0
  50. package/dist/templates/default/apps/mobile/.agents/skills/eas-update-insights/references/channel-insights-schema.md +47 -0
  51. package/dist/templates/default/apps/mobile/.agents/skills/eas-update-insights/references/update-insights-schema.md +69 -0
  52. package/dist/templates/default/apps/mobile/.agents/skills/eas-workflows/SKILL.md +99 -0
  53. package/dist/templates/default/apps/mobile/.agents/skills/eas-workflows/agents/openai.yaml +4 -0
  54. package/dist/templates/default/apps/mobile/.agents/skills/eas-workflows/scripts/fetch.js +109 -0
  55. package/dist/templates/default/apps/mobile/.agents/skills/eas-workflows/scripts/package.json +6 -0
  56. package/dist/templates/default/apps/mobile/.agents/skills/expo-animation/LICENSE +21 -0
  57. package/dist/templates/default/apps/mobile/.agents/skills/expo-animation/RECIPES.md +385 -0
  58. package/dist/templates/default/apps/mobile/.agents/skills/expo-animation/SKILL.md +274 -0
  59. package/dist/templates/default/apps/mobile/.agents/skills/expo-animation/agents/openai.yaml +4 -0
  60. package/dist/templates/default/apps/mobile/.agents/skills/expo-app-clip/SKILL.md +290 -0
  61. package/dist/templates/default/apps/mobile/.agents/skills/expo-app-clip/agents/openai.yaml +4 -0
  62. package/dist/templates/default/apps/mobile/.agents/skills/expo-app-clip/references/native-module.md +96 -0
  63. package/dist/templates/default/apps/mobile/.agents/skills/expo-brownfield/SKILL.md +69 -0
  64. package/dist/templates/default/apps/mobile/.agents/skills/expo-brownfield/agents/openai.yaml +4 -0
  65. package/dist/templates/default/apps/mobile/.agents/skills/expo-brownfield/references/brownfield-integrated.md +551 -0
  66. package/dist/templates/default/apps/mobile/.agents/skills/expo-brownfield/references/brownfield-isolated.md +449 -0
  67. package/dist/templates/default/apps/mobile/.agents/skills/expo-brownfield/references/comparison.md +63 -0
  68. package/dist/templates/default/apps/mobile/.agents/skills/expo-brownfield/references/feature-integration.md +163 -0
  69. package/dist/templates/default/apps/mobile/.agents/skills/expo-brownfield/references/troubleshooting.md +88 -0
  70. package/dist/templates/default/apps/mobile/.agents/skills/expo-brownfield/references/version-compatibility.md +40 -0
  71. package/dist/templates/default/apps/mobile/.agents/skills/expo-data-fetching/SKILL.md +478 -0
  72. package/dist/templates/default/apps/mobile/.agents/skills/expo-data-fetching/agents/openai.yaml +4 -0
  73. package/dist/templates/default/apps/mobile/.agents/skills/expo-data-fetching/references/expo-router-loaders.md +341 -0
  74. package/dist/templates/default/apps/mobile/.agents/skills/expo-data-fetching/references/offline-and-cancellation.md +68 -0
  75. package/dist/templates/default/apps/mobile/.agents/skills/expo-design-system/SKILL.md +376 -0
  76. package/dist/templates/default/apps/mobile/.agents/skills/expo-design-system/agents/openai.yaml +4 -0
  77. package/dist/templates/default/apps/mobile/.agents/skills/expo-design-system/references/audit.md +190 -0
  78. package/dist/templates/default/apps/mobile/.agents/skills/expo-design-system/references/native-slop.md +74 -0
  79. package/dist/templates/default/apps/mobile/.agents/skills/expo-dev-client/SKILL.md +184 -0
  80. package/dist/templates/default/apps/mobile/.agents/skills/expo-dev-client/agents/openai.yaml +4 -0
  81. package/dist/templates/default/apps/mobile/.agents/skills/expo-dom/SKILL.md +425 -0
  82. package/dist/templates/default/apps/mobile/.agents/skills/expo-dom/agents/openai.yaml +4 -0
  83. package/dist/templates/default/apps/mobile/.agents/skills/expo-examples/SKILL.md +106 -0
  84. package/dist/templates/default/apps/mobile/.agents/skills/expo-examples/agents/openai.yaml +4 -0
  85. package/dist/templates/default/apps/mobile/.agents/skills/expo-examples/references/catalog.md +105 -0
  86. package/dist/templates/default/apps/mobile/.agents/skills/expo-migrate-module/SKILL.md +124 -0
  87. package/dist/templates/default/apps/mobile/.agents/skills/expo-migrate-module/agents/openai.yaml +4 -0
  88. package/dist/templates/default/apps/mobile/.agents/skills/expo-migrate-module/references/compatibility.md +130 -0
  89. package/dist/templates/default/apps/mobile/.agents/skills/expo-migrate-module/references/example.md +212 -0
  90. package/dist/templates/default/apps/mobile/.agents/skills/expo-migrate-module/references/migration-map.md +457 -0
  91. package/dist/templates/default/apps/mobile/.agents/skills/expo-module/SKILL.md +151 -0
  92. package/dist/templates/default/apps/mobile/.agents/skills/expo-module/agents/openai.yaml +4 -0
  93. package/dist/templates/default/apps/mobile/.agents/skills/expo-module/references/config-plugin.md +90 -0
  94. package/dist/templates/default/apps/mobile/.agents/skills/expo-module/references/create-expo-module.md +206 -0
  95. package/dist/templates/default/apps/mobile/.agents/skills/expo-module/references/lifecycle.md +127 -0
  96. package/dist/templates/default/apps/mobile/.agents/skills/expo-module/references/module-config.md +48 -0
  97. package/dist/templates/default/apps/mobile/.agents/skills/expo-module/references/native-module.md +286 -0
  98. package/dist/templates/default/apps/mobile/.agents/skills/expo-module/references/native-view.md +171 -0
  99. package/dist/templates/default/apps/mobile/.agents/skills/expo-native-ui/SKILL.md +201 -0
  100. package/dist/templates/default/apps/mobile/.agents/skills/expo-native-ui/agents/openai.yaml +4 -0
  101. package/dist/templates/default/apps/mobile/.agents/skills/expo-native-ui/references/controls.md +231 -0
  102. package/dist/templates/default/apps/mobile/.agents/skills/expo-native-ui/references/gradients.md +106 -0
  103. package/dist/templates/default/apps/mobile/.agents/skills/expo-native-ui/references/icons.md +232 -0
  104. package/dist/templates/default/apps/mobile/.agents/skills/expo-native-ui/references/media.md +193 -0
  105. package/dist/templates/default/apps/mobile/.agents/skills/expo-native-ui/references/storage.md +121 -0
  106. package/dist/templates/default/apps/mobile/.agents/skills/expo-native-ui/references/visual-effects.md +198 -0
  107. package/dist/templates/default/apps/mobile/.agents/skills/expo-native-ui/references/webgpu-three.md +605 -0
  108. package/dist/templates/default/apps/mobile/.agents/skills/expo-overview/SKILL.md +120 -0
  109. package/dist/templates/default/apps/mobile/.agents/skills/expo-overview/agents/openai.yaml +4 -0
  110. package/dist/templates/default/apps/mobile/.agents/skills/expo-overview/references/launch-without-dev-menu.md +24 -0
  111. package/dist/templates/default/apps/mobile/.agents/skills/expo-project-structure/SKILL.md +114 -0
  112. package/dist/templates/default/apps/mobile/.agents/skills/expo-project-structure/agents/openai.yaml +4 -0
  113. package/dist/templates/default/apps/mobile/.agents/skills/expo-router/SKILL.md +240 -0
  114. package/dist/templates/default/apps/mobile/.agents/skills/expo-router/agents/openai.yaml +4 -0
  115. package/dist/templates/default/apps/mobile/.agents/skills/expo-router/references/form-sheet.md +253 -0
  116. package/dist/templates/default/apps/mobile/.agents/skills/expo-router/references/route-structure.md +229 -0
  117. package/dist/templates/default/apps/mobile/.agents/skills/expo-router/references/search.md +248 -0
  118. package/dist/templates/default/apps/mobile/.agents/skills/expo-router/references/tabs.md +433 -0
  119. package/dist/templates/default/apps/mobile/.agents/skills/expo-router/references/toolbar-and-headers.md +284 -0
  120. package/dist/templates/default/apps/mobile/.agents/skills/expo-router/references/zoom-transitions.md +158 -0
  121. package/dist/templates/default/apps/mobile/.agents/skills/expo-skill-eval/SKILL.md +314 -0
  122. package/dist/templates/default/apps/mobile/.agents/skills/expo-skill-eval/agents/visual-grader.md +52 -0
  123. package/dist/templates/default/apps/mobile/.agents/skills/expo-skill-eval/references/design-rubric.md +45 -0
  124. package/dist/templates/default/apps/mobile/.agents/skills/expo-skill-eval/references/runtime-matrix.md +34 -0
  125. package/dist/templates/default/apps/mobile/.agents/skills/expo-skill-eval/scripts/check-static.sh +64 -0
  126. package/dist/templates/default/apps/mobile/.agents/skills/expo-skill-eval/scripts/clean-fixture.sh +56 -0
  127. package/dist/templates/default/apps/mobile/.agents/skills/expo-skill-eval/scripts/generate_viewer.py +450 -0
  128. package/dist/templates/default/apps/mobile/.agents/skills/expo-skill-eval/scripts/latest-sdk.sh +46 -0
  129. package/dist/templates/default/apps/mobile/.agents/skills/expo-skill-eval/scripts/make-fixture.sh +95 -0
  130. package/dist/templates/default/apps/mobile/.agents/skills/expo-skill-eval/scripts/make-workspace.sh +31 -0
  131. package/dist/templates/default/apps/mobile/.agents/skills/expo-skill-eval/scripts/snapshot-android.sh +284 -0
  132. package/dist/templates/default/apps/mobile/.agents/skills/expo-skill-eval/scripts/snapshot-ios.sh +132 -0
  133. package/dist/templates/default/apps/mobile/.agents/skills/expo-skill-eval/scripts/snapshot-web.sh +61 -0
  134. package/dist/templates/default/apps/mobile/.agents/skills/expo-ui/SKILL.md +101 -0
  135. package/dist/templates/default/apps/mobile/.agents/skills/expo-ui/agents/openai.yaml +4 -0
  136. package/dist/templates/default/apps/mobile/.agents/skills/expo-ui/references/drop-in-replacements.md +27 -0
  137. package/dist/templates/default/apps/mobile/.agents/skills/expo-ui/references/jetpack-compose.md +73 -0
  138. package/dist/templates/default/apps/mobile/.agents/skills/expo-ui/references/swift-ui.md +73 -0
  139. package/dist/templates/default/apps/mobile/.agents/skills/expo-ui/references/universal.md +104 -0
  140. package/dist/templates/default/apps/mobile/.agents/skills/expo-ui/scripts/list-components.js +193 -0
  141. package/dist/templates/default/apps/mobile/.agents/skills/expo-upgrade/SKILL.md +150 -0
  142. package/dist/templates/default/apps/mobile/.agents/skills/expo-upgrade/agents/openai.yaml +4 -0
  143. package/dist/templates/default/apps/mobile/.agents/skills/expo-upgrade/references/expo-av-to-audio.md +132 -0
  144. package/dist/templates/default/apps/mobile/.agents/skills/expo-upgrade/references/expo-av-to-video.md +160 -0
  145. package/dist/templates/default/apps/mobile/.agents/skills/expo-upgrade/references/native-tabs.md +124 -0
  146. package/dist/templates/default/apps/mobile/.agents/skills/expo-upgrade/references/new-architecture.md +79 -0
  147. package/dist/templates/default/apps/mobile/.agents/skills/expo-upgrade/references/react-19.md +79 -0
  148. package/dist/templates/default/apps/mobile/.agents/skills/expo-upgrade/references/react-compiler.md +59 -0
  149. package/dist/templates/default/apps/mobile/.agents/skills/expo-upgrade/references/react-navigation-to-expo-router.md +61 -0
  150. package/dist/templates/default/apps/mobile/.agents/skills/expo-web-to-native/SKILL.md +91 -0
  151. package/dist/templates/default/apps/mobile/.agents/skills/expo-web-to-native/agents/openai.yaml +4 -0
  152. package/dist/templates/default/apps/mobile/.agents/skills/expo-web-to-native/references/false-friends.md +119 -0
  153. package/dist/templates/default/apps/mobile/.agents/skills/expo-web-to-native/references/native-patterns.md +39 -0
  154. package/dist/templates/default/apps/mobile/.agents/skills/expo-web-to-native/references/run-as-goal.md +48 -0
  155. package/dist/templates/default/apps/mobile/.agents/skills/expo-web-to-native/references/verify-on-device.md +45 -0
  156. package/dist/templates/default/apps/mobile/.agents/skills/ios-simulator/SKILL.md +32 -0
  157. package/dist/templates/default/apps/mobile/.agents/skills/react-native-best-practices/POWER.md +172 -0
  158. package/dist/templates/default/apps/mobile/.agents/skills/react-native-best-practices/SKILL.md +238 -0
  159. package/dist/templates/default/apps/mobile/.agents/skills/react-native-best-practices/agents/openai.yaml +4 -0
  160. package/dist/templates/default/apps/mobile/.agents/skills/react-native-best-practices/references/bundle-analyze-app.md +208 -0
  161. package/dist/templates/default/apps/mobile/.agents/skills/react-native-best-practices/references/bundle-analyze-js.md +264 -0
  162. package/dist/templates/default/apps/mobile/.agents/skills/react-native-best-practices/references/bundle-barrel-exports.md +250 -0
  163. package/dist/templates/default/apps/mobile/.agents/skills/react-native-best-practices/references/bundle-code-splitting.md +255 -0
  164. package/dist/templates/default/apps/mobile/.agents/skills/react-native-best-practices/references/bundle-hermes-mmap.md +167 -0
  165. package/dist/templates/default/apps/mobile/.agents/skills/react-native-best-practices/references/bundle-library-size.md +164 -0
  166. package/dist/templates/default/apps/mobile/.agents/skills/react-native-best-practices/references/bundle-native-assets.md +208 -0
  167. package/dist/templates/default/apps/mobile/.agents/skills/react-native-best-practices/references/bundle-r8-android.md +231 -0
  168. package/dist/templates/default/apps/mobile/.agents/skills/react-native-best-practices/references/bundle-tree-shaking.md +215 -0
  169. package/dist/templates/default/apps/mobile/.agents/skills/react-native-best-practices/references/images/bundle-treemap-source-map-explorer.png +0 -0
  170. package/dist/templates/default/apps/mobile/.agents/skills/react-native-best-practices/references/images/controlled-textinput-pingpong.png +0 -0
  171. package/dist/templates/default/apps/mobile/.agents/skills/react-native-best-practices/references/images/devtools-flamegraph.png +0 -0
  172. package/dist/templates/default/apps/mobile/.agents/skills/react-native-best-practices/references/images/emerge-xray-ios.png +0 -0
  173. package/dist/templates/default/apps/mobile/.agents/skills/react-native-best-practices/references/images/expo-atlas-treemap.png +0 -0
  174. package/dist/templates/default/apps/mobile/.agents/skills/react-native-best-practices/references/images/flashlight-flatlist-vs-flashlist.png +0 -0
  175. package/dist/templates/default/apps/mobile/.agents/skills/react-native-best-practices/references/images/fps-drop-graph.png +0 -0
  176. package/dist/templates/default/apps/mobile/.agents/skills/react-native-best-practices/references/images/memory-heap-snapshot.png +0 -0
  177. package/dist/templates/default/apps/mobile/.agents/skills/react-native-best-practices/references/images/tti-warm-start-diagram.png +0 -0
  178. package/dist/templates/default/apps/mobile/.agents/skills/react-native-best-practices/references/images/view-hierarchy-flattening.png +0 -0
  179. package/dist/templates/default/apps/mobile/.agents/skills/react-native-best-practices/references/images/xcode-instruments-templates.png +0 -0
  180. package/dist/templates/default/apps/mobile/.agents/skills/react-native-best-practices/references/images/xcode-thread-view.png +0 -0
  181. package/dist/templates/default/apps/mobile/.agents/skills/react-native-best-practices/references/js-animations-reanimated.md +273 -0
  182. package/dist/templates/default/apps/mobile/.agents/skills/react-native-best-practices/references/js-atomic-state.md +190 -0
  183. package/dist/templates/default/apps/mobile/.agents/skills/react-native-best-practices/references/js-bottomsheet.md +339 -0
  184. package/dist/templates/default/apps/mobile/.agents/skills/react-native-best-practices/references/js-concurrent-react.md +238 -0
  185. package/dist/templates/default/apps/mobile/.agents/skills/react-native-best-practices/references/js-lists-flatlist-flashlist.md +223 -0
  186. package/dist/templates/default/apps/mobile/.agents/skills/react-native-best-practices/references/js-measure-fps.md +178 -0
  187. package/dist/templates/default/apps/mobile/.agents/skills/react-native-best-practices/references/js-memory-leaks.md +168 -0
  188. package/dist/templates/default/apps/mobile/.agents/skills/react-native-best-practices/references/js-profile-react.md +138 -0
  189. package/dist/templates/default/apps/mobile/.agents/skills/react-native-best-practices/references/js-react-compiler.md +261 -0
  190. package/dist/templates/default/apps/mobile/.agents/skills/react-native-best-practices/references/js-uncontrolled-components.md +219 -0
  191. package/dist/templates/default/apps/mobile/.agents/skills/react-native-best-practices/references/native-android-16kb-alignment.md +114 -0
  192. package/dist/templates/default/apps/mobile/.agents/skills/react-native-best-practices/references/native-measure-tti.md +221 -0
  193. package/dist/templates/default/apps/mobile/.agents/skills/react-native-best-practices/references/native-memory-leaks.md +206 -0
  194. package/dist/templates/default/apps/mobile/.agents/skills/react-native-best-practices/references/native-memory-patterns.md +240 -0
  195. package/dist/templates/default/apps/mobile/.agents/skills/react-native-best-practices/references/native-platform-setup.md +112 -0
  196. package/dist/templates/default/apps/mobile/.agents/skills/react-native-best-practices/references/native-profiling.md +140 -0
  197. package/dist/templates/default/apps/mobile/.agents/skills/react-native-best-practices/references/native-sdks-over-polyfills.md +192 -0
  198. package/dist/templates/default/apps/mobile/.agents/skills/react-native-best-practices/references/native-threading-model.md +230 -0
  199. package/dist/templates/default/apps/mobile/.agents/skills/react-native-best-practices/references/native-turbo-modules.md +210 -0
  200. package/dist/templates/default/apps/mobile/.agents/skills/react-native-best-practices/references/native-view-flattening.md +180 -0
  201. package/dist/templates/default/apps/mobile/AGENTS.md +41 -0
  202. package/dist/templates/default/apps/mobile/app.json +38 -0
  203. package/dist/templates/default/apps/mobile/assets/expo.icon/Assets/expo-symbol 2.svg +3 -0
  204. package/dist/templates/default/apps/mobile/assets/expo.icon/Assets/grid.png +0 -0
  205. package/dist/templates/default/apps/mobile/assets/expo.icon/icon.json +40 -0
  206. package/dist/templates/default/apps/mobile/assets/images/android-icon-background.png +0 -0
  207. package/dist/templates/default/apps/mobile/assets/images/android-icon-foreground.png +0 -0
  208. package/dist/templates/default/apps/mobile/assets/images/android-icon-monochrome.png +0 -0
  209. package/dist/templates/default/apps/mobile/assets/images/icon.png +0 -0
  210. package/dist/templates/default/apps/mobile/assets/images/splash-icon.png +0 -0
  211. package/dist/templates/default/apps/mobile/eslint.config.js +10 -0
  212. package/dist/templates/default/apps/mobile/package.json +43 -0
  213. package/dist/templates/default/apps/mobile/skills-lock.json +185 -0
  214. package/dist/templates/default/apps/mobile/src/app/_layout.tsx +5 -0
  215. package/dist/templates/default/apps/mobile/src/app/index.tsx +17 -0
  216. package/dist/templates/default/apps/mobile/tsconfig.json +20 -0
  217. package/dist/templates/default/apps/web/.agents/skills/frontend-design/SKILL.md +71 -0
  218. package/dist/templates/default/apps/web/.agents/skills/web-design-guidelines/SKILL.md +39 -0
  219. package/dist/templates/default/apps/web/.env.example +3 -0
  220. package/dist/templates/default/apps/web/components.json +23 -0
  221. package/dist/templates/default/apps/web/eslint.config.ts +21 -0
  222. package/dist/templates/default/apps/web/package.json +39 -0
  223. package/dist/templates/default/apps/web/public/disposabl-logo.svg +8 -0
  224. package/dist/templates/default/apps/web/public/favicon.ico +0 -0
  225. package/dist/templates/default/apps/web/public/manifest.json +25 -0
  226. package/dist/templates/default/apps/web/skills-lock.json +17 -0
  227. package/dist/templates/default/apps/web/src/index.css +92 -0
  228. package/dist/templates/default/apps/web/src/routeTree.gen.ts +282 -0
  229. package/dist/templates/default/apps/web/src/router/__root.tsx +63 -0
  230. package/dist/templates/default/apps/web/src/router/_authenticated/dashboard.tsx +9 -0
  231. package/dist/templates/default/apps/web/src/router/_authenticated/todos/$id.tsx +27 -0
  232. package/dist/templates/default/apps/web/src/router/_authenticated/todos/index.tsx +33 -0
  233. package/dist/templates/default/apps/web/src/router/index.tsx +15 -0
  234. package/dist/templates/default/apps/web/src/router.tsx +20 -0
  235. package/dist/templates/default/apps/web/tsconfig.json +33 -0
  236. package/dist/templates/default/apps/web/tsr.config.json +6 -0
  237. package/dist/templates/default/apps/web/vite.config.ts +67 -0
  238. package/dist/templates/default/bun.lock +3932 -0
  239. package/dist/templates/default/bunfig.toml +5 -0
  240. package/dist/templates/default/disposabl.json +5 -0
  241. package/dist/templates/default/gitignore +10 -0
  242. package/dist/templates/default/package.json +31 -10
  243. package/dist/templates/default/packages/backend/.agents/skills/convex/SKILL.md +69 -0
  244. package/dist/templates/default/packages/backend/.agents/skills/convex-add/SKILL.md +26 -0
  245. package/dist/templates/default/packages/backend/.agents/skills/convex-advisor/SKILL.md +32 -0
  246. package/dist/templates/default/packages/backend/.agents/skills/convex-agent/SKILL.md +25 -0
  247. package/dist/templates/default/packages/backend/.agents/skills/convex-auth/SKILL.md +29 -0
  248. package/dist/templates/default/packages/backend/.agents/skills/convex-authz/SKILL.md +36 -0
  249. package/dist/templates/default/packages/backend/.agents/skills/convex-backup/SKILL.md +33 -0
  250. package/dist/templates/default/packages/backend/.agents/skills/convex-billing/SKILL.md +69 -0
  251. package/dist/templates/default/packages/backend/.agents/skills/convex-cost/SKILL.md +29 -0
  252. package/dist/templates/default/packages/backend/.agents/skills/convex-create-component/SKILL.md +325 -0
  253. package/dist/templates/default/packages/backend/.agents/skills/convex-create-component/agents/openai.yaml +14 -0
  254. package/dist/templates/default/packages/backend/.agents/skills/convex-create-component/assets/icon.svg +3 -0
  255. package/dist/templates/default/packages/backend/.agents/skills/convex-create-component/references/advanced-patterns.md +146 -0
  256. package/dist/templates/default/packages/backend/.agents/skills/convex-create-component/references/hybrid-components.md +38 -0
  257. package/dist/templates/default/packages/backend/.agents/skills/convex-create-component/references/local-components.md +39 -0
  258. package/dist/templates/default/packages/backend/.agents/skills/convex-create-component/references/packaged-components.md +54 -0
  259. package/dist/templates/default/packages/backend/.agents/skills/convex-crons/SKILL.md +23 -0
  260. package/dist/templates/default/packages/backend/.agents/skills/convex-deploy-guard/SKILL.md +29 -0
  261. package/dist/templates/default/packages/backend/.agents/skills/convex-design/SKILL.md +30 -0
  262. package/dist/templates/default/packages/backend/.agents/skills/convex-docs/SKILL.md +31 -0
  263. package/dist/templates/default/packages/backend/.agents/skills/convex-domains/SKILL.md +26 -0
  264. package/dist/templates/default/packages/backend/.agents/skills/convex-env/SKILL.md +24 -0
  265. package/dist/templates/default/packages/backend/.agents/skills/convex-expert/SKILL.md +38 -0
  266. package/dist/templates/default/packages/backend/.agents/skills/convex-explain-app/SKILL.md +29 -0
  267. package/dist/templates/default/packages/backend/.agents/skills/convex-improve-convex-plugin/SKILL.md +24 -0
  268. package/dist/templates/default/packages/backend/.agents/skills/convex-insights/SKILL.md +32 -0
  269. package/dist/templates/default/packages/backend/.agents/skills/convex-launch-readiness/SKILL.md +35 -0
  270. package/dist/templates/default/packages/backend/.agents/skills/convex-migrate/SKILL.md +23 -0
  271. package/dist/templates/default/packages/backend/.agents/skills/convex-migrate-rehearse/SKILL.md +31 -0
  272. package/dist/templates/default/packages/backend/.agents/skills/convex-monitor/SKILL.md +22 -0
  273. package/dist/templates/default/packages/backend/.agents/skills/convex-optimize/SKILL.md +26 -0
  274. package/dist/templates/default/packages/backend/.agents/skills/convex-quickstart/SKILL.md +29 -0
  275. package/dist/templates/default/packages/backend/.agents/skills/convex-quickstart/agents/openai.yaml +14 -0
  276. package/dist/templates/default/packages/backend/.agents/skills/convex-quickstart/assets/icon.svg +4 -0
  277. package/dist/templates/default/packages/backend/.agents/skills/convex-reviewer/SKILL.md +26 -0
  278. package/dist/templates/default/packages/backend/.agents/skills/convex-seed/SKILL.md +23 -0
  279. package/dist/templates/default/packages/backend/.agents/skills/convex-self-heal/SKILL.md +38 -0
  280. package/dist/templates/default/packages/backend/.agents/skills/convex-sentinel/SKILL.md +25 -0
  281. package/dist/templates/default/packages/backend/.agents/skills/convex-suggest/SKILL.md +27 -0
  282. package/dist/templates/default/packages/backend/.agents/skills/convex-test/SKILL.md +23 -0
  283. package/dist/templates/default/packages/backend/.agents/skills/convex-verify/SKILL.md +34 -0
  284. package/dist/templates/default/packages/backend/.prettierignore +4 -0
  285. package/dist/templates/default/packages/backend/AGENTS.md +18 -0
  286. package/dist/templates/default/packages/backend/CLAUDE.md +13 -0
  287. package/dist/templates/default/packages/backend/README.md +25 -0
  288. package/dist/templates/default/packages/backend/convex/_generated/ai/ai-files.state.json +6 -0
  289. package/dist/templates/default/packages/backend/convex/_generated/ai/guidelines.md +286 -0
  290. package/dist/templates/default/packages/backend/convex/_generated/api.d.ts +66 -0
  291. package/dist/templates/default/packages/backend/convex/_generated/api.js +23 -0
  292. package/dist/templates/default/packages/backend/convex/_generated/dataModel.d.ts +60 -0
  293. package/dist/templates/default/packages/backend/convex/_generated/server.d.ts +164 -0
  294. package/dist/templates/default/packages/backend/convex/_generated/server.js +101 -0
  295. package/dist/templates/default/packages/backend/convex/auth.config.ts +14 -0
  296. package/dist/templates/default/packages/backend/convex/auth.ts +15 -0
  297. package/dist/templates/default/packages/backend/convex/convex.config.ts +30 -0
  298. package/dist/templates/default/packages/backend/convex/http.ts +5 -0
  299. package/dist/templates/default/packages/backend/convex/mcp.ts +8 -0
  300. package/dist/templates/default/packages/backend/convex/schema.ts +10 -0
  301. package/dist/templates/default/packages/backend/convex/todos/index.ts +26 -0
  302. package/dist/templates/default/packages/backend/convex/todos/internal.ts +43 -0
  303. package/dist/templates/default/packages/backend/convex/tsconfig.json +27 -0
  304. package/dist/templates/default/packages/backend/convex/users.ts +20 -0
  305. package/dist/templates/default/packages/backend/eslint.config.mjs +62 -0
  306. package/dist/templates/default/packages/backend/package.json +36 -0
  307. package/dist/templates/default/packages/backend/skills-lock.json +203 -0
  308. package/dist/templates/default/packages/disposabl-kit/client/components/ui/accordion.tsx +77 -0
  309. package/dist/templates/default/packages/disposabl-kit/client/components/ui/alert-dialog.tsx +185 -0
  310. package/dist/templates/default/packages/disposabl-kit/client/components/ui/alert.tsx +75 -0
  311. package/dist/templates/default/packages/disposabl-kit/client/components/ui/aspect-ratio.tsx +22 -0
  312. package/dist/templates/default/packages/disposabl-kit/client/components/ui/attachment.tsx +207 -0
  313. package/dist/templates/default/packages/disposabl-kit/client/components/ui/avatar.tsx +106 -0
  314. package/dist/templates/default/packages/disposabl-kit/client/components/ui/badge.tsx +51 -0
  315. package/dist/templates/default/packages/disposabl-kit/client/components/ui/breadcrumb.tsx +121 -0
  316. package/dist/templates/default/packages/disposabl-kit/client/components/ui/bubble.tsx +127 -0
  317. package/dist/templates/default/packages/disposabl-kit/client/components/ui/button-group.tsx +87 -0
  318. package/dist/templates/default/packages/disposabl-kit/client/components/ui/button.tsx +57 -0
  319. package/dist/templates/default/packages/disposabl-kit/client/components/ui/calendar.tsx +241 -0
  320. package/dist/templates/default/packages/disposabl-kit/client/components/ui/card.tsx +102 -0
  321. package/dist/templates/default/packages/disposabl-kit/client/components/ui/carousel.tsx +239 -0
  322. package/dist/templates/default/packages/disposabl-kit/client/components/ui/chart.tsx +368 -0
  323. package/dist/templates/default/packages/disposabl-kit/client/components/ui/checkbox.tsx +27 -0
  324. package/dist/templates/default/packages/disposabl-kit/client/components/ui/code-block.tsx +243 -0
  325. package/dist/templates/default/packages/disposabl-kit/client/components/ui/collapsible.tsx +19 -0
  326. package/dist/templates/default/packages/disposabl-kit/client/components/ui/combobox.tsx +300 -0
  327. package/dist/templates/default/packages/disposabl-kit/client/components/ui/command.tsx +194 -0
  328. package/dist/templates/default/packages/disposabl-kit/client/components/ui/context-menu.tsx +271 -0
  329. package/dist/templates/default/packages/disposabl-kit/client/components/ui/dialog.tsx +156 -0
  330. package/dist/templates/default/packages/disposabl-kit/client/components/ui/direction.tsx +4 -0
  331. package/dist/templates/default/packages/disposabl-kit/client/components/ui/drawer.tsx +224 -0
  332. package/dist/templates/default/packages/disposabl-kit/client/components/ui/dropdown-menu.tsx +269 -0
  333. package/dist/templates/default/packages/disposabl-kit/client/components/ui/empty.tsx +103 -0
  334. package/dist/templates/default/packages/disposabl-kit/client/components/ui/field.tsx +236 -0
  335. package/dist/templates/default/packages/disposabl-kit/client/components/ui/hover-card.tsx +50 -0
  336. package/dist/templates/default/packages/disposabl-kit/client/components/ui/input-group.tsx +158 -0
  337. package/dist/templates/default/packages/disposabl-kit/client/components/ui/input-otp.tsx +83 -0
  338. package/dist/templates/default/packages/disposabl-kit/client/components/ui/input.tsx +19 -0
  339. package/dist/templates/default/packages/disposabl-kit/client/components/ui/item.tsx +201 -0
  340. package/dist/templates/default/packages/disposabl-kit/client/components/ui/kbd.tsx +26 -0
  341. package/dist/templates/default/packages/disposabl-kit/client/components/ui/label.tsx +19 -0
  342. package/dist/templates/default/packages/disposabl-kit/client/components/ui/marker.tsx +70 -0
  343. package/dist/templates/default/packages/disposabl-kit/client/components/ui/menubar.tsx +284 -0
  344. package/dist/templates/default/packages/disposabl-kit/client/components/ui/message-scroller.tsx +128 -0
  345. package/dist/templates/default/packages/disposabl-kit/client/components/ui/message.tsx +91 -0
  346. package/dist/templates/default/packages/disposabl-kit/client/components/ui/native-select.tsx +64 -0
  347. package/dist/templates/default/packages/disposabl-kit/client/components/ui/navigation-menu.tsx +170 -0
  348. package/dist/templates/default/packages/disposabl-kit/client/components/ui/pagination.tsx +133 -0
  349. package/dist/templates/default/packages/disposabl-kit/client/components/ui/popover.tsx +87 -0
  350. package/dist/templates/default/packages/disposabl-kit/client/components/ui/progress.tsx +82 -0
  351. package/dist/templates/default/packages/disposabl-kit/client/components/ui/questionnaire.tsx +330 -0
  352. package/dist/templates/default/packages/disposabl-kit/client/components/ui/radio-group.tsx +35 -0
  353. package/dist/templates/default/packages/disposabl-kit/client/components/ui/resizable.tsx +49 -0
  354. package/dist/templates/default/packages/disposabl-kit/client/components/ui/scroll-area.tsx +51 -0
  355. package/dist/templates/default/packages/disposabl-kit/client/components/ui/select.tsx +201 -0
  356. package/dist/templates/default/packages/disposabl-kit/client/components/ui/separator.tsx +22 -0
  357. package/dist/templates/default/packages/disposabl-kit/client/components/ui/sheet.tsx +132 -0
  358. package/dist/templates/default/packages/disposabl-kit/client/components/ui/sidebar.tsx +723 -0
  359. package/dist/templates/default/packages/disposabl-kit/client/components/ui/skeleton.tsx +13 -0
  360. package/dist/templates/default/packages/disposabl-kit/client/components/ui/slider.tsx +51 -0
  361. package/dist/templates/default/packages/disposabl-kit/client/components/ui/spinner.tsx +16 -0
  362. package/dist/templates/default/packages/disposabl-kit/client/components/ui/switch.tsx +31 -0
  363. package/dist/templates/default/packages/disposabl-kit/client/components/ui/table.tsx +113 -0
  364. package/dist/templates/default/packages/disposabl-kit/client/components/ui/tabs.tsx +81 -0
  365. package/dist/templates/default/packages/disposabl-kit/client/components/ui/textarea.tsx +17 -0
  366. package/dist/templates/default/packages/disposabl-kit/client/components/ui/toast.tsx +229 -0
  367. package/dist/templates/default/packages/disposabl-kit/client/components/ui/toggle-group.tsx +87 -0
  368. package/dist/templates/default/packages/disposabl-kit/client/components/ui/toggle.tsx +42 -0
  369. package/dist/templates/default/packages/disposabl-kit/client/components/ui/tooltip.tsx +65 -0
  370. package/dist/templates/default/packages/disposabl-kit/client/components/ui/trace.tsx +161 -0
  371. package/dist/templates/default/packages/disposabl-kit/client/hooks/use-mobile.ts +21 -0
  372. package/dist/templates/default/packages/disposabl-kit/client/lib/prerender.ts +89 -0
  373. package/dist/templates/default/packages/disposabl-kit/client/lib/return-to.ts +12 -0
  374. package/dist/templates/default/packages/disposabl-kit/client/lib/utils.ts +1 -0
  375. package/dist/templates/default/packages/disposabl-kit/client/routes/_auth-pages/login.tsx +114 -0
  376. package/dist/templates/default/packages/disposabl-kit/client/routes/_auth-pages/signUp.tsx +120 -0
  377. package/dist/templates/default/packages/disposabl-kit/client/routes/_authenticated/route.tsx +38 -0
  378. package/dist/templates/default/packages/disposabl-kit/client/routes/consent.tsx +137 -0
  379. package/dist/templates/default/packages/disposabl-kit/client/routes/route.tsx +30 -0
  380. package/dist/templates/default/packages/disposabl-kit/client/styles/globals.css +60 -0
  381. package/dist/templates/default/packages/disposabl-kit/client/vite.config.ts +32 -0
  382. package/dist/templates/default/packages/disposabl-kit/components.json +23 -0
  383. package/dist/templates/default/packages/disposabl-kit/eslint.config.js +21 -0
  384. package/dist/templates/default/packages/disposabl-kit/package.json +60 -0
  385. package/dist/templates/default/packages/disposabl-kit/server/http.ts +86 -0
  386. package/dist/templates/default/packages/disposabl-kit/server/lib/functions.ts +40 -0
  387. package/dist/templates/default/packages/disposabl-kit/server/lib/platforms.ts +20 -0
  388. package/dist/templates/default/packages/disposabl-kit/server/lib/static-routes.ts +56 -0
  389. package/dist/templates/default/packages/disposabl-kit/tsconfig.json +17 -0
  390. package/dist/templates/default/patches/@convex-dev%2Fauth@2.0.0-beta.0.patch +310 -0
  391. package/dist/templates/default/patches/@convex-dev%2Fstatic-hosting@0.2.1.patch +187 -0
  392. package/dist/templates/default/tsconfig.json +9 -0
  393. package/dist/templates/default/turbo.json +51 -0
  394. package/package.json +21 -5
  395. package/README.md +0 -34
  396. package/dist/templates/default/README.md +0 -12
  397. package/dist/templates/default/docs/index.html +0 -8
  398. package/dist/templates/default/eslint.config.js +0 -18
  399. package/dist/templates/default/index.ts +0 -14
@@ -0,0 +1,341 @@
1
+ # Expo Router Data Loaders
2
+
3
+ Route-level data loading for web apps using Expo SDK 55+. Loaders are async functions exported from route files that load data before the route renders, following the Remix/React Router loader model.
4
+
5
+ **Dual execution model:**
6
+
7
+ - **Initial page load (SSR):** The loader runs server-side. Its return value is serialized as JSON and embedded in the HTML response.
8
+ - **Client-side navigation:** The browser fetches the loader data from the server via HTTP. The route renders once the data arrives.
9
+
10
+ You write one function and the framework manages when and how it executes.
11
+
12
+ ## Configuration
13
+
14
+ **Requirements:** Expo SDK 55+, web output mode (`npx expo serve` or `npx expo export --platform web`) set in `app.json` or `app.config.js`.
15
+
16
+ **Server rendering:**
17
+
18
+ ```json
19
+ {
20
+ "expo": {
21
+ "web": {
22
+ "output": "server"
23
+ },
24
+ "plugins": [
25
+ ["expo-router", {
26
+ "unstable_useServerDataLoaders": true,
27
+ "unstable_useServerRendering": true
28
+ }]
29
+ ]
30
+ }
31
+ }
32
+ ```
33
+
34
+ **Static/SSG:**
35
+
36
+ ```json
37
+ {
38
+ "expo": {
39
+ "web": {
40
+ "output": "static"
41
+ },
42
+ "plugins": [
43
+ ["expo-router", {
44
+ "unstable_useServerDataLoaders": true
45
+ }]
46
+ ]
47
+ }
48
+ }
49
+ ```
50
+
51
+ | | `"server"` | `"static"` |
52
+ |---|-----------|------------|
53
+ | `unstable_useServerDataLoaders` | Required | Required |
54
+ | `unstable_useServerRendering` | Required | Not required |
55
+ | Loader runs on | Live server (every request) | Build time (static generation) |
56
+ | `request` object | Full access (headers, cookies) | Not available |
57
+ | Hosting | Node.js server (EAS Hosting) | Any static host (Netlify, Vercel, S3) |
58
+
59
+ ## Imports
60
+
61
+ Loaders use two packages:
62
+
63
+ - **`expo-router`** — `useLoaderData` hook
64
+ - **`expo-server`** — `LoaderFunction` type, `StatusError`, `setResponseHeaders`. Always available (dependency of `expo-router`), no install needed.
65
+
66
+ ## Basic Loader
67
+
68
+ For loaders without params, a plain async function works:
69
+
70
+ ```tsx
71
+ // app/posts/index.tsx
72
+ import { Suspense } from "react";
73
+ import { useLoaderData } from "expo-router";
74
+ import { ActivityIndicator, View, Text } from "react-native";
75
+
76
+ export async function loader() {
77
+ const response = await fetch("https://api.example.com/posts");
78
+ const posts = await response.json();
79
+ return { posts };
80
+ }
81
+
82
+ function PostList() {
83
+ const { posts } = useLoaderData<typeof loader>();
84
+
85
+ return (
86
+ <View>
87
+ {posts.map((post) => (
88
+ <Text key={post.id}>{post.title}</Text>
89
+ ))}
90
+ </View>
91
+ );
92
+ }
93
+
94
+ export default function Posts() {
95
+ return (
96
+ <Suspense fallback={<ActivityIndicator size="large" />}>
97
+ <PostList />
98
+ </Suspense>
99
+ );
100
+ }
101
+ ```
102
+
103
+ `useLoaderData` is typed via `typeof loader` — the generic parameter infers the return type.
104
+
105
+ ## Dynamic Routes
106
+
107
+ For loaders with params, use the `LoaderFunction<T>` type from `expo-server`. The first argument is the request (an immutable `Request`-like object, or `undefined` in static mode). The second is `params` (`Record<string, string | string[]>`), which contains **path parameters only**. Access individual params with a cast like `params.id as string`. For query parameters, use `new URL(request.url).searchParams`:
108
+
109
+ ```tsx
110
+ // app/posts/[id].tsx
111
+ import { Suspense } from "react";
112
+ import { useLoaderData } from "expo-router";
113
+ import { StatusError, type LoaderFunction } from "expo-server";
114
+ import { ActivityIndicator, View, Text } from "react-native";
115
+
116
+ type Post = {
117
+ id: number;
118
+ title: string;
119
+ body: string;
120
+ };
121
+
122
+ export const loader: LoaderFunction<{ post: Post }> = async (
123
+ request,
124
+ params,
125
+ ) => {
126
+ const id = params.id as string;
127
+ const response = await fetch(`https://api.example.com/posts/${id}`);
128
+
129
+ if (!response.ok) {
130
+ throw new StatusError(404, `Post ${id} not found`);
131
+ }
132
+
133
+ const post: Post = await response.json();
134
+ return { post };
135
+ };
136
+
137
+ function PostContent() {
138
+ const { post } = useLoaderData<typeof loader>();
139
+
140
+ return (
141
+ <View>
142
+ <Text>{post.title}</Text>
143
+ <Text>{post.body}</Text>
144
+ </View>
145
+ );
146
+ }
147
+
148
+ export default function PostDetail() {
149
+ return (
150
+ <Suspense fallback={<ActivityIndicator size="large" />}>
151
+ <PostContent />
152
+ </Suspense>
153
+ );
154
+ }
155
+ ```
156
+
157
+ Catch-all routes access `params.slug` the same way:
158
+
159
+ ```tsx
160
+ // app/docs/[...slug].tsx
161
+ import { type LoaderFunction } from "expo-server";
162
+
163
+ type Doc = { title: string; content: string };
164
+
165
+ export const loader: LoaderFunction<{ doc: Doc }> = async (request, params) => {
166
+ const slug = params.slug as string[];
167
+ const path = slug.join("/");
168
+ const doc = await fetchDoc(path);
169
+ return { doc };
170
+ };
171
+ ```
172
+
173
+ Query parameters are available via the `request` object (server output mode only):
174
+
175
+ ```tsx
176
+ // app/search.tsx
177
+ import { type LoaderFunction } from "expo-server";
178
+
179
+ export const loader: LoaderFunction<{ results: any[]; query: string }> = async (request) => {
180
+ // Assuming request.url is `/search?q=expo&page=2`
181
+ const url = new URL(request!.url);
182
+ const query = url.searchParams.get("q") ?? "";
183
+ const page = Number(url.searchParams.get("page") ?? "1");
184
+
185
+ const results = await fetchSearchResults(query, page);
186
+ return { results, query };
187
+ };
188
+ ```
189
+
190
+ ## Server-Side Secrets & Request Access
191
+
192
+ Loaders run on the server, so you can access secrets and server-only resources directly:
193
+
194
+ ```tsx
195
+ // app/dashboard.tsx
196
+ import { type LoaderFunction } from "expo-server";
197
+
198
+ export const loader: LoaderFunction<{ balance: any; isAuthenticated: boolean }> = async (
199
+ request,
200
+ params,
201
+ ) => {
202
+ const data = await fetch("https://api.stripe.com/v1/balance", {
203
+ headers: {
204
+ Authorization: `Bearer ${process.env.STRIPE_SECRET_KEY}`,
205
+ },
206
+ });
207
+
208
+ const sessionToken = request?.headers.get("cookie")?.match(/session=([^;]+)/)?.[1];
209
+
210
+ const balance = await data.json();
211
+ return { balance, isAuthenticated: !!sessionToken };
212
+ };
213
+ ```
214
+
215
+ The `request` object is available in server output mode. In static output mode, `request` is always `undefined`.
216
+
217
+ ## Response Utilities
218
+
219
+ ### Setting Response Headers
220
+
221
+ ```tsx
222
+ // app/products.tsx
223
+ import { setResponseHeaders } from "expo-server";
224
+
225
+ export async function loader() {
226
+ setResponseHeaders({
227
+ "Cache-Control": "public, max-age=300",
228
+ });
229
+
230
+ const products = await fetchProducts();
231
+ return { products };
232
+ }
233
+ ```
234
+
235
+ ### Throwing HTTP Errors
236
+
237
+ ```tsx
238
+ // app/products/[id].tsx
239
+ import { StatusError, type LoaderFunction } from "expo-server";
240
+
241
+ export const loader: LoaderFunction<{ product: Product }> = async (request, params) => {
242
+ const id = params.id as string;
243
+ const product = await fetchProduct(id);
244
+
245
+ if (!product) {
246
+ throw new StatusError(404, "Product not found");
247
+ }
248
+
249
+ return { product };
250
+ };
251
+ ```
252
+
253
+ ## Suspense & Error Boundaries
254
+
255
+ ### Loading States with Suspense
256
+
257
+ `useLoaderData()` suspends during client-side navigation. Push it into a child component and wrap with `<Suspense>`:
258
+
259
+ ```tsx
260
+ // app/posts/index.tsx
261
+ import { Suspense } from "react";
262
+ import { useLoaderData } from "expo-router";
263
+ import { ActivityIndicator, View, Text } from "react-native";
264
+
265
+ export async function loader() {
266
+ const response = await fetch("https://api.example.com/posts");
267
+ return { posts: await response.json() };
268
+ }
269
+
270
+ function PostList() {
271
+ const { posts } = useLoaderData<typeof loader>();
272
+
273
+ return (
274
+ <View>
275
+ {posts.map((post) => (
276
+ <Text key={post.id}>{post.title}</Text>
277
+ ))}
278
+ </View>
279
+ );
280
+ }
281
+
282
+ export default function Posts() {
283
+ return (
284
+ <Suspense
285
+ fallback={
286
+ <View style={{ flex: 1, justifyContent: "center", alignItems: "center" }}>
287
+ <ActivityIndicator size="large" />
288
+ </View>
289
+ }
290
+ >
291
+ <PostList />
292
+ </Suspense>
293
+ );
294
+ }
295
+ ```
296
+
297
+ The `<Suspense>` boundary must be above the component calling `useLoaderData()`. On initial page load the data is already in the HTML, suspension only occurs during client-side navigation.
298
+
299
+ ### Error Boundaries
300
+
301
+ ```tsx
302
+ // app/posts/[id].tsx
303
+ export function ErrorBoundary({ error }: { error: Error }) {
304
+ return (
305
+ <View style={{ flex: 1, justifyContent: "center", alignItems: "center" }}>
306
+ <Text>Error: {error.message}</Text>
307
+ </View>
308
+ );
309
+ }
310
+ ```
311
+
312
+ When a loader throws (including `StatusError`), the nearest `ErrorBoundary` catches it.
313
+
314
+ ## Static vs Server Rendering
315
+
316
+ | | Server (`"server"`) | Static (`"static"`) |
317
+ |---|---|---|
318
+ | **When loader runs** | Every request (live) | At build time (`npx expo export`) |
319
+ | **Data freshness** | Fresh on initial server request | Stale until next build |
320
+ | **`request` object** | Full access | Not available |
321
+ | **Hosting** | Node.js server (EAS Hosting) | Any static host |
322
+ | **Use case** | Personalized/dynamic content | Marketing pages, blogs, docs |
323
+
324
+ **Choose server** when data changes frequently or content is personalized (cookies, auth, headers).
325
+
326
+ **Choose static** when content is the same for all users and changes infrequently.
327
+
328
+ ## Best Practices
329
+
330
+ - Loaders are web-only; use client-side fetching (React Query, fetch) for native
331
+ - Loaders cannot be used in `_layout` files — only in route files
332
+ - Use `LoaderFunction<T>` from `expo-server` to type loaders that use params
333
+ - The request object is immutable — use optional chaining (`request?.headers`) as it may be `undefined` in static mode
334
+ - Return only JSON-serializable values (no `Date`, `Map`, `Set`, class instances, functions)
335
+ - Use non-prefixed `process.env` vars for secrets in loaders, not `EXPO_PUBLIC_` (which is embedded in the client bundle)
336
+ - Use `StatusError` from `expo-server` for HTTP error responses
337
+ - Use `setResponseHeaders` from `expo-server` to set headers
338
+ - Export `ErrorBoundary` from route files to handle loader failures gracefully
339
+ - Validate and sanitize user input (params, query strings) before using in database queries or API calls
340
+ - Handle errors gracefully with try/catch; log server-side for debugging
341
+ - Loader data is currently cached for the session. This is a known limitation that will be lifted in a future release
@@ -0,0 +1,68 @@
1
+ # Offline Support & Request Cancellation
2
+
3
+ Companion reference for `expo-data-fetching`.
4
+
5
+ ## Offline Support
6
+
7
+ **Check network status**:
8
+
9
+ ```tsx
10
+ import NetInfo from "@react-native-community/netinfo";
11
+
12
+ // Hook for network status
13
+ function useNetworkStatus() {
14
+ const [isOnline, setIsOnline] = useState(true);
15
+
16
+ useEffect(() => {
17
+ return NetInfo.addEventListener((state) => {
18
+ setIsOnline(state.isConnected ?? true);
19
+ });
20
+ }, []);
21
+
22
+ return isOnline;
23
+ }
24
+ ```
25
+
26
+ **Offline-first with React Query**:
27
+
28
+ ```tsx
29
+ import { onlineManager } from "@tanstack/react-query";
30
+ import NetInfo from "@react-native-community/netinfo";
31
+
32
+ // Sync React Query with network status
33
+ onlineManager.setEventListener((setOnline) => {
34
+ return NetInfo.addEventListener((state) => {
35
+ setOnline(state.isConnected ?? true);
36
+ });
37
+ });
38
+
39
+ // Queries will pause when offline and resume when online
40
+ ```
41
+
42
+ ## Request Cancellation
43
+
44
+ **Cancel on unmount**:
45
+
46
+ ```tsx
47
+ useEffect(() => {
48
+ const controller = new AbortController();
49
+
50
+ fetch(url, { signal: controller.signal })
51
+ .then((response) => response.json())
52
+ .then(setData)
53
+ .catch((error) => {
54
+ if (error.name !== "AbortError") {
55
+ setError(error);
56
+ }
57
+ });
58
+
59
+ return () => controller.abort();
60
+ }, [url]);
61
+ ```
62
+
63
+ **With React Query** (automatic):
64
+
65
+ ```tsx
66
+ // React Query automatically cancels requests when queries are invalidated
67
+ // or components unmount
68
+ ```