@atria/cli 0.0.12 → 0.0.14
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 +8 -5
- package/dist/bin.js +21 -2
- package/dist/bin.js.map +1 -1
- package/dist/commands/dev.js +2 -0
- package/dist/commands/dev.js.map +1 -1
- package/dist/commands/init.js +7 -28
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/setup.d.ts +1 -0
- package/dist/commands/setup.js +608 -0
- package/dist/commands/setup.js.map +1 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -1
- package/dist/runtime/bootstrap.d.ts +7 -0
- package/dist/runtime/bootstrap.js +16 -0
- package/dist/runtime/bootstrap.js.map +1 -0
- package/package.json +4 -3
package/README.md
CHANGED
|
@@ -14,14 +14,17 @@ npm install -D @atria/cli
|
|
|
14
14
|
npx atria --help
|
|
15
15
|
npx atria init my-project
|
|
16
16
|
npx atria dev my-project --port 3333
|
|
17
|
+
npx atria setup my-project
|
|
17
18
|
```
|
|
18
19
|
|
|
19
20
|
## Commands
|
|
20
21
|
|
|
21
|
-
- `atria init [project-directory] [--force]`
|
|
22
|
-
Creates an atria project structure with `studio/`, `public/` (empty until publish),
|
|
23
|
-
- `atria dev [project-directory] [--port 3333]`
|
|
24
|
-
Serves `public/` on `localhost`, `.atria/runtime` on `
|
|
22
|
+
- `atria init [project-directory] [--force]`
|
|
23
|
+
Creates an atria project structure with `production/studio/`, `production/public/` (empty until publish), `.atria/runtime/`, and defers database setup to install-time setup.
|
|
24
|
+
- `atria dev [project-directory] [--port 3333]`
|
|
25
|
+
Serves `production/public/` on `localhost`, `.atria/runtime` on `studio.localhost`, and exposes `/api/health` (`503 /` on public host until first publish).
|
|
26
|
+
- `atria setup [project-directory] [--database sqlite|postgres] [--database-url <postgres-url>] [--database-only] [--auth-method google|github|email] [--force]`
|
|
27
|
+
Configures database + owner sign-in preference, and can launch OAuth setup in-browser. Use `--database-only` during install hooks or `--database-url` for PostgreSQL.
|
|
25
28
|
|
|
26
29
|
## Programmatic API
|
|
27
30
|
|
|
@@ -34,4 +37,4 @@ await runCli(process.argv);
|
|
|
34
37
|
## Notes
|
|
35
38
|
|
|
36
39
|
- During `dev`, the CLI checks npm for newer `@atria/cli` versions and prints an update hint.
|
|
37
|
-
-
|
|
40
|
+
- Setup completion is derived from database users (`pending` becomes `false` once the first owner is created).
|
package/dist/bin.js
CHANGED
|
@@ -1,8 +1,27 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
|
|
2
|
+
const originalEmitWarning = process.emitWarning.bind(process);
|
|
3
|
+
process.emitWarning = ((warning, ...args) => {
|
|
4
|
+
const warningMessage = typeof warning === "string" ? warning : warning.message;
|
|
5
|
+
const warningType = typeof args[0] === "string"
|
|
6
|
+
? args[0]
|
|
7
|
+
: warning instanceof Error && typeof warning.name === "string"
|
|
8
|
+
? warning.name
|
|
9
|
+
: "";
|
|
10
|
+
const isSqliteExperimentalWarning = warningType === "ExperimentalWarning" &&
|
|
11
|
+
warningMessage.includes("SQLite is an experimental feature");
|
|
12
|
+
if (isSqliteExperimentalWarning) {
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
15
|
+
originalEmitWarning(warning, ...args);
|
|
16
|
+
});
|
|
17
|
+
const main = async () => {
|
|
18
|
+
const { runCli } = await import("./index.js");
|
|
19
|
+
await runCli(process.argv);
|
|
20
|
+
};
|
|
21
|
+
main().catch((error) => {
|
|
4
22
|
const message = error instanceof Error ? error.message : String(error);
|
|
5
23
|
console.error(`[atria] ${message}`);
|
|
6
24
|
process.exit(1);
|
|
7
25
|
});
|
|
26
|
+
export {};
|
|
8
27
|
//# sourceMappingURL=bin.js.map
|
package/dist/bin.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bin.js","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"bin.js","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":";AAEA,MAAM,mBAAmB,GAAG,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AAE9D,OAAO,CAAC,WAAW,GAAG,CAAC,CAAC,OAAuB,EAAE,GAAG,IAAe,EAAE,EAAE;IACrE,MAAM,cAAc,GAAG,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC;IAC/E,MAAM,WAAW,GACf,OAAO,IAAI,CAAC,CAAC,CAAC,KAAK,QAAQ;QACzB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QACT,CAAC,CAAC,OAAO,YAAY,KAAK,IAAI,OAAO,OAAO,CAAC,IAAI,KAAK,QAAQ;YAC5D,CAAC,CAAC,OAAO,CAAC,IAAI;YACd,CAAC,CAAC,EAAE,CAAC;IAEX,MAAM,2BAA2B,GAC/B,WAAW,KAAK,qBAAqB;QACrC,cAAc,CAAC,QAAQ,CAAC,mCAAmC,CAAC,CAAC;IAE/D,IAAI,2BAA2B,EAAE,CAAC;QAChC,OAAO;IACT,CAAC;IAEA,mBAA2D,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,CAAC;AACjF,CAAC,CAA+B,CAAC;AAEjC,MAAM,IAAI,GAAG,KAAK,IAAmB,EAAE;IACrC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,CAAC;IAC9C,MAAM,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AAC7B,CAAC,CAAC;AAEF,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACvE,OAAO,CAAC,KAAK,CAAC,WAAW,OAAO,EAAE,CAAC,CAAC;IACpC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
package/dist/commands/dev.js
CHANGED
|
@@ -3,6 +3,7 @@ import { promises as fs } from "node:fs";
|
|
|
3
3
|
import { startDevServer } from "@atria/server";
|
|
4
4
|
import { ATRIA_RUNTIME_DIR, DEFAULT_DEV_PORT } from "@atria/shared";
|
|
5
5
|
import { parseArgs } from "../utils/args.js";
|
|
6
|
+
import { writeRuntimeBootstrapFiles } from "../runtime/bootstrap.js";
|
|
6
7
|
import { terminal } from "../utils/terminal.js";
|
|
7
8
|
import { checkForCliUpdate, getCliUpdateInstallCommand } from "../utils/update-check.js";
|
|
8
9
|
const printDevHelp = () => {
|
|
@@ -45,6 +46,7 @@ export const runDevCommand = async (args) => {
|
|
|
45
46
|
catch {
|
|
46
47
|
throw new Error(`Runtime not found at ${runtimeDir}. Run "atria init ${targetArgument}" first.`);
|
|
47
48
|
}
|
|
49
|
+
await writeRuntimeBootstrapFiles(projectRoot, true);
|
|
48
50
|
const server = await startDevServer({
|
|
49
51
|
projectRoot,
|
|
50
52
|
port
|
package/dist/commands/dev.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dev.js","sourceRoot":"","sources":["../../src/commands/dev.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"dev.js","sourceRoot":"","sources":["../../src/commands/dev.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/init.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import path from "node:path";
|
|
2
|
-
import { ATRIA_CONFIG_FILE, ATRIA_RUNTIME_DIR, PUBLIC_OUTPUT_DIR, STUDIO_CONTENT_DIR, STUDIO_THEME_DIR } from "@atria/shared";
|
|
2
|
+
import { ATRIA_CONFIG_FILE, ATRIA_RUNTIME_DIR, PUBLIC_OUTPUT_DIR, STUDIO_CONTENT_DIR, STUDIO_THEME_DIR, createEnvExampleFile, runtimeAppJs, runtimeIndexHtml } from "@atria/shared";
|
|
3
3
|
import { parseArgs } from "../utils/args.js";
|
|
4
4
|
import { ensureDirectory, writeFile } from "../utils/fs.js";
|
|
5
5
|
const buildProjectPackageJson = (projectName) => `${JSON.stringify({
|
|
@@ -7,6 +7,7 @@ const buildProjectPackageJson = (projectName) => `${JSON.stringify({
|
|
|
7
7
|
private: true,
|
|
8
8
|
version: "0.1.0",
|
|
9
9
|
scripts: {
|
|
10
|
+
postinstall: "atria setup --database-only",
|
|
10
11
|
dev: "atria dev"
|
|
11
12
|
},
|
|
12
13
|
devDependencies: {
|
|
@@ -17,33 +18,6 @@ const buildConfigFile = (projectName) => `${JSON.stringify({
|
|
|
17
18
|
name: projectName,
|
|
18
19
|
runtimeDir: ATRIA_RUNTIME_DIR
|
|
19
20
|
}, null, 2)}\n`;
|
|
20
|
-
const runtimeIndexHtml = `<!doctype html>
|
|
21
|
-
<html lang="en">
|
|
22
|
-
<head>
|
|
23
|
-
<meta charset="UTF-8" />
|
|
24
|
-
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
25
|
-
<title>Atria — BackOffice</title>
|
|
26
|
-
</head>
|
|
27
|
-
<body>
|
|
28
|
-
<main id="bo-root">
|
|
29
|
-
<h1>atria</h1>
|
|
30
|
-
<p>Booting Back Office runtime...</p>
|
|
31
|
-
</main>
|
|
32
|
-
<script type="module" src="./app.js"></script>
|
|
33
|
-
</body>
|
|
34
|
-
</html>
|
|
35
|
-
`;
|
|
36
|
-
const runtimeAppJs = `const root = document.getElementById("bo-root");
|
|
37
|
-
|
|
38
|
-
if (root) {
|
|
39
|
-
const now = new Date().toLocaleString();
|
|
40
|
-
root.innerHTML = [
|
|
41
|
-
"<h1>atria Back Office</h1>",
|
|
42
|
-
"<p>Phase 1 runtime is active.</p>",
|
|
43
|
-
"<p>Loaded at: " + now + "</p>"
|
|
44
|
-
].join("");
|
|
45
|
-
}
|
|
46
|
-
`;
|
|
47
21
|
const fileLabel = (targetRoot, filePath) => {
|
|
48
22
|
const relativePath = path.relative(targetRoot, filePath);
|
|
49
23
|
return relativePath.length > 0 ? relativePath : filePath;
|
|
@@ -78,6 +52,10 @@ export const runInitCommand = async (args) => {
|
|
|
78
52
|
path: path.join(targetRoot, ATRIA_CONFIG_FILE),
|
|
79
53
|
content: buildConfigFile(projectName)
|
|
80
54
|
},
|
|
55
|
+
{
|
|
56
|
+
path: path.join(targetRoot, ".env.example"),
|
|
57
|
+
content: createEnvExampleFile()
|
|
58
|
+
},
|
|
81
59
|
{
|
|
82
60
|
path: path.join(targetRoot, STUDIO_CONTENT_DIR, ".gitkeep"),
|
|
83
61
|
content: ""
|
|
@@ -113,5 +91,6 @@ export const runInitCommand = async (args) => {
|
|
|
113
91
|
console.log(`[atria] Project ready at ${targetRoot}`);
|
|
114
92
|
console.log(`[atria] Files: ${created} created, ${updated} updated, ${skipped} skipped`);
|
|
115
93
|
console.log(`[atria] Runtime: ${fileLabel(targetRoot, path.join(targetRoot, ATRIA_RUNTIME_DIR))}`);
|
|
94
|
+
console.log("[atria] Database setup is deferred to npm install (atria setup).\n[atria] Run npm install to choose SQLite or PostgreSQL.");
|
|
116
95
|
};
|
|
117
96
|
//# sourceMappingURL=init.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EACL,iBAAiB,EACjB,iBAAiB,EACjB,iBAAiB,EACjB,kBAAkB,EAClB,gBAAgB,EACjB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE5D,MAAM,uBAAuB,GAAG,CAAC,WAAmB,EAAU,EAAE,CAC9D,GAAG,IAAI,CAAC,SAAS,CACf;IACE,IAAI,EAAE,WAAW;IACjB,OAAO,EAAE,IAAI;IACb,OAAO,EAAE,OAAO;IAChB,OAAO,EAAE;QACP,GAAG,EAAE,WAAW;KACjB;IACD,eAAe,EAAE;QACf,YAAY,EAAE,QAAQ;KACvB;CACF,EACD,IAAI,EACJ,CAAC,CACF,IAAI,CAAC;AAER,MAAM,eAAe,GAAG,CAAC,WAAmB,EAAU,EAAE,CACtD,GAAG,IAAI,CAAC,SAAS,CACf;IACE,IAAI,EAAE,WAAW;IACjB,UAAU,EAAE,iBAAiB;CAC9B,EACD,IAAI,EACJ,CAAC,CACF,IAAI,CAAC;AAER,MAAM,
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const runSetupCommand: (args: string[]) => Promise<void>;
|
|
@@ -0,0 +1,608 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import readline from "node:readline";
|
|
3
|
+
import { spawn } from "node:child_process";
|
|
4
|
+
import { request as httpRequest } from "node:http";
|
|
5
|
+
import { promises as fs } from "node:fs";
|
|
6
|
+
import { openAtriaDatabase } from "@atria/db";
|
|
7
|
+
import { startDevServer } from "@atria/server";
|
|
8
|
+
import { DEFAULT_DEV_PORT, parseAuthMethod } from "@atria/shared";
|
|
9
|
+
import { parseArgs } from "../utils/args.js";
|
|
10
|
+
import { terminal } from "../utils/terminal.js";
|
|
11
|
+
const AUTH_METHOD_CHOICES = [
|
|
12
|
+
{ value: "google", label: "Google" },
|
|
13
|
+
{ value: "github", label: "GitHub" },
|
|
14
|
+
{ value: "email", label: "E-mail / password" }
|
|
15
|
+
];
|
|
16
|
+
const DATABASE_MODE_CHOICES = [
|
|
17
|
+
{ value: "sqlite", label: "SQLite (default)" },
|
|
18
|
+
{ value: "postgres", label: "PostgreSQL" }
|
|
19
|
+
];
|
|
20
|
+
const supportsColor = process.stdout.isTTY === true && !process.env.NO_COLOR;
|
|
21
|
+
const bold = (text) => (supportsColor ? `\u001b[1m${text}\u001b[22m` : text);
|
|
22
|
+
const sleep = async (ms) => new Promise((resolve) => {
|
|
23
|
+
setTimeout(resolve, ms);
|
|
24
|
+
});
|
|
25
|
+
const printSetupHelp = () => {
|
|
26
|
+
console.log("Usage: atria setup [project-directory] [--database sqlite|postgres] [--database-url <postgres-url>] [--database-only] [--auth-method google|github|email] [--force]");
|
|
27
|
+
};
|
|
28
|
+
const authMethodLabel = (authMethod) => authMethod === "google" ? "Google" : authMethod === "github" ? "GitHub" : "E-mail / password";
|
|
29
|
+
const parseDatabaseMode = (value) => {
|
|
30
|
+
if (value === "sqlite" || value === "postgres") {
|
|
31
|
+
return value;
|
|
32
|
+
}
|
|
33
|
+
return null;
|
|
34
|
+
};
|
|
35
|
+
const isPostgresConnectionString = (connectionString) => {
|
|
36
|
+
const normalized = connectionString.toLowerCase();
|
|
37
|
+
return normalized.startsWith("postgres://") || normalized.startsWith("postgresql://");
|
|
38
|
+
};
|
|
39
|
+
const cleanEnvValue = (value) => {
|
|
40
|
+
if (typeof value !== "string") {
|
|
41
|
+
return null;
|
|
42
|
+
}
|
|
43
|
+
const trimmed = value.trim();
|
|
44
|
+
return trimmed.length > 0 ? trimmed : null;
|
|
45
|
+
};
|
|
46
|
+
const toErrorMessage = (error) => {
|
|
47
|
+
if (error instanceof AggregateError) {
|
|
48
|
+
const nested = error.errors
|
|
49
|
+
.map((entry) => (entry instanceof Error && entry.message ? entry.message : String(entry)))
|
|
50
|
+
.map((entry) => entry.trim())
|
|
51
|
+
.filter((entry) => entry.length > 0);
|
|
52
|
+
if (nested.length > 0) {
|
|
53
|
+
return nested.join(" | ");
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
if (error instanceof Error && error.message.trim().length > 0) {
|
|
57
|
+
return error.message.trim();
|
|
58
|
+
}
|
|
59
|
+
if (typeof error === "object" && error !== null && "code" in error) {
|
|
60
|
+
const code = error.code;
|
|
61
|
+
if (typeof code === "string" && code.trim().length > 0) {
|
|
62
|
+
return code.trim();
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
return String(error).trim();
|
|
66
|
+
};
|
|
67
|
+
const openBrowser = async (url) => {
|
|
68
|
+
const openCommand = process.platform === "darwin"
|
|
69
|
+
? { command: "open", args: [url] }
|
|
70
|
+
: process.platform === "win32"
|
|
71
|
+
? { command: "cmd", args: ["/c", "start", "", url] }
|
|
72
|
+
: { command: "xdg-open", args: [url] };
|
|
73
|
+
try {
|
|
74
|
+
const child = spawn(openCommand.command, openCommand.args, {
|
|
75
|
+
stdio: "ignore",
|
|
76
|
+
detached: true
|
|
77
|
+
});
|
|
78
|
+
child.unref();
|
|
79
|
+
return true;
|
|
80
|
+
}
|
|
81
|
+
catch {
|
|
82
|
+
return false;
|
|
83
|
+
}
|
|
84
|
+
};
|
|
85
|
+
const parseDotEnvLine = (line) => {
|
|
86
|
+
const trimmed = line.trim();
|
|
87
|
+
if (trimmed.length === 0 || trimmed.startsWith("#")) {
|
|
88
|
+
return null;
|
|
89
|
+
}
|
|
90
|
+
const separatorIndex = trimmed.indexOf("=");
|
|
91
|
+
if (separatorIndex <= 0) {
|
|
92
|
+
return null;
|
|
93
|
+
}
|
|
94
|
+
const key = trimmed.slice(0, separatorIndex).trim();
|
|
95
|
+
const rawValue = trimmed.slice(separatorIndex + 1).trim();
|
|
96
|
+
if (!key) {
|
|
97
|
+
return null;
|
|
98
|
+
}
|
|
99
|
+
const quoted = (rawValue.startsWith('"') && rawValue.endsWith('"')) ||
|
|
100
|
+
(rawValue.startsWith("'") && rawValue.endsWith("'"));
|
|
101
|
+
const value = quoted ? rawValue.slice(1, -1) : rawValue;
|
|
102
|
+
return { key, value };
|
|
103
|
+
};
|
|
104
|
+
const loadProjectEnv = async (projectRoot) => {
|
|
105
|
+
const envPath = path.join(projectRoot, ".env");
|
|
106
|
+
try {
|
|
107
|
+
const envFile = await fs.readFile(envPath, "utf-8");
|
|
108
|
+
const lines = envFile.split(/\r?\n/g);
|
|
109
|
+
for (const line of lines) {
|
|
110
|
+
const parsed = parseDotEnvLine(line);
|
|
111
|
+
if (!parsed) {
|
|
112
|
+
continue;
|
|
113
|
+
}
|
|
114
|
+
if (process.env[parsed.key] === undefined) {
|
|
115
|
+
process.env[parsed.key] = parsed.value;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
catch (error) {
|
|
120
|
+
if (error.code !== "ENOENT") {
|
|
121
|
+
throw error;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
};
|
|
125
|
+
const hasPath = async (targetPath) => {
|
|
126
|
+
try {
|
|
127
|
+
await fs.access(targetPath);
|
|
128
|
+
return true;
|
|
129
|
+
}
|
|
130
|
+
catch {
|
|
131
|
+
return false;
|
|
132
|
+
}
|
|
133
|
+
};
|
|
134
|
+
const updateProjectEnv = async (projectRoot, updates) => {
|
|
135
|
+
const envPath = path.join(projectRoot, ".env");
|
|
136
|
+
const managedKeys = Object.keys(updates);
|
|
137
|
+
const content = await fs.readFile(envPath, "utf-8").catch((error) => {
|
|
138
|
+
if (error.code === "ENOENT") {
|
|
139
|
+
return "";
|
|
140
|
+
}
|
|
141
|
+
throw error;
|
|
142
|
+
});
|
|
143
|
+
const lines = content.length > 0 ? content.split(/\r?\n/g) : [];
|
|
144
|
+
const seen = new Set();
|
|
145
|
+
const outputLines = [];
|
|
146
|
+
for (const line of lines) {
|
|
147
|
+
const parsed = parseDotEnvLine(line);
|
|
148
|
+
if (!parsed || !managedKeys.includes(parsed.key)) {
|
|
149
|
+
outputLines.push(line);
|
|
150
|
+
continue;
|
|
151
|
+
}
|
|
152
|
+
if (seen.has(parsed.key)) {
|
|
153
|
+
continue;
|
|
154
|
+
}
|
|
155
|
+
seen.add(parsed.key);
|
|
156
|
+
const nextValue = updates[parsed.key];
|
|
157
|
+
if (nextValue !== null) {
|
|
158
|
+
outputLines.push(`${parsed.key}=${nextValue}`);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
for (const key of managedKeys) {
|
|
162
|
+
if (seen.has(key)) {
|
|
163
|
+
continue;
|
|
164
|
+
}
|
|
165
|
+
const value = updates[key];
|
|
166
|
+
if (value !== null) {
|
|
167
|
+
outputLines.push(`${key}=${value}`);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
const normalized = outputLines.join("\n").replace(/\n{3,}/g, "\n\n");
|
|
171
|
+
const finalContent = normalized.length > 0 ? `${normalized}\n` : "";
|
|
172
|
+
await fs.writeFile(envPath, finalContent, "utf-8");
|
|
173
|
+
};
|
|
174
|
+
const resolveConfiguredDatabaseUrl = () => cleanEnvValue(process.env.ATRIA_DATABASE_URL) ?? cleanEnvValue(process.env.DATABASE_URL);
|
|
175
|
+
const resolveConfiguredDatabaseMode = () => {
|
|
176
|
+
const explicitConnection = resolveConfiguredDatabaseUrl();
|
|
177
|
+
if (!explicitConnection) {
|
|
178
|
+
return null;
|
|
179
|
+
}
|
|
180
|
+
return isPostgresConnectionString(explicitConnection) ? "postgres" : "sqlite";
|
|
181
|
+
};
|
|
182
|
+
const ensureDatabaseReady = async (projectRoot, envOverrides = {}) => {
|
|
183
|
+
const database = openAtriaDatabase(projectRoot, {
|
|
184
|
+
env: {
|
|
185
|
+
...process.env,
|
|
186
|
+
...envOverrides
|
|
187
|
+
}
|
|
188
|
+
});
|
|
189
|
+
try {
|
|
190
|
+
await database.hasUsers();
|
|
191
|
+
}
|
|
192
|
+
finally {
|
|
193
|
+
await database.close();
|
|
194
|
+
}
|
|
195
|
+
};
|
|
196
|
+
const promptForChoice = async (promptText, choices) => new Promise((resolve, reject) => {
|
|
197
|
+
if (!process.stdin.isTTY || !process.stdout.isTTY) {
|
|
198
|
+
reject(new Error("Interactive setup prompt requires a TTY terminal."));
|
|
199
|
+
return;
|
|
200
|
+
}
|
|
201
|
+
let selectedIndex = 0;
|
|
202
|
+
let hasNavigated = false;
|
|
203
|
+
let hasSavedCursor = false;
|
|
204
|
+
let cursorHidden = false;
|
|
205
|
+
const render = () => {
|
|
206
|
+
const promptHint = hasNavigated ? "" : ` ${terminal.dim("(Use arrow keys)")}`;
|
|
207
|
+
const promptHeader = `${terminal.green("?")} ${bold(promptText)}${promptHint}`;
|
|
208
|
+
const lines = [
|
|
209
|
+
promptHeader,
|
|
210
|
+
...choices.map((choice, index) => index === selectedIndex
|
|
211
|
+
? `${terminal.cyan("❯")} ${terminal.cyan(choice.label)}`
|
|
212
|
+
: ` ${choice.label}`)
|
|
213
|
+
];
|
|
214
|
+
if (!hasSavedCursor) {
|
|
215
|
+
process.stdout.write("\x1b[s");
|
|
216
|
+
hasSavedCursor = true;
|
|
217
|
+
}
|
|
218
|
+
else {
|
|
219
|
+
process.stdout.write("\x1b[u");
|
|
220
|
+
}
|
|
221
|
+
if (!cursorHidden) {
|
|
222
|
+
process.stdout.write("\x1b[?25l");
|
|
223
|
+
cursorHidden = true;
|
|
224
|
+
}
|
|
225
|
+
readline.clearScreenDown(process.stdout);
|
|
226
|
+
for (let index = 0; index < lines.length; index += 1) {
|
|
227
|
+
process.stdout.write(lines[index]);
|
|
228
|
+
if (index < lines.length - 1) {
|
|
229
|
+
process.stdout.write("\n");
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
};
|
|
233
|
+
const cleanup = () => {
|
|
234
|
+
process.stdin.off("keypress", onKeypress);
|
|
235
|
+
process.stdin.setRawMode(false);
|
|
236
|
+
process.stdin.pause();
|
|
237
|
+
if (hasSavedCursor) {
|
|
238
|
+
process.stdout.write("\x1b[u");
|
|
239
|
+
readline.clearScreenDown(process.stdout);
|
|
240
|
+
}
|
|
241
|
+
if (cursorHidden) {
|
|
242
|
+
process.stdout.write("\x1b[?25h");
|
|
243
|
+
}
|
|
244
|
+
process.stdout.write("\n");
|
|
245
|
+
};
|
|
246
|
+
const onKeypress = (_input, key) => {
|
|
247
|
+
if (key.name === "up") {
|
|
248
|
+
hasNavigated = true;
|
|
249
|
+
selectedIndex = selectedIndex === 0 ? choices.length - 1 : selectedIndex - 1;
|
|
250
|
+
render();
|
|
251
|
+
return;
|
|
252
|
+
}
|
|
253
|
+
if (key.name === "down") {
|
|
254
|
+
hasNavigated = true;
|
|
255
|
+
selectedIndex = (selectedIndex + 1) % choices.length;
|
|
256
|
+
render();
|
|
257
|
+
return;
|
|
258
|
+
}
|
|
259
|
+
if (key.name === "return" || key.name === "enter") {
|
|
260
|
+
cleanup();
|
|
261
|
+
resolve(choices[selectedIndex].value);
|
|
262
|
+
return;
|
|
263
|
+
}
|
|
264
|
+
if (key.ctrl && key.name === "c") {
|
|
265
|
+
cleanup();
|
|
266
|
+
reject(new Error("Setup cancelled."));
|
|
267
|
+
}
|
|
268
|
+
};
|
|
269
|
+
readline.emitKeypressEvents(process.stdin);
|
|
270
|
+
process.stdin.setRawMode(true);
|
|
271
|
+
process.stdin.resume();
|
|
272
|
+
process.stdin.on("keypress", onKeypress);
|
|
273
|
+
render();
|
|
274
|
+
});
|
|
275
|
+
const promptForInput = async (promptText) => new Promise((resolve, reject) => {
|
|
276
|
+
if (!process.stdin.isTTY || !process.stdout.isTTY) {
|
|
277
|
+
reject(new Error("Interactive setup prompt requires a TTY terminal."));
|
|
278
|
+
return;
|
|
279
|
+
}
|
|
280
|
+
const input = readline.createInterface({
|
|
281
|
+
input: process.stdin,
|
|
282
|
+
output: process.stdout
|
|
283
|
+
});
|
|
284
|
+
input.question(`${promptText}: `, (answer) => {
|
|
285
|
+
input.close();
|
|
286
|
+
resolve(answer.trim());
|
|
287
|
+
});
|
|
288
|
+
input.on("SIGINT", () => {
|
|
289
|
+
input.close();
|
|
290
|
+
reject(new Error("Setup cancelled."));
|
|
291
|
+
});
|
|
292
|
+
});
|
|
293
|
+
const configureDatabase = async (projectRoot, options) => {
|
|
294
|
+
await loadProjectEnv(projectRoot);
|
|
295
|
+
let selectedMode = options.databaseModeFlag;
|
|
296
|
+
const configuredMode = resolveConfiguredDatabaseMode();
|
|
297
|
+
const configuredUrl = resolveConfiguredDatabaseUrl();
|
|
298
|
+
const hasEnvFile = await hasPath(path.join(projectRoot, ".env"));
|
|
299
|
+
const shouldPrompt = options.force || (configuredMode === null && !hasEnvFile);
|
|
300
|
+
if (selectedMode === null) {
|
|
301
|
+
if (shouldPrompt && process.stdin.isTTY && process.stdout.isTTY) {
|
|
302
|
+
selectedMode = await promptForChoice("Select database engine", DATABASE_MODE_CHOICES);
|
|
303
|
+
console.log(`${terminal.green("?")} ${bold("Select database engine")} ${terminal.cyan(selectedMode === "sqlite" ? "SQLite (default)" : "PostgreSQL")}`);
|
|
304
|
+
}
|
|
305
|
+
else {
|
|
306
|
+
selectedMode = configuredMode ?? "sqlite";
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
if (selectedMode === "sqlite") {
|
|
310
|
+
await updateProjectEnv(projectRoot, {
|
|
311
|
+
ATRIA_DATABASE_URL: null,
|
|
312
|
+
DATABASE_URL: null
|
|
313
|
+
});
|
|
314
|
+
delete process.env.ATRIA_DATABASE_URL;
|
|
315
|
+
delete process.env.DATABASE_URL;
|
|
316
|
+
await ensureDatabaseReady(projectRoot, {
|
|
317
|
+
ATRIA_DATABASE_URL: undefined,
|
|
318
|
+
DATABASE_URL: undefined
|
|
319
|
+
});
|
|
320
|
+
return "sqlite";
|
|
321
|
+
}
|
|
322
|
+
let postgresUrl = options.databaseUrlFlag ?? (configuredMode === "postgres" ? configuredUrl : null);
|
|
323
|
+
if (!postgresUrl) {
|
|
324
|
+
if (process.stdin.isTTY && process.stdout.isTTY) {
|
|
325
|
+
postgresUrl = await promptForInput("PostgreSQL connection URL");
|
|
326
|
+
}
|
|
327
|
+
else {
|
|
328
|
+
throw new Error("PostgreSQL mode requires --database-url or ATRIA_DATABASE_URL.");
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
if (!isPostgresConnectionString(postgresUrl)) {
|
|
332
|
+
throw new Error('Invalid PostgreSQL URL. Use "postgres://" or "postgresql://".');
|
|
333
|
+
}
|
|
334
|
+
await updateProjectEnv(projectRoot, {
|
|
335
|
+
ATRIA_DATABASE_URL: postgresUrl,
|
|
336
|
+
DATABASE_URL: null
|
|
337
|
+
});
|
|
338
|
+
process.env.ATRIA_DATABASE_URL = postgresUrl;
|
|
339
|
+
delete process.env.DATABASE_URL;
|
|
340
|
+
try {
|
|
341
|
+
await ensureDatabaseReady(projectRoot, {
|
|
342
|
+
ATRIA_DATABASE_URL: postgresUrl,
|
|
343
|
+
DATABASE_URL: undefined
|
|
344
|
+
});
|
|
345
|
+
}
|
|
346
|
+
catch (error) {
|
|
347
|
+
const message = toErrorMessage(error);
|
|
348
|
+
throw new Error(`Failed to connect to PostgreSQL. ${message}`);
|
|
349
|
+
}
|
|
350
|
+
return "postgres";
|
|
351
|
+
};
|
|
352
|
+
const requestStudio = async (requestPath) => new Promise((resolve, reject) => {
|
|
353
|
+
const request = httpRequest({
|
|
354
|
+
protocol: "http:",
|
|
355
|
+
hostname: "localhost",
|
|
356
|
+
port: DEFAULT_DEV_PORT,
|
|
357
|
+
method: "GET",
|
|
358
|
+
path: requestPath,
|
|
359
|
+
headers: {
|
|
360
|
+
host: `studio.localhost:${DEFAULT_DEV_PORT}`,
|
|
361
|
+
accept: "application/json"
|
|
362
|
+
}
|
|
363
|
+
}, (response) => {
|
|
364
|
+
let body = "";
|
|
365
|
+
response.setEncoding("utf8");
|
|
366
|
+
response.on("data", (chunk) => {
|
|
367
|
+
body += chunk;
|
|
368
|
+
});
|
|
369
|
+
response.on("end", () => {
|
|
370
|
+
resolve({
|
|
371
|
+
statusCode: response.statusCode ?? 500,
|
|
372
|
+
headers: response.headers,
|
|
373
|
+
body
|
|
374
|
+
});
|
|
375
|
+
});
|
|
376
|
+
});
|
|
377
|
+
request.on("error", reject);
|
|
378
|
+
request.end();
|
|
379
|
+
});
|
|
380
|
+
const isProviderConfigured = async (provider) => {
|
|
381
|
+
try {
|
|
382
|
+
const response = await requestStudio("/api/auth/providers");
|
|
383
|
+
if (response.statusCode < 200 || response.statusCode >= 300) {
|
|
384
|
+
return false;
|
|
385
|
+
}
|
|
386
|
+
const payload = JSON.parse(response.body);
|
|
387
|
+
return Array.isArray(payload.providers) && payload.providers.includes(provider);
|
|
388
|
+
}
|
|
389
|
+
catch {
|
|
390
|
+
return false;
|
|
391
|
+
}
|
|
392
|
+
};
|
|
393
|
+
const resolveProviderAuthorizationUrl = async (provider) => {
|
|
394
|
+
const response = await requestStudio(`/api/auth/start/${provider}`);
|
|
395
|
+
const locationHeader = response.headers.location;
|
|
396
|
+
const location = Array.isArray(locationHeader) ? locationHeader[0] : locationHeader;
|
|
397
|
+
if (response.statusCode >= 300 && response.statusCode < 400 && typeof location === "string") {
|
|
398
|
+
return location;
|
|
399
|
+
}
|
|
400
|
+
if (response.statusCode >= 400) {
|
|
401
|
+
throw new Error(`Failed to start OAuth for ${authMethodLabel(provider)} (status ${response.statusCode}).`);
|
|
402
|
+
}
|
|
403
|
+
return `http://studio.localhost:${DEFAULT_DEV_PORT}/api/auth/start/${provider}`;
|
|
404
|
+
};
|
|
405
|
+
const requestSetupStatus = async () => {
|
|
406
|
+
try {
|
|
407
|
+
const response = await requestStudio("/api/setup/status");
|
|
408
|
+
if (response.statusCode < 200 || response.statusCode >= 300) {
|
|
409
|
+
return {
|
|
410
|
+
statusCode: response.statusCode,
|
|
411
|
+
payload: null
|
|
412
|
+
};
|
|
413
|
+
}
|
|
414
|
+
return {
|
|
415
|
+
statusCode: response.statusCode,
|
|
416
|
+
payload: JSON.parse(response.body)
|
|
417
|
+
};
|
|
418
|
+
}
|
|
419
|
+
catch {
|
|
420
|
+
return {
|
|
421
|
+
statusCode: 500,
|
|
422
|
+
payload: null
|
|
423
|
+
};
|
|
424
|
+
}
|
|
425
|
+
};
|
|
426
|
+
const startLocalStudioServer = async (projectRoot) => {
|
|
427
|
+
try {
|
|
428
|
+
const server = await startDevServer({
|
|
429
|
+
projectRoot,
|
|
430
|
+
port: DEFAULT_DEV_PORT
|
|
431
|
+
});
|
|
432
|
+
return { server };
|
|
433
|
+
}
|
|
434
|
+
catch (error) {
|
|
435
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
436
|
+
if (message.includes("EADDRINUSE")) {
|
|
437
|
+
return { server: null };
|
|
438
|
+
}
|
|
439
|
+
throw error;
|
|
440
|
+
}
|
|
441
|
+
};
|
|
442
|
+
const waitForSetupCompletion = async (abortSignal) => {
|
|
443
|
+
while (!abortSignal.cancelled) {
|
|
444
|
+
const setupStatus = await requestSetupStatus();
|
|
445
|
+
if (setupStatus.statusCode >= 200 && setupStatus.statusCode < 300) {
|
|
446
|
+
if (setupStatus.payload?.pending === false) {
|
|
447
|
+
return true;
|
|
448
|
+
}
|
|
449
|
+
}
|
|
450
|
+
await sleep(1200);
|
|
451
|
+
}
|
|
452
|
+
return false;
|
|
453
|
+
};
|
|
454
|
+
const startWaitingSpinner = (message) => {
|
|
455
|
+
if (!process.stdout.isTTY) {
|
|
456
|
+
console.log(`${terminal.cyan("⋮")} ${message}`);
|
|
457
|
+
return {
|
|
458
|
+
stop: () => { }
|
|
459
|
+
};
|
|
460
|
+
}
|
|
461
|
+
const frames = ["⠇", "⠏", "⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧"];
|
|
462
|
+
let frameIndex = 0;
|
|
463
|
+
let printedLength = 0;
|
|
464
|
+
const render = () => {
|
|
465
|
+
const line = `${terminal.cyan(`${frames[frameIndex]}`)} ${message}`;
|
|
466
|
+
frameIndex = (frameIndex + 1) % frames.length;
|
|
467
|
+
const paddedLine = printedLength > line.length ? `${line}${" ".repeat(printedLength - line.length)}` : line;
|
|
468
|
+
printedLength = Math.max(printedLength, line.length);
|
|
469
|
+
process.stdout.write(`\r${paddedLine}`);
|
|
470
|
+
};
|
|
471
|
+
render();
|
|
472
|
+
const timer = setInterval(render, 90);
|
|
473
|
+
return {
|
|
474
|
+
stop: () => {
|
|
475
|
+
clearInterval(timer);
|
|
476
|
+
process.stdout.write(`\r${" ".repeat(printedLength)}\r`);
|
|
477
|
+
}
|
|
478
|
+
};
|
|
479
|
+
};
|
|
480
|
+
const isOAuthMethod = (authMethod) => authMethod === "google" || authMethod === "github";
|
|
481
|
+
const runOAuthSetupFlow = async (projectRoot, authMethod) => {
|
|
482
|
+
await loadProjectEnv(projectRoot);
|
|
483
|
+
const { server } = await startLocalStudioServer(projectRoot);
|
|
484
|
+
try {
|
|
485
|
+
const providerConfigured = await isProviderConfigured(authMethod);
|
|
486
|
+
if (!providerConfigured) {
|
|
487
|
+
console.log(`${terminal.cyan("⋮")} OAuth provider ${terminal.cyan(authMethodLabel(authMethod))} is not available right now.`);
|
|
488
|
+
return;
|
|
489
|
+
}
|
|
490
|
+
const authorizationUrl = await resolveProviderAuthorizationUrl(authMethod);
|
|
491
|
+
console.log(`Opening browser at ${authorizationUrl}`);
|
|
492
|
+
const opened = await openBrowser(authorizationUrl);
|
|
493
|
+
if (!opened) {
|
|
494
|
+
console.log(`${terminal.cyan("⋮")} Open this URL manually: ${authorizationUrl}`);
|
|
495
|
+
}
|
|
496
|
+
const spinnerMessage = "Waiting for browser login to complete... Press Ctrl + C to cancel";
|
|
497
|
+
let waitingSpinner = startWaitingSpinner(spinnerMessage);
|
|
498
|
+
const abortSignal = { cancelled: false };
|
|
499
|
+
const handleSigInt = () => {
|
|
500
|
+
abortSignal.cancelled = true;
|
|
501
|
+
};
|
|
502
|
+
process.once("SIGINT", handleSigInt);
|
|
503
|
+
try {
|
|
504
|
+
await waitForSetupCompletion(abortSignal);
|
|
505
|
+
}
|
|
506
|
+
finally {
|
|
507
|
+
process.off("SIGINT", handleSigInt);
|
|
508
|
+
if (waitingSpinner) {
|
|
509
|
+
waitingSpinner.stop();
|
|
510
|
+
waitingSpinner = null;
|
|
511
|
+
}
|
|
512
|
+
}
|
|
513
|
+
}
|
|
514
|
+
finally {
|
|
515
|
+
if (server) {
|
|
516
|
+
await server.close();
|
|
517
|
+
}
|
|
518
|
+
}
|
|
519
|
+
};
|
|
520
|
+
const promptForAuthMethod = async () => promptForChoice("Please log in or create a new account", AUTH_METHOD_CHOICES);
|
|
521
|
+
const readOwnerSetupState = async (projectRoot) => {
|
|
522
|
+
const database = openAtriaDatabase(projectRoot);
|
|
523
|
+
try {
|
|
524
|
+
return await database.getOwnerSetupState();
|
|
525
|
+
}
|
|
526
|
+
finally {
|
|
527
|
+
await database.close();
|
|
528
|
+
}
|
|
529
|
+
};
|
|
530
|
+
const writePreferredAuthMethod = async (projectRoot, authMethod) => {
|
|
531
|
+
const database = openAtriaDatabase(projectRoot);
|
|
532
|
+
try {
|
|
533
|
+
await database.setPreferredAuthMethod(authMethod);
|
|
534
|
+
}
|
|
535
|
+
finally {
|
|
536
|
+
await database.close();
|
|
537
|
+
}
|
|
538
|
+
};
|
|
539
|
+
export const runSetupCommand = async (args) => {
|
|
540
|
+
const parsedArgs = parseArgs(args);
|
|
541
|
+
if (parsedArgs.flags.help) {
|
|
542
|
+
printSetupHelp();
|
|
543
|
+
return;
|
|
544
|
+
}
|
|
545
|
+
if (parsedArgs.flags.complete === true) {
|
|
546
|
+
throw new Error('Option "--complete" was removed. Setup completion is now derived from database users.');
|
|
547
|
+
}
|
|
548
|
+
const targetArgument = parsedArgs.positionals[0] ?? ".";
|
|
549
|
+
const projectRoot = path.resolve(process.cwd(), targetArgument);
|
|
550
|
+
const force = parsedArgs.flags.force === true;
|
|
551
|
+
const databaseOnly = parsedArgs.flags["database-only"] === true;
|
|
552
|
+
const databaseUrlFromFlag = typeof parsedArgs.flags["database-url"] === "string"
|
|
553
|
+
? cleanEnvValue(String(parsedArgs.flags["database-url"]))
|
|
554
|
+
: null;
|
|
555
|
+
let databaseModeFromFlag = typeof parsedArgs.flags.database === "string"
|
|
556
|
+
? parseDatabaseMode(String(parsedArgs.flags.database).toLowerCase())
|
|
557
|
+
: null;
|
|
558
|
+
if (databaseUrlFromFlag && databaseModeFromFlag === null) {
|
|
559
|
+
databaseModeFromFlag = "postgres";
|
|
560
|
+
}
|
|
561
|
+
const authMethodFromFlag = typeof parsedArgs.flags["auth-method"] === "string"
|
|
562
|
+
? parseAuthMethod(String(parsedArgs.flags["auth-method"]).toLowerCase())
|
|
563
|
+
: null;
|
|
564
|
+
if (parsedArgs.flags.database && databaseModeFromFlag === null) {
|
|
565
|
+
throw new Error('Invalid --database value. Use "sqlite" or "postgres".');
|
|
566
|
+
}
|
|
567
|
+
if (databaseModeFromFlag === "sqlite" && databaseUrlFromFlag) {
|
|
568
|
+
throw new Error('Option --database-url requires --database postgres.');
|
|
569
|
+
}
|
|
570
|
+
if (parsedArgs.flags["database-url"] && !databaseUrlFromFlag) {
|
|
571
|
+
throw new Error('Option --database-url requires a non-empty PostgreSQL URL.');
|
|
572
|
+
}
|
|
573
|
+
if (parsedArgs.flags["auth-method"] && authMethodFromFlag === null) {
|
|
574
|
+
throw new Error('Invalid --auth-method value. Use "google", "github", or "email".');
|
|
575
|
+
}
|
|
576
|
+
await configureDatabase(projectRoot, {
|
|
577
|
+
force,
|
|
578
|
+
databaseModeFlag: databaseModeFromFlag,
|
|
579
|
+
databaseUrlFlag: databaseUrlFromFlag
|
|
580
|
+
});
|
|
581
|
+
if (databaseOnly) {
|
|
582
|
+
return;
|
|
583
|
+
}
|
|
584
|
+
const existingSetupState = await readOwnerSetupState(projectRoot);
|
|
585
|
+
if (!existingSetupState.pending && !force && authMethodFromFlag === null) {
|
|
586
|
+
return;
|
|
587
|
+
}
|
|
588
|
+
if (existingSetupState.preferredAuthMethod && !force && authMethodFromFlag === null) {
|
|
589
|
+
return;
|
|
590
|
+
}
|
|
591
|
+
let selectedAuthMethod = authMethodFromFlag;
|
|
592
|
+
let selectedViaPrompt = false;
|
|
593
|
+
if (selectedAuthMethod === null && process.stdin.isTTY && process.stdout.isTTY) {
|
|
594
|
+
selectedAuthMethod = await promptForAuthMethod();
|
|
595
|
+
selectedViaPrompt = true;
|
|
596
|
+
}
|
|
597
|
+
await writePreferredAuthMethod(projectRoot, selectedAuthMethod);
|
|
598
|
+
if (selectedAuthMethod !== null && selectedViaPrompt) {
|
|
599
|
+
const selectedLabel = authMethodLabel(selectedAuthMethod);
|
|
600
|
+
console.log(`${terminal.green("?")} ${bold("Please log in or create a new account")} ${terminal.cyan(selectedLabel)}`);
|
|
601
|
+
if (isOAuthMethod(selectedAuthMethod)) {
|
|
602
|
+
await runOAuthSetupFlow(projectRoot, selectedAuthMethod);
|
|
603
|
+
return;
|
|
604
|
+
}
|
|
605
|
+
console.log(`${terminal.cyan("⋮")} Email/password setup is coming soon.`);
|
|
606
|
+
}
|
|
607
|
+
};
|
|
608
|
+
//# sourceMappingURL=setup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/commands/setup.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
import { runDevCommand } from "./commands/dev.js";
|
|
2
2
|
import { runInitCommand } from "./commands/init.js";
|
|
3
|
+
import { runSetupCommand } from "./commands/setup.js";
|
|
3
4
|
const printHelp = () => {
|
|
4
5
|
console.log("atria CLI");
|
|
5
6
|
console.log("");
|
|
6
7
|
console.log("Commands:");
|
|
7
8
|
console.log(" atria init [project-directory] [--force]");
|
|
8
9
|
console.log(" atria dev [project-directory] [--port 3333]");
|
|
10
|
+
console.log(" atria setup [project-directory] [--database sqlite|postgres] [--database-url <postgres-url>] [--database-only] [--auth-method google|github|email] [--force]");
|
|
9
11
|
};
|
|
10
12
|
export const runCli = async (argv) => {
|
|
11
13
|
const command = argv[2];
|
|
@@ -22,6 +24,10 @@ export const runCli = async (argv) => {
|
|
|
22
24
|
await runDevCommand(args);
|
|
23
25
|
return;
|
|
24
26
|
}
|
|
27
|
+
if (command === "setup") {
|
|
28
|
+
await runSetupCommand(args);
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
25
31
|
throw new Error(`Unknown command "${command}". Run "atria --help" for usage.`);
|
|
26
32
|
};
|
|
27
33
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAEtD,MAAM,SAAS,GAAG,GAAS,EAAE;IAC3B,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IACzB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IACzB,OAAO,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC;IAC1D,OAAO,CAAC,GAAG,CAAC,+CAA+C,CAAC,CAAC;IAC7D,OAAO,CAAC,GAAG,CAAC,gKAAgK,CAAC,CAAC;AAChL,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,MAAM,GAAG,KAAK,EAAE,IAAc,EAAiB,EAAE;IAC5D,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACxB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAE3B,IAAI,CAAC,OAAO,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,KAAK,QAAQ,EAAE,CAAC;QACzD,SAAS,EAAE,CAAC;QACZ,OAAO;IACT,CAAC;IAED,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;QACvB,MAAM,cAAc,CAAC,IAAI,CAAC,CAAC;QAC3B,OAAO;IACT,CAAC;IAED,IAAI,OAAO,KAAK,KAAK,EAAE,CAAC;QACtB,MAAM,aAAa,CAAC,IAAI,CAAC,CAAC;QAC1B,OAAO;IACT,CAAC;IAED,IAAI,OAAO,KAAK,OAAO,EAAE,CAAC;QACxB,MAAM,eAAe,CAAC,IAAI,CAAC,CAAC;QAC5B,OAAO;IACT,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,oBAAoB,OAAO,kCAAkC,CAAC,CAAC;AACjF,CAAC,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { type WriteStatus } from "../utils/fs.js";
|
|
2
|
+
interface RuntimeBootstrapWriteResult {
|
|
3
|
+
indexStatus: WriteStatus;
|
|
4
|
+
appStatus: WriteStatus;
|
|
5
|
+
}
|
|
6
|
+
export declare const writeRuntimeBootstrapFiles: (projectRoot: string, force?: boolean) => Promise<RuntimeBootstrapWriteResult>;
|
|
7
|
+
export {};
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { ATRIA_RUNTIME_DIR, runtimeAppJs, runtimeIndexHtml } from "@atria/shared";
|
|
3
|
+
import { writeFile } from "../utils/fs.js";
|
|
4
|
+
export const writeRuntimeBootstrapFiles = async (projectRoot, force = false) => {
|
|
5
|
+
const runtimeIndexPath = path.join(projectRoot, ATRIA_RUNTIME_DIR, "index.html");
|
|
6
|
+
const runtimeAppPath = path.join(projectRoot, ATRIA_RUNTIME_DIR, "app.js");
|
|
7
|
+
const [indexStatus, appStatus] = await Promise.all([
|
|
8
|
+
writeFile(runtimeIndexPath, runtimeIndexHtml, force),
|
|
9
|
+
writeFile(runtimeAppPath, runtimeAppJs, force)
|
|
10
|
+
]);
|
|
11
|
+
return {
|
|
12
|
+
indexStatus,
|
|
13
|
+
appStatus
|
|
14
|
+
};
|
|
15
|
+
};
|
|
16
|
+
//# sourceMappingURL=bootstrap.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../../src/runtime/bootstrap.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAClF,OAAO,EAAoB,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAO7D,MAAM,CAAC,MAAM,0BAA0B,GAAG,KAAK,EAC7C,WAAmB,EACnB,KAAK,GAAG,KAAK,EACyB,EAAE;IACxC,MAAM,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,iBAAiB,EAAE,YAAY,CAAC,CAAC;IACjF,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,iBAAiB,EAAE,QAAQ,CAAC,CAAC;IAE3E,MAAM,CAAC,WAAW,EAAE,SAAS,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QACjD,SAAS,CAAC,gBAAgB,EAAE,gBAAgB,EAAE,KAAK,CAAC;QACpD,SAAS,CAAC,cAAc,EAAE,YAAY,EAAE,KAAK,CAAC;KAC/C,CAAC,CAAC;IAEH,OAAO;QACL,WAAW;QACX,SAAS;KACV,CAAC;AACJ,CAAC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@atria/cli",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.14",
|
|
4
4
|
"description": "CLI for atria project bootstrap and development",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"atria",
|
|
@@ -27,8 +27,9 @@
|
|
|
27
27
|
"dist"
|
|
28
28
|
],
|
|
29
29
|
"dependencies": {
|
|
30
|
-
"@atria/
|
|
31
|
-
"@atria/
|
|
30
|
+
"@atria/db": "0.0.6",
|
|
31
|
+
"@atria/server": "0.0.12",
|
|
32
|
+
"@atria/shared": "0.0.10"
|
|
32
33
|
},
|
|
33
34
|
"publishConfig": {
|
|
34
35
|
"access": "public"
|