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