@o-t-p-y/cli 0.3.3 → 0.4.1
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 +1 -1
- package/dist/detector.d.ts +1 -0
- package/dist/detector.js +9 -0
- package/dist/detector.js.map +1 -1
- package/dist/index.js +90 -74
- 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/README.md
CHANGED
|
@@ -37,7 +37,7 @@ npx @o-t-p-y/cli usage
|
|
|
37
37
|
npx @o-t-p-y/cli init --ai
|
|
38
38
|
```
|
|
39
39
|
|
|
40
|
-
Outputs prompt instructions for AI coding assistants (Cursor, Windsurf, Claude Code, GitHub Copilot).
|
|
40
|
+
Outputs prompt instructions for AI coding assistants (Cursor, Windsurf, Claude Code, GitHub Copilot). The instructions are framework-aware: JavaScript projects get `@o-t-p-y/sdk` guidance, while Python, Go, PHP, and unknown projects get REST API instructions.
|
|
41
41
|
|
|
42
42
|
## License
|
|
43
43
|
|
package/dist/detector.d.ts
CHANGED
|
@@ -7,5 +7,6 @@ export interface ProjectInfo {
|
|
|
7
7
|
envFilePath: string;
|
|
8
8
|
}
|
|
9
9
|
export type NextPagesRoot = "pages" | "src/pages";
|
|
10
|
+
export declare function usesJsSdk(framework: Framework): boolean;
|
|
10
11
|
export declare function detectNextPagesRoot(cwd?: string): NextPagesRoot;
|
|
11
12
|
export declare function detectProject(cwd?: string): ProjectInfo;
|
package/dist/detector.js
CHANGED
|
@@ -1,5 +1,14 @@
|
|
|
1
1
|
import { existsSync, readFileSync } from "node:fs";
|
|
2
2
|
import { join } from "node:path";
|
|
3
|
+
// Explicit JS-SDK list: everything else gets REST instructions. Inverting the
|
|
4
|
+
// default this way keeps future non-JS frameworks on the safe REST path.
|
|
5
|
+
export function usesJsSdk(framework) {
|
|
6
|
+
return (framework === "next-app" ||
|
|
7
|
+
framework === "next-pages" ||
|
|
8
|
+
framework === "sveltekit" ||
|
|
9
|
+
framework === "express" ||
|
|
10
|
+
framework === "node-generic");
|
|
11
|
+
}
|
|
3
12
|
// Next.js ignores src/pages when a root pages dir exists — root wins.
|
|
4
13
|
export function detectNextPagesRoot(cwd = process.cwd()) {
|
|
5
14
|
if (existsSync(join(cwd, "pages")))
|
package/dist/detector.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"detector.js","sourceRoot":"","sources":["../src/detector.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"detector.js","sourceRoot":"","sources":["../src/detector.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -3,20 +3,13 @@ import { createInterface } from "node:readline";
|
|
|
3
3
|
import { dirname, join } from "node:path";
|
|
4
4
|
import { existsSync, mkdirSync, writeFileSync } from "node:fs";
|
|
5
5
|
import packageMetadata from "../package.json" with { type: "json" };
|
|
6
|
-
import { detectNextPagesRoot, detectProject } from "./detector.js";
|
|
6
|
+
import { detectNextPagesRoot, detectProject, usesJsSdk } 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,77 @@ 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🤖
|
|
131
|
-
if (info.framework
|
|
132
|
-
console.log(` -
|
|
133
|
-
console.log(` -
|
|
134
|
-
console.log(` -
|
|
127
|
+
console.log(`\n🤖 AI assistant instructions (Cursor / Windsurf / Claude Code):`);
|
|
128
|
+
if (usesJsSdk(info.framework)) {
|
|
129
|
+
console.log(` - Library: @o-t-p-y/sdk`);
|
|
130
|
+
console.log(` - Send: otpy.sendOtp(phone) -> { request_id, ttl_seconds }`);
|
|
131
|
+
console.log(` - Verify: otpy.verifyOtp(phone, code) -> { verified: true }`);
|
|
135
132
|
}
|
|
136
133
|
else {
|
|
137
|
-
console.log(` -
|
|
138
|
-
console.log(` -
|
|
139
|
-
console.log(` -
|
|
134
|
+
console.log(` - REST API: https://api.otpy.ir`);
|
|
135
|
+
console.log(` - Send: POST /v1/otp/send with body {"phone": "09123456789"}`);
|
|
136
|
+
console.log(` - Verify: POST /v1/otp/verify with body {"phone": "09123456789", "code": "123456"} → {verified: boolean}`);
|
|
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!
|
|
148
|
+
|
|
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
|
|
153
|
+
`);
|
|
154
|
+
}
|
|
155
|
+
else if (usesJsSdk(info.framework)) {
|
|
156
|
+
console.log(`
|
|
157
|
+
🎉 Integration complete!
|
|
151
158
|
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
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
|
|
156
163
|
`);
|
|
157
164
|
}
|
|
158
165
|
else {
|
|
159
166
|
console.log(`
|
|
160
|
-
🎉
|
|
167
|
+
🎉 Integration complete!
|
|
161
168
|
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
169
|
+
Next steps:
|
|
170
|
+
1. REST API base: https://api.otpy.ir — integrate over HTTP; no npm package needed
|
|
171
|
+
2. Send a test SMS: npx @o-t-p-y/cli test 09123456789
|
|
172
|
+
3. Dashboard & live stats: https://dash.otpy.ir
|
|
166
173
|
`);
|
|
167
174
|
}
|
|
168
175
|
}
|
|
169
176
|
async function runTest() {
|
|
170
177
|
const phone = args[1];
|
|
171
178
|
if (!phone || !/^09\d{9}$/.test(phone)) {
|
|
172
|
-
|
|
179
|
+
// Error lines stay on stdout (behavior preserved); only the spinner uses stderr.
|
|
180
|
+
console.log("❌ Error: a valid mobile number is required. Example: npx @o-t-p-y/cli test 09123456789");
|
|
173
181
|
process.exit(1);
|
|
174
182
|
}
|
|
175
183
|
const info = detectProject(process.cwd());
|
|
176
184
|
const apiKey = getExistingEnvKey(info.envFilePath);
|
|
177
185
|
if (!apiKey) {
|
|
178
|
-
console.log("❌
|
|
186
|
+
console.log("❌ OTPY_API_KEY not found in .env — run npx @o-t-p-y/cli init first.");
|
|
179
187
|
process.exit(1);
|
|
180
188
|
}
|
|
181
|
-
|
|
189
|
+
const s = spinner(`🚀 Sending test OTP to ${phone}...`);
|
|
182
190
|
try {
|
|
183
191
|
const res = await fetch("https://api.otpy.ir/v1/otp/send", {
|
|
184
192
|
method: "POST",
|
|
@@ -187,46 +195,54 @@ async function runTest() {
|
|
|
187
195
|
"content-type": "application/json",
|
|
188
196
|
},
|
|
189
197
|
body: JSON.stringify({ phone }),
|
|
198
|
+
signal: AbortSignal.timeout(10_000),
|
|
190
199
|
});
|
|
191
200
|
const data = (await res.json());
|
|
201
|
+
s.stop();
|
|
192
202
|
if (res.ok) {
|
|
193
|
-
console.log(
|
|
194
|
-
console.log(`
|
|
195
|
-
console.log(`
|
|
203
|
+
console.log(`✅ SMS sent!`);
|
|
204
|
+
console.log(` Request ID: ${data.request_id}`);
|
|
205
|
+
console.log(` Billing: ${data.free ? "daily free quota" : "paid credit"}`);
|
|
196
206
|
}
|
|
197
207
|
else {
|
|
198
|
-
console.log(`❌
|
|
208
|
+
console.log(`❌ Failed to send SMS: ${data.error || res.statusText}`);
|
|
199
209
|
}
|
|
200
210
|
}
|
|
201
211
|
catch (err) {
|
|
202
|
-
|
|
212
|
+
s.stop();
|
|
213
|
+
console.log(`❌ Network error: ${String(err)}`);
|
|
203
214
|
}
|
|
204
215
|
}
|
|
205
216
|
async function runUsage() {
|
|
206
217
|
const info = detectProject(process.cwd());
|
|
207
218
|
const apiKey = getExistingEnvKey(info.envFilePath);
|
|
208
219
|
if (!apiKey) {
|
|
209
|
-
|
|
220
|
+
// Error lines stay on stdout (behavior preserved); only the spinner uses stderr.
|
|
221
|
+
console.log("❌ OTPY_API_KEY not found in .env — run npx @o-t-p-y/cli init first.");
|
|
210
222
|
process.exit(1);
|
|
211
223
|
}
|
|
224
|
+
const s = spinner(`📊 Fetching usage...`);
|
|
212
225
|
try {
|
|
213
226
|
const res = await fetch("https://api.otpy.ir/v1/usage", {
|
|
214
227
|
method: "GET",
|
|
215
228
|
headers: { authorization: `Bearer ${apiKey}` },
|
|
229
|
+
signal: AbortSignal.timeout(10_000),
|
|
216
230
|
});
|
|
217
231
|
const data = (await res.json());
|
|
232
|
+
s.stop();
|
|
218
233
|
if (res.ok) {
|
|
219
|
-
console.log(`📊
|
|
220
|
-
console.log(`
|
|
221
|
-
console.log(`
|
|
222
|
-
console.log(`
|
|
234
|
+
console.log(`📊 Today's usage:`);
|
|
235
|
+
console.log(` Free quota used: ${data.free_used_today} of ${data.free_quota_today}`);
|
|
236
|
+
console.log(` Paid SMS: ${data.paid_today}`);
|
|
237
|
+
console.log(` Daily limit: ${data.daily_limit ? data.daily_limit : "unlimited"}`);
|
|
223
238
|
}
|
|
224
239
|
else {
|
|
225
|
-
console.log(`❌
|
|
240
|
+
console.log(`❌ Failed to fetch usage.`);
|
|
226
241
|
}
|
|
227
242
|
}
|
|
228
243
|
catch (err) {
|
|
229
|
-
|
|
244
|
+
s.stop();
|
|
245
|
+
console.log(`❌ Network error: ${String(err)}`);
|
|
230
246
|
}
|
|
231
247
|
}
|
|
232
248
|
if (command === "--version" || command === "-v") {
|
|
@@ -235,12 +251,12 @@ if (command === "--version" || command === "-v") {
|
|
|
235
251
|
}
|
|
236
252
|
if (command === "--help" || command === "-h") {
|
|
237
253
|
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
|
|
254
|
+
Usage: npx @o-t-p-y/cli <command>
|
|
255
|
+
npx @o-t-p-y/cli init Set up your project and generate integration files
|
|
256
|
+
npx @o-t-p-y/cli init --ai Set up with AI assistant instructions
|
|
257
|
+
npx @o-t-p-y/cli test <phone> Send a test OTP SMS to any number
|
|
258
|
+
npx @o-t-p-y/cli usage Show today's usage and quota
|
|
259
|
+
npx @o-t-p-y/cli --version CLI version
|
|
244
260
|
`);
|
|
245
261
|
process.exit(0);
|
|
246
262
|
}
|
|
@@ -254,7 +270,7 @@ else if (command === "usage") {
|
|
|
254
270
|
runUsage().catch(console.error);
|
|
255
271
|
}
|
|
256
272
|
else {
|
|
257
|
-
console.log(
|
|
273
|
+
console.log(`Unknown command: ${command}\nRun npx @o-t-p-y/cli --help for usage.`);
|
|
258
274
|
process.exit(1);
|
|
259
275
|
}
|
|
260
276
|
//# 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;
|
|
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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"}
|