Skip to content

Commit 3647c22

Browse files
committed
Use dope.sh to generate a testable app from production template
1 parent cb831f9 commit 3647c22

File tree

14 files changed

+14371
-2
lines changed

14 files changed

+14371
-2
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ There are two ways to get help or provide feedback (and we try to always respond
7575

7676
## Development Tools
7777

78-
For information about the development tools used to maintain derived projects (like opensaas.sh), see [tools/README.md](./tools/README.md).
78+
For information about the development tools used to maintain derived projects (like opensaas.sh and template-test), see [tools/README.md](./tools/README.md).
7979

8080
## Contributing
8181

template-test/.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
app/
2+
base-app/

template-test/README.md

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
# Template Testing
2+
3+
Tests the production version of the Open SaaS template that users get from `wasp new -t saas`.
4+
5+
**Why this exists:** opensaas-sh tests `template/app` (current repo state), but `main` branch may differ from the last released template. This tests what users actually get from `wasp new -t saas`.
6+
7+
**How it works:** Scripts run `wasp new -t saas` to get a fresh template, then apply minimal production patches (Dummy→SendGrid email, dotenv-vault for secrets). Tests that the template builds and runs with production email provider.
8+
9+
## Regular Usage
10+
11+
When testing a new Wasp release:
12+
13+
```bash
14+
cd template-test
15+
./tools/patch.sh
16+
cd app && npm run env:pull
17+
wasp start # or wasp build
18+
```
19+
20+
## Initial Setup
21+
22+
Only needed once to create the initial patches:
23+
24+
```bash
25+
cd template-test
26+
wasp new -t saas temp && cp -r temp/app/* app/ && rm -rf temp
27+
cd app && git init && git add .
28+
29+
# Edit main.wasp: change Dummy→SendGrid
30+
# Setup dotenv-vault with working credentials
31+
32+
cd .. && ./tools/diff.sh
33+
git add app_diff/ && git commit -m "Add template-test patches"
34+
```
35+
36+
## Requirements
37+
38+
MacOS users need: `brew install coreutils gpatch diffutils`
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
--- /Users/ilakovac/dev/open-saas/template-test/tools/../../template-test/base-app/app/.env.vault
2+
+++ template-test/app/.env.vault
3+
@@ -0,0 +1,25 @@
4+
+#/-------------------.env.vault---------------------/
5+
+#/ cloud-agnostic vaulting standard /
6+
+#/ [how it works](https://dotenv.org/env-vault) /
7+
+#/--------------------------------------------------/
8+
+
9+
+# development
10+
+DOTENV_VAULT_DEVELOPMENT="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"
11+
+DOTENV_VAULT_DEVELOPMENT_VERSION=2
12+
+
13+
+# ci
14+
+DOTENV_VAULT_CI="0kVgjX4gDSFLdOkWOqXHcN6VOvVhMN5wJ9zgF3M7enHE7613DjnvWxS/Xtr2kFNv71jp+Qf51mLpmajTR4kb0whC+uLFa/7xZtXBFV0k5ac4NglcAF2dPbbi2ymqqFzjz5SwTVjQ3xzqpGbmaw/spmoapH1YEaWphA6GSOkJciI8NRqOYsLq7T1AdPrPudt6SUaroRKHD/kPk6ipt7c6sWdkMzKRF2Yv9FVLHDSRr86HCfVjW5FDfgc2eo2ITOONys72Wk/JK1RB1fntT9YIxUP2mX5rWtxsRDw5PPiu4OmrfC93p81BhwlPFMBBV7fOnJKs7jx5NPUEWlPS8xf4StQ9by2/oPmBrsFdzI84ikF6yNvoac7idj2tHsnaOjPWMmTT3Fk88Bt+K0HqMjdpNT7TilEbXbIxP4vq5SjSK9/whnsEqymWFO1aimo+Z6rzC9HNXecoryjtvDk7Y9D60V4oLyNOnSMf4v/+hvIYoAwIfnajVGUQ3y5rw1TLOEm8YQ61DgmArWDk8GhHnk/U6zVIpE8r/wuvYhn5GjMrG+5ZreUJMjRN58Fo/PGJszAciQh65gD5iTlL7qiaM5qgRA7SWuywxJc+3q8YmcHLBAKS1MeSsOw4bHMH1mphO1tSobRvZCS5T/kpCSwbAZviZq5Vx+oFgk39ymAkQ9aKwiTrHtKr0V/BxpqeUt223UC/y3M1TuaCAjs2szKckGa5FPjzWMAdHKShum4ikwGncX6CA5i+c1zimO8+7gj1qQPdZPBpcgHQ2kzX5Njg3InENowIE3RXd+a/ZmKVyP1IkThofsozOgxC+V3OTqriI4SRBIU+ZQ2xfwnsuTETpe/0Bf/pvKanxqebkouHhSUTPK8aF4HOzPbyiPpjFLtw/dmlN9MXdZag02+JGhlMCQ=="
15+
+DOTENV_VAULT_CI_VERSION=2
16+
+
17+
+# staging
18+
+DOTENV_VAULT_STAGING="JMEI1tbOz427qXvVvq9eL5gCiTE62+uCHKjt20WI80iwr2ROHrVjeS4rOXVazZ+BWlnyI8utwk1h4qLqxnqE9PlaCxH78MZX/K8Z8DV30QciubrmgnleUuO25EPlivbHqWWn0nQEMGaLemERXisx/fb/F2VG4aJwMzHd0kEGTnIWjEczGV2VlAgrEobPSZBz6BC02ioIOh6+nbJd5aDaMxaxrxuEJUFTxXDjbEigsJfaZyj2BknsUu/hHdCIPP8TNmAZdPBxmjkiu6rLEKxJ/mC8Hjdu/deZa6fiL8rfLN5ckmIJC+oWW57ectOyPMTq2Byxq/GenB1gMCpB/eOpltfXJvwqSPOrk4EsD62Ycdpr5Dxn2Ui/MN7IW0PREQwkawEmgN/hFp/AVqV5x/dQakqnpFek3qG4nl9COvHWkujd0thfjxRg+iYPEZxKvw6jXPMuG5rUAq0hz2uiiQu+sl7EoPgVtMhmHAeA0XLLPN9yAcdTRH0fzXbgv+DCHR9Xi+my/9PNNi3FCQCqcKUiMSWRqA8pL9xGP7J45LICcmHbHuXhbffSp8sGvPthAKLbCiYBEH97PPOzH6qjaU5gz0qd/tM5XhwDYrWE8i/NXCFTX++l4BOJBN9zb71Sx2KALK5c2aQKjpN5LT1bnF30OchDkFXY/p79kuvopQIEkGJlcBBLyf8hgnlgQdx0e/nXFJVTh/evhc3ndp8nATFwZtoKx1Vgvrq4ux09aaO6ErII4QJZqMBjgpGuAMj9RNE0iUFwm1S9BVVyHqndDnr+mTyKpkUEqzGQHWuZ+KuAsnYQHcOJUo1Wh3zYs0BHswBvbenWcrM/0QRRLoSKziNIRfCudT+J/5ED6v/3JOhACvfq6dD7vlLgURof4b8y9bXb27GX2ycyHZGXjlbZgg=="
19+
+DOTENV_VAULT_STAGING_VERSION=2
20+
+
21+
+# production
22+
+DOTENV_VAULT_PRODUCTION="eSIUBg42a0f0KXdMcsp1tfg3nEHp6ESJNhNOysVtT8AZC/dAQculRnSkA07aY4mNPyAB7B1Y0MayMdNnnB44drdepJYUNNwsBwCxANVl6hgjll8q6CWEgE8e+vW6jTQJDq0myaCSvCgBqfQYDATTTHVJ1Q4FZECavJlqjfNIaAy09evubbhzTmL9z/i+S7jQJCLmirLET438Hnz04/i2S3CtdtsLEtjLWbUvrSkiVALBYkCFxQcmasoit2U/0fgjGaeNuWtfAB7Iku3CSdmcO8kQBtH0j+7TbW7I0cfVTUYH9ipcQCy0vjwx1GwsHWBi5IqPfj4bD/HUTPwinn7MrEBtM2cZ3uksSeWk1x+Ks7A5sQnL7XzgUxnl070TiRZJSb0TYuzXM8ILt7gq0frgKSUKRXkeH+egxjBrMAGQ7vY0ebdBHlBHPHOeF9iiFoaujWdReBitbawHYORG8Ct8pvstiTdj98w7g7WB434/Eh0L0pi8Ydepj40/8OpA3nCES9cCIi0uaFlr+arIh3w6h5FsTqaLgh+MmbpNXnRR99/r/0zzKq3/9d1wnIbc7uHkoOSEkTlD5ceEf+IO85A4jsQFOXYJpGV8ns8z4xWLTsU+3GyWIIGDkkNR0CY8PjdkBeQJPEvZNPDnn+LK9C42Clkm1eQy4aqHaagJxFGYp/j79S7Lm4kLJZMHywKi628CsHZO/moPvkfUGrEO2KmqWHvnxWDh5PggV3TAJWOMk7p2ykuFRRb26MgMf9f8oTa+CSs2Jk5W7TF10xaYZDz7fCyUBdMK+JcguPcq0mFw9eoDf9i8FLOKF26VuK7Z14+fRTZN/YHU+u75ru6WDymRpm0ZhCBDdYy80gM45089Scp2bpnKIWg6s7bLdb9R/NRUhK1PZRDEzw3SkDZBVQ=="
23+
+DOTENV_VAULT_PRODUCTION_VERSION=2
24+
+
25+
+#/----------------settings/metadata-----------------/
26+
+DOTENV_VAULT="vlt_57f67ae090fbd4c01066b1af1342a8ba518da1296c6595b9fcd233af37a5fce4"
27+
+DOTENV_API_URL="https://vault.dotenv.org"
28+
+DOTENV_CLI="npx dotenv-vault@latest"
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
--- /Users/ilakovac/dev/open-saas/template-test/tools/../../template-test/base-app/app/.gitignore
2+
+++ template-test/app/.gitignore
3+
@@ -9,3 +9,8 @@
4+
# Don't ignore example dotenv files.
5+
!.env.example
6+
!.env.*.example
7+
+
8+
+.env*
9+
+.flaskenv*
10+
+!.env.project
11+
+!.env.vault
12+
\ No newline at end of file

template-test/app_diff/deletions

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
.env.client.example
2+
.env.server.example
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
--- /Users/ilakovac/dev/open-saas/template-test/tools/../../template-test/base-app/app/main.wasp
2+
+++ template-test/app/main.wasp
3+
@@ -39,7 +39,7 @@
4+
email: {
5+
fromField: {
6+
name: "Open SaaS App",
7+
- email: "me@example.com"
8+
+ email: "opensaastemplate@mg.wasp.sh"
9+
},
10+
emailVerification: {
11+
clientRoute: EmailVerificationRoute,
12+
@@ -84,14 +84,11 @@
13+
},
14+
15+
emailSender: {
16+
- // NOTE: "Dummy" provider is just for local development purposes.
17+
- // Make sure to check the server logs for the email confirmation url (it will not be sent to an address)!
18+
- // Once you are ready for production, switch to e.g. "SendGrid" or "Mailgun" providers. Check out https://docs.opensaas.sh/guides/email-sending/ .
19+
- provider: Dummy,
20+
+ provider: SMTP,
21+
defaultFrom: {
22+
name: "Open SaaS App",
23+
// When using a real provider, e.g. SendGrid, you must use the same email address that you configured your account to send out emails with!
24+
- email: "me@example.com"
25+
+ email: "opensaastemplate@mg.wasp.sh"
26+
},
27+
},
28+
}
Lines changed: 175 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,175 @@
1+
--- /Users/ilakovac/dev/open-saas/template-test/tools/../../template-test/base-app/app/migrations/20251007102522_init/migration.sql
2+
+++ template-test/app/migrations/20251007102522_init/migration.sql
3+
@@ -0,0 +1,172 @@
4+
+-- CreateTable
5+
+CREATE TABLE "User" (
6+
+ "id" TEXT NOT NULL,
7+
+ "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
8+
+ "email" TEXT,
9+
+ "username" TEXT,
10+
+ "isAdmin" BOOLEAN NOT NULL DEFAULT false,
11+
+ "paymentProcessorUserId" TEXT,
12+
+ "lemonSqueezyCustomerPortalUrl" TEXT,
13+
+ "subscriptionStatus" TEXT,
14+
+ "subscriptionPlan" TEXT,
15+
+ "datePaid" TIMESTAMP(3),
16+
+ "credits" INTEGER NOT NULL DEFAULT 3,
17+
+
18+
+ CONSTRAINT "User_pkey" PRIMARY KEY ("id")
19+
+);
20+
+
21+
+-- CreateTable
22+
+CREATE TABLE "GptResponse" (
23+
+ "id" TEXT NOT NULL,
24+
+ "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
25+
+ "updatedAt" TIMESTAMP(3) NOT NULL,
26+
+ "userId" TEXT NOT NULL,
27+
+ "content" TEXT NOT NULL,
28+
+
29+
+ CONSTRAINT "GptResponse_pkey" PRIMARY KEY ("id")
30+
+);
31+
+
32+
+-- CreateTable
33+
+CREATE TABLE "Task" (
34+
+ "id" TEXT NOT NULL,
35+
+ "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
36+
+ "userId" TEXT NOT NULL,
37+
+ "description" TEXT NOT NULL,
38+
+ "time" TEXT NOT NULL DEFAULT '1',
39+
+ "isDone" BOOLEAN NOT NULL DEFAULT false,
40+
+
41+
+ CONSTRAINT "Task_pkey" PRIMARY KEY ("id")
42+
+);
43+
+
44+
+-- CreateTable
45+
+CREATE TABLE "File" (
46+
+ "id" TEXT NOT NULL,
47+
+ "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
48+
+ "userId" TEXT NOT NULL,
49+
+ "name" TEXT NOT NULL,
50+
+ "type" TEXT NOT NULL,
51+
+ "key" TEXT NOT NULL,
52+
+ "uploadUrl" TEXT NOT NULL,
53+
+
54+
+ CONSTRAINT "File_pkey" PRIMARY KEY ("id")
55+
+);
56+
+
57+
+-- CreateTable
58+
+CREATE TABLE "DailyStats" (
59+
+ "id" SERIAL NOT NULL,
60+
+ "date" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
61+
+ "totalViews" INTEGER NOT NULL DEFAULT 0,
62+
+ "prevDayViewsChangePercent" TEXT NOT NULL DEFAULT '0',
63+
+ "userCount" INTEGER NOT NULL DEFAULT 0,
64+
+ "paidUserCount" INTEGER NOT NULL DEFAULT 0,
65+
+ "userDelta" INTEGER NOT NULL DEFAULT 0,
66+
+ "paidUserDelta" INTEGER NOT NULL DEFAULT 0,
67+
+ "totalRevenue" DOUBLE PRECISION NOT NULL DEFAULT 0,
68+
+ "totalProfit" DOUBLE PRECISION NOT NULL DEFAULT 0,
69+
+
70+
+ CONSTRAINT "DailyStats_pkey" PRIMARY KEY ("id")
71+
+);
72+
+
73+
+-- CreateTable
74+
+CREATE TABLE "PageViewSource" (
75+
+ "name" TEXT NOT NULL,
76+
+ "date" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
77+
+ "dailyStatsId" INTEGER,
78+
+ "visitors" INTEGER NOT NULL,
79+
+
80+
+ CONSTRAINT "PageViewSource_pkey" PRIMARY KEY ("date","name")
81+
+);
82+
+
83+
+-- CreateTable
84+
+CREATE TABLE "Logs" (
85+
+ "id" SERIAL NOT NULL,
86+
+ "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
87+
+ "message" TEXT NOT NULL,
88+
+ "level" TEXT NOT NULL,
89+
+
90+
+ CONSTRAINT "Logs_pkey" PRIMARY KEY ("id")
91+
+);
92+
+
93+
+-- CreateTable
94+
+CREATE TABLE "ContactFormMessage" (
95+
+ "id" TEXT NOT NULL,
96+
+ "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
97+
+ "userId" TEXT NOT NULL,
98+
+ "content" TEXT NOT NULL,
99+
+ "isRead" BOOLEAN NOT NULL DEFAULT false,
100+
+ "repliedAt" TIMESTAMP(3),
101+
+
102+
+ CONSTRAINT "ContactFormMessage_pkey" PRIMARY KEY ("id")
103+
+);
104+
+
105+
+-- CreateTable
106+
+CREATE TABLE "Auth" (
107+
+ "id" TEXT NOT NULL,
108+
+ "userId" TEXT,
109+
+
110+
+ CONSTRAINT "Auth_pkey" PRIMARY KEY ("id")
111+
+);
112+
+
113+
+-- CreateTable
114+
+CREATE TABLE "AuthIdentity" (
115+
+ "providerName" TEXT NOT NULL,
116+
+ "providerUserId" TEXT NOT NULL,
117+
+ "providerData" TEXT NOT NULL DEFAULT '{}',
118+
+ "authId" TEXT NOT NULL,
119+
+
120+
+ CONSTRAINT "AuthIdentity_pkey" PRIMARY KEY ("providerName","providerUserId")
121+
+);
122+
+
123+
+-- CreateTable
124+
+CREATE TABLE "Session" (
125+
+ "id" TEXT NOT NULL,
126+
+ "expiresAt" TIMESTAMP(3) NOT NULL,
127+
+ "userId" TEXT NOT NULL,
128+
+
129+
+ CONSTRAINT "Session_pkey" PRIMARY KEY ("id")
130+
+);
131+
+
132+
+-- CreateIndex
133+
+CREATE UNIQUE INDEX "User_email_key" ON "User"("email");
134+
+
135+
+-- CreateIndex
136+
+CREATE UNIQUE INDEX "User_username_key" ON "User"("username");
137+
+
138+
+-- CreateIndex
139+
+CREATE UNIQUE INDEX "User_paymentProcessorUserId_key" ON "User"("paymentProcessorUserId");
140+
+
141+
+-- CreateIndex
142+
+CREATE UNIQUE INDEX "DailyStats_date_key" ON "DailyStats"("date");
143+
+
144+
+-- CreateIndex
145+
+CREATE UNIQUE INDEX "Auth_userId_key" ON "Auth"("userId");
146+
+
147+
+-- CreateIndex
148+
+CREATE UNIQUE INDEX "Session_id_key" ON "Session"("id");
149+
+
150+
+-- CreateIndex
151+
+CREATE INDEX "Session_userId_idx" ON "Session"("userId");
152+
+
153+
+-- AddForeignKey
154+
+ALTER TABLE "GptResponse" ADD CONSTRAINT "GptResponse_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
155+
+
156+
+-- AddForeignKey
157+
+ALTER TABLE "Task" ADD CONSTRAINT "Task_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
158+
+
159+
+-- AddForeignKey
160+
+ALTER TABLE "File" ADD CONSTRAINT "File_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
161+
+
162+
+-- AddForeignKey
163+
+ALTER TABLE "PageViewSource" ADD CONSTRAINT "PageViewSource_dailyStatsId_fkey" FOREIGN KEY ("dailyStatsId") REFERENCES "DailyStats"("id") ON DELETE SET NULL ON UPDATE CASCADE;
164+
+
165+
+-- AddForeignKey
166+
+ALTER TABLE "ContactFormMessage" ADD CONSTRAINT "ContactFormMessage_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
167+
+
168+
+-- AddForeignKey
169+
+ALTER TABLE "Auth" ADD CONSTRAINT "Auth_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
170+
+
171+
+-- AddForeignKey
172+
+ALTER TABLE "AuthIdentity" ADD CONSTRAINT "AuthIdentity_authId_fkey" FOREIGN KEY ("authId") REFERENCES "Auth"("id") ON DELETE CASCADE ON UPDATE CASCADE;
173+
+
174+
+-- AddForeignKey
175+
+ALTER TABLE "Session" ADD CONSTRAINT "Session_userId_fkey" FOREIGN KEY ("userId") REFERENCES "Auth"("id") ON DELETE CASCADE ON UPDATE CASCADE;
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
--- /Users/ilakovac/dev/open-saas/template-test/tools/../../template-test/base-app/app/migrations/migration_lock.toml
2+
+++ template-test/app/migrations/migration_lock.toml
3+
@@ -0,0 +1,3 @@
4+
+# Please do not edit this file manually
5+
+# It should be added in your version-control system (i.e. Git)
6+
+provider = "postgresql"
7+
\ No newline at end of file

0 commit comments

Comments
 (0)