@lizard-build/cli 0.1.0 → 0.3.29
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/.github/workflows/release.yml +90 -0
- package/README.md +41 -0
- package/dist/commands/add.js +318 -45
- package/dist/commands/add.js.map +1 -1
- package/dist/commands/config.d.ts +2 -0
- package/dist/commands/config.js +68 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/docs.d.ts +2 -0
- package/dist/commands/docs.js +13 -0
- package/dist/commands/docs.js.map +1 -0
- package/dist/commands/domain.d.ts +9 -0
- package/dist/commands/domain.js +195 -0
- package/dist/commands/domain.js.map +1 -0
- package/dist/commands/git.js +175 -36
- package/dist/commands/git.js.map +1 -1
- package/dist/commands/init.d.ts +24 -0
- package/dist/commands/init.js +128 -86
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/link.d.ts +7 -0
- package/dist/commands/link.js +104 -33
- package/dist/commands/link.js.map +1 -1
- package/dist/commands/login.js +4 -3
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/logs.js +223 -30
- package/dist/commands/logs.js.map +1 -1
- package/dist/commands/open.js +3 -2
- package/dist/commands/open.js.map +1 -1
- package/dist/commands/port.d.ts +7 -0
- package/dist/commands/port.js +49 -0
- package/dist/commands/port.js.map +1 -0
- package/dist/commands/projects.js +36 -6
- package/dist/commands/projects.js.map +1 -1
- package/dist/commands/ps.js +32 -39
- package/dist/commands/ps.js.map +1 -1
- package/dist/commands/redeploy.js +48 -8
- package/dist/commands/redeploy.js.map +1 -1
- package/dist/commands/regions.js +2 -5
- package/dist/commands/regions.js.map +1 -1
- package/dist/commands/restart.js +84 -10
- package/dist/commands/restart.js.map +1 -1
- package/dist/commands/run.d.ts +9 -0
- package/dist/commands/run.js +61 -22
- package/dist/commands/run.js.map +1 -1
- package/dist/commands/scale.d.ts +10 -0
- package/dist/commands/scale.js +166 -0
- package/dist/commands/scale.js.map +1 -0
- package/dist/commands/secrets.js +200 -89
- package/dist/commands/secrets.js.map +1 -1
- package/dist/commands/service-set.d.ts +49 -0
- package/dist/commands/service-set.js +552 -0
- package/dist/commands/service-set.js.map +1 -0
- package/dist/commands/service-show.d.ts +11 -0
- package/dist/commands/service-show.js +44 -0
- package/dist/commands/service-show.js.map +1 -0
- package/dist/commands/service.d.ts +8 -0
- package/dist/commands/service.js +262 -0
- package/dist/commands/service.js.map +1 -0
- package/dist/commands/ssh.d.ts +2 -0
- package/dist/commands/ssh.js +161 -0
- package/dist/commands/ssh.js.map +1 -0
- package/dist/commands/status.d.ts +7 -0
- package/dist/commands/status.js +49 -38
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/unlink.d.ts +5 -0
- package/dist/commands/unlink.js +18 -0
- package/dist/commands/unlink.js.map +1 -0
- package/dist/commands/up.d.ts +9 -0
- package/dist/commands/up.js +417 -0
- package/dist/commands/up.js.map +1 -0
- package/dist/commands/upgrade.d.ts +2 -0
- package/dist/commands/upgrade.js +79 -0
- package/dist/commands/upgrade.js.map +1 -0
- package/dist/commands/whoami.js +26 -6
- package/dist/commands/whoami.js.map +1 -1
- package/dist/commands/workspace.d.ts +8 -0
- package/dist/commands/workspace.js +36 -0
- package/dist/commands/workspace.js.map +1 -0
- package/dist/index.js +204 -82
- package/dist/index.js.map +1 -1
- package/dist/lib/api.d.ts +17 -2
- package/dist/lib/api.js +85 -51
- package/dist/lib/api.js.map +1 -1
- package/dist/lib/auth.d.ts +3 -11
- package/dist/lib/auth.js +16 -36
- package/dist/lib/auth.js.map +1 -1
- package/dist/lib/config.d.ts +36 -15
- package/dist/lib/config.js +71 -58
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/format.d.ts +1 -0
- package/dist/lib/format.js +17 -4
- package/dist/lib/format.js.map +1 -1
- package/dist/lib/name.d.ts +11 -0
- package/dist/lib/name.js +26 -0
- package/dist/lib/name.js.map +1 -0
- package/dist/lib/picker.d.ts +32 -0
- package/dist/lib/picker.js +91 -0
- package/dist/lib/picker.js.map +1 -0
- package/dist/lib/resolve.d.ts +85 -0
- package/dist/lib/resolve.js +203 -0
- package/dist/lib/resolve.js.map +1 -0
- package/dist/lib/updater.d.ts +16 -0
- package/dist/lib/updater.js +102 -0
- package/dist/lib/updater.js.map +1 -0
- package/lizard-wrapper.sh +2 -0
- package/package.json +11 -3
- package/src/commands/add.ts +388 -56
- package/src/commands/config.ts +80 -0
- package/src/commands/docs.ts +15 -0
- package/src/commands/domain.ts +248 -0
- package/src/commands/git.ts +201 -40
- package/src/commands/init.ts +149 -100
- package/src/commands/link.ts +127 -35
- package/src/commands/login.ts +4 -3
- package/src/commands/logs.ts +283 -27
- package/src/commands/open.ts +3 -2
- package/src/commands/port.ts +57 -0
- package/src/commands/projects.ts +43 -6
- package/src/commands/ps.ts +39 -60
- package/src/commands/redeploy.ts +51 -10
- package/src/commands/regions.ts +2 -6
- package/src/commands/restart.ts +84 -10
- package/src/commands/run.ts +68 -24
- package/src/commands/scale.ts +216 -0
- package/src/commands/secrets.ts +277 -100
- package/src/commands/service-set.ts +669 -0
- package/src/commands/service-show.ts +52 -0
- package/src/commands/service.ts +298 -0
- package/src/commands/ssh.ts +176 -0
- package/src/commands/status.ts +51 -46
- package/src/commands/unlink.ts +17 -0
- package/src/commands/up.ts +461 -0
- package/src/commands/upgrade.ts +87 -0
- package/src/commands/whoami.ts +34 -6
- package/src/commands/workspace.ts +44 -0
- package/src/index.ts +214 -85
- package/src/lib/api.ts +114 -51
- package/src/lib/auth.ts +22 -46
- package/src/lib/config.ts +100 -65
- package/src/lib/format.ts +18 -4
- package/src/lib/name.ts +27 -0
- package/src/lib/picker.ts +133 -0
- package/src/lib/resolve.ts +285 -0
- package/src/lib/updater.ts +106 -0
- package/test/cli.test.ts +491 -0
- package/test/fixtures/hello-app/Dockerfile +5 -0
- package/test/fixtures/hello-app/index.js +5 -0
- package/test/unit/api.test.ts +66 -0
- package/test/unit/config.test.ts +94 -0
- package/test/unit/init.test.ts +211 -0
- package/test/unit/json.test.ts +208 -0
- package/test/unit/picker.test.ts +161 -0
- package/test/unit/resolve.test.ts +124 -0
- package/test/unit/service-set.test.ts +355 -0
- package/vitest.config.ts +10 -0
- package/dist/commands/connect.d.ts +0 -2
- package/dist/commands/connect.js +0 -117
- package/dist/commands/connect.js.map +0 -1
- package/dist/commands/context.d.ts +0 -2
- package/dist/commands/context.js +0 -71
- package/dist/commands/context.js.map +0 -1
- package/dist/commands/deploy.d.ts +0 -2
- package/dist/commands/deploy.js +0 -120
- package/dist/commands/deploy.js.map +0 -1
- package/dist/commands/destroy.d.ts +0 -2
- package/dist/commands/destroy.js +0 -51
- package/dist/commands/destroy.js.map +0 -1
- package/dist/commands/update.d.ts +0 -2
- package/dist/commands/update.js +0 -41
- package/dist/commands/update.js.map +0 -1
- package/dist/commands/version.d.ts +0 -2
- package/dist/commands/version.js +0 -37
- package/dist/commands/version.js.map +0 -1
- package/src/commands/connect.ts +0 -145
- package/src/commands/context.ts +0 -93
- package/src/commands/deploy.ts +0 -153
- package/src/commands/destroy.ts +0 -51
- package/src/commands/update.ts +0 -44
- package/src/commands/version.ts +0 -37
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
name: Release
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches:
|
|
6
|
+
- main
|
|
7
|
+
|
|
8
|
+
jobs:
|
|
9
|
+
release:
|
|
10
|
+
runs-on: ubuntu-latest
|
|
11
|
+
permissions:
|
|
12
|
+
contents: write
|
|
13
|
+
id-token: write # required for npm OIDC Trusted Publisher
|
|
14
|
+
|
|
15
|
+
steps:
|
|
16
|
+
- uses: actions/checkout@v4
|
|
17
|
+
with:
|
|
18
|
+
fetch-depth: 0
|
|
19
|
+
token: ${{ secrets.GITHUB_TOKEN }}
|
|
20
|
+
|
|
21
|
+
- name: Configure git
|
|
22
|
+
run: |
|
|
23
|
+
git config user.name "github-actions[bot]"
|
|
24
|
+
git config user.email "github-actions[bot]@users.noreply.github.com"
|
|
25
|
+
|
|
26
|
+
- name: Bump patch version
|
|
27
|
+
id: bump
|
|
28
|
+
run: |
|
|
29
|
+
CURRENT=$(node -p "require('./package.json').version")
|
|
30
|
+
IFS='.' read -r MAJ MIN PAT <<< "$CURRENT"
|
|
31
|
+
NEW="$MAJ.$MIN.$((PAT + 1))"
|
|
32
|
+
echo "version=$NEW" >> $GITHUB_OUTPUT
|
|
33
|
+
|
|
34
|
+
node -e "
|
|
35
|
+
const fs = require('fs');
|
|
36
|
+
const pkg = JSON.parse(fs.readFileSync('package.json', 'utf8'));
|
|
37
|
+
pkg.version = '$NEW';
|
|
38
|
+
fs.writeFileSync('package.json', JSON.stringify(pkg, null, 2) + '\n');
|
|
39
|
+
"
|
|
40
|
+
sed -i "s/export const CURRENT_VERSION = \".*\"/export const CURRENT_VERSION = \"$NEW\"/" src/lib/updater.ts
|
|
41
|
+
|
|
42
|
+
git add package.json src/lib/updater.ts
|
|
43
|
+
git commit -m "chore: bump version to v$NEW [skip ci]"
|
|
44
|
+
git tag "v$NEW"
|
|
45
|
+
git push origin main --tags
|
|
46
|
+
|
|
47
|
+
- uses: actions/setup-node@v4
|
|
48
|
+
with:
|
|
49
|
+
node-version: '22'
|
|
50
|
+
|
|
51
|
+
- name: Upgrade npm
|
|
52
|
+
run: npm install -g npm@latest
|
|
53
|
+
|
|
54
|
+
- name: Install dependencies
|
|
55
|
+
run: npm ci
|
|
56
|
+
|
|
57
|
+
- name: Build
|
|
58
|
+
run: npm run build
|
|
59
|
+
|
|
60
|
+
- name: Publish to npm
|
|
61
|
+
run: npm publish --provenance --access public
|
|
62
|
+
|
|
63
|
+
- uses: oven-sh/setup-bun@v2
|
|
64
|
+
with:
|
|
65
|
+
bun-version: latest
|
|
66
|
+
|
|
67
|
+
- name: Install dependencies (bun)
|
|
68
|
+
run: bun install
|
|
69
|
+
|
|
70
|
+
- name: Build binaries
|
|
71
|
+
run: |
|
|
72
|
+
mkdir -p bin
|
|
73
|
+
bun build --compile --target=bun-darwin-arm64 src/index.ts --outfile bin/lizard-darwin-arm64
|
|
74
|
+
bun build --compile --target=bun-darwin-x64 src/index.ts --outfile bin/lizard-darwin-x64
|
|
75
|
+
bun build --compile --target=bun-linux-x64 src/index.ts --outfile bin/lizard-linux-x64
|
|
76
|
+
bun build --compile --target=bun-linux-arm64 src/index.ts --outfile bin/lizard-linux-arm64
|
|
77
|
+
bun build --compile --target=bun-windows-x64 src/index.ts --outfile bin/lizard-windows-x64.exe
|
|
78
|
+
|
|
79
|
+
- name: Create GitHub release
|
|
80
|
+
uses: softprops/action-gh-release@v2
|
|
81
|
+
with:
|
|
82
|
+
tag_name: v${{ steps.bump.outputs.version }}
|
|
83
|
+
name: v${{ steps.bump.outputs.version }}
|
|
84
|
+
files: |
|
|
85
|
+
bin/lizard-darwin-arm64
|
|
86
|
+
bin/lizard-darwin-x64
|
|
87
|
+
bin/lizard-linux-x64
|
|
88
|
+
bin/lizard-linux-arm64
|
|
89
|
+
bin/lizard-windows-x64.exe
|
|
90
|
+
generate_release_notes: true
|
package/README.md
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
# Lizard CLI
|
|
2
|
+
|
|
3
|
+
Deploy and manage apps on [Lizard](https://lizard.build).
|
|
4
|
+
|
|
5
|
+
## Install
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
curl -fsSL https://lizard.build/install.sh | bash
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
Or via npm:
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
npm i -g @lizard-build/cli
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
## Usage
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
lizard login
|
|
21
|
+
lizard init
|
|
22
|
+
lizard up
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## Common commands
|
|
26
|
+
|
|
27
|
+
```
|
|
28
|
+
lizard up # upload and deploy code
|
|
29
|
+
lizard logs # stream runtime logs
|
|
30
|
+
lizard ps # list services
|
|
31
|
+
lizard add # add a database or service
|
|
32
|
+
lizard secrets # manage secrets
|
|
33
|
+
lizard scale # scale replicas / CPU / memory
|
|
34
|
+
lizard domain # manage domains
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
Run `lizard --help` for the full list.
|
|
38
|
+
|
|
39
|
+
## License
|
|
40
|
+
|
|
41
|
+
MIT
|
package/dist/commands/add.js
CHANGED
|
@@ -1,24 +1,154 @@
|
|
|
1
1
|
import chalk from "chalk";
|
|
2
2
|
import * as p from "@clack/prompts";
|
|
3
|
-
import { api } from "../lib/api.js";
|
|
4
|
-
import {
|
|
3
|
+
import { api, withQuery, withScope } from "../lib/api.js";
|
|
4
|
+
import { getProjectLink, updateProjectLink, DEFAULT_REGION } from "../lib/config.js";
|
|
5
|
+
import { scopeForProject } from "../lib/resolve.js";
|
|
6
|
+
import { resolveWorkspace } from "../lib/picker.js";
|
|
5
7
|
import { success, info, isJSONMode, printJSON, isTTY, table, } from "../lib/format.js";
|
|
8
|
+
import { validateName, addonRefName } from "../lib/name.js";
|
|
6
9
|
const CATALOG = [
|
|
7
10
|
{ name: "postgres", label: "PostgreSQL", description: "Relational database" },
|
|
8
11
|
{ name: "redis", label: "Redis", description: "In-memory key-value store" },
|
|
9
|
-
{ name: "
|
|
10
|
-
{ name: "mongodb", label: "MongoDB", description: "Document database" },
|
|
12
|
+
{ name: "s3", label: "S3 Bucket", description: "S3-compatible object storage" },
|
|
11
13
|
];
|
|
14
|
+
async function detectPortFromDockerfile(repo) {
|
|
15
|
+
const repoPath = repo.startsWith("http") ? repo.replace(/^https?:\/\/github\.com\//, "") : repo;
|
|
16
|
+
for (const branch of ["main", "master"]) {
|
|
17
|
+
try {
|
|
18
|
+
const res = await fetch(`https://raw.githubusercontent.com/${repoPath}/${branch}/Dockerfile`, { signal: AbortSignal.timeout(5000) });
|
|
19
|
+
if (!res.ok)
|
|
20
|
+
continue;
|
|
21
|
+
const text = await res.text();
|
|
22
|
+
const match = text.match(/^EXPOSE\s+(\d+)/m);
|
|
23
|
+
if (match)
|
|
24
|
+
return parseInt(match[1], 10);
|
|
25
|
+
}
|
|
26
|
+
catch { }
|
|
27
|
+
}
|
|
28
|
+
return undefined;
|
|
29
|
+
}
|
|
30
|
+
/** Most-useful env var to surface as a reference example for each addon type.
|
|
31
|
+
* Mirrors urlKey in lizard-client/src/components/AddonPanel.tsx. */
|
|
32
|
+
function addonExampleVar(type) {
|
|
33
|
+
switch (type) {
|
|
34
|
+
case "postgres":
|
|
35
|
+
case "mysql":
|
|
36
|
+
return "DATABASE_URL";
|
|
37
|
+
case "mongo":
|
|
38
|
+
return "MONGODB_URL";
|
|
39
|
+
case "redis":
|
|
40
|
+
return "REDIS_URL";
|
|
41
|
+
case "s3":
|
|
42
|
+
return "S3_ENDPOINT";
|
|
43
|
+
default:
|
|
44
|
+
return "KEY";
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
function normalizeDbName(name) {
|
|
48
|
+
for (const c of CATALOG) {
|
|
49
|
+
if (c.name === name)
|
|
50
|
+
return c.name;
|
|
51
|
+
if (c.aliases?.includes(name))
|
|
52
|
+
return c.name;
|
|
53
|
+
}
|
|
54
|
+
return name;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Resolve a project by name/slug/id. Name-based lookup hits /api/projects and
|
|
58
|
+
* matches against the list. Falls back to the cwd-linked project when no
|
|
59
|
+
* -p/--project is supplied.
|
|
60
|
+
*
|
|
61
|
+
* When `workspaceFlag` is provided, the lookup is constrained to that
|
|
62
|
+
* workspace — useful for disambiguating identically-named projects.
|
|
63
|
+
*/
|
|
64
|
+
async function resolveProject(flagValue, workspaceFlag) {
|
|
65
|
+
if (flagValue) {
|
|
66
|
+
let workspaceId;
|
|
67
|
+
if (workspaceFlag) {
|
|
68
|
+
workspaceId = (await resolveWorkspace(workspaceFlag)).id;
|
|
69
|
+
}
|
|
70
|
+
const projects = await api.get(withQuery("/api/projects", { workspaceId }));
|
|
71
|
+
const matches = projects.filter((pr) => pr.id === flagValue ||
|
|
72
|
+
pr.slug === flagValue ||
|
|
73
|
+
pr.name === flagValue);
|
|
74
|
+
if (matches.length === 0) {
|
|
75
|
+
throw new Error(`Project "${flagValue}" not found. Available: ${projects.map((pr) => pr.name).join(", ") || "(none)"}`);
|
|
76
|
+
}
|
|
77
|
+
if (matches.length > 1) {
|
|
78
|
+
const detail = matches
|
|
79
|
+
.map((m) => ` • ${m.name} in ${m.workspaceName ?? "(personal)"}`)
|
|
80
|
+
.join("\n");
|
|
81
|
+
throw new Error(`Multiple projects named "${flagValue}" found:\n${detail}\nPass --workspace to disambiguate.`);
|
|
82
|
+
}
|
|
83
|
+
return matches[0].id;
|
|
84
|
+
}
|
|
85
|
+
const link = getProjectLink();
|
|
86
|
+
if (link?.projectId)
|
|
87
|
+
return link.projectId;
|
|
88
|
+
throw new Error("No project linked to this directory. Pass -p <project-name> or run `lizard init`.");
|
|
89
|
+
}
|
|
90
|
+
function parseVariables(pairs) {
|
|
91
|
+
if (!pairs?.length)
|
|
92
|
+
return {};
|
|
93
|
+
const out = {};
|
|
94
|
+
for (const pair of pairs) {
|
|
95
|
+
const eq = pair.indexOf("=");
|
|
96
|
+
if (eq < 1)
|
|
97
|
+
throw new Error(`Invalid variable: "${pair}". Use KEY=value`);
|
|
98
|
+
out[pair.slice(0, eq)] = pair.slice(eq + 1);
|
|
99
|
+
}
|
|
100
|
+
return out;
|
|
101
|
+
}
|
|
12
102
|
export function registerAdd(program) {
|
|
13
103
|
program
|
|
14
104
|
.command("add")
|
|
15
|
-
.argument("[
|
|
16
|
-
.description("Add a service to the project")
|
|
17
|
-
.option("--
|
|
18
|
-
.option("--
|
|
19
|
-
.
|
|
20
|
-
|
|
21
|
-
|
|
105
|
+
.argument("[types...]", "Addon type(s) to add (postgres / redis / s3). Multiple allowed: `add postgres redis s3`")
|
|
106
|
+
.description("Add a database, service, or repo to the project")
|
|
107
|
+
.option("-a, --addon <type...>", "Add one or more managed addons (multi-add: -a postgres -a redis -a s3)")
|
|
108
|
+
.option("-s, --service <name>", "Create an empty service with this name")
|
|
109
|
+
.option("-r, --repo <repo>", "Create a service from a GitHub repo (owner/repo)")
|
|
110
|
+
.option("-v, --variables <kv>", "KEY=value pair to seed the service. Repeat for multiple: -v K1=v1 -v K2=v2. Ignored for managed addons.", (val, prev) => [...prev, val], [])
|
|
111
|
+
.option("-n, --name <name>", "Name used in ${{<name>.KEY}} templates and shown in the dashboard. Renamable; refs stay stable.")
|
|
112
|
+
.option("--instance-name <name>", "(deprecated) alias for --name")
|
|
113
|
+
.option("-w, --workspace <ws>", "Disambiguate project lookup by workspace")
|
|
114
|
+
.option("--region <code>", "Region to provision the addon/service in")
|
|
115
|
+
.option("--no-deploy", "With -r: attach repo but skip the initial build. First deploy fires on next `service set` or `redeploy`.")
|
|
116
|
+
.option("--list", "Show available database types")
|
|
117
|
+
.action(async (types, opts, command) => {
|
|
118
|
+
const merged = command.optsWithGlobals();
|
|
119
|
+
await runAdd({
|
|
120
|
+
types,
|
|
121
|
+
addon: opts.addon,
|
|
122
|
+
service: opts.service,
|
|
123
|
+
repo: opts.repo,
|
|
124
|
+
variables: opts.variables,
|
|
125
|
+
name: opts.name,
|
|
126
|
+
instanceName: opts.instanceName,
|
|
127
|
+
workspace: opts.workspace,
|
|
128
|
+
region: opts.region,
|
|
129
|
+
noDeploy: opts.deploy === false,
|
|
130
|
+
list: opts.list,
|
|
131
|
+
projectFlag: merged.project,
|
|
132
|
+
});
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
async function runAdd(input) {
|
|
136
|
+
const types = input.types ?? [];
|
|
137
|
+
const opts = {
|
|
138
|
+
addon: input.addon,
|
|
139
|
+
service: input.service,
|
|
140
|
+
repo: input.repo,
|
|
141
|
+
variables: input.variables,
|
|
142
|
+
name: input.name,
|
|
143
|
+
instanceName: input.instanceName,
|
|
144
|
+
list: input.list,
|
|
145
|
+
};
|
|
146
|
+
const projectFlag = input.projectFlag;
|
|
147
|
+
const workspaceFlag = input.workspace;
|
|
148
|
+
const region = input.region ?? DEFAULT_REGION;
|
|
149
|
+
{
|
|
150
|
+
// ── --list: show DB catalog and exit ──────────────────────────────
|
|
151
|
+
if (opts.list || (!types.length && !opts.addon && !opts.service && !opts.repo && !isTTY())) {
|
|
22
152
|
if (isJSONMode()) {
|
|
23
153
|
printJSON(CATALOG);
|
|
24
154
|
}
|
|
@@ -27,46 +157,189 @@ export function registerAdd(program) {
|
|
|
27
157
|
}
|
|
28
158
|
return;
|
|
29
159
|
}
|
|
30
|
-
|
|
31
|
-
if (!name) {
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
options: CATALOG.map((c) => ({
|
|
35
|
-
value: c.name,
|
|
36
|
-
label: c.label,
|
|
37
|
-
hint: c.description,
|
|
38
|
-
})),
|
|
39
|
-
});
|
|
40
|
-
if (p.isCancel(selected))
|
|
41
|
-
process.exit(5);
|
|
42
|
-
name = selected;
|
|
160
|
+
const variables = parseVariables(opts.variables);
|
|
161
|
+
if (opts.instanceName && !opts.name) {
|
|
162
|
+
info(chalk.yellow("Warning: --instance-name is deprecated, use --name instead."));
|
|
163
|
+
opts.name = opts.instanceName;
|
|
43
164
|
}
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
165
|
+
if (opts.name) {
|
|
166
|
+
const err = validateName(opts.name);
|
|
167
|
+
if (err)
|
|
168
|
+
throw new Error(`Invalid --name: ${err}`);
|
|
48
169
|
}
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
const
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
170
|
+
// Resolve project up front so we fail before any wizard prompts or
|
|
171
|
+
// API calls instead of after the user has filled out the wizard.
|
|
172
|
+
const projectId = await resolveProject(projectFlag, workspaceFlag);
|
|
173
|
+
const scope = await scopeForProject(projectId);
|
|
174
|
+
// ── positional <types...> and/or -a <type...> ────────────────────
|
|
175
|
+
const databases = [];
|
|
176
|
+
const candidates = [...(opts.addon ?? []), ...types];
|
|
177
|
+
for (const t of candidates) {
|
|
178
|
+
const norm = normalizeDbName(t);
|
|
179
|
+
if (!CATALOG.some((c) => c.name === norm)) {
|
|
180
|
+
throw new Error(`Unknown addon "${t}". Available: ${CATALOG.map((c) => c.name).join(", ")}`);
|
|
181
|
+
}
|
|
182
|
+
databases.push(norm);
|
|
183
|
+
}
|
|
184
|
+
// Nudge users off the verbose single-arg `-a` form toward `lizard add <type>`.
|
|
185
|
+
if (opts.addon?.length === 1 && !types.length && !isJSONMode()) {
|
|
186
|
+
info(chalk.dim(`Tip: shorter form — \`lizard add ${opts.addon[0]}\``));
|
|
187
|
+
}
|
|
188
|
+
if (databases.length > 0) {
|
|
189
|
+
if (opts.variables?.length) {
|
|
190
|
+
info(chalk.yellow("Warning: --variables is ignored for managed addons"));
|
|
191
|
+
}
|
|
192
|
+
const isSingle = databases.length === 1;
|
|
193
|
+
for (const db of databases) {
|
|
194
|
+
const cat = CATALOG.find((c) => c.name === db);
|
|
195
|
+
info(`Adding ${chalk.cyan(cat.label)}...`);
|
|
196
|
+
const addon = await api.post(withScope(`/api/projects/${projectId}/addons`, scope), {
|
|
197
|
+
type: db,
|
|
198
|
+
region,
|
|
199
|
+
...(opts.name ? { name: opts.name } : {}),
|
|
200
|
+
});
|
|
201
|
+
if (isJSONMode())
|
|
202
|
+
printJSON(addon);
|
|
203
|
+
else {
|
|
204
|
+
success(`${cat.label} added`);
|
|
205
|
+
const ref = addonRefName({ name: addon.name, type: addon.type, addonType: addon.addonType });
|
|
206
|
+
const exampleVar = addonExampleVar(db);
|
|
207
|
+
if (ref)
|
|
208
|
+
info(` Name: ${chalk.bold(ref)}`);
|
|
209
|
+
if (ref) {
|
|
210
|
+
info("");
|
|
211
|
+
info(chalk.dim(` Reference the ${exampleVar} from other services:`));
|
|
212
|
+
info(` ${chalk.cyan(`\${{${ref}.${exampleVar}}}`)}`);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
if (isSingle) {
|
|
216
|
+
try {
|
|
217
|
+
updateProjectLink({ serviceId: addon.id, serviceName: addon.name });
|
|
218
|
+
}
|
|
219
|
+
catch { }
|
|
220
|
+
}
|
|
221
|
+
}
|
|
58
222
|
return;
|
|
59
223
|
}
|
|
60
|
-
|
|
61
|
-
if (
|
|
62
|
-
|
|
224
|
+
// ── -r <repo> ─────────────────────────────────────────────────────
|
|
225
|
+
if (opts.repo) {
|
|
226
|
+
const serviceName = opts.name || opts.service || opts.repo.split("/").pop() || "service";
|
|
227
|
+
info(`Creating service ${chalk.bold(serviceName)} from ${chalk.cyan(opts.repo)}...`);
|
|
228
|
+
const detectedPort = await detectPortFromDockerfile(opts.repo);
|
|
229
|
+
if (detectedPort)
|
|
230
|
+
info(`Detected port ${chalk.bold(detectedPort)} from Dockerfile`);
|
|
231
|
+
const app = await api.post(withScope(`/api/projects/${projectId}/apps`, scope), {
|
|
232
|
+
name: serviceName,
|
|
233
|
+
repoUrl: opts.repo.startsWith("http")
|
|
234
|
+
? opts.repo
|
|
235
|
+
: `https://github.com/${opts.repo}`,
|
|
236
|
+
region,
|
|
237
|
+
variables,
|
|
238
|
+
...(detectedPort ? { containerPort: detectedPort } : {}),
|
|
239
|
+
...(input.noDeploy ? { skipInitialDeploy: true } : {}),
|
|
240
|
+
});
|
|
241
|
+
if (isJSONMode())
|
|
242
|
+
printJSON(app);
|
|
243
|
+
else {
|
|
244
|
+
success(`Service ${chalk.bold(app.name)} created${input.noDeploy ? " (initial deploy deferred)" : ""}`);
|
|
245
|
+
info("");
|
|
246
|
+
if (input.noDeploy) {
|
|
247
|
+
info(chalk.dim(` Configure and trigger the first deploy:`));
|
|
248
|
+
info(` ${chalk.cyan(`lizard service set ${app.name} --set buildCommand='...' --set startCommand='...'`)}`);
|
|
249
|
+
info("");
|
|
250
|
+
}
|
|
251
|
+
info(chalk.dim(` Reference this service's private URL from other services:`));
|
|
252
|
+
info(` ${chalk.cyan(`\${{${app.name}.LIZARD_PRIVATE_DOMAIN}}`)}`);
|
|
253
|
+
}
|
|
254
|
+
try {
|
|
255
|
+
updateProjectLink({ serviceId: app.id, serviceName: app.name });
|
|
256
|
+
}
|
|
257
|
+
catch { }
|
|
258
|
+
return;
|
|
259
|
+
}
|
|
260
|
+
// ── --service <name> (empty service) ──────────────────────────────
|
|
261
|
+
if (opts.service) {
|
|
262
|
+
info(`Creating empty service ${chalk.bold(opts.service)}...`);
|
|
263
|
+
const app = await api.post(withScope(`/api/projects/${projectId}/apps`, scope), {
|
|
264
|
+
name: opts.service,
|
|
265
|
+
region,
|
|
266
|
+
variables,
|
|
267
|
+
});
|
|
268
|
+
if (isJSONMode())
|
|
269
|
+
printJSON(app);
|
|
270
|
+
else {
|
|
271
|
+
success(`Service ${chalk.bold(app.name)} created`);
|
|
272
|
+
info("");
|
|
273
|
+
info(chalk.dim(` Reference this service's private URL from other services:`));
|
|
274
|
+
info(` ${chalk.cyan(`\${{${app.name}.LIZARD_PRIVATE_DOMAIN}}`)}`);
|
|
275
|
+
}
|
|
276
|
+
try {
|
|
277
|
+
updateProjectLink({ serviceId: app.id, serviceName: app.name });
|
|
278
|
+
}
|
|
279
|
+
catch { }
|
|
280
|
+
return;
|
|
63
281
|
}
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
282
|
+
// ── No flags + no positional → interactive wizard ────────────────
|
|
283
|
+
// After the wizard collects a concrete choice we re-enter runAdd
|
|
284
|
+
// directly (no program.parseAsync round-trip): runAdd routes to a
|
|
285
|
+
// concrete branch above based on the inputs we hand it.
|
|
286
|
+
if (!types.length && !input.skipWizard && isTTY()) {
|
|
287
|
+
const kind = await p.select({
|
|
288
|
+
message: "What do you need?",
|
|
289
|
+
options: [
|
|
290
|
+
{ value: "database", label: "Database", hint: "postgres / redis" },
|
|
291
|
+
{ value: "s3", label: "S3 Bucket", hint: "S3-compatible object storage" },
|
|
292
|
+
{ value: "repo", label: "GitHub Repo", hint: "create a service from a repo" },
|
|
293
|
+
{ value: "service", label: "Empty Service", hint: "create a service to upload code into" },
|
|
294
|
+
],
|
|
295
|
+
});
|
|
296
|
+
if (p.isCancel(kind))
|
|
297
|
+
process.exit(5);
|
|
298
|
+
if (kind === "database") {
|
|
299
|
+
const sel = await p.select({
|
|
300
|
+
message: "Select database",
|
|
301
|
+
options: CATALOG.filter((c) => c.name !== "s3").map((c) => ({
|
|
302
|
+
value: c.name,
|
|
303
|
+
label: c.label,
|
|
304
|
+
hint: c.description,
|
|
305
|
+
})),
|
|
306
|
+
});
|
|
307
|
+
if (p.isCancel(sel))
|
|
308
|
+
process.exit(5);
|
|
309
|
+
await runAdd({ ...input, types: [sel], skipWizard: true });
|
|
310
|
+
return;
|
|
311
|
+
}
|
|
312
|
+
if (kind === "s3") {
|
|
313
|
+
await runAdd({ ...input, types: ["s3"], skipWizard: true });
|
|
314
|
+
return;
|
|
315
|
+
}
|
|
316
|
+
if (kind === "repo") {
|
|
317
|
+
const repo = await p.text({ message: "Repo (owner/name)" });
|
|
318
|
+
if (p.isCancel(repo))
|
|
319
|
+
process.exit(5);
|
|
320
|
+
const svc = await p.text({ message: "Service name", placeholder: String(repo).split("/").pop() });
|
|
321
|
+
if (p.isCancel(svc))
|
|
322
|
+
process.exit(5);
|
|
323
|
+
await runAdd({
|
|
324
|
+
...input,
|
|
325
|
+
repo: String(repo),
|
|
326
|
+
service: String(svc) || undefined,
|
|
327
|
+
skipWizard: true,
|
|
328
|
+
});
|
|
329
|
+
return;
|
|
330
|
+
}
|
|
331
|
+
if (kind === "service") {
|
|
332
|
+
const svc = await p.text({ message: "Service name" });
|
|
333
|
+
if (p.isCancel(svc))
|
|
334
|
+
process.exit(5);
|
|
335
|
+
await runAdd({ ...input, service: String(svc), skipWizard: true });
|
|
336
|
+
return;
|
|
68
337
|
}
|
|
69
338
|
}
|
|
70
|
-
|
|
339
|
+
throw new Error("No service type specified. Examples:\n" +
|
|
340
|
+
" lizard add postgres Add a managed database\n" +
|
|
341
|
+
" lizard add -r owner/repo Create a service from a GitHub repo\n" +
|
|
342
|
+
" lizard add -s my-service Empty service");
|
|
343
|
+
}
|
|
71
344
|
}
|
|
72
345
|
//# sourceMappingURL=add.js.map
|
package/dist/commands/add.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"add.js","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"add.js","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import chalk from "chalk";
|
|
4
|
+
import ora from "ora";
|
|
5
|
+
import { api, withScope } from "../lib/api.js";
|
|
6
|
+
import { resolveProjectScope } from "../lib/resolve.js";
|
|
7
|
+
import { success, error, isJSONMode, printJSON } from "../lib/format.js";
|
|
8
|
+
export function registerConfig(program) {
|
|
9
|
+
const config = program.command("config").description("Manage project configuration");
|
|
10
|
+
config
|
|
11
|
+
.command("apply")
|
|
12
|
+
.description("Apply lizard-config.json to the project")
|
|
13
|
+
.option("-p, --project <id>", "Project name, slug, or ID")
|
|
14
|
+
.option("-f, --file <path>", "Path to config file (default: lizard-config.json)")
|
|
15
|
+
.option("--dry-run", "Show what would change without applying")
|
|
16
|
+
.action(async (opts) => {
|
|
17
|
+
const filePath = opts.file
|
|
18
|
+
? path.resolve(opts.file)
|
|
19
|
+
: path.join(process.cwd(), "lizard-config.json");
|
|
20
|
+
if (!fs.existsSync(filePath)) {
|
|
21
|
+
error(`Config file not found: ${filePath}`);
|
|
22
|
+
process.exit(1);
|
|
23
|
+
}
|
|
24
|
+
let config;
|
|
25
|
+
try {
|
|
26
|
+
config = JSON.parse(fs.readFileSync(filePath, "utf-8"));
|
|
27
|
+
}
|
|
28
|
+
catch (e) {
|
|
29
|
+
error(`Failed to parse config file: ${e.message}`);
|
|
30
|
+
process.exit(1);
|
|
31
|
+
}
|
|
32
|
+
const { projectId, scope } = await resolveProjectScope(opts.project);
|
|
33
|
+
if (opts.dryRun) {
|
|
34
|
+
printJSON({ dryRun: true, projectId, config });
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
const spinner = ora("Applying config...").start();
|
|
38
|
+
try {
|
|
39
|
+
const result = await api.post(withScope(`/api/projects/${projectId}/config:apply`, scope), config);
|
|
40
|
+
spinner.stop();
|
|
41
|
+
if (isJSONMode()) {
|
|
42
|
+
printJSON(result);
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
const changed = [
|
|
46
|
+
...(result.services || []).filter((s) => s.changed?.length > 0),
|
|
47
|
+
...(result.addons || []).filter((a) => a.changed?.length > 0),
|
|
48
|
+
];
|
|
49
|
+
if (changed.length === 0) {
|
|
50
|
+
success("Config applied — nothing changed");
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
success(`Config applied (revision ${result.revision})`);
|
|
54
|
+
for (const svc of result.services || []) {
|
|
55
|
+
if (svc.changed?.length > 0) {
|
|
56
|
+
console.log(` ${chalk.cyan(svc.name)}: ${svc.changed.join(", ")}`);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
catch (e) {
|
|
62
|
+
spinner.stop();
|
|
63
|
+
error(`Failed to apply config: ${e.message}`);
|
|
64
|
+
process.exit(1);
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import open from "open";
|
|
2
|
+
import { success } from "../lib/format.js";
|
|
3
|
+
const DOCS_URL = "https://docs.lizard.build";
|
|
4
|
+
export function registerDocs(program) {
|
|
5
|
+
program
|
|
6
|
+
.command("docs")
|
|
7
|
+
.description("Open Lizard documentation in browser")
|
|
8
|
+
.action(async () => {
|
|
9
|
+
await open(DOCS_URL);
|
|
10
|
+
success(`Opened ${DOCS_URL}`);
|
|
11
|
+
});
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=docs.js.map
|