@objectifthunes/create-sandstone 0.1.0 → 0.2.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.
- package/dist/generator.d.ts +3 -0
- package/dist/generator.d.ts.map +1 -0
- package/dist/generator.js +78 -0
- package/dist/generator.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +106 -61
- package/dist/index.js.map +1 -0
- package/dist/presets.d.ts +25 -0
- package/dist/presets.d.ts.map +1 -0
- package/dist/presets.js +58 -0
- package/dist/presets.js.map +1 -0
- package/dist/prompts.d.ts +3 -13
- package/dist/prompts.d.ts.map +1 -0
- package/dist/prompts.js +61 -62
- package/dist/prompts.js.map +1 -0
- package/dist/templates/claude-md.d.ts +3 -0
- package/dist/templates/claude-md.d.ts.map +1 -0
- package/dist/templates/claude-md.js +385 -0
- package/dist/templates/claude-md.js.map +1 -0
- package/dist/templates/docker-compose.d.ts +3 -0
- package/dist/templates/docker-compose.d.ts.map +1 -0
- package/dist/templates/docker-compose.js +33 -0
- package/dist/templates/docker-compose.js.map +1 -0
- package/dist/templates/env-example.d.ts +3 -0
- package/dist/templates/env-example.d.ts.map +1 -0
- package/dist/templates/env-example.js +58 -0
- package/dist/templates/env-example.js.map +1 -0
- package/dist/templates/gitignore.d.ts +2 -0
- package/dist/templates/gitignore.d.ts.map +1 -0
- package/dist/templates/gitignore.js +11 -0
- package/dist/templates/gitignore.js.map +1 -0
- package/dist/templates/infrastructure.d.ts +3 -0
- package/dist/templates/infrastructure.d.ts.map +1 -0
- package/dist/templates/infrastructure.js +243 -0
- package/dist/templates/infrastructure.js.map +1 -0
- package/dist/templates/main-express.d.ts +3 -0
- package/dist/templates/main-express.d.ts.map +1 -0
- package/dist/templates/main-express.js +45 -0
- package/dist/templates/main-express.js.map +1 -0
- package/dist/templates/main-hono.d.ts +3 -0
- package/dist/templates/main-hono.d.ts.map +1 -0
- package/dist/templates/main-hono.js +47 -0
- package/dist/templates/main-hono.js.map +1 -0
- package/dist/templates/migrate-script.d.ts +2 -0
- package/dist/templates/migrate-script.d.ts.map +1 -0
- package/dist/templates/migrate-script.js +18 -0
- package/dist/templates/migrate-script.js.map +1 -0
- package/dist/templates/migration.d.ts +2 -0
- package/dist/templates/migration.d.ts.map +1 -0
- package/dist/templates/migration.js +17 -0
- package/dist/templates/migration.js.map +1 -0
- package/dist/templates/package-json.d.ts +3 -0
- package/dist/templates/package-json.d.ts.map +1 -0
- package/dist/templates/package-json.js +85 -0
- package/dist/templates/package-json.js.map +1 -0
- package/dist/templates/schema.d.ts +3 -0
- package/dist/templates/schema.d.ts.map +1 -0
- package/dist/templates/schema.js +108 -0
- package/dist/templates/schema.js.map +1 -0
- package/dist/templates/test-setup.d.ts +3 -0
- package/dist/templates/test-setup.d.ts.map +1 -0
- package/dist/templates/test-setup.js +41 -0
- package/dist/templates/test-setup.js.map +1 -0
- package/dist/templates/tsconfig.d.ts +2 -0
- package/dist/templates/tsconfig.d.ts.map +1 -0
- package/dist/templates/tsconfig.js +21 -0
- package/dist/templates/tsconfig.js.map +1 -0
- package/package.json +12 -6
- package/dist/generators.d.ts +0 -7
- package/dist/generators.js +0 -328
|
@@ -0,0 +1,385 @@
|
|
|
1
|
+
export function claudeMdTemplate(config) {
|
|
2
|
+
const frameworkName = config.framework === 'express' ? 'Express' : 'Hono';
|
|
3
|
+
const lines = [];
|
|
4
|
+
// Title & What This Is
|
|
5
|
+
lines.push(`# ${config.name}`);
|
|
6
|
+
lines.push('');
|
|
7
|
+
lines.push('## What This Is');
|
|
8
|
+
lines.push(`Built with \`@objectifthunes/sandstone-sdk\` — a hexagonal-architecture backend toolkit.`);
|
|
9
|
+
lines.push(`Framework: ${frameworkName}. Database: PostgreSQL.`);
|
|
10
|
+
lines.push('');
|
|
11
|
+
// Architecture
|
|
12
|
+
lines.push('## Architecture');
|
|
13
|
+
lines.push('');
|
|
14
|
+
lines.push('- `src/infrastructure.ts` — all adapter wiring (database, auth, email, etc.)');
|
|
15
|
+
lines.push(`- \`src/main.ts\` — HTTP server entry point (${frameworkName})`);
|
|
16
|
+
if (config.graphql) {
|
|
17
|
+
lines.push('- `src/schema.ts` — GraphQL schema definition');
|
|
18
|
+
}
|
|
19
|
+
lines.push('- `migrations/` — SQL migrations (.up.sql / .down.sql)');
|
|
20
|
+
lines.push('- `scripts/migrate.ts` — migration runner script');
|
|
21
|
+
if (config.tests) {
|
|
22
|
+
lines.push('- `tests/` — test setup with in-memory adapters');
|
|
23
|
+
}
|
|
24
|
+
lines.push('');
|
|
25
|
+
// Stack table
|
|
26
|
+
lines.push('## Stack');
|
|
27
|
+
lines.push('');
|
|
28
|
+
lines.push('| Concern | Adapter | Import path |');
|
|
29
|
+
lines.push('|---------|---------|-------------|');
|
|
30
|
+
if (config.devMode) {
|
|
31
|
+
lines.push('| Database | In-memory (dev) | `@objectifthunes/sandstone-sdk/dev` |');
|
|
32
|
+
lines.push('| Logger | Console (dev) | `@objectifthunes/sandstone-sdk/dev` |');
|
|
33
|
+
lines.push('| Tokens | In-memory (dev) | `@objectifthunes/sandstone-sdk/dev` |');
|
|
34
|
+
if (config.email) {
|
|
35
|
+
lines.push('| Email | Console (dev) | `@objectifthunes/sandstone-sdk/dev` |');
|
|
36
|
+
}
|
|
37
|
+
if (config.auth === 'otp') {
|
|
38
|
+
lines.push('| Auth | OTP (magic link / code) | built-in |');
|
|
39
|
+
}
|
|
40
|
+
if (config.graphql) {
|
|
41
|
+
lines.push('| GraphQL | graphql-js | built-in |');
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
lines.push('| Database | PostgreSQL (`pg`) | `@objectifthunes/sandstone-sdk/pg` |');
|
|
46
|
+
lines.push('| Logger | Pino | `@objectifthunes/sandstone-sdk/pino` |');
|
|
47
|
+
lines.push('| Tokens | JOSE (JWT) | `@objectifthunes/sandstone-sdk/jose` |');
|
|
48
|
+
if (config.email === 'resend') {
|
|
49
|
+
lines.push('| Email | Resend | `@objectifthunes/sandstone-sdk/resend` |');
|
|
50
|
+
}
|
|
51
|
+
else if (config.email === 'nodemailer') {
|
|
52
|
+
lines.push('| Email | Nodemailer (SMTP) | `@objectifthunes/sandstone-sdk/nodemailer` |');
|
|
53
|
+
}
|
|
54
|
+
if (config.auth === 'otp') {
|
|
55
|
+
lines.push('| Auth | OTP (magic link / code) | built-in |');
|
|
56
|
+
}
|
|
57
|
+
else if (config.auth === 'password+otp') {
|
|
58
|
+
lines.push('| Auth | Password + OTP | built-in + `@objectifthunes/sandstone-sdk/argon2` |');
|
|
59
|
+
}
|
|
60
|
+
else if (config.auth === 'oauth+otp') {
|
|
61
|
+
lines.push('| Auth | OAuth (Google) + OTP | built-in + `@objectifthunes/sandstone-sdk/oauth-google` |');
|
|
62
|
+
}
|
|
63
|
+
else if (config.auth === 'all') {
|
|
64
|
+
lines.push('| Auth | Password + OTP + OAuth | built-in + `@objectifthunes/sandstone-sdk/argon2` + `@objectifthunes/sandstone-sdk/oauth-google` |');
|
|
65
|
+
}
|
|
66
|
+
if (config.payments === 'stripe') {
|
|
67
|
+
lines.push('| Payments | Stripe | `@objectifthunes/sandstone-sdk/stripe` |');
|
|
68
|
+
}
|
|
69
|
+
else if (config.payments === 'revenuecat') {
|
|
70
|
+
lines.push('| Payments | RevenueCat | `@objectifthunes/sandstone-sdk/revenuecat` |');
|
|
71
|
+
}
|
|
72
|
+
else if (config.payments === 'paddle') {
|
|
73
|
+
lines.push('| Payments | Paddle | `@objectifthunes/sandstone-sdk/paddle` |');
|
|
74
|
+
}
|
|
75
|
+
else if (config.payments === 'lemonsqueezy') {
|
|
76
|
+
lines.push('| Payments | Lemon Squeezy | `@objectifthunes/sandstone-sdk/lemonsqueezy` |');
|
|
77
|
+
}
|
|
78
|
+
if (config.storage === 's3') {
|
|
79
|
+
lines.push('| Storage | AWS S3 | `@objectifthunes/sandstone-sdk/s3` |');
|
|
80
|
+
}
|
|
81
|
+
else if (config.storage === 'r2') {
|
|
82
|
+
lines.push('| Storage | Cloudflare R2 | `@objectifthunes/sandstone-sdk/r2` |');
|
|
83
|
+
}
|
|
84
|
+
else if (config.storage === 'local') {
|
|
85
|
+
lines.push('| Storage | Local filesystem | `@objectifthunes/sandstone-sdk/local-storage` |');
|
|
86
|
+
}
|
|
87
|
+
if (config.cache === 'upstash') {
|
|
88
|
+
lines.push('| Cache | Upstash Redis | `@objectifthunes/sandstone-sdk/upstash` |');
|
|
89
|
+
}
|
|
90
|
+
if (config.graphql) {
|
|
91
|
+
lines.push('| GraphQL | graphql-js | built-in |');
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
lines.push('');
|
|
95
|
+
// Key Files
|
|
96
|
+
lines.push('## Key Files');
|
|
97
|
+
lines.push('');
|
|
98
|
+
lines.push('### `src/infrastructure.ts`');
|
|
99
|
+
lines.push('Wires all adapters together and exports the `app` instance created by `createApp()`.');
|
|
100
|
+
lines.push('This is the single place to swap adapters — change a provider here and the rest of the codebase is unaffected.');
|
|
101
|
+
lines.push('');
|
|
102
|
+
lines.push('### `src/main.ts`');
|
|
103
|
+
lines.push(`Starts the ${frameworkName} HTTP server. Runs migrations on startup, registers route handlers via the framework adapter, and handles graceful shutdown on SIGTERM.`);
|
|
104
|
+
lines.push('');
|
|
105
|
+
if (config.graphql) {
|
|
106
|
+
lines.push('### `src/schema.ts`');
|
|
107
|
+
lines.push('Defines the GraphQL schema using `graphql-js`. Add new types, queries, and mutations here.');
|
|
108
|
+
lines.push('');
|
|
109
|
+
}
|
|
110
|
+
lines.push('### `migrations/`');
|
|
111
|
+
lines.push('Plain SQL files named `NNN_description.up.sql` / `.down.sql`. Run with `npm run db:migrate`.');
|
|
112
|
+
lines.push('');
|
|
113
|
+
if (config.tests) {
|
|
114
|
+
lines.push('### `tests/setup.ts`');
|
|
115
|
+
lines.push('Vitest test setup. Uses in-memory adapters so tests run without external services.');
|
|
116
|
+
lines.push('');
|
|
117
|
+
}
|
|
118
|
+
// SDK Reference
|
|
119
|
+
lines.push('## SDK Reference');
|
|
120
|
+
lines.push('');
|
|
121
|
+
lines.push('**Core concepts:**');
|
|
122
|
+
lines.push('');
|
|
123
|
+
lines.push('- **Port** — an interface that defines a capability (e.g., `EmailPort`, `StoragePort`). The SDK ships ports for every concern.');
|
|
124
|
+
lines.push('- **Adapter** — a concrete implementation of a port (e.g., `createResendTransport` implements `EmailPort`).');
|
|
125
|
+
lines.push('- **`createApp(options)`** — assembles all adapters into a single `app` object that exposes typed handler factories, the `db` client, `logger`, and a `shutdown()` method.');
|
|
126
|
+
lines.push('- **`runMigrations(db)`** — applies pending SQL migrations from `migrations/`.');
|
|
127
|
+
lines.push('');
|
|
128
|
+
lines.push('**Error types** (import from `@objectifthunes/sandstone-sdk`):');
|
|
129
|
+
lines.push('');
|
|
130
|
+
lines.push('- `NotFoundError` — resource not found (maps to HTTP 404)');
|
|
131
|
+
lines.push('- `UnauthorizedError` — missing/invalid credentials (maps to HTTP 401)');
|
|
132
|
+
lines.push('- `ForbiddenError` — insufficient permissions (maps to HTTP 403)');
|
|
133
|
+
lines.push('- `ValidationError` — invalid input (maps to HTTP 422)');
|
|
134
|
+
lines.push('- `ConflictError` — duplicate resource (maps to HTTP 409)');
|
|
135
|
+
lines.push('');
|
|
136
|
+
lines.push('**Docs:** https://maxoujs.github.io/sandstone-sdk/');
|
|
137
|
+
lines.push('');
|
|
138
|
+
// Common Tasks
|
|
139
|
+
lines.push('## Common Tasks');
|
|
140
|
+
lines.push('');
|
|
141
|
+
lines.push('- **Add a new entity:** create a migration in `migrations/`, add a repository using `app.db`, wire it into a handler.');
|
|
142
|
+
if (config.graphql) {
|
|
143
|
+
lines.push('- **Add a GraphQL type/query/mutation:** edit `src/schema.ts` and add the resolver logic.');
|
|
144
|
+
}
|
|
145
|
+
if (config.auth) {
|
|
146
|
+
lines.push('- **Configure authentication:** adjust the `auth` options in `src/infrastructure.ts`.');
|
|
147
|
+
}
|
|
148
|
+
if (config.email) {
|
|
149
|
+
lines.push('- **Change email provider:** swap the transport import in `src/infrastructure.ts` and update `.env`.');
|
|
150
|
+
}
|
|
151
|
+
if (config.payments) {
|
|
152
|
+
lines.push('- **Change payment provider:** swap the provider import in `src/infrastructure.ts` and update `.env`.');
|
|
153
|
+
}
|
|
154
|
+
if (config.storage) {
|
|
155
|
+
lines.push('- **Change storage provider:** swap the storage import in `src/infrastructure.ts` and update `.env`.');
|
|
156
|
+
}
|
|
157
|
+
lines.push('- **Run migrations:** `npm run db:migrate`');
|
|
158
|
+
lines.push('- **Add a migration:** create `migrations/NNN_description.up.sql` (and `.down.sql`).');
|
|
159
|
+
lines.push('');
|
|
160
|
+
// Commands
|
|
161
|
+
lines.push('## Commands');
|
|
162
|
+
lines.push('');
|
|
163
|
+
lines.push('```sh');
|
|
164
|
+
lines.push('npm run dev # start dev server with hot-reload');
|
|
165
|
+
lines.push('npm run build # compile TypeScript to dist/');
|
|
166
|
+
lines.push('npm start # run compiled output');
|
|
167
|
+
lines.push('npm run lint # type-check without emitting');
|
|
168
|
+
lines.push('npm run db:migrate # run pending SQL migrations');
|
|
169
|
+
if (config.tests) {
|
|
170
|
+
lines.push('npm test # run unit tests (vitest)');
|
|
171
|
+
lines.push('npm run test:watch # run tests in watch mode');
|
|
172
|
+
}
|
|
173
|
+
if (config.e2e) {
|
|
174
|
+
lines.push('npm run test:e2e # run end-to-end tests');
|
|
175
|
+
}
|
|
176
|
+
lines.push('```');
|
|
177
|
+
lines.push('');
|
|
178
|
+
// Environment Variables
|
|
179
|
+
lines.push('## Environment Variables');
|
|
180
|
+
lines.push('');
|
|
181
|
+
if (config.devMode) {
|
|
182
|
+
lines.push('This project uses `./dev` imports — **no env vars required** to start.');
|
|
183
|
+
lines.push('');
|
|
184
|
+
lines.push('| Variable | Required | Description |');
|
|
185
|
+
lines.push('|----------|----------|-------------|');
|
|
186
|
+
lines.push('| `PORT` | No | HTTP port (default: 3000) |');
|
|
187
|
+
lines.push('| `LOG_LEVEL` | No | Log level (default: `info`) |');
|
|
188
|
+
lines.push('');
|
|
189
|
+
}
|
|
190
|
+
else {
|
|
191
|
+
lines.push('Copy `.env.example` to `.env` and fill in the values.');
|
|
192
|
+
lines.push('');
|
|
193
|
+
lines.push('| Variable | Required | Description |');
|
|
194
|
+
lines.push('|----------|----------|-------------|');
|
|
195
|
+
lines.push('| `PORT` | No | HTTP port (default: 3000) |');
|
|
196
|
+
lines.push('| `NODE_ENV` | No | `development` or `production` |');
|
|
197
|
+
lines.push('| `LOG_LEVEL` | No | Pino log level (default: `info`) |');
|
|
198
|
+
lines.push('| `DATABASE_URL` | **Yes** | PostgreSQL connection string |');
|
|
199
|
+
lines.push('| `JWT_SECRET` | **Yes** | Secret for signing JWT tokens (min 32 chars) |');
|
|
200
|
+
if (config.email === 'resend') {
|
|
201
|
+
lines.push('| `RESEND_API_KEY` | **Yes** | Resend API key |');
|
|
202
|
+
lines.push('| `EMAIL_FROM` | No | Sender address (default: `noreply@example.com`) |');
|
|
203
|
+
}
|
|
204
|
+
else if (config.email === 'nodemailer') {
|
|
205
|
+
lines.push('| `SMTP_HOST` | No | SMTP host (default: `localhost`) |');
|
|
206
|
+
lines.push('| `SMTP_PORT` | No | SMTP port (default: `1025`) |');
|
|
207
|
+
lines.push('| `SMTP_USER` | No | SMTP username |');
|
|
208
|
+
lines.push('| `SMTP_PASS` | No | SMTP password |');
|
|
209
|
+
lines.push('| `EMAIL_FROM` | No | Sender address (default: `noreply@example.com`) |');
|
|
210
|
+
}
|
|
211
|
+
if (config.auth === 'oauth+otp' || config.auth === 'all') {
|
|
212
|
+
lines.push('| `GOOGLE_CLIENT_ID` | **Yes** | Google OAuth client ID |');
|
|
213
|
+
lines.push('| `GOOGLE_CLIENT_SECRET` | **Yes** | Google OAuth client secret |');
|
|
214
|
+
lines.push('| `GOOGLE_REDIRECT_URI` | **Yes** | Google OAuth redirect URI |');
|
|
215
|
+
}
|
|
216
|
+
if (config.payments === 'stripe') {
|
|
217
|
+
lines.push('| `STRIPE_SECRET_KEY` | **Yes** | Stripe secret key |');
|
|
218
|
+
lines.push('| `STRIPE_WEBHOOK_SECRET` | **Yes** | Stripe webhook signing secret |');
|
|
219
|
+
}
|
|
220
|
+
else if (config.payments === 'revenuecat') {
|
|
221
|
+
lines.push('| `REVENUECAT_API_KEY` | **Yes** | RevenueCat API key |');
|
|
222
|
+
lines.push('| `REVENUECAT_WEBHOOK_SECRET` | **Yes** | RevenueCat webhook secret |');
|
|
223
|
+
}
|
|
224
|
+
else if (config.payments === 'paddle') {
|
|
225
|
+
lines.push('| `PADDLE_API_KEY` | **Yes** | Paddle API key |');
|
|
226
|
+
lines.push('| `PADDLE_WEBHOOK_SECRET` | **Yes** | Paddle webhook signing secret |');
|
|
227
|
+
lines.push('| `PADDLE_ENVIRONMENT` | No | `sandbox` or `production` (default: `sandbox`) |');
|
|
228
|
+
}
|
|
229
|
+
else if (config.payments === 'lemonsqueezy') {
|
|
230
|
+
lines.push('| `LEMONSQUEEZY_API_KEY` | **Yes** | Lemon Squeezy API key |');
|
|
231
|
+
lines.push('| `LEMONSQUEEZY_WEBHOOK_SECRET` | **Yes** | Lemon Squeezy webhook secret |');
|
|
232
|
+
}
|
|
233
|
+
if (config.storage === 's3') {
|
|
234
|
+
lines.push('| `S3_BUCKET` | **Yes** | S3 bucket name |');
|
|
235
|
+
lines.push('| `S3_REGION` | **Yes** | AWS region |');
|
|
236
|
+
lines.push('| `S3_ACCESS_KEY_ID` | **Yes** | AWS access key ID |');
|
|
237
|
+
lines.push('| `S3_SECRET_ACCESS_KEY` | **Yes** | AWS secret access key |');
|
|
238
|
+
}
|
|
239
|
+
else if (config.storage === 'r2') {
|
|
240
|
+
lines.push('| `R2_ACCOUNT_ID` | **Yes** | Cloudflare account ID |');
|
|
241
|
+
lines.push('| `R2_ACCESS_KEY_ID` | **Yes** | R2 access key ID |');
|
|
242
|
+
lines.push('| `R2_SECRET_ACCESS_KEY` | **Yes** | R2 secret access key |');
|
|
243
|
+
lines.push('| `R2_BUCKET` | **Yes** | R2 bucket name |');
|
|
244
|
+
}
|
|
245
|
+
else if (config.storage === 'local') {
|
|
246
|
+
lines.push('| `LOCAL_STORAGE_DIR` | No | Upload directory (default: `./uploads`) |');
|
|
247
|
+
}
|
|
248
|
+
if (config.cache === 'upstash') {
|
|
249
|
+
lines.push('| `UPSTASH_REDIS_URL` | **Yes** | Upstash Redis REST URL |');
|
|
250
|
+
lines.push('| `UPSTASH_REDIS_TOKEN` | **Yes** | Upstash Redis REST token |');
|
|
251
|
+
}
|
|
252
|
+
lines.push('');
|
|
253
|
+
}
|
|
254
|
+
// Switching to Production (devMode only)
|
|
255
|
+
if (config.devMode) {
|
|
256
|
+
lines.push('## Switching to Production');
|
|
257
|
+
lines.push('');
|
|
258
|
+
lines.push('This project was scaffolded in **prototype mode**: all adapters come from `@objectifthunes/sandstone-sdk/dev` and require zero config. When you are ready to deploy for real, follow these steps:');
|
|
259
|
+
lines.push('');
|
|
260
|
+
lines.push('### 1. Swap imports in `src/infrastructure.ts`');
|
|
261
|
+
lines.push('');
|
|
262
|
+
lines.push('Replace every `@objectifthunes/sandstone-sdk/dev` import with the real adapter subpath:');
|
|
263
|
+
lines.push('');
|
|
264
|
+
lines.push('| `./dev` factory | Real import path | Config needed |');
|
|
265
|
+
lines.push('|-----------------|------------------|---------------|');
|
|
266
|
+
lines.push('| `createPgClient()` | `@objectifthunes/sandstone-sdk/pg` | `{ connectionString: process.env.DATABASE_URL! }` |');
|
|
267
|
+
lines.push('| `createPinoLogger()` | `@objectifthunes/sandstone-sdk/pino` | `{ level: process.env.LOG_LEVEL ?? \'info\' }` |');
|
|
268
|
+
lines.push('| `createJoseSigner()` | `@objectifthunes/sandstone-sdk/jose` | `{ secret: process.env.JWT_SECRET! }` |');
|
|
269
|
+
lines.push('| `createNodemailerTransport()` | `@objectifthunes/sandstone-sdk/nodemailer` | SMTP options or swap for `resend` |');
|
|
270
|
+
lines.push('');
|
|
271
|
+
lines.push('### 2. Add environment variables');
|
|
272
|
+
lines.push('');
|
|
273
|
+
lines.push('Copy `.env.example` and add the required values:');
|
|
274
|
+
lines.push('');
|
|
275
|
+
lines.push('```sh');
|
|
276
|
+
lines.push('DATABASE_URL=postgresql://postgres:postgres@localhost:5432/' + config.name);
|
|
277
|
+
lines.push('JWT_SECRET=change-me-to-a-random-secret-at-least-32-chars');
|
|
278
|
+
lines.push('# plus any email / payment / storage keys');
|
|
279
|
+
lines.push('```');
|
|
280
|
+
lines.push('');
|
|
281
|
+
lines.push('### 3. Add docker-compose for Postgres');
|
|
282
|
+
lines.push('');
|
|
283
|
+
lines.push('Create a `docker-compose.yml` for local development:');
|
|
284
|
+
lines.push('');
|
|
285
|
+
lines.push('```yaml');
|
|
286
|
+
lines.push('services:');
|
|
287
|
+
lines.push(' postgres:');
|
|
288
|
+
lines.push(' image: postgres:16-alpine');
|
|
289
|
+
lines.push(' ports:');
|
|
290
|
+
lines.push(" - '5432:5432'");
|
|
291
|
+
lines.push(' environment:');
|
|
292
|
+
lines.push(` POSTGRES_DB: ${config.name}`);
|
|
293
|
+
lines.push(' POSTGRES_USER: postgres');
|
|
294
|
+
lines.push(' POSTGRES_PASSWORD: postgres');
|
|
295
|
+
lines.push(' volumes:');
|
|
296
|
+
lines.push(' - pgdata:/var/lib/postgresql/data');
|
|
297
|
+
lines.push('volumes:');
|
|
298
|
+
lines.push(' pgdata:');
|
|
299
|
+
lines.push('```');
|
|
300
|
+
lines.push('');
|
|
301
|
+
lines.push('Then run `docker compose up -d` before `npm run dev`.');
|
|
302
|
+
lines.push('');
|
|
303
|
+
}
|
|
304
|
+
// Custom Adapters
|
|
305
|
+
lines.push('## Custom Adapters');
|
|
306
|
+
lines.push('');
|
|
307
|
+
lines.push('The SDK defines port interfaces (contracts) for every infrastructure concern. You can build a custom adapter for any port by implementing the interface and swapping it in `src/infrastructure.ts`.');
|
|
308
|
+
lines.push('');
|
|
309
|
+
lines.push('### Port Interfaces');
|
|
310
|
+
lines.push('');
|
|
311
|
+
lines.push('| Port | Interface | Methods |');
|
|
312
|
+
lines.push('|------|-----------|---------|');
|
|
313
|
+
lines.push('| Database | `DatabaseClient` | `query(text, values?)`, `transaction(fn)`, `healthCheck()`, `close()`, `getPoolStats?()` |');
|
|
314
|
+
lines.push('| Logging | `Logger` | `info(msg, data?)`, `warn(msg, data?)`, `error(msg, data?)`, `debug(msg, data?)`, `child(bindings)` |');
|
|
315
|
+
lines.push('| Tokens | `TokenSigner` | `sign(payload, expiresIn)`, `verify(token)`, `signPair(payload, accessTTL, refreshTTL)` |');
|
|
316
|
+
lines.push('| Email | `EmailTransport` | `send(message)` |');
|
|
317
|
+
lines.push('| Payments | `PaymentProvider` | `customers.create/get/update/delete`, `subscriptions.create/get/cancel/listByCustomer`, `invoices.get/listByCustomer`, `webhooks.verify` |');
|
|
318
|
+
lines.push('| Storage | `StorageProvider` | `upload(params)`, `download(key)`, `delete(key)`, `getSignedUrl(key, expiresIn)`, `exists(key)` |');
|
|
319
|
+
lines.push('| Cache | `CacheProvider` | `get(key)`, `set(key, value, ttl?)`, `delete(key)`, `flush()`, `increment(key, ttl?)` |');
|
|
320
|
+
lines.push('| Passwords | `PasswordHasher` | `hash(password)`, `verify(password, hash)` |');
|
|
321
|
+
lines.push('| OAuth | `OAuthProvider` | `getAuthUrl(params)`, `handleCallback(params)` |');
|
|
322
|
+
lines.push('| Tracing | `Tracer` | `startSpan(name, options?)`, `withSpan(name, fn)` |');
|
|
323
|
+
lines.push('');
|
|
324
|
+
lines.push('### The Pattern');
|
|
325
|
+
lines.push('');
|
|
326
|
+
lines.push('1. Import the port type: `import type { EmailTransport } from \'@objectifthunes/sandstone-sdk\'`');
|
|
327
|
+
lines.push('2. Write a factory function that returns an object implementing the interface');
|
|
328
|
+
lines.push('3. Swap it into `src/infrastructure.ts`');
|
|
329
|
+
lines.push('');
|
|
330
|
+
lines.push('### Example: Custom Email Adapter (SendGrid)');
|
|
331
|
+
lines.push('');
|
|
332
|
+
lines.push('```ts');
|
|
333
|
+
lines.push('// src/adapters/sendgrid.ts');
|
|
334
|
+
lines.push("import type { EmailTransport, EmailMessage } from '@objectifthunes/sandstone-sdk';");
|
|
335
|
+
lines.push('');
|
|
336
|
+
lines.push('export function createSendGridTransport(apiKey: string): EmailTransport {');
|
|
337
|
+
lines.push(' return {');
|
|
338
|
+
lines.push(' async send(message: EmailMessage) {');
|
|
339
|
+
lines.push(" const response = await fetch('https://api.sendgrid.com/v3/mail/send', {");
|
|
340
|
+
lines.push(" method: 'POST',");
|
|
341
|
+
lines.push(' headers: {');
|
|
342
|
+
lines.push(' Authorization: `Bearer ${apiKey}`,');
|
|
343
|
+
lines.push(" 'Content-Type': 'application/json',");
|
|
344
|
+
lines.push(' },');
|
|
345
|
+
lines.push(' body: JSON.stringify({');
|
|
346
|
+
lines.push(' personalizations: [{');
|
|
347
|
+
lines.push(" to: (Array.isArray(message.to) ? message.to : [message.to]).map(e => ({ email: e })),");
|
|
348
|
+
lines.push(' }],');
|
|
349
|
+
lines.push(" from: { email: message.from ?? 'noreply@example.com' },");
|
|
350
|
+
lines.push(' subject: message.subject,');
|
|
351
|
+
lines.push(" content: [{ type: 'text/html', value: message.html }],");
|
|
352
|
+
lines.push(' }),');
|
|
353
|
+
lines.push(' });');
|
|
354
|
+
lines.push('');
|
|
355
|
+
lines.push(' if (!response.ok) {');
|
|
356
|
+
lines.push(' throw new Error(`SendGrid error: ${response.status}`);');
|
|
357
|
+
lines.push(' }');
|
|
358
|
+
lines.push('');
|
|
359
|
+
lines.push(" return { messageId: response.headers.get('x-message-id') ?? crypto.randomUUID() };");
|
|
360
|
+
lines.push(' },');
|
|
361
|
+
lines.push(' };');
|
|
362
|
+
lines.push('}');
|
|
363
|
+
lines.push('```');
|
|
364
|
+
lines.push('');
|
|
365
|
+
lines.push('Then in `src/infrastructure.ts`:');
|
|
366
|
+
lines.push('');
|
|
367
|
+
lines.push('```ts');
|
|
368
|
+
lines.push("import { createSendGridTransport } from './adapters/sendgrid.js';");
|
|
369
|
+
lines.push('');
|
|
370
|
+
lines.push('const app = await createApp({');
|
|
371
|
+
lines.push(' db,');
|
|
372
|
+
lines.push(' logger,');
|
|
373
|
+
lines.push(' tokens,');
|
|
374
|
+
lines.push(' email: {');
|
|
375
|
+
lines.push(' transport: createSendGridTransport(process.env.SENDGRID_API_KEY!),');
|
|
376
|
+
lines.push(" defaultFrom: 'noreply@myapp.com',");
|
|
377
|
+
lines.push(' },');
|
|
378
|
+
lines.push('});');
|
|
379
|
+
lines.push('```');
|
|
380
|
+
lines.push('');
|
|
381
|
+
lines.push('Full guide with every port interface: https://maxoujs.github.io/sandstone-sdk/guides/custom-adapters/');
|
|
382
|
+
lines.push('');
|
|
383
|
+
return lines.join('\n');
|
|
384
|
+
}
|
|
385
|
+
//# sourceMappingURL=claude-md.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-md.js","sourceRoot":"","sources":["../../src/templates/claude-md.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"docker-compose.d.ts","sourceRoot":"","sources":["../../src/templates/docker-compose.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAEnD,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CAmCnE"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
export function dockerComposeTemplate(config) {
|
|
2
|
+
const services = [];
|
|
3
|
+
services.push(` postgres:
|
|
4
|
+
image: postgres:16-alpine
|
|
5
|
+
ports:
|
|
6
|
+
- '5432:5432'
|
|
7
|
+
environment:
|
|
8
|
+
POSTGRES_DB: ${config.name}
|
|
9
|
+
POSTGRES_USER: postgres
|
|
10
|
+
POSTGRES_PASSWORD: postgres
|
|
11
|
+
volumes:
|
|
12
|
+
- pgdata:/var/lib/postgresql/data
|
|
13
|
+
healthcheck:
|
|
14
|
+
test: ['CMD-SHELL', 'pg_isready -U postgres']
|
|
15
|
+
interval: 5s
|
|
16
|
+
timeout: 5s
|
|
17
|
+
retries: 5`);
|
|
18
|
+
if (config.email === 'nodemailer') {
|
|
19
|
+
services.push(`
|
|
20
|
+
mailhog:
|
|
21
|
+
image: mailhog/mailhog:v1.0.1
|
|
22
|
+
ports:
|
|
23
|
+
- '1025:1025'
|
|
24
|
+
- '8025:8025'`);
|
|
25
|
+
}
|
|
26
|
+
const volumes = ['volumes:', ' pgdata:'];
|
|
27
|
+
return `services:
|
|
28
|
+
${services.join('\n')}
|
|
29
|
+
|
|
30
|
+
${volumes.join('\n')}
|
|
31
|
+
`;
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=docker-compose.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"docker-compose.js","sourceRoot":"","sources":["../../src/templates/docker-compose.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,qBAAqB,CAAC,MAAqB;IACzD,MAAM,QAAQ,GAAa,EAAE,CAAC;IAE9B,QAAQ,CAAC,IAAI,CAAC;;;;;qBAKK,MAAM,CAAC,IAAI;;;;;;;;;iBASf,CAAC,CAAC;IAEjB,IAAI,MAAM,CAAC,KAAK,KAAK,YAAY,EAAE,CAAC;QAClC,QAAQ,CAAC,IAAI,CAAC;;;;;oBAKE,CAAC,CAAC;IACpB,CAAC;IAED,MAAM,OAAO,GAAG,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;IAE1C,OAAO;EACP,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;;EAEnB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;CACnB,CAAC;AACF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env-example.d.ts","sourceRoot":"","sources":["../../src/templates/env-example.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAEnD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CAqGhE"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
export function envExampleTemplate(config) {
|
|
2
|
+
if (config.devMode) {
|
|
3
|
+
return [
|
|
4
|
+
'# Server',
|
|
5
|
+
'PORT=3000',
|
|
6
|
+
'LOG_LEVEL=info',
|
|
7
|
+
'',
|
|
8
|
+
].join('\n');
|
|
9
|
+
}
|
|
10
|
+
const lines = [
|
|
11
|
+
'# Server',
|
|
12
|
+
'PORT=3000',
|
|
13
|
+
'NODE_ENV=development',
|
|
14
|
+
'LOG_LEVEL=info',
|
|
15
|
+
'',
|
|
16
|
+
'# Database',
|
|
17
|
+
'DATABASE_URL=postgresql://postgres:postgres@localhost:5432/' + config.name,
|
|
18
|
+
'',
|
|
19
|
+
'# Auth',
|
|
20
|
+
'JWT_SECRET=change-me-to-a-random-secret-at-least-32-chars',
|
|
21
|
+
];
|
|
22
|
+
if (config.email === 'resend') {
|
|
23
|
+
lines.push('', '# Email (Resend)', 'RESEND_API_KEY=re_xxx', 'EMAIL_FROM=noreply@example.com');
|
|
24
|
+
}
|
|
25
|
+
else if (config.email === 'nodemailer') {
|
|
26
|
+
lines.push('', '# Email (SMTP)', 'SMTP_HOST=localhost', 'SMTP_PORT=1025', 'SMTP_USER=', 'SMTP_PASS=', 'EMAIL_FROM=noreply@example.com');
|
|
27
|
+
}
|
|
28
|
+
if (config.auth === 'oauth+otp' || config.auth === 'all') {
|
|
29
|
+
lines.push('', '# OAuth (Google)', 'GOOGLE_CLIENT_ID=', 'GOOGLE_CLIENT_SECRET=', 'GOOGLE_REDIRECT_URI=http://localhost:3000/auth/google/callback');
|
|
30
|
+
}
|
|
31
|
+
if (config.payments === 'stripe') {
|
|
32
|
+
lines.push('', '# Payments (Stripe)', 'STRIPE_SECRET_KEY=sk_test_xxx', 'STRIPE_WEBHOOK_SECRET=whsec_xxx');
|
|
33
|
+
}
|
|
34
|
+
else if (config.payments === 'revenuecat') {
|
|
35
|
+
lines.push('', '# Payments (RevenueCat)', 'REVENUECAT_API_KEY=', 'REVENUECAT_WEBHOOK_SECRET=');
|
|
36
|
+
}
|
|
37
|
+
else if (config.payments === 'paddle') {
|
|
38
|
+
lines.push('', '# Payments (Paddle)', 'PADDLE_API_KEY=', 'PADDLE_WEBHOOK_SECRET=', 'PADDLE_ENVIRONMENT=sandbox');
|
|
39
|
+
}
|
|
40
|
+
else if (config.payments === 'lemonsqueezy') {
|
|
41
|
+
lines.push('', '# Payments (Lemon Squeezy)', 'LEMONSQUEEZY_API_KEY=', 'LEMONSQUEEZY_WEBHOOK_SECRET=');
|
|
42
|
+
}
|
|
43
|
+
if (config.storage === 's3') {
|
|
44
|
+
lines.push('', '# Storage (S3)', 'S3_BUCKET=my-bucket', 'S3_REGION=us-east-1', 'S3_ACCESS_KEY_ID=', 'S3_SECRET_ACCESS_KEY=');
|
|
45
|
+
}
|
|
46
|
+
else if (config.storage === 'r2') {
|
|
47
|
+
lines.push('', '# Storage (Cloudflare R2)', 'R2_ACCOUNT_ID=', 'R2_ACCESS_KEY_ID=', 'R2_SECRET_ACCESS_KEY=', 'R2_BUCKET=my-bucket');
|
|
48
|
+
}
|
|
49
|
+
else if (config.storage === 'local') {
|
|
50
|
+
lines.push('', '# Storage (Local)', 'LOCAL_STORAGE_DIR=./uploads');
|
|
51
|
+
}
|
|
52
|
+
if (config.cache === 'upstash') {
|
|
53
|
+
lines.push('', '# Cache (Upstash Redis)', 'UPSTASH_REDIS_URL=', 'UPSTASH_REDIS_TOKEN=');
|
|
54
|
+
}
|
|
55
|
+
lines.push('');
|
|
56
|
+
return lines.join('\n');
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=env-example.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env-example.js","sourceRoot":"","sources":["../../src/templates/env-example.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gitignore.d.ts","sourceRoot":"","sources":["../../src/templates/gitignore.ts"],"names":[],"mappings":"AAAA,wBAAgB,iBAAiB,IAAI,MAAM,CAS1C"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gitignore.js","sourceRoot":"","sources":["../../src/templates/gitignore.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,iBAAiB;IAC/B,OAAO;;;;;;;CAOR,CAAC;AACF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"infrastructure.d.ts","sourceRoot":"","sources":["../../src/templates/infrastructure.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAEnD,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CA8OpE"}
|