@mailfn/cli 0.1.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 +13 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +7 -0
- package/dist/cli.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +152 -0
- package/dist/index.js.map +1 -0
- package/package.json +19 -0
package/README.md
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# `@mailfn/cli`
|
|
2
|
+
|
|
3
|
+
Least-privilege MailFn CLI built with `@clifn/core`.
|
|
4
|
+
|
|
5
|
+
```sh
|
|
6
|
+
MAILFN_URL=https://mail.example.com MAILFN_TOKEN=... mailfn inbox create --expires 3600 --idempotency-key run-123
|
|
7
|
+
mailfn message wait inb_123 --sender-domain example.com --subject Verify --timeout 30000
|
|
8
|
+
mailfn message extract inb_123 msg_123
|
|
9
|
+
mailfn operations --json
|
|
10
|
+
mailfn inbox create --json --show-secrets # explicit one-time credential reveal
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
Commands cover inbox create/list/get/delete, message list/read/wait/extract, token revoke, domain create/verify, and operations. Text and `--json` output pass through the same command-aware sanitizer. Message bodies, raw data, credentials, webhook secrets, and verification values are redacted by default. `message extract` is an explicit content action; `--show-content` explicitly opts into message content and `--show-secrets` explicitly reveals one-time credentials.
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { runMailFnCli } from './index.js';
|
|
3
|
+
runMailFnCli().then((code) => { process.exitCode = code; }).catch((error) => {
|
|
4
|
+
process.stderr.write(`${error instanceof Error ? error.message : String(error)}\n`);
|
|
5
|
+
process.exitCode = 1;
|
|
6
|
+
});
|
|
7
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE1C,YAAY,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IAC1E,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACpF,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;AACvB,CAAC,CAAC,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export interface RunMailFnCliOptions {
|
|
2
|
+
args?: string[];
|
|
3
|
+
env?: Record<string, string | undefined>;
|
|
4
|
+
stdout?: (value: string) => void;
|
|
5
|
+
stderr?: (value: string) => void;
|
|
6
|
+
}
|
|
7
|
+
export declare function runMailFnCli(options?: RunMailFnCliOptions): Promise<number>;
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,mBAAmB;IAClC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;IACzC,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CAClC;AAED,wBAAsB,YAAY,CAAC,OAAO,GAAE,mBAAwB,GAAG,OAAO,CAAC,MAAM,CAAC,CAgCrF"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
import { MailFnClient } from '@mailfn/client';
|
|
2
|
+
import { runAction } from '@clifn/core';
|
|
3
|
+
export async function runMailFnCli(options = {}) {
|
|
4
|
+
const env = options.env ?? process.env;
|
|
5
|
+
const args = options.args ?? process.argv.slice(2);
|
|
6
|
+
const parsed = parse(args);
|
|
7
|
+
return runAction(async (_options, context) => {
|
|
8
|
+
if (parsed.command === 'help') {
|
|
9
|
+
context.output.info(help());
|
|
10
|
+
return { exitCode: 0 };
|
|
11
|
+
}
|
|
12
|
+
const baseUrl = text(parsed.flags.url) ?? env.MAILFN_URL;
|
|
13
|
+
const token = text(parsed.flags.token) ?? env.MAILFN_TOKEN;
|
|
14
|
+
if (!baseUrl || !token)
|
|
15
|
+
throw new Error('MAILFN_URL and MAILFN_TOKEN (or --url and --token) are required');
|
|
16
|
+
const client = new MailFnClient({ baseUrl, token });
|
|
17
|
+
const data = await execute(client, parsed.command, parsed.positionals, parsed.flags);
|
|
18
|
+
const safe = redactForCommand(parsed.command, data, {
|
|
19
|
+
showContent: Boolean(parsed.flags.showContent),
|
|
20
|
+
showSecrets: Boolean(parsed.flags.showSecrets),
|
|
21
|
+
});
|
|
22
|
+
if (parsed.flags.json)
|
|
23
|
+
context.output.json(safe);
|
|
24
|
+
else
|
|
25
|
+
render(context, parsed.command, safe);
|
|
26
|
+
return { exitCode: 0 };
|
|
27
|
+
}, {}, {
|
|
28
|
+
env: env,
|
|
29
|
+
mode: parsed.flags.json ? 'json' : 'text',
|
|
30
|
+
stdout: options.stdout,
|
|
31
|
+
stderr: options.stderr,
|
|
32
|
+
nonInteractive: true,
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
async function execute(client, command, positionals, flags) {
|
|
36
|
+
switch (command) {
|
|
37
|
+
case 'inbox:create':
|
|
38
|
+
return client.createInbox({
|
|
39
|
+
kind: flags.stable ? 'stable' : 'expiring',
|
|
40
|
+
requestedLocalPart: text(flags.local),
|
|
41
|
+
domain: text(flags.domain),
|
|
42
|
+
displayName: text(flags.name),
|
|
43
|
+
expirySeconds: number(flags.expires),
|
|
44
|
+
idempotencyKey: text(flags.idempotencyKey),
|
|
45
|
+
});
|
|
46
|
+
case 'inbox:list': return client.listInboxes();
|
|
47
|
+
case 'inbox:get': return client.getInbox(required(positionals[0], 'inbox id'));
|
|
48
|
+
case 'inbox:delete': return client.deleteInbox(required(positionals[0], 'inbox id'));
|
|
49
|
+
case 'message:list':
|
|
50
|
+
return client.listMessages(required(positionals[0], 'inbox id'), {
|
|
51
|
+
sender: text(flags.sender), subject: text(flags.subject), receivedAfter: text(flags.after),
|
|
52
|
+
unreadOnly: Boolean(flags.unread), limit: number(flags.limit),
|
|
53
|
+
});
|
|
54
|
+
case 'message:read': return client.readMessage(required(positionals[0], 'inbox id'), required(positionals[1], 'message id'));
|
|
55
|
+
case 'message:attachments': return client.listAttachments(required(positionals[0], 'inbox id'), required(positionals[1], 'message id'));
|
|
56
|
+
case 'message:wait':
|
|
57
|
+
return client.waitForMessages(required(positionals[0], 'inbox id'), {
|
|
58
|
+
sender: text(flags.sender), senderDomain: text(flags.senderDomain), subject: text(flags.subject),
|
|
59
|
+
after: text(flags.after), timeoutMs: number(flags.timeout), expectedCount: number(flags.count),
|
|
60
|
+
});
|
|
61
|
+
case 'message:extract':
|
|
62
|
+
return client.extractVerification(required(positionals[0], 'inbox id'), required(positionals[1], 'message id'), flags.link ? 'verification_link' : 'otp');
|
|
63
|
+
case 'token:revoke':
|
|
64
|
+
return client.revokeToken(required(positionals[0], 'inbox id'), required(positionals[1], 'token id'));
|
|
65
|
+
case 'domain:create': return client.createDomain(required(positionals[0], 'domain'));
|
|
66
|
+
case 'domain:verify': return client.verifyDomain(required(positionals[0], 'domain id'));
|
|
67
|
+
case 'operations': return client.getOperationalSnapshot();
|
|
68
|
+
default: throw new Error(help());
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
function render(context, command, safe) {
|
|
72
|
+
if (command === 'inbox:create') {
|
|
73
|
+
context.output.success('Inbox created');
|
|
74
|
+
context.output.info(JSON.stringify(safe, null, 2));
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
context.output.info(JSON.stringify(safe, null, 2));
|
|
78
|
+
}
|
|
79
|
+
function redactForCommand(command, value, options) {
|
|
80
|
+
if (command === 'message:extract')
|
|
81
|
+
return value;
|
|
82
|
+
return redactSensitive(value, {
|
|
83
|
+
hideMessageContent: command.startsWith('message:') && !options.showContent,
|
|
84
|
+
hideSecrets: !options.showSecrets,
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
function redactSensitive(value, options) {
|
|
88
|
+
if (value === null || typeof value !== 'object')
|
|
89
|
+
return value;
|
|
90
|
+
if (Array.isArray(value))
|
|
91
|
+
return value.map((entry) => redactSensitive(entry, options));
|
|
92
|
+
const messageContent = /^(subject|headers|metadata|from|to|cc|bcc|replyTo|envelopeFrom|envelopeTo|textBody|htmlBody|rawObjectKey|authenticationResults|filename)$/i;
|
|
93
|
+
const secret = /token|secret|verification|raw|ciphertext|password|authorization/i;
|
|
94
|
+
return Object.fromEntries(Object.entries(value).map(([key, entry]) => [
|
|
95
|
+
key,
|
|
96
|
+
(options.hideSecrets && secret.test(key)) || (options.hideMessageContent && messageContent.test(key))
|
|
97
|
+
? '[REDACTED]'
|
|
98
|
+
: redactSensitive(entry, options),
|
|
99
|
+
]));
|
|
100
|
+
}
|
|
101
|
+
function parse(args) {
|
|
102
|
+
const [noun, verb, ...rest] = args;
|
|
103
|
+
if (!noun || noun === '--help' || noun === 'help')
|
|
104
|
+
return { command: 'help', positionals: [], flags: {} };
|
|
105
|
+
const command = verb && !verb.startsWith('-') ? `${noun}:${verb}` : noun;
|
|
106
|
+
const values = verb && !verb.startsWith('-') ? rest : [verb, ...rest].filter(Boolean);
|
|
107
|
+
const positionals = [];
|
|
108
|
+
const flags = {};
|
|
109
|
+
for (let index = 0; index < values.length; index += 1) {
|
|
110
|
+
const value = values[index];
|
|
111
|
+
if (!value.startsWith('--')) {
|
|
112
|
+
positionals.push(value);
|
|
113
|
+
continue;
|
|
114
|
+
}
|
|
115
|
+
const key = value.slice(2).replace(/-([a-z])/g, (_, letter) => letter.toUpperCase());
|
|
116
|
+
const next = values[index + 1];
|
|
117
|
+
if (next && !next.startsWith('--')) {
|
|
118
|
+
flags[key] = next;
|
|
119
|
+
index += 1;
|
|
120
|
+
}
|
|
121
|
+
else
|
|
122
|
+
flags[key] = true;
|
|
123
|
+
}
|
|
124
|
+
return { command, positionals, flags };
|
|
125
|
+
}
|
|
126
|
+
function required(value, name) {
|
|
127
|
+
if (!value)
|
|
128
|
+
throw new Error(`Missing ${name}`);
|
|
129
|
+
return value;
|
|
130
|
+
}
|
|
131
|
+
function text(value) { return typeof value === 'string' ? value : undefined; }
|
|
132
|
+
function number(value) {
|
|
133
|
+
if (typeof value !== 'string')
|
|
134
|
+
return undefined;
|
|
135
|
+
const parsed = Number.parseInt(value, 10);
|
|
136
|
+
if (!Number.isFinite(parsed))
|
|
137
|
+
throw new Error(`Invalid number: ${value}`);
|
|
138
|
+
return parsed;
|
|
139
|
+
}
|
|
140
|
+
function help() {
|
|
141
|
+
return [
|
|
142
|
+
'MailFn commands:',
|
|
143
|
+
' inbox create|list|get|delete',
|
|
144
|
+
' message list|read|attachments|wait|extract',
|
|
145
|
+
' token revoke',
|
|
146
|
+
' domain create|verify',
|
|
147
|
+
' operations',
|
|
148
|
+
'Message content is redacted unless the command is explicitly extract or --show-content is supplied.',
|
|
149
|
+
'Credentials and other secrets are redacted unless --show-secrets is supplied.',
|
|
150
|
+
].join('\n');
|
|
151
|
+
}
|
|
152
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@mailfn/cli",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Least-privilege command-line interface for MailFn",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"bin": { "mailfn": "./dist/cli.js" },
|
|
7
|
+
"main": "./dist/index.js",
|
|
8
|
+
"types": "./dist/index.d.ts",
|
|
9
|
+
"exports": { ".": { "types": "./dist/index.d.ts", "default": "./dist/index.js" } },
|
|
10
|
+
"files": ["dist", "README.md"],
|
|
11
|
+
"scripts": { "build": "tsc", "test": "vitest run", "typecheck": "tsc --noEmit", "lint": "tsc --noEmit", "clean": "rm -rf dist" },
|
|
12
|
+
"keywords": ["mailfn", "email", "cli"],
|
|
13
|
+
"author": "21n",
|
|
14
|
+
"license": "MIT",
|
|
15
|
+
"repository": { "type": "git", "url": "git+https://github.com/21nCo/super-functions.git", "directory": "mailfn/cli" },
|
|
16
|
+
"publishConfig": { "access": "public" },
|
|
17
|
+
"dependencies": { "@clifn/core": "0.1.0", "@mailfn/client": "0.1.0" },
|
|
18
|
+
"devDependencies": { "@types/node": "^22.0.0", "typescript": "^5.6.0", "vitest": "3.2.4" }
|
|
19
|
+
}
|