@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,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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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"}
|