@donotdev/cli 0.0.3

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 (281) hide show
  1. package/LICENSE.md +48 -0
  2. package/README.md +291 -0
  3. package/dependencies-matrix.json +694 -0
  4. package/dist/bin/commands/build.d.ts +11 -0
  5. package/dist/bin/commands/build.d.ts.map +1 -0
  6. package/dist/bin/commands/build.js +8162 -0
  7. package/dist/bin/commands/build.js.map +1 -0
  8. package/dist/bin/commands/bump.d.ts +11 -0
  9. package/dist/bin/commands/bump.d.ts.map +1 -0
  10. package/dist/bin/commands/bump.js +8004 -0
  11. package/dist/bin/commands/bump.js.map +1 -0
  12. package/dist/bin/commands/cacheout.d.ts +11 -0
  13. package/dist/bin/commands/cacheout.d.ts.map +1 -0
  14. package/dist/bin/commands/cacheout.js +7630 -0
  15. package/dist/bin/commands/cacheout.js.map +1 -0
  16. package/dist/bin/commands/create-app.d.ts +11 -0
  17. package/dist/bin/commands/create-app.d.ts.map +1 -0
  18. package/dist/bin/commands/create-app.js +9032 -0
  19. package/dist/bin/commands/create-app.js.map +1 -0
  20. package/dist/bin/commands/create-project.d.ts +11 -0
  21. package/dist/bin/commands/create-project.d.ts.map +1 -0
  22. package/dist/bin/commands/create-project.js +9643 -0
  23. package/dist/bin/commands/create-project.js.map +1 -0
  24. package/dist/bin/commands/deploy.d.ts +11 -0
  25. package/dist/bin/commands/deploy.d.ts.map +1 -0
  26. package/dist/bin/commands/deploy.js +9007 -0
  27. package/dist/bin/commands/deploy.js.map +1 -0
  28. package/dist/bin/commands/dev.d.ts +11 -0
  29. package/dist/bin/commands/dev.d.ts.map +1 -0
  30. package/dist/bin/commands/dev.js +7892 -0
  31. package/dist/bin/commands/dev.js.map +1 -0
  32. package/dist/bin/commands/emu.d.ts +11 -0
  33. package/dist/bin/commands/emu.d.ts.map +1 -0
  34. package/dist/bin/commands/emu.js +8302 -0
  35. package/dist/bin/commands/emu.js.map +1 -0
  36. package/dist/bin/commands/format.d.ts +11 -0
  37. package/dist/bin/commands/format.d.ts.map +1 -0
  38. package/dist/bin/commands/format.js +8009 -0
  39. package/dist/bin/commands/format.js.map +1 -0
  40. package/dist/bin/commands/lint.d.ts +11 -0
  41. package/dist/bin/commands/lint.d.ts.map +1 -0
  42. package/dist/bin/commands/lint.js +7481 -0
  43. package/dist/bin/commands/lint.js.map +1 -0
  44. package/dist/bin/commands/preview.d.ts +11 -0
  45. package/dist/bin/commands/preview.d.ts.map +1 -0
  46. package/dist/bin/commands/preview.js +7909 -0
  47. package/dist/bin/commands/preview.js.map +1 -0
  48. package/dist/bin/commands/sync-secrets.d.ts +11 -0
  49. package/dist/bin/commands/sync-secrets.d.ts.map +1 -0
  50. package/dist/bin/commands/sync-secrets.js +8227 -0
  51. package/dist/bin/commands/sync-secrets.js.map +1 -0
  52. package/dist/bin/dndev.js +222 -0
  53. package/dist/bin/donotdev.js +222 -0
  54. package/dist/index.d.ts +8 -0
  55. package/dist/index.d.ts.map +1 -0
  56. package/dist/index.js +12820 -0
  57. package/dist/index.js.map +1 -0
  58. package/package.json +71 -0
  59. package/templates/app-demo/index.html.example +20 -0
  60. package/templates/app-demo/public/favicon.ico.example +0 -0
  61. package/templates/app-demo/public/fonts/Roboto-400-cyrillic-ext.woff2.example +0 -0
  62. package/templates/app-demo/public/fonts/Roboto-400-cyrillic.woff2.example +0 -0
  63. package/templates/app-demo/public/fonts/Roboto-400-greek-ext.woff2.example +0 -0
  64. package/templates/app-demo/public/fonts/Roboto-400-greek.woff2.example +0 -0
  65. package/templates/app-demo/public/fonts/Roboto-400-latin-ext.woff2.example +0 -0
  66. package/templates/app-demo/public/fonts/Roboto-400-latin.woff2.example +0 -0
  67. package/templates/app-demo/public/fonts/Roboto-400-vietnamese.woff2.example +0 -0
  68. package/templates/app-demo/public/fonts/Roboto-700-cyrillic-ext.woff2.example +0 -0
  69. package/templates/app-demo/public/fonts/Roboto-700-cyrillic.woff2.example +0 -0
  70. package/templates/app-demo/public/fonts/Roboto-700-greek-ext.woff2.example +0 -0
  71. package/templates/app-demo/public/fonts/Roboto-700-greek.woff2.example +0 -0
  72. package/templates/app-demo/public/fonts/Roboto-700-latin-ext.woff2.example +0 -0
  73. package/templates/app-demo/public/fonts/Roboto-700-latin.woff2.example +0 -0
  74. package/templates/app-demo/public/fonts/Roboto-700-vietnamese.woff2.example +0 -0
  75. package/templates/app-demo/public/fonts/fonts.css.example +144 -0
  76. package/templates/app-demo/public/logo.png.example +0 -0
  77. package/templates/app-demo/public/logo.svg.example +1 -0
  78. package/templates/app-demo/public/manifest.json.example +10 -0
  79. package/templates/app-demo/src/App.tsx.example +17 -0
  80. package/templates/app-demo/src/Routes.tsx.example +20 -0
  81. package/templates/app-demo/src/components/ThemeToggle.tsx.example +48 -0
  82. package/templates/app-demo/src/globals.css.example +4 -0
  83. package/templates/app-demo/src/main.tsx.example +27 -0
  84. package/templates/app-demo/src/pages/DetailPage.tsx.example +103 -0
  85. package/templates/app-demo/src/pages/FullPage.tsx.example +142 -0
  86. package/templates/app-demo/src/pages/HomePage.tsx.example +79 -0
  87. package/templates/app-demo/src/pages/components/ComponentRenderer.tsx.example +511 -0
  88. package/templates/app-demo/src/pages/components/ComponentsData.tsx.example +152 -0
  89. package/templates/app-demo/src/pages/components/DemoLayout.tsx.example +266 -0
  90. package/templates/app-demo/src/pages/components/LayoutRoute.tsx.example +20 -0
  91. package/templates/app-demo/src/pages/components/componentConfig.ts.example +921 -0
  92. package/templates/app-demo/src/themes.css.example +179 -0
  93. package/templates/app-demo/tsconfig.json.example +9 -0
  94. package/templates/app-demo/vite.config.ts.example +53 -0
  95. package/templates/app-next/.env.example +92 -0
  96. package/templates/app-next/next.config.ts.example +8 -0
  97. package/templates/app-next/postcss.config.js.example +58 -0
  98. package/templates/app-next/service-account-key.json.example +2 -0
  99. package/templates/app-next/src/app/ClientLayout.tsx.example +39 -0
  100. package/templates/app-next/src/app/layout.tsx.example +52 -0
  101. package/templates/app-next/src/app/not-found.tsx.example +21 -0
  102. package/templates/app-next/src/config/app.ts.example +75 -0
  103. package/templates/app-next/src/config/legal.ts.example +170 -0
  104. package/templates/app-next/src/globals.css.example +15 -0
  105. package/templates/app-next/src/locales/dndev_en.json.example +516 -0
  106. package/templates/app-next/src/pages/HomePage.tsx.example +20 -0
  107. package/templates/app-next/src/pages/legal/LegalNoticePage.tsx.example +75 -0
  108. package/templates/app-next/src/pages/legal/PrivacyPage.tsx.example +69 -0
  109. package/templates/app-next/src/pages/legal/TermsPage.tsx.example +71 -0
  110. package/templates/app-next/src/themes.css.example +179 -0
  111. package/templates/app-next/tsconfig.json.example +11 -0
  112. package/templates/app-payload/.env.example +28 -0
  113. package/templates/app-payload/README.md.example +233 -0
  114. package/templates/app-payload/collections/Company.ts.example +125 -0
  115. package/templates/app-payload/collections/Hero.ts.example +62 -0
  116. package/templates/app-payload/collections/Media.ts.example +41 -0
  117. package/templates/app-payload/collections/Products.ts.example +115 -0
  118. package/templates/app-payload/collections/Services.ts.example +104 -0
  119. package/templates/app-payload/collections/Testimonials.ts.example +92 -0
  120. package/templates/app-payload/collections/Users.ts.example +35 -0
  121. package/templates/app-payload/src/server.ts.example +79 -0
  122. package/templates/app-payload/tsconfig.json.example +24 -0
  123. package/templates/app-vite/.env.example +77 -0
  124. package/templates/app-vite/index.html.example +127 -0
  125. package/templates/app-vite/service-account-key.json.example +2 -0
  126. package/templates/app-vite/src/App.tsx.example +39 -0
  127. package/templates/app-vite/src/Routes.tsx.example +16 -0
  128. package/templates/app-vite/src/config/app.ts.example +75 -0
  129. package/templates/app-vite/src/config/legal.ts.example +170 -0
  130. package/templates/app-vite/src/globals.css.example +11 -0
  131. package/templates/app-vite/src/locales/dndev_en.json.example +516 -0
  132. package/templates/app-vite/src/main.tsx.example +21 -0
  133. package/templates/app-vite/src/pages/HomePage.tsx.example +22 -0
  134. package/templates/app-vite/src/pages/NotFoundPage.tsx.example +33 -0
  135. package/templates/app-vite/src/pages/legal/LegalNoticePage.tsx.example +75 -0
  136. package/templates/app-vite/src/pages/legal/PrivacyPage.tsx.example +69 -0
  137. package/templates/app-vite/src/pages/legal/TermsPage.tsx.example +71 -0
  138. package/templates/app-vite/src/pages/locales/README.md.example +1 -0
  139. package/templates/app-vite/src/pages/locales/example_en.json.example +5 -0
  140. package/templates/app-vite/src/themes.css.example +179 -0
  141. package/templates/app-vite/tsconfig.json.example +9 -0
  142. package/templates/app-vite/vite.config.ts.example +9 -0
  143. package/templates/functions-firebase/README.md.example +129 -0
  144. package/templates/functions-firebase/build.mjs.example +52 -0
  145. package/templates/functions-firebase/functions-firebase/.env.example.example +45 -0
  146. package/templates/functions-firebase/functions-firebase/README.md.example +123 -0
  147. package/templates/functions-firebase/functions-firebase/build.mjs.example +52 -0
  148. package/templates/functions-firebase/functions-firebase/src/auth/getCustomClaims.ts.example +19 -0
  149. package/templates/functions-firebase/functions-firebase/src/auth/getUserAuthStatus.ts.example +21 -0
  150. package/templates/functions-firebase/functions-firebase/src/auth/index.ts.example +11 -0
  151. package/templates/functions-firebase/functions-firebase/src/auth/removeCustomClaims.ts.example +21 -0
  152. package/templates/functions-firebase/functions-firebase/src/auth/setCustomClaims.ts.example +21 -0
  153. package/templates/functions-firebase/functions-firebase/src/billing/handleStripeWebhook.ts.example +24 -0
  154. package/templates/functions-firebase/functions-firebase/src/billing/index.ts.example +10 -0
  155. package/templates/functions-firebase/functions-firebase/src/billing/processPaymentSuccess.ts.example +14 -0
  156. package/templates/functions-firebase/functions-firebase/src/billing/refreshSubscriptionStatus.ts.example +14 -0
  157. package/templates/functions-firebase/functions-firebase/src/crud/createEntity.ts.example +19 -0
  158. package/templates/functions-firebase/functions-firebase/src/crud/deleteEntity.ts.example +14 -0
  159. package/templates/functions-firebase/functions-firebase/src/crud/getEntity.ts.example +14 -0
  160. package/templates/functions-firebase/functions-firebase/src/crud/index.ts.example +12 -0
  161. package/templates/functions-firebase/functions-firebase/src/crud/listEntities.ts.example +14 -0
  162. package/templates/functions-firebase/functions-firebase/src/crud/updateEntity.ts.example +14 -0
  163. package/templates/functions-firebase/functions-firebase/src/index.ts.example +45 -0
  164. package/templates/functions-firebase/functions-firebase/src/oauth/checkGitHubAccess.ts.example +14 -0
  165. package/templates/functions-firebase/functions-firebase/src/oauth/disconnect.ts.example +14 -0
  166. package/templates/functions-firebase/functions-firebase/src/oauth/exchangeToken.ts.example +14 -0
  167. package/templates/functions-firebase/functions-firebase/src/oauth/getConnections.ts.example +14 -0
  168. package/templates/functions-firebase/functions-firebase/src/oauth/grantGitHubAccess.ts.example +14 -0
  169. package/templates/functions-firebase/functions-firebase/src/oauth/index.ts.example +17 -0
  170. package/templates/functions-firebase/functions-firebase/src/oauth/refreshToken.ts.example +14 -0
  171. package/templates/functions-firebase/functions-firebase/src/oauth/revokeGitHubAccess.ts.example +14 -0
  172. package/templates/functions-firebase/functions-firebase/tsconfig.json.example +21 -0
  173. package/templates/functions-firebase/functions.yaml.example +14 -0
  174. package/templates/functions-firebase/src/auth/getCustomClaims.ts.example +19 -0
  175. package/templates/functions-firebase/src/auth/getUserAuthStatus.ts.example +21 -0
  176. package/templates/functions-firebase/src/auth/index.ts.example +11 -0
  177. package/templates/functions-firebase/src/auth/removeCustomClaims.ts.example +21 -0
  178. package/templates/functions-firebase/src/auth/setCustomClaims.ts.example +21 -0
  179. package/templates/functions-firebase/src/billing/handleStripeWebhook.ts.example +24 -0
  180. package/templates/functions-firebase/src/billing/index.ts.example +10 -0
  181. package/templates/functions-firebase/src/billing/processPaymentSuccess.ts.example +14 -0
  182. package/templates/functions-firebase/src/billing/refreshSubscriptionStatus.ts.example +14 -0
  183. package/templates/functions-firebase/src/crud/createEntity.ts.example +19 -0
  184. package/templates/functions-firebase/src/crud/deleteEntity.ts.example +14 -0
  185. package/templates/functions-firebase/src/crud/getEntity.ts.example +14 -0
  186. package/templates/functions-firebase/src/crud/index.ts.example +12 -0
  187. package/templates/functions-firebase/src/crud/listEntities.ts.example +14 -0
  188. package/templates/functions-firebase/src/crud/updateEntity.ts.example +14 -0
  189. package/templates/functions-firebase/src/index.ts.example +45 -0
  190. package/templates/functions-firebase/src/oauth/checkGitHubAccess.ts.example +14 -0
  191. package/templates/functions-firebase/src/oauth/disconnect.ts.example +14 -0
  192. package/templates/functions-firebase/src/oauth/exchangeToken.ts.example +14 -0
  193. package/templates/functions-firebase/src/oauth/getConnections.ts.example +14 -0
  194. package/templates/functions-firebase/src/oauth/grantGitHubAccess.ts.example +14 -0
  195. package/templates/functions-firebase/src/oauth/index.ts.example +17 -0
  196. package/templates/functions-firebase/src/oauth/refreshToken.ts.example +14 -0
  197. package/templates/functions-firebase/src/oauth/revokeGitHubAccess.ts.example +14 -0
  198. package/templates/functions-firebase/tsconfig.json.example +24 -0
  199. package/templates/functions-vercel/README.md.example +116 -0
  200. package/templates/functions-vercel/build.mjs.example +52 -0
  201. package/templates/functions-vercel/functions-vercel/.env.example.example +37 -0
  202. package/templates/functions-vercel/functions-vercel/README.md.example +116 -0
  203. package/templates/functions-vercel/functions-vercel/build.mjs.example +52 -0
  204. package/templates/functions-vercel/functions-vercel/src/api/auth/getCustomClaims.ts.example +20 -0
  205. package/templates/functions-vercel/functions-vercel/src/api/auth/getUserAuthStatus.ts.example +20 -0
  206. package/templates/functions-vercel/functions-vercel/src/api/auth/removeCustomClaims.ts.example +20 -0
  207. package/templates/functions-vercel/functions-vercel/src/api/auth/setCustomClaims.ts.example +20 -0
  208. package/templates/functions-vercel/functions-vercel/src/api/billing/handleStripeWebhook.ts.example +20 -0
  209. package/templates/functions-vercel/functions-vercel/src/api/billing/processPaymentSuccess.ts.example +20 -0
  210. package/templates/functions-vercel/functions-vercel/src/api/billing/refreshSubscriptionStatus.ts.example +20 -0
  211. package/templates/functions-vercel/functions-vercel/src/api/crud/createEntity.ts.example +20 -0
  212. package/templates/functions-vercel/functions-vercel/src/api/crud/deleteEntity.ts.example +20 -0
  213. package/templates/functions-vercel/functions-vercel/src/api/crud/getEntity.ts.example +20 -0
  214. package/templates/functions-vercel/functions-vercel/src/api/crud/listEntities.ts.example +20 -0
  215. package/templates/functions-vercel/functions-vercel/src/api/crud/updateEntity.ts.example +20 -0
  216. package/templates/functions-vercel/functions-vercel/src/api/oauth/checkGitHubAccess.ts.example +20 -0
  217. package/templates/functions-vercel/functions-vercel/src/api/oauth/disconnect.ts.example +20 -0
  218. package/templates/functions-vercel/functions-vercel/src/api/oauth/exchangeToken.ts.example +20 -0
  219. package/templates/functions-vercel/functions-vercel/src/api/oauth/getConnections.ts.example +20 -0
  220. package/templates/functions-vercel/functions-vercel/src/api/oauth/grantGitHubAccess.ts.example +20 -0
  221. package/templates/functions-vercel/functions-vercel/src/api/oauth/refreshToken.ts.example +20 -0
  222. package/templates/functions-vercel/functions-vercel/src/api/oauth/revokeGitHubAccess.ts.example +20 -0
  223. package/templates/functions-vercel/functions-vercel/tsconfig.json.example +21 -0
  224. package/templates/functions-vercel/functions-vercel/vercel.json.example +14 -0
  225. package/templates/functions-vercel/src/api/auth/getCustomClaims.ts.example +20 -0
  226. package/templates/functions-vercel/src/api/auth/getUserAuthStatus.ts.example +20 -0
  227. package/templates/functions-vercel/src/api/auth/removeCustomClaims.ts.example +20 -0
  228. package/templates/functions-vercel/src/api/auth/setCustomClaims.ts.example +20 -0
  229. package/templates/functions-vercel/src/api/billing/handleStripeWebhook.ts.example +20 -0
  230. package/templates/functions-vercel/src/api/billing/processPaymentSuccess.ts.example +20 -0
  231. package/templates/functions-vercel/src/api/billing/refreshSubscriptionStatus.ts.example +20 -0
  232. package/templates/functions-vercel/src/api/crud/createEntity.ts.example +20 -0
  233. package/templates/functions-vercel/src/api/crud/deleteEntity.ts.example +20 -0
  234. package/templates/functions-vercel/src/api/crud/getEntity.ts.example +20 -0
  235. package/templates/functions-vercel/src/api/crud/listEntities.ts.example +20 -0
  236. package/templates/functions-vercel/src/api/crud/updateEntity.ts.example +20 -0
  237. package/templates/functions-vercel/src/api/oauth/checkGitHubAccess.ts.example +20 -0
  238. package/templates/functions-vercel/src/api/oauth/disconnect.ts.example +20 -0
  239. package/templates/functions-vercel/src/api/oauth/exchangeToken.ts.example +20 -0
  240. package/templates/functions-vercel/src/api/oauth/getConnections.ts.example +20 -0
  241. package/templates/functions-vercel/src/api/oauth/grantGitHubAccess.ts.example +20 -0
  242. package/templates/functions-vercel/src/api/oauth/refreshToken.ts.example +20 -0
  243. package/templates/functions-vercel/src/api/oauth/revokeGitHubAccess.ts.example +20 -0
  244. package/templates/functions-vercel/tsconfig.json.example +24 -0
  245. package/templates/functions-vercel/vercel.json.example +14 -0
  246. package/templates/github/github/workflows/firebase-deploy.yml.example +79 -0
  247. package/templates/github/workflows/firebase-deploy.yml.example +79 -0
  248. package/templates/root-consumer/.env.example +19 -0
  249. package/templates/root-consumer/.gitignore.example +82 -0
  250. package/templates/root-consumer/.prettierrc.cjs.example +12 -0
  251. package/templates/root-consumer/CLAUDE.md.example +73 -0
  252. package/templates/root-consumer/README.md.example +295 -0
  253. package/templates/root-consumer/bunfig.toml.example +68 -0
  254. package/templates/root-consumer/eslint.config.js.example +336 -0
  255. package/templates/root-consumer/firebase.json.example +348 -0
  256. package/templates/root-consumer/guides/AGENT_START_HERE.md.example +98 -0
  257. package/templates/root-consumer/guides/APP_CHECK_SETUP.md.example +111 -0
  258. package/templates/root-consumer/guides/AUTH_SETUP.md.example +92 -0
  259. package/templates/root-consumer/guides/BILLING_SETUP.md.example +120 -0
  260. package/templates/root-consumer/guides/CLI.md.example +293 -0
  261. package/templates/root-consumer/guides/COMPONENTS.md.example +875 -0
  262. package/templates/root-consumer/guides/CONFIG_SETUP.md.example +132 -0
  263. package/templates/root-consumer/guides/EMULATOR_SETUP.md.example +48 -0
  264. package/templates/root-consumer/guides/FEATURES.md.example +286 -0
  265. package/templates/root-consumer/guides/FRAMEWORK_OVERVIEW.md.example +97 -0
  266. package/templates/root-consumer/guides/FUNCTIONS.md.example +177 -0
  267. package/templates/root-consumer/guides/GETTING_STARTED.md.example +451 -0
  268. package/templates/root-consumer/guides/HOW_TO_USE.md.example +296 -0
  269. package/templates/root-consumer/guides/I18N_SETUP.md.example +204 -0
  270. package/templates/root-consumer/guides/IMPORT_PATTERNS.md.example +79 -0
  271. package/templates/root-consumer/guides/INDEX.md.example +50 -0
  272. package/templates/root-consumer/guides/INSTALLATION.md.example +296 -0
  273. package/templates/root-consumer/guides/LAYOUTS.md.example +310 -0
  274. package/templates/root-consumer/guides/PAGES_SETUP.md.example +123 -0
  275. package/templates/root-consumer/guides/STYLING.md.example +273 -0
  276. package/templates/root-consumer/guides/THEMING_SETUP.md.example +119 -0
  277. package/templates/root-consumer/guides/VERSION_CONTROL.md.example +181 -0
  278. package/templates/root-consumer/tsconfig.functions.json.example +15 -0
  279. package/templates/root-consumer/tsconfig.json.example +18 -0
  280. package/templates/root-consumer/turbo.json.example +46 -0
  281. package/templates/root-consumer/vercel.json.example +124 -0
@@ -0,0 +1,116 @@
1
+ # {{APP_NAME}} Functions
2
+
3
+ This directory contains the Vercel Functions for the {{APP_NAME}} app, generated using the DoNotDev framework's scaffolding system.
4
+
5
+ ## Structure
6
+
7
+ ```
8
+ functions/
9
+ ├── src/
10
+ │ └── api/
11
+ │ ├── auth/ # Authentication functions
12
+ │ ├── oauth/ # OAuth functions
13
+ │ └── billing/ # Billing functions
14
+ ├── package.json # Dependencies and scripts
15
+ ├── tsconfig.json # TypeScript configuration
16
+ ├── vercel.json # Vercel configuration
17
+ ├── .env.example # Environment variables template
18
+ └── README.md # This file
19
+ ```
20
+
21
+ ## Features
22
+
23
+ - **Authentication Management**: User custom claims and auth status
24
+ - **OAuth Integration**: GitHub access management
25
+ - **Billing Processing**: Stripe checkout and webhook handling
26
+ - **Secure API Layer**: Professional frontend-backend communication
27
+ - **Error Handling**: Comprehensive error handling and logging
28
+
29
+ ## Environment Variables
30
+
31
+ ### File Structure
32
+
33
+ **Functions use a different .env system than Vite/Next.js:**
34
+ - `.env` → Local development only (not automatically loaded, use with dotenv if needed)
35
+ - Production → Use Vercel Environment Variables (synced automatically during `dndev deploy`)
36
+
37
+ **Note:** Functions don't follow Vite/Next.js `.env.local` priority rules. Use Vercel Environment Variables for production.
38
+
39
+ ### Required Environment Variables
40
+
41
+ ```bash
42
+ # Stripe Configuration
43
+ STRIPE_SECRET_KEY=sk_live_...
44
+ STRIPE_WEBHOOK_SECRET=whsec_...
45
+
46
+ # GitHub Configuration
47
+ GITHUB_PERSONAL_ACCESS_TOKEN=ghp_...
48
+ GITHUB_REPO_OWNER=your-org
49
+ GITHUB_REPO_NAME=your-repo
50
+ ```
51
+
52
+ ### Setup Instructions
53
+
54
+ 1. **Stripe Setup**:
55
+ - Create products in Stripe Dashboard
56
+ - Get price IDs and add to frontend `.env.local` (dev) or `.env.production.local` (prod)
57
+ - Configure webhook endpoint in Stripe
58
+ - Add webhook secret to functions `.env` (local) or Vercel Environment Variables (production)
59
+
60
+ 2. **GitHub Setup**:
61
+ - Create Personal Access Token with `repo` scope
62
+ - Add token to functions `.env` (local) or Vercel Environment Variables (production)
63
+ - Configure repository owner/name
64
+
65
+ 3. **Vercel Setup**:
66
+ - Deploy: `dndev deploy` (from workspace root)
67
+ - Set environment variables in Vercel dashboard
68
+ - Update webhook URL in Stripe dashboard
69
+
70
+ ## Deployment
71
+
72
+ Use the unified deployment command from workspace root:
73
+
74
+ ```bash
75
+ # Deploy everything (interactive)
76
+ dndev deploy
77
+
78
+ # Deploy specific app
79
+ dndev deploy <app-name>
80
+ ```
81
+
82
+ ## Development
83
+
84
+ ```bash
85
+ # Start Vercel development server
86
+ bun run dev
87
+ ```
88
+
89
+ ## API Endpoints
90
+
91
+ ### Stripe Webhook
92
+
93
+ - **URL**: `https://your-app.vercel.app/api/billing/handleStripeWebhook`
94
+ - **Events**: `checkout.session.completed`
95
+ - **Purpose**: Processes purchases and grants access
96
+
97
+ ### Checkout Session
98
+
99
+ - **Integration**: Direct Stripe calls (no API needed)
100
+ - **Purpose**: Creates Stripe checkout sessions for purchases
101
+
102
+ ## Security
103
+
104
+ - All functions require authentication
105
+ - Webhook signature verification
106
+ - Secure GitHub token management
107
+ - Environment variable protection
108
+
109
+ ## Framework Integration
110
+
111
+ This functions package demonstrates how to:
112
+
113
+ - Use the framework's scaffolding system
114
+ - Implement secure API communication
115
+ - Handle complex purchase flows
116
+ - Integrate with external services (Stripe, GitHub)
@@ -0,0 +1,52 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * @fileoverview Build script for {{APP_NAME}} Vercel functions
4
+ * @description Bundles @donotdev/types and imports framework functions
5
+ */
6
+
7
+ import { build } from 'esbuild';
8
+ import { createAppFunctionsConfig } from '@donotdev/core/functions';
9
+
10
+ async function buildFunctions() {
11
+ console.log('🔨 Building {{APP_NAME}} Vercel functions...');
12
+
13
+ try {
14
+ const config = createAppFunctionsConfig({
15
+ entry: 'src/index.ts',
16
+ outDir: 'lib',
17
+ minify: process.env.NODE_ENV === 'production',
18
+ sourcemap: true,
19
+ });
20
+
21
+ console.log('📦 Bundling @donotdev/types and importing framework functions...');
22
+
23
+ const result = await build(config);
24
+
25
+ if (result.errors.length > 0) {
26
+ console.error('❌ Build errors:', result.errors);
27
+ process.exit(1);
28
+ }
29
+
30
+ if (result.warnings.length > 0) {
31
+ console.warn('⚠️ Build warnings:', result.warnings);
32
+ }
33
+
34
+ console.log('✅ {{APP_NAME}} Vercel functions built successfully!');
35
+ console.log('📁 Output directory: lib/');
36
+
37
+ // Log bundle info if metafile is available
38
+ if (result.metafile) {
39
+ const { analyzeMetafile } = await import('esbuild');
40
+ const analysis = await analyzeMetafile(result.metafile);
41
+ console.log('\n📊 Bundle analysis:');
42
+ console.log(analysis);
43
+ }
44
+
45
+ } catch (error) {
46
+ console.error('❌ Build failed:', error);
47
+ process.exit(1);
48
+ }
49
+ }
50
+
51
+ // Run the build
52
+ buildFunctions();
@@ -0,0 +1,20 @@
1
+ // functions/src/api/auth/getCustomClaims.ts
2
+
3
+ /**
4
+ * @fileoverview {{APP_NAME}} Get Custom Claims Wrapper
5
+ * @description Wrapper for framework's getCustomClaims with {{APP_NAME}}-specific configuration
6
+ */
7
+
8
+ import type { NextApiRequest, NextApiResponse } from 'next';
9
+ import { getCustomClaims as frameworkGetCustomClaims } from '@donotdev/functions/vercel';
10
+
11
+ /**
12
+ * {{APP_NAME}} custom claims retrieval
13
+ * Wraps the framework function with {{APP_NAME}}-specific configuration
14
+ */
15
+ export default async function handler(
16
+ req: NextApiRequest,
17
+ res: NextApiResponse
18
+ ) {
19
+ return frameworkGetCustomClaims(req, res);
20
+ }
@@ -0,0 +1,20 @@
1
+ // functions/src/api/auth/getUserAuthStatus.ts
2
+
3
+ /**
4
+ * @fileoverview {{APP_NAME}} User Auth Status Wrapper
5
+ * @description Wrapper for framework's getUserAuthStatus with {{APP_NAME}}-specific configuration
6
+ */
7
+
8
+ import type { NextApiRequest, NextApiResponse } from 'next';
9
+ import { getUserAuthStatus as frameworkGetUserAuthStatus } from '@donotdev/functions/vercel';
10
+
11
+ /**
12
+ * {{APP_NAME}} user authentication status
13
+ * Wraps the framework function with {{APP_NAME}}-specific configuration
14
+ */
15
+ export default async function handler(
16
+ req: NextApiRequest,
17
+ res: NextApiResponse
18
+ ) {
19
+ return frameworkGetUserAuthStatus(req, res);
20
+ }
@@ -0,0 +1,20 @@
1
+ // functions/src/api/auth/removeCustomClaims.ts
2
+
3
+ /**
4
+ * @fileoverview {{APP_NAME}} Remove Custom Claims Wrapper
5
+ * @description Wrapper for framework's removeCustomClaims with {{APP_NAME}}-specific configuration
6
+ */
7
+
8
+ import type { NextApiRequest, NextApiResponse } from 'next';
9
+ import { removeCustomClaims as frameworkRemoveCustomClaims } from '@donotdev/functions/vercel';
10
+
11
+ /**
12
+ * {{APP_NAME}} custom claims removal
13
+ * Wraps the framework function with {{APP_NAME}}-specific configuration
14
+ */
15
+ export default async function handler(
16
+ req: NextApiRequest,
17
+ res: NextApiResponse
18
+ ) {
19
+ return frameworkRemoveCustomClaims(req, res);
20
+ }
@@ -0,0 +1,20 @@
1
+ // functions/src/api/auth/setCustomClaims.ts
2
+
3
+ /**
4
+ * @fileoverview {{APP_NAME}} Set Custom Claims Wrapper
5
+ * @description Wrapper for framework's setCustomClaims with {{APP_NAME}}-specific configuration
6
+ */
7
+
8
+ import type { NextApiRequest, NextApiResponse } from 'next';
9
+ import { setCustomClaims as frameworkSetCustomClaims } from '@donotdev/functions/vercel';
10
+
11
+ /**
12
+ * {{APP_NAME}} custom claims setting
13
+ * Wraps the framework function with {{APP_NAME}}-specific configuration
14
+ */
15
+ export default async function handler(
16
+ req: NextApiRequest,
17
+ res: NextApiResponse
18
+ ) {
19
+ return frameworkSetCustomClaims(req, res);
20
+ }
@@ -0,0 +1,20 @@
1
+ // functions/src/api/billing/handleStripeWebhook.ts
2
+
3
+ /**
4
+ * @fileoverview {{APP_NAME}} Stripe Webhook Wrapper
5
+ * @description Wrapper for framework's handleStripeWebhook with {{APP_NAME}}-specific configuration
6
+ */
7
+
8
+ import type { NextApiRequest, NextApiResponse } from 'next';
9
+ import { handleStripeWebhook as frameworkHandleStripeWebhook } from '@donotdev/functions/vercel';
10
+
11
+ /**
12
+ * {{APP_NAME}} Stripe webhook handler
13
+ * Configured with {{APP_NAME}}-specific product types and settings
14
+ */
15
+ export default async function handler(
16
+ req: NextApiRequest,
17
+ res: NextApiResponse
18
+ ) {
19
+ return frameworkHandleStripeWebhook(req, res);
20
+ }
@@ -0,0 +1,20 @@
1
+ // functions/src/api/billing/processPaymentSuccess.ts
2
+
3
+ /**
4
+ * @fileoverview {{APP_NAME}} Payment Success Wrapper
5
+ * @description Wrapper for framework's processPaymentSuccess with {{APP_NAME}}-specific configuration
6
+ */
7
+
8
+ import type { NextApiRequest, NextApiResponse } from 'next';
9
+ import { processPaymentSuccess as frameworkProcessPaymentSuccess } from '@donotdev/functions/vercel';
10
+
11
+ /**
12
+ * {{APP_NAME}} payment success processing
13
+ * Wraps the framework function with {{APP_NAME}}-specific configuration
14
+ */
15
+ export default async function handler(
16
+ req: NextApiRequest,
17
+ res: NextApiResponse
18
+ ) {
19
+ return frameworkProcessPaymentSuccess(req, res);
20
+ }
@@ -0,0 +1,20 @@
1
+ // functions/src/api/billing/refreshSubscriptionStatus.ts
2
+
3
+ /**
4
+ * @fileoverview {{APP_NAME}} Subscription Status Wrapper
5
+ * @description Wrapper for framework's refreshSubscriptionStatus with {{APP_NAME}}-specific configuration
6
+ */
7
+
8
+ import type { NextApiRequest, NextApiResponse } from 'next';
9
+ import { refreshSubscriptionStatus as frameworkRefreshSubscriptionStatus } from '@donotdev/functions/vercel';
10
+
11
+ /**
12
+ * {{APP_NAME}} subscription status refresh
13
+ * Wraps the framework function with {{APP_NAME}}-specific configuration
14
+ */
15
+ export default async function handler(
16
+ req: NextApiRequest,
17
+ res: NextApiResponse
18
+ ) {
19
+ return frameworkRefreshSubscriptionStatus(req, res);
20
+ }
@@ -0,0 +1,20 @@
1
+ // functions/src/api/crud/createEntity.ts
2
+
3
+ /**
4
+ * @fileoverview {{APP_NAME}} Create Entity Wrapper
5
+ * @description Wrapper for framework's createEntity with {{APP_NAME}}-specific configuration
6
+ */
7
+
8
+ import type { NextApiRequest, NextApiResponse } from 'next';
9
+ import { createEntity as frameworkCreateEntity } from '@donotdev/functions/vercel';
10
+
11
+ /**
12
+ * {{APP_NAME}} entity creation
13
+ * Wraps the framework function with {{APP_NAME}}-specific configuration
14
+ */
15
+ export default async function handler(
16
+ req: NextApiRequest,
17
+ res: NextApiResponse
18
+ ) {
19
+ return frameworkCreateEntity(req, res);
20
+ }
@@ -0,0 +1,20 @@
1
+ // functions/src/api/crud/deleteEntity.ts
2
+
3
+ /**
4
+ * @fileoverview {{APP_NAME}} Delete Entity Wrapper
5
+ * @description Wrapper for framework's deleteEntity with {{APP_NAME}}-specific configuration
6
+ */
7
+
8
+ import type { NextApiRequest, NextApiResponse } from 'next';
9
+ import { deleteEntity as frameworkDeleteEntity } from '@donotdev/functions/vercel';
10
+
11
+ /**
12
+ * {{APP_NAME}} entity deletion
13
+ * Wraps the framework function with {{APP_NAME}}-specific configuration
14
+ */
15
+ export default async function handler(
16
+ req: NextApiRequest,
17
+ res: NextApiResponse
18
+ ) {
19
+ return frameworkDeleteEntity(req, res);
20
+ }
@@ -0,0 +1,20 @@
1
+ // functions/src/api/crud/getEntity.ts
2
+
3
+ /**
4
+ * @fileoverview {{APP_NAME}} Get Entity Wrapper
5
+ * @description Wrapper for framework's getEntity with {{APP_NAME}}-specific configuration
6
+ */
7
+
8
+ import type { NextApiRequest, NextApiResponse } from 'next';
9
+ import { getEntity as frameworkGetEntity } from '@donotdev/functions/vercel';
10
+
11
+ /**
12
+ * {{APP_NAME}} entity retrieval
13
+ * Wraps the framework function with {{APP_NAME}}-specific configuration
14
+ */
15
+ export default async function handler(
16
+ req: NextApiRequest,
17
+ res: NextApiResponse
18
+ ) {
19
+ return frameworkGetEntity(req, res);
20
+ }
@@ -0,0 +1,20 @@
1
+ // functions/src/api/crud/listEntities.ts
2
+
3
+ /**
4
+ * @fileoverview {{APP_NAME}} List Entities Wrapper
5
+ * @description Wrapper for framework's listEntities with {{APP_NAME}}-specific configuration
6
+ */
7
+
8
+ import type { NextApiRequest, NextApiResponse } from 'next';
9
+ import { listEntities as frameworkListEntities } from '@donotdev/functions/vercel';
10
+
11
+ /**
12
+ * {{APP_NAME}} entities listing
13
+ * Wraps the framework function with {{APP_NAME}}-specific configuration
14
+ */
15
+ export default async function handler(
16
+ req: NextApiRequest,
17
+ res: NextApiResponse
18
+ ) {
19
+ return frameworkListEntities(req, res);
20
+ }
@@ -0,0 +1,20 @@
1
+ // functions/src/api/crud/updateEntity.ts
2
+
3
+ /**
4
+ * @fileoverview {{APP_NAME}} Update Entity Wrapper
5
+ * @description Wrapper for framework's updateEntity with {{APP_NAME}}-specific configuration
6
+ */
7
+
8
+ import type { NextApiRequest, NextApiResponse } from 'next';
9
+ import { updateEntity as frameworkUpdateEntity } from '@donotdev/functions/vercel';
10
+
11
+ /**
12
+ * {{APP_NAME}} entity update
13
+ * Wraps the framework function with {{APP_NAME}}-specific configuration
14
+ */
15
+ export default async function handler(
16
+ req: NextApiRequest,
17
+ res: NextApiResponse
18
+ ) {
19
+ return frameworkUpdateEntity(req, res);
20
+ }
@@ -0,0 +1,20 @@
1
+ // functions/src/api/oauth/checkGitHubAccess.ts
2
+
3
+ /**
4
+ * @fileoverview {{APP_NAME}} GitHub Access Check Wrapper
5
+ * @description Wrapper for framework's checkGitHubAccess with {{APP_NAME}}-specific configuration
6
+ */
7
+
8
+ import type { NextApiRequest, NextApiResponse } from 'next';
9
+ import { checkGitHubAccess as frameworkCheckGitHubAccess } from '@donotdev/functions/vercel';
10
+
11
+ /**
12
+ * {{APP_NAME}} GitHub access checking
13
+ * Wraps the framework function with {{APP_NAME}}-specific configuration
14
+ */
15
+ export default async function handler(
16
+ req: NextApiRequest,
17
+ res: NextApiResponse
18
+ ) {
19
+ return frameworkCheckGitHubAccess(req, res);
20
+ }
@@ -0,0 +1,20 @@
1
+ // functions/src/api/oauth/disconnect.ts
2
+
3
+ /**
4
+ * @fileoverview {{APP_NAME}} Disconnect OAuth Wrapper
5
+ * @description Wrapper for framework's disconnect with {{APP_NAME}}-specific configuration
6
+ */
7
+
8
+ import type { NextApiRequest, NextApiResponse } from 'next';
9
+ import { disconnect as frameworkDisconnect } from '@donotdev/functions/vercel';
10
+
11
+ /**
12
+ * {{APP_NAME}} OAuth disconnection
13
+ * Wraps the framework function with {{APP_NAME}}-specific configuration
14
+ */
15
+ export default async function handler(
16
+ req: NextApiRequest,
17
+ res: NextApiResponse
18
+ ) {
19
+ return frameworkDisconnect(req, res);
20
+ }
@@ -0,0 +1,20 @@
1
+ // functions/src/api/oauth/exchangeToken.ts
2
+
3
+ /**
4
+ * @fileoverview {{APP_NAME}} Exchange Token Wrapper
5
+ * @description Wrapper for framework's exchangeToken with {{APP_NAME}}-specific configuration
6
+ */
7
+
8
+ import type { NextApiRequest, NextApiResponse } from 'next';
9
+ import { exchangeToken as frameworkExchangeToken } from '@donotdev/functions/vercel';
10
+
11
+ /**
12
+ * {{APP_NAME}} OAuth token exchange
13
+ * Wraps the framework function with {{APP_NAME}}-specific configuration
14
+ */
15
+ export default async function handler(
16
+ req: NextApiRequest,
17
+ res: NextApiResponse
18
+ ) {
19
+ return frameworkExchangeToken(req, res);
20
+ }
@@ -0,0 +1,20 @@
1
+ // functions/src/api/oauth/getConnections.ts
2
+
3
+ /**
4
+ * @fileoverview {{APP_NAME}} Get Connections Wrapper
5
+ * @description Wrapper for framework's getConnections with {{APP_NAME}}-specific configuration
6
+ */
7
+
8
+ import type { NextApiRequest, NextApiResponse } from 'next';
9
+ import { getConnections as frameworkGetConnections } from '@donotdev/functions/vercel';
10
+
11
+ /**
12
+ * {{APP_NAME}} OAuth connections retrieval
13
+ * Wraps the framework function with {{APP_NAME}}-specific configuration
14
+ */
15
+ export default async function handler(
16
+ req: NextApiRequest,
17
+ res: NextApiResponse
18
+ ) {
19
+ return frameworkGetConnections(req, res);
20
+ }
@@ -0,0 +1,20 @@
1
+ // functions/src/api/oauth/grantGitHubAccess.ts
2
+
3
+ /**
4
+ * @fileoverview {{APP_NAME}} GitHub Access Wrapper
5
+ * @description Wrapper for framework's grantGitHubAccess with {{APP_NAME}}-specific configuration
6
+ */
7
+
8
+ import type { NextApiRequest, NextApiResponse } from 'next';
9
+ import { grantGitHubAccess as frameworkGrantGitHubAccess } from '@donotdev/functions/vercel';
10
+
11
+ /**
12
+ * {{APP_NAME}} GitHub access granting
13
+ * Wraps the framework function with {{APP_NAME}}-specific configuration
14
+ */
15
+ export default async function handler(
16
+ req: NextApiRequest,
17
+ res: NextApiResponse
18
+ ) {
19
+ return frameworkGrantGitHubAccess(req, res);
20
+ }
@@ -0,0 +1,20 @@
1
+ // functions/src/api/oauth/refreshToken.ts
2
+
3
+ /**
4
+ * @fileoverview {{APP_NAME}} Refresh Token Wrapper
5
+ * @description Wrapper for framework's refreshToken with {{APP_NAME}}-specific configuration
6
+ */
7
+
8
+ import type { NextApiRequest, NextApiResponse } from 'next';
9
+ import { refreshToken as frameworkRefreshToken } from '@donotdev/functions/vercel';
10
+
11
+ /**
12
+ * {{APP_NAME}} OAuth token refresh
13
+ * Wraps the framework function with {{APP_NAME}}-specific configuration
14
+ */
15
+ export default async function handler(
16
+ req: NextApiRequest,
17
+ res: NextApiResponse
18
+ ) {
19
+ return frameworkRefreshToken(req, res);
20
+ }
@@ -0,0 +1,20 @@
1
+ // functions/src/api/oauth/revokeGitHubAccess.ts
2
+
3
+ /**
4
+ * @fileoverview {{APP_NAME}} GitHub Access Revocation Wrapper
5
+ * @description Wrapper for framework's revokeGitHubAccess with {{APP_NAME}}-specific configuration
6
+ */
7
+
8
+ import type { NextApiRequest, NextApiResponse } from 'next';
9
+ import { revokeGitHubAccess as frameworkRevokeGitHubAccess } from '@donotdev/functions/vercel';
10
+
11
+ /**
12
+ * {{APP_NAME}} GitHub access revocation
13
+ * Wraps the framework function with {{APP_NAME}}-specific configuration
14
+ */
15
+ export default async function handler(
16
+ req: NextApiRequest,
17
+ res: NextApiResponse
18
+ ) {
19
+ return frameworkRevokeGitHubAccess(req, res);
20
+ }
@@ -0,0 +1,21 @@
1
+ {
2
+ "extends": "../../tsconfig.base.json",
3
+ "compilerOptions": {
4
+ "outDir": "./lib",
5
+ "rootDir": "./src",
6
+ "target": "ES2022",
7
+ "module": "ESNext",
8
+ "moduleResolution": "node",
9
+ "allowSyntheticDefaultImports": true,
10
+ "esModuleInterop": true,
11
+ "skipLibCheck": true,
12
+ "strict": true,
13
+ "forceConsistentCasingInFileNames": true,
14
+ "resolveJsonModule": true,
15
+ "declaration": true,
16
+ "declarationMap": true,
17
+ "sourceMap": true
18
+ },
19
+ "include": ["src/**/*"],
20
+ "exclude": ["node_modules", "lib", "**/*.test.ts"]
21
+ }
@@ -0,0 +1,14 @@
1
+ {
2
+ "functions": {
3
+ "src/api/**/*.ts": {
4
+ "runtime": "nodejs20.x"
5
+ }
6
+ },
7
+ "env": {
8
+ "STRIPE_SECRET_KEY": "@stripe-secret-key",
9
+ "STRIPE_WEBHOOK_SECRET": "@stripe-webhook-secret",
10
+ "GITHUB_PERSONAL_ACCESS_TOKEN": "@github-token",
11
+ "GITHUB_REPO_OWNER": "@github-repo-owner",
12
+ "GITHUB_REPO_NAME": "@github-repo-name"
13
+ }
14
+ }
@@ -0,0 +1,20 @@
1
+ // functions/src/api/auth/getCustomClaims.ts
2
+
3
+ /**
4
+ * @fileoverview {{APP_NAME}} Get Custom Claims Wrapper
5
+ * @description Wrapper for framework's getCustomClaims with {{APP_NAME}}-specific configuration
6
+ */
7
+
8
+ import type { NextApiRequest, NextApiResponse } from 'next';
9
+ import { getCustomClaims as frameworkGetCustomClaims } from '@donotdev/functions/vercel';
10
+
11
+ /**
12
+ * {{APP_NAME}} custom claims retrieval
13
+ * Wraps the framework function with {{APP_NAME}}-specific configuration
14
+ */
15
+ export default async function handler(
16
+ req: NextApiRequest,
17
+ res: NextApiResponse
18
+ ) {
19
+ return frameworkGetCustomClaims(req, res);
20
+ }
@@ -0,0 +1,20 @@
1
+ // functions/src/api/auth/getUserAuthStatus.ts
2
+
3
+ /**
4
+ * @fileoverview {{APP_NAME}} User Auth Status Wrapper
5
+ * @description Wrapper for framework's getUserAuthStatus with {{APP_NAME}}-specific configuration
6
+ */
7
+
8
+ import type { NextApiRequest, NextApiResponse } from 'next';
9
+ import { getUserAuthStatus as frameworkGetUserAuthStatus } from '@donotdev/functions/vercel';
10
+
11
+ /**
12
+ * {{APP_NAME}} user authentication status
13
+ * Wraps the framework function with {{APP_NAME}}-specific configuration
14
+ */
15
+ export default async function handler(
16
+ req: NextApiRequest,
17
+ res: NextApiResponse
18
+ ) {
19
+ return frameworkGetUserAuthStatus(req, res);
20
+ }