hatchkit 0.1.1 → 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 +455 -117
- 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 +504 -66
- 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 +38 -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 +2 -2
|
@@ -0,0 +1,537 @@
|
|
|
1
|
+
import { existsSync, mkdirSync, readFileSync, readdirSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { confirm, input, select } from "@inquirer/prompts";
|
|
4
|
+
import chalk from "chalk";
|
|
5
|
+
import { ensureDns, getDnsConfig } from "../config.js";
|
|
6
|
+
import { exec } from "../utils/exec.js";
|
|
7
|
+
import { parseDomain, validateDomain } from "../utils/validate.js";
|
|
8
|
+
// GitHub's apex A records (docs: configuring-a-custom-domain-for-your-github-pages-site)
|
|
9
|
+
const GITHUB_APEX_A = ["185.199.108.153", "185.199.109.153", "185.199.110.153", "185.199.111.153"];
|
|
10
|
+
/** Directories we scan when looking for sites. Empty = repo root. */
|
|
11
|
+
const SCAN_DIRS = ["", "docs", "site", "www", "web"];
|
|
12
|
+
const WORKFLOW_FILENAME = "gh-pages.yml";
|
|
13
|
+
// ---------------------------------------------------------------------------
|
|
14
|
+
// Main entrypoint
|
|
15
|
+
// ---------------------------------------------------------------------------
|
|
16
|
+
export async function runPagesSetup(cwd) {
|
|
17
|
+
console.log(chalk.bold("\n ── hatchkit gh-pages ──────────────────────────────────────\n"));
|
|
18
|
+
// 1. Repo — must be a git repo with an `origin` pointing at GitHub.
|
|
19
|
+
const repo = await detectRepo(cwd);
|
|
20
|
+
console.log(chalk.dim(` Repo: ${repo.fullName} (${repo.private ? "private" : "public"})`));
|
|
21
|
+
if (repo.private) {
|
|
22
|
+
console.log(chalk.yellow(" ⚠ Private repos need a paid GitHub plan (Pro/Team/Enterprise) for Pages.\n Continuing anyway — will fail at API call if unsupported."));
|
|
23
|
+
}
|
|
24
|
+
// 2. Pick a site. Auto-confirm when there's one obvious candidate;
|
|
25
|
+
// ask when zero or many. Also let the user override the detected
|
|
26
|
+
// publish folder before we commit to writing anything.
|
|
27
|
+
const confirmed = await pickSite(cwd);
|
|
28
|
+
// 3. Custom domain (optional).
|
|
29
|
+
const domain = await promptDomain();
|
|
30
|
+
// 4. Enable Pages via GitHub API.
|
|
31
|
+
await enablePages(repo);
|
|
32
|
+
// 5. Write the workflow — unless the repo already has a Pages-deploying
|
|
33
|
+
// workflow (ours or otherwise). Avoids clobbering an existing setup.
|
|
34
|
+
writeWorkflow(cwd, repo, confirmed);
|
|
35
|
+
// 6. CNAME file — only when a custom domain is chosen.
|
|
36
|
+
if (domain)
|
|
37
|
+
writeCnameFile(cwd, confirmed, domain);
|
|
38
|
+
// 7. Pages CNAME + DNS wiring.
|
|
39
|
+
if (domain) {
|
|
40
|
+
await setPagesCname(repo, domain);
|
|
41
|
+
await configureDns(domain);
|
|
42
|
+
}
|
|
43
|
+
printSummary(repo, confirmed, domain);
|
|
44
|
+
}
|
|
45
|
+
// ---------------------------------------------------------------------------
|
|
46
|
+
// Repo detection
|
|
47
|
+
// ---------------------------------------------------------------------------
|
|
48
|
+
async function detectRepo(cwd) {
|
|
49
|
+
const res = await exec("gh", ["repo", "view", "--json", "nameWithOwner,visibility,defaultBranchRef,owner,name"], { cwd, silent: true });
|
|
50
|
+
if (res.exitCode !== 0) {
|
|
51
|
+
throw new Error("Couldn't resolve the GitHub repo for this directory. Make sure you're inside a git repo with an `origin` remote and that `gh auth status` works.");
|
|
52
|
+
}
|
|
53
|
+
const parsed = JSON.parse(res.stdout);
|
|
54
|
+
return {
|
|
55
|
+
owner: parsed.owner.login,
|
|
56
|
+
repo: parsed.name,
|
|
57
|
+
fullName: parsed.nameWithOwner,
|
|
58
|
+
defaultBranch: parsed.defaultBranchRef?.name ?? "main",
|
|
59
|
+
private: parsed.visibility === "PRIVATE",
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
// ---------------------------------------------------------------------------
|
|
63
|
+
// Site detection
|
|
64
|
+
// ---------------------------------------------------------------------------
|
|
65
|
+
async function pickSite(cwd) {
|
|
66
|
+
const candidates = findSiteCandidates(cwd);
|
|
67
|
+
if (candidates.length === 0) {
|
|
68
|
+
console.log(chalk.yellow(" No site detected in the usual spots (root / docs / site / www / web)."));
|
|
69
|
+
return promptManualSite(cwd);
|
|
70
|
+
}
|
|
71
|
+
let chosen;
|
|
72
|
+
if (candidates.length === 1) {
|
|
73
|
+
chosen = candidates[0];
|
|
74
|
+
console.log(chalk.dim(` Site: ${describeCandidate(chosen)} ${chalk.dim("(auto-detected)")}`));
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
console.log(chalk.dim(` Found ${candidates.length} possible sites — pick one:`));
|
|
78
|
+
chosen = await select({
|
|
79
|
+
message: "Which site do you want to deploy?",
|
|
80
|
+
choices: candidates.map((c) => ({ name: describeCandidate(c), value: c })),
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
return confirmProjectShape(chosen.detected);
|
|
84
|
+
}
|
|
85
|
+
function describeCandidate(c) {
|
|
86
|
+
const loc = c.dir === "" ? "repo root" : `${c.dir}/`;
|
|
87
|
+
const extra = c.detected.kind === "node-build"
|
|
88
|
+
? ` (${c.detected.packageManager} run ${c.detected.buildScript} → ${c.detected.publishDir}/)`
|
|
89
|
+
: c.detected.kind === "jekyll"
|
|
90
|
+
? ` → ${c.detected.publishDir}/`
|
|
91
|
+
: "";
|
|
92
|
+
return `${c.detected.kind} at ${loc}${extra}`;
|
|
93
|
+
}
|
|
94
|
+
function findSiteCandidates(cwd) {
|
|
95
|
+
const results = [];
|
|
96
|
+
for (const sub of SCAN_DIRS) {
|
|
97
|
+
const abs = sub ? join(cwd, sub) : cwd;
|
|
98
|
+
if (sub && !existsSync(abs))
|
|
99
|
+
continue;
|
|
100
|
+
const detected = detectAt(abs, sub);
|
|
101
|
+
if (detected)
|
|
102
|
+
results.push({ dir: sub, detected });
|
|
103
|
+
}
|
|
104
|
+
return results;
|
|
105
|
+
}
|
|
106
|
+
/** Classify a single directory. Returns null if nothing site-shaped lives there. */
|
|
107
|
+
function detectAt(absDir, subPath) {
|
|
108
|
+
// Jekyll first — clearest signal (Gemfile + _config.yml).
|
|
109
|
+
if (existsSync(join(absDir, "Gemfile")) && existsSync(join(absDir, "_config.yml"))) {
|
|
110
|
+
return {
|
|
111
|
+
kind: "jekyll",
|
|
112
|
+
publishDir: subPath ? `${subPath}/_site` : "_site",
|
|
113
|
+
workDir: subPath,
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
// Node build: package.json with a "build" script.
|
|
117
|
+
const pkgPath = join(absDir, "package.json");
|
|
118
|
+
if (existsSync(pkgPath)) {
|
|
119
|
+
try {
|
|
120
|
+
const pkg = JSON.parse(readFileSync(pkgPath, "utf8"));
|
|
121
|
+
const buildCmd = pkg.scripts?.build;
|
|
122
|
+
// Skip workspace roots (they typically fan out to children, not
|
|
123
|
+
// build a deployable site themselves). Heuristic: `workspaces` in
|
|
124
|
+
// package.json (npm/yarn/bun) or a `pnpm-workspace.yaml` sibling.
|
|
125
|
+
// User can still pick the root manually via promptManualSite.
|
|
126
|
+
const isWorkspaceRoot = pkg.workspaces !== undefined || existsSync(join(absDir, "pnpm-workspace.yaml"));
|
|
127
|
+
if (buildCmd && !isWorkspaceRoot) {
|
|
128
|
+
const outDir = guessNodeOutDir(buildCmd);
|
|
129
|
+
return {
|
|
130
|
+
kind: "node-build",
|
|
131
|
+
publishDir: subPath ? `${subPath}/${outDir}` : outDir,
|
|
132
|
+
packageManager: detectPackageManager(absDir),
|
|
133
|
+
buildScript: "build",
|
|
134
|
+
workDir: subPath,
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
catch {
|
|
139
|
+
// fall through
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
// Plain static: index.html.
|
|
143
|
+
if (existsSync(join(absDir, "index.html"))) {
|
|
144
|
+
return {
|
|
145
|
+
kind: "static",
|
|
146
|
+
publishDir: subPath || ".",
|
|
147
|
+
workDir: subPath,
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
return null;
|
|
151
|
+
}
|
|
152
|
+
function detectPackageManager(cwd) {
|
|
153
|
+
if (existsSync(join(cwd, "pnpm-lock.yaml")))
|
|
154
|
+
return "pnpm";
|
|
155
|
+
if (existsSync(join(cwd, "bun.lockb")))
|
|
156
|
+
return "bun";
|
|
157
|
+
if (existsSync(join(cwd, "yarn.lock")))
|
|
158
|
+
return "yarn";
|
|
159
|
+
return "npm";
|
|
160
|
+
}
|
|
161
|
+
/** Best-guess output folder from a typical build script. Users confirm it. */
|
|
162
|
+
function guessNodeOutDir(buildCmd) {
|
|
163
|
+
if (buildCmd.includes("astro"))
|
|
164
|
+
return "dist";
|
|
165
|
+
if (buildCmd.includes("next"))
|
|
166
|
+
return "out"; // requires `output: "export"`
|
|
167
|
+
if (buildCmd.includes("vite"))
|
|
168
|
+
return "dist";
|
|
169
|
+
if (buildCmd.includes("react-scripts"))
|
|
170
|
+
return "build";
|
|
171
|
+
return "dist";
|
|
172
|
+
}
|
|
173
|
+
async function confirmProjectShape(detected) {
|
|
174
|
+
// Jekyll always builds to _site — nothing to ask.
|
|
175
|
+
if (detected.kind === "jekyll")
|
|
176
|
+
return detected;
|
|
177
|
+
const publishDir = await input({
|
|
178
|
+
message: "Folder to publish (relative to repo root):",
|
|
179
|
+
default: detected.publishDir,
|
|
180
|
+
});
|
|
181
|
+
return { ...detected, publishDir };
|
|
182
|
+
}
|
|
183
|
+
/** Manual fallback when nothing was auto-detected. */
|
|
184
|
+
async function promptManualSite(cwd) {
|
|
185
|
+
const kind = await select({
|
|
186
|
+
message: "What kind of site is this?",
|
|
187
|
+
choices: [
|
|
188
|
+
{ name: "static — plain HTML, no build step", value: "static" },
|
|
189
|
+
{ name: "node-build — package.json with a `build` script", value: "node-build" },
|
|
190
|
+
{ name: "jekyll", value: "jekyll" },
|
|
191
|
+
],
|
|
192
|
+
});
|
|
193
|
+
const workDir = await input({
|
|
194
|
+
message: "Site lives in (relative to repo root, '.' for root):",
|
|
195
|
+
default: ".",
|
|
196
|
+
});
|
|
197
|
+
const normWorkDir = workDir === "." ? "" : workDir;
|
|
198
|
+
if (kind === "jekyll") {
|
|
199
|
+
return {
|
|
200
|
+
kind,
|
|
201
|
+
publishDir: normWorkDir ? `${normWorkDir}/_site` : "_site",
|
|
202
|
+
workDir: normWorkDir,
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
if (kind === "static") {
|
|
206
|
+
return { kind, publishDir: normWorkDir || ".", workDir: normWorkDir };
|
|
207
|
+
}
|
|
208
|
+
// node-build
|
|
209
|
+
const publishDir = await input({
|
|
210
|
+
message: "Build output folder (relative to repo root):",
|
|
211
|
+
default: normWorkDir ? `${normWorkDir}/dist` : "dist",
|
|
212
|
+
});
|
|
213
|
+
return {
|
|
214
|
+
kind,
|
|
215
|
+
publishDir,
|
|
216
|
+
packageManager: detectPackageManager(normWorkDir ? join(cwd, normWorkDir) : cwd),
|
|
217
|
+
buildScript: "build",
|
|
218
|
+
workDir: normWorkDir,
|
|
219
|
+
};
|
|
220
|
+
}
|
|
221
|
+
// ---------------------------------------------------------------------------
|
|
222
|
+
// Domain prompt
|
|
223
|
+
// ---------------------------------------------------------------------------
|
|
224
|
+
async function promptDomain() {
|
|
225
|
+
const wantCustom = await confirm({
|
|
226
|
+
message: "Use a custom domain?",
|
|
227
|
+
default: false,
|
|
228
|
+
});
|
|
229
|
+
if (!wantCustom)
|
|
230
|
+
return null;
|
|
231
|
+
return input({
|
|
232
|
+
message: "Domain (e.g. sprites.example.com or example.com):",
|
|
233
|
+
validate: validateDomain,
|
|
234
|
+
});
|
|
235
|
+
}
|
|
236
|
+
// ---------------------------------------------------------------------------
|
|
237
|
+
// GitHub Pages API
|
|
238
|
+
// ---------------------------------------------------------------------------
|
|
239
|
+
async function enablePages(repo) {
|
|
240
|
+
// POST creates. If Pages is already enabled, GitHub returns 409 — fall
|
|
241
|
+
// back to PUT so build_type=workflow lands either way.
|
|
242
|
+
const res = await exec("gh", ["api", "-X", "POST", `repos/${repo.fullName}/pages`, "-f", "build_type=workflow"], { silent: true, spinner: "Enabling GitHub Pages..." });
|
|
243
|
+
if (res.exitCode === 0)
|
|
244
|
+
return;
|
|
245
|
+
if (res.stderr.includes("409") || res.stdout.includes("already")) {
|
|
246
|
+
const put = await exec("gh", ["api", "-X", "PUT", `repos/${repo.fullName}/pages`, "-f", "build_type=workflow"], { silent: true, spinner: "Pages already enabled — ensuring workflow build type..." });
|
|
247
|
+
if (put.exitCode !== 0) {
|
|
248
|
+
throw new Error(`Couldn't set Pages build type: ${put.stderr.trim()}`);
|
|
249
|
+
}
|
|
250
|
+
return;
|
|
251
|
+
}
|
|
252
|
+
throw new Error(`Couldn't enable Pages: ${res.stderr.trim() || res.stdout.trim()}`);
|
|
253
|
+
}
|
|
254
|
+
async function setPagesCname(repo, domain) {
|
|
255
|
+
const res = await exec("gh", ["api", "-X", "PUT", `repos/${repo.fullName}/pages`, "-f", `cname=${domain}`], { silent: true, spinner: `Registering ${domain} with Pages...` });
|
|
256
|
+
if (res.exitCode !== 0) {
|
|
257
|
+
// Non-fatal: DNS might not be in place yet.
|
|
258
|
+
console.log(chalk.yellow(` ⚠ Couldn't set Pages CNAME to ${domain} (${res.stderr.trim()}).\n Set it manually in Settings → Pages once DNS resolves.`));
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
// ---------------------------------------------------------------------------
|
|
262
|
+
// Workflow + CNAME file
|
|
263
|
+
// ---------------------------------------------------------------------------
|
|
264
|
+
function writeWorkflow(cwd, repo, d) {
|
|
265
|
+
const workflowsDir = join(cwd, ".github", "workflows");
|
|
266
|
+
mkdirSync(workflowsDir, { recursive: true });
|
|
267
|
+
// Don't overwrite any existing Pages-deploying workflow. Looking for
|
|
268
|
+
// `actions/deploy-pages` in every workflow file catches our own
|
|
269
|
+
// gh-pages.yml as well as hand-written ones (e.g. docs.yml).
|
|
270
|
+
const existing = findExistingPagesWorkflow(workflowsDir);
|
|
271
|
+
if (existing) {
|
|
272
|
+
console.log(chalk.yellow(` ⚠ Existing Pages workflow found at .github/workflows/${existing} — leaving it untouched.\n Delete it and re-run if you want a fresh ${WORKFLOW_FILENAME}.`));
|
|
273
|
+
return;
|
|
274
|
+
}
|
|
275
|
+
const outPath = join(workflowsDir, WORKFLOW_FILENAME);
|
|
276
|
+
writeFileSync(outPath, renderWorkflow(repo, d));
|
|
277
|
+
console.log(chalk.green(` ✓ Wrote .github/workflows/${WORKFLOW_FILENAME}`));
|
|
278
|
+
}
|
|
279
|
+
function findExistingPagesWorkflow(workflowsDir) {
|
|
280
|
+
if (!existsSync(workflowsDir))
|
|
281
|
+
return null;
|
|
282
|
+
const files = readdirSync(workflowsDir).filter((f) => f.endsWith(".yml") || f.endsWith(".yaml"));
|
|
283
|
+
for (const f of files) {
|
|
284
|
+
const contents = readFileSync(join(workflowsDir, f), "utf8");
|
|
285
|
+
if (contents.includes("actions/deploy-pages"))
|
|
286
|
+
return f;
|
|
287
|
+
}
|
|
288
|
+
return null;
|
|
289
|
+
}
|
|
290
|
+
function renderWorkflow(repo, d) {
|
|
291
|
+
const branch = repo.defaultBranch;
|
|
292
|
+
const header = `name: Deploy to GitHub Pages
|
|
293
|
+
|
|
294
|
+
on:
|
|
295
|
+
push:
|
|
296
|
+
branches: [${branch}]
|
|
297
|
+
workflow_dispatch:
|
|
298
|
+
|
|
299
|
+
permissions:
|
|
300
|
+
contents: read
|
|
301
|
+
pages: write
|
|
302
|
+
id-token: write
|
|
303
|
+
|
|
304
|
+
concurrency:
|
|
305
|
+
group: pages
|
|
306
|
+
cancel-in-progress: false
|
|
307
|
+
|
|
308
|
+
jobs:
|
|
309
|
+
build:
|
|
310
|
+
runs-on: ubuntu-latest
|
|
311
|
+
steps:
|
|
312
|
+
- uses: actions/checkout@v4
|
|
313
|
+
`;
|
|
314
|
+
const tail = ` - uses: actions/configure-pages@v5
|
|
315
|
+
- uses: actions/upload-pages-artifact@v3
|
|
316
|
+
with:
|
|
317
|
+
path: ${d.publishDir}
|
|
318
|
+
|
|
319
|
+
deploy:
|
|
320
|
+
needs: build
|
|
321
|
+
runs-on: ubuntu-latest
|
|
322
|
+
environment:
|
|
323
|
+
name: github-pages
|
|
324
|
+
url: \${{ steps.deployment.outputs.page_url }}
|
|
325
|
+
steps:
|
|
326
|
+
- id: deployment
|
|
327
|
+
uses: actions/deploy-pages@v4
|
|
328
|
+
`;
|
|
329
|
+
if (d.kind === "static") {
|
|
330
|
+
return `${header}${tail}`;
|
|
331
|
+
}
|
|
332
|
+
if (d.kind === "jekyll") {
|
|
333
|
+
const wdLine = d.workDir ? `\n working-directory: ${d.workDir}` : "";
|
|
334
|
+
const jekyllWd = d.workDir ? `\n working-directory: ${d.workDir}` : "";
|
|
335
|
+
return `${header} - uses: ruby/setup-ruby@v1
|
|
336
|
+
with:
|
|
337
|
+
ruby-version: "3.2"
|
|
338
|
+
bundler-cache: true${wdLine}
|
|
339
|
+
- uses: actions/configure-pages@v5
|
|
340
|
+
id: pages
|
|
341
|
+
- name: Build with Jekyll
|
|
342
|
+
run: bundle exec jekyll build --baseurl "\${{ steps.pages.outputs.base_path }}"${jekyllWd}
|
|
343
|
+
env:
|
|
344
|
+
JEKYLL_ENV: production
|
|
345
|
+
- uses: actions/upload-pages-artifact@v3
|
|
346
|
+
with:
|
|
347
|
+
path: ${d.publishDir}
|
|
348
|
+
|
|
349
|
+
deploy:
|
|
350
|
+
needs: build
|
|
351
|
+
runs-on: ubuntu-latest
|
|
352
|
+
environment:
|
|
353
|
+
name: github-pages
|
|
354
|
+
url: \${{ steps.deployment.outputs.page_url }}
|
|
355
|
+
steps:
|
|
356
|
+
- id: deployment
|
|
357
|
+
uses: actions/deploy-pages@v4
|
|
358
|
+
`;
|
|
359
|
+
}
|
|
360
|
+
// node-build
|
|
361
|
+
const pm = d.packageManager ?? "npm";
|
|
362
|
+
const installCmd = pm === "npm" ? "npm ci" : `${pm} install --frozen-lockfile`;
|
|
363
|
+
const buildCmd = `${pm} run ${d.buildScript ?? "build"}`;
|
|
364
|
+
const wd = d.workDir ? `\n working-directory: ${d.workDir}` : "";
|
|
365
|
+
const nodeSetup = pm === "pnpm"
|
|
366
|
+
? ` - uses: pnpm/action-setup@v4
|
|
367
|
+
with:
|
|
368
|
+
version: 9
|
|
369
|
+
- uses: actions/setup-node@v4
|
|
370
|
+
with:
|
|
371
|
+
node-version: 20
|
|
372
|
+
cache: pnpm${d.workDir ? `\n cache-dependency-path: ${d.workDir}/pnpm-lock.yaml` : ""}`
|
|
373
|
+
: pm === "yarn"
|
|
374
|
+
? ` - uses: actions/setup-node@v4
|
|
375
|
+
with:
|
|
376
|
+
node-version: 20
|
|
377
|
+
cache: yarn${d.workDir ? `\n cache-dependency-path: ${d.workDir}/yarn.lock` : ""}`
|
|
378
|
+
: pm === "bun"
|
|
379
|
+
? ` - uses: oven-sh/setup-bun@v2`
|
|
380
|
+
: ` - uses: actions/setup-node@v4
|
|
381
|
+
with:
|
|
382
|
+
node-version: 20
|
|
383
|
+
cache: npm${d.workDir ? `\n cache-dependency-path: ${d.workDir}/package-lock.json` : ""}`;
|
|
384
|
+
return `${header}${nodeSetup}
|
|
385
|
+
- name: Install dependencies
|
|
386
|
+
run: ${installCmd}${wd}
|
|
387
|
+
- name: Build
|
|
388
|
+
run: ${buildCmd}${wd}
|
|
389
|
+
${tail}`;
|
|
390
|
+
}
|
|
391
|
+
function writeCnameFile(cwd, d, domain) {
|
|
392
|
+
// CNAME lives at the root of the *published* content so GitHub serves
|
|
393
|
+
// it from the built site. Location depends on kind + workDir.
|
|
394
|
+
// - jekyll / static: source dir (Jekyll copies it into _site; static
|
|
395
|
+
// publishes the source dir directly).
|
|
396
|
+
// - node-build: prefer `<workDir>/public/` (Vite/CRA/Astro copy that
|
|
397
|
+
// verbatim into the build output). Fall back to the build dir root.
|
|
398
|
+
const siteDir = d.workDir ? join(cwd, d.workDir) : cwd;
|
|
399
|
+
let target;
|
|
400
|
+
if (d.kind === "node-build") {
|
|
401
|
+
const publicDir = join(siteDir, "public");
|
|
402
|
+
if (existsSync(publicDir)) {
|
|
403
|
+
target = join(publicDir, "CNAME");
|
|
404
|
+
}
|
|
405
|
+
else {
|
|
406
|
+
target = join(siteDir, "CNAME");
|
|
407
|
+
console.log(chalk.yellow(` ⚠ No public/ folder in ${d.workDir || "repo root"}. Wrote CNAME there — make sure your build copies it into ${d.publishDir}/.`));
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
else {
|
|
411
|
+
target = join(siteDir, "CNAME");
|
|
412
|
+
}
|
|
413
|
+
writeFileSync(target, `${domain}\n`);
|
|
414
|
+
console.log(chalk.green(` ✓ Wrote ${target.slice(cwd.length + 1)}`));
|
|
415
|
+
}
|
|
416
|
+
// ---------------------------------------------------------------------------
|
|
417
|
+
// DNS wiring
|
|
418
|
+
// ---------------------------------------------------------------------------
|
|
419
|
+
async function configureDns(domain) {
|
|
420
|
+
const { baseDomain, subdomain } = parseDomain(domain);
|
|
421
|
+
const isApex = subdomain === "";
|
|
422
|
+
const ghUser = await getGitHubUser();
|
|
423
|
+
const target = `${ghUser}.github.io`;
|
|
424
|
+
let dns = await getDnsConfig();
|
|
425
|
+
if (!dns) {
|
|
426
|
+
const wantConfigure = await confirm({
|
|
427
|
+
message: "No DNS provider configured. Configure one now?",
|
|
428
|
+
default: true,
|
|
429
|
+
});
|
|
430
|
+
if (wantConfigure)
|
|
431
|
+
dns = await ensureDns();
|
|
432
|
+
}
|
|
433
|
+
if (!dns || dns.provider === "manual") {
|
|
434
|
+
printManualDnsRecords(baseDomain, subdomain, target, isApex);
|
|
435
|
+
return;
|
|
436
|
+
}
|
|
437
|
+
if (dns.provider === "cloudflare") {
|
|
438
|
+
if (!dns.apiToken) {
|
|
439
|
+
console.log(chalk.yellow(" ⚠ Cloudflare token missing from keychain."));
|
|
440
|
+
printManualDnsRecords(baseDomain, subdomain, target, isApex);
|
|
441
|
+
return;
|
|
442
|
+
}
|
|
443
|
+
await configureCloudflareDns(dns.apiToken, baseDomain, subdomain, target, isApex);
|
|
444
|
+
return;
|
|
445
|
+
}
|
|
446
|
+
// INWX auto-wiring isn't implemented — XML-RPC + rarely used for Pages.
|
|
447
|
+
console.log(chalk.dim(" INWX auto-configure isn't implemented for Pages — showing manual records:"));
|
|
448
|
+
printManualDnsRecords(baseDomain, subdomain, target, isApex);
|
|
449
|
+
}
|
|
450
|
+
async function getGitHubUser() {
|
|
451
|
+
const res = await exec("gh", ["api", "user", "--jq", ".login"], { silent: true });
|
|
452
|
+
if (res.exitCode !== 0) {
|
|
453
|
+
throw new Error("Couldn't resolve the GitHub user via `gh api user`.");
|
|
454
|
+
}
|
|
455
|
+
return res.stdout.trim();
|
|
456
|
+
}
|
|
457
|
+
function printManualDnsRecords(baseDomain, subdomain, target, isApex) {
|
|
458
|
+
console.log(chalk.bold("\n Add these DNS records at your provider:\n"));
|
|
459
|
+
if (isApex) {
|
|
460
|
+
for (const ip of GITHUB_APEX_A) {
|
|
461
|
+
console.log(chalk.dim(` A @ ${ip}`));
|
|
462
|
+
}
|
|
463
|
+
}
|
|
464
|
+
else {
|
|
465
|
+
console.log(chalk.dim(` CNAME ${subdomain} ${target}`));
|
|
466
|
+
}
|
|
467
|
+
console.log(chalk.dim(`\n Zone: ${baseDomain}\n`));
|
|
468
|
+
}
|
|
469
|
+
async function cfApi(token, path, init) {
|
|
470
|
+
const res = await fetch(`https://api.cloudflare.com/client/v4${path}`, {
|
|
471
|
+
method: init?.method ?? "GET",
|
|
472
|
+
headers: {
|
|
473
|
+
Authorization: `Bearer ${token}`,
|
|
474
|
+
"Content-Type": "application/json",
|
|
475
|
+
},
|
|
476
|
+
body: init?.body ? JSON.stringify(init.body) : undefined,
|
|
477
|
+
});
|
|
478
|
+
const data = (await res.json());
|
|
479
|
+
if (!data.success) {
|
|
480
|
+
throw new Error(`Cloudflare API ${path} failed: ${data.errors.map((e) => `${e.code} ${e.message}`).join(", ")}`);
|
|
481
|
+
}
|
|
482
|
+
return data.result;
|
|
483
|
+
}
|
|
484
|
+
async function configureCloudflareDns(token, baseDomain, subdomain, target, isApex) {
|
|
485
|
+
const zones = await cfApi(token, `/zones?name=${encodeURIComponent(baseDomain)}`);
|
|
486
|
+
if (zones.length === 0) {
|
|
487
|
+
console.log(chalk.yellow(` ⚠ No Cloudflare zone found for ${baseDomain}. Falling back to manual records.`));
|
|
488
|
+
printManualDnsRecords(baseDomain, subdomain, target, isApex);
|
|
489
|
+
return;
|
|
490
|
+
}
|
|
491
|
+
const zone = zones[0];
|
|
492
|
+
const recordName = isApex ? baseDomain : `${subdomain}.${baseDomain}`;
|
|
493
|
+
const records = isApex
|
|
494
|
+
? GITHUB_APEX_A.map((ip) => ({ type: "A", name: recordName, content: ip, proxied: false }))
|
|
495
|
+
: [{ type: "CNAME", name: recordName, content: target, proxied: false }];
|
|
496
|
+
for (const rec of records) {
|
|
497
|
+
const existing = await cfApi(token, `/zones/${zone.id}/dns_records?type=${rec.type}&name=${encodeURIComponent(rec.name)}`);
|
|
498
|
+
const match = existing.find((r) => r.content === rec.content);
|
|
499
|
+
if (match) {
|
|
500
|
+
console.log(chalk.dim(` ${rec.type} ${rec.name} → ${rec.content} (already set)`));
|
|
501
|
+
continue;
|
|
502
|
+
}
|
|
503
|
+
// A different record with the same name+type — update in place to
|
|
504
|
+
// keep the zone tidy.
|
|
505
|
+
const stale = existing[0];
|
|
506
|
+
if (stale) {
|
|
507
|
+
await cfApi(token, `/zones/${zone.id}/dns_records/${stale.id}`, {
|
|
508
|
+
method: "PUT",
|
|
509
|
+
body: rec,
|
|
510
|
+
});
|
|
511
|
+
console.log(chalk.green(` ✓ ${rec.type} ${rec.name} → ${rec.content} (updated)`));
|
|
512
|
+
}
|
|
513
|
+
else {
|
|
514
|
+
await cfApi(token, `/zones/${zone.id}/dns_records`, { method: "POST", body: rec });
|
|
515
|
+
console.log(chalk.green(` ✓ ${rec.type} ${rec.name} → ${rec.content} (created)`));
|
|
516
|
+
}
|
|
517
|
+
}
|
|
518
|
+
}
|
|
519
|
+
// ---------------------------------------------------------------------------
|
|
520
|
+
// Summary
|
|
521
|
+
// ---------------------------------------------------------------------------
|
|
522
|
+
function printSummary(repo, d, domain) {
|
|
523
|
+
console.log(chalk.bold("\n ── Done ───────────────────────────────────────────────────\n"));
|
|
524
|
+
const url = domain ? `https://${domain}` : `https://${repo.owner}.github.io/${repo.repo}/`;
|
|
525
|
+
console.log(` Site: ${chalk.cyan(url)}`);
|
|
526
|
+
console.log(` Branch: ${chalk.dim(repo.defaultBranch)} → triggers ${WORKFLOW_FILENAME}`);
|
|
527
|
+
console.log(` Publish: ${chalk.dim(d.publishDir + "/")}`);
|
|
528
|
+
if (d.workDir) {
|
|
529
|
+
console.log(` Source: ${chalk.dim(d.workDir + "/")}`);
|
|
530
|
+
}
|
|
531
|
+
if (domain) {
|
|
532
|
+
console.log(chalk.yellow(`\n First-time DNS propagation can take a few minutes.`));
|
|
533
|
+
console.log(chalk.dim(` Once it resolves, GitHub will provision a cert automatically (Settings → Pages).`));
|
|
534
|
+
}
|
|
535
|
+
console.log(chalk.yellow(`\n Next: commit & push the new workflow (and CNAME file) to ${repo.defaultBranch}.\n`));
|
|
536
|
+
}
|
|
537
|
+
//# sourceMappingURL=pages.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pages.js","sourceRoot":"","sources":["../../src/deploy/pages.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { type ProjectManifest } from "../scaffold/manifest.js";
|
|
2
|
+
export interface RenameDomainOptions {
|
|
3
|
+
/** Directory of the scaffolded project. Manifest must exist here. */
|
|
4
|
+
projectDir: string;
|
|
5
|
+
/** Monorepo root — `infra/` + `stacks/` live under this. */
|
|
6
|
+
monorepoRoot: string;
|
|
7
|
+
/** Target domain. If omitted, the user is prompted. */
|
|
8
|
+
newDomain?: string;
|
|
9
|
+
/** Show the plan, don't write. */
|
|
10
|
+
dryRun?: boolean;
|
|
11
|
+
/** Skip the final confirmation prompt. */
|
|
12
|
+
yes?: boolean;
|
|
13
|
+
}
|
|
14
|
+
export declare function runRenameDomain(opts: RenameDomainOptions): Promise<void>;
|
|
15
|
+
interface FileEdit {
|
|
16
|
+
label: string;
|
|
17
|
+
path: string;
|
|
18
|
+
after: string;
|
|
19
|
+
changes: string[];
|
|
20
|
+
}
|
|
21
|
+
declare function rewriteManifest(path: string, m: ProjectManifest, newDomain: string): FileEdit;
|
|
22
|
+
/**
|
|
23
|
+
* Edit the tfvars file. Two surgical changes + a remap of subdomain keys.
|
|
24
|
+
*
|
|
25
|
+
* The tfvars file was generated from a template, so the format is
|
|
26
|
+
* predictable. Matching `domain = "..."` and the opening of the
|
|
27
|
+
* `subdomains = { ... }` block with regex is safer than a full parser
|
|
28
|
+
* for this narrow use.
|
|
29
|
+
*/
|
|
30
|
+
declare function rewriteTfvars(path: string, oldDomain: string, newDomain: string, oldSub: string, newSub: string, newBase: string, oldBase: string): FileEdit;
|
|
31
|
+
/**
|
|
32
|
+
* Edit the Coolify stack env file. This is a plain KEY="VALUE" block,
|
|
33
|
+
* not a strict format — do line-by-line substitution so we don't clobber
|
|
34
|
+
* unrelated lines and keep the diff obvious.
|
|
35
|
+
*
|
|
36
|
+
* Swaps:
|
|
37
|
+
* - APP_DOMAIN="OLD" → "NEW"
|
|
38
|
+
* - Any other line whose value contains the old full domain gets the
|
|
39
|
+
* old-full-domain → new-full-domain swap (catches FRONTEND_URL,
|
|
40
|
+
* BETTER_AUTH_URL, TRUSTED_ORIGINS, etc).
|
|
41
|
+
* - Lines with the old base domain (but not the old full domain) are
|
|
42
|
+
* left alone — those usually refer to someone else's URL.
|
|
43
|
+
*
|
|
44
|
+
* COOLIFY_URL is explicitly skipped — that's the Coolify dashboard URL,
|
|
45
|
+
* not the project's public domain.
|
|
46
|
+
*/
|
|
47
|
+
declare function rewriteStacksEnv(path: string, oldDomain: string, newDomain: string, _oldBase: string, _newBase: string): FileEdit;
|
|
48
|
+
export declare const _internals: {
|
|
49
|
+
rewriteTfvars: typeof rewriteTfvars;
|
|
50
|
+
rewriteStacksEnv: typeof rewriteStacksEnv;
|
|
51
|
+
rewriteManifest: typeof rewriteManifest;
|
|
52
|
+
};
|
|
53
|
+
export declare function runRenameDomainCli(args: string[], monorepoRoot: string): Promise<void>;
|
|
54
|
+
export {};
|
|
55
|
+
//# sourceMappingURL=rename-domain.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rename-domain.d.ts","sourceRoot":"","sources":["../../src/deploy/rename-domain.ts"],"names":[],"mappings":"AA4BA,OAAO,EAAE,KAAK,eAAe,EAAgB,MAAM,yBAAyB,CAAC;AAO7E,MAAM,WAAW,mBAAmB;IAClC,qEAAqE;IACrE,UAAU,EAAE,MAAM,CAAC;IACnB,4DAA4D;IAC5D,YAAY,EAAE,MAAM,CAAC;IACrB,uDAAuD;IACvD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kCAAkC;IAClC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,0CAA0C;IAC1C,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAED,wBAAsB,eAAe,CAAC,IAAI,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAmH9E;AAMD,UAAU,QAAQ;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,iBAAS,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,GAAG,QAAQ,CAQtF;AAED;;;;;;;GAOG;AACH,iBAAS,aAAa,CACpB,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,GACd,QAAQ,CAiDV;AAED;;;;;;;;;;;;;;;GAeG;AACH,iBAAS,gBAAgB,CACvB,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,GACf,QAAQ,CAyBV;AA4ED,eAAO,MAAM,UAAU;;;;CAItB,CAAC;AAMF,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAe5F"}
|