@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
@@ -0,0 +1,130 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import { join } from "node:path";
3
+ const FRAMEWORKS = [
4
+ {
5
+ id: "nextjs",
6
+ name: "Next.js",
7
+ envFile: ".env.local",
8
+ importPath: "@/lib/loggy",
9
+ libPath: "src/lib/loggy.ts",
10
+ configFile: "next.config.js",
11
+ },
12
+ {
13
+ id: "astro",
14
+ name: "Astro",
15
+ envFile: ".env",
16
+ importPath: "@/lib/loggy",
17
+ libPath: "src/lib/loggy.ts",
18
+ },
19
+ {
20
+ id: "remix",
21
+ name: "Remix",
22
+ envFile: ".env",
23
+ importPath: "~/lib/loggy",
24
+ libPath: "app/lib/loggy.ts",
25
+ },
26
+ {
27
+ id: "sveltekit",
28
+ name: "SvelteKit",
29
+ envFile: ".env",
30
+ importPath: "$lib/loggy",
31
+ libPath: "src/lib/loggy.ts",
32
+ },
33
+ {
34
+ id: "nuxt",
35
+ name: "Nuxt",
36
+ envFile: ".env",
37
+ importPath: "~/lib/loggy",
38
+ libPath: "lib/loggy.ts",
39
+ },
40
+ {
41
+ id: "express",
42
+ name: "Express",
43
+ envFile: ".env",
44
+ importPath: "./lib/loggy",
45
+ libPath: "lib/loggy.ts",
46
+ },
47
+ {
48
+ id: "fastify",
49
+ name: "Fastify",
50
+ envFile: ".env",
51
+ importPath: "./lib/loggy",
52
+ libPath: "lib/loggy.ts",
53
+ },
54
+ {
55
+ id: "hono",
56
+ name: "Hono",
57
+ envFile: ".env",
58
+ importPath: "./lib/loggy",
59
+ libPath: "lib/loggy.ts",
60
+ },
61
+ {
62
+ id: "node",
63
+ name: "Node.js",
64
+ envFile: ".env",
65
+ importPath: "./lib/loggy",
66
+ libPath: "lib/loggy.ts",
67
+ },
68
+ ];
69
+ export async function detectFramework(cwd) {
70
+ const packageJsonPath = join(cwd, "package.json");
71
+ try {
72
+ const content = await readFile(packageJsonPath, "utf-8");
73
+ const packageJson = JSON.parse(content);
74
+ const deps = {
75
+ ...packageJson.dependencies,
76
+ ...packageJson.devDependencies,
77
+ };
78
+ // Check for specific frameworks in order of specificity
79
+ if (deps["next"]) {
80
+ const framework = FRAMEWORKS.find((f) => f.id === "nextjs");
81
+ // Check if using src directory
82
+ const hasSrcDir = await fileExists(join(cwd, "src"));
83
+ if (!hasSrcDir) {
84
+ return {
85
+ ...framework,
86
+ libPath: "lib/loggy.ts",
87
+ importPath: "@/lib/loggy",
88
+ };
89
+ }
90
+ return framework;
91
+ }
92
+ if (deps["astro"]) {
93
+ return FRAMEWORKS.find((f) => f.id === "astro");
94
+ }
95
+ if (deps["@remix-run/node"] || deps["@remix-run/react"]) {
96
+ return FRAMEWORKS.find((f) => f.id === "remix");
97
+ }
98
+ if (deps["@sveltejs/kit"]) {
99
+ return FRAMEWORKS.find((f) => f.id === "sveltekit");
100
+ }
101
+ if (deps["nuxt"]) {
102
+ return FRAMEWORKS.find((f) => f.id === "nuxt");
103
+ }
104
+ if (deps["express"]) {
105
+ return FRAMEWORKS.find((f) => f.id === "express");
106
+ }
107
+ if (deps["fastify"]) {
108
+ return FRAMEWORKS.find((f) => f.id === "fastify");
109
+ }
110
+ if (deps["hono"]) {
111
+ return FRAMEWORKS.find((f) => f.id === "hono");
112
+ }
113
+ // Default to generic Node.js
114
+ return FRAMEWORKS.find((f) => f.id === "node");
115
+ }
116
+ catch {
117
+ throw new Error("Could not read package.json");
118
+ }
119
+ }
120
+ async function fileExists(path) {
121
+ try {
122
+ const { stat } = await import("node:fs/promises");
123
+ await stat(path);
124
+ return true;
125
+ }
126
+ catch {
127
+ return false;
128
+ }
129
+ }
130
+ //# sourceMappingURL=detect-framework.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detect-framework.js","sourceRoot":"","sources":["../../src/utils/detect-framework.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export type PackageManager = "npm" | "yarn" | "pnpm" | "bun";
2
+ export declare function detectPackageManager(cwd: string): Promise<PackageManager>;
3
+ export declare function getInstallCommand(manager: PackageManager, pkg: string): string;
4
+ //# sourceMappingURL=detect-package-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detect-package-manager.d.ts","sourceRoot":"","sources":["../../src/utils/detect-package-manager.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,cAAc,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,CAAC;AAE7D,wBAAsB,oBAAoB,CACxC,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,cAAc,CAAC,CAoBzB;AAED,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,cAAc,EACvB,GAAG,EAAE,MAAM,GACV,MAAM,CAWR"}
@@ -0,0 +1,35 @@
1
+ import { access } from "node:fs/promises";
2
+ import { join } from "node:path";
3
+ export async function detectPackageManager(cwd) {
4
+ // Check for lock files in order of preference
5
+ const lockFiles = [
6
+ { file: "bun.lockb", manager: "bun" },
7
+ { file: "pnpm-lock.yaml", manager: "pnpm" },
8
+ { file: "yarn.lock", manager: "yarn" },
9
+ { file: "package-lock.json", manager: "npm" },
10
+ ];
11
+ for (const { file, manager } of lockFiles) {
12
+ try {
13
+ await access(join(cwd, file));
14
+ return manager;
15
+ }
16
+ catch {
17
+ // File doesn't exist, continue checking
18
+ }
19
+ }
20
+ // Default to npm if no lock file found
21
+ return "npm";
22
+ }
23
+ export function getInstallCommand(manager, pkg) {
24
+ switch (manager) {
25
+ case "npm":
26
+ return `npm install ${pkg}`;
27
+ case "yarn":
28
+ return `yarn add ${pkg}`;
29
+ case "pnpm":
30
+ return `pnpm add ${pkg}`;
31
+ case "bun":
32
+ return `bun add ${pkg}`;
33
+ }
34
+ }
35
+ //# sourceMappingURL=detect-package-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detect-package-manager.js","sourceRoot":"","sources":["../../src/utils/detect-package-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAIjC,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,GAAW;IAEX,8CAA8C;IAC9C,MAAM,SAAS,GAAgD;QAC7D,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,KAAK,EAAE;QACrC,EAAE,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,EAAE;QAC3C,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,EAAE;QACtC,EAAE,IAAI,EAAE,mBAAmB,EAAE,OAAO,EAAE,KAAK,EAAE;KAC9C,CAAC;IAEF,KAAK,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,SAAS,EAAE,CAAC;QAC1C,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC;YAC9B,OAAO,OAAO,CAAC;QACjB,CAAC;QAAC,MAAM,CAAC;YACP,wCAAwC;QAC1C,CAAC;IACH,CAAC;IAED,uCAAuC;IACvC,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,OAAuB,EACvB,GAAW;IAEX,QAAQ,OAAO,EAAE,CAAC;QAChB,KAAK,KAAK;YACR,OAAO,eAAe,GAAG,EAAE,CAAC;QAC9B,KAAK,MAAM;YACT,OAAO,YAAY,GAAG,EAAE,CAAC;QAC3B,KAAK,MAAM;YACT,OAAO,YAAY,GAAG,EAAE,CAAC;QAC3B,KAAK,KAAK;YACR,OAAO,WAAW,GAAG,EAAE,CAAC;IAC5B,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function updateEnvFile(cwd: string, envFileName: string, token: string): Promise<void>;
2
+ //# sourceMappingURL=env.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../src/utils/env.ts"],"names":[],"mappings":"AAGA,wBAAsB,aAAa,CACjC,GAAG,EAAE,MAAM,EACX,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,IAAI,CAAC,CAmCf"}
@@ -0,0 +1,54 @@
1
+ import { access, readFile, writeFile } from "node:fs/promises";
2
+ import { join } from "node:path";
3
+ export async function updateEnvFile(cwd, envFileName, token) {
4
+ const envPath = join(cwd, envFileName);
5
+ const envVar = "LOGGY_TOKEN";
6
+ const newLine = `${envVar}=${token}`;
7
+ let content = "";
8
+ try {
9
+ await access(envPath);
10
+ content = await readFile(envPath, "utf-8");
11
+ }
12
+ catch {
13
+ // File doesn't exist, will create it
14
+ }
15
+ // Check if LOGGY_TOKEN already exists
16
+ const lines = content.split("\n");
17
+ const existingIndex = lines.findIndex((line) => line.startsWith(`${envVar}=`));
18
+ if (existingIndex !== -1) {
19
+ // Replace existing line
20
+ lines[existingIndex] = newLine;
21
+ }
22
+ else {
23
+ // Add new line at the end
24
+ if (content && !content.endsWith("\n")) {
25
+ lines.push("");
26
+ }
27
+ lines.push(newLine);
28
+ }
29
+ // Update .gitignore to include env file
30
+ await updateGitignore(cwd, envFileName);
31
+ await writeFile(envPath, lines.join("\n"));
32
+ }
33
+ async function updateGitignore(cwd, envFileName) {
34
+ const gitignorePath = join(cwd, ".gitignore");
35
+ let content = "";
36
+ try {
37
+ await access(gitignorePath);
38
+ content = await readFile(gitignorePath, "utf-8");
39
+ }
40
+ catch {
41
+ // No .gitignore, create one
42
+ }
43
+ // Check if env file is already in gitignore
44
+ const lines = content.split("\n");
45
+ const hasEnvFile = lines.some((line) => line.trim() === envFileName || line.trim() === `/${envFileName}`);
46
+ if (!hasEnvFile) {
47
+ if (content && !content.endsWith("\n")) {
48
+ content += "\n";
49
+ }
50
+ content += `\n# Loggy\n${envFileName}\n`;
51
+ await writeFile(gitignorePath, content);
52
+ }
53
+ }
54
+ //# sourceMappingURL=env.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.js","sourceRoot":"","sources":["../../src/utils/env.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC/D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,GAAW,EACX,WAAmB,EACnB,KAAa;IAEb,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;IACvC,MAAM,MAAM,GAAG,aAAa,CAAC;IAC7B,MAAM,OAAO,GAAG,GAAG,MAAM,IAAI,KAAK,EAAE,CAAC;IAErC,IAAI,OAAO,GAAG,EAAE,CAAC;IAEjB,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC;QACtB,OAAO,GAAG,MAAM,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAC7C,CAAC;IAAC,MAAM,CAAC;QACP,qCAAqC;IACvC,CAAC;IAED,sCAAsC;IACtC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAClC,MAAM,aAAa,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE,CAC7C,IAAI,CAAC,UAAU,CAAC,GAAG,MAAM,GAAG,CAAC,CAC9B,CAAC;IAEF,IAAI,aAAa,KAAK,CAAC,CAAC,EAAE,CAAC;QACzB,wBAAwB;QACxB,KAAK,CAAC,aAAa,CAAC,GAAG,OAAO,CAAC;IACjC,CAAC;SAAM,CAAC;QACN,0BAA0B;QAC1B,IAAI,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YACvC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjB,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACtB,CAAC;IAED,wCAAwC;IACxC,MAAM,eAAe,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;IAExC,MAAM,SAAS,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AAC7C,CAAC;AAED,KAAK,UAAU,eAAe,CAC5B,GAAW,EACX,WAAmB;IAEnB,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;IAE9C,IAAI,OAAO,GAAG,EAAE,CAAC;IACjB,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;QAC5B,OAAO,GAAG,MAAM,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;IACnD,CAAC;IAAC,MAAM,CAAC;QACP,4BAA4B;IAC9B,CAAC;IAED,4CAA4C;IAC5C,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAClC,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAC3B,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,WAAW,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,IAAI,WAAW,EAAE,CAC3E,CAAC;IAEF,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,IAAI,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YACvC,OAAO,IAAI,IAAI,CAAC;QAClB,CAAC;QACD,OAAO,IAAI,cAAc,WAAW,IAAI,CAAC;QACzC,MAAM,SAAS,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;IAC1C,CAAC;AACH,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { Framework } from "./detect-framework.js";
2
+ export interface GeneratedFile {
3
+ path: string;
4
+ action: "created" | "updated";
5
+ }
6
+ export declare function generateFiles(cwd: string, framework: Framework, token: string): Promise<GeneratedFile[]>;
7
+ export declare const FRAMEWORK_TEMPLATES: Record<string, string>;
8
+ //# sourceMappingURL=generate-files.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate-files.d.ts","sourceRoot":"","sources":["../../src/utils/generate-files.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAEvD,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,SAAS,GAAG,SAAS,CAAC;CAC/B;AAED,wBAAsB,aAAa,CACjC,GAAG,EAAE,MAAM,EACX,SAAS,EAAE,SAAS,EACpB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,aAAa,EAAE,CAAC,CAc1B;AA0ED,eAAO,MAAM,mBAAmB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAoDtD,CAAC"}
@@ -0,0 +1,130 @@
1
+ import { access, mkdir, writeFile } from "node:fs/promises";
2
+ import { dirname, join } from "node:path";
3
+ export async function generateFiles(cwd, framework, token) {
4
+ const files = [];
5
+ // Generate the loggy utility file
6
+ const libFile = await generateLoggyLib(cwd, framework);
7
+ files.push(libFile);
8
+ // Framework-specific config updates
9
+ if (framework.id === "nextjs") {
10
+ const configFile = await updateNextConfig(cwd);
11
+ if (configFile)
12
+ files.push(configFile);
13
+ }
14
+ return files;
15
+ }
16
+ async function generateLoggyLib(cwd, framework) {
17
+ const filePath = join(cwd, framework.libPath);
18
+ const dir = dirname(filePath);
19
+ // Ensure directory exists
20
+ await mkdir(dir, { recursive: true });
21
+ const content = getLoggyLibContent(framework);
22
+ await writeFile(filePath, content);
23
+ return { path: framework.libPath, action: "created" };
24
+ }
25
+ function getLoggyLibContent(framework) {
26
+ const envVar = "LOGGY_TOKEN";
27
+ // TypeScript content for the loggy utility
28
+ return `import { CreateLoggy, CreateMetrics, CreateTracer, createTracingMiddleware } from "@loggydev/loggy-node";
29
+
30
+ // Initialize Loggy with your project token
31
+ export const loggy = CreateLoggy({
32
+ identifier: "${framework.id}",
33
+ remote: {
34
+ token: process.env.${envVar} || "",
35
+ },
36
+ });
37
+
38
+ // Optional: Initialize metrics tracking (Pro/Team)
39
+ export const metrics = CreateMetrics({
40
+ token: process.env.${envVar} || "",
41
+ });
42
+
43
+ // Optional: Initialize distributed tracing (Pro/Team)
44
+ export const tracer = CreateTracer({
45
+ serviceName: "${framework.id}",
46
+ remote: {
47
+ token: process.env.${envVar} || "",
48
+ },
49
+ });
50
+
51
+ // Export middleware for Express/Hono/etc.
52
+ export { createTracingMiddleware };
53
+
54
+ // Log that Loggy is initialized
55
+ loggy.info("Loggy initialized! 🎉");
56
+ `;
57
+ }
58
+ async function updateNextConfig(cwd) {
59
+ // Check for various Next.js config file formats
60
+ const configFiles = ["next.config.js", "next.config.mjs", "next.config.ts"];
61
+ for (const configFile of configFiles) {
62
+ const configPath = join(cwd, configFile);
63
+ try {
64
+ await access(configPath);
65
+ // Config exists, we could update it here if needed
66
+ // For now, we'll skip modifying the Next.js config
67
+ // as the SDK doesn't require any special config
68
+ return null;
69
+ }
70
+ catch {
71
+ // File doesn't exist, continue checking
72
+ }
73
+ }
74
+ return null;
75
+ }
76
+ // Framework-specific templates for different use cases
77
+ export const FRAMEWORK_TEMPLATES = {
78
+ nextjs: `// Example usage in a Next.js API route or Server Component
79
+ import { loggy } from "@/lib/loggy";
80
+
81
+ export async function GET() {
82
+ loggy.info("API route called", { route: "/api/example" });
83
+ return Response.json({ message: "Hello from Loggy!" });
84
+ }
85
+ `,
86
+ astro: `---
87
+ // Example usage in an Astro component
88
+ import { loggy } from "@/lib/loggy";
89
+
90
+ loggy.info("Page rendered", { page: Astro.url.pathname });
91
+ ---
92
+
93
+ <html>
94
+ <body>
95
+ <h1>Hello from Loggy!</h1>
96
+ </body>
97
+ </html>
98
+ `,
99
+ express: `// Example usage in an Express app
100
+ import express from "express";
101
+ import { loggy, createTracingMiddleware, tracer } from "./lib/loggy";
102
+
103
+ const app = express();
104
+
105
+ // Add tracing middleware
106
+ app.use(createTracingMiddleware({ tracer }));
107
+
108
+ app.get("/", (req, res) => {
109
+ loggy.info("Request received", { path: req.path });
110
+ res.send("Hello from Loggy!");
111
+ });
112
+
113
+ app.listen(3000, () => {
114
+ loggy.info("Server started", { port: 3000 });
115
+ });
116
+ `,
117
+ node: `// Example usage in a Node.js script
118
+ import { loggy } from "./lib/loggy";
119
+
120
+ loggy.info("Application started");
121
+
122
+ // Your code here...
123
+
124
+ loggy.info("Application finished");
125
+
126
+ // Flush logs before exit
127
+ await loggy.flush();
128
+ `,
129
+ };
130
+ //# sourceMappingURL=generate-files.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate-files.js","sourceRoot":"","sources":["../../src/utils/generate-files.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAQ1C,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,GAAW,EACX,SAAoB,EACpB,KAAa;IAEb,MAAM,KAAK,GAAoB,EAAE,CAAC;IAElC,kCAAkC;IAClC,MAAM,OAAO,GAAG,MAAM,gBAAgB,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;IACvD,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAEpB,oCAAoC;IACpC,IAAI,SAAS,CAAC,EAAE,KAAK,QAAQ,EAAE,CAAC;QAC9B,MAAM,UAAU,GAAG,MAAM,gBAAgB,CAAC,GAAG,CAAC,CAAC;QAC/C,IAAI,UAAU;YAAE,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACzC,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,KAAK,UAAU,gBAAgB,CAC7B,GAAW,EACX,SAAoB;IAEpB,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC;IAC9C,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IAE9B,0BAA0B;IAC1B,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAEtC,MAAM,OAAO,GAAG,kBAAkB,CAAC,SAAS,CAAC,CAAC;IAC9C,MAAM,SAAS,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAEnC,OAAO,EAAE,IAAI,EAAE,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;AACxD,CAAC;AAED,SAAS,kBAAkB,CAAC,SAAoB;IAC9C,MAAM,MAAM,GAAG,aAAa,CAAC;IAE7B,2CAA2C;IAC3C,OAAO;;;;iBAIQ,SAAS,CAAC,EAAE;;yBAEJ,MAAM;;;;;;uBAMR,MAAM;;;;;kBAKX,SAAS,CAAC,EAAE;;yBAEL,MAAM;;;;;;;;;CAS9B,CAAC;AACF,CAAC;AAED,KAAK,UAAU,gBAAgB,CAAC,GAAW;IACzC,gDAAgD;IAChD,MAAM,WAAW,GAAG,CAAC,gBAAgB,EAAE,iBAAiB,EAAE,gBAAgB,CAAC,CAAC;IAE5E,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;QACrC,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;QACzC,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,UAAU,CAAC,CAAC;YACzB,mDAAmD;YACnD,mDAAmD;YACnD,gDAAgD;YAChD,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,wCAAwC;QAC1C,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,uDAAuD;AACvD,MAAM,CAAC,MAAM,mBAAmB,GAA2B;IACzD,MAAM,EAAE;;;;;;;CAOT;IACC,KAAK,EAAE;;;;;;;;;;;;CAYR;IACC,OAAO,EAAE;;;;;;;;;;;;;;;;;CAiBV;IACC,IAAI,EAAE;;;;;;;;;;;CAWP;CACA,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { PackageManager } from "./detect-package-manager.js";
2
+ export declare function installSdk(packageManager: PackageManager, cwd: string): Promise<void>;
3
+ //# sourceMappingURL=install.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../src/utils/install.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAElE,wBAAsB,UAAU,CAC9B,cAAc,EAAE,cAAc,EAC9B,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,IAAI,CAAC,CAqCf"}
@@ -0,0 +1,34 @@
1
+ import { spawn } from "node:child_process";
2
+ export async function installSdk(packageManager, cwd) {
3
+ const pkg = "@loggydev/loggy-node";
4
+ const commands = {
5
+ npm: { cmd: "npm", args: ["install", pkg] },
6
+ yarn: { cmd: "yarn", args: ["add", pkg] },
7
+ pnpm: { cmd: "pnpm", args: ["add", pkg] },
8
+ bun: { cmd: "bun", args: ["add", pkg] },
9
+ };
10
+ const { cmd, args } = commands[packageManager];
11
+ return new Promise((resolve, reject) => {
12
+ const child = spawn(cmd, args, {
13
+ cwd,
14
+ stdio: "pipe",
15
+ shell: false,
16
+ });
17
+ let stderr = "";
18
+ child.stderr?.on("data", (data) => {
19
+ stderr += data.toString();
20
+ });
21
+ child.on("close", (code) => {
22
+ if (code === 0) {
23
+ resolve();
24
+ }
25
+ else {
26
+ reject(new Error(`Installation failed: ${stderr}`));
27
+ }
28
+ });
29
+ child.on("error", (err) => {
30
+ reject(err);
31
+ });
32
+ });
33
+ }
34
+ //# sourceMappingURL=install.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/utils/install.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAG3C,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,cAA8B,EAC9B,GAAW;IAEX,MAAM,GAAG,GAAG,sBAAsB,CAAC;IAEnC,MAAM,QAAQ,GAA4D;QACxE,GAAG,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,SAAS,EAAE,GAAG,CAAC,EAAE;QAC3C,IAAI,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE;QACzC,IAAI,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE;QACzC,GAAG,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE;KACxC,CAAC;IAEF,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,QAAQ,CAAC,cAAc,CAAC,CAAC;IAE/C,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE;YAC7B,GAAG;YACH,KAAK,EAAE,MAAM;YACb,KAAK,EAAE,KAAK;SACb,CAAC,CAAC;QAEH,IAAI,MAAM,GAAG,EAAE,CAAC;QAEhB,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;YAChC,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC5B,CAAC,CAAC,CAAC;QAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;YACzB,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;gBACf,OAAO,EAAE,CAAC;YACZ,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,IAAI,KAAK,CAAC,wBAAwB,MAAM,EAAE,CAAC,CAAC,CAAC;YACtD,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YACxB,MAAM,CAAC,GAAG,CAAC,CAAC;QACd,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function getProjectName(cwd: string): Promise<string>;
2
+ //# sourceMappingURL=project-name.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-name.d.ts","sourceRoot":"","sources":["../../src/utils/project-name.ts"],"names":[],"mappings":"AAGA,wBAAsB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAiBjE"}
@@ -0,0 +1,20 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import { basename, join } from "node:path";
3
+ export async function getProjectName(cwd) {
4
+ try {
5
+ const packageJsonPath = join(cwd, "package.json");
6
+ const content = await readFile(packageJsonPath, "utf-8");
7
+ const packageJson = JSON.parse(content);
8
+ if (packageJson.name && packageJson.name !== "undefined") {
9
+ // Clean up scoped package names (e.g., @org/package -> package)
10
+ const name = packageJson.name.replace(/^@[^/]+\//, "");
11
+ return name;
12
+ }
13
+ }
14
+ catch {
15
+ // Fall back to directory name
16
+ }
17
+ // Use directory name as fallback
18
+ return basename(cwd);
19
+ }
20
+ //# sourceMappingURL=project-name.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-name.js","sourceRoot":"","sources":["../../src/utils/project-name.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAE3C,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,GAAW;IAC9C,IAAI,CAAC;QACH,MAAM,eAAe,GAAG,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;QAClD,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC;QACzD,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAExC,IAAI,WAAW,CAAC,IAAI,IAAI,WAAW,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;YACzD,gEAAgE;YAChE,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;YACvD,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,8BAA8B;IAChC,CAAC;IAED,iCAAiC;IACjC,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC;AACvB,CAAC"}
@@ -0,0 +1,39 @@
1
+ export declare const ui: {
2
+ gradient: (text: string) => string;
3
+ coral: (text: string) => string;
4
+ navy: (text: string) => string;
5
+ dim: (text: string) => string;
6
+ success: (text: string) => string;
7
+ error: (text: string) => string;
8
+ warn: (text: string) => string;
9
+ info: (text: string) => string;
10
+ bold: (text: string) => string;
11
+ symbols: {
12
+ check: string;
13
+ cross: string;
14
+ arrow: string;
15
+ bullet: string;
16
+ star: string;
17
+ rocket: string;
18
+ fire: string;
19
+ sparkles: string;
20
+ package: string;
21
+ link: string;
22
+ key: string;
23
+ folder: string;
24
+ check_mark: string;
25
+ };
26
+ banner: () => void;
27
+ welcome: () => void;
28
+ section: (title: string) => void;
29
+ line: (text: string, indent?: number) => void;
30
+ keyValue: (key: string, value: string, indent?: number) => void;
31
+ successBox: (title: string, lines: string[]) => void;
32
+ infoBox: (title: string, lines: string[]) => void;
33
+ code: (text: string, indent?: number) => void;
34
+ divider: () => void;
35
+ step: (current: number, total: number, text: string) => void;
36
+ detected: (icon: string, label: string, value: string) => void;
37
+ };
38
+ export default ui;
39
+ //# sourceMappingURL=ui.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui.d.ts","sourceRoot":"","sources":["../../src/utils/ui.ts"],"names":[],"mappings":"AAQA,eAAO,MAAM,EAAE;qBAEI,MAAM;kBAGT,MAAM;iBAGP,MAAM;gBAGP,MAAM;oBAGF,MAAM;kBAGR,MAAM;iBAGP,MAAM;iBAGN,MAAM;iBAGN,MAAM;;;;;;;;;;;;;;;;;;qBAiDF,MAAM;iBAOV,MAAM;oBAKH,MAAM,SAAS,MAAM;wBAOjB,MAAM,SAAS,MAAM,EAAE;qBAgB1B,MAAM,SAAS,MAAM,EAAE;iBAgB3B,MAAM;;oBAYH,MAAM,SAAS,MAAM,QAAQ,MAAM;qBAMlC,MAAM,SAAS,MAAM,SAAS,MAAM;CAKtD,CAAC;AAEF,eAAe,EAAE,CAAC"}
@@ -0,0 +1,121 @@
1
+ import boxen from "boxen";
2
+ import chalk from "chalk";
3
+ import gradient from "gradient-string";
4
+ // Loggy brand colors: coral (#f97316), navy (#1e3a5f), cream (#faf7f2)
5
+ const loggyGradient = gradient(["#f97316", "#fb923c", "#fdba74"]);
6
+ const coralGradient = gradient(["#f97316", "#ea580c"]);
7
+ export const ui = {
8
+ // Brand gradient for headers
9
+ gradient: (text) => loggyGradient(text),
10
+ // Coral accent color
11
+ coral: (text) => chalk.hex("#f97316")(text),
12
+ // Navy color
13
+ navy: (text) => chalk.hex("#1e3a5f")(text),
14
+ // Dim text
15
+ dim: (text) => chalk.gray(text),
16
+ // Success green
17
+ success: (text) => chalk.hex("#22c55e")(text),
18
+ // Error red
19
+ error: (text) => chalk.hex("#ef4444")(text),
20
+ // Warning yellow
21
+ warn: (text) => chalk.hex("#eab308")(text),
22
+ // Info blue
23
+ info: (text) => chalk.hex("#3b82f6")(text),
24
+ // Bold white
25
+ bold: (text) => chalk.bold.white(text),
26
+ // Symbols
27
+ symbols: {
28
+ check: chalk.hex("#22c55e")("✔"),
29
+ cross: chalk.hex("#ef4444")("✖"),
30
+ arrow: chalk.hex("#f97316")("→"),
31
+ bullet: chalk.hex("#f97316")("●"),
32
+ star: chalk.hex("#f97316")("★"),
33
+ rocket: "🚀",
34
+ fire: "🔥",
35
+ sparkles: "✨",
36
+ package: "📦",
37
+ link: "🔗",
38
+ key: "🔑",
39
+ folder: "📁",
40
+ check_mark: "✅",
41
+ },
42
+ // Welcome banner
43
+ banner: () => {
44
+ const title = loggyGradient.multiline([
45
+ " _ ",
46
+ " | | ___ __ _ __ _ _ _ ",
47
+ " | | / _ \\ / _` |/ _` | | | |",
48
+ " | |__| (_) | (_| | (_| | |_| |",
49
+ " |_____\\___/ \\__, |\\__, |\\__, |",
50
+ " |___/ |___/ |___/ ",
51
+ ].join("\n"));
52
+ console.log();
53
+ console.log(title);
54
+ console.log();
55
+ },
56
+ // Simple welcome header
57
+ welcome: () => {
58
+ console.log();
59
+ console.log(` ${loggyGradient("🚀 Loggy")} ${chalk.dim("—")} ${chalk.white("Developer-first logging")}`);
60
+ console.log(chalk.dim(" Let's get your project set up in under 60 seconds.\n"));
61
+ },
62
+ // Section header
63
+ section: (title) => {
64
+ console.log();
65
+ console.log(` ${chalk.hex("#f97316").bold(title)}`);
66
+ console.log();
67
+ },
68
+ // Indented line
69
+ line: (text, indent = 3) => {
70
+ console.log(`${" ".repeat(indent)}${text}`);
71
+ },
72
+ // Key-value pair
73
+ keyValue: (key, value, indent = 3) => {
74
+ console.log(`${" ".repeat(indent)}${chalk.dim(key + ":")} ${chalk.white(value)}`);
75
+ },
76
+ // Success box for completion
77
+ successBox: (title, lines) => {
78
+ const content = lines.join("\n");
79
+ console.log();
80
+ console.log(boxen(content, {
81
+ padding: 1,
82
+ margin: { left: 2, right: 0, top: 0, bottom: 0 },
83
+ borderStyle: "round",
84
+ borderColor: "#22c55e",
85
+ title: ` ${chalk.hex("#22c55e").bold(title)} `,
86
+ titleAlignment: "left",
87
+ }));
88
+ },
89
+ // Info box
90
+ infoBox: (title, lines) => {
91
+ const content = lines.join("\n");
92
+ console.log();
93
+ console.log(boxen(content, {
94
+ padding: 1,
95
+ margin: { left: 2, right: 0, top: 0, bottom: 0 },
96
+ borderStyle: "round",
97
+ borderColor: "#f97316",
98
+ title: ` ${chalk.hex("#f97316").bold(title)} `,
99
+ titleAlignment: "left",
100
+ }));
101
+ },
102
+ // Code block
103
+ code: (text, indent = 3) => {
104
+ console.log(`${" ".repeat(indent)}${chalk.bgHex("#1e293b").hex("#e2e8f0")(` ${text} `)}`);
105
+ },
106
+ // Divider
107
+ divider: () => {
108
+ console.log(chalk.dim(" " + "─".repeat(50)));
109
+ },
110
+ // Step indicator
111
+ step: (current, total, text) => {
112
+ const progress = chalk.dim(`[${current}/${total}]`);
113
+ console.log(` ${progress} ${chalk.white(text)}`);
114
+ },
115
+ // Detected item with icon
116
+ detected: (icon, label, value) => {
117
+ console.log(` ${icon} ${chalk.dim(label)} ${chalk.hex("#f97316").bold(value)}`);
118
+ },
119
+ };
120
+ export default ui;
121
+ //# sourceMappingURL=ui.js.map