@kud/gandi-cli 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +161 -28
- package/dist/commands/auth-whoami.d.ts +4 -0
- package/dist/commands/auth-whoami.d.ts.map +1 -0
- package/dist/commands/auth-whoami.js +66 -0
- package/dist/commands/auth-whoami.js.map +1 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -1
- package/dist/lib/api.d.ts +2 -1
- package/dist/lib/api.d.ts.map +1 -1
- package/dist/lib/api.js +12 -0
- package/dist/lib/api.js.map +1 -1
- package/dist/types/gandi.d.ts +11 -0
- package/dist/types/gandi.d.ts.map +1 -1
- package/package.json +4 -2
package/README.md
CHANGED
|
@@ -1,59 +1,192 @@
|
|
|
1
|
-
|
|
1
|
+
```
|
|
2
|
+
██████╗ █████╗ ███╗ ██╗██████╗ ██╗ ██████╗██╗ ██╗
|
|
3
|
+
██╔════╝ ██╔══██╗████╗ ██║██╔══██╗██║ ██╔════╝██║ ██║
|
|
4
|
+
██║ ███╗███████║██╔██╗██║██║ ██║██║ ██║ ██║ ██║
|
|
5
|
+
██║ ██║██╔══██║██║╚████║██║ ██║██║ ██║ ██║ ██║
|
|
6
|
+
╚██████╔╝██║ ██║██║ ╚███║██████╔╝███████╗╚██████╗███████╗██║
|
|
7
|
+
╚═════╝ ╚═╝ ╚═╝╚═╝ ╚══╝╚═════╝ ╚══════╝ ╚═════╝╚══════╝╚═╝
|
|
8
|
+
```
|
|
9
|
+
|
|
10
|
+
<div align="center">
|
|
11
|
+
|
|
12
|
+

|
|
13
|
+

|
|
14
|
+

|
|
15
|
+

|
|
16
|
+
|
|
17
|
+
**A modern CLI for the Gandi v5 REST API.**
|
|
18
|
+
|
|
19
|
+
[Features](#-features) • [Quick Start](#-quick-start) • [CLI Reference](#-cli-reference) • [Development](#-development) • [Authentication](#-authentication)
|
|
20
|
+
|
|
21
|
+
</div>
|
|
22
|
+
|
|
23
|
+
---
|
|
2
24
|
|
|
3
|
-
|
|
25
|
+
## 🌟 Features
|
|
4
26
|
|
|
5
|
-
|
|
27
|
+
- 🌐 **Domain Management** — List all registered domains with expiry dates and statuses, and renew them for one or more years
|
|
28
|
+
- 🔧 **Full DNS Control** — List, create, update, and delete LiveDNS records with support for custom TTLs and all standard record types
|
|
29
|
+
- 🩺 **Permission Doctor** — Built-in `gandi doctor` checks your PAT scopes and shows exactly which commands are unlocked
|
|
30
|
+
- 🔐 **PAT Authentication** — Uses Gandi Personal Access Tokens with fine-grained scope control — only grant what you need
|
|
31
|
+
- ⚡ **Rich Terminal UI** — Built with Ink and React for spinners, aligned tables, and clean formatted output
|
|
32
|
+
- 📦 **Zero Config** — Set one env var or add one line to a TOML file and you're ready to go
|
|
33
|
+
|
|
34
|
+
---
|
|
35
|
+
|
|
36
|
+
## 🚀 Quick Start
|
|
37
|
+
|
|
38
|
+
### 1. Install
|
|
6
39
|
|
|
7
40
|
```sh
|
|
8
41
|
npm install -g @kud/gandi-cli
|
|
9
42
|
```
|
|
10
43
|
|
|
11
|
-
|
|
44
|
+
### 2. Authenticate
|
|
45
|
+
|
|
46
|
+
Generate a **Personal Access Token** at **gandi.net → Account → Partage → Créer un jeton d'accès personnel** then export it:
|
|
47
|
+
|
|
48
|
+
```sh
|
|
49
|
+
export GANDI_API_KEY="your-token-here"
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
### 3. Check permissions
|
|
53
|
+
|
|
54
|
+
```sh
|
|
55
|
+
gandi doctor
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
```
|
|
59
|
+
Gandi CLI
|
|
60
|
+
Expires in 29 days · 1 entity
|
|
61
|
+
|
|
62
|
+
✓ domain:view gandi domain list
|
|
63
|
+
✗ domain:renew gandi domain renew
|
|
64
|
+
✓ domain:tech gandi dns list / set / delete
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
### 4. Manage domains and DNS
|
|
68
|
+
|
|
69
|
+
```sh
|
|
70
|
+
gandi domain list
|
|
71
|
+
|
|
72
|
+
gandi dns list example.com
|
|
73
|
+
gandi dns set example.com A www 1.2.3.4 --ttl 300
|
|
74
|
+
gandi dns delete example.com A www
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
---
|
|
78
|
+
|
|
79
|
+
## 📖 CLI Reference
|
|
80
|
+
|
|
81
|
+
| Command | Description |
|
|
82
|
+
| -------------------------------------------------------------- | --------------------------------------------- |
|
|
83
|
+
| `gandi doctor` | Check token info and permissions |
|
|
84
|
+
| `gandi domain list` | List all domains with expiry dates and status |
|
|
85
|
+
| `gandi domain renew <domain>` | Renew a domain for 1 year |
|
|
86
|
+
| `gandi domain renew <domain> --duration <years>` | Renew for a specified number of years |
|
|
87
|
+
| `gandi dns list <domain>` | List all DNS records for a domain |
|
|
88
|
+
| `gandi dns set <domain> <type> <name> <value>` | Create or replace a DNS record |
|
|
89
|
+
| `gandi dns set <domain> <type> <name> <value> --ttl <seconds>` | Set with a custom TTL in seconds |
|
|
90
|
+
| `gandi dns delete <domain> <type> <name>` | Delete a DNS record |
|
|
91
|
+
|
|
92
|
+
---
|
|
93
|
+
|
|
94
|
+
## 🔧 Development
|
|
95
|
+
|
|
96
|
+
**Project Structure**
|
|
97
|
+
|
|
98
|
+
```
|
|
99
|
+
gandi-cli/
|
|
100
|
+
├── src/
|
|
101
|
+
│ ├── commands/
|
|
102
|
+
│ │ ├── doctor.tsx
|
|
103
|
+
│ │ ├── domain-list.tsx
|
|
104
|
+
│ │ ├── domain-renew.tsx
|
|
105
|
+
│ │ ├── dns-list.tsx
|
|
106
|
+
│ │ ├── dns-set.tsx
|
|
107
|
+
│ │ └── dns-delete.tsx
|
|
108
|
+
│ ├── components/
|
|
109
|
+
│ │ ├── error.tsx
|
|
110
|
+
│ │ ├── spinner-action.tsx
|
|
111
|
+
│ │ └── table.tsx
|
|
112
|
+
│ ├── lib/
|
|
113
|
+
│ │ ├── api.ts
|
|
114
|
+
│ │ └── config.ts
|
|
115
|
+
│ ├── types/
|
|
116
|
+
│ │ └── gandi.ts
|
|
117
|
+
│ └── index.tsx
|
|
118
|
+
├── dist/
|
|
119
|
+
├── package.json
|
|
120
|
+
└── README.md
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
**Scripts**
|
|
124
|
+
|
|
125
|
+
| Script | Description |
|
|
126
|
+
| --------------- | -------------------------------------------- |
|
|
127
|
+
| `npm run build` | Compile TypeScript to `dist/` |
|
|
128
|
+
| `npm run dev` | Run directly with tsx — no build step needed |
|
|
129
|
+
| `npm run start` | Run compiled output from `dist/` |
|
|
130
|
+
|
|
131
|
+
**Workflow**
|
|
132
|
+
|
|
133
|
+
```sh
|
|
134
|
+
git clone https://github.com/kud/gandi-cli.git
|
|
135
|
+
cd gandi-cli
|
|
136
|
+
npm install
|
|
137
|
+
npm run dev -- doctor
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
---
|
|
12
141
|
|
|
13
|
-
|
|
142
|
+
## 🔒 Authentication
|
|
14
143
|
|
|
15
|
-
|
|
16
|
-
Expiry: your preference
|
|
17
|
-
Resource access: **Restreint aux produits sélectionnés**
|
|
144
|
+
gandi-cli uses **Personal Access Tokens (PATs)** — not legacy API keys.
|
|
18
145
|
|
|
19
|
-
|
|
146
|
+
Generate a token at **gandi.net → Account → Partage → Créer un jeton d'accès personnel** with only the permissions you need:
|
|
20
147
|
|
|
21
|
-
| Permission |
|
|
148
|
+
| Permission | Required for |
|
|
22
149
|
| ----------------------------------------------- | ----------------------------------- |
|
|
23
150
|
| Voir la liste de vos domaines | `gandi domain list` |
|
|
24
151
|
| Gérer le renouvellement de vos domaines | `gandi domain renew` |
|
|
25
152
|
| Accéder aux enregistrements DNS de vos domaines | `gandi dns list` |
|
|
26
153
|
| Gérer les enregistrements DNS de vos domaines | `gandi dns set`, `gandi dns delete` |
|
|
27
154
|
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
Then export the key in your shell:
|
|
155
|
+
**Via environment variable** (takes precedence):
|
|
31
156
|
|
|
32
157
|
```sh
|
|
33
158
|
export GANDI_API_KEY="your-token-here"
|
|
34
159
|
```
|
|
35
160
|
|
|
36
|
-
|
|
161
|
+
**Via config file** (`~/.config/gandi/config.toml`):
|
|
37
162
|
|
|
38
163
|
```toml
|
|
39
164
|
api_key = "your-token-here"
|
|
40
165
|
```
|
|
41
166
|
|
|
42
|
-
|
|
167
|
+
- ✅ Only grant permissions each command actually needs
|
|
168
|
+
- ✅ Set an expiry date on the token
|
|
169
|
+
- ✅ Use `gandi doctor` to verify scopes before running commands
|
|
43
170
|
|
|
44
|
-
|
|
171
|
+
---
|
|
45
172
|
|
|
46
|
-
|
|
47
|
-
gandi domain list
|
|
48
|
-
gandi domain renew example.com
|
|
49
|
-
gandi domain renew example.com --duration 2
|
|
50
|
-
```
|
|
173
|
+
## 🏗 Tech Stack
|
|
51
174
|
|
|
52
|
-
|
|
175
|
+
| Component | Details |
|
|
176
|
+
| ------------- | ---------------------- |
|
|
177
|
+
| Runtime | Node.js ≥ 20 |
|
|
178
|
+
| Language | TypeScript 5.x (ESM) |
|
|
179
|
+
| Terminal UI | Ink 7 + React 19 |
|
|
180
|
+
| CLI Framework | Commander.js 12 |
|
|
181
|
+
| Config | smol-toml |
|
|
182
|
+
| Package | npm · `@kud/gandi-cli` |
|
|
53
183
|
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
184
|
+
---
|
|
185
|
+
|
|
186
|
+
<div align="center">
|
|
187
|
+
|
|
188
|
+
MIT © [kud](https://github.com/kud) — Made with ❤️ for the terminal
|
|
189
|
+
|
|
190
|
+
⭐ Star this repo if it saves you time · [↑ Back to top](#)
|
|
191
|
+
|
|
192
|
+
</div>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-whoami.d.ts","sourceRoot":"","sources":["../../src/commands/auth-whoami.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA8B,MAAM,OAAO,CAAA;AA2BlD,QAAA,MAAM,UAAU,yBAmDf,CAAA;AAED,eAAe,UAAU,CAAA"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import React, { useEffect, useState } from "react";
|
|
2
|
+
import { Box, Text } from "ink";
|
|
3
|
+
import { getTokenInfo } from "../lib/api.js";
|
|
4
|
+
import { getApiKey } from "../lib/config.js";
|
|
5
|
+
import SpinnerAction from "../components/spinner-action.js";
|
|
6
|
+
import ErrorMessage from "../components/error.js";
|
|
7
|
+
const SCOPE_MAP = {
|
|
8
|
+
"domain:view": { label: "View domains", commands: "gandi domain list" },
|
|
9
|
+
"domain:renew": {
|
|
10
|
+
label: "Renew domains",
|
|
11
|
+
commands: "gandi domain renew",
|
|
12
|
+
},
|
|
13
|
+
"domain:tech": {
|
|
14
|
+
label: "Manage DNS",
|
|
15
|
+
commands: "gandi dns list / set / delete",
|
|
16
|
+
},
|
|
17
|
+
};
|
|
18
|
+
const formatExpiry = (seconds) => {
|
|
19
|
+
const days = Math.floor(seconds / 86400);
|
|
20
|
+
if (days > 0)
|
|
21
|
+
return `${days} day${days !== 1 ? "s" : ""}`;
|
|
22
|
+
const hours = Math.floor(seconds / 3600);
|
|
23
|
+
return `${hours} hour${hours !== 1 ? "s" : ""}`;
|
|
24
|
+
};
|
|
25
|
+
const AuthWhoami = () => {
|
|
26
|
+
const [info, setInfo] = useState(null);
|
|
27
|
+
const [error, setError] = useState(null);
|
|
28
|
+
useEffect(() => {
|
|
29
|
+
const run = async () => {
|
|
30
|
+
try {
|
|
31
|
+
const key = getApiKey();
|
|
32
|
+
const data = await getTokenInfo(key);
|
|
33
|
+
setInfo(data);
|
|
34
|
+
}
|
|
35
|
+
catch (e) {
|
|
36
|
+
setError(e.message);
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
run();
|
|
40
|
+
}, []);
|
|
41
|
+
if (error)
|
|
42
|
+
return React.createElement(ErrorMessage, { message: error });
|
|
43
|
+
if (!info)
|
|
44
|
+
return React.createElement(SpinnerAction, { label: "Checking token\u2026" });
|
|
45
|
+
const knownScopes = Object.keys(SCOPE_MAP);
|
|
46
|
+
return (React.createElement(Box, { flexDirection: "column", gap: 1 },
|
|
47
|
+
React.createElement(Box, { flexDirection: "column" },
|
|
48
|
+
React.createElement(Text, { bold: true, color: "white" }, info.pat_name),
|
|
49
|
+
React.createElement(Text, { color: "gray" },
|
|
50
|
+
"Expires in ",
|
|
51
|
+
formatExpiry(info.expires_in),
|
|
52
|
+
" \u00B7 ",
|
|
53
|
+
info.entities.length,
|
|
54
|
+
" ",
|
|
55
|
+
info.entities.length !== 1 ? "entities" : "entity")),
|
|
56
|
+
React.createElement(Box, { flexDirection: "column" }, knownScopes.map((scope) => {
|
|
57
|
+
const has = info.scope.includes(scope);
|
|
58
|
+
const entry = SCOPE_MAP[scope];
|
|
59
|
+
return (React.createElement(Box, { key: scope, gap: 2 },
|
|
60
|
+
React.createElement(Text, { color: has ? "green" : "red" }, has ? "✓" : "✗"),
|
|
61
|
+
React.createElement(Text, { color: has ? "white" : "gray", dimColor: !has }, scope),
|
|
62
|
+
React.createElement(Text, { color: "gray" }, entry.commands)));
|
|
63
|
+
}))));
|
|
64
|
+
};
|
|
65
|
+
export default AuthWhoami;
|
|
66
|
+
//# sourceMappingURL=auth-whoami.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-whoami.js","sourceRoot":"","sources":["../../src/commands/auth-whoami.tsx"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
import React from "react";
|
|
3
3
|
import { render } from "ink";
|
|
4
4
|
import { Command } from "commander";
|
|
5
|
+
import AuthWhoami from "./commands/auth-whoami.js";
|
|
5
6
|
import DomainList from "./commands/domain-list.js";
|
|
6
7
|
import DomainRenew from "./commands/domain-renew.js";
|
|
7
8
|
import DnsList from "./commands/dns-list.js";
|
|
@@ -12,6 +13,10 @@ program
|
|
|
12
13
|
.name("gandi")
|
|
13
14
|
.description("Modern CLI for the Gandi v5 REST API")
|
|
14
15
|
.version("0.1.0");
|
|
16
|
+
program
|
|
17
|
+
.command("auth")
|
|
18
|
+
.description("Check token info and permissions")
|
|
19
|
+
.action(() => void render(React.createElement(AuthWhoami, null)));
|
|
15
20
|
const domain = program.command("domain").description("Manage domains");
|
|
16
21
|
domain
|
|
17
22
|
.command("list")
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.tsx"],"names":[],"mappings":";AACA,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,EAAE,MAAM,EAAE,MAAM,KAAK,CAAA;AAC5B,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,UAAU,MAAM,2BAA2B,CAAA;AAClD,OAAO,WAAW,MAAM,4BAA4B,CAAA;AACpD,OAAO,OAAO,MAAM,wBAAwB,CAAA;AAC5C,OAAO,MAAM,MAAM,uBAAuB,CAAA;AAC1C,OAAO,SAAS,MAAM,0BAA0B,CAAA;AAEhD,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAA;AAE7B,OAAO;KACJ,IAAI,CAAC,OAAO,CAAC;KACb,WAAW,CAAC,sCAAsC,CAAC;KACnD,OAAO,CAAC,OAAO,CAAC,CAAA;AAEnB,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,CAAC,gBAAgB,CAAC,CAAA;AAEtE,MAAM;KACH,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,kBAAkB,CAAC;KAC/B,MAAM,CAAC,GAAG,EAAE,CAAC,KAAK,MAAM,CAAC,oBAAC,UAAU,OAAG,CAAC,CAAC,CAAA;AAE5C,MAAM;KACH,OAAO,CAAC,gBAAgB,CAAC;KACzB,WAAW,CAAC,gBAAgB,CAAC;KAC7B,MAAM,CAAC,wBAAwB,EAAE,0BAA0B,EAAE,GAAG,CAAC;KACjE,MAAM,CAAC,CAAC,CAAS,EAAE,IAA0B,EAAE,EAAE;IAChD,KAAK,MAAM,CACT,oBAAC,WAAW,IAAC,MAAM,EAAE,CAAC,EAAE,QAAQ,EAAE,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC,GAAI,CAClE,CAAA;AACH,CAAC,CAAC,CAAA;AAEJ,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,WAAW,CAAC,wBAAwB,CAAC,CAAA;AAExE,GAAG;KACA,OAAO,CAAC,eAAe,CAAC;KACxB,WAAW,CAAC,+BAA+B,CAAC;KAC5C,MAAM,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,KAAK,MAAM,CAAC,oBAAC,OAAO,IAAC,MAAM,EAAE,CAAC,GAAI,CAAC,CAAC,CAAA;AAE7D,GAAG;KACA,OAAO,CAAC,oCAAoC,CAAC;KAC7C,WAAW,CAAC,gCAAgC,CAAC;KAC7C,MAAM,CAAC,qBAAqB,EAAE,gBAAgB,EAAE,OAAO,CAAC;KACxD,MAAM,CACL,CACE,CAAS,EACT,IAAY,EACZ,IAAY,EACZ,KAAa,EACb,IAAqB,EACrB,EAAE;IACF,KAAK,MAAM,CACT,oBAAC,MAAM,IACL,MAAM,EAAE,CAAC,EACT,IAAI,EAAE,IAAI,EACV,IAAI,EAAE,IAAI,EACV,KAAK,EAAE,KAAK,EACZ,GAAG,EAAE,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,GAC3B,CACH,CAAA;AACH,CAAC,CACF,CAAA;AAEH,GAAG;KACA,OAAO,CAAC,+BAA+B,CAAC;KACxC,WAAW,CAAC,qBAAqB,CAAC;KAClC,MAAM,CAAC,CAAC,CAAS,EAAE,IAAY,EAAE,IAAY,EAAE,EAAE;IAChD,KAAK,MAAM,CAAC,oBAAC,SAAS,IAAC,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,GAAI,CAAC,CAAA;AAC/D,CAAC,CAAC,CAAA;AAEJ,OAAO,CAAC,KAAK,EAAE,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.tsx"],"names":[],"mappings":"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"}
|
package/dist/lib/api.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import type { Domain, DnsRecord } from "../types/gandi.js";
|
|
1
|
+
import type { Domain, DnsRecord, TokenInfo } from "../types/gandi.js";
|
|
2
2
|
export declare const listDomains: (apiKey: string) => Promise<Domain[]>;
|
|
3
3
|
export declare const listDnsRecords: (apiKey: string, domain: string) => Promise<DnsRecord[]>;
|
|
4
4
|
export declare const setDnsRecord: (apiKey: string, domain: string, type: string, name: string, values: string[], ttl?: number) => Promise<void>;
|
|
5
5
|
export declare const deleteDnsRecord: (apiKey: string, domain: string, type: string, name: string) => Promise<void>;
|
|
6
|
+
export declare const getTokenInfo: (apiKey: string) => Promise<TokenInfo>;
|
|
6
7
|
//# sourceMappingURL=api.d.ts.map
|
package/dist/lib/api.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/lib/api.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/lib/api.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,MAAM,EACN,SAAS,EAET,SAAS,EACV,MAAM,mBAAmB,CAAA;AA6B1B,eAAO,MAAM,WAAW,GAAI,QAAQ,MAAM,KAAG,OAAO,CAAC,MAAM,EAAE,CACf,CAAA;AAE9C,eAAO,MAAM,cAAc,GACzB,QAAQ,MAAM,EACd,QAAQ,MAAM,KACb,OAAO,CAAC,SAAS,EAAE,CAC8C,CAAA;AAEpE,eAAO,MAAM,YAAY,GACvB,QAAQ,MAAM,EACd,QAAQ,MAAM,EACd,MAAM,MAAM,EACZ,MAAM,MAAM,EACZ,QAAQ,MAAM,EAAE,EAChB,YAAW,KACV,OAAO,CAAC,IAAI,CAIX,CAAA;AAEJ,eAAO,MAAM,eAAe,GAC1B,QAAQ,MAAM,EACd,QAAQ,MAAM,EACd,MAAM,MAAM,EACZ,MAAM,MAAM,KACX,OAAO,CAAC,IAAI,CAGX,CAAA;AAEJ,eAAO,MAAM,YAAY,GAAU,QAAQ,MAAM,KAAG,OAAO,CAAC,SAAS,CAWpE,CAAA"}
|
package/dist/lib/api.js
CHANGED
|
@@ -27,4 +27,16 @@ export const setDnsRecord = (apiKey, domain, type, name, values, ttl = 10800) =>
|
|
|
27
27
|
export const deleteDnsRecord = (apiKey, domain, type, name) => request(apiKey, `/livedns/domains/${domain}/records/${name}/${type}`, {
|
|
28
28
|
method: "DELETE",
|
|
29
29
|
});
|
|
30
|
+
export const getTokenInfo = async (apiKey) => {
|
|
31
|
+
const res = await fetch("https://id.gandi.net/tokeninfo", {
|
|
32
|
+
headers: { Authorization: `Bearer ${apiKey}` },
|
|
33
|
+
});
|
|
34
|
+
if (!res.ok) {
|
|
35
|
+
const err = (await res
|
|
36
|
+
.json()
|
|
37
|
+
.catch(() => ({ message: res.statusText })));
|
|
38
|
+
throw new Error(err.message ?? `HTTP ${res.status}`);
|
|
39
|
+
}
|
|
40
|
+
return res.json();
|
|
41
|
+
};
|
|
30
42
|
//# sourceMappingURL=api.js.map
|
package/dist/lib/api.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/lib/api.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/lib/api.ts"],"names":[],"mappings":"AAOA,MAAM,QAAQ,GAAG,0BAA0B,CAAA;AAE3C,MAAM,OAAO,GAAG,KAAK,EACnB,MAAc,EACd,IAAY,EACZ,UAAuB,EAAE,EACb,EAAE;IACd,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,QAAQ,GAAG,IAAI,EAAE,EAAE;QAC5C,GAAG,OAAO;QACV,OAAO,EAAE;YACP,aAAa,EAAE,UAAU,MAAM,EAAE;YACjC,cAAc,EAAE,kBAAkB;YAClC,GAAG,OAAO,CAAC,OAAO;SACnB;KACF,CAAC,CAAA;IAEF,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,MAAM,GAAG,GAAG,CAAC,MAAM,GAAG;aACnB,IAAI,EAAE;aACN,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC,CAAe,CAAA;QAC5D,MAAM,IAAI,KAAK,CAAC,GAAG,CAAC,OAAO,IAAI,QAAQ,GAAG,CAAC,MAAM,EAAE,CAAC,CAAA;IACtD,CAAC;IAED,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG;QAAE,OAAO,SAAc,CAAA;IAC7C,OAAO,GAAG,CAAC,IAAI,EAAgB,CAAA;AACjC,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,MAAc,EAAqB,EAAE,CAC/D,OAAO,CAAW,MAAM,EAAE,iBAAiB,CAAC,CAAA;AAE9C,MAAM,CAAC,MAAM,cAAc,GAAG,CAC5B,MAAc,EACd,MAAc,EACQ,EAAE,CACxB,OAAO,CAAc,MAAM,EAAE,oBAAoB,MAAM,UAAU,CAAC,CAAA;AAEpE,MAAM,CAAC,MAAM,YAAY,GAAG,CAC1B,MAAc,EACd,MAAc,EACd,IAAY,EACZ,IAAY,EACZ,MAAgB,EAChB,GAAG,GAAG,KAAK,EACI,EAAE,CACjB,OAAO,CAAO,MAAM,EAAE,oBAAoB,MAAM,YAAY,IAAI,IAAI,IAAI,EAAE,EAAE;IAC1E,MAAM,EAAE,KAAK;IACb,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,YAAY,EAAE,MAAM,EAAE,CAAC;CAC/D,CAAC,CAAA;AAEJ,MAAM,CAAC,MAAM,eAAe,GAAG,CAC7B,MAAc,EACd,MAAc,EACd,IAAY,EACZ,IAAY,EACG,EAAE,CACjB,OAAO,CAAO,MAAM,EAAE,oBAAoB,MAAM,YAAY,IAAI,IAAI,IAAI,EAAE,EAAE;IAC1E,MAAM,EAAE,QAAQ;CACjB,CAAC,CAAA;AAEJ,MAAM,CAAC,MAAM,YAAY,GAAG,KAAK,EAAE,MAAc,EAAsB,EAAE;IACvE,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,gCAAgC,EAAE;QACxD,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,MAAM,EAAE,EAAE;KAC/C,CAAC,CAAA;IACF,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,MAAM,GAAG,GAAG,CAAC,MAAM,GAAG;aACnB,IAAI,EAAE;aACN,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC,CAAe,CAAA;QAC5D,MAAM,IAAI,KAAK,CAAC,GAAG,CAAC,OAAO,IAAI,QAAQ,GAAG,CAAC,MAAM,EAAE,CAAC,CAAA;IACtD,CAAC;IACD,OAAO,GAAG,CAAC,IAAI,EAAwB,CAAA;AACzC,CAAC,CAAA"}
|
package/dist/types/gandi.d.ts
CHANGED
|
@@ -28,4 +28,15 @@ export interface GandiError {
|
|
|
28
28
|
object: string;
|
|
29
29
|
cause: string;
|
|
30
30
|
}
|
|
31
|
+
export interface TokenInfo {
|
|
32
|
+
user_id: string;
|
|
33
|
+
sharing_id: string;
|
|
34
|
+
pat_id: string;
|
|
35
|
+
pat_name: string;
|
|
36
|
+
scope: string[];
|
|
37
|
+
entities: {
|
|
38
|
+
id: string;
|
|
39
|
+
}[];
|
|
40
|
+
expires_in: number;
|
|
41
|
+
}
|
|
31
42
|
//# sourceMappingURL=gandi.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gandi.d.ts","sourceRoot":"","sources":["../../src/types/gandi.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,MAAM;IACrB,IAAI,EAAE,MAAM,CAAA;IACZ,YAAY,EAAE,MAAM,CAAA;IACpB,IAAI,EAAE,MAAM,CAAA;IACZ,EAAE,EAAE,MAAM,CAAA;IACV,WAAW,EAAE;QACX,OAAO,EAAE,MAAM,CAAA;KAChB,CAAA;IACD,KAAK,EAAE;QACL,UAAU,EAAE,MAAM,CAAA;QAClB,mBAAmB,EAAE,MAAM,CAAA;QAC3B,gBAAgB,EAAE,MAAM,CAAA;QACxB,UAAU,EAAE,MAAM,CAAA;KACnB,CAAA;IACD,MAAM,EAAE,MAAM,EAAE,CAAA;IAChB,GAAG,EAAE,MAAM,CAAA;CACZ;AAED,MAAM,WAAW,SAAS;IACxB,UAAU,EAAE,MAAM,CAAA;IAClB,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;IACjB,UAAU,EAAE,MAAM,CAAA;IAClB,YAAY,EAAE,MAAM,EAAE,CAAA;CACvB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,MAAM,CAAA;CACd"}
|
|
1
|
+
{"version":3,"file":"gandi.d.ts","sourceRoot":"","sources":["../../src/types/gandi.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,MAAM;IACrB,IAAI,EAAE,MAAM,CAAA;IACZ,YAAY,EAAE,MAAM,CAAA;IACpB,IAAI,EAAE,MAAM,CAAA;IACZ,EAAE,EAAE,MAAM,CAAA;IACV,WAAW,EAAE;QACX,OAAO,EAAE,MAAM,CAAA;KAChB,CAAA;IACD,KAAK,EAAE;QACL,UAAU,EAAE,MAAM,CAAA;QAClB,mBAAmB,EAAE,MAAM,CAAA;QAC3B,gBAAgB,EAAE,MAAM,CAAA;QACxB,UAAU,EAAE,MAAM,CAAA;KACnB,CAAA;IACD,MAAM,EAAE,MAAM,EAAE,CAAA;IAChB,GAAG,EAAE,MAAM,CAAA;CACZ;AAED,MAAM,WAAW,SAAS;IACxB,UAAU,EAAE,MAAM,CAAA;IAClB,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;IACjB,UAAU,EAAE,MAAM,CAAA;IAClB,YAAY,EAAE,MAAM,EAAE,CAAA;CACvB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,MAAM,CAAA;CACd;AAED,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAA;IACf,UAAU,EAAE,MAAM,CAAA;IAClB,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,KAAK,EAAE,MAAM,EAAE,CAAA;IACf,QAAQ,EAAE;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;IAC1B,UAAU,EAAE,MAAM,CAAA;CACnB"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kud/gandi-cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "A modern CLI for the Gandi v5 REST API",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -11,9 +11,10 @@
|
|
|
11
11
|
],
|
|
12
12
|
"scripts": {
|
|
13
13
|
"build": "tsc",
|
|
14
|
-
"dev": "
|
|
14
|
+
"dev": "tsx src/index.tsx",
|
|
15
15
|
"start": "node dist/index.js"
|
|
16
16
|
},
|
|
17
|
+
"homepage": "https://kud.github.io/gandi-cli",
|
|
17
18
|
"repository": {
|
|
18
19
|
"type": "git",
|
|
19
20
|
"url": "https://github.com/kud/gandi-cli"
|
|
@@ -27,6 +28,7 @@
|
|
|
27
28
|
"devDependencies": {
|
|
28
29
|
"@types/node": "^22.0.0",
|
|
29
30
|
"@types/react": "^19.0.0",
|
|
31
|
+
"tsx": "4.21.0",
|
|
30
32
|
"typescript": "^5.5.4"
|
|
31
33
|
}
|
|
32
34
|
}
|