create-apiagex 0.6.4 → 0.8.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/README.md CHANGED
@@ -15,7 +15,7 @@ Current CLI behavior:
15
15
  - Supports `--dry-run` to show the scaffold plan without writing files.
16
16
  - Creates a small starter scaffold when the target folder is missing or empty.
17
17
 
18
- Interactive setup asks for setup mode, SQLite database path, host, port, package manager, dependency install preference, git init preference, and optional first owner bootstrap credentials. Postgres and MySQL are planned providers, but SQLite is the supported provider today.
18
+ Interactive setup asks for setup mode, database provider, SQLite database path or PostgreSQL/MySQL database URL, host, port, package manager, dependency install preference, git init preference, and optional first owner bootstrap credentials.
19
19
 
20
20
  Generated starter files:
21
21
 
@@ -28,7 +28,7 @@ Generated starter files:
28
28
  - `README.md`
29
29
  - `docs/README.md`
30
30
 
31
- The generated `.env` stores local setup values such as `APIAGEX_DATABASE_PROVIDER`, `APIAGEX_DATABASE_PATH`, `APIAGEX_UPLOADS_PATH`, `APIAGEX_SECRET`, `HOST`, and `PORT`. If owner bootstrap is enabled, `.env` also contains `APIAGEX_OWNER_EMAIL` and `APIAGEX_OWNER_PASSWORD`; remove the password after the first successful start.
31
+ The generated `.env` stores local setup values such as `APIAGEX_DATABASE_PROVIDER`, `APIAGEX_DATABASE_PATH` for SQLite or `APIAGEX_DATABASE_URL` for PostgreSQL/MySQL, `APIAGEX_UPLOADS_PATH`, `APIAGEX_SECRET`, `HOST`, and `PORT`. If owner bootstrap is enabled, `.env` also contains `APIAGEX_OWNER_EMAIL` and `APIAGEX_OWNER_PASSWORD`; remove the password after the first successful start.
32
32
 
33
33
  The generated `package.json` depends on `@apiagex/server` and exposes `npm run dev`, `npm run start`, `npm run smoke`, and `npm run build`.
34
34
 
@@ -80,7 +80,7 @@ Current CLI behavior:
80
80
  - `--dry-run` scaffold plan dikhata hai bina files likhe.
81
81
  - Target folder missing ya empty ho to small starter scaffold create hota hai.
82
82
 
83
- Interactive setup setup mode, SQLite database path, host, port, package manager, dependency install preference, git init preference, aur optional first owner bootstrap credentials puchta hai. Postgres aur MySQL planned providers hain, lekin aaj SQLite supported provider hai.
83
+ Interactive setup setup mode, database provider, SQLite database path ya PostgreSQL/MySQL database URL, host, port, package manager, dependency install preference, git init preference, aur optional first owner bootstrap credentials puchta hai.
84
84
 
85
85
  Generated starter files:
86
86
 
@@ -93,7 +93,7 @@ Generated starter files:
93
93
  - `README.md`
94
94
  - `docs/README.md`
95
95
 
96
- Generated `.env` local setup values store karta hai, jaise `APIAGEX_DATABASE_PROVIDER`, `APIAGEX_DATABASE_PATH`, `APIAGEX_UPLOADS_PATH`, `APIAGEX_SECRET`, `HOST`, aur `PORT`. Owner bootstrap enable ho to `.env` me `APIAGEX_OWNER_EMAIL` aur `APIAGEX_OWNER_PASSWORD` bhi hota hai; first successful start ke baad password hata do.
96
+ Generated `.env` local setup values store karta hai, jaise `APIAGEX_DATABASE_PROVIDER`, SQLite ke liye `APIAGEX_DATABASE_PATH` ya PostgreSQL/MySQL ke liye `APIAGEX_DATABASE_URL`, `APIAGEX_UPLOADS_PATH`, `APIAGEX_SECRET`, `HOST`, aur `PORT`. Owner bootstrap enable ho to `.env` me `APIAGEX_OWNER_EMAIL` aur `APIAGEX_OWNER_PASSWORD` bhi hota hai; first successful start ke baad password hata do.
97
97
 
98
98
  Generated `package.json` `@apiagex/server` par depend karta hai aur `npm run dev`, `npm run start`, `npm run smoke`, aur `npm run build` expose karta hai.
99
99
 
@@ -1 +1 @@
1
- {"version":3,"file":"args.d.ts","sourceRoot":"","sources":["../src/args.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAA+C,MAAM,0BAA0B,CAAC;AAExG,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,UAAU,GAAG,MAAM,CAiE7D;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAKtE"}
1
+ {"version":3,"file":"args.d.ts","sourceRoot":"","sources":["../src/args.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAA+C,MAAM,0BAA0B,CAAC;AAExG,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,UAAU,GAAG,MAAM,CAsE7D;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAKtE"}
package/dist/args.js CHANGED
@@ -25,7 +25,7 @@ export function parseArgs(args) {
25
25
  else if (arg === "--database") {
26
26
  const value = args[index + 1];
27
27
  if (!isDatabaseProvider(value))
28
- return "Use --database sqlite. Postgres and MySQL are planned but not available yet.";
28
+ return "Use --database sqlite, postgres, or mysql.";
29
29
  options.databaseProvider = value;
30
30
  index += 1;
31
31
  }
@@ -36,6 +36,13 @@ export function parseArgs(args) {
36
36
  options.databasePath = value;
37
37
  index += 1;
38
38
  }
39
+ else if (arg === "--database-url") {
40
+ const value = args[index + 1];
41
+ if (!value)
42
+ return "Use --database-url with a PostgreSQL or MySQL connection URL.";
43
+ options.databaseUrl = value;
44
+ index += 1;
45
+ }
39
46
  else if (arg === "--host") {
40
47
  const value = args[index + 1];
41
48
  if (!value)
@@ -108,7 +115,7 @@ function isPackageManager(value) {
108
115
  return value === "npm" || value === "pnpm" || value === "yarn";
109
116
  }
110
117
  function isDatabaseProvider(value) {
111
- return value === "sqlite";
118
+ return value === "sqlite" || value === "postgres" || value === "mysql";
112
119
  }
113
120
  function isSetupMode(value) {
114
121
  return value === "quickstart" || value === "custom";
@@ -1,12 +1,13 @@
1
1
  import type { Readable, Writable } from "node:stream";
2
2
  export type PackageManager = "npm" | "pnpm" | "yarn";
3
3
  export type SetupMode = "custom" | "quickstart";
4
- export type DatabaseProvider = "sqlite";
4
+ export type DatabaseProvider = "sqlite" | "postgres" | "mysql";
5
5
  export type CliOptions = {
6
6
  appSecret?: string;
7
7
  bootstrapOwner?: boolean;
8
8
  databasePath?: string;
9
9
  databaseProvider?: DatabaseProvider;
10
+ databaseUrl?: string;
10
11
  dryRun: boolean;
11
12
  help: boolean;
12
13
  host?: string;
@@ -42,6 +43,7 @@ export type ScaffoldAnswers = {
42
43
  bootstrapOwner: boolean;
43
44
  databasePath: string;
44
45
  databaseProvider: DatabaseProvider;
46
+ databaseUrl?: string;
45
47
  host: string;
46
48
  initGit: boolean;
47
49
  installDependencies: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"create-apiagex.type.d.ts","sourceRoot":"","sources":["../src/create-apiagex.type.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEtD,MAAM,MAAM,cAAc,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,CAAC;AACrD,MAAM,MAAM,SAAS,GAAG,QAAQ,GAAG,YAAY,CAAC;AAChD,MAAM,MAAM,gBAAgB,GAAG,QAAQ,CAAC;AAExC,MAAM,MAAM,UAAU,GAAG;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,MAAM,EAAE,OAAO,CAAC;IAChB,IAAI,EAAE,OAAO,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;IACjB,GAAG,EAAE,OAAO,CAAC;CACd,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,QAAQ,GAAG,CAAC,QAAQ,EAAE,cAAc,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;AAErE,MAAM,MAAM,aAAa,GAAG;IAC1B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,MAAM,CAAC,EAAE,QAAQ,CAAC;IAClB,KAAK,CAAC,EAAE,QAAQ,CAAC;IACjB,MAAM,CAAC,EAAE,QAAQ,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,OAAO,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,mBAAmB,EAAE,OAAO,CAAC;IAC7B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,cAAc,CAAC;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,SAAS,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;CACd,CAAC"}
1
+ {"version":3,"file":"create-apiagex.type.d.ts","sourceRoot":"","sources":["../src/create-apiagex.type.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEtD,MAAM,MAAM,cAAc,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,CAAC;AACrD,MAAM,MAAM,SAAS,GAAG,QAAQ,GAAG,YAAY,CAAC;AAChD,MAAM,MAAM,gBAAgB,GAAG,QAAQ,GAAG,UAAU,GAAG,OAAO,CAAC;AAE/D,MAAM,MAAM,UAAU,GAAG;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,OAAO,CAAC;IAChB,IAAI,EAAE,OAAO,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;IACjB,GAAG,EAAE,OAAO,CAAC;CACd,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,QAAQ,GAAG,CAAC,QAAQ,EAAE,cAAc,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;AAErE,MAAM,MAAM,aAAa,GAAG;IAC1B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,MAAM,CAAC,EAAE,QAAQ,CAAC;IAClB,KAAK,CAAC,EAAE,QAAQ,CAAC;IACjB,MAAM,CAAC,EAAE,QAAQ,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,OAAO,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,mBAAmB,EAAE,OAAO,CAAC;IAC7B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,cAAc,CAAC;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,SAAS,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;CACd,CAAC"}
package/dist/index.js CHANGED
@@ -7,7 +7,7 @@ import { fileURLToPath } from "node:url";
7
7
  import { parseArgs, validateProjectSlug } from "./args.js";
8
8
  import { resolveAnswers } from "./prompts.js";
9
9
  import { createScaffoldFiles, renderPlan } from "./scaffold.js";
10
- const packageVersion = "0.6.4";
10
+ const packageVersion = "0.8.0";
11
11
  export async function runCli(args, cwd = process.cwd(), io = {}) {
12
12
  const parsed = parseArgs(args);
13
13
  if (typeof parsed === "string")
@@ -53,8 +53,10 @@ Usage:
53
53
 
54
54
  Options:
55
55
  --setup quickstart|custom Choose starter setup mode.
56
- --database sqlite Choose database provider. Postgres and MySQL are planned.
56
+ --database sqlite|postgres|mysql
57
+ Choose database provider.
57
58
  --database-path <path> Set the SQLite database path.
59
+ --database-url <url> Set the PostgreSQL/MySQL connection URL.
58
60
  --host <host> Set the server host.
59
61
  --port <port> Set the server port.
60
62
  --app-secret <secret> Set APIAGEX_SECRET instead of generating one.
@@ -1 +1 @@
1
- {"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../src/prompts.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,UAAU,EAEV,aAAa,EACb,eAAe,EAChB,MAAM,0BAA0B,CAAC;AAElC,wBAAsB,cAAc,CAAC,OAAO,EAAE,UAAU,EAAE,EAAE,GAAE,aAAkB,GAAG,OAAO,CAAC,eAAe,GAAG,MAAM,CAAC,CAkCnH"}
1
+ {"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../src/prompts.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,UAAU,EAGV,aAAa,EACb,eAAe,EAChB,MAAM,0BAA0B,CAAC;AAElC,wBAAsB,cAAc,CAAC,OAAO,EAAE,UAAU,EAAE,EAAE,GAAE,aAAkB,GAAG,OAAO,CAAC,eAAe,GAAG,MAAM,CAAC,CA4CnH"}
package/dist/prompts.js CHANGED
@@ -7,8 +7,11 @@ export async function resolveAnswers(options, io = {}) {
7
7
  if (!target)
8
8
  return "Target folder is required. Run create-apiagex --help for usage.";
9
9
  const setupMode = options.setupMode ?? await choiceAnswer(prompt, canAsk, "Setup mode", "quickstart", ["quickstart", "custom"]);
10
- const databaseProvider = options.databaseProvider ?? "sqlite";
11
- const databasePath = options.databasePath ?? await setupAnswer(prompt, canAsk, setupMode, "SQLite database path", ".apiagex/apiagex.sqlite");
10
+ const databaseProvider = options.databaseProvider ?? await choiceAnswer(prompt, canAsk, "Database provider", "sqlite", ["sqlite", "postgres", "mysql"]);
11
+ const databasePath = databaseProvider === "sqlite"
12
+ ? options.databasePath ?? await setupAnswer(prompt, canAsk, setupMode, "SQLite database path", ".apiagex/apiagex.sqlite")
13
+ : ".apiagex/apiagex.sqlite";
14
+ const databaseUrl = await resolveDatabaseUrl(databaseProvider, options, prompt, canAsk);
12
15
  const host = options.host ?? await setupAnswer(prompt, canAsk, setupMode, "Server host", "127.0.0.1");
13
16
  const port = options.port ?? await setupAnswer(prompt, canAsk, setupMode, "Server port", "4000");
14
17
  const appSecret = options.appSecret ?? generateSecret();
@@ -25,6 +28,7 @@ export async function resolveAnswers(options, io = {}) {
25
28
  bootstrapOwner,
26
29
  databasePath,
27
30
  databaseProvider,
31
+ ...(databaseUrl === undefined ? {} : { databaseUrl }),
28
32
  host,
29
33
  initGit: await boolAnswer(prompt, canAsk, "Initialize git repository?", options.initGit, true),
30
34
  installDependencies: await boolAnswer(prompt, canAsk, "Install dependencies after scaffold?", options.installDependencies, false),
@@ -36,6 +40,27 @@ export async function resolveAnswers(options, io = {}) {
36
40
  target,
37
41
  };
38
42
  }
43
+ async function resolveDatabaseUrl(provider, options, prompt, canAsk) {
44
+ if (provider === "sqlite")
45
+ return undefined;
46
+ if (options.databaseUrl)
47
+ return options.databaseUrl;
48
+ if (!canAsk)
49
+ return providerDefaultUrl(provider);
50
+ return ask(prompt, `${providerLabel(provider)} database URL`, providerDefaultUrl(provider));
51
+ }
52
+ function providerDefaultUrl(provider) {
53
+ if (provider === "postgres")
54
+ return "postgres://apiagex:change-me@localhost:5432/apiagex";
55
+ return "mysql://apiagex:change-me@localhost:3306/apiagex";
56
+ }
57
+ function providerLabel(provider) {
58
+ if (provider === "postgres")
59
+ return "PostgreSQL";
60
+ if (provider === "mysql")
61
+ return "MySQL";
62
+ return "SQLite";
63
+ }
39
64
  async function boolAnswer(prompt, canAsk, message, value, defaultValue) {
40
65
  if (value !== undefined || !canAsk)
41
66
  return value ?? defaultValue;
package/dist/scaffold.js CHANGED
@@ -14,7 +14,7 @@ export function createScaffoldFiles(answers) {
14
14
  smoke: "apiagex smoke",
15
15
  },
16
16
  dependencies: {
17
- "@apiagex/server": "^0.6.4",
17
+ "@apiagex/server": "^0.8.0",
18
18
  },
19
19
  }, null, 2)}\n`,
20
20
  },
@@ -37,7 +37,7 @@ export function createScaffoldFiles(answers) {
37
37
  {
38
38
  path: "apiagex.config.json",
39
39
  content: `${JSON.stringify({
40
- database: { provider: answers.databaseProvider, path: answers.databasePath },
40
+ database: databaseConfig(answers),
41
41
  project: {
42
42
  appSecretEnv: "APIAGEX_SECRET",
43
43
  packageManager: answers.packageManager,
@@ -66,7 +66,7 @@ export function renderPlan(projectName, targetDir, files, answers, dryRun) {
66
66
  "Selected setup:",
67
67
  `- Setup mode: ${answers.setupMode}`,
68
68
  `- Database: ${answers.databaseProvider}`,
69
- `- SQLite path: ${answers.databasePath}`,
69
+ databasePlanLine(answers),
70
70
  `- Server: http://${answers.host}:${answers.port}`,
71
71
  `- Package manager: ${answers.packageManager}`,
72
72
  `- Install dependencies: ${answers.installDependencies ? "yes" : "no"}`,
@@ -115,8 +115,10 @@ If .env contains APIAGEX_OWNER_EMAIL and APIAGEX_OWNER_PASSWORD, the first owner
115
115
 
116
116
  The installer creates .env for local use. Copy .env.example to .env again if you need to reset local settings.
117
117
 
118
- - APIAGEX_DATABASE_PROVIDER: sqlite today. Postgres and MySQL are planned.
119
- - APIAGEX_DATABASE_PATH: SQLite database path. Default .apiagex/apiagex.sqlite.
118
+ - APIAGEX_DATABASE_PROVIDER: sqlite, postgres, or mysql.
119
+ ${answers.databaseProvider === "sqlite"
120
+ ? "- APIAGEX_DATABASE_PATH: SQLite database path. Default .apiagex/apiagex.sqlite."
121
+ : "- APIAGEX_DATABASE_URL: database connection URL for PostgreSQL or MySQL."}
120
122
  - APIAGEX_UPLOADS_PATH: upload folder. Default .apiagex/uploads.
121
123
  - APIAGEX_SECRET: app secret generated during setup.
122
124
  - PORT: server port. Default 4000.
@@ -190,7 +192,7 @@ Relation docs: /doc explains relation field types, entry payloads, populate quer
190
192
  function envFile(answers, includeSecrets) {
191
193
  const lines = [
192
194
  `APIAGEX_DATABASE_PROVIDER=${answers.databaseProvider}`,
193
- `APIAGEX_DATABASE_PATH=${answers.databasePath}`,
195
+ ...databaseEnvLines(answers),
194
196
  "APIAGEX_UPLOADS_PATH=.apiagex/uploads",
195
197
  `APIAGEX_SECRET=${includeSecrets ? answers.appSecret : "change-me"}`,
196
198
  `HOST=${answers.host}`,
@@ -204,6 +206,26 @@ function envFile(answers, includeSecrets) {
204
206
  }
205
207
  return `${lines.join("\n")}\n`;
206
208
  }
209
+ function databaseConfig(answers) {
210
+ if (answers.databaseProvider === "sqlite")
211
+ return { provider: "sqlite", path: answers.databasePath };
212
+ return { provider: answers.databaseProvider, urlEnv: "APIAGEX_DATABASE_URL" };
213
+ }
214
+ function databasePlanLine(answers) {
215
+ if (answers.databaseProvider === "sqlite")
216
+ return `- SQLite path: ${answers.databasePath}`;
217
+ return `- Database URL: ${answers.databaseUrl ?? defaultDatabaseUrl(answers.databaseProvider)}`;
218
+ }
219
+ function databaseEnvLines(answers) {
220
+ if (answers.databaseProvider === "sqlite")
221
+ return [`APIAGEX_DATABASE_PATH=${answers.databasePath}`];
222
+ return [`APIAGEX_DATABASE_URL=${answers.databaseUrl ?? defaultDatabaseUrl(answers.databaseProvider)}`];
223
+ }
224
+ function defaultDatabaseUrl(provider) {
225
+ if (provider === "postgres")
226
+ return "postgres://apiagex:change-me@localhost:5432/apiagex";
227
+ return "mysql://apiagex:change-me@localhost:3306/apiagex";
228
+ }
207
229
  function serverEntryFile() {
208
230
  return `import { startApiagex } from "@apiagex/server";
209
231
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "create-apiagex",
3
- "version": "0.6.4",
3
+ "version": "0.8.0",
4
4
  "description": "Installer CLI for creating Apiagex CMS projects.",
5
5
  "type": "module",
6
6
  "license": "MIT",