@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.
Files changed (71) hide show
  1. package/dist/generator.d.ts +3 -0
  2. package/dist/generator.d.ts.map +1 -0
  3. package/dist/generator.js +78 -0
  4. package/dist/generator.js.map +1 -0
  5. package/dist/index.d.ts +1 -0
  6. package/dist/index.d.ts.map +1 -0
  7. package/dist/index.js +106 -61
  8. package/dist/index.js.map +1 -0
  9. package/dist/presets.d.ts +25 -0
  10. package/dist/presets.d.ts.map +1 -0
  11. package/dist/presets.js +58 -0
  12. package/dist/presets.js.map +1 -0
  13. package/dist/prompts.d.ts +3 -13
  14. package/dist/prompts.d.ts.map +1 -0
  15. package/dist/prompts.js +61 -62
  16. package/dist/prompts.js.map +1 -0
  17. package/dist/templates/claude-md.d.ts +3 -0
  18. package/dist/templates/claude-md.d.ts.map +1 -0
  19. package/dist/templates/claude-md.js +385 -0
  20. package/dist/templates/claude-md.js.map +1 -0
  21. package/dist/templates/docker-compose.d.ts +3 -0
  22. package/dist/templates/docker-compose.d.ts.map +1 -0
  23. package/dist/templates/docker-compose.js +33 -0
  24. package/dist/templates/docker-compose.js.map +1 -0
  25. package/dist/templates/env-example.d.ts +3 -0
  26. package/dist/templates/env-example.d.ts.map +1 -0
  27. package/dist/templates/env-example.js +58 -0
  28. package/dist/templates/env-example.js.map +1 -0
  29. package/dist/templates/gitignore.d.ts +2 -0
  30. package/dist/templates/gitignore.d.ts.map +1 -0
  31. package/dist/templates/gitignore.js +11 -0
  32. package/dist/templates/gitignore.js.map +1 -0
  33. package/dist/templates/infrastructure.d.ts +3 -0
  34. package/dist/templates/infrastructure.d.ts.map +1 -0
  35. package/dist/templates/infrastructure.js +243 -0
  36. package/dist/templates/infrastructure.js.map +1 -0
  37. package/dist/templates/main-express.d.ts +3 -0
  38. package/dist/templates/main-express.d.ts.map +1 -0
  39. package/dist/templates/main-express.js +45 -0
  40. package/dist/templates/main-express.js.map +1 -0
  41. package/dist/templates/main-hono.d.ts +3 -0
  42. package/dist/templates/main-hono.d.ts.map +1 -0
  43. package/dist/templates/main-hono.js +47 -0
  44. package/dist/templates/main-hono.js.map +1 -0
  45. package/dist/templates/migrate-script.d.ts +2 -0
  46. package/dist/templates/migrate-script.d.ts.map +1 -0
  47. package/dist/templates/migrate-script.js +18 -0
  48. package/dist/templates/migrate-script.js.map +1 -0
  49. package/dist/templates/migration.d.ts +2 -0
  50. package/dist/templates/migration.d.ts.map +1 -0
  51. package/dist/templates/migration.js +17 -0
  52. package/dist/templates/migration.js.map +1 -0
  53. package/dist/templates/package-json.d.ts +3 -0
  54. package/dist/templates/package-json.d.ts.map +1 -0
  55. package/dist/templates/package-json.js +85 -0
  56. package/dist/templates/package-json.js.map +1 -0
  57. package/dist/templates/schema.d.ts +3 -0
  58. package/dist/templates/schema.d.ts.map +1 -0
  59. package/dist/templates/schema.js +108 -0
  60. package/dist/templates/schema.js.map +1 -0
  61. package/dist/templates/test-setup.d.ts +3 -0
  62. package/dist/templates/test-setup.d.ts.map +1 -0
  63. package/dist/templates/test-setup.js +41 -0
  64. package/dist/templates/test-setup.js.map +1 -0
  65. package/dist/templates/tsconfig.d.ts +2 -0
  66. package/dist/templates/tsconfig.d.ts.map +1 -0
  67. package/dist/templates/tsconfig.js +21 -0
  68. package/dist/templates/tsconfig.js.map +1 -0
  69. package/package.json +12 -6
  70. package/dist/generators.d.ts +0 -7
  71. 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,3 @@
1
+ import type { ProjectConfig } from '../presets.js';
2
+ export declare function dockerComposeTemplate(config: ProjectConfig): string;
3
+ //# sourceMappingURL=docker-compose.d.ts.map
@@ -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,3 @@
1
+ import type { ProjectConfig } from '../presets.js';
2
+ export declare function envExampleTemplate(config: ProjectConfig): string;
3
+ //# sourceMappingURL=env-example.d.ts.map
@@ -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,2 @@
1
+ export declare function gitignoreTemplate(): string;
2
+ //# sourceMappingURL=gitignore.d.ts.map
@@ -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,11 @@
1
+ export function gitignoreTemplate() {
2
+ return `node_modules/
3
+ dist/
4
+ .env
5
+ .env.local
6
+ *.log
7
+ coverage/
8
+ .DS_Store
9
+ `;
10
+ }
11
+ //# sourceMappingURL=gitignore.js.map
@@ -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,3 @@
1
+ import type { ProjectConfig } from '../presets.js';
2
+ export declare function infrastructureTemplate(config: ProjectConfig): string;
3
+ //# sourceMappingURL=infrastructure.d.ts.map
@@ -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"}