betterstart-cli 0.0.54 → 0.0.55
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/cli.js +63 -71
- package/dist/cli.js.map +1 -1
- package/package.json +1 -1
package/dist/cli.js
CHANGED
|
@@ -22232,18 +22232,11 @@ async function promptPresets(cwd, options = {}) {
|
|
|
22232
22232
|
|
|
22233
22233
|
// adapters/next/init/prompts/project.ts
|
|
22234
22234
|
import * as p13 from "@clack/prompts";
|
|
22235
|
-
import pc2 from "picocolors";
|
|
22236
22235
|
async function promptProject(defaultName) {
|
|
22237
22236
|
const projectName = await p13.text({
|
|
22238
|
-
message:
|
|
22239
|
-
|
|
22240
|
-
|
|
22241
|
-
pc2.cyan(".")
|
|
22242
|
-
)}${pc2.dim("` and hit enter.")}`,
|
|
22243
|
-
pc2.cyan("\u2502")
|
|
22244
|
-
].join("\n"),
|
|
22245
|
-
placeholder: defaultName ?? "my-app",
|
|
22246
|
-
defaultValue: defaultName ?? "my-app",
|
|
22237
|
+
message: "Enter the project name",
|
|
22238
|
+
placeholder: defaultName ?? "(Leave blank to skip directory creation)",
|
|
22239
|
+
defaultValue: defaultName ?? ".",
|
|
22247
22240
|
validate: (value) => {
|
|
22248
22241
|
if (!value?.trim()) return "Project name is required";
|
|
22249
22242
|
if (value.trim() === ".") return void 0;
|
|
@@ -24101,11 +24094,11 @@ function scaffoldTsconfig(cwd, config) {
|
|
|
24101
24094
|
|
|
24102
24095
|
// adapters/next/init/vercel/flow.ts
|
|
24103
24096
|
import * as p17 from "@clack/prompts";
|
|
24104
|
-
import
|
|
24097
|
+
import pc5 from "picocolors";
|
|
24105
24098
|
|
|
24106
24099
|
// adapters/next/init/vercel/auth.ts
|
|
24107
24100
|
import * as p14 from "@clack/prompts";
|
|
24108
|
-
import
|
|
24101
|
+
import pc2 from "picocolors";
|
|
24109
24102
|
|
|
24110
24103
|
// adapters/next/init/vercel/runner.ts
|
|
24111
24104
|
import { spawn as spawn3 } from "child_process";
|
|
@@ -24330,7 +24323,7 @@ async function ensureVercelAuth(runner, cwd, options) {
|
|
|
24330
24323
|
return { authed: false, reason: "login-failed" };
|
|
24331
24324
|
}
|
|
24332
24325
|
checkSpinner.clear();
|
|
24333
|
-
const signInMessage = `Sign in to Vercel to continue ${
|
|
24326
|
+
const signInMessage = `Sign in to Vercel to continue ${pc2.dim("(or press Ctrl-C to enter a connection string manually)")}`;
|
|
24334
24327
|
const signInRows = clackLogRows(signInMessage);
|
|
24335
24328
|
p14.log.info(signInMessage);
|
|
24336
24329
|
let streamedRows = 0;
|
|
@@ -24360,12 +24353,12 @@ async function ensureVercelAuth(runner, cwd, options) {
|
|
|
24360
24353
|
return { authed: false, reason: "login-failed" };
|
|
24361
24354
|
}
|
|
24362
24355
|
function signedInMessage(username) {
|
|
24363
|
-
return username ? `Signed in to Vercel as ${
|
|
24356
|
+
return username ? `Signed in to Vercel as ${pc2.cyan(username)}` : "Signed in to Vercel";
|
|
24364
24357
|
}
|
|
24365
24358
|
|
|
24366
24359
|
// adapters/next/init/vercel/blob.ts
|
|
24367
24360
|
import * as p15 from "@clack/prompts";
|
|
24368
|
-
import
|
|
24361
|
+
import pc3 from "picocolors";
|
|
24369
24362
|
|
|
24370
24363
|
// adapters/next/init/vercel/env-pull.ts
|
|
24371
24364
|
import fs34 from "fs";
|
|
@@ -24568,7 +24561,7 @@ async function provisionBlobStoreInteractive(runner, cwd, options) {
|
|
|
24568
24561
|
terminalFallbackRan = true;
|
|
24569
24562
|
quietSpinner.clear();
|
|
24570
24563
|
p15.log.info(
|
|
24571
|
-
`Create your Blob store in the Vercel prompts below ${
|
|
24564
|
+
`Create your Blob store in the Vercel prompts below ${pc3.dim(
|
|
24572
24565
|
"(connect it to all environments)."
|
|
24573
24566
|
)}`
|
|
24574
24567
|
);
|
|
@@ -24865,7 +24858,7 @@ function guardEnvLocal(cwd) {
|
|
|
24865
24858
|
|
|
24866
24859
|
// adapters/next/init/vercel/neon.ts
|
|
24867
24860
|
import * as p16 from "@clack/prompts";
|
|
24868
|
-
import
|
|
24861
|
+
import pc4 from "picocolors";
|
|
24869
24862
|
var PROVISION_TIMEOUT_MS2 = 18e4;
|
|
24870
24863
|
var INTERACTIVE_PROVISION_TIMEOUT_MS2 = 6e5;
|
|
24871
24864
|
async function provisionNeonInteractive(runner, cwd, options) {
|
|
@@ -24883,7 +24876,7 @@ async function provisionNeonInteractive(runner, cwd, options) {
|
|
|
24883
24876
|
}
|
|
24884
24877
|
quietSpinner.clear();
|
|
24885
24878
|
p16.log.info(
|
|
24886
|
-
`Create your Neon database in the Vercel prompts below ${
|
|
24879
|
+
`Create your Neon database in the Vercel prompts below ${pc4.dim(
|
|
24887
24880
|
"(the Free plan is recommended)."
|
|
24888
24881
|
)}`
|
|
24889
24882
|
);
|
|
@@ -24963,7 +24956,7 @@ async function runVercelNeonFlow(options) {
|
|
|
24963
24956
|
const neon = await provisionNeonForMode(runner, options);
|
|
24964
24957
|
if (neon.failure) {
|
|
24965
24958
|
p17.log.warn(neonFailureMessage(neon.failure));
|
|
24966
|
-
if (neon.detail) p17.log.message(
|
|
24959
|
+
if (neon.detail) p17.log.message(pc5.dim(neon.detail));
|
|
24967
24960
|
return { ok: false };
|
|
24968
24961
|
}
|
|
24969
24962
|
const databaseUrl = await pullNeonDatabaseUrl(runner, options.cwd, env);
|
|
@@ -25001,7 +24994,7 @@ async function runVercelBlobFlow(options) {
|
|
|
25001
24994
|
const blob = await provisionBlobForMode(runner, options);
|
|
25002
24995
|
if (blob.failure || !blob.token) {
|
|
25003
24996
|
p17.log.warn(blobFailureMessage(blob.failure));
|
|
25004
|
-
if (blob.detail) p17.log.message(
|
|
24997
|
+
if (blob.detail) p17.log.message(pc5.dim(blob.detail));
|
|
25005
24998
|
return { ok: false };
|
|
25006
24999
|
}
|
|
25007
25000
|
return {
|
|
@@ -25039,7 +25032,7 @@ async function runVercelDeployFlow(options) {
|
|
|
25039
25032
|
envSpinner.clear();
|
|
25040
25033
|
for (const key of sync.failed) {
|
|
25041
25034
|
p17.log.warn(
|
|
25042
|
-
`Could not set ${
|
|
25035
|
+
`Could not set ${pc5.cyan(key)} on Vercel \u2014 add it in the project's environment settings.`
|
|
25043
25036
|
);
|
|
25044
25037
|
}
|
|
25045
25038
|
ensureVercelJsonFramework(options.cwd);
|
|
@@ -25054,7 +25047,7 @@ async function runVercelDeployFlow(options) {
|
|
|
25054
25047
|
}
|
|
25055
25048
|
for (const dep of packageGuard.localSpecDeps) {
|
|
25056
25049
|
p17.log.warn(
|
|
25057
|
-
`Dependency ${
|
|
25050
|
+
`Dependency ${pc5.cyan(dep)} uses a local spec that cannot install on Vercel \u2014 the remote build may fail.`
|
|
25058
25051
|
);
|
|
25059
25052
|
}
|
|
25060
25053
|
const deploySpinner = spinner2();
|
|
@@ -25069,13 +25062,13 @@ async function runVercelDeployFlow(options) {
|
|
|
25069
25062
|
packageGuard.restore();
|
|
25070
25063
|
}
|
|
25071
25064
|
if (deploy.failure) {
|
|
25072
|
-
deploySpinner.stop(`${
|
|
25073
|
-
if (deploy.detail) p17.log.message(
|
|
25065
|
+
deploySpinner.stop(`${pc5.yellow("\u25B2")} ${deployFailureMessage(deploy.failure)}`);
|
|
25066
|
+
if (deploy.detail) p17.log.message(pc5.dim(deploy.detail));
|
|
25074
25067
|
printManualDeployHint();
|
|
25075
25068
|
return { ok: false };
|
|
25076
25069
|
}
|
|
25077
25070
|
const url = deploy.url;
|
|
25078
|
-
deploySpinner.stop(url ? `Deployed ${
|
|
25071
|
+
deploySpinner.stop(url ? `Deployed ${pc5.cyan(url)}` : "Deployed to Vercel");
|
|
25079
25072
|
return { ok: true, url, syncedEnvKeys: sync.synced };
|
|
25080
25073
|
} catch (error) {
|
|
25081
25074
|
p17.log.warn(`Vercel deploy failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
@@ -25086,12 +25079,12 @@ async function runVercelDeployFlow(options) {
|
|
|
25086
25079
|
}
|
|
25087
25080
|
}
|
|
25088
25081
|
function printManualDeployHint() {
|
|
25089
|
-
p17.log.info(`You can deploy manually: ${
|
|
25082
|
+
p17.log.info(`You can deploy manually: ${pc5.cyan("vercel deploy --prod")}`);
|
|
25090
25083
|
}
|
|
25091
25084
|
async function ensureLinkedProject(runner, cwd, projectName, env, scope) {
|
|
25092
25085
|
if (readLinkedProjectId(cwd)) return;
|
|
25093
25086
|
const projectSpinner = spinner2();
|
|
25094
|
-
projectSpinner.start(`Creating a Vercel project ${
|
|
25087
|
+
projectSpinner.start(`Creating a Vercel project ${pc5.cyan(projectName)}`);
|
|
25095
25088
|
const project2 = await createVercelProject(runner, cwd, projectName, { env, scope });
|
|
25096
25089
|
projectSpinner.clear();
|
|
25097
25090
|
if (!project2.linked || !project2.projectId) {
|
|
@@ -25103,7 +25096,7 @@ async function pullNeonDatabaseUrl(runner, cwd, env) {
|
|
|
25103
25096
|
neonSpinner.start("Retrieving DATABASE_URL from Vercel");
|
|
25104
25097
|
const databaseUrl = await pullVercelEnvValue(runner, cwd, readDbUrlFromDotenv, env);
|
|
25105
25098
|
if (!databaseUrl) {
|
|
25106
|
-
neonSpinner.stop(`${
|
|
25099
|
+
neonSpinner.stop(`${pc5.yellow("\u25B2")} No DATABASE_URL came back from Vercel`);
|
|
25107
25100
|
return void 0;
|
|
25108
25101
|
}
|
|
25109
25102
|
neonSpinner.clear();
|
|
@@ -25163,7 +25156,7 @@ function neonFailureMessage(reason) {
|
|
|
25163
25156
|
}
|
|
25164
25157
|
|
|
25165
25158
|
// adapters/next/commands/init.ts
|
|
25166
|
-
import
|
|
25159
|
+
import pc6 from "picocolors";
|
|
25167
25160
|
|
|
25168
25161
|
// adapters/next/commands/seed.ts
|
|
25169
25162
|
import fs38 from "fs";
|
|
@@ -25600,22 +25593,22 @@ async function runInitCommand(name, options) {
|
|
|
25600
25593
|
if (forceMode) {
|
|
25601
25594
|
const nuked = removeExistingAdminPaths(cwd, await resolveForceInitNamespaces(cwd, namespace));
|
|
25602
25595
|
if (nuked > 0) {
|
|
25603
|
-
p18.log.warn(`${
|
|
25596
|
+
p18.log.warn(`${pc6.yellow("Force mode:")} removed ${nuked} existing admin paths`);
|
|
25604
25597
|
}
|
|
25605
25598
|
project2 = detectProject(cwd, namespace);
|
|
25606
25599
|
} else if (project2.conflicts.length > 0) {
|
|
25607
|
-
const conflictLines = project2.conflicts.map((c) => `${
|
|
25600
|
+
const conflictLines = project2.conflicts.map((c) => `${pc6.yellow("\u25B2")} ${c}`);
|
|
25608
25601
|
conflictLines.push(
|
|
25609
25602
|
"",
|
|
25610
|
-
|
|
25603
|
+
pc6.dim(`Use ${pc6.bold("--force")} to remove existing admin files before scaffolding.`)
|
|
25611
25604
|
);
|
|
25612
|
-
p18.note(conflictLines.join("\n"),
|
|
25605
|
+
p18.note(conflictLines.join("\n"), pc6.yellow("Conflicts"));
|
|
25613
25606
|
if (!options.yes) {
|
|
25614
25607
|
const proceed = await p18.confirm({
|
|
25615
25608
|
message: [
|
|
25616
|
-
`Continue with ${
|
|
25617
|
-
`${
|
|
25618
|
-
|
|
25609
|
+
`Continue with ${pc6.bold(pc6.cyan("--force"))}?`,
|
|
25610
|
+
`${pc6.cyan("\u2502")} ${pc6.dim("This will force overwrite the existing admin code.")}`,
|
|
25611
|
+
pc6.cyan("\u2502")
|
|
25619
25612
|
].join("\n"),
|
|
25620
25613
|
initialValue: true
|
|
25621
25614
|
});
|
|
@@ -25629,13 +25622,12 @@ async function runInitCommand(name, options) {
|
|
|
25629
25622
|
await resolveForceInitNamespaces(cwd, namespace)
|
|
25630
25623
|
);
|
|
25631
25624
|
if (nuked > 0) {
|
|
25632
|
-
p18.log.warn(`${
|
|
25625
|
+
p18.log.warn(`${pc6.yellow("Force mode:")} removed ${nuked} existing admin paths`);
|
|
25633
25626
|
}
|
|
25634
25627
|
project2 = detectProject(cwd, namespace);
|
|
25635
25628
|
}
|
|
25636
25629
|
}
|
|
25637
25630
|
} else {
|
|
25638
|
-
p18.log.info("No Next.js app found \u2014 Running the fresh project mode...");
|
|
25639
25631
|
let projectPrompt;
|
|
25640
25632
|
try {
|
|
25641
25633
|
projectPrompt = options.yes ? resolveNonInteractiveProject(name) : await promptProject(name);
|
|
@@ -25692,8 +25684,8 @@ async function runInitCommand(name, options) {
|
|
|
25692
25684
|
p18.log.error(createNextAppResult.error);
|
|
25693
25685
|
p18.log.info(
|
|
25694
25686
|
`You can create the project manually:
|
|
25695
|
-
${
|
|
25696
|
-
Then run ${
|
|
25687
|
+
${pc6.cyan(`npx create-next-app@latest ${projectPrompt.projectName} --typescript --tailwind --app`)}
|
|
25688
|
+
Then run ${pc6.cyan("betterstart init")} inside it.`
|
|
25697
25689
|
);
|
|
25698
25690
|
process.exit(1);
|
|
25699
25691
|
}
|
|
@@ -25710,13 +25702,13 @@ async function runInitCommand(name, options) {
|
|
|
25710
25702
|
const manualCmd = `npx create-next-app@latest ${projectPrompt.projectName} --typescript --tailwind --app`;
|
|
25711
25703
|
p18.log.info(
|
|
25712
25704
|
`Create the project manually:
|
|
25713
|
-
${
|
|
25714
|
-
Then run ${
|
|
25705
|
+
${pc6.cyan(manualCmd)}
|
|
25706
|
+
Then run ${pc6.cyan("betterstart init")} inside it.`
|
|
25715
25707
|
);
|
|
25716
25708
|
process.exit(1);
|
|
25717
25709
|
}
|
|
25718
25710
|
const installedNextVersion = detectInstalledNextVersion(cwd);
|
|
25719
|
-
const nextVersionSuffix = installedNextVersion ? `${
|
|
25711
|
+
const nextVersionSuffix = installedNextVersion ? `${pc6.cyan(`v${installedNextVersion}`)}` : "";
|
|
25720
25712
|
createNextAppSpinner.stop(`Created a Next.js ${nextVersionSuffix} app in ${displayName}`);
|
|
25721
25713
|
project2 = detectProject(cwd, namespace);
|
|
25722
25714
|
isFreshProject = true;
|
|
@@ -25728,7 +25720,7 @@ async function runInitCommand(name, options) {
|
|
|
25728
25720
|
if (options.databaseUrl) {
|
|
25729
25721
|
if (!isValidDbUrl(options.databaseUrl)) {
|
|
25730
25722
|
p18.log.error(
|
|
25731
|
-
`Invalid database URL. Must start with ${
|
|
25723
|
+
`Invalid database URL. Must start with ${pc6.cyan("postgres://")} or ${pc6.cyan("postgresql://")}`
|
|
25732
25724
|
);
|
|
25733
25725
|
process.exit(1);
|
|
25734
25726
|
}
|
|
@@ -25751,11 +25743,11 @@ async function runInitCommand(name, options) {
|
|
|
25751
25743
|
const resourceUrl = flow.dashboardUrl ?? flow.resourceUrl;
|
|
25752
25744
|
if (resourceUrl) {
|
|
25753
25745
|
p18.log.info(
|
|
25754
|
-
`Open ${
|
|
25746
|
+
`Open ${pc6.cyan(resourceUrl)} to copy DATABASE_URL, then rerun ${pc6.cyan("betterstart init --database-url <url> --yes")}.`
|
|
25755
25747
|
);
|
|
25756
25748
|
} else {
|
|
25757
25749
|
p18.log.info(
|
|
25758
|
-
`Rerun ${
|
|
25750
|
+
`Rerun ${pc6.cyan("betterstart init --database-url <url> --yes")} with a Postgres connection string.`
|
|
25759
25751
|
);
|
|
25760
25752
|
}
|
|
25761
25753
|
} else {
|
|
@@ -25764,7 +25756,7 @@ async function runInitCommand(name, options) {
|
|
|
25764
25756
|
}
|
|
25765
25757
|
} else if (existingDbUrl) {
|
|
25766
25758
|
const masked = maskDbUrl(existingDbUrl);
|
|
25767
|
-
p18.log.info(`Using the existing DATABASE_URL from .env.local ${
|
|
25759
|
+
p18.log.info(`Using the existing DATABASE_URL from .env.local ${pc6.dim(`(${masked})`)}`);
|
|
25768
25760
|
databaseUrl = existingDbUrl;
|
|
25769
25761
|
} else {
|
|
25770
25762
|
const servicesResult = await promptServices({ allowVercel: options.vercel !== false });
|
|
@@ -25956,8 +25948,8 @@ async function runInitCommand(name, options) {
|
|
|
25956
25948
|
p18.log.warning(depsResult.error ?? "Unknown error");
|
|
25957
25949
|
p18.log.info(
|
|
25958
25950
|
`You can install them manually:
|
|
25959
|
-
${
|
|
25960
|
-
${
|
|
25951
|
+
${pc6.cyan(`${pm} add ${depsResult.dependencies.join(" ")}`)}
|
|
25952
|
+
${pc6.cyan(`${pm} add -D ${depsResult.devDeps.join(" ")}`)}`
|
|
25961
25953
|
);
|
|
25962
25954
|
}
|
|
25963
25955
|
if (depsInstalled) {
|
|
@@ -26025,7 +26017,7 @@ async function runInitCommand(name, options) {
|
|
|
26025
26017
|
}
|
|
26026
26018
|
let dbPushed = false;
|
|
26027
26019
|
if (depsResult.success && options.skipMigration && hasDbUrl(cwd)) {
|
|
26028
|
-
p18.log.info(`Skipping database schema push ${
|
|
26020
|
+
p18.log.info(`Skipping database schema push ${pc6.dim("(--skip-migration)")}`);
|
|
26029
26021
|
} else if (depsResult.success && hasDbUrl(cwd)) {
|
|
26030
26022
|
let driverReady = hasDrizzleKitPostgresDriverDependency(cwd);
|
|
26031
26023
|
if (!driverReady) {
|
|
@@ -26042,11 +26034,11 @@ async function runInitCommand(name, options) {
|
|
|
26042
26034
|
s.stop("Database push failed");
|
|
26043
26035
|
p18.log.warning(driverResult.error ?? `Failed to install ${DRIZZLE_KIT_POSTGRES_DRIVER_DEP}`);
|
|
26044
26036
|
p18.log.info(
|
|
26045
|
-
`Install ${DRIZZLE_KIT_POSTGRES_DRIVER_DEP} manually, then run: ${
|
|
26037
|
+
`Install ${DRIZZLE_KIT_POSTGRES_DRIVER_DEP} manually, then run: ${pc6.cyan(drizzlePushCommand(pm))}`
|
|
26046
26038
|
);
|
|
26047
26039
|
} else {
|
|
26048
26040
|
driverReady = hasDrizzleKitPostgresDriverDependency(cwd);
|
|
26049
|
-
s.stop(`${
|
|
26041
|
+
s.stop(`${pc6.green("\u2713")} Drizzle Kit Postgres driver dependency installed`);
|
|
26050
26042
|
}
|
|
26051
26043
|
}
|
|
26052
26044
|
if (driverReady) {
|
|
@@ -26088,7 +26080,7 @@ async function runInitCommand(name, options) {
|
|
|
26088
26080
|
p18.log.error("Database was not reachable. Aborting setup.");
|
|
26089
26081
|
process.exit(1);
|
|
26090
26082
|
}
|
|
26091
|
-
p18.log.info(`You can run it manually: ${
|
|
26083
|
+
p18.log.info(`You can run it manually: ${pc6.cyan(drizzlePushCommand(pm))}`);
|
|
26092
26084
|
}
|
|
26093
26085
|
}
|
|
26094
26086
|
}
|
|
@@ -26098,7 +26090,7 @@ async function runInitCommand(name, options) {
|
|
|
26098
26090
|
let adminAccountReady = false;
|
|
26099
26091
|
if (dbPushed && options.skipAdminCreation) {
|
|
26100
26092
|
p18.log.info(
|
|
26101
|
-
`Skipping admin user creation ${
|
|
26093
|
+
`Skipping admin user creation ${pc6.dim(`(use ${betterstartExecCommand(pm, "seed")} later)`)}`
|
|
26102
26094
|
);
|
|
26103
26095
|
}
|
|
26104
26096
|
if (dbPushed && !options.yes && !options.skipAdminCreation) {
|
|
@@ -26109,7 +26101,7 @@ async function runInitCommand(name, options) {
|
|
|
26109
26101
|
const adminCheck = await checkExistingAdmin(cwd, adminDir, authBasePath);
|
|
26110
26102
|
s.clear();
|
|
26111
26103
|
if (adminCheck.error) {
|
|
26112
|
-
p18.log.warning(`Could not verify existing admin account ${
|
|
26104
|
+
p18.log.warning(`Could not verify existing admin account ${pc6.dim(`(${adminCheck.error})`)}`);
|
|
26113
26105
|
if (isDatabaseReachabilityError(adminCheck.error)) {
|
|
26114
26106
|
p18.log.error("Database was not reachable. Aborting setup.");
|
|
26115
26107
|
process.exit(1);
|
|
@@ -26136,7 +26128,7 @@ async function runInitCommand(name, options) {
|
|
|
26136
26128
|
}
|
|
26137
26129
|
if (adminAction === "skip") {
|
|
26138
26130
|
adminAccountReady = true;
|
|
26139
|
-
p18.log.info(`Keeping existing admin account ${
|
|
26131
|
+
p18.log.info(`Keeping existing admin account ${pc6.dim(`(${existingAdminLabel})`)}`);
|
|
26140
26132
|
} else {
|
|
26141
26133
|
replaceExistingAdmin = true;
|
|
26142
26134
|
}
|
|
@@ -26178,7 +26170,7 @@ async function runInitCommand(name, options) {
|
|
|
26178
26170
|
seedOverwriteMode
|
|
26179
26171
|
);
|
|
26180
26172
|
if (seedResult.existingUser) {
|
|
26181
|
-
s.stop(`${
|
|
26173
|
+
s.stop(`${pc6.yellow("\u25B2")} An account already exists for ${credentials.email}`);
|
|
26182
26174
|
const replace = await p18.confirm({
|
|
26183
26175
|
message: "Replace the existing account with this email?",
|
|
26184
26176
|
initialValue: false
|
|
@@ -26198,17 +26190,17 @@ async function runInitCommand(name, options) {
|
|
|
26198
26190
|
}
|
|
26199
26191
|
if (seedResult.success) {
|
|
26200
26192
|
s.stop(
|
|
26201
|
-
seedOverwriteMode === "admin" ? `${
|
|
26193
|
+
seedOverwriteMode === "admin" ? `${pc6.green("\u2713")} Admin user replaced` : `${pc6.green("\u2713")} Admin user created`
|
|
26202
26194
|
);
|
|
26203
26195
|
seedSuccess = true;
|
|
26204
26196
|
adminAccountReady = true;
|
|
26205
26197
|
} else if (seedResult.error) {
|
|
26206
|
-
s.stop(`${
|
|
26198
|
+
s.stop(`${pc6.red("\u2717")} Failed to create admin user`);
|
|
26207
26199
|
p18.note(
|
|
26208
|
-
`${
|
|
26200
|
+
`${pc6.red(seedResult.error)}
|
|
26209
26201
|
|
|
26210
|
-
Run manually: ${
|
|
26211
|
-
|
|
26202
|
+
Run manually: ${pc6.cyan(betterstartExecCommand(pm, "seed"))}`,
|
|
26203
|
+
pc6.red("Seed failed")
|
|
26212
26204
|
);
|
|
26213
26205
|
if (isDatabaseReachabilityError(seedResult.error)) {
|
|
26214
26206
|
p18.log.error("Database was not reachable. Aborting setup.");
|
|
@@ -26638,10 +26630,10 @@ function stripAnsi2(value) {
|
|
|
26638
26630
|
return value.replace(ANSI_ESCAPE_PATTERN2, "");
|
|
26639
26631
|
}
|
|
26640
26632
|
function printAdminReadyNote(state) {
|
|
26641
|
-
const lines = [`Admin: ${
|
|
26633
|
+
const lines = [`Admin: ${pc6.cyan(state.adminLoginUrl)}`];
|
|
26642
26634
|
if (state.adminEmail && state.adminPassword) {
|
|
26643
|
-
lines.unshift(`Password: ${
|
|
26644
|
-
lines.unshift(`Admin user: ${
|
|
26635
|
+
lines.unshift(`Password: ${pc6.cyan(state.adminPassword)}`);
|
|
26636
|
+
lines.unshift(`Admin user: ${pc6.cyan(state.adminEmail)}`);
|
|
26645
26637
|
}
|
|
26646
26638
|
p18.note(lines.join("\n"), "Admin ready");
|
|
26647
26639
|
}
|
|
@@ -27011,7 +27003,7 @@ async function runRemoveSchemaCommand(schemaName, options) {
|
|
|
27011
27003
|
import fs42 from "fs";
|
|
27012
27004
|
import path55 from "path";
|
|
27013
27005
|
import * as p22 from "@clack/prompts";
|
|
27014
|
-
import
|
|
27006
|
+
import pc7 from "picocolors";
|
|
27015
27007
|
|
|
27016
27008
|
// adapters/next/commands/uninstall-cleaners.ts
|
|
27017
27009
|
import fs41 from "fs";
|
|
@@ -27297,7 +27289,7 @@ function buildUninstallPlan(cwd, namespaceValue) {
|
|
|
27297
27289
|
}
|
|
27298
27290
|
async function runUninstallCommand(options) {
|
|
27299
27291
|
const cwd = options.cwd ? path55.resolve(options.cwd) : process.cwd();
|
|
27300
|
-
p22.intro(
|
|
27292
|
+
p22.intro(pc7.bgRed(pc7.white(" BetterStart Uninstall ")));
|
|
27301
27293
|
let namespace = DEFAULT_ADMIN_NAMESPACE;
|
|
27302
27294
|
try {
|
|
27303
27295
|
const config = await resolveConfig(cwd);
|
|
@@ -27306,14 +27298,14 @@ async function runUninstallCommand(options) {
|
|
|
27306
27298
|
}
|
|
27307
27299
|
const steps = buildUninstallPlan(cwd, namespace);
|
|
27308
27300
|
if (steps.length === 0) {
|
|
27309
|
-
p22.log.success(`${
|
|
27301
|
+
p22.log.success(`${pc7.green("\u2713")} Nothing to remove \u2014 project is already clean.`);
|
|
27310
27302
|
p22.outro("Done");
|
|
27311
27303
|
return;
|
|
27312
27304
|
}
|
|
27313
27305
|
const planLines = steps.map((step) => {
|
|
27314
27306
|
const names = step.items.join(" ");
|
|
27315
|
-
const countLabel =
|
|
27316
|
-
return `${
|
|
27307
|
+
const countLabel = pc7.dim(`${step.count} ${step.unit}`);
|
|
27308
|
+
return `${pc7.red("\xD7")} ${names} ${countLabel}`;
|
|
27317
27309
|
});
|
|
27318
27310
|
p22.note(planLines.join("\n"), "Uninstall plan");
|
|
27319
27311
|
if (!options.force) {
|
|
@@ -27334,7 +27326,7 @@ async function runUninstallCommand(options) {
|
|
|
27334
27326
|
}
|
|
27335
27327
|
const parts = steps.map((step) => `${step.count} ${step.unit}`);
|
|
27336
27328
|
s.stop(`Removed ${parts.join(", ")}`);
|
|
27337
|
-
p22.note(
|
|
27329
|
+
p22.note(pc7.dim("Database tables were NOT dropped \u2014 drop them manually if needed."), "Next steps");
|
|
27338
27330
|
p22.outro("Uninstall complete");
|
|
27339
27331
|
}
|
|
27340
27332
|
|