fragment-ts 1.0.6 → 1.0.8

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.
@@ -57,19 +57,75 @@ class TypeORMModule {
57
57
  const dbType = merged.type ?? "sqlite";
58
58
  switch (dbType) {
59
59
  case "sqlite":
60
- case "better-sqlite3":
61
60
  return this.buildSqliteConfig(merged);
61
+ case "better-sqlite3":
62
+ return this.buildBetterSqlite3Config(merged);
62
63
  case "mysql":
63
64
  case "mariadb":
64
65
  return this.buildMysqlConfig(merged);
65
66
  case "postgres":
66
67
  return this.buildPostgresConfig(merged);
68
+ case "cockroachdb":
69
+ return this.buildCockroachConfig(merged);
70
+ case "mssql":
71
+ return this.buildSqlServerConfig(merged);
72
+ case "sap":
73
+ return this.buildSapConfig(merged);
74
+ case "oracle":
75
+ return this.buildOracleConfig(merged);
76
+ case "mongodb":
77
+ return this.buildMongoConfig(merged);
78
+ case "aurora-mysql":
79
+ return this.buildAuroraMysqlConfig(merged);
80
+ case "aurora-postgres":
81
+ return this.buildAuroraPostgresConfig(merged);
82
+ case "cordova":
83
+ return this.buildCordovaConfig(merged);
84
+ case "nativescript":
85
+ return this.buildNativescriptConfig(merged);
86
+ case "react-native":
87
+ return this.buildReactNativeConfig(merged);
88
+ case "sqljs":
89
+ return this.buildSqljsConfig(merged);
90
+ case "expo":
91
+ return this.buildExpoConfig(merged);
92
+ case "capacitor":
93
+ return this.buildCapacitorConfig(merged);
94
+ case "spanner":
95
+ return this.buildSpannerConfig(merged);
67
96
  default:
68
97
  throw new Error(`Unsupported database type: ${String(dbType)}`);
69
98
  }
70
99
  }
71
100
  /* ======================================================
72
- * Builders
101
+ * Environment Variable Interpolation
102
+ * ====================================================== */
103
+ static interpolateEnvVars(value) {
104
+ if (typeof value === "string") {
105
+ // Match ${VAR_NAME} or {VAR_NAME}
106
+ return value.replace(/\$?\{([^}]+)\}/g, (match, varName) => {
107
+ const envValue = process.env[varName];
108
+ if (envValue === undefined) {
109
+ console.warn(`Warning: Environment variable ${varName} is not defined, using empty string`);
110
+ return "";
111
+ }
112
+ return envValue;
113
+ });
114
+ }
115
+ if (Array.isArray(value)) {
116
+ return value.map((item) => this.interpolateEnvVars(item));
117
+ }
118
+ if (value !== null && typeof value === "object") {
119
+ const result = {};
120
+ for (const key in value) {
121
+ result[key] = this.interpolateEnvVars(value[key]);
122
+ }
123
+ return result;
124
+ }
125
+ return value;
126
+ }
127
+ /* ======================================================
128
+ * Builders - SQL Databases
73
129
  * ====================================================== */
74
130
  static buildSqliteConfig(config) {
75
131
  return {
@@ -83,6 +139,18 @@ class TypeORMModule {
83
139
  ...config,
84
140
  };
85
141
  }
142
+ static buildBetterSqlite3Config(config) {
143
+ return {
144
+ type: "better-sqlite3",
145
+ database: config.database ?? "database.sqlite",
146
+ synchronize: false,
147
+ logging: false,
148
+ entities: config.entities ?? ["dist/**/*.entity.js"],
149
+ migrations: config.migrations ?? ["dist/migrations/**/*.js"],
150
+ subscribers: [],
151
+ ...config,
152
+ };
153
+ }
86
154
  static buildMysqlConfig(config) {
87
155
  return {
88
156
  type: config.type ?? "mysql",
@@ -113,6 +181,247 @@ class TypeORMModule {
113
181
  ...config,
114
182
  };
115
183
  }
184
+ static buildCockroachConfig(config) {
185
+ return {
186
+ type: "cockroachdb",
187
+ host: config.host ?? "localhost",
188
+ port: config.port ?? 26257,
189
+ username: config.username ?? "root",
190
+ password: config.password ?? "",
191
+ database: config.database ?? "defaultdb",
192
+ synchronize: false,
193
+ logging: false,
194
+ entities: config.entities ?? ["dist/**/*.entity.js"],
195
+ migrations: config.migrations ?? ["dist/migrations/**/*.js"],
196
+ timeTravelQueries: config.timeTravelQueries ?? false,
197
+ ...config,
198
+ };
199
+ }
200
+ static buildSqlServerConfig(config) {
201
+ return {
202
+ type: "mssql",
203
+ host: config.host ?? "localhost",
204
+ port: config.port ?? 1433,
205
+ username: config.username ?? "sa",
206
+ password: config.password ?? "",
207
+ database: config.database ?? "master",
208
+ synchronize: false,
209
+ logging: false,
210
+ entities: config.entities ?? ["dist/**/*.entity.js"],
211
+ migrations: config.migrations ?? ["dist/migrations/**/*.js"],
212
+ options: config.options,
213
+ ...config,
214
+ };
215
+ }
216
+ static buildOracleConfig(config) {
217
+ return {
218
+ type: "oracle",
219
+ host: config.host ?? "localhost",
220
+ port: config.port ?? 1521,
221
+ username: config.username ?? "system",
222
+ password: config.password ?? "",
223
+ sid: config.sid ?? "xe",
224
+ synchronize: false,
225
+ logging: false,
226
+ entities: config.entities ?? ["dist/**/*.entity.js"],
227
+ migrations: config.migrations ?? ["dist/migrations/**/*.js"],
228
+ ...config,
229
+ };
230
+ }
231
+ static buildSapConfig(config) {
232
+ return {
233
+ type: "sap",
234
+ host: config.host ?? "localhost",
235
+ port: config.port ?? 30015,
236
+ username: config.username ?? "SYSTEM",
237
+ password: config.password ?? "",
238
+ schema: config.schema,
239
+ synchronize: false,
240
+ logging: false,
241
+ entities: config.entities ?? ["dist/**/*.entity.js"],
242
+ migrations: config.migrations ?? ["dist/migrations/**/*.js"],
243
+ ...config,
244
+ };
245
+ }
246
+ /* ======================================================
247
+ * Builders - Cloud/Serverless Databases
248
+ * ====================================================== */
249
+ static buildAuroraMysqlConfig(config) {
250
+ if (!config.region) {
251
+ throw new Error("AuroraMysqlConnectionOptions: region is required");
252
+ }
253
+ if (!config.secretArn) {
254
+ throw new Error("AuroraMysqlConnectionOptions: secretArn is required");
255
+ }
256
+ if (!config.resourceArn) {
257
+ throw new Error("AuroraMysqlConnectionOptions: resourceArn is required");
258
+ }
259
+ return {
260
+ type: "aurora-mysql",
261
+ region: config.region,
262
+ secretArn: config.secretArn,
263
+ resourceArn: config.resourceArn,
264
+ database: config.database ?? "app",
265
+ host: config.host ?? "localhost",
266
+ port: config.port ?? 3306,
267
+ username: config.username ?? "root",
268
+ password: config.password ?? "",
269
+ synchronize: false,
270
+ logging: false,
271
+ entities: config.entities ?? ["dist/**/*.entity.js"],
272
+ migrations: config.migrations ?? ["dist/migrations/**/*.js"],
273
+ driver: config.driver,
274
+ serviceConfigOptions: config.serviceConfigOptions,
275
+ formatOptions: config.formatOptions,
276
+ legacySpatialSupport: config.legacySpatialSupport,
277
+ ssl: config.ssl,
278
+ };
279
+ }
280
+ static buildAuroraPostgresConfig(config) {
281
+ if (!config.region) {
282
+ throw new Error("AuroraPostgresConnectionOptions: region is required");
283
+ }
284
+ if (!config.secretArn) {
285
+ throw new Error("AuroraPostgresConnectionOptions: secretArn is required");
286
+ }
287
+ if (!config.resourceArn) {
288
+ throw new Error("AuroraPostgresConnectionOptions: resourceArn is required");
289
+ }
290
+ return {
291
+ type: "aurora-postgres",
292
+ region: config.region,
293
+ secretArn: config.secretArn,
294
+ resourceArn: config.resourceArn,
295
+ database: config.database ?? "app",
296
+ synchronize: false,
297
+ logging: false,
298
+ entities: config.entities ?? ["dist/**/*.entity.js"],
299
+ migrations: config.migrations ?? ["dist/migrations/**/*.js"],
300
+ driver: config.driver,
301
+ transformParameters: config.transformParameters,
302
+ poolErrorHandler: config.poolErrorHandler,
303
+ serviceConfigOptions: config.serviceConfigOptions,
304
+ formatOptions: config.formatOptions,
305
+ };
306
+ }
307
+ static buildSpannerConfig(config) {
308
+ return {
309
+ type: "spanner",
310
+ projectId: config.projectId ?? "",
311
+ instanceId: config.instanceId ?? "",
312
+ databaseId: config.databaseId ?? "",
313
+ synchronize: false,
314
+ logging: false,
315
+ entities: config.entities ?? ["dist/**/*.entity.js"],
316
+ migrations: config.migrations ?? ["dist/migrations/**/*.js"],
317
+ ...config,
318
+ };
319
+ }
320
+ /* ======================================================
321
+ * Builders - NoSQL Databases
322
+ * ====================================================== */
323
+ static buildMongoConfig(config) {
324
+ return {
325
+ type: "mongodb",
326
+ host: config.host ?? "localhost",
327
+ port: config.port ?? 27017,
328
+ database: config.database ?? "app",
329
+ synchronize: false,
330
+ logging: false,
331
+ entities: config.entities ?? ["dist/**/*.entity.js"],
332
+ ...config,
333
+ };
334
+ }
335
+ /* ======================================================
336
+ * Builders - Mobile/Embedded Databases
337
+ * ====================================================== */
338
+ static buildCordovaConfig(config) {
339
+ return {
340
+ type: "cordova",
341
+ database: config.database ?? "app.db",
342
+ location: config.location ?? "default",
343
+ synchronize: false,
344
+ logging: false,
345
+ entities: config.entities ?? ["dist/**/*.entity.js"],
346
+ migrations: config.migrations ?? ["dist/migrations/**/*.js"],
347
+ ...config,
348
+ };
349
+ }
350
+ static buildNativescriptConfig(config) {
351
+ if (!config.driver) {
352
+ throw new Error("NativescriptConnectionOptions: driver is required (e.g. require('nativescript-sqlite'))");
353
+ }
354
+ return {
355
+ type: "nativescript",
356
+ database: config.database ?? "app.db",
357
+ driver: config.driver,
358
+ readOnly: config.readOnly ?? false,
359
+ key: config.key,
360
+ multithreading: config.multithreading ?? false,
361
+ migrate: config.migrate ?? false,
362
+ iosFlags: config.iosFlags,
363
+ androidFlags: config.androidFlags,
364
+ synchronize: false,
365
+ logging: false,
366
+ entities: config.entities ?? ["dist/**/*.entity.js"],
367
+ migrations: config.migrations ?? ["dist/migrations/**/*.js"],
368
+ ...config, // optional fields only
369
+ };
370
+ }
371
+ static buildReactNativeConfig(config) {
372
+ return {
373
+ type: "react-native",
374
+ database: config.database ?? "app.db",
375
+ location: config.location ?? "default",
376
+ synchronize: false,
377
+ logging: false,
378
+ entities: config.entities ?? ["dist/**/*.entity.js"],
379
+ migrations: config.migrations ?? ["dist/migrations/**/*.js"],
380
+ ...config,
381
+ };
382
+ }
383
+ static buildSqljsConfig(config) {
384
+ return {
385
+ type: "sqljs",
386
+ autoSave: config.autoSave ?? true,
387
+ location: config.location ?? "browser",
388
+ synchronize: false,
389
+ logging: false,
390
+ entities: config.entities ?? ["dist/**/*.entity.js"],
391
+ migrations: config.migrations ?? ["dist/migrations/**/*.js"],
392
+ ...config,
393
+ };
394
+ }
395
+ static buildExpoConfig(config) {
396
+ if (!config.driver) {
397
+ throw new Error("ExpoConnectionOptions: driver is required (e.g. require('expo-sqlite'))");
398
+ }
399
+ return {
400
+ type: "expo",
401
+ database: config.database ?? "app.db",
402
+ driver: config.driver, // ✅ guaranteed
403
+ synchronize: false,
404
+ logging: false,
405
+ entities: config.entities ?? ["dist/**/*.entity.js"],
406
+ migrations: config.migrations ?? ["dist/migrations/**/*.js"],
407
+ ...config, // optional fields
408
+ };
409
+ }
410
+ static buildCapacitorConfig(config) {
411
+ if (!config.driver) {
412
+ throw new Error("CapacitorConnectionOptions: driver is required (e.g. new SQLiteConnection(CapacitorSQLite))");
413
+ }
414
+ return {
415
+ type: "capacitor",
416
+ database: config.database ?? "app.db",
417
+ driver: config.driver, // ✅ guaranteed
418
+ synchronize: false,
419
+ logging: false,
420
+ entities: config.entities ?? ["dist/**/*.entity.js"],
421
+ migrations: config.migrations ?? ["dist/migrations/**/*.js"],
422
+ ...config, // optional fields
423
+ };
424
+ }
116
425
  /* ======================================================
117
426
  * fragment.json loader
118
427
  * ====================================================== */
@@ -122,7 +431,9 @@ class TypeORMModule {
122
431
  return {};
123
432
  }
124
433
  const raw = JSON.parse(fs.readFileSync(configPath, "utf-8"));
125
- return raw.database ?? {};
434
+ const dbConfig = raw.database ?? {};
435
+ // Interpolate environment variables
436
+ return this.interpolateEnvVars(dbConfig);
126
437
  }
127
438
  /* ======================================================
128
439
  * Utilities
@@ -1 +1 @@
1
- {"version":3,"file":"typeorm-module.js","sourceRoot":"","sources":["../../src/typeorm/typeorm-module.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"typeorm-module.js","sourceRoot":"","sources":["../../src/typeorm/typeorm-module.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fragment-ts",
3
- "version": "1.0.6",
3
+ "version": "1.0.8",
4
4
  "description": "Spring Boot-style framework for TypeScript with Express and TypeORM",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -364,17 +364,35 @@ diagnose();
364
364
  const hasSource = fs.existsSync(path.join(cwd, "src"));
365
365
  const hasDist = fs.existsSync(path.join(cwd, "dist"));
366
366
 
367
- console.log(` Name: ${packageJson.name || "N/A"}`);
368
- console.log(` Version: ${packageJson.version || "N/A"}`);
369
- console.log(` Node: ${process.version}`);
370
- console.log(` Platform: ${process.platform}`);
367
+ console.log(` Name: ${packageJson.name || "N/A"}`);
368
+ console.log(` Version: ${packageJson.version || "N/A"}`);
369
+ console.log(` Node: ${process.version}`);
370
+ console.log(` Platform: ${process.platform}`);
371
371
  console.log(` Architecture: ${process.arch}`);
372
- console.log(` Environment: ${process.env.NODE_ENV || "development"}`);
373
- console.log(` Source: ${hasSource ? "✓ src/" : "✗ src/"}`);
374
- console.log(` Built: ${hasDist ? "✓ dist/" : "✗ dist/"}`);
372
+ console.log(` Environment: ${process.env.NODE_ENV || "development"}`);
373
+ console.log(` Source: ${hasSource ? "✓ src/" : "✗ src/"}`);
374
+ console.log(` Built: ${hasDist ? "✓ dist/" : "✗ dist/"}`);
375
375
  console.log("");
376
376
  }
377
377
 
378
+ private static interpolateEnvVars(value: any): any {
379
+ if (typeof value === "string") {
380
+ return value.replace(
381
+ /\$?\{([^}]+)\}/g,
382
+ (_, varName) => process.env[varName] ?? "",
383
+ );
384
+ }
385
+ if (Array.isArray(value))
386
+ return value.map((v) => this.interpolateEnvVars(v));
387
+ if (value && typeof value === "object") {
388
+ const result: any = {};
389
+ for (const key in value)
390
+ result[key] = this.interpolateEnvVars(value[key]);
391
+ return result;
392
+ }
393
+ return value;
394
+ }
395
+
378
396
  private static showConfig(): void {
379
397
  console.log(chalk.blue("\n⚙️ Configuration:\n"));
380
398
 
@@ -382,7 +400,8 @@ diagnose();
382
400
 
383
401
  if (fs.existsSync(configPath)) {
384
402
  try {
385
- const config = JSON.parse(fs.readFileSync(configPath, "utf-8"));
403
+ const configRaw = JSON.parse(fs.readFileSync(configPath, "utf-8"));
404
+ const config = this.interpolateEnvVars(configRaw);
386
405
  console.log(
387
406
  " " + JSON.stringify(config, null, 2).replace(/\n/g, "\n "),
388
407
  );
@@ -163,6 +163,10 @@ export class InitCommand {
163
163
  dev: "fragment serve",
164
164
  build: "fragment build",
165
165
  test: "fragment test",
166
+ "migrate:create": "fragment migrate:create",
167
+ "migrate:generate": "fragment migrate:generate",
168
+ "migrate:run": "fragment migrate:run",
169
+ "migrate:revert": "fragment migrate:revert",
166
170
  },
167
171
  dependencies: {
168
172
  fragment: "^1.0.0",
@@ -199,37 +203,38 @@ export class InitCommand {
199
203
  spaces: 2,
200
204
  });
201
205
 
202
- const fragmentConfig: any = {
203
- server: {
204
- port: 3000,
205
- host: "0.0.0.0",
206
- },
207
- };
206
+ const fragmentConfig: any = {};
208
207
 
209
208
  if (features.includes("database")) {
209
+ // Default SQLite config with env interpolation
210
210
  fragmentConfig.database = {
211
211
  type: "sqlite",
212
- database: "database.sqlite",
212
+ database: "${DATABASE_FILE}",
213
213
  synchronize: true,
214
214
  logging: false,
215
215
  entities: ["dist/**/*.entity.js"],
216
216
  migrations: ["dist/migrations/**/*.js"],
217
+ subscribers: [],
217
218
  };
218
219
  }
219
220
 
221
+ // Write fragment.json
220
222
  await fs.writeJSON(
221
223
  path.join(projectPath, "fragment.json"),
222
224
  fragmentConfig,
223
225
  { spaces: 2 },
224
226
  );
225
227
 
228
+ // .env file with defaults
226
229
  const envContent = `NODE_ENV=development
227
- PORT=3000
228
- JWT_SECRET=your-secret-key-change-this
229
- ${features.includes("database") ? "DATABASE_URL=sqlite:database.sqlite" : ""}
230
- `;
230
+ PORT=3000
231
+ JWT_SECRET=${process.env.JWT_SECRET ?? "your-secret-key-change-this"}
232
+ ${features.includes("database") ? "DATABASE_FILE=database.sqlite" : ""}
233
+ `;
231
234
 
232
235
  await fs.writeFile(path.join(projectPath, ".env"), envContent);
236
+
237
+ // .gitignore
233
238
  await fs.writeFile(
234
239
  path.join(projectPath, ".gitignore"),
235
240
  "node_modules/\ndist/\n.env\n*.sqlite\n",