@loggydev/loggy-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.
Files changed (46) hide show
  1. package/README.md +133 -0
  2. package/dist/commands/init.d.ts +8 -0
  3. package/dist/commands/init.d.ts.map +1 -0
  4. package/dist/commands/init.js +186 -0
  5. package/dist/commands/init.js.map +1 -0
  6. package/dist/index.d.ts +3 -0
  7. package/dist/index.d.ts.map +1 -0
  8. package/dist/index.js +17 -0
  9. package/dist/index.js.map +1 -0
  10. package/dist/utils/api.d.ts +11 -0
  11. package/dist/utils/api.d.ts.map +1 -0
  12. package/dist/utils/api.js +37 -0
  13. package/dist/utils/api.js.map +1 -0
  14. package/dist/utils/auth.d.ts +7 -0
  15. package/dist/utils/auth.d.ts.map +1 -0
  16. package/dist/utils/auth.js +120 -0
  17. package/dist/utils/auth.js.map +1 -0
  18. package/dist/utils/detect-framework.d.ts +10 -0
  19. package/dist/utils/detect-framework.d.ts.map +1 -0
  20. package/dist/utils/detect-framework.js +130 -0
  21. package/dist/utils/detect-framework.js.map +1 -0
  22. package/dist/utils/detect-package-manager.d.ts +4 -0
  23. package/dist/utils/detect-package-manager.d.ts.map +1 -0
  24. package/dist/utils/detect-package-manager.js +35 -0
  25. package/dist/utils/detect-package-manager.js.map +1 -0
  26. package/dist/utils/env.d.ts +2 -0
  27. package/dist/utils/env.d.ts.map +1 -0
  28. package/dist/utils/env.js +54 -0
  29. package/dist/utils/env.js.map +1 -0
  30. package/dist/utils/generate-files.d.ts +8 -0
  31. package/dist/utils/generate-files.d.ts.map +1 -0
  32. package/dist/utils/generate-files.js +130 -0
  33. package/dist/utils/generate-files.js.map +1 -0
  34. package/dist/utils/install.d.ts +3 -0
  35. package/dist/utils/install.d.ts.map +1 -0
  36. package/dist/utils/install.js +34 -0
  37. package/dist/utils/install.js.map +1 -0
  38. package/dist/utils/project-name.d.ts +2 -0
  39. package/dist/utils/project-name.d.ts.map +1 -0
  40. package/dist/utils/project-name.js +20 -0
  41. package/dist/utils/project-name.js.map +1 -0
  42. package/dist/utils/ui.d.ts +39 -0
  43. package/dist/utils/ui.d.ts.map +1 -0
  44. package/dist/utils/ui.js +121 -0
  45. package/dist/utils/ui.js.map +1 -0
  46. package/package.json +54 -0
package/README.md ADDED
@@ -0,0 +1,133 @@
1
+ # Loggy CLI
2
+
3
+ The official CLI tool for setting up [Loggy](https://loggy.dev) in your projects.
4
+
5
+ ## Quick Start
6
+
7
+ ```bash
8
+ npx loggy init
9
+ ```
10
+
11
+ That's it! The CLI will:
12
+
13
+ 1. 🔍 **Detect your framework** (Next.js, Astro, Remix, Express, etc.)
14
+ 2. 📦 **Install the SDK** using your package manager
15
+ 3. 🔑 **Authenticate you** via browser
16
+ 4. 📝 **Create a project** on Loggy
17
+ 5. 🚀 **Set up instrumentation** with a ready-to-use utility file
18
+
19
+ ## What It Does
20
+
21
+ ```bash
22
+ $ npx loggy init
23
+
24
+ 🚀 Welcome to Loggy!
25
+ Let's get your project set up in under 60 seconds.
26
+
27
+ ✔ Project detected!
28
+ Framework: Next.js
29
+ Package manager: npm
30
+ Project name: my-app
31
+
32
+ ✔ SDK installed!
33
+
34
+ 📦 Let's connect to Loggy:
35
+
36
+ ? How would you like to authenticate?
37
+ ❯ Open browser to sign up / log in
38
+ I already have a project token
39
+
40
+ ✔ Authenticated as kevin@example.com
41
+ ✔ Project created!
42
+ Project ID: 123
43
+
44
+ ✔ Token saved to .env.local
45
+ ✔ Instrumentation added!
46
+ ✓ Created src/lib/loggy.ts
47
+
48
+ ✅ Done! Loggy is ready to go.
49
+
50
+ Your logs will appear at:
51
+ https://loggy.dev/dash
52
+
53
+ Try it out:
54
+ import { loggy } from '@/lib/loggy';
55
+ loggy.info('Hello from Loggy! 🎉');
56
+ ```
57
+
58
+ ## Supported Frameworks
59
+
60
+ | Framework | Detected By | Env File | Lib Path |
61
+ | ----------- | ------------------ | ------------ | ------------------- |
62
+ | Next.js | `next` | `.env.local` | `src/lib/loggy.ts` |
63
+ | Astro | `astro` | `.env` | `src/lib/loggy.ts` |
64
+ | Remix | `@remix-run/*` | `.env` | `app/lib/loggy.ts` |
65
+ | SvelteKit | `@sveltejs/kit` | `.env` | `src/lib/loggy.ts` |
66
+ | Nuxt | `nuxt` | `.env` | `lib/loggy.ts` |
67
+ | Express | `express` | `.env` | `lib/loggy.ts` |
68
+ | Fastify | `fastify` | `.env` | `lib/loggy.ts` |
69
+ | Hono | `hono` | `.env` | `lib/loggy.ts` |
70
+ | Node.js | (default) | `.env` | `lib/loggy.ts` |
71
+
72
+ ## Options
73
+
74
+ ```bash
75
+ npx loggy init [options]
76
+
77
+ Options:
78
+ --skip-install Skip SDK installation
79
+ --skip-config Skip config file modifications
80
+ --token <token> Use existing project token
81
+ -h, --help Display help
82
+ ```
83
+
84
+ ## Manual Installation
85
+
86
+ If you prefer to set up manually:
87
+
88
+ 1. Install the SDK:
89
+ ```bash
90
+ npm install @loggydev/loggy-node
91
+ ```
92
+
93
+ 2. Create a utility file (e.g., `lib/loggy.ts`):
94
+ ```typescript
95
+ import { CreateLoggy } from "@loggydev/loggy-node";
96
+
97
+ export const loggy = CreateLoggy({
98
+ identifier: "my-app",
99
+ remote: {
100
+ token: process.env.LOGGY_TOKEN || "",
101
+ },
102
+ });
103
+ ```
104
+
105
+ 3. Add your token to `.env`:
106
+ ```
107
+ LOGGY_TOKEN=your-project-token
108
+ ```
109
+
110
+ 4. Use it anywhere:
111
+ ```typescript
112
+ import { loggy } from "@/lib/loggy";
113
+
114
+ loggy.info("Hello from Loggy!");
115
+ ```
116
+
117
+ ## Development
118
+
119
+ ```bash
120
+ # Install dependencies
121
+ npm install
122
+
123
+ # Build
124
+ npm run build
125
+
126
+ # Run locally
127
+ node dist/index.js init
128
+ ```
129
+
130
+ ## License
131
+
132
+ MIT
133
+ # loggy-cli
@@ -0,0 +1,8 @@
1
+ interface InitOptions {
2
+ skipInstall?: boolean;
3
+ skipConfig?: boolean;
4
+ token?: string;
5
+ }
6
+ export declare function init(options: InitOptions): Promise<void>;
7
+ export {};
8
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAeA,UAAU,WAAW;IACnB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CA6M9D"}
@@ -0,0 +1,186 @@
1
+ import inquirer from "inquirer";
2
+ import ora from "ora";
3
+ import { createProject } from "../utils/api.js";
4
+ import { authenticateUser } from "../utils/auth.js";
5
+ import { detectFramework } from "../utils/detect-framework.js";
6
+ import { detectPackageManager, } from "../utils/detect-package-manager.js";
7
+ import { updateEnvFile } from "../utils/env.js";
8
+ import { generateFiles } from "../utils/generate-files.js";
9
+ import { installSdk } from "../utils/install.js";
10
+ import { getProjectName } from "../utils/project-name.js";
11
+ import { ui } from "../utils/ui.js";
12
+ export async function init(options) {
13
+ // Welcome banner
14
+ ui.welcome();
15
+ const cwd = process.cwd();
16
+ // Step 1: Detect framework
17
+ const detectSpinner = ora({
18
+ text: ui.dim("Scanning project..."),
19
+ spinner: "dots12",
20
+ color: "yellow",
21
+ }).start();
22
+ let framework;
23
+ let packageManager;
24
+ let projectName;
25
+ try {
26
+ framework = await detectFramework(cwd);
27
+ packageManager = await detectPackageManager(cwd);
28
+ projectName = await getProjectName(cwd);
29
+ detectSpinner.succeed(ui.success("Project detected"));
30
+ }
31
+ catch (error) {
32
+ detectSpinner.fail(ui.error("Could not detect project"));
33
+ ui.line(ui.warn("Make sure you're in a Node.js project with a package.json file."));
34
+ console.log();
35
+ process.exit(1);
36
+ }
37
+ // Show detected info in a nice format
38
+ ui.detected("⚡", "Framework", framework.name);
39
+ ui.detected("📦", "Package manager", packageManager);
40
+ ui.detected("📁", "Project", projectName);
41
+ console.log();
42
+ // Step 2: Install SDK
43
+ if (!options.skipInstall) {
44
+ const installSpinner = ora({
45
+ text: ui.dim(`Installing ${ui.coral("@loggydev/loggy-node")}...`),
46
+ spinner: "dots12",
47
+ color: "yellow",
48
+ }).start();
49
+ try {
50
+ await installSdk(packageManager, cwd);
51
+ installSpinner.succeed(ui.success("SDK installed"));
52
+ }
53
+ catch (error) {
54
+ installSpinner.fail(ui.error("Failed to install SDK"));
55
+ ui.line(ui.warn(`Try: ${packageManager} ${packageManager === "npm" ? "install" : "add"} @loggydev/loggy-node`));
56
+ }
57
+ }
58
+ // Step 3: Authenticate or use existing token
59
+ let token = options.token;
60
+ let userEmail;
61
+ let projectId;
62
+ if (!token) {
63
+ ui.section("🔐 Authentication");
64
+ const { authChoice } = await inquirer.prompt([
65
+ {
66
+ type: "list",
67
+ name: "authChoice",
68
+ message: ui.coral("How would you like to authenticate?"),
69
+ choices: [
70
+ {
71
+ name: `${ui.symbols.rocket} Open browser to sign up / log in`,
72
+ value: "browser",
73
+ },
74
+ {
75
+ name: `${ui.symbols.key} I already have a project token`,
76
+ value: "token",
77
+ },
78
+ ],
79
+ prefix: " ",
80
+ },
81
+ ]);
82
+ if (authChoice === "browser") {
83
+ const authSpinner = ora({
84
+ text: ui.dim("Opening browser..."),
85
+ spinner: "dots12",
86
+ color: "yellow",
87
+ }).start();
88
+ try {
89
+ const authResult = await authenticateUser();
90
+ token = authResult.token;
91
+ userEmail = authResult.email;
92
+ authSpinner.succeed(ui.success(`Authenticated as ${ui.bold(userEmail || "user")}`));
93
+ }
94
+ catch (error) {
95
+ authSpinner.fail(ui.error("Authentication failed"));
96
+ ui.line(ui.warn("Please try again or use an existing token."));
97
+ console.log();
98
+ process.exit(1);
99
+ }
100
+ // Step 4: Create project
101
+ const projectSpinner = ora({
102
+ text: ui.dim(`Creating project "${projectName}"...`),
103
+ spinner: "dots12",
104
+ color: "yellow",
105
+ }).start();
106
+ try {
107
+ const project = await createProject(token, projectName, framework.name);
108
+ token = project.token;
109
+ projectId = project.id;
110
+ projectSpinner.succeed(ui.success(`Project created ${ui.dim(`(ID: ${project.id})`)}`));
111
+ }
112
+ catch (error) {
113
+ if (error.code === "PROJECT_LIMIT_REACHED") {
114
+ projectSpinner.fail(ui.error("Project limit reached"));
115
+ ui.line(ui.warn(error.message));
116
+ ui.line(ui.info("Upgrade at: https://loggy.dev/pricing"));
117
+ }
118
+ else {
119
+ projectSpinner.fail(ui.error("Failed to create project"));
120
+ ui.line(ui.warn(error.message || "Please try again."));
121
+ }
122
+ console.log();
123
+ process.exit(1);
124
+ }
125
+ }
126
+ else {
127
+ const { existingToken } = await inquirer.prompt([
128
+ {
129
+ type: "input",
130
+ name: "existingToken",
131
+ message: ui.coral("Enter your project token:"),
132
+ validate: (input) => input.length > 0 || "Token is required",
133
+ prefix: " ",
134
+ },
135
+ ]);
136
+ token = existingToken;
137
+ }
138
+ }
139
+ // Step 5: Save token to .env file
140
+ const envSpinner = ora({
141
+ text: ui.dim(`Saving token to ${framework.envFile}...`),
142
+ spinner: "dots12",
143
+ color: "yellow",
144
+ }).start();
145
+ try {
146
+ await updateEnvFile(cwd, framework.envFile, token);
147
+ envSpinner.succeed(ui.success(`Token saved to ${ui.bold(framework.envFile)}`));
148
+ }
149
+ catch (error) {
150
+ envSpinner.fail(ui.error(`Failed to save token to ${framework.envFile}`));
151
+ }
152
+ // Step 6: Generate setup files
153
+ if (!options.skipConfig) {
154
+ const filesSpinner = ora({
155
+ text: ui.dim("Generating configuration..."),
156
+ spinner: "dots12",
157
+ color: "yellow",
158
+ }).start();
159
+ try {
160
+ const generatedFiles = await generateFiles(cwd, framework, token);
161
+ filesSpinner.succeed(ui.success("Configuration complete"));
162
+ for (const file of generatedFiles) {
163
+ ui.line(`${ui.symbols.check} ${file.action === "created" ? "Created" : "Updated"} ${ui.bold(file.path)}`, 5);
164
+ }
165
+ }
166
+ catch (error) {
167
+ filesSpinner.fail(ui.error("Failed to generate config"));
168
+ ui.line(ui.warn("You can manually set up Loggy at https://loggy.dev/docs"));
169
+ }
170
+ }
171
+ // Step 7: Success message
172
+ const logsUrl = projectId
173
+ ? `https://loggy.dev/project/${projectId}/logs`
174
+ : "https://loggy.dev/dash";
175
+ ui.successBox("Ready to go!", [
176
+ `${ui.symbols.check} Loggy is now configured for ${ui.bold(projectName)}`,
177
+ "",
178
+ `${ui.dim("View your logs:")} ${ui.coral(logsUrl)}`,
179
+ "",
180
+ `${ui.dim("Try it out:")}`,
181
+ ` ${ui.info(`import { loggy } from '${framework.importPath}';`)}`,
182
+ ` ${ui.info("loggy.info('Hello from Loggy! 🎉');")}`,
183
+ ]);
184
+ console.log();
185
+ }
186
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,17 @@
1
+ #!/usr/bin/env node
2
+ import { Command } from "commander";
3
+ import { init } from "./commands/init.js";
4
+ const program = new Command();
5
+ program
6
+ .name("loggy")
7
+ .description("CLI tool for setting up Loggy in your projects")
8
+ .version("0.1.0");
9
+ program
10
+ .command("init")
11
+ .description("Initialize Loggy in your project")
12
+ .option("--skip-install", "Skip SDK installation")
13
+ .option("--skip-config", "Skip config file modifications")
14
+ .option("--token <token>", "Use existing project token")
15
+ .action(init);
16
+ program.parse();
17
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAE1C,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,OAAO,CAAC;KACb,WAAW,CAAC,gDAAgD,CAAC;KAC7D,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,kCAAkC,CAAC;KAC/C,MAAM,CAAC,gBAAgB,EAAE,uBAAuB,CAAC;KACjD,MAAM,CAAC,eAAe,EAAE,gCAAgC,CAAC;KACzD,MAAM,CAAC,iBAAiB,EAAE,4BAA4B,CAAC;KACvD,MAAM,CAAC,IAAI,CAAC,CAAC;AAEhB,OAAO,CAAC,KAAK,EAAE,CAAC"}
@@ -0,0 +1,11 @@
1
+ export interface Project {
2
+ id: number;
3
+ title: string;
4
+ description: string;
5
+ token: string;
6
+ }
7
+ export interface ApiError extends Error {
8
+ code?: string;
9
+ }
10
+ export declare function createProject(authToken: string, name: string, framework: string): Promise<Project>;
11
+ //# sourceMappingURL=api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/utils/api.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,QAAS,SAAQ,KAAK;IACrC,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,wBAAsB,aAAa,CACjC,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,OAAO,CAAC,CA2BlB"}
@@ -0,0 +1,37 @@
1
+ const LOGGY_URL = process.env.LOGGY_URL || "https://loggy.dev";
2
+ export async function createProject(authToken, name, framework) {
3
+ const response = await fetch(`${LOGGY_URL}/api/projects`, {
4
+ method: "POST",
5
+ headers: {
6
+ "Content-Type": "application/json",
7
+ "x-auth-token": authToken,
8
+ },
9
+ body: JSON.stringify({
10
+ title: name,
11
+ description: `${framework} project initialized via Loggy CLI`,
12
+ icon: getFrameworkIcon(framework),
13
+ }),
14
+ });
15
+ if (!response.ok) {
16
+ const data = (await response.json().catch(() => ({})));
17
+ const error = new Error(data.error || "Failed to create project");
18
+ error.code = data.code;
19
+ throw error;
20
+ }
21
+ return response.json();
22
+ }
23
+ function getFrameworkIcon(framework) {
24
+ const icons = {
25
+ "Next.js": "▲",
26
+ Astro: "🚀",
27
+ Remix: "💿",
28
+ SvelteKit: "🔥",
29
+ Nuxt: "💚",
30
+ Express: "⚡",
31
+ Fastify: "🚀",
32
+ Hono: "🔥",
33
+ "Node.js": "📦",
34
+ };
35
+ return icons[framework] || "📦";
36
+ }
37
+ //# sourceMappingURL=api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/utils/api.ts"],"names":[],"mappings":"AAAA,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,mBAAmB,CAAC;AAa/D,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,SAAiB,EACjB,IAAY,EACZ,SAAiB;IAEjB,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,SAAS,eAAe,EAAE;QACxD,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACP,cAAc,EAAE,kBAAkB;YAClC,cAAc,EAAE,SAAS;SAC1B;QACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;YACnB,KAAK,EAAE,IAAI;YACX,WAAW,EAAE,GAAG,SAAS,oCAAoC;YAC7D,IAAI,EAAE,gBAAgB,CAAC,SAAS,CAAC;SAClC,CAAC;KACH,CAAC,CAAC;IAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAGpD,CAAC;QACF,MAAM,KAAK,GAAG,IAAI,KAAK,CACrB,IAAI,CAAC,KAAK,IAAI,0BAA0B,CAC7B,CAAC;QACd,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACvB,MAAM,KAAK,CAAC;IACd,CAAC;IAED,OAAO,QAAQ,CAAC,IAAI,EAAsB,CAAC;AAC7C,CAAC;AAED,SAAS,gBAAgB,CAAC,SAAiB;IACzC,MAAM,KAAK,GAA2B;QACpC,SAAS,EAAE,GAAG;QACd,KAAK,EAAE,IAAI;QACX,KAAK,EAAE,IAAI;QACX,SAAS,EAAE,IAAI;QACf,IAAI,EAAE,IAAI;QACV,OAAO,EAAE,GAAG;QACZ,OAAO,EAAE,IAAI;QACb,IAAI,EAAE,IAAI;QACV,SAAS,EAAE,IAAI;KAChB,CAAC;IACF,OAAO,KAAK,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC;AAClC,CAAC"}
@@ -0,0 +1,7 @@
1
+ export interface AuthResult {
2
+ token: string;
3
+ email: string;
4
+ userId: string;
5
+ }
6
+ export declare function authenticateUser(): Promise<AuthResult>;
7
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/utils/auth.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,UAAU,CAAC,CA0H5D"}
@@ -0,0 +1,120 @@
1
+ import { createServer } from "node:http";
2
+ import open from "open";
3
+ const LOGGY_URL = process.env.LOGGY_URL || "https://loggy.dev";
4
+ const CLI_PORT = 9876;
5
+ export async function authenticateUser() {
6
+ return new Promise((resolve, reject) => {
7
+ const server = createServer((req, res) => {
8
+ const url = new URL(req.url || "/", `http://localhost:${CLI_PORT}`);
9
+ if (url.pathname === "/callback") {
10
+ const token = url.searchParams.get("token");
11
+ const email = url.searchParams.get("email");
12
+ const userId = url.searchParams.get("userId");
13
+ if (token && email && userId) {
14
+ // Send success page
15
+ res.writeHead(200, { "Content-Type": "text/html" });
16
+ res.end(`
17
+ <!DOCTYPE html>
18
+ <html>
19
+ <head>
20
+ <title>Loggy CLI - Authentication Successful</title>
21
+ <style>
22
+ body {
23
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
24
+ display: flex;
25
+ justify-content: center;
26
+ align-items: center;
27
+ height: 100vh;
28
+ margin: 0;
29
+ background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
30
+ color: white;
31
+ }
32
+ .container {
33
+ text-align: center;
34
+ padding: 40px;
35
+ background: rgba(255,255,255,0.1);
36
+ border-radius: 16px;
37
+ backdrop-filter: blur(10px);
38
+ }
39
+ h1 { margin-bottom: 10px; }
40
+ p { opacity: 0.9; }
41
+ .checkmark {
42
+ font-size: 64px;
43
+ margin-bottom: 20px;
44
+ }
45
+ </style>
46
+ </head>
47
+ <body>
48
+ <div class="container">
49
+ <div class="checkmark">✅</div>
50
+ <h1>Authentication Successful!</h1>
51
+ <p>You can close this window and return to your terminal.</p>
52
+ </div>
53
+ </body>
54
+ </html>
55
+ `);
56
+ server.close();
57
+ resolve({ token, email, userId });
58
+ }
59
+ else {
60
+ res.writeHead(400, { "Content-Type": "text/html" });
61
+ res.end(`
62
+ <!DOCTYPE html>
63
+ <html>
64
+ <head>
65
+ <title>Loggy CLI - Authentication Failed</title>
66
+ <style>
67
+ body {
68
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
69
+ display: flex;
70
+ justify-content: center;
71
+ align-items: center;
72
+ height: 100vh;
73
+ margin: 0;
74
+ background: linear-gradient(135deg, #e74c3c 0%, #c0392b 100%);
75
+ color: white;
76
+ }
77
+ .container {
78
+ text-align: center;
79
+ padding: 40px;
80
+ background: rgba(255,255,255,0.1);
81
+ border-radius: 16px;
82
+ backdrop-filter: blur(10px);
83
+ }
84
+ h1 { margin-bottom: 10px; }
85
+ p { opacity: 0.9; }
86
+ .icon { font-size: 64px; margin-bottom: 20px; }
87
+ </style>
88
+ </head>
89
+ <body>
90
+ <div class="container">
91
+ <div class="icon">❌</div>
92
+ <h1>Authentication Failed</h1>
93
+ <p>Please try again from your terminal.</p>
94
+ </div>
95
+ </body>
96
+ </html>
97
+ `);
98
+ server.close();
99
+ reject(new Error("Authentication failed - missing credentials"));
100
+ }
101
+ }
102
+ else {
103
+ res.writeHead(404);
104
+ res.end("Not found");
105
+ }
106
+ });
107
+ server.listen(CLI_PORT, () => {
108
+ // Open browser to Loggy auth page with callback URL
109
+ const callbackUrl = encodeURIComponent(`http://localhost:${CLI_PORT}/callback`);
110
+ const authUrl = `${LOGGY_URL}/cli-auth?callback=${callbackUrl}`;
111
+ open(authUrl);
112
+ });
113
+ // Timeout after 5 minutes
114
+ setTimeout(() => {
115
+ server.close();
116
+ reject(new Error("Authentication timed out"));
117
+ }, 5 * 60 * 1000);
118
+ });
119
+ }
120
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/utils/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,mBAAmB,CAAC;AAC/D,MAAM,QAAQ,GAAG,IAAI,CAAC;AAQtB,MAAM,CAAC,KAAK,UAAU,gBAAgB;IACpC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,MAAM,GAAG,YAAY,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;YACvC,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,EAAE,oBAAoB,QAAQ,EAAE,CAAC,CAAC;YAEpE,IAAI,GAAG,CAAC,QAAQ,KAAK,WAAW,EAAE,CAAC;gBACjC,MAAM,KAAK,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;gBAC5C,MAAM,KAAK,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;gBAC5C,MAAM,MAAM,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;gBAE9C,IAAI,KAAK,IAAI,KAAK,IAAI,MAAM,EAAE,CAAC;oBAC7B,oBAAoB;oBACpB,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,WAAW,EAAE,CAAC,CAAC;oBACpD,GAAG,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;WAuCP,CAAC,CAAC;oBAEH,MAAM,CAAC,KAAK,EAAE,CAAC;oBACf,OAAO,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;gBACpC,CAAC;qBAAM,CAAC;oBACN,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,WAAW,EAAE,CAAC,CAAC;oBACpD,GAAG,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;WAoCP,CAAC,CAAC;oBACH,MAAM,CAAC,KAAK,EAAE,CAAC;oBACf,MAAM,CAAC,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC,CAAC;gBACnE,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;gBACnB,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;YACvB,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,GAAG,EAAE;YAC3B,oDAAoD;YACpD,MAAM,WAAW,GAAG,kBAAkB,CACpC,oBAAoB,QAAQ,WAAW,CACxC,CAAC;YACF,MAAM,OAAO,GAAG,GAAG,SAAS,sBAAsB,WAAW,EAAE,CAAC;YAChE,IAAI,CAAC,OAAO,CAAC,CAAC;QAChB,CAAC,CAAC,CAAC;QAEH,0BAA0B;QAC1B,UAAU,CACR,GAAG,EAAE;YACH,MAAM,CAAC,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC,CAAC;QAChD,CAAC,EACD,CAAC,GAAG,EAAE,GAAG,IAAI,CACd,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,10 @@
1
+ export interface Framework {
2
+ id: string;
3
+ name: string;
4
+ envFile: string;
5
+ importPath: string;
6
+ libPath: string;
7
+ configFile?: string;
8
+ }
9
+ export declare function detectFramework(cwd: string): Promise<Framework>;
10
+ //# sourceMappingURL=detect-framework.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detect-framework.d.ts","sourceRoot":"","sources":["../../src/utils/detect-framework.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAqED,wBAAsB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CA2DrE"}