create-authhero 0.7.0 → 0.9.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 (28) hide show
  1. package/dist/cloudflare-multitenant/.dev.vars.example +20 -4
  2. package/dist/cloudflare-multitenant/README.md +238 -89
  3. package/dist/cloudflare-multitenant/drizzle.config.ts +8 -0
  4. package/dist/cloudflare-multitenant/migrations/0000_init.sql +782 -0
  5. package/dist/cloudflare-multitenant/migrations/meta/_journal.json +13 -0
  6. package/dist/cloudflare-multitenant/seed-helper.js +75 -0
  7. package/dist/cloudflare-multitenant/src/app.ts +3 -22
  8. package/dist/cloudflare-multitenant/src/db/schema.ts +845 -0
  9. package/dist/cloudflare-multitenant/src/index.ts +61 -55
  10. package/dist/cloudflare-multitenant/src/seed.ts +64 -0
  11. package/dist/cloudflare-multitenant/src/types.ts +17 -17
  12. package/dist/cloudflare-multitenant/wrangler.toml +40 -28
  13. package/dist/cloudflare-simple/.dev.vars.example +20 -0
  14. package/dist/cloudflare-simple/README.md +246 -10
  15. package/dist/cloudflare-simple/drizzle.config.ts +8 -0
  16. package/dist/cloudflare-simple/migrations/0000_init.sql +782 -0
  17. package/dist/cloudflare-simple/migrations/meta/0000_snapshot.json +5325 -0
  18. package/dist/cloudflare-simple/migrations/meta/_journal.json +13 -0
  19. package/dist/cloudflare-simple/seed-helper.js +75 -0
  20. package/dist/cloudflare-simple/src/app.ts +10 -0
  21. package/dist/cloudflare-simple/src/db/schema.ts +845 -0
  22. package/dist/cloudflare-simple/src/index.ts +64 -13
  23. package/dist/cloudflare-simple/src/seed.ts +64 -0
  24. package/dist/cloudflare-simple/src/types.ts +18 -0
  25. package/dist/cloudflare-simple/wrangler.toml +29 -0
  26. package/dist/create-authhero.js +199 -131
  27. package/package.json +1 -1
  28. package/dist/cloudflare-multitenant/src/database-factory.ts +0 -220
@@ -1,16 +1,16 @@
1
1
  #!/usr/bin/env node
2
- import { Command as b } from "commander";
3
- import d from "inquirer";
4
- import l from "fs";
5
- import c from "path";
6
- import { spawn as f } from "child_process";
7
- const w = new b(), r = {
2
+ import { Command as x } from "commander";
3
+ import c from "inquirer";
4
+ import i from "fs";
5
+ import f from "path";
6
+ import { spawn as b } from "child_process";
7
+ const D = new x(), n = {
8
8
  local: {
9
9
  name: "Local (SQLite)",
10
10
  description: "Local development setup with SQLite database - great for getting started",
11
11
  templateDir: "local",
12
- packageJson: (t) => ({
13
- name: t,
12
+ packageJson: (r) => ({
13
+ name: r,
14
14
  version: "1.0.0",
15
15
  type: "module",
16
16
  scripts: {
@@ -42,16 +42,22 @@ const w = new b(), r = {
42
42
  name: "Cloudflare Simple (Single Tenant)",
43
43
  description: "Single-tenant Cloudflare Workers setup with D1 database",
44
44
  templateDir: "cloudflare-simple",
45
- packageJson: (t) => ({
46
- name: t,
45
+ packageJson: (r) => ({
46
+ name: r,
47
47
  version: "1.0.0",
48
48
  type: "module",
49
49
  scripts: {
50
- dev: "wrangler dev",
50
+ "dev:local": "wrangler dev --port 3000 --local-protocol https",
51
+ "dev:remote": "wrangler dev --port 3000 --local-protocol https --remote",
52
+ dev: "wrangler dev --port 3000 --local-protocol https",
51
53
  deploy: "wrangler deploy",
52
- "db:migrate": "wrangler d1 migrations apply AUTH_DB --local",
53
- "db:migrate:prod": "wrangler d1 migrations apply AUTH_DB --remote",
54
- seed: "wrangler d1 execute AUTH_DB --local --file=seed.sql"
54
+ "db:migrate:local": "wrangler d1 migrations apply AUTH_DB --local",
55
+ "db:migrate:remote": "wrangler d1 migrations apply AUTH_DB --remote",
56
+ migrate: "wrangler d1 migrations apply AUTH_DB --local",
57
+ "db:generate": "drizzle-kit generate",
58
+ "seed:local": "node seed-helper.js",
59
+ "seed:remote": "node seed-helper.js '' '' remote",
60
+ seed: "node seed-helper.js"
55
61
  },
56
62
  dependencies: {
57
63
  "@authhero/kysely-adapter": "latest",
@@ -64,57 +70,63 @@ const w = new b(), r = {
64
70
  },
65
71
  devDependencies: {
66
72
  "@cloudflare/workers-types": "^4.0.0",
73
+ "drizzle-kit": "^0.31.0",
74
+ "drizzle-orm": "^0.44.0",
67
75
  typescript: "^5.5.0",
68
76
  wrangler: "^3.0.0"
69
77
  }
70
78
  }),
71
- seedFile: "seed.sql"
79
+ seedFile: "seed.ts"
72
80
  },
73
81
  "cloudflare-multitenant": {
74
82
  name: "Cloudflare Multi-Tenant (Production)",
75
- description: "Production-grade multi-tenant setup with per-tenant D1 databases and Analytics Engine",
83
+ description: "Production-grade multi-tenant setup with D1 database and tenant management",
76
84
  templateDir: "cloudflare-multitenant",
77
- packageJson: (t) => ({
78
- name: t,
85
+ packageJson: (r) => ({
86
+ name: r,
79
87
  version: "1.0.0",
80
88
  type: "module",
81
89
  scripts: {
82
- dev: "wrangler dev",
90
+ "dev:local": "wrangler dev --port 3000 --local-protocol https",
91
+ "dev:remote": "wrangler dev --port 3000 --local-protocol https --remote",
92
+ dev: "wrangler dev --port 3000 --local-protocol https",
83
93
  deploy: "wrangler deploy",
84
- "db:migrate": "wrangler d1 migrations apply MAIN_DB --local",
85
- "db:migrate:prod": "wrangler d1 migrations apply MAIN_DB --remote",
86
- seed: "wrangler d1 execute MAIN_DB --local --file=seed.sql"
94
+ "db:migrate:local": "wrangler d1 migrations apply AUTH_DB --local",
95
+ "db:migrate:remote": "wrangler d1 migrations apply AUTH_DB --remote",
96
+ migrate: "wrangler d1 migrations apply AUTH_DB --local",
97
+ "db:generate": "drizzle-kit generate",
98
+ "seed:local": "node seed-helper.js",
99
+ "seed:remote": "node seed-helper.js '' '' remote",
100
+ seed: "node seed-helper.js"
87
101
  },
88
102
  dependencies: {
89
- "@authhero/cloudflare-adapter": "latest",
90
103
  "@authhero/kysely-adapter": "latest",
91
- "@authhero/multi-tenancy": "latest",
92
104
  "@hono/swagger-ui": "^0.5.0",
93
- "@hono/zod-openapi": "^0.19.10",
105
+ "@hono/zod-openapi": "^0.19.0",
94
106
  authhero: "latest",
95
107
  hono: "^4.6.0",
96
108
  kysely: "latest",
97
- "kysely-d1": "latest",
98
- wretch: "^3.0.0"
109
+ "kysely-d1": "latest"
99
110
  },
100
111
  devDependencies: {
101
112
  "@cloudflare/workers-types": "^4.0.0",
113
+ "drizzle-kit": "^0.31.0",
114
+ "drizzle-orm": "^0.44.0",
102
115
  typescript: "^5.5.0",
103
116
  wrangler: "^3.0.0"
104
117
  }
105
118
  }),
106
- seedFile: "seed.sql"
119
+ seedFile: "seed.ts"
107
120
  }
108
121
  };
109
- function v(t, e) {
110
- l.readdirSync(t).forEach((s) => {
111
- const n = c.join(t, s), o = c.join(e, s);
112
- l.lstatSync(n).isDirectory() ? (l.mkdirSync(o, { recursive: !0 }), v(n, o)) : l.copyFileSync(n, o);
122
+ function A(r, a) {
123
+ i.readdirSync(r).forEach((o) => {
124
+ const t = f.join(r, o), e = f.join(a, o);
125
+ i.lstatSync(t).isDirectory() ? (i.mkdirSync(e, { recursive: !0 }), A(t, e)) : i.copyFileSync(t, e);
113
126
  });
114
127
  }
115
- function D(t) {
116
- if (t === "local")
117
- return `import { SqliteDialect, Kysely } from "kysely";
128
+ function $() {
129
+ return `import { SqliteDialect, Kysely } from "kysely";
118
130
  import Database from "better-sqlite3";
119
131
  import createAdapters from "@authhero/kysely-adapter";
120
132
  import { seed } from "authhero";
@@ -146,61 +158,45 @@ async function main() {
146
158
 
147
159
  main().catch(console.error);
148
160
  `;
149
- {
150
- const e = (/* @__PURE__ */ new Date()).toISOString(), a = "default";
151
- return `-- Seed file for AuthHero
152
- --
153
- -- IMPORTANT: This SQL file creates the basic structure but the password
154
- -- cannot be properly hashed in SQL. After running this seed, you should
155
- -- use the management API or run a script to set the admin password.
156
-
157
- -- Create default tenant
158
- INSERT OR IGNORE INTO tenants (id, friendly_name, audience, sender_email, sender_name, created_at, updated_at)
159
- VALUES ('${a}', 'Default Tenant', 'https://api.example.com', 'noreply@example.com', 'AuthHero', '${e}', '${e}');
160
-
161
- -- Create password connection
162
- INSERT OR IGNORE INTO connections (id, tenant_id, name, strategy, options, created_at, updated_at)
163
- VALUES ('conn_default', '${a}', 'Username-Password-Authentication', 'Username-Password-Authentication', '{}', '${e}', '${e}');
164
-
165
- -- Create default client
166
- INSERT OR IGNORE INTO clients (client_id, tenant_id, name, callbacks, allowed_origins, web_origins, connections, created_at, updated_at)
167
- VALUES ('default', '${a}', 'Default Application', '["https://manage.authhero.net/auth-callback","https://local.authhero.net/auth-callback"]', '[]', '[]', '["Username-Password-Authentication"]', '${e}', '${e}');
168
-
169
- -- Note: Admin user and password should be created via the management API
170
- -- or using a TypeScript seed script with proper bcrypt hashing.
171
- -- Example command: curl -X POST http://localhost:3000/api/v2/users ...
172
- `;
173
- }
174
161
  }
175
- function u(t, e) {
176
- return new Promise((a, s) => {
177
- const n = f(t, [], {
178
- cwd: e,
162
+ function v(r, a) {
163
+ return new Promise((s, o) => {
164
+ const t = b(r, [], {
165
+ cwd: a,
179
166
  shell: !0,
180
167
  stdio: "inherit"
181
168
  });
182
- n.on("close", (o) => {
183
- o === 0 ? a() : s(new Error(`Command failed with exit code ${o}`));
184
- }), n.on("error", s);
169
+ t.on("close", (e) => {
170
+ e === 0 ? s() : o(new Error(`Command failed with exit code ${e}`));
171
+ }), t.on("error", o);
185
172
  });
186
173
  }
187
- function k(t, e, a) {
188
- return new Promise((s, n) => {
189
- const o = f(t, [], {
190
- cwd: e,
174
+ function S(r, a, s) {
175
+ return new Promise((o, t) => {
176
+ const e = b(r, [], {
177
+ cwd: a,
191
178
  shell: !0,
192
179
  stdio: "inherit",
193
- env: { ...process.env, ...a }
180
+ env: { ...process.env, ...s }
194
181
  });
195
- o.on("close", (m) => {
196
- m === 0 ? s() : n(new Error(`Command failed with exit code ${m}`));
197
- }), o.on("error", n);
182
+ e.on("close", (g) => {
183
+ g === 0 ? o() : t(new Error(`Command failed with exit code ${g}`));
184
+ }), e.on("error", t);
198
185
  });
199
186
  }
200
- w.version("1.0.0").description("Create a new AuthHero project").argument("[project-name]", "name of the project").action(async (t) => {
187
+ D.version("1.0.0").description("Create a new AuthHero project").argument("[project-name]", "name of the project").option(
188
+ "-t, --template <type>",
189
+ "template type: local, cloudflare-simple, or cloudflare-multitenant"
190
+ ).option("-e, --email <email>", "admin email address").option("-p, --password <password>", "admin password (min 8 characters)").option(
191
+ "--package-manager <pm>",
192
+ "package manager to use: npm, yarn, pnpm, or bun"
193
+ ).option("--skip-install", "skip installing dependencies").option("--skip-migrate", "skip running database migrations").option("--skip-seed", "skip seeding the database").option("--skip-start", "skip starting the development server").option("--remote", "use remote mode for cloudflare-simple (production D1)").option("-y, --yes", "skip all prompts and use defaults/provided options").action(async (r, a) => {
194
+ const s = a.yes === !0;
201
195
  console.log(`
202
196
  🔐 Welcome to AuthHero!
203
- `), t || (t = (await d.prompt([
197
+ `);
198
+ let o = r;
199
+ o || (s ? (o = "auth-server", console.log(`Using default project name: ${o}`)) : o = (await c.prompt([
204
200
  {
205
201
  type: "input",
206
202
  name: "projectName",
@@ -209,60 +205,71 @@ w.version("1.0.0").description("Create a new AuthHero project").argument("[proje
209
205
  validate: (p) => p !== "" || "Project name cannot be empty"
210
206
  }
211
207
  ])).projectName);
212
- const e = c.join(process.cwd(), t);
213
- l.existsSync(e) && (console.error(`❌ Project "${t}" already exists.`), process.exit(1));
214
- const { setupType: a } = await d.prompt([
208
+ const t = f.join(process.cwd(), o);
209
+ i.existsSync(t) && (console.error(`❌ Project "${o}" already exists.`), process.exit(1));
210
+ let e;
211
+ a.template ? (["local", "cloudflare-simple", "cloudflare-multitenant"].includes(
212
+ a.template
213
+ ) || (console.error(`❌ Invalid template: ${a.template}`), console.error(
214
+ "Valid options: local, cloudflare-simple, cloudflare-multitenant"
215
+ ), process.exit(1)), e = a.template, console.log(`Using template: ${n[e].name}`)) : e = (await c.prompt([
215
216
  {
216
217
  type: "list",
217
218
  name: "setupType",
218
219
  message: "Select your setup type:",
219
220
  choices: [
220
221
  {
221
- name: `${r.local.name}
222
- ${r.local.description}`,
222
+ name: `${n.local.name}
223
+ ${n.local.description}`,
223
224
  value: "local",
224
- short: r.local.name
225
+ short: n.local.name
225
226
  },
226
227
  {
227
- name: `${r["cloudflare-simple"].name}
228
- ${r["cloudflare-simple"].description}`,
228
+ name: `${n["cloudflare-simple"].name}
229
+ ${n["cloudflare-simple"].description}`,
229
230
  value: "cloudflare-simple",
230
- short: r["cloudflare-simple"].name
231
+ short: n["cloudflare-simple"].name
231
232
  },
232
233
  {
233
- name: `${r["cloudflare-multitenant"].name}
234
- ${r["cloudflare-multitenant"].description}`,
234
+ name: `${n["cloudflare-multitenant"].name}
235
+ ${n["cloudflare-multitenant"].description}`,
235
236
  value: "cloudflare-multitenant",
236
- short: r["cloudflare-multitenant"].name
237
+ short: n["cloudflare-multitenant"].name
237
238
  }
238
239
  ]
239
240
  }
240
- ]), s = r[a];
241
- l.mkdirSync(e, { recursive: !0 }), l.writeFileSync(
242
- c.join(e, "package.json"),
243
- JSON.stringify(s.packageJson(t), null, 2)
241
+ ])).setupType;
242
+ const g = n[e];
243
+ i.mkdirSync(t, { recursive: !0 }), i.writeFileSync(
244
+ f.join(t, "package.json"),
245
+ JSON.stringify(g.packageJson(o), null, 2)
244
246
  );
245
- const n = c.join(
247
+ const k = f.join(
246
248
  import.meta.url.replace("file://", "").replace("/create-authhero.js", ""),
247
- s.templateDir
249
+ g.templateDir
248
250
  );
249
- l.existsSync(n) ? v(n, e) : (console.error(`❌ Template directory not found: ${n}`), process.exit(1));
250
- const o = D(a), m = a === "local" ? "src/seed.ts" : "seed.sql";
251
- l.writeFileSync(c.join(e, m), o), console.log(
251
+ if (i.existsSync(k) ? A(k, t) : (console.error(`❌ Template directory not found: ${k}`), process.exit(1)), e === "local") {
252
+ const l = $();
253
+ i.writeFileSync(f.join(t, "src/seed.ts"), l);
254
+ }
255
+ console.log(
252
256
  `
253
- ✅ Project "${t}" has been created with ${s.name} setup!
257
+ ✅ Project "${o}" has been created with ${g.name} setup!
254
258
  `
255
259
  );
256
- const { shouldInstall: h } = await d.prompt([
260
+ let h;
261
+ if (a.skipInstall ? h = !1 : s ? h = !0 : h = (await c.prompt([
257
262
  {
258
263
  type: "confirm",
259
264
  name: "shouldInstall",
260
265
  message: "Would you like to install dependencies now?",
261
266
  default: !0
262
267
  }
263
- ]);
264
- if (h) {
265
- const { packageManager: i } = await d.prompt([
268
+ ])).shouldInstall, h) {
269
+ let l;
270
+ a.packageManager ? (["npm", "yarn", "pnpm", "bun"].includes(a.packageManager) || (console.error(
271
+ `❌ Invalid package manager: ${a.packageManager}`
272
+ ), console.error("Valid options: npm, yarn, pnpm, bun"), process.exit(1)), l = a.packageManager) : s ? l = "npm" : l = (await c.prompt([
266
273
  {
267
274
  type: "list",
268
275
  name: "packageManager",
@@ -275,70 +282,131 @@ w.version("1.0.0").description("Create a new AuthHero project").argument("[proje
275
282
  ],
276
283
  default: "npm"
277
284
  }
278
- ]);
279
- console.log(`
280
- 📦 Installing dependencies with ${i}...
285
+ ])).packageManager, console.log(`
286
+ 📦 Installing dependencies with ${l}...
281
287
  `);
282
288
  try {
283
- const p = i === "pnpm" ? "pnpm install --ignore-workspace" : `${i} install`;
284
- if (await u(p, e), a === "local" && (console.log(`
289
+ const p = l === "pnpm" ? "pnpm install --ignore-workspace" : `${l} install`;
290
+ await v(p, t), e === "local" && (console.log(`
285
291
  🔧 Building native modules...
286
- `), await u("npm rebuild better-sqlite3", e)), console.log(`
292
+ `), await v("npm rebuild better-sqlite3", t)), console.log(`
287
293
  ✅ Dependencies installed successfully!
288
- `), a === "local") {
289
- const { shouldSetup: A } = await d.prompt([
294
+ `);
295
+ let w = a.remote ? "remote" : "local";
296
+ if (e === "local" || e === "cloudflare-simple" || e === "cloudflare-multitenant") {
297
+ (e === "cloudflare-simple" || e === "cloudflare-multitenant") && !s && !a.remote && (w = (await c.prompt([
298
+ {
299
+ type: "list",
300
+ name: "mode",
301
+ message: "Would you like to run in local mode or remote mode?",
302
+ choices: [
303
+ {
304
+ name: "Local (using local D1 database)",
305
+ value: "local",
306
+ short: "Local"
307
+ },
308
+ {
309
+ name: "Remote (using production D1 database)",
310
+ value: "remote",
311
+ short: "Remote"
312
+ }
313
+ ],
314
+ default: "local"
315
+ }
316
+ ])).mode);
317
+ let u;
318
+ if (a.skipMigrate && a.skipSeed ? u = !1 : s ? u = !a.skipMigrate || !a.skipSeed : u = (await c.prompt([
290
319
  {
291
320
  type: "confirm",
292
321
  name: "shouldSetup",
293
322
  message: "Would you like to run migrations and seed the database?",
294
323
  default: !0
295
324
  }
296
- ]);
297
- if (A) {
298
- const y = await d.prompt([
325
+ ])).shouldSetup, u) {
326
+ let d;
327
+ if (a.email && a.password ? (/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(a.email) || (console.error("❌ Invalid email address provided"), process.exit(1)), a.password.length < 8 && (console.error("❌ Password must be at least 8 characters"), process.exit(1)), d = {
328
+ username: a.email,
329
+ password: a.password
330
+ }, console.log(`Using admin email: ${a.email}`)) : d = await c.prompt([
299
331
  {
300
332
  type: "input",
301
333
  name: "username",
302
334
  message: "Admin email:",
303
335
  default: "admin@example.com",
304
- validate: (g) => /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(g) || "Please enter a valid email address"
336
+ validate: (m) => /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(m) || "Please enter a valid email address"
305
337
  },
306
338
  {
307
339
  type: "password",
308
340
  name: "password",
309
341
  message: "Admin password:",
310
342
  mask: "*",
311
- validate: (g) => g.length < 8 ? "Password must be at least 8 characters" : !0
343
+ validate: (m) => m.length < 8 ? "Password must be at least 8 characters" : !0
312
344
  }
313
- ]);
314
- console.log(`
345
+ ]), !a.skipMigrate) {
346
+ console.log(`
315
347
  🔄 Running migrations...
316
- `), await u(`${i} run migrate`, e), console.log(`
348
+ `);
349
+ const m = (e === "cloudflare-simple" || e === "cloudflare-multitenant") && w === "remote" ? `${l} run db:migrate:remote` : `${l} run migrate`;
350
+ await v(m, t);
351
+ }
352
+ if (!a.skipSeed)
353
+ if (console.log(`
317
354
  🌱 Seeding database...
318
- `), await k(`${i} run seed`, e, {
319
- ADMIN_EMAIL: y.username,
320
- ADMIN_PASSWORD: y.password
321
- });
355
+ `), e === "local")
356
+ await S(
357
+ `${l} run seed`,
358
+ t,
359
+ {
360
+ ADMIN_EMAIL: d.username,
361
+ ADMIN_PASSWORD: d.password
362
+ }
363
+ );
364
+ else {
365
+ const m = w === "remote" ? `${l} run seed:remote` : `${l} run seed:local`;
366
+ await S(m, t, {
367
+ ADMIN_EMAIL: d.username,
368
+ ADMIN_PASSWORD: d.password
369
+ });
370
+ }
322
371
  }
323
372
  }
324
- const { shouldStart: S } = await d.prompt([
373
+ let y;
374
+ if (a.skipStart || s ? y = !1 : y = (await c.prompt([
325
375
  {
326
376
  type: "confirm",
327
377
  name: "shouldStart",
328
378
  message: "Would you like to start the development server?",
329
379
  default: !0
330
380
  }
331
- ]);
332
- S && (console.log(`
333
- 🚀 Starting development server...
334
- `), await u(`${i} run dev`, e));
381
+ ])).shouldStart, y) {
382
+ console.log(
383
+ `
384
+ 🚀 Starting development server on https://localhost:3000 ...
385
+ `
386
+ );
387
+ const u = (e === "cloudflare-simple" || e === "cloudflare-multitenant") && w === "remote" ? `${l} run dev:remote` : `${l} run dev`;
388
+ await v(u, t);
389
+ }
390
+ s && !y && (console.log(`
391
+ ✅ Setup complete!`), console.log(`
392
+ To start the development server:`), console.log(` cd ${o}`), console.log((e === "cloudflare-simple" || e === "cloudflare-multitenant") && w === "remote" ? " npm run dev:remote" : " npm run dev"), (e === "cloudflare-simple" || e === "cloudflare-multitenant") && console.log(
393
+ `
394
+ Server will be available at: https://localhost:3000`
395
+ ));
335
396
  } catch (p) {
336
397
  console.error(`
337
- ❌ An error occurred:`, p);
398
+ ❌ An error occurred:`, p), process.exit(1);
338
399
  }
339
400
  }
340
- h || (console.log("Next steps:"), console.log(` cd ${t}`), a === "local" ? (console.log(" npm install"), console.log(" npm run migrate"), console.log(" npm run seed -- <email> <password>"), console.log(" npm run dev")) : (console.log(" npm install"), console.log(" npm run db:migrate"), console.log(" npm run seed"), console.log(" npm run dev")), console.log(`
401
+ h || (console.log("Next steps:"), console.log(` cd ${o}`), e === "local" ? (console.log(" npm install"), console.log(" npm run migrate"), console.log(
402
+ " ADMIN_EMAIL=admin@example.com ADMIN_PASSWORD=yourpassword npm run seed"
403
+ ), console.log(" npm run dev")) : (e === "cloudflare-simple" || e === "cloudflare-multitenant") && (console.log(" npm install"), console.log(
404
+ " npm run migrate # or npm run db:migrate:remote for production"
405
+ ), console.log(
406
+ " ADMIN_EMAIL=admin@example.com ADMIN_PASSWORD=yourpassword npm run seed"
407
+ ), console.log(" npm run dev # or npm run dev:remote for production"), console.log(`
408
+ Server will be available at: https://localhost:3000`)), console.log(`
341
409
  For more information, visit: https://authhero.net/docs
342
410
  `));
343
411
  });
344
- w.parse(process.argv);
412
+ D.parse(process.argv);
package/package.json CHANGED
@@ -5,7 +5,7 @@
5
5
  "type": "git",
6
6
  "url": "https://github.com/markusahlstrand/authhero"
7
7
  },
8
- "version": "0.7.0",
8
+ "version": "0.9.0",
9
9
  "type": "module",
10
10
  "main": "dist/create-authhero.js",
11
11
  "bin": {