@aurostack/stacks 0.1.0

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 (601) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +209 -0
  3. package/cli/src/extract.mjs +165 -0
  4. package/cli/src/fsx.mjs +197 -0
  5. package/cli/src/generate.mjs +235 -0
  6. package/cli/src/hooks.mjs +55 -0
  7. package/cli/src/manifest.mjs +163 -0
  8. package/cli/src/strip.mjs +208 -0
  9. package/cli/src/tokens.mjs +102 -0
  10. package/cli/stack.mjs +672 -0
  11. package/package.json +37 -0
  12. package/templates/nest-api/files/.bin/db.ts +123 -0
  13. package/templates/nest-api/files/.bin/dc.ts +74 -0
  14. package/templates/nest-api/files/.bin/helpers.ts +49 -0
  15. package/templates/nest-api/files/.bin/secrets.ts +68 -0
  16. package/templates/nest-api/files/.bin/start.ts +47 -0
  17. package/templates/nest-api/files/.dockerignore +7 -0
  18. package/templates/nest-api/files/.env.example +91 -0
  19. package/templates/nest-api/files/.env.test.example +75 -0
  20. package/templates/nest-api/files/.forgejo/workflows/build-and-push.yml +41 -0
  21. package/templates/nest-api/files/.forgejo/workflows/test-e2e.yml +83 -0
  22. package/templates/nest-api/files/.forgejo/workflows/test.yml +53 -0
  23. package/templates/nest-api/files/.npmrc.example +1 -0
  24. package/templates/nest-api/files/.nvmrc +1 -0
  25. package/templates/nest-api/files/.prettierrc +8 -0
  26. package/templates/nest-api/files/.swcrc +15 -0
  27. package/templates/nest-api/files/.watchmanconfig +3 -0
  28. package/templates/nest-api/files/.yarnrc.yml +1 -0
  29. package/templates/nest-api/files/Dockerfile +40 -0
  30. package/templates/nest-api/files/__mocks__/activation-twofa.js +7 -0
  31. package/templates/nest-api/files/__mocks__/activation.js +7 -0
  32. package/templates/nest-api/files/__mocks__/forgot-password.js +7 -0
  33. package/templates/nest-api/files/__mocks__/main-layout.js +7 -0
  34. package/templates/nest-api/files/__mocks__/password-changed.js +7 -0
  35. package/templates/nest-api/files/__mocks__/reset-password.js +7 -0
  36. package/templates/nest-api/files/__mocks__/set-password.js +7 -0
  37. package/templates/nest-api/files/__mocks__/welcome.js +7 -0
  38. package/templates/nest-api/files/_gitignore +62 -0
  39. package/templates/nest-api/files/compose.test.yml +33 -0
  40. package/templates/nest-api/files/compose.yml +39 -0
  41. package/templates/nest-api/files/emails/activation-twofa.tsx +58 -0
  42. package/templates/nest-api/files/emails/activation.tsx +36 -0
  43. package/templates/nest-api/files/emails/forgot-password.tsx +29 -0
  44. package/templates/nest-api/files/emails/main-layout.tsx +134 -0
  45. package/templates/nest-api/files/emails/password-changed.tsx +24 -0
  46. package/templates/nest-api/files/emails/reset-password.tsx +24 -0
  47. package/templates/nest-api/files/emails/set-password.tsx +25 -0
  48. package/templates/nest-api/files/emails/welcome.tsx +39 -0
  49. package/templates/nest-api/files/eslint.config.mjs +28 -0
  50. package/templates/nest-api/files/global.d.ts +5 -0
  51. package/templates/nest-api/files/nest-cli.json +8 -0
  52. package/templates/nest-api/files/package.json +150 -0
  53. package/templates/nest-api/files/prisma/schema/auth.prisma +75 -0
  54. package/templates/nest-api/files/prisma/schema/base.prisma +17 -0
  55. package/templates/nest-api/files/prisma/schema/enum.prisma +17 -0
  56. package/templates/nest-api/files/prisma/schema/notification.prisma +14 -0
  57. package/templates/nest-api/files/prisma.config.ts +13 -0
  58. package/templates/nest-api/files/public/.gitkeep +0 -0
  59. package/templates/nest-api/files/seeders/index.ts +27 -0
  60. package/templates/nest-api/files/seeders/util.ts +88 -0
  61. package/templates/nest-api/files/src/__tests__/app.controller.spec.ts +29 -0
  62. package/templates/nest-api/files/src/app.controller.ts +40 -0
  63. package/templates/nest-api/files/src/app.module.ts +268 -0
  64. package/templates/nest-api/files/src/app.resolver.ts +32 -0
  65. package/templates/nest-api/files/src/app.setup.ts +178 -0
  66. package/templates/nest-api/files/src/common/__tests__/auth.service.spec.ts +31 -0
  67. package/templates/nest-api/files/src/common/__tests__/cache.service.spec.ts +214 -0
  68. package/templates/nest-api/files/src/common/__tests__/config.service.spec.ts +56 -0
  69. package/templates/nest-api/files/src/common/__tests__/generator.service.spec.ts +114 -0
  70. package/templates/nest-api/files/src/common/__tests__/health.controller.spec.ts +72 -0
  71. package/templates/nest-api/files/src/common/__tests__/helpers.spec.ts +124 -0
  72. package/templates/nest-api/files/src/common/__tests__/mail.service.spec.ts +75 -0
  73. package/templates/nest-api/files/src/common/__tests__/prisma.indicator.spec.ts +39 -0
  74. package/templates/nest-api/files/src/common/__tests__/prisma.service.spec.ts +15 -0
  75. package/templates/nest-api/files/src/common/__tests__/records.spec.ts +87 -0
  76. package/templates/nest-api/files/src/common/__tests__/schemas.spec.ts +142 -0
  77. package/templates/nest-api/files/src/common/__tests__/throttler-storage.service.spec.ts +80 -0
  78. package/templates/nest-api/files/src/common/common.module.ts +72 -0
  79. package/templates/nest-api/files/src/common/constants/index.ts +2 -0
  80. package/templates/nest-api/files/src/common/constants/options.ts +52 -0
  81. package/templates/nest-api/files/src/common/constants/pino.ts +24 -0
  82. package/templates/nest-api/files/src/common/controllers/health.controller.ts +54 -0
  83. package/templates/nest-api/files/src/common/controllers/index.ts +2 -0
  84. package/templates/nest-api/files/src/common/controllers/metrics.controller.ts +21 -0
  85. package/templates/nest-api/files/src/common/decorators/index.ts +2 -0
  86. package/templates/nest-api/files/src/common/decorators/misc.decorator.ts +49 -0
  87. package/templates/nest-api/files/src/common/decorators/multi-part.decorator.ts +6 -0
  88. package/templates/nest-api/files/src/common/dto/filters.dto.ts +25 -0
  89. package/templates/nest-api/files/src/common/dto/index.ts +1 -0
  90. package/templates/nest-api/files/src/common/entity/index.ts +2 -0
  91. package/templates/nest-api/files/src/common/entity/ok.entity.ts +11 -0
  92. package/templates/nest-api/files/src/common/entity/pagination.entity.ts +24 -0
  93. package/templates/nest-api/files/src/common/exceptions/index.ts +1 -0
  94. package/templates/nest-api/files/src/common/exceptions/prisma.exception.ts +57 -0
  95. package/templates/nest-api/files/src/common/guards/feature-flag.guard.ts +51 -0
  96. package/templates/nest-api/files/src/common/guards/index.ts +1 -0
  97. package/templates/nest-api/files/src/common/interceptors/index.ts +1 -0
  98. package/templates/nest-api/files/src/common/interceptors/metrics.interceptor.ts +37 -0
  99. package/templates/nest-api/files/src/common/misc/helpers.ts +26 -0
  100. package/templates/nest-api/files/src/common/misc/index.ts +3 -0
  101. package/templates/nest-api/files/src/common/misc/origin-builder.ts +56 -0
  102. package/templates/nest-api/files/src/common/misc/prisma.indicator.ts +24 -0
  103. package/templates/nest-api/files/src/common/modules/index.ts +3 -0
  104. package/templates/nest-api/files/src/common/modules/logger.module.ts +104 -0
  105. package/templates/nest-api/files/src/common/modules/metrics.module.ts +28 -0
  106. package/templates/nest-api/files/src/common/modules/queue.module.ts +23 -0
  107. package/templates/nest-api/files/src/common/processors/index.ts +1 -0
  108. package/templates/nest-api/files/src/common/processors/mail/index.ts +47 -0
  109. package/templates/nest-api/files/src/common/processors/mail/process.ts +225 -0
  110. package/templates/nest-api/files/src/common/schemas/fields.ts +76 -0
  111. package/templates/nest-api/files/src/common/schemas/index.ts +1 -0
  112. package/templates/nest-api/files/src/common/services/auth-rate-limit.storage.ts +79 -0
  113. package/templates/nest-api/files/src/common/services/auth.service.ts +16 -0
  114. package/templates/nest-api/files/src/common/services/cache.service.ts +118 -0
  115. package/templates/nest-api/files/src/common/services/config.service.ts +388 -0
  116. package/templates/nest-api/files/src/common/services/feature-flag.service.ts +117 -0
  117. package/templates/nest-api/files/src/common/services/generator.service.ts +54 -0
  118. package/templates/nest-api/files/src/common/services/index.ts +10 -0
  119. package/templates/nest-api/files/src/common/services/logger.service.ts +14 -0
  120. package/templates/nest-api/files/src/common/services/mail.service.ts +44 -0
  121. package/templates/nest-api/files/src/common/services/prisma.service.ts +106 -0
  122. package/templates/nest-api/files/src/common/services/throttler-storage.service.ts +112 -0
  123. package/templates/nest-api/files/src/common/types/email.ts +55 -0
  124. package/templates/nest-api/files/src/common/types/index.ts +3 -0
  125. package/templates/nest-api/files/src/common/types/misc.ts +20 -0
  126. package/templates/nest-api/files/src/common/types/prisma.ts +18 -0
  127. package/templates/nest-api/files/src/common/utils/enum.ts +39 -0
  128. package/templates/nest-api/files/src/common/utils/helpers.ts +139 -0
  129. package/templates/nest-api/files/src/common/utils/index.ts +5 -0
  130. package/templates/nest-api/files/src/common/utils/ip.ts +22 -0
  131. package/templates/nest-api/files/src/common/utils/records.ts +66 -0
  132. package/templates/nest-api/files/src/common/utils/redis.keys.ts +31 -0
  133. package/templates/nest-api/files/src/lib/__tests__/access.spec.ts +33 -0
  134. package/templates/nest-api/files/src/lib/access.ts +114 -0
  135. package/templates/nest-api/files/src/lib/auth.ts +76 -0
  136. package/templates/nest-api/files/src/lib/rate-limit.ts +20 -0
  137. package/templates/nest-api/files/src/main.ts +28 -0
  138. package/templates/nest-api/files/src/media/__tests__/media.service.spec.ts +60 -0
  139. package/templates/nest-api/files/src/media/__tests__/s3.service.spec.ts +159 -0
  140. package/templates/nest-api/files/src/media/entity/file.entity.ts +7 -0
  141. package/templates/nest-api/files/src/media/entity/index.ts +1 -0
  142. package/templates/nest-api/files/src/media/media.module.ts +20 -0
  143. package/templates/nest-api/files/src/media/processors/index.ts +44 -0
  144. package/templates/nest-api/files/src/media/services/index.ts +2 -0
  145. package/templates/nest-api/files/src/media/services/media.service.ts +29 -0
  146. package/templates/nest-api/files/src/media/services/s3.service.ts +168 -0
  147. package/templates/nest-api/files/src/notifications/controllers/index.ts +1 -0
  148. package/templates/nest-api/files/src/notifications/controllers/notifications.controller.ts +72 -0
  149. package/templates/nest-api/files/src/notifications/dto/index.ts +1 -0
  150. package/templates/nest-api/files/src/notifications/dto/notification.dto.ts +11 -0
  151. package/templates/nest-api/files/src/notifications/entity/index.ts +1 -0
  152. package/templates/nest-api/files/src/notifications/entity/notification.entity.ts +37 -0
  153. package/templates/nest-api/files/src/notifications/notifications.module.ts +11 -0
  154. package/templates/nest-api/files/src/notifications/services/index.ts +1 -0
  155. package/templates/nest-api/files/src/notifications/services/notifications.service.ts +98 -0
  156. package/templates/nest-api/files/src/realtime/__tests__/events.gateway.spec.ts +88 -0
  157. package/templates/nest-api/files/src/realtime/__tests__/rooms.spec.ts +29 -0
  158. package/templates/nest-api/files/src/realtime/__tests__/ws-permissions.guard.spec.ts +54 -0
  159. package/templates/nest-api/files/src/realtime/adapters/redis-io.adapter.ts +57 -0
  160. package/templates/nest-api/files/src/realtime/constants/index.ts +68 -0
  161. package/templates/nest-api/files/src/realtime/decorators/index.ts +1 -0
  162. package/templates/nest-api/files/src/realtime/decorators/ws-permissions.decorator.ts +14 -0
  163. package/templates/nest-api/files/src/realtime/gateways/events.gateway.ts +187 -0
  164. package/templates/nest-api/files/src/realtime/guards/index.ts +2 -0
  165. package/templates/nest-api/files/src/realtime/guards/ws-auth.guard.ts +20 -0
  166. package/templates/nest-api/files/src/realtime/guards/ws-permissions.guard.ts +35 -0
  167. package/templates/nest-api/files/src/realtime/misc/session-from-socket.ts +54 -0
  168. package/templates/nest-api/files/src/realtime/realtime.module.ts +26 -0
  169. package/templates/nest-api/files/src/realtime/services/presence.service.ts +56 -0
  170. package/templates/nest-api/files/src/realtime/services/realtime.service.ts +72 -0
  171. package/templates/nest-api/files/src/users/__tests__/current-user.controller.spec.ts +77 -0
  172. package/templates/nest-api/files/src/users/__tests__/current-user.service.spec.ts +159 -0
  173. package/templates/nest-api/files/src/users/__tests__/user.entity.spec.ts +175 -0
  174. package/templates/nest-api/files/src/users/__tests__/users.controller.spec.ts +89 -0
  175. package/templates/nest-api/files/src/users/__tests__/users.service.spec.ts +398 -0
  176. package/templates/nest-api/files/src/users/controllers/current-user.controller.ts +82 -0
  177. package/templates/nest-api/files/src/users/controllers/index.ts +2 -0
  178. package/templates/nest-api/files/src/users/controllers/users.controller.ts +40 -0
  179. package/templates/nest-api/files/src/users/decorators/index.ts +1 -0
  180. package/templates/nest-api/files/src/users/decorators/permissions.decorator.ts +24 -0
  181. package/templates/nest-api/files/src/users/dto/avatar.dto.ts +13 -0
  182. package/templates/nest-api/files/src/users/dto/filters.dto.ts +8 -0
  183. package/templates/nest-api/files/src/users/dto/index.ts +2 -0
  184. package/templates/nest-api/files/src/users/entity/index.ts +1 -0
  185. package/templates/nest-api/files/src/users/entity/user.entity.ts +53 -0
  186. package/templates/nest-api/files/src/users/services/current-user.service.ts +46 -0
  187. package/templates/nest-api/files/src/users/services/index.ts +2 -0
  188. package/templates/nest-api/files/src/users/services/users.service.ts +88 -0
  189. package/templates/nest-api/files/src/users/users.module.ts +10 -0
  190. package/templates/nest-api/files/test/app.spec.ts +102 -0
  191. package/templates/nest-api/files/test/auth.spec.ts +108 -0
  192. package/templates/nest-api/files/test/current-user.spec.ts +154 -0
  193. package/templates/nest-api/files/test/factory/app.ts +172 -0
  194. package/templates/nest-api/files/test/factory/constants.ts +22 -0
  195. package/templates/nest-api/files/test/factory/dto.ts +27 -0
  196. package/templates/nest-api/files/test/factory/entity.ts +70 -0
  197. package/templates/nest-api/files/test/factory/gen.ts +75 -0
  198. package/templates/nest-api/files/test/factory/util.ts +21 -0
  199. package/templates/nest-api/files/test/notifications.spec.ts +176 -0
  200. package/templates/nest-api/files/test/rate-limit.spec.ts +180 -0
  201. package/templates/nest-api/files/test/setup.ts +1 -0
  202. package/templates/nest-api/files/test/users.spec.ts +437 -0
  203. package/templates/nest-api/files/tsconfig.build.json +13 -0
  204. package/templates/nest-api/files/tsconfig.json +35 -0
  205. package/templates/nest-api/files/vitest.config.ts +53 -0
  206. package/templates/nest-api/template.json +452 -0
  207. package/templates/node-worker/files/.bin/db.ts +123 -0
  208. package/templates/node-worker/files/.bin/helpers.ts +49 -0
  209. package/templates/node-worker/files/.bin/secrets.ts +68 -0
  210. package/templates/node-worker/files/.dockerignore +5 -0
  211. package/templates/node-worker/files/.env.example +21 -0
  212. package/templates/node-worker/files/.forgejo/workflows/build-and-push.yml +41 -0
  213. package/templates/node-worker/files/.nvmrc +1 -0
  214. package/templates/node-worker/files/.prettierignore +4 -0
  215. package/templates/node-worker/files/.prettierrc +8 -0
  216. package/templates/node-worker/files/.yarnrc.yml +5 -0
  217. package/templates/node-worker/files/Dockerfile +63 -0
  218. package/templates/node-worker/files/Dockerfile.dev +59 -0
  219. package/templates/node-worker/files/_gitignore +48 -0
  220. package/templates/node-worker/files/ecosystem.config.cjs +10 -0
  221. package/templates/node-worker/files/eslint.config.js +37 -0
  222. package/templates/node-worker/files/package.json +67 -0
  223. package/templates/node-worker/files/prisma/_gitignore +1 -0
  224. package/templates/node-worker/files/prisma/schema/base.prisma +36 -0
  225. package/templates/node-worker/files/prisma.config.ts +13 -0
  226. package/templates/node-worker/files/src/config.ts +55 -0
  227. package/templates/node-worker/files/src/db.ts +118 -0
  228. package/templates/node-worker/files/src/index.ts +7 -0
  229. package/templates/node-worker/files/src/logger.ts +45 -0
  230. package/templates/node-worker/files/src/types.ts +23 -0
  231. package/templates/node-worker/files/src/utils/browser.ts +16 -0
  232. package/templates/node-worker/files/src/utils/date.ts +68 -0
  233. package/templates/node-worker/files/src/utils/helpers.ts +17 -0
  234. package/templates/node-worker/files/src/utils/number.ts +47 -0
  235. package/templates/node-worker/files/src/utils/worker.ts +29 -0
  236. package/templates/node-worker/files/src/workers/constants.ts +6 -0
  237. package/templates/node-worker/files/src/workers/example/index.ts +27 -0
  238. package/templates/node-worker/files/src/workers/index.ts +1 -0
  239. package/templates/node-worker/files/tsconfig.json +30 -0
  240. package/templates/node-worker/template.json +135 -0
  241. package/templates/py-worker/files/.dockerignore +176 -0
  242. package/templates/py-worker/files/.env.example +20 -0
  243. package/templates/py-worker/files/.forgejo/workflows/build-amd-push.yml +39 -0
  244. package/templates/py-worker/files/Dockerfile +10 -0
  245. package/templates/py-worker/files/README.md +3 -0
  246. package/templates/py-worker/files/_gitignore +176 -0
  247. package/templates/py-worker/files/config.py +89 -0
  248. package/templates/py-worker/files/models/decorators.py +42 -0
  249. package/templates/py-worker/files/models/enums.py +32 -0
  250. package/templates/py-worker/files/models/mixins.py +61 -0
  251. package/templates/py-worker/files/requirements.txt +18 -0
  252. package/templates/py-worker/files/utils/db.py +67 -0
  253. package/templates/py-worker/files/utils/logger.py +97 -0
  254. package/templates/py-worker/files/utils/misc.py +45 -0
  255. package/templates/py-worker/files/utils/worker.py +80 -0
  256. package/templates/py-worker/files/worker.py +41 -0
  257. package/templates/py-worker/files/workers/hello/process.py +22 -0
  258. package/templates/py-worker/template.json +87 -0
  259. package/templates/react-app/README.md +78 -0
  260. package/templates/react-app/derive.sh +128 -0
  261. package/templates/react-app/files/.bin/openapi.js +32 -0
  262. package/templates/react-app/files/.bin/secrets.js +47 -0
  263. package/templates/react-app/files/.dockerignore +16 -0
  264. package/templates/react-app/files/.editorconfig +12 -0
  265. package/templates/react-app/files/.env.example +34 -0
  266. package/templates/react-app/files/.forgejo/workflows/build-and-push.yml +55 -0
  267. package/templates/react-app/files/.forgejo/workflows/ci.yml +39 -0
  268. package/templates/react-app/files/.husky/pre-commit +1 -0
  269. package/templates/react-app/files/.nvmrc +1 -0
  270. package/templates/react-app/files/.prettierignore +6 -0
  271. package/templates/react-app/files/.prettierrc +9 -0
  272. package/templates/react-app/files/.yarnrc.yml +2 -0
  273. package/templates/react-app/files/Dockerfile +52 -0
  274. package/templates/react-app/files/_gitignore +33 -0
  275. package/templates/react-app/files/build.sh +53 -0
  276. package/templates/react-app/files/docker/nginx.conf +134 -0
  277. package/templates/react-app/files/eslint.config.mjs +75 -0
  278. package/templates/react-app/files/index.html +62 -0
  279. package/templates/react-app/files/openapi-ts.config.ts +22 -0
  280. package/templates/react-app/files/package.json +80 -0
  281. package/templates/react-app/files/src/app/nav.tsx +32 -0
  282. package/templates/react-app/files/src/app/providers.tsx +39 -0
  283. package/templates/react-app/files/src/app/router.tsx +142 -0
  284. package/templates/react-app/files/src/app/store.ts +20 -0
  285. package/templates/react-app/files/src/features/auth/components/auth-card.tsx +23 -0
  286. package/templates/react-app/files/src/features/auth/components/checkbox-field.tsx +32 -0
  287. package/templates/react-app/files/src/features/auth/components/google-button.tsx +41 -0
  288. package/templates/react-app/files/src/features/auth/components/or-divider.tsx +9 -0
  289. package/templates/react-app/files/src/features/auth/components/password-field.tsx +70 -0
  290. package/templates/react-app/files/src/features/auth/components/submit-button.tsx +16 -0
  291. package/templates/react-app/files/src/features/auth/lib/auth-actions.ts +68 -0
  292. package/templates/react-app/files/src/features/auth/lib/password-strength.ts +20 -0
  293. package/templates/react-app/files/src/features/auth/lib/redirect.ts +6 -0
  294. package/templates/react-app/files/src/features/auth/lib/schemas.ts +37 -0
  295. package/templates/react-app/files/src/features/seo/routes.ts +65 -0
  296. package/templates/react-app/files/src/lib/env.ts +28 -0
  297. package/templates/react-app/files/src/lib/paths.ts +58 -0
  298. package/templates/react-app/files/src/main.tsx +19 -0
  299. package/templates/react-app/files/src/routes/admin/home.tsx +24 -0
  300. package/templates/react-app/files/src/routes/auth/forgot-password.tsx +93 -0
  301. package/templates/react-app/files/src/routes/auth/login.tsx +87 -0
  302. package/templates/react-app/files/src/routes/auth/reset-password.tsx +83 -0
  303. package/templates/react-app/files/src/routes/auth/signup.tsx +117 -0
  304. package/templates/react-app/files/src/routes/auth/verified.tsx +31 -0
  305. package/templates/react-app/files/src/routes/auth/verify-email.tsx +97 -0
  306. package/templates/react-app/files/src/routes/home.tsx +17 -0
  307. package/templates/react-app/files/src/routes/legal/privacy.tsx +26 -0
  308. package/templates/react-app/files/src/routes/legal/terms.tsx +28 -0
  309. package/templates/react-app/files/src/routes/marketing/home.tsx +18 -0
  310. package/templates/react-app/files/src/routes/settings.tsx +10 -0
  311. package/templates/react-app/files/src/shared/api/base-api.ts +24 -0
  312. package/templates/react-app/files/src/shared/api/base-query.ts +29 -0
  313. package/templates/react-app/files/src/shared/api/config.ts +21 -0
  314. package/templates/react-app/files/src/shared/api/index.ts +15 -0
  315. package/templates/react-app/files/src/shared/api/realtime-events.ts +34 -0
  316. package/templates/react-app/files/src/shared/api/socket.ts +41 -0
  317. package/templates/react-app/files/src/shared/api/store.ts +39 -0
  318. package/templates/react-app/files/src/shared/api/upload-query.ts +115 -0
  319. package/templates/react-app/files/src/shared/auth/client.ts +27 -0
  320. package/templates/react-app/files/src/shared/auth/config.ts +28 -0
  321. package/templates/react-app/files/src/shared/auth/guards.tsx +75 -0
  322. package/templates/react-app/files/src/shared/auth/hooks.ts +13 -0
  323. package/templates/react-app/files/src/shared/auth/index.ts +20 -0
  324. package/templates/react-app/files/src/shared/auth/logout.ts +23 -0
  325. package/templates/react-app/files/src/shared/auth/provider.tsx +52 -0
  326. package/templates/react-app/files/src/shared/auth/redirect.ts +65 -0
  327. package/templates/react-app/files/src/shared/auth/slice.ts +54 -0
  328. package/templates/react-app/files/src/shared/hooks/index.ts +6 -0
  329. package/templates/react-app/files/src/shared/layouts/app-shell/app-shell.tsx +225 -0
  330. package/templates/react-app/files/src/shared/layouts/app-shell/user-menu.tsx +74 -0
  331. package/templates/react-app/files/src/shared/layouts/auth-layout.tsx +137 -0
  332. package/templates/react-app/files/src/shared/layouts/error-boundary.tsx +38 -0
  333. package/templates/react-app/files/src/shared/layouts/index.ts +23 -0
  334. package/templates/react-app/files/src/shared/layouts/marketing/marketing-layout.tsx +29 -0
  335. package/templates/react-app/files/src/shared/layouts/marketing/section-heading.tsx +38 -0
  336. package/templates/react-app/files/src/shared/layouts/marketing/section.tsx +30 -0
  337. package/templates/react-app/files/src/shared/layouts/states/app-shell-skeleton.tsx +47 -0
  338. package/templates/react-app/files/src/shared/layouts/states/empty.tsx +22 -0
  339. package/templates/react-app/files/src/shared/layouts/states/forbidden.tsx +14 -0
  340. package/templates/react-app/files/src/shared/layouts/states/loading.tsx +11 -0
  341. package/templates/react-app/files/src/shared/layouts/states/not-found.tsx +21 -0
  342. package/templates/react-app/files/src/shared/layouts/states/page-skeleton.tsx +39 -0
  343. package/templates/react-app/files/src/shared/layouts/states/route-fallback.tsx +26 -0
  344. package/templates/react-app/files/src/shared/layouts/states/state-screen.tsx +22 -0
  345. package/templates/react-app/files/src/shared/types/README.md +28 -0
  346. package/templates/react-app/files/src/shared/types/api/index.ts +9 -0
  347. package/templates/react-app/files/src/shared/types/api/zod.gen.ts +5 -0
  348. package/templates/react-app/files/src/shared/types/index.ts +4 -0
  349. package/templates/react-app/files/src/shared/ui/components/brand/logo.tsx +51 -0
  350. package/templates/react-app/files/src/shared/ui/components/brand/social-icons.tsx +37 -0
  351. package/templates/react-app/files/src/shared/ui/components/form/form.tsx +120 -0
  352. package/templates/react-app/files/src/shared/ui/components/ui/alert.tsx +25 -0
  353. package/templates/react-app/files/src/shared/ui/components/ui/button.tsx +43 -0
  354. package/templates/react-app/files/src/shared/ui/components/ui/calendar.tsx +78 -0
  355. package/templates/react-app/files/src/shared/ui/components/ui/card.tsx +44 -0
  356. package/templates/react-app/files/src/shared/ui/components/ui/checkbox.tsx +16 -0
  357. package/templates/react-app/files/src/shared/ui/components/ui/date-picker.tsx +76 -0
  358. package/templates/react-app/files/src/shared/ui/components/ui/input.tsx +22 -0
  359. package/templates/react-app/files/src/shared/ui/components/ui/label.tsx +19 -0
  360. package/templates/react-app/files/src/shared/ui/components/ui/modal.tsx +94 -0
  361. package/templates/react-app/files/src/shared/ui/components/ui/popover.tsx +31 -0
  362. package/templates/react-app/files/src/shared/ui/components/ui/progress.tsx +33 -0
  363. package/templates/react-app/files/src/shared/ui/components/ui/search-input.tsx +69 -0
  364. package/templates/react-app/files/src/shared/ui/components/ui/select.tsx +80 -0
  365. package/templates/react-app/files/src/shared/ui/components/ui/skeleton.tsx +12 -0
  366. package/templates/react-app/files/src/shared/ui/components/ui/sonner.tsx +23 -0
  367. package/templates/react-app/files/src/shared/ui/components/ui/spinner.tsx +8 -0
  368. package/templates/react-app/files/src/shared/ui/components/ui/textarea.tsx +22 -0
  369. package/templates/react-app/files/src/shared/ui/index.ts +45 -0
  370. package/templates/react-app/files/src/shared/ui/lib/utils.ts +7 -0
  371. package/templates/react-app/files/src/shared/ui/lib/zod-setup.ts +28 -0
  372. package/templates/react-app/files/src/shared/ui/meta/brand.ts +18 -0
  373. package/templates/react-app/files/src/shared/ui/meta/meta-context.ts +30 -0
  374. package/templates/react-app/files/src/shared/ui/meta/meta-provider.tsx +24 -0
  375. package/templates/react-app/files/src/shared/ui/meta/page-meta.tsx +69 -0
  376. package/templates/react-app/files/src/shared/ui/meta/use-meta-config.ts +11 -0
  377. package/templates/react-app/files/src/shared/ui/styles/globals.css +285 -0
  378. package/templates/react-app/files/src/shared/ui/styles/theme.css +48 -0
  379. package/templates/react-app/files/src/shared/ui/theme/init-script.ts +23 -0
  380. package/templates/react-app/files/src/shared/ui/theme/theme-colors.ts +14 -0
  381. package/templates/react-app/files/src/shared/ui/theme/theme-context.ts +60 -0
  382. package/templates/react-app/files/src/shared/ui/theme/theme-provider.tsx +101 -0
  383. package/templates/react-app/files/src/shared/ui/theme/theme-toggle.tsx +40 -0
  384. package/templates/react-app/files/src/shared/ui/theme/use-theme.ts +11 -0
  385. package/templates/react-app/files/src/vite-env.d.ts +13 -0
  386. package/templates/react-app/files/tsconfig.json +26 -0
  387. package/templates/react-app/files/tsconfig.node.json +25 -0
  388. package/templates/react-app/files/vite.config.ts +344 -0
  389. package/templates/react-app/overrides/src/routes/auth/forgot-password.tsx +93 -0
  390. package/templates/react-app/overrides/src/routes/auth/login.tsx +87 -0
  391. package/templates/react-app/overrides/src/routes/auth/signup.tsx +117 -0
  392. package/templates/react-app/overrides/src/routes/auth/verified.tsx +31 -0
  393. package/templates/react-app/overrides/src/routes/auth/verify-email.tsx +97 -0
  394. package/templates/react-app/overrides/src/shared/auth/config.ts +28 -0
  395. package/templates/react-app/overrides/src/shared/auth/guards.tsx +75 -0
  396. package/templates/react-app/overrides/src/shared/auth/index.ts +20 -0
  397. package/templates/react-app/overrides/src/shared/auth/redirect.ts +65 -0
  398. package/templates/react-app/overrides/src/shared/hooks/index.ts +6 -0
  399. package/templates/react-app/overrides/src/shared/types/README.md +28 -0
  400. package/templates/react-app/template.json +222 -0
  401. package/templates/react-monorepo/files/.dockerignore +19 -0
  402. package/templates/react-monorepo/files/.editorconfig +12 -0
  403. package/templates/react-monorepo/files/.forgejo/workflows/build-and-push.yml +98 -0
  404. package/templates/react-monorepo/files/.forgejo/workflows/ci.yml +35 -0
  405. package/templates/react-monorepo/files/.husky/pre-commit +1 -0
  406. package/templates/react-monorepo/files/.nvmrc +1 -0
  407. package/templates/react-monorepo/files/.prettierignore +6 -0
  408. package/templates/react-monorepo/files/.prettierrc +9 -0
  409. package/templates/react-monorepo/files/.yarnrc.yml +2 -0
  410. package/templates/react-monorepo/files/Dockerfile +90 -0
  411. package/templates/react-monorepo/files/_gitignore +35 -0
  412. package/templates/react-monorepo/files/apps/admin/.bin/secrets.js +57 -0
  413. package/templates/react-monorepo/files/apps/admin/.env.example +16 -0
  414. package/templates/react-monorepo/files/apps/admin/eslint.config.mjs +3 -0
  415. package/templates/react-monorepo/files/apps/admin/index.html +57 -0
  416. package/templates/react-monorepo/files/apps/admin/package.json +33 -0
  417. package/templates/react-monorepo/files/apps/admin/src/App.tsx +3 -0
  418. package/templates/react-monorepo/files/apps/admin/src/app/nav.tsx +14 -0
  419. package/templates/react-monorepo/files/apps/admin/src/app/providers.tsx +42 -0
  420. package/templates/react-monorepo/files/apps/admin/src/app/router.tsx +50 -0
  421. package/templates/react-monorepo/files/apps/admin/src/app/store.ts +15 -0
  422. package/templates/react-monorepo/files/apps/admin/src/lib/env.ts +12 -0
  423. package/templates/react-monorepo/files/apps/admin/src/main.tsx +14 -0
  424. package/templates/react-monorepo/files/apps/admin/src/routes/home.tsx +17 -0
  425. package/templates/react-monorepo/files/apps/admin/src/routes/settings.tsx +10 -0
  426. package/templates/react-monorepo/files/apps/admin/src/vite-env.d.ts +14 -0
  427. package/templates/react-monorepo/files/apps/admin/tsconfig.json +10 -0
  428. package/templates/react-monorepo/files/apps/admin/vite.config.ts +13 -0
  429. package/templates/react-monorepo/files/apps/auth/.bin/secrets.js +57 -0
  430. package/templates/react-monorepo/files/apps/auth/.env.example +16 -0
  431. package/templates/react-monorepo/files/apps/auth/eslint.config.mjs +3 -0
  432. package/templates/react-monorepo/files/apps/auth/index.html +57 -0
  433. package/templates/react-monorepo/files/apps/auth/package.json +32 -0
  434. package/templates/react-monorepo/files/apps/auth/src/App.tsx +3 -0
  435. package/templates/react-monorepo/files/apps/auth/src/app/providers.tsx +42 -0
  436. package/templates/react-monorepo/files/apps/auth/src/app/router.tsx +19 -0
  437. package/templates/react-monorepo/files/apps/auth/src/app/store.ts +15 -0
  438. package/templates/react-monorepo/files/apps/auth/src/components/auth-card.tsx +23 -0
  439. package/templates/react-monorepo/files/apps/auth/src/components/checkbox-field.tsx +32 -0
  440. package/templates/react-monorepo/files/apps/auth/src/components/google-button.tsx +41 -0
  441. package/templates/react-monorepo/files/apps/auth/src/components/or-divider.tsx +9 -0
  442. package/templates/react-monorepo/files/apps/auth/src/components/password-field.tsx +70 -0
  443. package/templates/react-monorepo/files/apps/auth/src/components/submit-button.tsx +16 -0
  444. package/templates/react-monorepo/files/apps/auth/src/lib/auth-actions.ts +68 -0
  445. package/templates/react-monorepo/files/apps/auth/src/lib/env.ts +8 -0
  446. package/templates/react-monorepo/files/apps/auth/src/lib/password-strength.ts +20 -0
  447. package/templates/react-monorepo/files/apps/auth/src/lib/redirect.ts +6 -0
  448. package/templates/react-monorepo/files/apps/auth/src/lib/schemas.ts +37 -0
  449. package/templates/react-monorepo/files/apps/auth/src/main.tsx +14 -0
  450. package/templates/react-monorepo/files/apps/auth/src/routes/forgot-password.tsx +91 -0
  451. package/templates/react-monorepo/files/apps/auth/src/routes/login.tsx +82 -0
  452. package/templates/react-monorepo/files/apps/auth/src/routes/reset-password.tsx +83 -0
  453. package/templates/react-monorepo/files/apps/auth/src/routes/signup.tsx +117 -0
  454. package/templates/react-monorepo/files/apps/auth/src/routes/verified.tsx +30 -0
  455. package/templates/react-monorepo/files/apps/auth/src/routes/verify-email.tsx +96 -0
  456. package/templates/react-monorepo/files/apps/auth/src/vite-env.d.ts +14 -0
  457. package/templates/react-monorepo/files/apps/auth/tsconfig.json +10 -0
  458. package/templates/react-monorepo/files/apps/auth/vite.config.ts +13 -0
  459. package/templates/react-monorepo/files/apps/client/.bin/secrets.js +57 -0
  460. package/templates/react-monorepo/files/apps/client/.env.example +16 -0
  461. package/templates/react-monorepo/files/apps/client/eslint.config.mjs +3 -0
  462. package/templates/react-monorepo/files/apps/client/index.html +57 -0
  463. package/templates/react-monorepo/files/apps/client/package.json +35 -0
  464. package/templates/react-monorepo/files/apps/client/src/App.tsx +3 -0
  465. package/templates/react-monorepo/files/apps/client/src/app/nav.tsx +14 -0
  466. package/templates/react-monorepo/files/apps/client/src/app/providers.tsx +42 -0
  467. package/templates/react-monorepo/files/apps/client/src/app/router.tsx +50 -0
  468. package/templates/react-monorepo/files/apps/client/src/app/store.ts +15 -0
  469. package/templates/react-monorepo/files/apps/client/src/lib/env.ts +12 -0
  470. package/templates/react-monorepo/files/apps/client/src/main.tsx +19 -0
  471. package/templates/react-monorepo/files/apps/client/src/routes/home.tsx +17 -0
  472. package/templates/react-monorepo/files/apps/client/src/routes/settings.tsx +10 -0
  473. package/templates/react-monorepo/files/apps/client/src/vite-env.d.ts +15 -0
  474. package/templates/react-monorepo/files/apps/client/tsconfig.json +10 -0
  475. package/templates/react-monorepo/files/apps/client/vite.config.ts +120 -0
  476. package/templates/react-monorepo/files/apps/landing/.bin/secrets.js +57 -0
  477. package/templates/react-monorepo/files/apps/landing/.env.example +20 -0
  478. package/templates/react-monorepo/files/apps/landing/eslint.config.mjs +3 -0
  479. package/templates/react-monorepo/files/apps/landing/index.html +51 -0
  480. package/templates/react-monorepo/files/apps/landing/package.json +33 -0
  481. package/templates/react-monorepo/files/apps/landing/src/App.tsx +3 -0
  482. package/templates/react-monorepo/files/apps/landing/src/app/providers.tsx +42 -0
  483. package/templates/react-monorepo/files/apps/landing/src/app/router.tsx +21 -0
  484. package/templates/react-monorepo/files/apps/landing/src/app/store.ts +18 -0
  485. package/templates/react-monorepo/files/apps/landing/src/features/seo/routes.ts +65 -0
  486. package/templates/react-monorepo/files/apps/landing/src/lib/env.ts +10 -0
  487. package/templates/react-monorepo/files/apps/landing/src/main.tsx +14 -0
  488. package/templates/react-monorepo/files/apps/landing/src/routes/home.tsx +18 -0
  489. package/templates/react-monorepo/files/apps/landing/src/vite-env.d.ts +15 -0
  490. package/templates/react-monorepo/files/apps/landing/tsconfig.json +10 -0
  491. package/templates/react-monorepo/files/apps/landing/vite.config.ts +169 -0
  492. package/templates/react-monorepo/files/build.sh +61 -0
  493. package/templates/react-monorepo/files/docker/nginx.conf +136 -0
  494. package/templates/react-monorepo/files/package.json +37 -0
  495. package/templates/react-monorepo/files/packages/.gitkeep +0 -0
  496. package/templates/react-monorepo/files/packages/api/eslint.config.mjs +3 -0
  497. package/templates/react-monorepo/files/packages/api/package.json +30 -0
  498. package/templates/react-monorepo/files/packages/api/src/base-api.ts +24 -0
  499. package/templates/react-monorepo/files/packages/api/src/base-query.ts +29 -0
  500. package/templates/react-monorepo/files/packages/api/src/config.ts +21 -0
  501. package/templates/react-monorepo/files/packages/api/src/index.ts +15 -0
  502. package/templates/react-monorepo/files/packages/api/src/realtime-events.ts +34 -0
  503. package/templates/react-monorepo/files/packages/api/src/socket.ts +41 -0
  504. package/templates/react-monorepo/files/packages/api/src/store.ts +39 -0
  505. package/templates/react-monorepo/files/packages/api/src/upload-query.ts +115 -0
  506. package/templates/react-monorepo/files/packages/api/tsconfig.json +4 -0
  507. package/templates/react-monorepo/files/packages/auth/eslint.config.mjs +3 -0
  508. package/templates/react-monorepo/files/packages/auth/package.json +33 -0
  509. package/templates/react-monorepo/files/packages/auth/src/client.ts +27 -0
  510. package/templates/react-monorepo/files/packages/auth/src/config.ts +22 -0
  511. package/templates/react-monorepo/files/packages/auth/src/guards.tsx +61 -0
  512. package/templates/react-monorepo/files/packages/auth/src/hooks.ts +13 -0
  513. package/templates/react-monorepo/files/packages/auth/src/index.ts +20 -0
  514. package/templates/react-monorepo/files/packages/auth/src/logout.ts +23 -0
  515. package/templates/react-monorepo/files/packages/auth/src/provider.tsx +52 -0
  516. package/templates/react-monorepo/files/packages/auth/src/redirect.ts +37 -0
  517. package/templates/react-monorepo/files/packages/auth/src/slice.ts +54 -0
  518. package/templates/react-monorepo/files/packages/auth/tsconfig.json +4 -0
  519. package/templates/react-monorepo/files/packages/config/README.md +47 -0
  520. package/templates/react-monorepo/files/packages/config/eslint/base.mjs +83 -0
  521. package/templates/react-monorepo/files/packages/config/package.json +37 -0
  522. package/templates/react-monorepo/files/packages/config/tailwind/theme.css +48 -0
  523. package/templates/react-monorepo/files/packages/config/tsconfig/base.json +22 -0
  524. package/templates/react-monorepo/files/packages/config/tsconfig/node.json +9 -0
  525. package/templates/react-monorepo/files/packages/config/tsconfig/react.json +9 -0
  526. package/templates/react-monorepo/files/packages/config/vite/index.d.ts +18 -0
  527. package/templates/react-monorepo/files/packages/config/vite/index.mjs +129 -0
  528. package/templates/react-monorepo/files/packages/hooks/eslint.config.mjs +3 -0
  529. package/templates/react-monorepo/files/packages/hooks/package.json +16 -0
  530. package/templates/react-monorepo/files/packages/hooks/src/index.ts +3 -0
  531. package/templates/react-monorepo/files/packages/hooks/tsconfig.json +4 -0
  532. package/templates/react-monorepo/files/packages/layouts/eslint.config.mjs +3 -0
  533. package/templates/react-monorepo/files/packages/layouts/package.json +30 -0
  534. package/templates/react-monorepo/files/packages/layouts/src/app-shell/app-shell.tsx +225 -0
  535. package/templates/react-monorepo/files/packages/layouts/src/app-shell/user-menu.tsx +74 -0
  536. package/templates/react-monorepo/files/packages/layouts/src/auth-layout.tsx +137 -0
  537. package/templates/react-monorepo/files/packages/layouts/src/error-boundary.tsx +38 -0
  538. package/templates/react-monorepo/files/packages/layouts/src/index.ts +23 -0
  539. package/templates/react-monorepo/files/packages/layouts/src/marketing/marketing-layout.tsx +29 -0
  540. package/templates/react-monorepo/files/packages/layouts/src/marketing/section-heading.tsx +38 -0
  541. package/templates/react-monorepo/files/packages/layouts/src/marketing/section.tsx +30 -0
  542. package/templates/react-monorepo/files/packages/layouts/src/states/app-shell-skeleton.tsx +47 -0
  543. package/templates/react-monorepo/files/packages/layouts/src/states/empty.tsx +22 -0
  544. package/templates/react-monorepo/files/packages/layouts/src/states/forbidden.tsx +14 -0
  545. package/templates/react-monorepo/files/packages/layouts/src/states/loading.tsx +11 -0
  546. package/templates/react-monorepo/files/packages/layouts/src/states/not-found.tsx +21 -0
  547. package/templates/react-monorepo/files/packages/layouts/src/states/page-skeleton.tsx +39 -0
  548. package/templates/react-monorepo/files/packages/layouts/src/states/route-fallback.tsx +26 -0
  549. package/templates/react-monorepo/files/packages/layouts/src/states/state-screen.tsx +22 -0
  550. package/templates/react-monorepo/files/packages/layouts/tsconfig.json +4 -0
  551. package/templates/react-monorepo/files/packages/types/.bin/openapi.js +32 -0
  552. package/templates/react-monorepo/files/packages/types/.bin/secrets.js +57 -0
  553. package/templates/react-monorepo/files/packages/types/README.md +28 -0
  554. package/templates/react-monorepo/files/packages/types/eslint.config.mjs +3 -0
  555. package/templates/react-monorepo/files/packages/types/openapi-ts.config.ts +22 -0
  556. package/templates/react-monorepo/files/packages/types/package.json +29 -0
  557. package/templates/react-monorepo/files/packages/types/src/index.ts +4 -0
  558. package/templates/react-monorepo/files/packages/types/src/types/api/index.ts +9 -0
  559. package/templates/react-monorepo/files/packages/types/src/types/api/zod.gen.ts +5 -0
  560. package/templates/react-monorepo/files/packages/types/tsconfig.json +7 -0
  561. package/templates/react-monorepo/files/packages/ui/components.json +21 -0
  562. package/templates/react-monorepo/files/packages/ui/eslint.config.mjs +13 -0
  563. package/templates/react-monorepo/files/packages/ui/package.json +44 -0
  564. package/templates/react-monorepo/files/packages/ui/src/components/brand/logo.tsx +51 -0
  565. package/templates/react-monorepo/files/packages/ui/src/components/brand/social-icons.tsx +37 -0
  566. package/templates/react-monorepo/files/packages/ui/src/components/form/form.tsx +120 -0
  567. package/templates/react-monorepo/files/packages/ui/src/components/ui/alert.tsx +25 -0
  568. package/templates/react-monorepo/files/packages/ui/src/components/ui/button.tsx +43 -0
  569. package/templates/react-monorepo/files/packages/ui/src/components/ui/calendar.tsx +78 -0
  570. package/templates/react-monorepo/files/packages/ui/src/components/ui/card.tsx +44 -0
  571. package/templates/react-monorepo/files/packages/ui/src/components/ui/checkbox.tsx +16 -0
  572. package/templates/react-monorepo/files/packages/ui/src/components/ui/date-picker.tsx +76 -0
  573. package/templates/react-monorepo/files/packages/ui/src/components/ui/input.tsx +22 -0
  574. package/templates/react-monorepo/files/packages/ui/src/components/ui/label.tsx +19 -0
  575. package/templates/react-monorepo/files/packages/ui/src/components/ui/modal.tsx +94 -0
  576. package/templates/react-monorepo/files/packages/ui/src/components/ui/popover.tsx +31 -0
  577. package/templates/react-monorepo/files/packages/ui/src/components/ui/progress.tsx +33 -0
  578. package/templates/react-monorepo/files/packages/ui/src/components/ui/search-input.tsx +69 -0
  579. package/templates/react-monorepo/files/packages/ui/src/components/ui/select.tsx +80 -0
  580. package/templates/react-monorepo/files/packages/ui/src/components/ui/skeleton.tsx +12 -0
  581. package/templates/react-monorepo/files/packages/ui/src/components/ui/sonner.tsx +23 -0
  582. package/templates/react-monorepo/files/packages/ui/src/components/ui/spinner.tsx +8 -0
  583. package/templates/react-monorepo/files/packages/ui/src/components/ui/textarea.tsx +22 -0
  584. package/templates/react-monorepo/files/packages/ui/src/index.ts +45 -0
  585. package/templates/react-monorepo/files/packages/ui/src/lib/utils.ts +7 -0
  586. package/templates/react-monorepo/files/packages/ui/src/lib/zod-setup.ts +28 -0
  587. package/templates/react-monorepo/files/packages/ui/src/meta/brand.ts +18 -0
  588. package/templates/react-monorepo/files/packages/ui/src/meta/meta-context.ts +30 -0
  589. package/templates/react-monorepo/files/packages/ui/src/meta/meta-provider.tsx +24 -0
  590. package/templates/react-monorepo/files/packages/ui/src/meta/page-meta.tsx +69 -0
  591. package/templates/react-monorepo/files/packages/ui/src/meta/use-meta-config.ts +11 -0
  592. package/templates/react-monorepo/files/packages/ui/src/styles/globals.css +285 -0
  593. package/templates/react-monorepo/files/packages/ui/src/theme/init-script.ts +23 -0
  594. package/templates/react-monorepo/files/packages/ui/src/theme/theme-colors.ts +14 -0
  595. package/templates/react-monorepo/files/packages/ui/src/theme/theme-context.ts +60 -0
  596. package/templates/react-monorepo/files/packages/ui/src/theme/theme-provider.tsx +101 -0
  597. package/templates/react-monorepo/files/packages/ui/src/theme/theme-toggle.tsx +40 -0
  598. package/templates/react-monorepo/files/packages/ui/src/theme/use-theme.ts +11 -0
  599. package/templates/react-monorepo/files/packages/ui/tsconfig.json +9 -0
  600. package/templates/react-monorepo/files/turbo.json +24 -0
  601. package/templates/react-monorepo/template.json +230 -0
@@ -0,0 +1,222 @@
1
+ {
2
+ "name": "react-app",
3
+ "version": "0.1.0",
4
+ "title": "React app (single Vite app)",
5
+ "description": "One Vite/React 19 app carrying the whole frontend: an RTK Query data layer with a single baseApi, better-auth session handling and route guards, the login/signup/reset screens as routes, a shadcn-style UI kit with light/dark theming, layouts and state screens, and generated OpenAPI types. Same stack as react-monorepo, one deployment.",
6
+ "derivedFrom": "react-monorepo",
7
+ "defaults": {
8
+ "port": 3000
9
+ },
10
+ "aliasRoots": {
11
+ "@/": "src/"
12
+ },
13
+ "generatedPaths": [
14
+ "**/node_modules/**",
15
+ "src/shared/types/api/**"
16
+ ],
17
+ "replacements": [
18
+ {
19
+ "from": "acme-app",
20
+ "to": "{{name}}"
21
+ },
22
+ {
23
+ "from": "Acme Corp",
24
+ "to": "{{Name}}"
25
+ },
26
+ {
27
+ "from": "AcmeCorp",
28
+ "to": "{{pascal}}"
29
+ },
30
+ {
31
+ "from": "acme-corp",
32
+ "to": "{{name}}"
33
+ },
34
+ {
35
+ "from": "acme",
36
+ "to": "{{name}}"
37
+ }
38
+ ],
39
+ "features": {
40
+ "ui": {
41
+ "title": "UI kit (src/shared/ui)",
42
+ "description": "shadcn-style Radix components, a Formik+Zod form helper, light/dark theming with a no-flash init script, and page-meta helpers.",
43
+ "core": true
44
+ },
45
+ "api": {
46
+ "title": "Data layer (src/shared/api)",
47
+ "description": "One RTK Query baseApi that every feature extends via injectEndpoints, a configured store, and an upload-aware base query. Endpoint names and tagTypes live in one global namespace — collisions are silent, so keep them unique.",
48
+ "core": true
49
+ },
50
+ "auth": {
51
+ "title": "Auth (src/shared/auth)",
52
+ "description": "better-auth browser client, session slice, and route guards. Single origin, so the guard navigates to /login rather than redirecting to another host.",
53
+ "core": true
54
+ },
55
+ "layouts": {
56
+ "title": "Layouts (src/shared/layouts)",
57
+ "description": "App shell, auth layout, marketing layout, error boundary and the loading/empty/forbidden/not-found state screens.",
58
+ "core": true
59
+ },
60
+ "auth-screens": {
61
+ "title": "Auth screens",
62
+ "description": "Login, signup, forgot/reset password, email verification as routes. Drop this only if you are bringing your own /login — the guards and the 401 handler both send unauthenticated users there.",
63
+ "default": true,
64
+ "files": [
65
+ "src/routes/auth/**",
66
+ "src/features/auth/**"
67
+ ]
68
+ },
69
+ "hooks": {
70
+ "title": "Shared hooks (src/shared/hooks)",
71
+ "default": true,
72
+ "files": [
73
+ "src/shared/hooks/**"
74
+ ]
75
+ },
76
+ "types": {
77
+ "title": "Generated API types (src/shared/types)",
78
+ "description": "OpenAPI-generated request/response types and Zod schemas, regenerated from the backend's /openapi-json by `yarn gen`.",
79
+ "default": true,
80
+ "files": [
81
+ "src/shared/types/**",
82
+ "openapi-ts.config.ts",
83
+ ".bin/openapi.js"
84
+ ],
85
+ "packageJson": {
86
+ "devDependencies": [
87
+ "@hey-api/client-fetch",
88
+ "@hey-api/openapi-ts",
89
+ "axios",
90
+ "dotenv",
91
+ "tiny-invariant"
92
+ ],
93
+ "scripts": [
94
+ "gen",
95
+ "gen:schema",
96
+ "gen:types"
97
+ ]
98
+ }
99
+ },
100
+ "marketing": {
101
+ "title": "Marketing site",
102
+ "description": "A public landing page at `/`, an SEO route table, and build-time robots.txt / sitemap.xml / security.txt. Including it moves the authenticated app to /app so the landing page can own the root — see src/lib/paths.ts.",
103
+ "files": [
104
+ "src/routes/marketing/**",
105
+ "src/features/seo/**"
106
+ ]
107
+ },
108
+ "admin": {
109
+ "title": "Admin console",
110
+ "description": "A role-gated /admin branch with its own nav, over the same data layer. The guard decides what renders; the API still has to enforce the role.",
111
+ "files": [
112
+ "src/routes/admin/**"
113
+ ]
114
+ },
115
+ "realtime": {
116
+ "title": "Socket.IO client",
117
+ "description": "socket.io-client wired to the backend's /realtime path, with room helpers and shared event-name constants. Pairs with the nest-api realtime feature.",
118
+ "files": [
119
+ "src/shared/api/socket.ts",
120
+ "src/shared/api/realtime-events.ts"
121
+ ],
122
+ "packageJson": {
123
+ "dependencies": [
124
+ "socket.io-client"
125
+ ]
126
+ }
127
+ },
128
+ "pwa": {
129
+ "title": "Installable PWA",
130
+ "description": "vite-plugin-pwa: app-shell offline caching and an update prompt rather than a silent takeover.",
131
+ "packageJson": {
132
+ "devDependencies": [
133
+ "vite-plugin-pwa"
134
+ ]
135
+ }
136
+ },
137
+ "charts": {
138
+ "title": "Charts",
139
+ "description": "ApexCharts via react-apexcharts, theme-aware through the shared chart palette.",
140
+ "packageJson": {
141
+ "dependencies": [
142
+ "apexcharts",
143
+ "react-apexcharts"
144
+ ]
145
+ }
146
+ },
147
+ "husky": {
148
+ "title": "Git hooks + lint-staged",
149
+ "default": true,
150
+ "files": [
151
+ ".husky/**"
152
+ ],
153
+ "packageJson": {
154
+ "devDependencies": [
155
+ "husky",
156
+ "lint-staged"
157
+ ],
158
+ "scripts": [
159
+ "prepare"
160
+ ]
161
+ }
162
+ },
163
+ "docker": {
164
+ "title": "Docker image",
165
+ "description": "Multi-stage build producing a static bundle, served by the nginx config in docker/ (cache rules, SPA fallback, security headers).",
166
+ "default": true,
167
+ "files": [
168
+ "Dockerfile",
169
+ ".dockerignore",
170
+ "build.sh",
171
+ "docker/**"
172
+ ]
173
+ },
174
+ "ci": {
175
+ "title": "Forgejo Actions CI",
176
+ "default": true,
177
+ "files": [
178
+ ".forgejo/**"
179
+ ]
180
+ },
181
+ "secrets": {
182
+ "title": "Infisical secret sync",
183
+ "default": true,
184
+ "files": [
185
+ ".bin/secrets.js"
186
+ ],
187
+ "packageJson": {
188
+ "scripts": [
189
+ "secrets"
190
+ ]
191
+ }
192
+ }
193
+ },
194
+ "hooks": [
195
+ {
196
+ "title": "seed .env from .env.example",
197
+ "run": "cp -n .env.example .env; true",
198
+ "optional": true
199
+ },
200
+ {
201
+ "title": "yarn install",
202
+ "run": "yarn install",
203
+ "optional": true
204
+ },
205
+ {
206
+ "title": "format (the feature strip leaves valid but unformatted code)",
207
+ "run": "yarn format",
208
+ "optional": true
209
+ },
210
+ {
211
+ "title": "git init",
212
+ "run": "git init -q && git add -A && git commit -qm 'chore: scaffold {{name}} from the react-app template'",
213
+ "optional": true
214
+ }
215
+ ],
216
+ "nextSteps": [
217
+ "Edit .env — VITE_APP_API_URL must point at your backend.",
218
+ "yarn dev # http://localhost:{{port}}",
219
+ "yarn typecheck # app + build config",
220
+ "Routes live in src/routes; shared code in src/shared; see src/lib/paths.ts for where the app is mounted."
221
+ ]
222
+ }
@@ -0,0 +1,19 @@
1
+ # Keep the build context small and the image reproducible.
2
+ node_modules
3
+ **/node_modules
4
+ **/dist
5
+ **/dev-dist
6
+ .turbo
7
+ **/.turbo
8
+
9
+ # Env files are NOT copied into the image — the URLs are passed as build args.
10
+ # Copying them would bake whichever environment happened to be checked out.
11
+ **/.env
12
+ **/.env.*
13
+ !**/.env.example
14
+
15
+ .git
16
+ .github
17
+ .forgejo
18
+ *.log
19
+ .DS_Store
@@ -0,0 +1,12 @@
1
+ root = true
2
+
3
+ [*]
4
+ charset = utf-8
5
+ end_of_line = lf
6
+ insert_final_newline = true
7
+ indent_style = tab
8
+ indent_size = 2
9
+ trim_trailing_whitespace = true
10
+
11
+ [*.md]
12
+ trim_trailing_whitespace = false
@@ -0,0 +1,98 @@
1
+ # Builds and pushes all four frontend apps from one Dockerfile.
2
+ #
3
+ # Unlike web-backend / web-coming-soon this repo produces FOUR images, so the
4
+ # tag is generated once in a separate job and shared by every matrix leg —
5
+ # otherwise each app would get its own random tag and there would be no way to
6
+ # deploy a matching set.
7
+ #
8
+ # Vite compiles the VITE_* URLs into each bundle at build time, so these images
9
+ # are specific to one environment. See frontend/docker/README.md.
10
+
11
+ name: Build and Push
12
+
13
+ on:
14
+ push:
15
+ branches:
16
+ - main
17
+ # Day-to-day work happens on `development`; this lets a build be cut without
18
+ # merging to main first.
19
+ workflow_dispatch:
20
+
21
+ jobs:
22
+ # One tag for the whole set, so `web-client:26_07_26_12345` and
23
+ # `web-auth:26_07_26_12345` are guaranteed to be from the same commit.
24
+ meta:
25
+ runs-on: ubuntu-latest
26
+ outputs:
27
+ tag: ${{ steps.tag.outputs.TAG }}
28
+ owner: ${{ steps.tag.outputs.OWNER }}
29
+ steps:
30
+ - name: Generate image tag
31
+ id: tag
32
+ run: |
33
+ DATE=$(date +'%y_%m_%d')
34
+ RAND=$(printf '%05d' "$((RANDOM % 100000))")
35
+ echo "TAG=${DATE}_${RAND}" >> "$GITHUB_OUTPUT"
36
+ # Derived from `github.repository` (which web-backend's workflow already
37
+ # relies on) rather than `github.repository_owner`, so this doesn't
38
+ # depend on a context variable Forgejo may not populate. This repo is
39
+ # `acme-corp/web-frontend`, so OWNER=acme-corp and the
40
+ # images land as <registry>/acme-corp/web-<app>, matching
41
+ # stack/frontend.compose.yml.
42
+ echo "OWNER=$(echo '${{ github.repository }}' | cut -d/ -f1)" >> "$GITHUB_OUTPUT"
43
+
44
+ build-and-push:
45
+ runs-on: ubuntu-latest
46
+ needs: meta
47
+ strategy:
48
+ # Report every app's result rather than cancelling siblings on the first
49
+ # failure. Note this means a partial set can be pushed — re-run the job.
50
+ fail-fast: false
51
+ matrix:
52
+ app: [landing, auth, client, admin]
53
+
54
+ steps:
55
+ - name: Checkout repository
56
+ uses: actions/checkout@v4
57
+
58
+ - name: Setup Docker Buildx
59
+ uses: docker/setup-buildx-action@v3
60
+
61
+ - name: Login to Registry
62
+ uses: docker/login-action@v3
63
+ with:
64
+ registry: ${{ secrets.REGISTRY_URL }}
65
+ username: ${{ secrets.DK_USER }}
66
+ password: ${{ secrets.DK_ACCESS_TOKEN }}
67
+
68
+ - name: Build and Push ${{ matrix.app }}
69
+ uses: docker/build-push-action@v6
70
+ with:
71
+ push: true
72
+ context: .
73
+ # Every value goes to every app; each app reads only what it needs.
74
+ # Passing an unused build arg is harmless and keeps this matrix from
75
+ # needing per-app argument lists. Note `landing` is NOT argument-free:
76
+ # it calls the API and renders the support address.
77
+ build-args: |
78
+ APP=${{ matrix.app }}
79
+ VITE_APP_API_URL=${{ secrets.VITE_APP_API_URL }}
80
+ VITE_APP_AUTH_HOST=${{ secrets.VITE_APP_AUTH_HOST }}
81
+ VITE_APP_CLIENT_HOST=${{ secrets.VITE_APP_CLIENT_HOST }}
82
+ VITE_APP_ADMIN_HOST=${{ secrets.VITE_APP_ADMIN_HOST }}
83
+ VITE_APP_LANDING=${{ secrets.VITE_APP_LANDING }}
84
+ VITE_APP_SUPPORT_EMAIL=${{ secrets.VITE_APP_SUPPORT_EMAIL }}
85
+ VITE_APP_SITE_URL=${{ secrets.VITE_APP_SITE_URL }}
86
+ tags: |
87
+ ${{ secrets.REGISTRY }}/${{ needs.meta.outputs.owner }}/web-${{ matrix.app }}:latest
88
+ ${{ secrets.REGISTRY }}/${{ needs.meta.outputs.owner }}/web-${{ matrix.app }}:${{ needs.meta.outputs.tag }}
89
+ # Optional speed-up: each matrix leg runs its own `yarn install`, so a
90
+ # registry layer cache cuts most of that. Enable only after confirming
91
+ # the registry accepts OCI cache manifests — some reject them and the
92
+ # push then fails.
93
+ # cache-from: type=registry,ref=${{ secrets.REGISTRY }}/${{ needs.meta.outputs.owner }}/web-${{ matrix.app }}:buildcache
94
+ # cache-to: type=registry,ref=${{ secrets.REGISTRY }}/${{ needs.meta.outputs.owner }}/web-${{ matrix.app }}:buildcache,mode=max
95
+
96
+ - name: Summary
97
+ run: |
98
+ echo "Pushed web-${{ matrix.app }}:${{ needs.meta.outputs.tag }}" >> "$GITHUB_STEP_SUMMARY"
@@ -0,0 +1,35 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ branches:
6
+ - "**"
7
+ - "!main"
8
+ - "!development"
9
+ pull_request:
10
+
11
+ jobs:
12
+ verify:
13
+ name: Lint, typecheck, build
14
+ runs-on: ubuntu-latest
15
+ steps:
16
+ - name: Checkout repository
17
+ uses: actions/checkout@v4
18
+
19
+ - name: Enable Corepack
20
+ run: corepack enable
21
+
22
+ - name: Use Node.js 24
23
+ uses: actions/setup-node@v4
24
+ with:
25
+ node-version: 24
26
+ cache: 'yarn'
27
+
28
+ - name: Install dependencies
29
+ run: yarn install --immutable
30
+
31
+ - name: Format check
32
+ run: yarn format:check
33
+
34
+ - name: Lint, typecheck, build
35
+ run: yarn turbo run lint typecheck build
@@ -0,0 +1 @@
1
+ yarn lint-staged
@@ -0,0 +1 @@
1
+ 24.13.0
@@ -0,0 +1,6 @@
1
+ node_modules
2
+ dist
3
+ .turbo
4
+ yarn.lock
5
+ # generated API types are formatted by their own pipeline
6
+ **/src/types/api
@@ -0,0 +1,9 @@
1
+ {
2
+ "singleQuote": true,
3
+ "bracketSpacing": true,
4
+ "useTabs": true,
5
+ "tabWidth": 2,
6
+ "printWidth": 120,
7
+ "semi": true,
8
+ "trailingComma": "none"
9
+ }
@@ -0,0 +1,2 @@
1
+ nodeLinker: node-modules
2
+ enableTelemetry: false
@@ -0,0 +1,90 @@
1
+ # One Dockerfile for all four apps — pick which with `--build-arg APP=<name>`.
2
+ #
3
+ # docker build --build-arg APP=client \
4
+ # --build-arg VITE_APP_API_URL=https://api.acme.site ... -t …/web-client .
5
+ #
6
+ # `landing` additionally requires --build-arg VITE_APP_SITE_URL=https://acme.site
7
+ # for canonical tags and sitemap.xml.
8
+ #
9
+ # IMPORTANT: Vite inlines `VITE_*` values into the JS bundle at BUILD time, so a
10
+ # built image is pinned to one environment. The URLs below are build args, not
11
+ # runtime env — setting them in compose does nothing. Build one image per
12
+ # environment, or move to runtime config (see docker/README.md).
13
+
14
+ # ---------- deps ----------
15
+ # Manifests only, so `yarn install` re-runs solely when a dependency changes.
16
+ FROM aurostack.dev/wesnetech/nodejs:24 AS deps
17
+ WORKDIR /repo
18
+
19
+ COPY package.json yarn.lock .yarnrc.yml turbo.json ./
20
+ COPY apps/admin/package.json apps/admin/
21
+ COPY apps/auth/package.json apps/auth/
22
+ COPY apps/client/package.json apps/client/
23
+ COPY apps/landing/package.json apps/landing/
24
+ COPY packages/api/package.json packages/api/
25
+ COPY packages/auth/package.json packages/auth/
26
+ COPY packages/config/package.json packages/config/
27
+ COPY packages/hooks/package.json packages/hooks/
28
+ COPY packages/layouts/package.json packages/layouts/
29
+ COPY packages/types/package.json packages/types/
30
+ COPY packages/ui/package.json packages/ui/
31
+
32
+ RUN corepack enable && yarn install --immutable
33
+
34
+ # ---------- build ----------
35
+ FROM aurostack.dev/wesnetech/nodejs:24 AS build
36
+ WORKDIR /repo
37
+ ENV NODE_ENV=production
38
+ # Each stage is a fresh image, so corepack has to be enabled again here —
39
+ # without it `yarn` is the bundled 1.x and refuses the packageManager field.
40
+ RUN corepack enable
41
+
42
+ COPY --from=deps /repo/node_modules ./node_modules
43
+ COPY . .
44
+
45
+ ARG APP
46
+ # Build args become env vars so Vite's define step picks them up. Verified:
47
+ # process env takes precedence over a committed .env, so a stale checked-in
48
+ # .env cannot leak into the image as long as the arg is supplied.
49
+ ARG VITE_APP_API_URL
50
+ ARG VITE_APP_AUTH_HOST
51
+ ARG VITE_APP_CLIENT_HOST
52
+ ARG VITE_APP_ADMIN_HOST
53
+ ARG VITE_APP_LANDING
54
+ ARG VITE_APP_SUPPORT_EMAIL
55
+ # Landing only: canonical origin for <link rel="canonical">, og:url and the
56
+ # generated sitemap.xml. Must be a build arg — .dockerignore excludes .env, so a
57
+ # local value never reaches the image.
58
+ ARG VITE_APP_SITE_URL
59
+ ENV VITE_APP_API_URL=$VITE_APP_API_URL \
60
+ VITE_APP_AUTH_HOST=$VITE_APP_AUTH_HOST \
61
+ VITE_APP_CLIENT_HOST=$VITE_APP_CLIENT_HOST \
62
+ VITE_APP_ADMIN_HOST=$VITE_APP_ADMIN_HOST \
63
+ VITE_APP_LANDING=$VITE_APP_LANDING \
64
+ VITE_APP_SUPPORT_EMAIL=$VITE_APP_SUPPORT_EMAIL \
65
+ VITE_APP_SITE_URL=$VITE_APP_SITE_URL
66
+
67
+ # Fail loudly rather than silently producing a bundle with `undefined` URLs
68
+ # baked in — that failure is invisible until the app 404s at runtime.
69
+ RUN test -n "$APP" || (echo "ERROR: --build-arg APP=<admin|auth|client|landing> is required" && exit 1)
70
+ RUN if [ "$APP" != "landing" ] && [ -z "$VITE_APP_API_URL" ]; then \
71
+ echo "ERROR: $APP needs --build-arg VITE_APP_API_URL"; exit 1; \
72
+ fi
73
+ # Landing fails silently without this: no canonical tags and no sitemap.xml, with
74
+ # only a build warning nobody reads. Same reasoning as the check above.
75
+ RUN if [ "$APP" = "landing" ] && [ -z "$VITE_APP_SITE_URL" ]; then \
76
+ echo "ERROR: landing needs --build-arg VITE_APP_SITE_URL (e.g. https://acme.site)"; exit 1; \
77
+ fi
78
+
79
+ # `--filter` builds the app plus only the workspace packages it depends on.
80
+ RUN yarn turbo run build --filter="$APP"
81
+
82
+ # ---------- runtime ----------
83
+ FROM nginx:stable-alpine AS runtime
84
+ ARG APP
85
+ COPY docker/nginx.conf /etc/nginx/conf.d/default.conf
86
+ COPY --from=build /repo/apps/$APP/dist /usr/share/nginx/html
87
+
88
+ EXPOSE 80
89
+ HEALTHCHECK --interval=30s --timeout=3s --start-period=5s \
90
+ CMD wget -qO- http://127.0.0.1/healthz || exit 1
@@ -0,0 +1,35 @@
1
+ # dependencies
2
+ node_modules/
3
+
4
+ # yarn (berry, node-modules linker)
5
+ .yarn/*
6
+ !.yarn/patches
7
+ !.yarn/plugins
8
+ !.yarn/releases
9
+ !.yarn/sdks
10
+ !.yarn/versions
11
+ .pnp.*
12
+ yarn-error.log
13
+
14
+ # build output
15
+ dist/
16
+ .turbo/
17
+ *.tsbuildinfo
18
+
19
+ # env
20
+ .env
21
+ .env.local
22
+ .env.*.local
23
+ .env.test
24
+ .env.production
25
+
26
+ # editor / os
27
+ .DS_Store
28
+ *.log
29
+
30
+ # generated OpenAPI schema dump
31
+ openapi.json
32
+
33
+ dev-dist/
34
+ # Intermediate SSR bundle for the landing prerender pass (MAI-88).
35
+ .prerender/
@@ -0,0 +1,57 @@
1
+ import { execSync } from 'node:child_process';
2
+ import { readFileSync } from 'node:fs';
3
+ import { dirname, join } from 'node:path';
4
+ import { fileURLToPath } from 'node:url';
5
+
6
+ // Pulls this workspace's env from Infisical into the matching .env file.
7
+ // The Infisical path is derived from the package name, e.g.
8
+ // @scope/types -> /frontend/types, landing -> /frontend/landing
9
+ //
10
+ // The project ID comes from the environment rather than being hardcoded: it
11
+ // identifies one organisation's vault, so a value baked in here would follow
12
+ // every copy of this scaffold to projects it has nothing to do with. Put it in
13
+ // your shell profile, or in a committed `.infisical.json`.
14
+ const PROJECT_ID = process.env.INFISICAL_PROJECT_ID;
15
+ const SECRET_ROOT = process.env.INFISICAL_PATH_PREFIX ?? '/frontend';
16
+
17
+ const ENV_FILES = {
18
+ dev: '.env',
19
+ test: '.env.test',
20
+ staging: '.env.staging',
21
+ prod: '.env.production'
22
+ };
23
+
24
+ const normalizeEnv = (raw) => {
25
+ if (['dev', 'development'].includes(raw)) return 'dev';
26
+ if (['test', 'testing'].includes(raw)) return 'test';
27
+ if (['prod', 'production'].includes(raw)) return 'prod';
28
+ if (raw === 'staging') return 'staging';
29
+ throw new Error(`Unknown env '${raw}' (use one of: dev, test, staging, prod)`);
30
+ };
31
+
32
+ const parseEnvArg = () => {
33
+ const args = process.argv.slice(2);
34
+ const flagIndex = args.findIndex((a) => a === '-e' || a === '--env');
35
+ if (flagIndex !== -1 && args[flagIndex + 1]) return args[flagIndex + 1];
36
+ const inline = args.find((a) => a.startsWith('--env='));
37
+ if (inline) return inline.slice('--env='.length);
38
+ return 'development';
39
+ };
40
+
41
+ const __dirname = dirname(fileURLToPath(import.meta.url));
42
+ const pkg = JSON.parse(readFileSync(join(__dirname, '..', 'package.json'), 'utf-8'));
43
+ const slug = pkg.name.replace(/^@[^/]+\//, '');
44
+ const secretPath = `${SECRET_ROOT}/${slug}`;
45
+
46
+ if (!PROJECT_ID) {
47
+ console.error('INFISICAL_PROJECT_ID is not set — nothing to fetch from.');
48
+ process.exit(1);
49
+ }
50
+
51
+ const env = normalizeEnv(parseEnvArg());
52
+ const envFile = ENV_FILES[env];
53
+
54
+ console.log(`Fetching secrets for '${slug}' (${env}) -> ${envFile}...`);
55
+ execSync(`infisical export --projectId="${PROJECT_ID}" --path="${secretPath}" --env=${env} > ${envFile}`, {
56
+ stdio: 'inherit'
57
+ });
@@ -0,0 +1,16 @@
1
+ # Copy to .env. Vite only exposes variables prefixed VITE_, and inlines them at
2
+ # build time — never put a secret here, it ships to the browser.
3
+
4
+ # Backend base URL. Better Auth lives at ${VITE_APP_API_URL}/auth.
5
+ VITE_APP_API_URL='http://localhost:5000'
6
+
7
+ # Sibling app origins. All four share one session cookie across subdomains, so
8
+ # these must agree with the backend's BETTER_AUTH_COOKIE_DOMAIN and its
9
+ # trustedOrigins list, or login will appear to succeed and then bounce.
10
+ VITE_APP_LANDING='http://localhost:3000'
11
+ VITE_APP_AUTH_HOST='http://localhost:3001'
12
+ VITE_APP_CLIENT_HOST='http://localhost:3002'
13
+ VITE_APP_ADMIN_HOST='http://localhost:3003'
14
+
15
+ # This app's own dev port.
16
+ PORT='3003'
@@ -0,0 +1,3 @@
1
+ import config from '@acme/config/eslint';
2
+
3
+ export default config;
@@ -0,0 +1,57 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png" />
7
+ <link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png" />
8
+ <link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png" />
9
+ <link rel="icon" href="/favicon.ico" sizes="any" />
10
+ <link rel="manifest" href="/site.webmanifest" />
11
+ <meta name="theme-color" content="%THEME_LIGHT%" />
12
+ <!--
13
+ Applies the saved (or system) theme before first paint, so the app never
14
+ flashes light then flips to dark. Mirrors `themeInitScript` in @acme/ui —
15
+ inlined because it must run before any module loads. Keep the two in sync.
16
+ %THEME_LIGHT/DARK% come from THEME_COLORS via the shared vite config.
17
+ -->
18
+ <script>
19
+ (function () {
20
+ try {
21
+ var m = localStorage.getItem('acme-theme');
22
+ var d =
23
+ m === 'dark' || ((m === null || m === 'system') && matchMedia('(prefers-color-scheme: dark)').matches);
24
+ var r = document.documentElement;
25
+ r.classList.toggle('dark', d);
26
+ r.style.colorScheme = d ? 'dark' : 'light';
27
+ var t = document.querySelector('meta[name="theme-color"]');
28
+ if (t) t.setAttribute('content', d ? '%THEME_DARK%' : '%THEME_LIGHT%');
29
+ } catch (e) {}
30
+ })();
31
+ </script>
32
+ <!--
33
+ globals.css only styles `body`, so without this the UA canvas paints white
34
+ for the moment before the stylesheet lands — a white flash on a dark load.
35
+ -->
36
+ <style>
37
+ html {
38
+ background: %THEME_LIGHT%;
39
+ }
40
+ html.dark {
41
+ background: %THEME_DARK%;
42
+ }
43
+ </style>
44
+ <meta name="description" content="Acme Corp admin console." />
45
+ <!--
46
+ Private surface: never indexed. `robots.txt` only discourages crawling,
47
+ while `noindex` prevents listing, so both are present. This app's routes
48
+ include password-reset and email-verify URLs.
49
+ -->
50
+ <meta name="robots" content="noindex, nofollow" />
51
+ <title>%APP_TITLE%</title>
52
+ </head>
53
+ <body>
54
+ <div id="root"></div>
55
+ <script type="module" src="/src/main.tsx"></script>
56
+ </body>
57
+ </html>