hatchkit 0.1.2 → 0.1.3
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/completion.d.ts +2 -0
- package/dist/completion.d.ts.map +1 -0
- package/dist/completion.js +207 -0
- package/dist/completion.js.map +1 -0
- package/dist/config.d.ts +33 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +439 -127
- package/dist/config.js.map +1 -1
- package/dist/deploy/keys.d.ts +6 -2
- package/dist/deploy/keys.d.ts.map +1 -1
- package/dist/deploy/keys.js +16 -2
- package/dist/deploy/keys.js.map +1 -1
- package/dist/deploy/pages.d.ts +2 -0
- package/dist/deploy/pages.d.ts.map +1 -0
- package/dist/deploy/pages.js +537 -0
- package/dist/deploy/pages.js.map +1 -0
- package/dist/deploy/rename-domain.d.ts +55 -0
- package/dist/deploy/rename-domain.d.ts.map +1 -0
- package/dist/deploy/rename-domain.js +290 -0
- package/dist/deploy/rename-domain.js.map +1 -0
- package/dist/deploy/terraform.d.ts.map +1 -1
- package/dist/deploy/terraform.js +90 -0
- package/dist/deploy/terraform.js.map +1 -1
- package/dist/dns.d.ts +7 -0
- package/dist/dns.d.ts.map +1 -0
- package/dist/dns.js +124 -0
- package/dist/dns.js.map +1 -0
- package/dist/doctor.d.ts +13 -0
- package/dist/doctor.d.ts.map +1 -0
- package/dist/doctor.js +368 -0
- package/dist/doctor.js.map +1 -0
- package/dist/explain.d.ts +4 -0
- package/dist/explain.d.ts.map +1 -0
- package/dist/explain.js +173 -0
- package/dist/explain.js.map +1 -0
- package/dist/index.js +477 -46
- package/dist/index.js.map +1 -1
- package/dist/provision/glitchtip.d.ts +3 -0
- package/dist/provision/glitchtip.d.ts.map +1 -1
- package/dist/provision/glitchtip.js +18 -0
- package/dist/provision/glitchtip.js.map +1 -1
- package/dist/provision/index.d.ts +26 -0
- package/dist/provision/index.d.ts.map +1 -1
- package/dist/provision/index.js +435 -60
- package/dist/provision/index.js.map +1 -1
- package/dist/provision/openpanel.d.ts +7 -0
- package/dist/provision/openpanel.d.ts.map +1 -1
- package/dist/provision/openpanel.js +113 -48
- package/dist/provision/openpanel.js.map +1 -1
- package/dist/provision/resend.d.ts +23 -1
- package/dist/provision/resend.d.ts.map +1 -1
- package/dist/provision/resend.js +62 -1
- package/dist/provision/resend.js.map +1 -1
- package/dist/provision/write-env.d.ts +31 -0
- package/dist/provision/write-env.d.ts.map +1 -0
- package/dist/provision/write-env.js +94 -0
- package/dist/provision/write-env.js.map +1 -0
- package/dist/scaffold/infra.d.ts.map +1 -1
- package/dist/scaffold/infra.js +18 -1
- package/dist/scaffold/infra.js.map +1 -1
- package/dist/status.d.ts +30 -0
- package/dist/status.d.ts.map +1 -0
- package/dist/status.js +169 -0
- package/dist/status.js.map +1 -0
- package/dist/templates/addons/analytics/sentry.ts.hbs +6 -0
- package/dist/utils/cloudflare-api.d.ts +30 -0
- package/dist/utils/cloudflare-api.d.ts.map +1 -0
- package/dist/utils/cloudflare-api.js +85 -0
- package/dist/utils/cloudflare-api.js.map +1 -0
- package/dist/utils/coolify-api.d.ts +3 -1
- package/dist/utils/coolify-api.d.ts.map +1 -1
- package/dist/utils/coolify-api.js +29 -4
- package/dist/utils/coolify-api.js.map +1 -1
- package/dist/utils/inwx-api.d.ts +36 -0
- package/dist/utils/inwx-api.d.ts.map +1 -0
- package/dist/utils/inwx-api.js +105 -0
- package/dist/utils/inwx-api.js.map +1 -0
- package/dist/utils/secrets.d.ts +8 -1
- package/dist/utils/secrets.d.ts.map +1 -1
- package/dist/utils/secrets.js +8 -1
- package/dist/utils/secrets.js.map +1 -1
- package/package.json +1 -1
package/dist/provision/index.js
CHANGED
|
@@ -1,80 +1,403 @@
|
|
|
1
1
|
/*
|
|
2
|
-
* Provision orchestrator
|
|
3
|
-
* creates `-dev` and `-prod` clients in each selected service
|
|
4
|
-
* (GlitchTip / OpenPanel / Resend) and prints an env block ready to
|
|
5
|
-
* paste into an existing project.
|
|
2
|
+
* Provision orchestrator.
|
|
6
3
|
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
4
|
+
* Model:
|
|
5
|
+
* · GlitchTip and OpenPanel are "observability" providers. Per
|
|
6
|
+
* product, one project handles all environments — events are
|
|
7
|
+
* tagged with `environment: ...` on the SDK side, so dev/staging/
|
|
8
|
+
* prod share the same DSN/client credentials. This keeps the
|
|
9
|
+
* dashboards clean even as more envs get added.
|
|
10
|
+
* · Observability credentials are written to `.env.production`
|
|
11
|
+
* ONLY by default. Most teams don't want dev events polluting
|
|
12
|
+
* their real error / analytics metrics. Opt in via
|
|
13
|
+
* `--enable-dev-obs` when you need to debug the SDK wiring.
|
|
14
|
+
* · Resend is different: dev and prod keys are genuinely separated
|
|
15
|
+
* so a bug in dev can't email real users. We still mint two keys
|
|
16
|
+
* (`<name>-dev` / `<name>-prod`) and write them into the server's
|
|
17
|
+
* dev/prod env respectively.
|
|
18
|
+
* · Surfaces: a project can have a server, a client, or both. When
|
|
19
|
+
* both, the common case is a single shared GlitchTip/OpenPanel
|
|
20
|
+
* project (same DSN on both SDKs, each tagged automatically by
|
|
21
|
+
* `sdk.name`). Strict-isolation setups can opt into two projects
|
|
22
|
+
* via `Surfaces.mode = "separate"`.
|
|
23
|
+
*
|
|
24
|
+
* A 0600-permission cache copy of every written env is kept under
|
|
25
|
+
* ~/<conf-dir>/provisioned/ for recoverability. Secret values never
|
|
26
|
+
* touch stdout.
|
|
10
27
|
*/
|
|
11
|
-
import { existsSync, mkdirSync, writeFileSync } from "node:fs";
|
|
12
|
-
import { dirname, join } from "node:path";
|
|
13
|
-
import { select } from "@inquirer/prompts";
|
|
28
|
+
import { existsSync, mkdirSync, rmSync, writeFileSync } from "node:fs";
|
|
29
|
+
import { dirname, join, relative, resolve } from "node:path";
|
|
30
|
+
import { confirm, input, select } from "@inquirer/prompts";
|
|
14
31
|
import chalk from "chalk";
|
|
15
|
-
import { getConfigPath } from "../config.js";
|
|
32
|
+
import { ensureGlitchtip, ensureOpenpanel, ensureResend, getConfigPath } from "../config.js";
|
|
16
33
|
import { validateProjectName } from "../utils/validate.js";
|
|
17
|
-
import { provisionGlitchtipClient } from "./glitchtip.js";
|
|
18
|
-
import { provisionOpenpanelClient } from "./openpanel.js";
|
|
19
|
-
import { listResendDomains, provisionResendClient } from "./resend.js";
|
|
34
|
+
import { deleteGlitchtipClient, provisionGlitchtipClient, } from "./glitchtip.js";
|
|
35
|
+
import { deleteOpenpanelClient, provisionOpenpanelClient, } from "./openpanel.js";
|
|
36
|
+
import { createResendDomain, deleteResendClient, listResendDomains, normalizeDomainInput, provisionResendClient, } from "./resend.js";
|
|
37
|
+
import { parseEnvLines, writeDevEnv, writeProdEnv } from "./write-env.js";
|
|
20
38
|
export async function runProvision(opts) {
|
|
21
39
|
const nameCheck = validateProjectName(opts.baseName);
|
|
22
40
|
if (nameCheck !== true)
|
|
23
41
|
throw new Error(`Invalid base name: ${nameCheck}`);
|
|
42
|
+
// Ensure every selected provider is configured *before* any spinner
|
|
43
|
+
// starts. Otherwise a lazy `ensure*` prompt fires underneath the ora
|
|
44
|
+
// spinner and inquirer waits forever for invisible input.
|
|
45
|
+
if (opts.services.includes("glitchtip"))
|
|
46
|
+
await ensureGlitchtip();
|
|
47
|
+
if (opts.services.includes("openpanel"))
|
|
48
|
+
await ensureOpenpanel();
|
|
49
|
+
if (opts.services.includes("resend"))
|
|
50
|
+
await ensureResend();
|
|
51
|
+
const surfaces = await resolveSurfaces(opts);
|
|
52
|
+
const enableDevObs = opts.enableDevObs ?? false;
|
|
24
53
|
// Resend domain: pick once, reused across dev + prod.
|
|
25
54
|
let resendDomainId = opts.resendDomainId;
|
|
26
55
|
if (opts.services.includes("resend") && !resendDomainId) {
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
56
|
+
resendDomainId = await pickResendDomain();
|
|
57
|
+
}
|
|
58
|
+
const buckets = initBuckets(surfaces);
|
|
59
|
+
console.log(chalk.bold(`\n ── Provisioning ${opts.baseName} ──────────────────────────\n`));
|
|
60
|
+
// ── GlitchTip ──
|
|
61
|
+
if (opts.services.includes("glitchtip")) {
|
|
62
|
+
if (surfaces?.mode === "separate") {
|
|
63
|
+
for (const side of ["server", "client"]) {
|
|
64
|
+
const projectName = `${opts.baseName}-${side}`;
|
|
65
|
+
const res = await withSpinner(`GlitchTip: creating project ${projectName}`, () => provisionGlitchtipClient(projectName));
|
|
66
|
+
pushObsLines(buckets, side, renderGlitchtipEnv(res, side === "client"), enableDevObs);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
const projectName = opts.baseName;
|
|
71
|
+
const res = await withSpinner(`GlitchTip: creating project ${projectName}`, () => provisionGlitchtipClient(projectName));
|
|
72
|
+
// Shared-DSN case: the server SDK reads GLITCHTIP_DSN; the client
|
|
73
|
+
// SDK reads GLITCHTIP_DSN_CLIENT (same value). Both SDKs tag
|
|
74
|
+
// events with `sdk.name`, so filtering by surface in the UI is
|
|
75
|
+
// automatic.
|
|
76
|
+
if (surfaces && (surfaces.mode === "shared" || surfaces.mode === "server-only")) {
|
|
77
|
+
pushObsLines(buckets, "server", renderGlitchtipEnv(res, false), enableDevObs);
|
|
78
|
+
}
|
|
79
|
+
if (surfaces && (surfaces.mode === "shared" || surfaces.mode === "client-only")) {
|
|
80
|
+
pushObsLines(buckets, "client", renderGlitchtipEnv(res, true), enableDevObs);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
// ── OpenPanel ──
|
|
85
|
+
if (opts.services.includes("openpanel")) {
|
|
86
|
+
if (surfaces?.mode === "separate") {
|
|
87
|
+
for (const side of ["server", "client"]) {
|
|
88
|
+
const projectName = `${opts.baseName}-${side}`;
|
|
89
|
+
const res = await withSpinner(`OpenPanel: creating project ${projectName}`, () => provisionOpenpanelClient(projectName));
|
|
90
|
+
pushObsLines(buckets, side, renderOpenpanelEnv(res, side === "client"), enableDevObs);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
const projectName = opts.baseName;
|
|
95
|
+
const res = await withSpinner(`OpenPanel: creating project ${projectName}`, () => provisionOpenpanelClient(projectName));
|
|
96
|
+
if (surfaces && (surfaces.mode === "shared" || surfaces.mode === "server-only")) {
|
|
97
|
+
pushObsLines(buckets, "server", renderOpenpanelEnv(res, false), enableDevObs);
|
|
98
|
+
}
|
|
99
|
+
if (surfaces && (surfaces.mode === "shared" || surfaces.mode === "client-only")) {
|
|
100
|
+
pushObsLines(buckets, "client", renderOpenpanelEnv(res, true), enableDevObs);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
// ── Resend ── (always server-side; dev/prod keys are not observability)
|
|
105
|
+
if (opts.services.includes("resend")) {
|
|
106
|
+
const serverBucket = buckets.find((b) => b.label === "server");
|
|
107
|
+
if (!serverBucket) {
|
|
108
|
+
console.log(chalk.yellow(` Skipping Resend — this project has no server surface, so there's nowhere to put RESEND_API_KEY.`));
|
|
31
109
|
}
|
|
32
110
|
else {
|
|
33
|
-
const
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
resendDomainId = picked;
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
const sections = [];
|
|
45
|
-
for (const env of ["dev", "prod"]) {
|
|
46
|
-
const clientName = `${opts.baseName}-${env}`;
|
|
47
|
-
console.log(chalk.bold(`\n ── ${clientName} ──────────────────────────────────────────\n`));
|
|
48
|
-
const lines = [];
|
|
49
|
-
if (opts.services.includes("glitchtip")) {
|
|
50
|
-
const res = await withSpinner(`GlitchTip: creating project ${clientName}`, () => provisionGlitchtipClient(clientName));
|
|
51
|
-
lines.push(...renderGlitchtipEnv(res));
|
|
52
|
-
}
|
|
53
|
-
if (opts.services.includes("openpanel")) {
|
|
54
|
-
const res = await withSpinner(`OpenPanel: creating client ${clientName}`, () => provisionOpenpanelClient(clientName));
|
|
55
|
-
lines.push(...renderOpenpanelEnv(res));
|
|
56
|
-
}
|
|
57
|
-
if (opts.services.includes("resend")) {
|
|
58
|
-
const res = await withSpinner(`Resend: creating restricted API key ${clientName}`, () => provisionResendClient(clientName, resendDomainId));
|
|
59
|
-
lines.push(...renderResendEnv(res));
|
|
60
|
-
}
|
|
61
|
-
sections.push({ env, lines });
|
|
111
|
+
const devRes = await withSpinner(`Resend: creating restricted API key ${opts.baseName}-dev`, () => provisionResendClient(`${opts.baseName}-dev`, resendDomainId));
|
|
112
|
+
const prodRes = await withSpinner(`Resend: creating restricted API key ${opts.baseName}-prod`, () => provisionResendClient(`${opts.baseName}-prod`, resendDomainId));
|
|
113
|
+
// Resend is the one case where dev gets its OWN value, not the
|
|
114
|
+
// prod value — dev keys are audience-restricted so they can't
|
|
115
|
+
// email real users.
|
|
116
|
+
serverBucket.devLines.push(...renderResendEnv(devRes));
|
|
117
|
+
serverBucket.prodLines.push(...renderResendEnv(prodRes));
|
|
118
|
+
}
|
|
62
119
|
}
|
|
120
|
+
// Persist 0600 cache copies keyed by surface label.
|
|
63
121
|
const outDir = join(dirname(getConfigPath()), "provisioned");
|
|
64
122
|
if (!existsSync(outDir))
|
|
65
123
|
mkdirSync(outDir, { recursive: true });
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
124
|
+
for (const b of buckets) {
|
|
125
|
+
for (const phase of ["dev", "prod"]) {
|
|
126
|
+
const lines = phase === "dev" ? b.devLines : b.prodLines;
|
|
127
|
+
if (lines.length === 0)
|
|
128
|
+
continue;
|
|
129
|
+
const path = join(outDir, `${opts.baseName}.${b.label}.${phase}.env`);
|
|
130
|
+
const banner = `# --- ${opts.baseName} / ${b.label} / ${phase} ---`;
|
|
131
|
+
writeFileSync(path, `${banner}\n${lines.join("\n")}\n`, { mode: 0o600 });
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
// Cache-only mode (surfaces === false or user said no to write):
|
|
135
|
+
// summarize + point at cache files.
|
|
136
|
+
if (surfaces === null) {
|
|
137
|
+
console.log(chalk.bold("\n ── Provisioned ────────────────────────────────────────────\n"));
|
|
138
|
+
for (const b of buckets) {
|
|
139
|
+
const prodKeys = parseEnvLines(b.prodLines).map((p) => p.key);
|
|
140
|
+
const devKeys = parseEnvLines(b.devLines).map((p) => p.key);
|
|
141
|
+
if (prodKeys.length > 0 || devKeys.length > 0) {
|
|
142
|
+
console.log(` ${chalk.bold(b.label)}:`);
|
|
143
|
+
if (prodKeys.length > 0) {
|
|
144
|
+
console.log(` prod: ${chalk.green(`${prodKeys.length} vars`)} ${chalk.dim(prodKeys.join(", "))}`);
|
|
145
|
+
}
|
|
146
|
+
if (devKeys.length > 0) {
|
|
147
|
+
console.log(` dev: ${chalk.green(`${devKeys.length} vars`)} ${chalk.dim(devKeys.join(", "))}`);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
console.log(chalk.yellow(`\n Values cached at ${outDir}/${opts.baseName}.*.env (mode 0600).\n` +
|
|
152
|
+
` Read them with \`cat\` or re-run with a project directory to write directly.\n`));
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
// Write values into the resolved directories.
|
|
156
|
+
console.log(chalk.bold("\n ── Writing env into the project ──────────────────────────\n"));
|
|
157
|
+
for (const b of buckets) {
|
|
158
|
+
const prodPairs = parseEnvLines(b.prodLines);
|
|
159
|
+
const devPairs = parseEnvLines(b.devLines);
|
|
160
|
+
if (prodPairs.length === 0 && devPairs.length === 0)
|
|
161
|
+
continue;
|
|
162
|
+
const relLabel = chalk.dim(`${b.label} → ${relativeTo(b.envDir)}`);
|
|
163
|
+
console.log(` ${chalk.bold(b.label)} ${relLabel}`);
|
|
164
|
+
if (prodPairs.length > 0) {
|
|
165
|
+
const prodPath = join(b.envDir, ".env.production");
|
|
166
|
+
const keys = writeProdEnv(prodPath, prodPairs);
|
|
167
|
+
console.log(` ${chalk.green("✓")} .env.production (encrypted) ${chalk.dim(keys.join(", "))}`);
|
|
168
|
+
}
|
|
169
|
+
if (devPairs.length > 0) {
|
|
170
|
+
const devPath = join(b.envDir, ".env.development");
|
|
171
|
+
const keys = writeDevEnv(devPath, devPairs);
|
|
172
|
+
console.log(` ${chalk.green("✓")} .env.development ${chalk.dim("(plaintext, gitignored)")} ${chalk.dim(keys.join(", "))}`);
|
|
173
|
+
}
|
|
76
174
|
}
|
|
77
175
|
console.log();
|
|
176
|
+
if (!enableDevObs &&
|
|
177
|
+
(opts.services.includes("glitchtip") || opts.services.includes("openpanel"))) {
|
|
178
|
+
console.log(chalk.dim(" Note: observability (GlitchTip/OpenPanel) values went to prod only.\n" +
|
|
179
|
+
" Dev errors/events would pollute real metrics — pass --enable-dev-obs to\n" +
|
|
180
|
+
" also populate .env.development when you need to debug SDK wiring."));
|
|
181
|
+
}
|
|
182
|
+
console.log(chalk.dim(`\n Cached copies (0600): ${outDir}/${opts.baseName}.*.env\n`));
|
|
183
|
+
}
|
|
184
|
+
// ---------------------------------------------------------------------------
|
|
185
|
+
// Surface resolution
|
|
186
|
+
// ---------------------------------------------------------------------------
|
|
187
|
+
/** Resolve the Surfaces config. Returns the concrete surfaces on
|
|
188
|
+
* success, or `null` when the user opted out of writing (cache-only
|
|
189
|
+
* mode). */
|
|
190
|
+
async function resolveSurfaces(opts) {
|
|
191
|
+
if (opts.surfaces === false)
|
|
192
|
+
return null;
|
|
193
|
+
if (opts.surfaces)
|
|
194
|
+
return opts.surfaces;
|
|
195
|
+
// Step 1 — project dir. Default to `./<baseName>` if it exists.
|
|
196
|
+
const guess = resolve(opts.baseName);
|
|
197
|
+
const guessExists = existsSync(guess);
|
|
198
|
+
const wantWrite = await confirm({
|
|
199
|
+
message: guessExists
|
|
200
|
+
? `Write values into ${chalk.cyan(relativeTo(guess))} (prod → encrypted .env.production)?`
|
|
201
|
+
: `Write values into a project directory?`,
|
|
202
|
+
default: true,
|
|
203
|
+
});
|
|
204
|
+
if (!wantWrite)
|
|
205
|
+
return null;
|
|
206
|
+
const projectDir = resolve((await input({
|
|
207
|
+
message: "Project directory (relative to cwd):",
|
|
208
|
+
default: guessExists ? relativeTo(guess) : `./${opts.baseName}`,
|
|
209
|
+
validate: (v) => {
|
|
210
|
+
const abs = resolve(v.trim());
|
|
211
|
+
return existsSync(abs) ? true : `No such directory: ${abs}`;
|
|
212
|
+
},
|
|
213
|
+
})).trim());
|
|
214
|
+
// Step 2 — surfaces.
|
|
215
|
+
const mode = (await select({
|
|
216
|
+
message: "What surfaces does this project have?",
|
|
217
|
+
choices: [
|
|
218
|
+
{
|
|
219
|
+
name: "Server + client — shared observability project (recommended)",
|
|
220
|
+
value: "shared",
|
|
221
|
+
},
|
|
222
|
+
{ name: "Server only", value: "server-only" },
|
|
223
|
+
{ name: "Client only", value: "client-only" },
|
|
224
|
+
{
|
|
225
|
+
name: "Server + client — separate projects per surface (strict isolation)",
|
|
226
|
+
value: "separate",
|
|
227
|
+
},
|
|
228
|
+
],
|
|
229
|
+
default: "shared",
|
|
230
|
+
}));
|
|
231
|
+
// Step 3 — env dirs per surface. Auto-detect common monorepo layouts
|
|
232
|
+
// (packages/server, apps/web, etc.) and offer the first match as the
|
|
233
|
+
// default.
|
|
234
|
+
const surfaces = { mode };
|
|
235
|
+
if (mode === "server-only" || mode === "shared" || mode === "separate") {
|
|
236
|
+
const def = detectSurfaceDir(projectDir, [
|
|
237
|
+
"packages/server",
|
|
238
|
+
"apps/server",
|
|
239
|
+
"apps/api",
|
|
240
|
+
"server",
|
|
241
|
+
"", // project root fallback
|
|
242
|
+
]);
|
|
243
|
+
surfaces.serverEnvDir = resolve(projectDir, (await input({
|
|
244
|
+
message: "Server env directory (relative to project root):",
|
|
245
|
+
default: def,
|
|
246
|
+
validate: (v) => {
|
|
247
|
+
const abs = resolve(projectDir, v.trim());
|
|
248
|
+
return existsSync(abs) ? true : `No such directory: ${abs}`;
|
|
249
|
+
},
|
|
250
|
+
})).trim());
|
|
251
|
+
}
|
|
252
|
+
if (mode === "client-only" || mode === "shared" || mode === "separate") {
|
|
253
|
+
const def = detectSurfaceDir(projectDir, [
|
|
254
|
+
"packages/client",
|
|
255
|
+
"packages/web",
|
|
256
|
+
"apps/web",
|
|
257
|
+
"apps/client",
|
|
258
|
+
"client",
|
|
259
|
+
"web",
|
|
260
|
+
"", // project root fallback
|
|
261
|
+
]);
|
|
262
|
+
surfaces.clientEnvDir = resolve(projectDir, (await input({
|
|
263
|
+
message: "Client env directory (relative to project root):",
|
|
264
|
+
default: def,
|
|
265
|
+
validate: (v) => {
|
|
266
|
+
const abs = resolve(projectDir, v.trim());
|
|
267
|
+
return existsSync(abs) ? true : `No such directory: ${abs}`;
|
|
268
|
+
},
|
|
269
|
+
})).trim());
|
|
270
|
+
}
|
|
271
|
+
return surfaces;
|
|
272
|
+
}
|
|
273
|
+
function detectSurfaceDir(projectDir, candidates) {
|
|
274
|
+
for (const c of candidates) {
|
|
275
|
+
if (existsSync(join(projectDir, c)))
|
|
276
|
+
return c || ".";
|
|
277
|
+
}
|
|
278
|
+
return ".";
|
|
279
|
+
}
|
|
280
|
+
function relativeTo(p, from = process.cwd()) {
|
|
281
|
+
const rel = relative(from, p);
|
|
282
|
+
return rel === "" ? "." : rel.startsWith("..") ? p : `./${rel}`;
|
|
283
|
+
}
|
|
284
|
+
function initBuckets(surfaces) {
|
|
285
|
+
if (!surfaces) {
|
|
286
|
+
// Cache-only: still separate by surface label for readable output.
|
|
287
|
+
return [
|
|
288
|
+
{ label: "server", envDir: "", prodLines: [], devLines: [] },
|
|
289
|
+
{ label: "client", envDir: "", prodLines: [], devLines: [] },
|
|
290
|
+
];
|
|
291
|
+
}
|
|
292
|
+
const out = [];
|
|
293
|
+
if (surfaces.serverEnvDir) {
|
|
294
|
+
out.push({ label: "server", envDir: surfaces.serverEnvDir, prodLines: [], devLines: [] });
|
|
295
|
+
}
|
|
296
|
+
if (surfaces.clientEnvDir) {
|
|
297
|
+
out.push({ label: "client", envDir: surfaces.clientEnvDir, prodLines: [], devLines: [] });
|
|
298
|
+
}
|
|
299
|
+
return out;
|
|
300
|
+
}
|
|
301
|
+
/** Append observability env lines to the right bucket(s). In default
|
|
302
|
+
* mode these go to prod only; `enableDevObs` mirrors them into dev
|
|
303
|
+
* too for wiring debugging. */
|
|
304
|
+
function pushObsLines(buckets, side, lines, enableDevObs) {
|
|
305
|
+
const bucket = buckets.find((b) => b.label === side);
|
|
306
|
+
if (!bucket)
|
|
307
|
+
return;
|
|
308
|
+
bucket.prodLines.push(...lines);
|
|
309
|
+
if (enableDevObs)
|
|
310
|
+
bucket.devLines.push(...lines);
|
|
311
|
+
}
|
|
312
|
+
export async function runUnprovision(opts) {
|
|
313
|
+
const nameCheck = validateProjectName(opts.baseName);
|
|
314
|
+
if (nameCheck !== true)
|
|
315
|
+
throw new Error(`Invalid base name: ${nameCheck}`);
|
|
316
|
+
// Configure providers before any spinner — same reasoning as runProvision.
|
|
317
|
+
if (opts.services.includes("glitchtip"))
|
|
318
|
+
await ensureGlitchtip();
|
|
319
|
+
if (opts.services.includes("openpanel"))
|
|
320
|
+
await ensureOpenpanel();
|
|
321
|
+
if (opts.services.includes("resend"))
|
|
322
|
+
await ensureResend();
|
|
323
|
+
if (opts.dryRun) {
|
|
324
|
+
console.log(chalk.yellow("\n [dry-run] No clients will be deleted.\n"));
|
|
325
|
+
}
|
|
326
|
+
console.log(chalk.bold(`\n ── Deleting ${opts.baseName} ─────────────────────────────\n`));
|
|
327
|
+
// Observability: try the shared name first, then the -server/-client
|
|
328
|
+
// split variants. Each `runDelete` quietly reports "already gone" on
|
|
329
|
+
// a 404, so best-effort teardown covers both layouts.
|
|
330
|
+
if (opts.services.includes("glitchtip")) {
|
|
331
|
+
for (const name of observabilityNames(opts.baseName)) {
|
|
332
|
+
await runDelete(`GlitchTip: deleting project ${name}`, opts.dryRun, () => deleteGlitchtipClient(name));
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
if (opts.services.includes("openpanel")) {
|
|
336
|
+
for (const name of observabilityNames(opts.baseName)) {
|
|
337
|
+
await runDelete(`OpenPanel: deleting project ${name}`, opts.dryRun, () => deleteOpenpanelClient(name));
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
// Resend keeps the -dev/-prod pair.
|
|
341
|
+
if (opts.services.includes("resend")) {
|
|
342
|
+
for (const env of ["dev", "prod"]) {
|
|
343
|
+
const name = `${opts.baseName}-${env}`;
|
|
344
|
+
await runDelete(`Resend: deleting API key ${name}`, opts.dryRun, () => deleteResendClient(name));
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
// Clean up the local .env cache. Mirror runProvision's write locations.
|
|
348
|
+
const outDir = join(dirname(getConfigPath()), "provisioned");
|
|
349
|
+
const cachedPaths = [
|
|
350
|
+
`${opts.baseName}.server.dev.env`,
|
|
351
|
+
`${opts.baseName}.server.prod.env`,
|
|
352
|
+
`${opts.baseName}.client.dev.env`,
|
|
353
|
+
`${opts.baseName}.client.prod.env`,
|
|
354
|
+
// Legacy pre-surfaces layout — clean up so re-runs don't leave junk.
|
|
355
|
+
`${opts.baseName}.dev.env`,
|
|
356
|
+
`${opts.baseName}.prod.env`,
|
|
357
|
+
];
|
|
358
|
+
for (const name of cachedPaths) {
|
|
359
|
+
const path = join(outDir, name);
|
|
360
|
+
if (!existsSync(path))
|
|
361
|
+
continue;
|
|
362
|
+
if (opts.dryRun) {
|
|
363
|
+
console.log(chalk.dim(` would remove ${path}`));
|
|
364
|
+
continue;
|
|
365
|
+
}
|
|
366
|
+
rmSync(path);
|
|
367
|
+
console.log(chalk.dim(` ✓ removed ${path}`));
|
|
368
|
+
}
|
|
369
|
+
console.log();
|
|
370
|
+
}
|
|
371
|
+
/** Candidate project names for observability teardown. Covers the
|
|
372
|
+
* shared (single-project) and split (server/client) layouts so a
|
|
373
|
+
* single `hatchkit remove` cleans up either. */
|
|
374
|
+
function observabilityNames(baseName) {
|
|
375
|
+
return [baseName, `${baseName}-server`, `${baseName}-client`];
|
|
376
|
+
}
|
|
377
|
+
/** Run a delete via spinner, mapping "not-found" to a dim "already gone"
|
|
378
|
+
* so re-runs stay quiet. */
|
|
379
|
+
async function runDelete(label, dryRun, fn) {
|
|
380
|
+
if (dryRun) {
|
|
381
|
+
console.log(chalk.dim(` would ${label.toLowerCase()}`));
|
|
382
|
+
return;
|
|
383
|
+
}
|
|
384
|
+
const ora = (await import("ora")).default;
|
|
385
|
+
const spinner = ora(label).start();
|
|
386
|
+
try {
|
|
387
|
+
const result = await fn();
|
|
388
|
+
if (result === "deleted") {
|
|
389
|
+
spinner.succeed(label);
|
|
390
|
+
}
|
|
391
|
+
else {
|
|
392
|
+
spinner.info(`${label} — already gone`);
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
catch (err) {
|
|
396
|
+
spinner.fail(label);
|
|
397
|
+
// Don't throw on one failure — a single service being flaky shouldn't
|
|
398
|
+
// block the rest of the teardown.
|
|
399
|
+
console.log(chalk.red(` ${err.message}`));
|
|
400
|
+
}
|
|
78
401
|
}
|
|
79
402
|
// ---------------------------------------------------------------------------
|
|
80
403
|
// Helpers
|
|
@@ -92,10 +415,62 @@ async function withSpinner(label, fn) {
|
|
|
92
415
|
throw err;
|
|
93
416
|
}
|
|
94
417
|
}
|
|
95
|
-
function
|
|
96
|
-
|
|
418
|
+
async function pickResendDomain() {
|
|
419
|
+
const domains = await listResendDomains();
|
|
420
|
+
const sorted = [...domains].sort((a, b) => {
|
|
421
|
+
const av = a.status === "verified" ? 0 : 1;
|
|
422
|
+
const bv = b.status === "verified" ? 0 : 1;
|
|
423
|
+
return av - bv || a.name.localeCompare(b.name);
|
|
424
|
+
});
|
|
425
|
+
const ADD_NEW = "__add_new__";
|
|
426
|
+
const NONE = "";
|
|
427
|
+
const choices = [
|
|
428
|
+
...sorted.map((d) => ({
|
|
429
|
+
name: d.status === "verified" ? d.name : `${d.name} ${chalk.dim(`(${d.status})`)}`,
|
|
430
|
+
value: d.id,
|
|
431
|
+
})),
|
|
432
|
+
{ name: chalk.cyan("+ Add a new sending domain…"), value: ADD_NEW },
|
|
433
|
+
{ name: "— no domain restriction (account-wide) —", value: NONE },
|
|
434
|
+
];
|
|
435
|
+
const picked = await select({
|
|
436
|
+
message: "Resend sending domain (both keys will be scoped to it):",
|
|
437
|
+
choices,
|
|
438
|
+
});
|
|
439
|
+
if (picked === NONE)
|
|
440
|
+
return undefined;
|
|
441
|
+
if (picked !== ADD_NEW)
|
|
442
|
+
return picked;
|
|
443
|
+
// Add-new flow.
|
|
444
|
+
const raw = await input({
|
|
445
|
+
message: "New sending domain (bare domain — e.g. playtiao.com or mail.playtiao.com):",
|
|
446
|
+
validate: (v) => {
|
|
447
|
+
const n = normalizeDomainInput(v);
|
|
448
|
+
if (!n)
|
|
449
|
+
return "Enter a domain.";
|
|
450
|
+
if (!/^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)+$/.test(n)) {
|
|
451
|
+
return "That doesn't look like a valid domain.";
|
|
452
|
+
}
|
|
453
|
+
return true;
|
|
454
|
+
},
|
|
455
|
+
});
|
|
456
|
+
const name = normalizeDomainInput(raw);
|
|
457
|
+
const created = await withSpinner(`Resend: creating domain ${name}`, () => createResendDomain(name));
|
|
458
|
+
console.log(chalk.yellow(` ${created.name} created (status: ${created.status}). Add the DNS records in the Resend dashboard before sending — https://resend.com/domains/${created.id}`));
|
|
459
|
+
return created.id;
|
|
460
|
+
}
|
|
461
|
+
/** Server env uses the plain names; browser env uses a `PUBLIC_`
|
|
462
|
+
* prefix (Vite / Astro / SvelteKit / Remix convention — bundlers
|
|
463
|
+
* typically only expose variables with this kind of prefix to
|
|
464
|
+
* browser code). The client SDK doesn't need OPENPANEL_CLIENT_SECRET
|
|
465
|
+
* — browser events are anonymous — so we omit it from the client
|
|
466
|
+
* bundle. */
|
|
467
|
+
function renderGlitchtipEnv(c, forClient) {
|
|
468
|
+
return [`${forClient ? "PUBLIC_GLITCHTIP_DSN" : "GLITCHTIP_DSN"}=${c.dsn}`];
|
|
97
469
|
}
|
|
98
|
-
function renderOpenpanelEnv(c) {
|
|
470
|
+
function renderOpenpanelEnv(c, forClient) {
|
|
471
|
+
if (forClient) {
|
|
472
|
+
return [`PUBLIC_OPENPANEL_API_URL=${c.apiUrl}`, `PUBLIC_OPENPANEL_CLIENT_ID=${c.clientId}`];
|
|
473
|
+
}
|
|
99
474
|
return [
|
|
100
475
|
`OPENPANEL_API_URL=${c.apiUrl}`,
|
|
101
476
|
`OPENPANEL_CLIENT_ID=${c.clientId}`,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/provision/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/provision/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,4 +5,11 @@ export interface OpenpanelClient {
|
|
|
5
5
|
apiUrl: string;
|
|
6
6
|
}
|
|
7
7
|
export declare function provisionOpenpanelClient(clientName: string): Promise<OpenpanelClient>;
|
|
8
|
+
export type DeleteResult = "deleted" | "not-found";
|
|
9
|
+
/**
|
|
10
|
+
* Delete an OpenPanel project created by `provisionOpenpanelClient`.
|
|
11
|
+
* Also wipes the cached id + secret from the keychain so a future
|
|
12
|
+
* provision round won't hand back stale creds.
|
|
13
|
+
*/
|
|
14
|
+
export declare function deleteOpenpanelClient(clientName: string): Promise<DeleteResult>;
|
|
8
15
|
//# sourceMappingURL=openpanel.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openpanel.d.ts","sourceRoot":"","sources":["../../src/provision/openpanel.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"openpanel.d.ts","sourceRoot":"","sources":["../../src/provision/openpanel.ts"],"names":[],"mappings":"AAqBA,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;CAChB;AAqBD,wBAAsB,wBAAwB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CA+E3F;AAED,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,WAAW,CAAC;AAEnD;;;;GAIG;AACH,wBAAsB,qBAAqB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAoCrF"}
|