@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,123 @@
1
+ # {{APP_NAME}} Functions
2
+
3
+ This directory contains the Firebase Functions for the {{APP_NAME}} app, generated using the DoNotDev framework's scaffolding system.
4
+
5
+ ## Structure
6
+
7
+ ```
8
+ functions/
9
+ ├── src/
10
+ │ ├── auth/ # Authentication functions
11
+ │ ├── oauth/ # OAuth functions
12
+ │ ├── billing/ # Billing functions
13
+ │ └── index.ts # Main functions entry point
14
+ ├── package.json # Dependencies and scripts
15
+ ├── tsconfig.json # TypeScript configuration
16
+ ├── .env.example # Environment variables template
17
+ └── README.md # This file
18
+ ```
19
+
20
+ ## Features
21
+
22
+ - **Authentication Management**: User custom claims and auth status
23
+ - **OAuth Integration**: GitHub access management
24
+ - **Billing Processing**: Stripe checkout and webhook handling
25
+ - **Secure API Layer**: Professional frontend-backend communication
26
+ - **Error Handling**: Comprehensive error handling and logging
27
+
28
+ ## Environment Variables
29
+
30
+ ### File Structure
31
+
32
+ **Functions use a different .env system than Vite/Next.js:**
33
+ - `.env` → Local development only (not automatically loaded, use with dotenv if needed)
34
+ - Production → Use Firebase Functions Secrets (synced automatically during `dndev deploy`)
35
+
36
+ **Note:** Functions don't follow Vite/Next.js `.env.local` priority rules. Use Firebase Secrets for production.
37
+
38
+ ### Required Environment Variables
39
+
40
+ ```bash
41
+ # Stripe Configuration
42
+ STRIPE_SECRET_KEY=sk_live_...
43
+ STRIPE_WEBHOOK_SECRET=whsec_...
44
+
45
+ # GitHub Configuration
46
+ GITHUB_PERSONAL_ACCESS_TOKEN=ghp_...
47
+ GITHUB_REPO_OWNER=your-org
48
+ GITHUB_REPO_NAME=your-repo
49
+
50
+ # Firebase Configuration
51
+ FIREBASE_PROJECT_ID=your-project-id
52
+ FIREBASE_REGION=us-central1
53
+ ```
54
+
55
+ ### Setup Instructions
56
+
57
+ 1. **Stripe Setup**:
58
+ - Create products in Stripe Dashboard
59
+ - Get price IDs and add to frontend `.env.local` (dev) or `.env.production.local` (prod)
60
+ - Configure webhook endpoint in Stripe
61
+ - Add webhook secret to functions `.env` (local) or Firebase Secrets (production)
62
+
63
+ 2. **GitHub Setup**:
64
+ - Create Personal Access Token with `repo` scope
65
+ - Add token to functions `.env` (local) or Firebase Secrets (production)
66
+ - Configure repository owner/name
67
+
68
+ 3. **Firebase Setup**:
69
+ - Get service account key: Firebase Console → Project Settings → Service Accounts → "Generate new private key"
70
+ - Copy JSON content into `service-account-key.json` in app root (shared by frontend + functions)
71
+ - Deploy: `dndev deploy` (from workspace root)
72
+ - Update webhook URL in Stripe dashboard
73
+
74
+ ## Deployment
75
+
76
+ Use the unified deployment command from workspace root:
77
+
78
+ ```bash
79
+ # Deploy everything (interactive)
80
+ dndev deploy
81
+
82
+ # Deploy specific app
83
+ dndev deploy <app-name>
84
+ ```
85
+
86
+ ## Development
87
+
88
+ ```bash
89
+ # Start Firebase emulators
90
+ bun run serve
91
+
92
+ # Start with debugging
93
+ bun run dev
94
+ ```
95
+
96
+ ## API Endpoints
97
+
98
+ ### Stripe Webhook
99
+
100
+ - **URL**: `https://your-project.cloudfunctions.net/stripeWebhook`
101
+ - **Events**: `checkout.session.completed`
102
+ - **Purpose**: Processes purchases and grants access
103
+
104
+ ### Checkout Session
105
+
106
+ - **Integration**: Direct Stripe calls (no function needed)
107
+ - **Purpose**: Creates Stripe checkout sessions for purchases
108
+
109
+ ## Security
110
+
111
+ - All functions require authentication
112
+ - Webhook signature verification
113
+ - Secure GitHub token management
114
+ - Firebase custom claims for user status
115
+
116
+ ## Framework Integration
117
+
118
+ This functions package demonstrates how to:
119
+
120
+ - Use the framework's scaffolding system
121
+ - Implement secure API communication
122
+ - Handle complex purchase flows
123
+ - Integrate with external services (Stripe, GitHub)
@@ -0,0 +1,52 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * @fileoverview Build script for {{APP_NAME}} 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}} 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}} 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,19 @@
1
+ /**
2
+ * @fileoverview {{APP_NAME}} Get Custom Claims Wrapper
3
+ * @description Wrapper for framework's getCustomClaims with {{APP_NAME}}-specific configuration
4
+ * @version 0.0.1
5
+ * @since 0.0.1
6
+ * @author AMBROISE PARK Consulting
7
+ */
8
+
9
+ import { getCustomClaims as frameworkGetCustomClaims } from '@donotdev/functions/firebase';
10
+
11
+ /**
12
+ * {{APP_NAME}} custom claims retrieval
13
+ * Wraps the framework function with {{APP_NAME}}-specific configuration
14
+ *
15
+ * @version 0.0.1
16
+ * @since 0.0.1
17
+ * @author AMBROISE PARK Consulting
18
+ */
19
+ export const getCustomClaims = frameworkGetCustomClaims;
@@ -0,0 +1,21 @@
1
+ // functions/src/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
+ * @version 0.0.1
7
+ * @since 0.0.1
8
+ * @author AMBROISE PARK Consulting
9
+ */
10
+
11
+ import { getUserAuthStatus as frameworkGetUserAuthStatus } from '@donotdev/functions/firebase';
12
+
13
+ /**
14
+ * {{APP_NAME}} user authentication status
15
+ * Wraps the framework function with {{APP_NAME}}-specific configuration
16
+ *
17
+ * @version 0.0.1
18
+ * @since 0.0.1
19
+ * @author AMBROISE PARK Consulting
20
+ */
21
+ export const getUserAuthStatus = frameworkGetUserAuthStatus;
@@ -0,0 +1,11 @@
1
+ // functions/src/auth/index.ts
2
+
3
+ /**
4
+ * @fileoverview {{APP_NAME}} Auth Functions
5
+ * @description Exports all auth-related functions for the {{APP_NAME}} app
6
+ */
7
+
8
+ export { setCustomClaims } from './setCustomClaims';
9
+ export { getCustomClaims } from './getCustomClaims';
10
+ export { removeCustomClaims } from './removeCustomClaims';
11
+ export { getUserAuthStatus } from './getUserAuthStatus';
@@ -0,0 +1,21 @@
1
+ // functions/src/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
+ * @version 0.0.1
7
+ * @since 0.0.1
8
+ * @author AMBROISE PARK Consulting
9
+ */
10
+
11
+ import { removeCustomClaims as frameworkRemoveCustomClaims } from '@donotdev/functions/firebase';
12
+
13
+ /**
14
+ * {{APP_NAME}} custom claims removal
15
+ * Wraps the framework function with {{APP_NAME}}-specific configuration
16
+ *
17
+ * @version 0.0.1
18
+ * @since 0.0.1
19
+ * @author AMBROISE PARK Consulting
20
+ */
21
+ export const removeCustomClaims = frameworkRemoveCustomClaims;
@@ -0,0 +1,21 @@
1
+ // functions/src/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
+ * @version 0.0.1
7
+ * @since 0.0.1
8
+ * @author AMBROISE PARK Consulting
9
+ */
10
+
11
+ import { setCustomClaims as frameworkSetCustomClaims } from '@donotdev/functions/firebase';
12
+
13
+ /**
14
+ * {{APP_NAME}} custom claims setting
15
+ * Wraps the framework function with {{APP_NAME}}-specific configuration
16
+ *
17
+ * @version 0.0.1
18
+ * @since 0.0.1
19
+ * @author AMBROISE PARK Consulting
20
+ */
21
+ export const setCustomClaims = frameworkSetCustomClaims;
@@ -0,0 +1,24 @@
1
+ // functions/src/billing/handleStripeWebhook.ts
2
+
3
+ /**
4
+ * @fileoverview {{APP_NAME}} Stripe Webhook Wrapper
5
+ * @description Wrapper for framework's createStripeWebhookHandler with {{APP_NAME}}-specific configuration
6
+ */
7
+
8
+ import { createStripeWebhookHandler } from '@donotdev/functions/firebase';
9
+
10
+ /**
11
+ * {{APP_NAME}} Stripe webhook handler
12
+ * Configured with {{APP_NAME}}-specific product types and settings
13
+ */
14
+ export const stripeWebhook = createStripeWebhookHandler({
15
+ productTypes: {
16
+ // Add your product types here
17
+ // Example:
18
+ // premium_plan: {
19
+ // tier: 'premium',
20
+ // subscriptionEnd: '2099-12-31T23:59:59.000Z',
21
+ // githubRepo: { owner: 'your-org', repo: 'your-repo' },
22
+ // },
23
+ },
24
+ });
@@ -0,0 +1,10 @@
1
+ // functions/src/billing/index.ts
2
+
3
+ /**
4
+ * @fileoverview {{APP_NAME}} Billing Functions
5
+ * @description Exports all billing-related functions for the {{APP_NAME}} app
6
+ */
7
+
8
+ export { processPaymentSuccess } from './processPaymentSuccess';
9
+ export { refreshSubscriptionStatus } from './refreshSubscriptionStatus';
10
+ export { stripeWebhook } from './handleStripeWebhook';
@@ -0,0 +1,14 @@
1
+ // functions/src/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 { processPaymentSuccess as frameworkProcessPaymentSuccess } from '@donotdev/functions/firebase';
9
+
10
+ /**
11
+ * {{APP_NAME}} payment success processing
12
+ * Wraps the framework function with {{APP_NAME}}-specific configuration
13
+ */
14
+ export const processPaymentSuccess = frameworkProcessPaymentSuccess;
@@ -0,0 +1,14 @@
1
+ // functions/src/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 { refreshSubscriptionStatus as frameworkRefreshSubscriptionStatus } from '@donotdev/functions/firebase';
9
+
10
+ /**
11
+ * {{APP_NAME}} subscription status refresh
12
+ * Wraps the framework function with {{APP_NAME}}-specific configuration
13
+ */
14
+ export const refreshSubscriptionStatus = frameworkRefreshSubscriptionStatus;
@@ -0,0 +1,19 @@
1
+ /**
2
+ * @fileoverview {{APP_NAME}} Create Entity Wrapper
3
+ * @description Wrapper for framework's createEntity with {{APP_NAME}}-specific configuration
4
+ * @version 0.0.1
5
+ * @since 0.0.1
6
+ * @author AMBROISE PARK Consulting
7
+ */
8
+
9
+ import { createEntity as frameworkCreateEntity } from '@donotdev/functions/firebase';
10
+
11
+ /**
12
+ * {{APP_NAME}} entity creation
13
+ * Wraps the framework function with {{APP_NAME}}-specific configuration
14
+ *
15
+ * @version 0.0.1
16
+ * @since 0.0.1
17
+ * @author AMBROISE PARK Consulting
18
+ */
19
+ export const createEntity = frameworkCreateEntity;
@@ -0,0 +1,14 @@
1
+ // functions/src/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 { deleteEntity as frameworkDeleteEntity } from '@donotdev/functions/firebase';
9
+
10
+ /**
11
+ * {{APP_NAME}} entity deletion
12
+ * Wraps the framework function with {{APP_NAME}}-specific configuration
13
+ */
14
+ export const deleteEntity = frameworkDeleteEntity;
@@ -0,0 +1,14 @@
1
+ // functions/src/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 { getEntity as frameworkGetEntity } from '@donotdev/functions/firebase';
9
+
10
+ /**
11
+ * {{APP_NAME}} entity retrieval
12
+ * Wraps the framework function with {{APP_NAME}}-specific configuration
13
+ */
14
+ export const getEntity = frameworkGetEntity;
@@ -0,0 +1,12 @@
1
+ // functions/src/crud/index.ts
2
+
3
+ /**
4
+ * @fileoverview {{APP_NAME}} CRUD Functions
5
+ * @description Exports all CRUD-related functions for the {{APP_NAME}} app
6
+ */
7
+
8
+ export { createEntity } from './createEntity';
9
+ export { updateEntity } from './updateEntity';
10
+ export { deleteEntity } from './deleteEntity';
11
+ export { getEntity } from './getEntity';
12
+ export { listEntities } from './listEntities';
@@ -0,0 +1,14 @@
1
+ // functions/src/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 { listEntities as frameworkListEntities } from '@donotdev/functions/firebase';
9
+
10
+ /**
11
+ * {{APP_NAME}} entities listing
12
+ * Wraps the framework function with {{APP_NAME}}-specific configuration
13
+ */
14
+ export const listEntities = frameworkListEntities;
@@ -0,0 +1,14 @@
1
+ // functions/src/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 { updateEntity as frameworkUpdateEntity } from '@donotdev/functions/firebase';
9
+
10
+ /**
11
+ * {{APP_NAME}} entity update
12
+ * Wraps the framework function with {{APP_NAME}}-specific configuration
13
+ */
14
+ export const updateEntity = frameworkUpdateEntity;
@@ -0,0 +1,45 @@
1
+ // functions/src/index.ts
2
+
3
+ /**
4
+ * @fileoverview {{APP_NAME}} Firebase Functions
5
+ * @description {{APP_NAME}} functions that wrap framework functions with {{APP_NAME}}-specific configuration
6
+ */
7
+
8
+ import { initializeApp } from 'firebase-admin/app';
9
+
10
+ // Initialize Firebase Admin if not already initialized
11
+ if (!(globalThis as any).__FIREBASE_ADMIN_INITIALIZED__) {
12
+ initializeApp();
13
+ (globalThis as any).__FIREBASE_ADMIN_INITIALIZED__ = true;
14
+ }
15
+
16
+ // Export auth functions
17
+ export {
18
+ setCustomClaims,
19
+ getCustomClaims,
20
+ removeCustomClaims,
21
+ getUserAuthStatus,
22
+ } from './auth';
23
+
24
+ // Export OAuth functions
25
+ export {
26
+ grantGitHubAccess,
27
+ revokeGitHubAccess,
28
+ checkGitHubAccess,
29
+ } from './oauth';
30
+
31
+ // Export CRUD functions
32
+ export {
33
+ createEntity,
34
+ updateEntity,
35
+ deleteEntity,
36
+ getEntity,
37
+ listEntities,
38
+ } from './crud';
39
+
40
+ // Export billing functions
41
+ export {
42
+ processPaymentSuccess,
43
+ refreshSubscriptionStatus,
44
+ stripeWebhook,
45
+ } from './billing';
@@ -0,0 +1,14 @@
1
+ // functions/src/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 { checkGitHubAccess as frameworkCheckGitHubAccess } from '@donotdev/functions/firebase';
9
+
10
+ /**
11
+ * {{APP_NAME}} GitHub access checking
12
+ * Wraps the framework function with {{APP_NAME}}-specific configuration
13
+ */
14
+ export const checkGitHubAccess = frameworkCheckGitHubAccess;
@@ -0,0 +1,14 @@
1
+ // functions/src/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 { disconnect as frameworkDisconnect } from '@donotdev/functions/firebase';
9
+
10
+ /**
11
+ * {{APP_NAME}} OAuth disconnection
12
+ * Wraps the framework function with {{APP_NAME}}-specific configuration
13
+ */
14
+ export const disconnect = frameworkDisconnect;
@@ -0,0 +1,14 @@
1
+ // functions/src/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 { exchangeToken as frameworkExchangeToken } from '@donotdev/functions/firebase';
9
+
10
+ /**
11
+ * {{APP_NAME}} OAuth token exchange
12
+ * Wraps the framework function with {{APP_NAME}}-specific configuration
13
+ */
14
+ export const exchangeToken = frameworkExchangeToken;
@@ -0,0 +1,14 @@
1
+ // functions/src/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 { getConnections as frameworkGetConnections } from '@donotdev/functions/firebase';
9
+
10
+ /**
11
+ * {{APP_NAME}} OAuth connections retrieval
12
+ * Wraps the framework function with {{APP_NAME}}-specific configuration
13
+ */
14
+ export const getConnections = frameworkGetConnections;
@@ -0,0 +1,14 @@
1
+ // functions/src/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 { grantGitHubAccess as frameworkGrantGitHubAccess } from '@donotdev/functions/firebase';
9
+
10
+ /**
11
+ * {{APP_NAME}} GitHub access granting
12
+ * Wraps the framework function with {{APP_NAME}}-specific configuration
13
+ */
14
+ export const grantGitHubAccess = frameworkGrantGitHubAccess;
@@ -0,0 +1,17 @@
1
+ // functions/src/oauth/index.ts
2
+
3
+ /**
4
+ * @fileoverview {{APP_NAME}} OAuth Functions
5
+ * @description Exports all OAuth-related functions for the {{APP_NAME}} app
6
+ */
7
+
8
+ // Generic OAuth functions
9
+ export { exchangeToken } from './exchangeToken';
10
+ export { getConnections } from './getConnections';
11
+ export { disconnect } from './disconnect';
12
+ export { refreshToken } from './refreshToken';
13
+
14
+ // GitHub-specific OAuth functions
15
+ export { grantGitHubAccess } from './grantGitHubAccess';
16
+ export { revokeGitHubAccess } from './revokeGitHubAccess';
17
+ export { checkGitHubAccess } from './checkGitHubAccess';
@@ -0,0 +1,14 @@
1
+ // functions/src/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 { refreshToken as frameworkRefreshToken } from '@donotdev/functions/firebase';
9
+
10
+ /**
11
+ * {{APP_NAME}} OAuth token refresh
12
+ * Wraps the framework function with {{APP_NAME}}-specific configuration
13
+ */
14
+ export const refreshToken = frameworkRefreshToken;
@@ -0,0 +1,14 @@
1
+ // functions/src/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 { revokeGitHubAccess as frameworkRevokeGitHubAccess } from '@donotdev/functions/firebase';
9
+
10
+ /**
11
+ * {{APP_NAME}} GitHub access revocation
12
+ * Wraps the framework function with {{APP_NAME}}-specific configuration
13
+ */
14
+ export const revokeGitHubAccess = frameworkRevokeGitHubAccess;
@@ -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
+ endpoints:
2
+ # Add one entry per function exported from src/index.ts
3
+ # Each function name must match the export name exactly
4
+ # Example:
5
+ # functionName:
6
+ # region:
7
+ # - europe-west1
8
+ # platform: gcfv2
9
+ # httpsTrigger: {}
10
+ # entryPoint: functionName
11
+ # labels: {}
12
+ specVersion: v1alpha1
13
+ requiredAPIs: []
14
+