@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.
- package/README.md +133 -0
- package/dist/commands/init.d.ts +8 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +186 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +17 -0
- package/dist/index.js.map +1 -0
- package/dist/utils/api.d.ts +11 -0
- package/dist/utils/api.d.ts.map +1 -0
- package/dist/utils/api.js +37 -0
- package/dist/utils/api.js.map +1 -0
- package/dist/utils/auth.d.ts +7 -0
- package/dist/utils/auth.d.ts.map +1 -0
- package/dist/utils/auth.js +120 -0
- package/dist/utils/auth.js.map +1 -0
- package/dist/utils/detect-framework.d.ts +10 -0
- package/dist/utils/detect-framework.d.ts.map +1 -0
- package/dist/utils/detect-framework.js +130 -0
- package/dist/utils/detect-framework.js.map +1 -0
- package/dist/utils/detect-package-manager.d.ts +4 -0
- package/dist/utils/detect-package-manager.d.ts.map +1 -0
- package/dist/utils/detect-package-manager.js +35 -0
- package/dist/utils/detect-package-manager.js.map +1 -0
- package/dist/utils/env.d.ts +2 -0
- package/dist/utils/env.d.ts.map +1 -0
- package/dist/utils/env.js +54 -0
- package/dist/utils/env.js.map +1 -0
- package/dist/utils/generate-files.d.ts +8 -0
- package/dist/utils/generate-files.d.ts.map +1 -0
- package/dist/utils/generate-files.js +130 -0
- package/dist/utils/generate-files.js.map +1 -0
- package/dist/utils/install.d.ts +3 -0
- package/dist/utils/install.d.ts.map +1 -0
- package/dist/utils/install.js +34 -0
- package/dist/utils/install.js.map +1 -0
- package/dist/utils/project-name.d.ts +2 -0
- package/dist/utils/project-name.d.ts.map +1 -0
- package/dist/utils/project-name.js +20 -0
- package/dist/utils/project-name.js.map +1 -0
- package/dist/utils/ui.d.ts +39 -0
- package/dist/utils/ui.d.ts.map +1 -0
- package/dist/utils/ui.js +121 -0
- package/dist/utils/ui.js.map +1 -0
- 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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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"}
|
package/dist/utils/ui.js
ADDED
|
@@ -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
|