@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,243 @@
1
+ export function infrastructureTemplate(config) {
2
+ const imports = [];
3
+ const inits = [];
4
+ const appOptions = [];
5
+ const devMode = config.devMode === true;
6
+ const devPath = `'@objectifthunes/sandstone-sdk/dev'`;
7
+ // Core imports always needed
8
+ imports.push(`import { createApp } from '@objectifthunes/sandstone-sdk'`);
9
+ // Database
10
+ if (devMode) {
11
+ imports.push(`import { createPgClient } from ${devPath}`);
12
+ inits.push(`const db = createPgClient()`);
13
+ }
14
+ else {
15
+ imports.push(`import { createPgClient } from '@objectifthunes/sandstone-sdk/pg'`);
16
+ inits.push(`const db = createPgClient({ connectionString: process.env.DATABASE_URL! })`);
17
+ }
18
+ appOptions.push('db');
19
+ // Logger
20
+ if (devMode) {
21
+ imports.push(`import { createPinoLogger } from ${devPath}`);
22
+ inits.push(`const logger = createPinoLogger()`);
23
+ }
24
+ else {
25
+ imports.push(`import { createPinoLogger } from '@objectifthunes/sandstone-sdk/pino'`);
26
+ inits.push(`const logger = createPinoLogger({ level: process.env.LOG_LEVEL ?? 'info' })`);
27
+ }
28
+ appOptions.push('logger');
29
+ // Tokens
30
+ if (devMode) {
31
+ imports.push(`import { createJoseSigner } from ${devPath}`);
32
+ inits.push(`const tokens = createJoseSigner()`);
33
+ }
34
+ else {
35
+ imports.push(`import { createJoseSigner } from '@objectifthunes/sandstone-sdk/jose'`);
36
+ inits.push(`const tokens = createJoseSigner({ secret: process.env.JWT_SECRET! })`);
37
+ }
38
+ appOptions.push('tokens');
39
+ // Email
40
+ if (devMode && config.email) {
41
+ imports.push(`import { createNodemailerTransport } from ${devPath}`);
42
+ inits.push(`const emailTransport = createNodemailerTransport()`);
43
+ appOptions.push(`email: { transport: emailTransport, from: 'dev@localhost' }`);
44
+ }
45
+ else if (config.email === 'resend') {
46
+ imports.push(`import { createResendTransport } from '@objectifthunes/sandstone-sdk/resend'`);
47
+ inits.push(`const emailTransport = createResendTransport({ apiKey: process.env.RESEND_API_KEY! })`);
48
+ appOptions.push(`email: { transport: emailTransport, from: process.env.EMAIL_FROM ?? 'noreply@example.com' }`);
49
+ }
50
+ else if (config.email === 'nodemailer') {
51
+ imports.push(`import { createNodemailerTransport } from '@objectifthunes/sandstone-sdk/nodemailer'`);
52
+ inits.push(`const emailTransport = createNodemailerTransport({
53
+ host: process.env.SMTP_HOST ?? 'localhost',
54
+ port: Number(process.env.SMTP_PORT ?? 1025),
55
+ auth: process.env.SMTP_USER ? { user: process.env.SMTP_USER, pass: process.env.SMTP_PASS ?? '' } : undefined,
56
+ })`);
57
+ appOptions.push(`email: { transport: emailTransport, from: process.env.EMAIL_FROM ?? 'noreply@example.com' }`);
58
+ }
59
+ // Auth
60
+ if (config.auth) {
61
+ const authOpts = [`otp: { length: 6, expiresIn: '10m' }`];
62
+ appOptions.push(`auth: { ${authOpts.join(', ')} }`);
63
+ }
64
+ // Password hasher (for password+otp or all)
65
+ if (config.auth === 'password+otp' || config.auth === 'all') {
66
+ if (devMode) {
67
+ imports.push(`import { createArgon2Hasher } from ${devPath}`);
68
+ }
69
+ else {
70
+ imports.push(`import { createArgon2Hasher } from '@objectifthunes/sandstone-sdk/argon2'`);
71
+ }
72
+ inits.push(`const passwordHasher = createArgon2Hasher()`);
73
+ }
74
+ // OAuth (for oauth+otp or all)
75
+ if (config.auth === 'oauth+otp' || config.auth === 'all') {
76
+ if (devMode) {
77
+ imports.push(`import { createGoogleOAuth } from ${devPath}`);
78
+ inits.push(`const googleOAuth = createGoogleOAuth()`);
79
+ }
80
+ else {
81
+ imports.push(`import { createGoogleOAuth } from '@objectifthunes/sandstone-sdk/oauth-google'`);
82
+ inits.push(`const googleOAuth = createGoogleOAuth({
83
+ clientId: process.env.GOOGLE_CLIENT_ID!,
84
+ clientSecret: process.env.GOOGLE_CLIENT_SECRET!,
85
+ redirectUri: process.env.GOOGLE_REDIRECT_URI!,
86
+ })`);
87
+ }
88
+ }
89
+ // Payments
90
+ if (config.payments === 'stripe') {
91
+ if (devMode) {
92
+ imports.push(`import { createStripeProvider } from ${devPath}`);
93
+ inits.push(`const paymentProvider = createStripeProvider()`);
94
+ }
95
+ else {
96
+ imports.push(`import { createStripeProvider } from '@objectifthunes/sandstone-sdk/stripe'`);
97
+ inits.push(`const paymentProvider = createStripeProvider({
98
+ secretKey: process.env.STRIPE_SECRET_KEY!,
99
+ webhookSecret: process.env.STRIPE_WEBHOOK_SECRET!,
100
+ })`);
101
+ }
102
+ appOptions.push('payments: { provider: paymentProvider }');
103
+ }
104
+ else if (config.payments === 'revenuecat') {
105
+ if (devMode) {
106
+ imports.push(`import { createRevenueCatProvider } from ${devPath}`);
107
+ inits.push(`const paymentProvider = createRevenueCatProvider()`);
108
+ }
109
+ else {
110
+ imports.push(`import { createRevenueCatProvider } from '@objectifthunes/sandstone-sdk/revenuecat'`);
111
+ inits.push(`const paymentProvider = createRevenueCatProvider({
112
+ apiKey: process.env.REVENUECAT_API_KEY!,
113
+ webhookSecret: process.env.REVENUECAT_WEBHOOK_SECRET!,
114
+ })`);
115
+ }
116
+ appOptions.push('payments: { provider: paymentProvider }');
117
+ }
118
+ else if (config.payments === 'paddle') {
119
+ if (devMode) {
120
+ imports.push(`import { createPaddleProvider } from ${devPath}`);
121
+ inits.push(`const paymentProvider = createPaddleProvider()`);
122
+ }
123
+ else {
124
+ imports.push(`import { createPaddleProvider } from '@objectifthunes/sandstone-sdk/paddle'`);
125
+ inits.push(`const paymentProvider = createPaddleProvider({
126
+ apiKey: process.env.PADDLE_API_KEY!,
127
+ webhookSecret: process.env.PADDLE_WEBHOOK_SECRET!,
128
+ environment: (process.env.PADDLE_ENVIRONMENT as 'sandbox' | 'production') ?? 'sandbox',
129
+ })`);
130
+ }
131
+ appOptions.push('payments: { provider: paymentProvider }');
132
+ }
133
+ else if (config.payments === 'lemonsqueezy') {
134
+ if (devMode) {
135
+ imports.push(`import { createLemonSqueezyProvider } from ${devPath}`);
136
+ inits.push(`const paymentProvider = createLemonSqueezyProvider()`);
137
+ }
138
+ else {
139
+ imports.push(`import { createLemonSqueezyProvider } from '@objectifthunes/sandstone-sdk/lemonsqueezy'`);
140
+ inits.push(`const paymentProvider = createLemonSqueezyProvider({
141
+ apiKey: process.env.LEMONSQUEEZY_API_KEY!,
142
+ webhookSecret: process.env.LEMONSQUEEZY_WEBHOOK_SECRET!,
143
+ })`);
144
+ }
145
+ appOptions.push('payments: { provider: paymentProvider }');
146
+ }
147
+ // Storage
148
+ if (config.storage === 's3') {
149
+ if (devMode) {
150
+ imports.push(`import { createS3Storage } from ${devPath}`);
151
+ inits.push(`const storage = createS3Storage()`);
152
+ }
153
+ else {
154
+ imports.push(`import { createS3Storage } from '@objectifthunes/sandstone-sdk/s3'`);
155
+ inits.push(`const storage = createS3Storage({
156
+ bucket: process.env.S3_BUCKET!,
157
+ region: process.env.S3_REGION!,
158
+ credentials: {
159
+ accessKeyId: process.env.S3_ACCESS_KEY_ID!,
160
+ secretAccessKey: process.env.S3_SECRET_ACCESS_KEY!,
161
+ },
162
+ })`);
163
+ }
164
+ }
165
+ else if (config.storage === 'r2') {
166
+ if (devMode) {
167
+ imports.push(`import { createR2Storage } from ${devPath}`);
168
+ inits.push(`const storage = createR2Storage()`);
169
+ }
170
+ else {
171
+ imports.push(`import { createR2Storage } from '@objectifthunes/sandstone-sdk/r2'`);
172
+ inits.push(`const storage = createR2Storage({
173
+ accountId: process.env.R2_ACCOUNT_ID!,
174
+ accessKeyId: process.env.R2_ACCESS_KEY_ID!,
175
+ secretAccessKey: process.env.R2_SECRET_ACCESS_KEY!,
176
+ bucket: process.env.R2_BUCKET!,
177
+ })`);
178
+ }
179
+ }
180
+ else if (config.storage === 'local') {
181
+ if (devMode) {
182
+ imports.push(`import { createLocalStorage } from ${devPath}`);
183
+ inits.push(`const storage = createLocalStorage()`);
184
+ }
185
+ else {
186
+ imports.push(`import { createLocalStorage } from '@objectifthunes/sandstone-sdk/local-storage'`);
187
+ inits.push(`const storage = createLocalStorage({
188
+ directory: process.env.LOCAL_STORAGE_DIR ?? './uploads',
189
+ })`);
190
+ }
191
+ }
192
+ // Cache
193
+ if (config.cache === 'upstash') {
194
+ if (devMode) {
195
+ imports.push(`import { createUpstashCache } from ${devPath}`);
196
+ inits.push(`const cache = createUpstashCache()`);
197
+ }
198
+ else {
199
+ imports.push(`import { createUpstashCache } from '@objectifthunes/sandstone-sdk/upstash'`);
200
+ inits.push(`const cache = createUpstashCache({
201
+ url: process.env.UPSTASH_REDIS_URL!,
202
+ token: process.env.UPSTASH_REDIS_TOKEN!,
203
+ })`);
204
+ }
205
+ }
206
+ // GraphQL
207
+ if (config.graphql) {
208
+ imports.push(`import { schema } from './schema.js'`);
209
+ appOptions.push(`graphql: { schema }`);
210
+ }
211
+ // Build the createApp call
212
+ const optionsStr = appOptions
213
+ .map((opt) => ` ${opt},`)
214
+ .join('\n');
215
+ const parts = [];
216
+ parts.push(imports.join('\n'));
217
+ parts.push('');
218
+ parts.push(inits.join('\n\n'));
219
+ parts.push('');
220
+ parts.push(`export const app = await createApp({
221
+ ${optionsStr}
222
+ })`);
223
+ // Export extras that main.ts might need
224
+ if (config.storage) {
225
+ parts.push('');
226
+ parts.push('export { storage }');
227
+ }
228
+ if (config.cache === 'upstash') {
229
+ parts.push('');
230
+ parts.push('export { cache }');
231
+ }
232
+ if (config.auth === 'password+otp' || config.auth === 'all') {
233
+ parts.push('');
234
+ parts.push('export { passwordHasher }');
235
+ }
236
+ if (config.auth === 'oauth+otp' || config.auth === 'all') {
237
+ parts.push('');
238
+ parts.push('export { googleOAuth }');
239
+ }
240
+ parts.push('');
241
+ return parts.join('\n');
242
+ }
243
+ //# sourceMappingURL=infrastructure.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"infrastructure.js","sourceRoot":"","sources":["../../src/templates/infrastructure.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { ProjectConfig } from '../presets.js';
2
+ export declare function mainExpressTemplate(config: ProjectConfig): string;
3
+ //# sourceMappingURL=main-express.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main-express.d.ts","sourceRoot":"","sources":["../../src/templates/main-express.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAEnD,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CAkDjE"}
@@ -0,0 +1,45 @@
1
+ export function mainExpressTemplate(config) {
2
+ const imports = [`import express from 'express'`];
3
+ imports.push(`import { expressAdapter } from '@objectifthunes/sandstone-sdk/adapters'`);
4
+ imports.push(`import { app } from './infrastructure.js'`);
5
+ imports.push(`import { runMigrations } from '@objectifthunes/sandstone-sdk'`);
6
+ const lines = [];
7
+ lines.push(imports.join('\n'));
8
+ lines.push('');
9
+ lines.push('const server = express()');
10
+ lines.push('server.use(express.json())');
11
+ lines.push('');
12
+ // Health check
13
+ lines.push(`server.get('/health', expressAdapter(app.healthHandler))`);
14
+ lines.push('');
15
+ // GraphQL
16
+ if (config.graphql) {
17
+ lines.push(`if (app.graphqlHandler) {`);
18
+ lines.push(` server.post('/graphql', expressAdapter(app.graphqlHandler))`);
19
+ lines.push(`}`);
20
+ lines.push('');
21
+ }
22
+ // Startup
23
+ lines.push(`const port = Number(process.env.PORT ?? 3000)`);
24
+ lines.push('');
25
+ lines.push(`async function start() {`);
26
+ lines.push(` await runMigrations(app.db, { includeBuiltIn: true })`);
27
+ lines.push(` server.listen(port, () => {`);
28
+ lines.push(` app.logger.info({ port }, 'Server started')`);
29
+ lines.push(` })`);
30
+ lines.push(`}`);
31
+ lines.push('');
32
+ lines.push(`start().catch((err) => {`);
33
+ lines.push(` app.logger.error('Failed to start server', { error: err instanceof Error ? err.message : String(err) })`);
34
+ lines.push(` process.exit(1)`);
35
+ lines.push(`})`);
36
+ lines.push('');
37
+ // Graceful shutdown
38
+ lines.push(`process.on('SIGTERM', async () => {`);
39
+ lines.push(` await app.shutdown()`);
40
+ lines.push(` process.exit(0)`);
41
+ lines.push(`})`);
42
+ lines.push('');
43
+ return lines.join('\n');
44
+ }
45
+ //# sourceMappingURL=main-express.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main-express.js","sourceRoot":"","sources":["../../src/templates/main-express.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,mBAAmB,CAAC,MAAqB;IACvD,MAAM,OAAO,GAAG,CAAC,+BAA+B,CAAC,CAAC;IAClD,OAAO,CAAC,IAAI,CAAC,yEAAyE,CAAC,CAAC;IACxF,OAAO,CAAC,IAAI,CAAC,2CAA2C,CAAC,CAAC;IAE1D,OAAO,CAAC,IAAI,CAAC,+DAA+D,CAAC,CAAC;IAE9E,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAC/B,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;IACvC,KAAK,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;IACzC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,eAAe;IACf,KAAK,CAAC,IAAI,CAAC,0DAA0D,CAAC,CAAC;IACvE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,UAAU;IACV,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,KAAK,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;QACxC,KAAK,CAAC,IAAI,CAAC,+DAA+D,CAAC,CAAC;QAC5E,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAChB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,UAAU;IACV,KAAK,CAAC,IAAI,CAAC,+CAA+C,CAAC,CAAC;IAC5D,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;IACvC,KAAK,CAAC,IAAI,CAAC,yDAAyD,CAAC,CAAC;IACtE,KAAK,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;IAC5C,KAAK,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAC;IAC9D,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACnB,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAChB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;IACvC,KAAK,CAAC,IAAI,CAAC,2GAA2G,CAAC,CAAC;IACxH,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;IAChC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACjB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,oBAAoB;IACpB,KAAK,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC;IAClD,KAAK,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;IACrC,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;IAChC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACjB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { ProjectConfig } from '../presets.js';
2
+ export declare function mainHonoTemplate(config: ProjectConfig): string;
3
+ //# sourceMappingURL=main-hono.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main-hono.d.ts","sourceRoot":"","sources":["../../src/templates/main-hono.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAEnD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CAmD9D"}
@@ -0,0 +1,47 @@
1
+ export function mainHonoTemplate(config) {
2
+ const imports = [
3
+ `import { Hono } from 'hono'`,
4
+ `import { serve } from '@hono/node-server'`,
5
+ `import { honoAdapter } from '@objectifthunes/sandstone-sdk/adapters'`,
6
+ `import { runMigrations } from '@objectifthunes/sandstone-sdk'`,
7
+ `import { app } from './infrastructure.js'`,
8
+ ];
9
+ const lines = [];
10
+ lines.push(imports.join('\n'));
11
+ lines.push('');
12
+ lines.push('const server = new Hono()');
13
+ lines.push('');
14
+ // Health check
15
+ lines.push(`server.get('/health', honoAdapter(app.healthHandler))`);
16
+ lines.push('');
17
+ // GraphQL
18
+ if (config.graphql) {
19
+ lines.push(`if (app.graphqlHandler) {`);
20
+ lines.push(` server.post('/graphql', honoAdapter(app.graphqlHandler))`);
21
+ lines.push(`}`);
22
+ lines.push('');
23
+ }
24
+ // Startup
25
+ lines.push(`const port = Number(process.env.PORT ?? 3000)`);
26
+ lines.push('');
27
+ lines.push(`async function start() {`);
28
+ lines.push(` await runMigrations(app.db, { includeBuiltIn: true })`);
29
+ lines.push(` serve({ fetch: server.fetch, port }, () => {`);
30
+ lines.push(` app.logger.info({ port }, 'Server started')`);
31
+ lines.push(` })`);
32
+ lines.push(`}`);
33
+ lines.push('');
34
+ lines.push(`start().catch((err) => {`);
35
+ lines.push(` app.logger.error('Failed to start server', { error: err instanceof Error ? err.message : String(err) })`);
36
+ lines.push(` process.exit(1)`);
37
+ lines.push(`})`);
38
+ lines.push('');
39
+ // Graceful shutdown
40
+ lines.push(`process.on('SIGTERM', async () => {`);
41
+ lines.push(` await app.shutdown()`);
42
+ lines.push(` process.exit(0)`);
43
+ lines.push(`})`);
44
+ lines.push('');
45
+ return lines.join('\n');
46
+ }
47
+ //# sourceMappingURL=main-hono.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main-hono.js","sourceRoot":"","sources":["../../src/templates/main-hono.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,gBAAgB,CAAC,MAAqB;IACpD,MAAM,OAAO,GAAG;QACd,6BAA6B;QAC7B,2CAA2C;QAC3C,sEAAsE;QACtE,+DAA+D;QAC/D,2CAA2C;KAC5C,CAAC;IAEF,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAC/B,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;IACxC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,eAAe;IACf,KAAK,CAAC,IAAI,CAAC,uDAAuD,CAAC,CAAC;IACpE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,UAAU;IACV,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,KAAK,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;QACxC,KAAK,CAAC,IAAI,CAAC,4DAA4D,CAAC,CAAC;QACzE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAChB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,UAAU;IACV,KAAK,CAAC,IAAI,CAAC,+CAA+C,CAAC,CAAC;IAC5D,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;IACvC,KAAK,CAAC,IAAI,CAAC,yDAAyD,CAAC,CAAC;IACtE,KAAK,CAAC,IAAI,CAAC,gDAAgD,CAAC,CAAC;IAC7D,KAAK,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAC;IAC9D,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACnB,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAChB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;IACvC,KAAK,CAAC,IAAI,CAAC,2GAA2G,CAAC,CAAC;IACxH,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;IAChC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACjB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,oBAAoB;IACpB,KAAK,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC;IAClD,KAAK,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;IACrC,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;IAChC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACjB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function migrateScriptTemplate(): string;
2
+ //# sourceMappingURL=migrate-script.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrate-script.d.ts","sourceRoot":"","sources":["../../src/templates/migrate-script.ts"],"names":[],"mappings":"AAAA,wBAAgB,qBAAqB,IAAI,MAAM,CAgB9C"}
@@ -0,0 +1,18 @@
1
+ export function migrateScriptTemplate() {
2
+ return `import { runMigrations } from '@objectifthunes/sandstone-sdk'
3
+ import { app } from '../src/infrastructure.js'
4
+
5
+ async function migrate() {
6
+ app.logger.info('Running migrations...')
7
+ await runMigrations(app.db, { includeBuiltIn: true, directory: './migrations' })
8
+ app.logger.info('Migrations complete')
9
+ await app.shutdown()
10
+ }
11
+
12
+ migrate().catch((err) => {
13
+ console.error('Migration failed:', err)
14
+ process.exit(1)
15
+ })
16
+ `;
17
+ }
18
+ //# sourceMappingURL=migrate-script.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrate-script.js","sourceRoot":"","sources":["../../src/templates/migrate-script.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,qBAAqB;IACnC,OAAO;;;;;;;;;;;;;;CAcR,CAAC;AACF,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function migrationTemplate(): string;
2
+ //# sourceMappingURL=migration.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migration.d.ts","sourceRoot":"","sources":["../../src/templates/migration.ts"],"names":[],"mappings":"AAAA,wBAAgB,iBAAiB,IAAI,MAAM,CAe1C"}
@@ -0,0 +1,17 @@
1
+ export function migrationTemplate() {
2
+ return `-- Sample entity: notes
3
+ -- Modify this migration to match your schema
4
+
5
+ CREATE TABLE IF NOT EXISTS notes (
6
+ id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
7
+ title VARCHAR(255) NOT NULL,
8
+ content TEXT,
9
+ user_id UUID REFERENCES users(id) ON DELETE CASCADE,
10
+ created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
11
+ updated_at TIMESTAMPTZ NOT NULL DEFAULT now()
12
+ );
13
+
14
+ CREATE INDEX IF NOT EXISTS idx_notes_user_id ON notes(user_id);
15
+ `;
16
+ }
17
+ //# sourceMappingURL=migration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migration.js","sourceRoot":"","sources":["../../src/templates/migration.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,iBAAiB;IAC/B,OAAO;;;;;;;;;;;;;CAaR,CAAC;AACF,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { ProjectConfig } from '../presets.js';
2
+ export declare function packageJsonTemplate(config: ProjectConfig): string;
3
+ //# sourceMappingURL=package-json.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package-json.d.ts","sourceRoot":"","sources":["../../src/templates/package-json.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAEnD,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CA2FjE"}
@@ -0,0 +1,85 @@
1
+ export function packageJsonTemplate(config) {
2
+ const deps = {
3
+ '@objectifthunes/sandstone-sdk': '^0.5.0',
4
+ };
5
+ const devDeps = {
6
+ '@types/node': '^22.0.0',
7
+ tsx: '^4.19.0',
8
+ typescript: '^5.7.0',
9
+ };
10
+ // Database
11
+ deps['pg'] = '^8.13.0';
12
+ devDeps['@types/pg'] = '^8.0.0';
13
+ // Logger
14
+ deps['pino'] = '^9.6.0';
15
+ devDeps['pino-pretty'] = '^13.0.0';
16
+ // Tokens
17
+ deps['jose'] = '^5.9.0';
18
+ // Framework
19
+ if (config.framework === 'express') {
20
+ deps['express'] = '^5.0.0';
21
+ devDeps['@types/express'] = '^5.0.0';
22
+ }
23
+ else if (config.framework === 'hono') {
24
+ deps['hono'] = '^4.6.0';
25
+ deps['@hono/node-server'] = '^1.13.0';
26
+ }
27
+ // Email
28
+ if (config.email === 'resend') {
29
+ deps['resend'] = '^4.1.0';
30
+ }
31
+ else if (config.email === 'nodemailer') {
32
+ deps['nodemailer'] = '^6.9.0';
33
+ devDeps['@types/nodemailer'] = '^6.0.0';
34
+ }
35
+ // Auth — password hashing
36
+ if (config.auth === 'password+otp' || config.auth === 'all') {
37
+ deps['argon2'] = '^0.41.0';
38
+ }
39
+ // Payments
40
+ if (config.payments === 'stripe') {
41
+ deps['stripe'] = '^17.5.0';
42
+ }
43
+ // paddle, lemonsqueezy, revenuecat use fetch — no extra deps
44
+ // Storage
45
+ if (config.storage === 's3' || config.storage === 'r2') {
46
+ deps['@aws-sdk/client-s3'] = '^3.700.0';
47
+ deps['@aws-sdk/s3-request-presigner'] = '^3.700.0';
48
+ }
49
+ // Cache
50
+ if (config.cache === 'upstash') {
51
+ deps['@upstash/redis'] = '^1.34.0';
52
+ }
53
+ // GraphQL
54
+ if (config.graphql) {
55
+ deps['graphql'] = '^16.9.0';
56
+ }
57
+ // Testing
58
+ if (config.tests) {
59
+ devDeps['vitest'] = '^3.0.0';
60
+ }
61
+ const pkg = {
62
+ name: config.name,
63
+ version: '0.1.0',
64
+ private: true,
65
+ type: 'module',
66
+ scripts: {
67
+ build: 'tsc',
68
+ dev: 'node --watch --import tsx src/main.ts',
69
+ start: 'node dist/main.js',
70
+ lint: 'tsc --noEmit',
71
+ ...(config.tests ? { test: 'vitest run', 'test:watch': 'vitest' } : {}),
72
+ ...(config.e2e
73
+ ? { 'test:e2e': 'vitest run --config vitest.e2e.config.ts' }
74
+ : {}),
75
+ 'db:migrate': 'node --import tsx scripts/migrate.ts',
76
+ },
77
+ dependencies: sortKeys(deps),
78
+ devDependencies: sortKeys(devDeps),
79
+ };
80
+ return JSON.stringify(pkg, null, 2) + '\n';
81
+ }
82
+ function sortKeys(obj) {
83
+ return Object.fromEntries(Object.entries(obj).sort(([a], [b]) => a.localeCompare(b)));
84
+ }
85
+ //# sourceMappingURL=package-json.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package-json.js","sourceRoot":"","sources":["../../src/templates/package-json.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { ProjectConfig } from '../presets.js';
2
+ export declare function schemaTemplate(config: ProjectConfig): string;
3
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/templates/schema.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAEnD,wBAAgB,cAAc,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CAoH5D"}