@o-t-p-y/cli 0.3.3 → 0.4.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/dist/index.js +76 -71
- package/dist/index.js.map +1 -1
- package/dist/templates.js +3 -0
- package/dist/templates.js.map +1 -1
- package/dist/ui.d.ts +20 -0
- package/dist/ui.js +105 -0
- package/dist/ui.js.map +1 -0
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -6,17 +6,10 @@ import packageMetadata from "../package.json" with { type: "json" };
|
|
|
6
6
|
import { detectNextPagesRoot, detectProject } from "./detector.js";
|
|
7
7
|
import { appendOrUpdateEnvKey, ensureEnvFileIgnored, getExistingEnvKey, validateApiKey } from "./env.js";
|
|
8
8
|
import { generateExpressTemplates, generateGoTemplates, generateNextAppTemplates, generateNextPagesTemplates, generatePhpLaravelTemplates, generatePythonFastApiTemplates, generateSvelteKitTemplates, phpLaravelRoutesSnippet, } from "./templates.js";
|
|
9
|
+
import { printBanner, spinner } from "./ui.js";
|
|
9
10
|
const args = process.argv.slice(2);
|
|
10
11
|
const command = args[0] || "init";
|
|
11
12
|
const placeholderApiKey = "otpy_test_key_replace_with_yours";
|
|
12
|
-
function printBanner() {
|
|
13
|
-
console.log(`
|
|
14
|
-
┌────────────────────────────────────────────────────────┐
|
|
15
|
-
│ OTPy.ir — سامانه هوشمند ارسال پیامک کد ورود (OTP) │
|
|
16
|
-
│ سریع، اقتصادی، بدون خط اختصاصی و قرارداد │
|
|
17
|
-
└────────────────────────────────────────────────────────┘
|
|
18
|
-
`);
|
|
19
|
-
}
|
|
20
13
|
function prompt(question) {
|
|
21
14
|
const rl = createInterface({
|
|
22
15
|
input: process.stdin,
|
|
@@ -33,32 +26,36 @@ async function runInit() {
|
|
|
33
26
|
printBanner();
|
|
34
27
|
const cwd = process.cwd();
|
|
35
28
|
const info = detectProject(cwd);
|
|
36
|
-
console.log(`🔍
|
|
37
|
-
console.log(`
|
|
38
|
-
console.log(`
|
|
39
|
-
console.log(`
|
|
29
|
+
console.log(`🔍 Scanning project...`);
|
|
30
|
+
console.log(` Detected framework: ${info.framework}`);
|
|
31
|
+
console.log(` TypeScript: ${info.isTypeScript ? "yes" : "no"}`);
|
|
32
|
+
console.log(` Env file: ${info.envFilePath}\n`);
|
|
40
33
|
let apiKey = getExistingEnvKey(info.envFilePath);
|
|
41
34
|
const cliKeyArgIndex = args.indexOf("--api-key");
|
|
42
35
|
if (cliKeyArgIndex !== -1 && args[cliKeyArgIndex + 1]) {
|
|
43
36
|
apiKey = args[cliKeyArgIndex + 1] ?? null;
|
|
44
37
|
}
|
|
45
38
|
if (!apiKey) {
|
|
46
|
-
console.log(`💡
|
|
47
|
-
apiKey = (await prompt("🔑
|
|
39
|
+
console.log(`💡 Enter your project API key (copy it from https://dash.otpy.ir):`);
|
|
40
|
+
apiKey = (await prompt("🔑 API key: ")) || null;
|
|
48
41
|
}
|
|
49
42
|
if (apiKey && apiKey !== placeholderApiKey) {
|
|
50
|
-
const
|
|
51
|
-
|
|
52
|
-
|
|
43
|
+
const s = spinner("🔑 Validating API key...");
|
|
44
|
+
const validation = await validateApiKey(apiKey).finally(() => s.stop());
|
|
45
|
+
if (validation.ok) {
|
|
46
|
+
console.log(`✅ API key validated.`);
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
console.log(`⚠️ Key validation failed (${validation.reason}). Continuing anyway — double-check the key later.`);
|
|
53
50
|
}
|
|
54
51
|
appendOrUpdateEnvKey(info.envFilePath, "OTPY_API_KEY", apiKey);
|
|
55
|
-
console.log(`\n
|
|
52
|
+
console.log(`\n✅ Key saved to ${info.envFilePath}.`);
|
|
56
53
|
}
|
|
57
54
|
else {
|
|
58
|
-
console.log(`\n💡
|
|
55
|
+
console.log(`\n💡 Get your API key at https://dash.otpy.ir`);
|
|
59
56
|
}
|
|
60
57
|
if (ensureEnvFileIgnored(cwd, info.envFilePath)) {
|
|
61
|
-
console.log(
|
|
58
|
+
console.log(`✅ Added ${info.envFilePath} to .gitignore.`);
|
|
62
59
|
}
|
|
63
60
|
// Generate templates
|
|
64
61
|
let filesToGenerate = [];
|
|
@@ -83,34 +80,34 @@ async function runInit() {
|
|
|
83
80
|
else if (info.framework === "php-laravel") {
|
|
84
81
|
filesToGenerate = generatePhpLaravelTemplates();
|
|
85
82
|
if (existsSync(join(cwd, "routes/api.php"))) {
|
|
86
|
-
console.log(`\n📝
|
|
83
|
+
console.log(`\n📝 routes/api.php already exists — append these lines manually:`);
|
|
87
84
|
console.log(phpLaravelRoutesSnippet);
|
|
88
85
|
}
|
|
89
86
|
}
|
|
90
87
|
else if (info.framework === "php-generic") {
|
|
91
88
|
filesToGenerate = [];
|
|
92
|
-
console.log(`\n🐘
|
|
93
|
-
console.log(`
|
|
94
|
-
console.log(`
|
|
89
|
+
console.log(`\n🐘 PHP project detected, but no supported framework (Laravel) found.`);
|
|
90
|
+
console.log(` Manual integration guide: https://otpy.ir/docs`);
|
|
91
|
+
console.log(` Send OTP with cURL:`);
|
|
95
92
|
console.log(` curl -X POST https://api.otpy.ir/v1/otp/send \\`);
|
|
96
93
|
console.log(` -H "Authorization: Bearer $OTPY_API_KEY" -H "Content-Type: application/json" \\`);
|
|
97
94
|
console.log(` -d '{"phone":"09123456789"}'`);
|
|
98
95
|
}
|
|
99
96
|
else {
|
|
100
97
|
filesToGenerate = [];
|
|
101
|
-
console.log(`\n📝
|
|
102
|
-
console.log(`
|
|
103
|
-
console.log(`\n
|
|
98
|
+
console.log(`\n📝 No supported framework detected; no files were generated.`);
|
|
99
|
+
console.log(` Manual integration guide: https://otpy.ir/docs`);
|
|
100
|
+
console.log(`\n Send:`);
|
|
104
101
|
console.log(` curl -X POST https://api.otpy.ir/v1/otp/send \\`);
|
|
105
102
|
console.log(` -H "Authorization: Bearer $OTPY_API_KEY" -H "Content-Type: application/json" \\`);
|
|
106
103
|
console.log(` -d '{"phone":"09123456789"}'`);
|
|
107
|
-
console.log(`\n
|
|
104
|
+
console.log(`\n Verify:`);
|
|
108
105
|
console.log(` curl -X POST https://api.otpy.ir/v1/otp/verify \\`);
|
|
109
106
|
console.log(` -H "Authorization: Bearer $OTPY_API_KEY" -H "Content-Type: application/json" \\`);
|
|
110
107
|
console.log(` -d '{"phone":"09123456789","code":"123456"}'`);
|
|
111
108
|
}
|
|
112
109
|
if (filesToGenerate.length > 0) {
|
|
113
|
-
console.log(`\n📦
|
|
110
|
+
console.log(`\n📦 Generating integration files:`);
|
|
114
111
|
for (const file of filesToGenerate) {
|
|
115
112
|
const fullPath = join(cwd, file.path);
|
|
116
113
|
const parentDir = dirname(fullPath);
|
|
@@ -119,66 +116,67 @@ async function runInit() {
|
|
|
119
116
|
}
|
|
120
117
|
if (!existsSync(fullPath)) {
|
|
121
118
|
writeFileSync(fullPath, file.content, "utf8");
|
|
122
|
-
console.log(`
|
|
119
|
+
console.log(` ✅ created ${file.path}`);
|
|
123
120
|
}
|
|
124
121
|
else {
|
|
125
|
-
console.log(`
|
|
122
|
+
console.log(` ⏭️ skipped (exists): ${file.path}`);
|
|
126
123
|
}
|
|
127
124
|
}
|
|
128
125
|
}
|
|
129
126
|
if (args.includes("--ai")) {
|
|
130
|
-
console.log(`\n🤖
|
|
127
|
+
console.log(`\n🤖 AI assistant instructions (Cursor / Windsurf / Claude Code):`);
|
|
131
128
|
if (info.framework === "php-laravel" || info.framework === "php-generic") {
|
|
132
129
|
console.log(` - REST API: https://api.otpy.ir`);
|
|
133
|
-
console.log(` -
|
|
134
|
-
console.log(` -
|
|
130
|
+
console.log(` - Send: POST /v1/otp/send with body {"phone": "09123456789"}`);
|
|
131
|
+
console.log(` - Verify: POST /v1/otp/verify with body {"phone": "09123456789", "code": "123456"} → {verified: boolean}`);
|
|
135
132
|
}
|
|
136
133
|
else {
|
|
137
|
-
console.log(` -
|
|
138
|
-
console.log(` -
|
|
139
|
-
console.log(` -
|
|
134
|
+
console.log(` - Library: @o-t-p-y/sdk`);
|
|
135
|
+
console.log(` - Send: otpy.sendOtp(phone) -> { request_id, ttl_seconds }`);
|
|
136
|
+
console.log(` - Verify: otpy.verifyOtp(phone, code) -> { verified: true }`);
|
|
140
137
|
}
|
|
141
138
|
}
|
|
142
139
|
if (info.framework === "php-generic") {
|
|
143
140
|
console.log(`
|
|
144
|
-
|
|
145
|
-
|
|
141
|
+
For the full manual integration guide, see https://otpy.ir/docs
|
|
142
|
+
Dashboard & live stats: https://dash.otpy.ir
|
|
146
143
|
`);
|
|
147
144
|
}
|
|
148
145
|
else if (info.framework === "php-laravel") {
|
|
149
146
|
console.log(`
|
|
150
|
-
🎉
|
|
147
|
+
🎉 Integration complete!
|
|
151
148
|
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
149
|
+
Next steps:
|
|
150
|
+
1. Start the dev server: php artisan serve
|
|
151
|
+
2. Test send: curl -X POST http://localhost:8000/api/auth/otp/send -H "Content-Type: application/json" -d '{"phone":"09123456789"}'
|
|
152
|
+
3. Dashboard & live stats: https://dash.otpy.ir
|
|
156
153
|
`);
|
|
157
154
|
}
|
|
158
155
|
else {
|
|
159
156
|
console.log(`
|
|
160
|
-
🎉
|
|
157
|
+
🎉 Integration complete!
|
|
161
158
|
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
159
|
+
Next steps:
|
|
160
|
+
1. Install the SDK: npm install @o-t-p-y/sdk
|
|
161
|
+
2. Send a test SMS: npx @o-t-p-y/cli test 09123456789
|
|
162
|
+
3. Dashboard & live stats: https://dash.otpy.ir
|
|
166
163
|
`);
|
|
167
164
|
}
|
|
168
165
|
}
|
|
169
166
|
async function runTest() {
|
|
170
167
|
const phone = args[1];
|
|
171
168
|
if (!phone || !/^09\d{9}$/.test(phone)) {
|
|
172
|
-
|
|
169
|
+
// Error lines stay on stdout (behavior preserved); only the spinner uses stderr.
|
|
170
|
+
console.log("❌ Error: a valid mobile number is required. Example: npx @o-t-p-y/cli test 09123456789");
|
|
173
171
|
process.exit(1);
|
|
174
172
|
}
|
|
175
173
|
const info = detectProject(process.cwd());
|
|
176
174
|
const apiKey = getExistingEnvKey(info.envFilePath);
|
|
177
175
|
if (!apiKey) {
|
|
178
|
-
console.log("❌
|
|
176
|
+
console.log("❌ OTPY_API_KEY not found in .env — run npx @o-t-p-y/cli init first.");
|
|
179
177
|
process.exit(1);
|
|
180
178
|
}
|
|
181
|
-
|
|
179
|
+
const s = spinner(`🚀 Sending test OTP to ${phone}...`);
|
|
182
180
|
try {
|
|
183
181
|
const res = await fetch("https://api.otpy.ir/v1/otp/send", {
|
|
184
182
|
method: "POST",
|
|
@@ -187,46 +185,53 @@ async function runTest() {
|
|
|
187
185
|
"content-type": "application/json",
|
|
188
186
|
},
|
|
189
187
|
body: JSON.stringify({ phone }),
|
|
188
|
+
signal: AbortSignal.timeout(10_000),
|
|
190
189
|
});
|
|
191
190
|
const data = (await res.json());
|
|
191
|
+
s.stop();
|
|
192
192
|
if (res.ok) {
|
|
193
|
-
console.log(
|
|
194
|
-
console.log(`
|
|
195
|
-
console.log(`
|
|
193
|
+
console.log(`✅ SMS sent!`);
|
|
194
|
+
console.log(` Request ID: ${data.request_id}`);
|
|
195
|
+
console.log(` Billing: ${data.free ? "daily free quota" : "paid credit"}`);
|
|
196
196
|
}
|
|
197
197
|
else {
|
|
198
|
-
console.log(`❌
|
|
198
|
+
console.log(`❌ Failed to send SMS: ${data.error || res.statusText}`);
|
|
199
199
|
}
|
|
200
200
|
}
|
|
201
201
|
catch (err) {
|
|
202
|
-
|
|
202
|
+
s.stop();
|
|
203
|
+
console.log(`❌ Network error: ${String(err)}`);
|
|
203
204
|
}
|
|
204
205
|
}
|
|
205
206
|
async function runUsage() {
|
|
206
207
|
const info = detectProject(process.cwd());
|
|
207
208
|
const apiKey = getExistingEnvKey(info.envFilePath);
|
|
208
209
|
if (!apiKey) {
|
|
209
|
-
console.log("❌
|
|
210
|
+
console.log("❌ OTPY_API_KEY not found in .env — run npx @o-t-p-y/cli init first.");
|
|
210
211
|
process.exit(1);
|
|
211
212
|
}
|
|
213
|
+
const s = spinner(`📊 Fetching usage...`);
|
|
212
214
|
try {
|
|
213
215
|
const res = await fetch("https://api.otpy.ir/v1/usage", {
|
|
214
216
|
method: "GET",
|
|
215
217
|
headers: { authorization: `Bearer ${apiKey}` },
|
|
218
|
+
signal: AbortSignal.timeout(10_000),
|
|
216
219
|
});
|
|
217
220
|
const data = (await res.json());
|
|
221
|
+
s.stop();
|
|
218
222
|
if (res.ok) {
|
|
219
|
-
console.log(`📊
|
|
220
|
-
console.log(`
|
|
221
|
-
console.log(`
|
|
222
|
-
console.log(`
|
|
223
|
+
console.log(`📊 Today's usage:`);
|
|
224
|
+
console.log(` Free quota used: ${data.free_used_today} of ${data.free_quota_today}`);
|
|
225
|
+
console.log(` Paid SMS: ${data.paid_today}`);
|
|
226
|
+
console.log(` Daily limit: ${data.daily_limit ? data.daily_limit : "unlimited"}`);
|
|
223
227
|
}
|
|
224
228
|
else {
|
|
225
|
-
console.log(`❌
|
|
229
|
+
console.log(`❌ Failed to fetch usage.`);
|
|
226
230
|
}
|
|
227
231
|
}
|
|
228
232
|
catch (err) {
|
|
229
|
-
|
|
233
|
+
s.stop();
|
|
234
|
+
console.log(`❌ Network error: ${String(err)}`);
|
|
230
235
|
}
|
|
231
236
|
}
|
|
232
237
|
if (command === "--version" || command === "-v") {
|
|
@@ -235,12 +240,12 @@ if (command === "--version" || command === "-v") {
|
|
|
235
240
|
}
|
|
236
241
|
if (command === "--help" || command === "-h") {
|
|
237
242
|
console.log(`
|
|
238
|
-
|
|
239
|
-
npx @o-t-p-y/cli init
|
|
240
|
-
npx @o-t-p-y/cli init --ai
|
|
241
|
-
npx @o-t-p-y/cli test <phone>
|
|
242
|
-
npx @o-t-p-y/cli usage
|
|
243
|
-
npx @o-t-p-y/cli --version
|
|
243
|
+
Usage: npx @o-t-p-y/cli <command>
|
|
244
|
+
npx @o-t-p-y/cli init Set up your project and generate integration files
|
|
245
|
+
npx @o-t-p-y/cli init --ai Set up with AI assistant instructions
|
|
246
|
+
npx @o-t-p-y/cli test <phone> Send a test OTP SMS to any number
|
|
247
|
+
npx @o-t-p-y/cli usage Show today's usage and quota
|
|
248
|
+
npx @o-t-p-y/cli --version CLI version
|
|
244
249
|
`);
|
|
245
250
|
process.exit(0);
|
|
246
251
|
}
|
|
@@ -254,7 +259,7 @@ else if (command === "usage") {
|
|
|
254
259
|
runUsage().catch(console.error);
|
|
255
260
|
}
|
|
256
261
|
else {
|
|
257
|
-
console.log(
|
|
262
|
+
console.log(`Unknown command: ${command}\nRun npx @o-t-p-y/cli --help for usage.`);
|
|
258
263
|
process.exit(1);
|
|
259
264
|
}
|
|
260
265
|
//# 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":";AACA,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC/D,OAAO,eAAe,MAAM,iBAAiB,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AACpE,OAAO,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AACzG,OAAO,EACL,wBAAwB,EACxB,mBAAmB,EACnB,wBAAwB,EACxB,0BAA0B,EAC1B,2BAA2B,EAC3B,8BAA8B,EAC9B,0BAA0B,EAC1B,uBAAuB,GAExB,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/templates.js
CHANGED
|
@@ -391,6 +391,9 @@ def verify_otp(req: VerifyOtpRequest):
|
|
|
391
391
|
`;
|
|
392
392
|
return [{ path: "routers/otp.py", content: code }];
|
|
393
393
|
}
|
|
394
|
+
// Printed to the terminal via index.ts — keep this snippet ASCII-only so the
|
|
395
|
+
// CLI's English-only output invariant holds. Never print other template
|
|
396
|
+
// contents (they carry intentional Persian end-user error strings).
|
|
394
397
|
export const phpLaravelRoutesSnippet = `Route::post('/auth/otp/send', [OtpController::class, 'send']);
|
|
395
398
|
Route::post('/auth/otp/verify', [OtpController::class, 'verify']);
|
|
396
399
|
`;
|
package/dist/templates.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"templates.js","sourceRoot":"","sources":["../src/templates.ts"],"names":[],"mappings":"AAKA,MAAM,UAAU,wBAAwB,CAAC,MAAe,EAAE,IAAa;IACrE,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;IACpC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;IAE/B,MAAM,UAAU,GAAG,IAAI;QACrB,CAAC,CAAC;;;;;CAKL;QACG,CAAC,CAAC;;;;;CAKL,CAAC;IAEA,MAAM,aAAa,GAAG,IAAI;QACxB,CAAC,CAAC;;;;;;;;;;;;;;;;;;;CAmBL;QACG,CAAC,CAAC;;;;;;;;;;;;;;;;;;;CAmBL,CAAC;IAEA,MAAM,eAAe,GAAG,IAAI;QAC1B,CAAC,CAAC;;;;;;;;;;;;;;;;;;;;;;;;CAwBL;QACG,CAAC,CAAC;;;;;;;;;;;;;;;;;;;;;;;;CAwBL,CAAC;IAEA,OAAO;QACL,EAAE,IAAI,EAAE,GAAG,MAAM,YAAY,GAAG,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE;QACzD,EAAE,IAAI,EAAE,GAAG,MAAM,+BAA+B,GAAG,EAAE,EAAE,OAAO,EAAE,aAAa,EAAE;QAC/E,EAAE,IAAI,EAAE,GAAG,MAAM,iCAAiC,GAAG,EAAE,EAAE,OAAO,EAAE,eAAe,EAAE;KACpF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,WAAoB,EAAE,IAAa;IAC5E,MAAM,MAAM,GAAG,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;IACzC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;IAE/B,MAAM,UAAU,GAAG,IAAI;QACrB,CAAC,CAAC;;;;;CAKL;QACG,CAAC,CAAC;;;;;CAKL,CAAC;IAEA,MAAM,eAAe,GAAG,IAAI;QAC1B,CAAC,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;CAyBL;QACG,CAAC,CAAC;;;;;;;;;;;;;;;;;;;;;;;;CAwBL,CAAC;IAEA,MAAM,iBAAiB,GAAG,IAAI;QAC5B,CAAC,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8BL;QACG,CAAC,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6BL,CAAC;IAEA,OAAO;QACL,EAAE,IAAI,EAAE,GAAG,MAAM,YAAY,GAAG,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE;QACzD,EAAE,IAAI,EAAE,GAAG,MAAM,2BAA2B,GAAG,EAAE,EAAE,OAAO,EAAE,eAAe,EAAE;QAC7E,EAAE,IAAI,EAAE,GAAG,MAAM,6BAA6B,GAAG,EAAE,EAAE,OAAO,EAAE,iBAAiB,EAAE;KAClF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,0BAA0B;IACxC,MAAM,UAAU,GAAG;;;;;;CAMpB,CAAC;IAEA,MAAM,aAAa,GAAG;;;;;;;;;;;;;;;;;;;;CAoBvB,CAAC;IAEA,MAAM,eAAe,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;CAyBzB,CAAC;IAEA,OAAO;QACL,EAAE,IAAI,EAAE,iBAAiB,EAAE,OAAO,EAAE,UAAU,EAAE;QAChD,EAAE,IAAI,EAAE,qCAAqC,EAAE,OAAO,EAAE,aAAa,EAAE;QACvE,EAAE,IAAI,EAAE,uCAAuC,EAAE,OAAO,EAAE,eAAe,EAAE;KAC5E,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,MAAe,EAAE,IAAa;IACrE,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;IACpC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;IAE/B,MAAM,UAAU,GAAG;;;;;CAKpB,CAAC;IAEA,MAAM,UAAU,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4BpB,CAAC;IAEA,OAAO;QACL,EAAE,IAAI,EAAE,GAAG,MAAM,YAAY,GAAG,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE;QACzD,EAAE,IAAI,EAAE,GAAG,MAAM,cAAc,GAAG,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE;KAC5D,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,8BAA8B;IAC5C,MAAM,IAAI,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmCd,CAAC;IAEA,OAAO,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;AACrD,CAAC;AAED,MAAM,CAAC,MAAM,uBAAuB,GAAG;;CAEtC,CAAC;AAEF,MAAM,UAAU,2BAA2B;IACzC,MAAM,UAAU,GAAG;;;;;;CAMpB,CAAC;IAEA,MAAM,cAAc,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyDxB,CAAC;IAEA,MAAM,UAAU,GAAG;;;;;EAKnB,uBAAuB,EAAE,CAAC;IAE1B,OAAO;QACL,EAAE,IAAI,EAAE,iBAAiB,EAAE,OAAO,EAAE,UAAU,EAAE;QAChD,EAAE,IAAI,EAAE,wCAAwC,EAAE,OAAO,EAAE,cAAc,EAAE;QAC3E,EAAE,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,UAAU,EAAE;KAChD,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,mBAAmB;IACjC,MAAM,IAAI,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8Dd,CAAC;IAEA,OAAO,CAAC,EAAE,IAAI,EAAE,oBAAoB,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;AACzD,CAAC"}
|
|
1
|
+
{"version":3,"file":"templates.js","sourceRoot":"","sources":["../src/templates.ts"],"names":[],"mappings":"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"}
|
package/dist/ui.d.ts
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export declare const BANNER_TEXT = "\n\u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502 OTPy.ir - Smart OTP SMS (Iran) \u2502\n\u2502 Fast, affordable. No contracts, no dedicated line. \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n";
|
|
2
|
+
export declare const BRAILLE_FRAMES = "\u280B\u2819\u2839\u2838\u283C\u2834\u2826\u2827\u2807\u280F";
|
|
3
|
+
export declare const ASCII_FRAMES = "|/-\\";
|
|
4
|
+
export declare function printBanner(): void;
|
|
5
|
+
/**
|
|
6
|
+
* True only for a real terminal that can animate safely. `OTPY_NO_SPINNER=1`
|
|
7
|
+
* is the explicit escape hatch for PTY-wrapping agent harnesses where isTTY is
|
|
8
|
+
* true but frames would pollute captured transcripts.
|
|
9
|
+
*/
|
|
10
|
+
export declare function isInteractive(): boolean;
|
|
11
|
+
export interface Spinner {
|
|
12
|
+
succeed(text?: string): void;
|
|
13
|
+
fail(text?: string): void;
|
|
14
|
+
stop(): void;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Start a spinner. Non-interactive environments (pipes, CI, AI-agent TUIs)
|
|
18
|
+
* degrade to one static stderr line with no frames, `\r`, or ANSI.
|
|
19
|
+
*/
|
|
20
|
+
export declare function spinner(text: string): Spinner;
|
package/dist/ui.js
ADDED
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
// Terminal output helpers. Zero runtime deps (AGENTS.md hard rule).
|
|
2
|
+
//
|
|
3
|
+
// Stream convention: progress (spinner) goes to stderr, data and results go to
|
|
4
|
+
// stdout. That keeps `otpy-cli init | tee log` clean in every mode and lets the
|
|
5
|
+
// no-`\r` / no-ANSI test invariants hold on both streams.
|
|
6
|
+
export const BANNER_TEXT = `
|
|
7
|
+
┌──────────────────────────────────────────────────────┐
|
|
8
|
+
│ OTPy.ir - Smart OTP SMS (Iran) │
|
|
9
|
+
│ Fast, affordable. No contracts, no dedicated line. │
|
|
10
|
+
└──────────────────────────────────────────────────────┘
|
|
11
|
+
`;
|
|
12
|
+
// U+28xx braille — exactly ten frames. Do not substitute look-alike U+29xx
|
|
13
|
+
// glyphs; the ui test pins the code-point range to catch copy-paste drift.
|
|
14
|
+
export const BRAILLE_FRAMES = "⠋⠙⠹⠸⠼⠴⠦⠧⠇⠏";
|
|
15
|
+
export const ASCII_FRAMES = "|/-\\";
|
|
16
|
+
export function printBanner() {
|
|
17
|
+
console.log(BANNER_TEXT);
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* True only for a real terminal that can animate safely. `OTPY_NO_SPINNER=1`
|
|
21
|
+
* is the explicit escape hatch for PTY-wrapping agent harnesses where isTTY is
|
|
22
|
+
* true but frames would pollute captured transcripts.
|
|
23
|
+
*/
|
|
24
|
+
export function isInteractive() {
|
|
25
|
+
return (Boolean(process.stderr.isTTY) &&
|
|
26
|
+
process.env.TERM !== "dumb" &&
|
|
27
|
+
!process.env.CI &&
|
|
28
|
+
!process.env.OTPY_NO_SPINNER);
|
|
29
|
+
}
|
|
30
|
+
function spinnerFrames() {
|
|
31
|
+
// Legacy Windows conhost raster fonts lack braille / VT processing.
|
|
32
|
+
const legacyWindows = process.platform === "win32" && !process.env.WT_SESSION && !process.env.TERM_PROGRAM;
|
|
33
|
+
return (legacyWindows ? ASCII_FRAMES : BRAILLE_FRAMES).split("");
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Start a spinner. Non-interactive environments (pipes, CI, AI-agent TUIs)
|
|
37
|
+
* degrade to one static stderr line with no frames, `\r`, or ANSI.
|
|
38
|
+
*/
|
|
39
|
+
export function spinner(text) {
|
|
40
|
+
const stream = process.stderr;
|
|
41
|
+
if (!isInteractive()) {
|
|
42
|
+
stream.write(`${text}\n`);
|
|
43
|
+
let finished = false;
|
|
44
|
+
const finish = (final) => {
|
|
45
|
+
if (finished)
|
|
46
|
+
return;
|
|
47
|
+
finished = true;
|
|
48
|
+
stream.write(`${final}\n`);
|
|
49
|
+
};
|
|
50
|
+
return {
|
|
51
|
+
succeed(final) {
|
|
52
|
+
finish(final ?? text);
|
|
53
|
+
},
|
|
54
|
+
fail(final) {
|
|
55
|
+
finish(final ?? text);
|
|
56
|
+
},
|
|
57
|
+
stop() {
|
|
58
|
+
finished = true;
|
|
59
|
+
},
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
const frames = spinnerFrames();
|
|
63
|
+
const maxWidth = Math.max(0, (stream.columns ?? 80) - 4);
|
|
64
|
+
const render = (line) => stream.write(`\r${line.slice(0, maxWidth)}`);
|
|
65
|
+
const clear = () => stream.write("\r\x1b[K");
|
|
66
|
+
let frameIndex = 0;
|
|
67
|
+
render(`${frames[0]} ${text}`);
|
|
68
|
+
const interval = setInterval(() => {
|
|
69
|
+
frameIndex = (frameIndex + 1) % frames.length;
|
|
70
|
+
render(`${frames[frameIndex]} ${text}`);
|
|
71
|
+
}, 80);
|
|
72
|
+
// Safe: a pending fetch holds its own libuv handle, so unref only means the
|
|
73
|
+
// timer alone never keeps the process alive.
|
|
74
|
+
interval.unref();
|
|
75
|
+
let stopped = false;
|
|
76
|
+
const stop = () => {
|
|
77
|
+
if (stopped)
|
|
78
|
+
return;
|
|
79
|
+
stopped = true;
|
|
80
|
+
clearInterval(interval);
|
|
81
|
+
process.removeListener("SIGINT", onSigint);
|
|
82
|
+
clear();
|
|
83
|
+
};
|
|
84
|
+
const onSigint = () => {
|
|
85
|
+
stop();
|
|
86
|
+
process.exit(130);
|
|
87
|
+
};
|
|
88
|
+
process.once("SIGINT", onSigint);
|
|
89
|
+
const finish = (final) => {
|
|
90
|
+
if (stopped)
|
|
91
|
+
return;
|
|
92
|
+
stop();
|
|
93
|
+
stream.write(`${final}\n`);
|
|
94
|
+
};
|
|
95
|
+
return {
|
|
96
|
+
succeed(final) {
|
|
97
|
+
finish(final ?? text);
|
|
98
|
+
},
|
|
99
|
+
fail(final) {
|
|
100
|
+
finish(final ?? text);
|
|
101
|
+
},
|
|
102
|
+
stop,
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=ui.js.map
|
package/dist/ui.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ui.js","sourceRoot":"","sources":["../src/ui.ts"],"names":[],"mappings":"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"}
|