@sang2x/captools 0.1.0 → 0.3.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.
@@ -0,0 +1,2 @@
1
+ import { Command } from 'commander';
2
+ export declare const projectCommand: Command;
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.projectCommand = void 0;
7
+ const commander_1 = require("commander");
8
+ const prompts_1 = __importDefault(require("prompts"));
9
+ const projects_1 = require("../utils/projects");
10
+ function formatProject(project) {
11
+ console.log(`\nName: ${project.name}`);
12
+ console.log(`Package ID: ${project.packageId}`);
13
+ const envs = project.environments ?? [];
14
+ if (envs.length === 0) {
15
+ console.log('Environments: (none)');
16
+ return;
17
+ }
18
+ console.log(`\nEnvironments (${envs.length}):`);
19
+ for (const e of envs) {
20
+ console.log(`\n [${e.env}]`);
21
+ if (e.region)
22
+ console.log(` Region: ${e.region}`);
23
+ if (e.globalBtp)
24
+ console.log(` Global BTP: ${e.globalBtp}`);
25
+ if (e.subaccount)
26
+ console.log(` Subaccount: ${e.subaccount}`);
27
+ if (e.gitlab)
28
+ console.log(` GitLab: ${e.gitlab}`);
29
+ if (e.url)
30
+ console.log(` URL: ${e.url}`);
31
+ if (e.credentials)
32
+ console.log(` Credentials: ${e.credentials}`);
33
+ }
34
+ }
35
+ exports.projectCommand = new commander_1.Command('project')
36
+ .description('View details of a project')
37
+ .action(async () => {
38
+ const projects = (0, projects_1.loadProjects)();
39
+ if (projects.length === 0) {
40
+ console.error('No projects found. Run: captools npmrc add');
41
+ process.exit(1);
42
+ }
43
+ const { selected } = await (0, prompts_1.default)({
44
+ type: 'autocomplete',
45
+ name: 'selected',
46
+ message: 'Select project (type to search):',
47
+ choices: projects.map((p) => ({ title: p.name || p.packageId, value: p })),
48
+ suggest: (input, choices) => Promise.resolve(choices.filter((c) => c.title.toLowerCase().includes(input.toLowerCase()))),
49
+ }, { onCancel: () => process.exit(0) });
50
+ formatProject(selected);
51
+ });
52
+ //# sourceMappingURL=project.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project.js","sourceRoot":"","sources":["../../src/commands/project.ts"],"names":[],"mappings":";;;;;;AAAA,yCAAoC;AACpC,sDAA8B;AAC9B,gDAAiF;AAEjF,SAAS,aAAa,CAAC,OAAgB;IACrC,OAAO,CAAC,GAAG,CAAC,iBAAiB,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IAC7C,OAAO,CAAC,GAAG,CAAC,eAAe,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;IAEhD,MAAM,IAAI,GAAG,OAAO,CAAC,YAAY,IAAI,EAAE,CAAC;IACxC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;QACpC,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC;IAChD,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;QACrB,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC;QAC9B,IAAI,CAAC,CAAC,MAAM;YAAO,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;QAC/D,IAAI,CAAC,CAAC,SAAS;YAAI,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;QAClE,IAAI,CAAC,CAAC,UAAU;YAAG,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC;QACnE,IAAI,CAAC,CAAC,MAAM;YAAO,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;QAC/D,IAAI,CAAC,CAAC,GAAG;YAAU,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;QAC5D,IAAI,CAAC,CAAC,WAAW;YAAE,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;IACtE,CAAC;AACH,CAAC;AAEY,QAAA,cAAc,GAAG,IAAI,mBAAO,CAAC,SAAS,CAAC;KACjD,WAAW,CAAC,2BAA2B,CAAC;KACxC,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,MAAM,QAAQ,GAAG,IAAA,uBAAY,GAAE,CAAC;IAChC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,CAAC,KAAK,CAAC,4CAA4C,CAAC,CAAC;QAC5D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,IAAA,iBAAO,EAChC;QACE,IAAI,EAAE,cAAc;QACpB,IAAI,EAAE,UAAU;QAChB,OAAO,EAAE,kCAAkC;QAC3C,OAAO,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,SAAS,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;QAC1E,OAAO,EAAE,CAAC,KAAa,EAAE,OAAc,EAAE,EAAE,CACzC,OAAO,CAAC,OAAO,CACb,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,CAC3E;KACJ,EACD,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CACX,CAAC;IAE3B,aAAa,CAAC,QAAQ,CAAC,CAAC;AAC1B,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { Command } from 'commander';
2
+ export declare const sendMailCommand: Command;
@@ -0,0 +1,209 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.sendMailCommand = void 0;
40
+ const commander_1 = require("commander");
41
+ const prompts_1 = __importDefault(require("prompts"));
42
+ const tls = __importStar(require("tls"));
43
+ async function promptIfMissing(value, question, password = false) {
44
+ if (value)
45
+ return value;
46
+ const response = await (0, prompts_1.default)({
47
+ type: password ? 'password' : 'text',
48
+ name: 'value',
49
+ message: question
50
+ }, { onCancel: () => process.exit(0) });
51
+ return response.value;
52
+ }
53
+ async function fetchClientCredentialsToken(tenantId, clientId, clientSecret) {
54
+ const body = new URLSearchParams({
55
+ grant_type: 'client_credentials',
56
+ client_id: clientId,
57
+ client_secret: clientSecret,
58
+ scope: 'https://graph.microsoft.com/.default'
59
+ });
60
+ const response = await fetch(`https://login.microsoftonline.com/${tenantId}/oauth2/v2.0/token`, {
61
+ method: 'POST',
62
+ body: body.toString(),
63
+ headers: { 'Content-Type': 'application/x-www-form-urlencoded' }
64
+ });
65
+ const data = await response.json();
66
+ if (data.error) {
67
+ throw new Error(`OAuth2 error: ${data.error_description || data.error}`);
68
+ }
69
+ return data.access_token;
70
+ }
71
+ async function sendMailOAuth2(token, from, to, subject, body) {
72
+ const response = await fetch(`https://graph.microsoft.com/v1.0/users/${from}/sendMail`, {
73
+ method: 'POST',
74
+ headers: {
75
+ Authorization: `Bearer ${token}`,
76
+ 'Content-Type': 'application/json'
77
+ },
78
+ body: JSON.stringify({
79
+ message: {
80
+ subject,
81
+ body: { contentType: 'Text', content: body },
82
+ toRecipients: [{ emailAddress: { address: to } }]
83
+ },
84
+ saveToSentItems: 'true'
85
+ })
86
+ });
87
+ if (response.status !== 202) {
88
+ const errorData = await response.json();
89
+ const errorMsg = errorData?.error?.message || `HTTP ${response.status}`;
90
+ throw new Error(`Failed to send email: ${errorMsg}`);
91
+ }
92
+ }
93
+ function waitForCode(socket, buffer, code) {
94
+ let dataHandler;
95
+ let timeout;
96
+ return new Promise((resolve, reject) => {
97
+ const checkBuffer = () => {
98
+ const lines = buffer.data.split('\r\n');
99
+ for (let i = 0; i < lines.length; i++) {
100
+ const line = lines[i];
101
+ if (line.startsWith(`${code} `)) {
102
+ buffer.data = lines.slice(i + 1).join('\r\n');
103
+ resolve(line);
104
+ return;
105
+ }
106
+ }
107
+ };
108
+ dataHandler = () => checkBuffer();
109
+ socket.on('data', dataHandler);
110
+ timeout = setTimeout(() => {
111
+ socket.removeListener('data', dataHandler);
112
+ reject(new Error(`Timeout waiting for SMTP code ${code}`));
113
+ }, 10000);
114
+ checkBuffer();
115
+ }).then((result) => {
116
+ clearTimeout(timeout);
117
+ socket.removeListener('data', dataHandler);
118
+ return result;
119
+ });
120
+ }
121
+ async function sendMailSmtp(host, port, user, pass, from, to, subject, body) {
122
+ return new Promise((resolve, reject) => {
123
+ const socket = tls.connect({ host, port: Number(port), rejectUnauthorized: false }, async () => {
124
+ const buffer = { data: '' };
125
+ const send = (data) => {
126
+ socket.write(data);
127
+ };
128
+ socket.on('data', (chunk) => {
129
+ buffer.data += chunk.toString();
130
+ });
131
+ try {
132
+ await waitForCode(socket, buffer, '220');
133
+ send('EHLO captools\r\n');
134
+ await waitForCode(socket, buffer, '250');
135
+ send('AUTH LOGIN\r\n');
136
+ await waitForCode(socket, buffer, '334');
137
+ send(`${Buffer.from(user).toString('base64')}\r\n`);
138
+ await waitForCode(socket, buffer, '334');
139
+ send(`${Buffer.from(pass).toString('base64')}\r\n`);
140
+ await waitForCode(socket, buffer, '235');
141
+ send(`MAIL FROM:<${from}>\r\n`);
142
+ await waitForCode(socket, buffer, '250');
143
+ send(`RCPT TO:<${to}>\r\n`);
144
+ await waitForCode(socket, buffer, '250');
145
+ send('DATA\r\n');
146
+ await waitForCode(socket, buffer, '354');
147
+ send(`From: ${from}\r\nTo: ${to}\r\nSubject: ${subject}\r\n\r\n${body}\r\n.\r\n`);
148
+ await waitForCode(socket, buffer, '250');
149
+ send('QUIT\r\n');
150
+ socket.end();
151
+ resolve();
152
+ }
153
+ catch (err) {
154
+ socket.destroy();
155
+ reject(err);
156
+ }
157
+ });
158
+ socket.on('error', reject);
159
+ });
160
+ }
161
+ async function sendMailAction(opts) {
162
+ const protocol = await promptIfMissing(opts.protocol, 'Protocol (oauth2/smtp):');
163
+ let from = await promptIfMissing(opts.from, 'From (sender email):');
164
+ let to = await promptIfMissing(opts.to, 'To (recipient email):');
165
+ const subject = opts.subject || 'SMDG Test Email';
166
+ const body = opts.body || 'This is a testing email';
167
+ if (protocol === 'oauth2') {
168
+ const tenantId = await promptIfMissing(opts.tenantId, 'Tenant ID:', false);
169
+ const clientId = await promptIfMissing(opts.clientId, 'Client ID:', false);
170
+ const clientSecret = await promptIfMissing(opts.clientSecret, 'Client Secret:', true);
171
+ const token = await fetchClientCredentialsToken(tenantId, clientId, clientSecret);
172
+ await sendMailOAuth2(token, from, to, subject, body);
173
+ }
174
+ else if (protocol === 'smtp') {
175
+ const smtpHost = await promptIfMissing(opts.smtpHost, 'SMTP Host:');
176
+ const smtpPort = opts.smtpPort || '465';
177
+ const smtpUser = await promptIfMissing(opts.smtpUser, 'SMTP User:');
178
+ const smtpPass = await promptIfMissing(opts.smtpPass, 'SMTP Password:', true);
179
+ await sendMailSmtp(smtpHost, smtpPort, smtpUser, smtpPass, from, to, subject, body);
180
+ }
181
+ else {
182
+ throw new Error('Invalid protocol. Use oauth2 or smtp.');
183
+ }
184
+ console.log('Email sent successfully.');
185
+ }
186
+ exports.sendMailCommand = new commander_1.Command('send-mail')
187
+ .description('Send email via Microsoft Graph (oauth2) or SMTP')
188
+ .option('--protocol <protocol>', 'oauth2 or smtp')
189
+ .option('--tenant-id <id>')
190
+ .option('--client-id <id>')
191
+ .option('--client-secret <secret>')
192
+ .option('--smtp-host <host>')
193
+ .option('--smtp-port <port>', 'SMTP port (465 for implicit TLS)', '465')
194
+ .option('--smtp-user <user>')
195
+ .option('--smtp-pass <pass>')
196
+ .option('--from <email>')
197
+ .option('--to <email>')
198
+ .option('--subject <subject>', 'Email subject', 'SMDG Test Email')
199
+ .option('--body <body>', 'Email body', 'This is a testing email')
200
+ .action(async (opts) => {
201
+ try {
202
+ await sendMailAction(opts);
203
+ }
204
+ catch (err) {
205
+ console.error('Error:', err.message);
206
+ process.exit(1);
207
+ }
208
+ });
209
+ //# sourceMappingURL=send-mail.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"send-mail.js","sourceRoot":"","sources":["../../src/commands/send-mail.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { Command } from 'commander';
2
+ export declare const testEmailCommand: Command;
@@ -0,0 +1,223 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.testEmailCommand = void 0;
40
+ const commander_1 = require("commander");
41
+ const prompts_1 = __importDefault(require("prompts"));
42
+ const tls = __importStar(require("tls"));
43
+ async function promptIfMissing(value, question, password = false) {
44
+ if (value)
45
+ return value;
46
+ const response = await (0, prompts_1.default)({
47
+ type: password ? 'password' : 'text',
48
+ name: 'value',
49
+ message: question
50
+ }, { onCancel: () => process.exit(0) });
51
+ return response.value;
52
+ }
53
+ async function fetchClientCredentialsToken(tenantId, clientId, clientSecret) {
54
+ const body = new URLSearchParams({
55
+ grant_type: 'client_credentials',
56
+ client_id: clientId,
57
+ client_secret: clientSecret,
58
+ scope: 'https://graph.microsoft.com/.default'
59
+ });
60
+ const response = await fetch(`https://login.microsoftonline.com/${tenantId}/oauth2/v2.0/token`, {
61
+ method: 'POST',
62
+ body: body.toString(),
63
+ headers: { 'Content-Type': 'application/x-www-form-urlencoded' }
64
+ });
65
+ const data = await response.json();
66
+ if (data.error) {
67
+ throw new Error(`OAuth2 error: ${data.error_description || data.error}`);
68
+ }
69
+ return data.access_token;
70
+ }
71
+ async function sendMailOAuth2(token, from, to, subject, body) {
72
+ const response = await fetch(`https://graph.microsoft.com/v1.0/users/${from}/sendMail`, {
73
+ method: 'POST',
74
+ headers: {
75
+ Authorization: `Bearer ${token}`,
76
+ 'Content-Type': 'application/json'
77
+ },
78
+ body: JSON.stringify({
79
+ message: {
80
+ subject,
81
+ body: { contentType: 'Text', content: body },
82
+ toRecipients: [{ emailAddress: { address: to } }]
83
+ },
84
+ saveToSentItems: 'true'
85
+ })
86
+ });
87
+ if (response.status !== 202) {
88
+ const errorData = await response.json();
89
+ const errorMsg = errorData?.error?.message || `HTTP ${response.status}`;
90
+ throw new Error(`Failed to send email: ${errorMsg}`);
91
+ }
92
+ }
93
+ function waitForCode(socket, buffer, code) {
94
+ let dataHandler;
95
+ let timeout;
96
+ return new Promise((resolve, reject) => {
97
+ const checkBuffer = () => {
98
+ const lines = buffer.data.split('\r\n');
99
+ for (let i = 0; i < lines.length; i++) {
100
+ const line = lines[i];
101
+ if (line.startsWith(`${code} `)) {
102
+ buffer.data = lines.slice(i + 1).join('\r\n');
103
+ resolve(line);
104
+ return;
105
+ }
106
+ }
107
+ };
108
+ dataHandler = () => checkBuffer();
109
+ socket.on('data', dataHandler);
110
+ timeout = setTimeout(() => {
111
+ socket.removeListener('data', dataHandler);
112
+ reject(new Error(`Timeout waiting for SMTP code ${code}`));
113
+ }, 10000);
114
+ checkBuffer();
115
+ }).then((result) => {
116
+ clearTimeout(timeout);
117
+ socket.removeListener('data', dataHandler);
118
+ return result;
119
+ });
120
+ }
121
+ async function sendMailSmtp(host, port, user, pass, from, to, subject, body) {
122
+ return new Promise((resolve, reject) => {
123
+ const socket = tls.connect({ host, port: Number(port), rejectUnauthorized: false }, async () => {
124
+ const buffer = { data: '' };
125
+ const send = (data) => {
126
+ socket.write(data);
127
+ };
128
+ socket.on('data', (chunk) => {
129
+ buffer.data += chunk.toString();
130
+ });
131
+ try {
132
+ await waitForCode(socket, buffer, '220');
133
+ send('EHLO captools\r\n');
134
+ await waitForCode(socket, buffer, '250');
135
+ send('AUTH LOGIN\r\n');
136
+ await waitForCode(socket, buffer, '334');
137
+ send(`${Buffer.from(user).toString('base64')}\r\n`);
138
+ await waitForCode(socket, buffer, '334');
139
+ send(`${Buffer.from(pass).toString('base64')}\r\n`);
140
+ await waitForCode(socket, buffer, '235');
141
+ send(`MAIL FROM:<${from}>\r\n`);
142
+ await waitForCode(socket, buffer, '250');
143
+ send(`RCPT TO:<${to}>\r\n`);
144
+ await waitForCode(socket, buffer, '250');
145
+ send('DATA\r\n');
146
+ await waitForCode(socket, buffer, '354');
147
+ send(`From: ${from}\r\nTo: ${to}\r\nSubject: ${subject}\r\n\r\n${body}\r\n.\r\n`);
148
+ await waitForCode(socket, buffer, '250');
149
+ send('QUIT\r\n');
150
+ socket.end();
151
+ resolve();
152
+ }
153
+ catch (err) {
154
+ socket.destroy();
155
+ reject(err);
156
+ }
157
+ });
158
+ socket.on('error', reject);
159
+ });
160
+ }
161
+ async function sendMailAction(opts) {
162
+ let protocol = opts.protocol;
163
+ if (!protocol) {
164
+ const res = await (0, prompts_1.default)({
165
+ type: 'select',
166
+ name: 'value',
167
+ message: 'Protocol:',
168
+ choices: [
169
+ { title: 'oauth2 (Microsoft Graph)', value: 'oauth2' },
170
+ { title: 'smtp', value: 'smtp' },
171
+ ],
172
+ }, { onCancel: () => process.exit(0) });
173
+ protocol = res.value;
174
+ }
175
+ const subject = opts.subject;
176
+ const body = opts.body;
177
+ if (protocol === 'oauth2') {
178
+ const tenantId = await promptIfMissing(opts.tenantId, 'Tenant ID:');
179
+ const clientId = await promptIfMissing(opts.clientId, 'Client ID:');
180
+ const clientSecret = await promptIfMissing(opts.clientSecret, 'Client Secret:', true);
181
+ const from = await promptIfMissing(opts.from, 'From (sender email):');
182
+ const to = await promptIfMissing(opts.to, 'To (recipient email):');
183
+ const token = await fetchClientCredentialsToken(tenantId, clientId, clientSecret);
184
+ await sendMailOAuth2(token, from, to, subject, body);
185
+ }
186
+ else if (protocol === 'smtp') {
187
+ const smtpHost = await promptIfMissing(opts.smtpHost, 'SMTP Host:');
188
+ const smtpPort = opts.smtpPort;
189
+ const smtpUser = await promptIfMissing(opts.smtpUser, 'SMTP User:');
190
+ const smtpPass = await promptIfMissing(opts.smtpPass, 'SMTP Password:', true);
191
+ const from = await promptIfMissing(opts.from, 'From (sender email):');
192
+ const to = await promptIfMissing(opts.to, 'To (recipient email):');
193
+ await sendMailSmtp(smtpHost, smtpPort, smtpUser, smtpPass, from, to, subject, body);
194
+ }
195
+ else {
196
+ throw new Error('Invalid protocol. Use oauth2 or smtp.');
197
+ }
198
+ console.log('Email sent successfully.');
199
+ }
200
+ exports.testEmailCommand = new commander_1.Command('test-email')
201
+ .description('Test email configuration via Microsoft Graph (oauth2) or SMTP')
202
+ .option('--protocol <protocol>', 'oauth2 or smtp')
203
+ .option('--tenant-id <id>')
204
+ .option('--client-id <id>')
205
+ .option('--client-secret <secret>')
206
+ .option('--smtp-host <host>')
207
+ .option('--smtp-port <port>', 'SMTP port (465 for implicit TLS)', '465')
208
+ .option('--smtp-user <user>')
209
+ .option('--smtp-pass <pass>')
210
+ .option('--from <email>')
211
+ .option('--to <email>')
212
+ .option('--subject <subject>', 'Email subject', 'SMDG Test Email')
213
+ .option('--body <body>', 'Email body', 'This is a testing email')
214
+ .action(async (opts) => {
215
+ try {
216
+ await sendMailAction(opts);
217
+ }
218
+ catch (err) {
219
+ console.error('Error:', err.message);
220
+ process.exit(1);
221
+ }
222
+ });
223
+ //# sourceMappingURL=test-email.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-email.js","sourceRoot":"","sources":["../../src/commands/test-email.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -7,6 +7,8 @@ const npmrc_1 = require("./commands/npmrc");
7
7
  const hana_1 = require("./commands/hana");
8
8
  const install_1 = require("./commands/install");
9
9
  const run_local_1 = require("./commands/run-local");
10
+ const test_email_1 = require("./commands/test-email");
11
+ const project_1 = require("./commands/project");
10
12
  const program = new commander_1.Command();
11
13
  program
12
14
  .name('captools')
@@ -17,5 +19,7 @@ program.addCommand(npmrc_1.npmrcCommand);
17
19
  program.addCommand(hana_1.hanaCommand);
18
20
  program.addCommand(install_1.installCommand);
19
21
  program.addCommand(run_local_1.runLocalCommand);
22
+ program.addCommand(test_email_1.testEmailCommand);
23
+ program.addCommand(project_1.projectCommand);
20
24
  program.parse();
21
25
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAEA,yCAAoC;AACpC,4CAAgD;AAChD,4CAAgD;AAChD,0CAA8C;AAC9C,gDAAoD;AACpD,oDAAuD;AAEvD,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,UAAU,CAAC;KAChB,WAAW,CAAC,2BAA2B,CAAC;KACxC,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,OAAO,CAAC,UAAU,CAAC,oBAAY,CAAC,CAAC;AACjC,OAAO,CAAC,UAAU,CAAC,oBAAY,CAAC,CAAC;AACjC,OAAO,CAAC,UAAU,CAAC,kBAAW,CAAC,CAAC;AAChC,OAAO,CAAC,UAAU,CAAC,wBAAc,CAAC,CAAC;AACnC,OAAO,CAAC,UAAU,CAAC,2BAAe,CAAC,CAAC;AAEpC,OAAO,CAAC,KAAK,EAAE,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAEA,yCAAoC;AACpC,4CAAgD;AAChD,4CAAgD;AAChD,0CAA8C;AAC9C,gDAAoD;AACpD,oDAAuD;AACvD,sDAAyD;AACzD,gDAAoD;AAEpD,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,UAAU,CAAC;KAChB,WAAW,CAAC,2BAA2B,CAAC;KACxC,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,OAAO,CAAC,UAAU,CAAC,oBAAY,CAAC,CAAC;AACjC,OAAO,CAAC,UAAU,CAAC,oBAAY,CAAC,CAAC;AACjC,OAAO,CAAC,UAAU,CAAC,kBAAW,CAAC,CAAC;AAChC,OAAO,CAAC,UAAU,CAAC,wBAAc,CAAC,CAAC;AACnC,OAAO,CAAC,UAAU,CAAC,2BAAe,CAAC,CAAC;AACpC,OAAO,CAAC,UAAU,CAAC,6BAAgB,CAAC,CAAC;AACrC,OAAO,CAAC,UAAU,CAAC,wBAAc,CAAC,CAAC;AAEnC,OAAO,CAAC,KAAK,EAAE,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sang2x/captools",
3
- "version": "0.1.0",
3
+ "version": "0.3.0",
4
4
  "description": "SAP CAP development tools CLI",
5
5
  "main": "dist/index.js",
6
6
  "bin": {
@@ -11,7 +11,13 @@
11
11
  "dev": "ts-node src/index.ts",
12
12
  "prepare": "npm run build"
13
13
  },
14
- "keywords": ["sap", "cap", "cds", "cloud-foundry", "cli"],
14
+ "keywords": [
15
+ "sap",
16
+ "cap",
17
+ "cds",
18
+ "cloud-foundry",
19
+ "cli"
20
+ ],
15
21
  "license": "MIT",
16
22
  "dependencies": {
17
23
  "commander": "^12.0.0",