smartreadme 1.0.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 +270 -0
- package/dist/bin/cli.d.ts +3 -0
- package/dist/bin/cli.d.ts.map +1 -0
- package/dist/bin/cli.js +122 -0
- package/dist/bin/cli.js.map +1 -0
- package/dist/src/generator.d.ts +6 -0
- package/dist/src/generator.d.ts.map +1 -0
- package/dist/src/generator.js +296 -0
- package/dist/src/generator.js.map +1 -0
- package/dist/src/index.d.ts +26 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +55 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/scanner.d.ts +39 -0
- package/dist/src/scanner.d.ts.map +1 -0
- package/dist/src/scanner.js +271 -0
- package/dist/src/scanner.js.map +1 -0
- package/dist/src/types.d.ts +69 -0
- package/dist/src/types.d.ts.map +1 -0
- package/dist/src/types.js +3 -0
- package/dist/src/types.js.map +1 -0
- package/dist/test/test.d.ts +2 -0
- package/dist/test/test.d.ts.map +1 -0
- package/dist/test/test.js +138 -0
- package/dist/test/test.js.map +1 -0
- package/package.json +50 -0
|
@@ -0,0 +1,271 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.readPackageJson = readPackageJson;
|
|
7
|
+
exports.detectStack = detectStack;
|
|
8
|
+
exports.generateExampleValue = generateExampleValue;
|
|
9
|
+
exports.scanEnvFile = scanEnvFile;
|
|
10
|
+
exports.detectProjectType = detectProjectType;
|
|
11
|
+
exports.extractScripts = extractScripts;
|
|
12
|
+
exports.detectConfigs = detectConfigs;
|
|
13
|
+
exports.resolveRepository = resolveRepository;
|
|
14
|
+
exports.scanProject = scanProject;
|
|
15
|
+
const fs_1 = __importDefault(require("fs"));
|
|
16
|
+
const path_1 = __importDefault(require("path"));
|
|
17
|
+
/**
|
|
18
|
+
* Reads and parses package.json from the target project root.
|
|
19
|
+
*/
|
|
20
|
+
function readPackageJson(projectRoot) {
|
|
21
|
+
const pkgPath = path_1.default.join(projectRoot, "package.json");
|
|
22
|
+
if (!fs_1.default.existsSync(pkgPath))
|
|
23
|
+
return null;
|
|
24
|
+
try {
|
|
25
|
+
return JSON.parse(fs_1.default.readFileSync(pkgPath, "utf-8"));
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
const STACK_MAP = {
|
|
32
|
+
React: ["react"],
|
|
33
|
+
Vue: ["vue"],
|
|
34
|
+
Angular: ["@angular/core"],
|
|
35
|
+
"Next.js": ["next"],
|
|
36
|
+
"Nuxt.js": ["nuxt"],
|
|
37
|
+
Svelte: ["svelte"],
|
|
38
|
+
Express: ["express"],
|
|
39
|
+
Fastify: ["fastify"],
|
|
40
|
+
Koa: ["koa"],
|
|
41
|
+
NestJS: ["@nestjs/core"],
|
|
42
|
+
TypeScript: ["typescript"],
|
|
43
|
+
Tailwind: ["tailwindcss"],
|
|
44
|
+
Prisma: ["prisma", "@prisma/client"],
|
|
45
|
+
MongoDB: ["mongoose", "mongodb"],
|
|
46
|
+
PostgreSQL: ["pg", "postgres"],
|
|
47
|
+
MySQL: ["mysql", "mysql2"],
|
|
48
|
+
Redis: ["redis", "ioredis"],
|
|
49
|
+
GraphQL: ["graphql", "apollo-server"],
|
|
50
|
+
Jest: ["jest"],
|
|
51
|
+
Vitest: ["vitest"],
|
|
52
|
+
Vite: ["vite"],
|
|
53
|
+
Webpack: ["webpack"],
|
|
54
|
+
Electron: ["electron"],
|
|
55
|
+
"Socket.io": ["socket.io"],
|
|
56
|
+
Stripe: ["stripe"],
|
|
57
|
+
JWT: ["jsonwebtoken"],
|
|
58
|
+
Zod: ["zod"],
|
|
59
|
+
"React Query": ["@tanstack/react-query"],
|
|
60
|
+
Zustand: ["zustand"],
|
|
61
|
+
Redux: ["redux", "@reduxjs/toolkit"],
|
|
62
|
+
Drizzle: ["drizzle-orm"],
|
|
63
|
+
tRPC: ["@trpc/server"],
|
|
64
|
+
Hono: ["hono"],
|
|
65
|
+
};
|
|
66
|
+
/**
|
|
67
|
+
* Detects the tech stack / frameworks used based on package.json dependencies.
|
|
68
|
+
*/
|
|
69
|
+
function detectStack(pkg) {
|
|
70
|
+
var _a, _b;
|
|
71
|
+
if (!pkg)
|
|
72
|
+
return [];
|
|
73
|
+
const allDeps = {
|
|
74
|
+
...((_a = pkg.dependencies) !== null && _a !== void 0 ? _a : {}),
|
|
75
|
+
...((_b = pkg.devDependencies) !== null && _b !== void 0 ? _b : {}),
|
|
76
|
+
};
|
|
77
|
+
return Object.entries(STACK_MAP)
|
|
78
|
+
.filter(([, packages]) => packages.some((p) => p in allDeps))
|
|
79
|
+
.map(([name]) => name);
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Generate a safe example value based on the env key name.
|
|
83
|
+
*/
|
|
84
|
+
function generateExampleValue(key) {
|
|
85
|
+
const lower = key.toLowerCase();
|
|
86
|
+
if (lower.includes("secret") ||
|
|
87
|
+
lower.includes("password") ||
|
|
88
|
+
lower.includes("pass")) {
|
|
89
|
+
return "your_secret_here";
|
|
90
|
+
}
|
|
91
|
+
if ((lower.includes("api") || lower.includes("private")) &&
|
|
92
|
+
lower.includes("key")) {
|
|
93
|
+
return "your_api_key_here";
|
|
94
|
+
}
|
|
95
|
+
if (lower.includes("token"))
|
|
96
|
+
return "your_token_here";
|
|
97
|
+
if (lower.includes("url") || lower.includes("uri")) {
|
|
98
|
+
if (lower.includes("database") ||
|
|
99
|
+
lower.includes("db") ||
|
|
100
|
+
lower.includes("mongo")) {
|
|
101
|
+
return "mongodb://localhost:27017/your_db";
|
|
102
|
+
}
|
|
103
|
+
if (lower.includes("redis"))
|
|
104
|
+
return "redis://localhost:6379";
|
|
105
|
+
if (lower.includes("postgres") || lower.includes("pg")) {
|
|
106
|
+
return "postgresql://user:password@localhost:5432/your_db";
|
|
107
|
+
}
|
|
108
|
+
return "https://your-url-here.com";
|
|
109
|
+
}
|
|
110
|
+
if (lower.includes("host"))
|
|
111
|
+
return "localhost";
|
|
112
|
+
if (lower.includes("port"))
|
|
113
|
+
return "3000";
|
|
114
|
+
if (lower.includes("email") || lower.includes("mail"))
|
|
115
|
+
return "your@email.com";
|
|
116
|
+
if (lower.includes("name"))
|
|
117
|
+
return "your_name_here";
|
|
118
|
+
if (lower.includes("id"))
|
|
119
|
+
return "your_id_here";
|
|
120
|
+
if (lower.includes("debug") ||
|
|
121
|
+
lower.includes("enable") ||
|
|
122
|
+
lower.includes("disable")) {
|
|
123
|
+
return "false";
|
|
124
|
+
}
|
|
125
|
+
if (lower.includes("env") || lower.includes("mode"))
|
|
126
|
+
return "development";
|
|
127
|
+
if (lower.includes("expire") ||
|
|
128
|
+
lower.includes("ttl") ||
|
|
129
|
+
lower.includes("timeout")) {
|
|
130
|
+
return "3600";
|
|
131
|
+
}
|
|
132
|
+
return "your_value_here";
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Scans .env / .env.example and returns safe example env vars.
|
|
136
|
+
*/
|
|
137
|
+
function scanEnvFile(projectRoot) {
|
|
138
|
+
const envFiles = [".env.example", ".env.sample", ".env"];
|
|
139
|
+
for (const envFile of envFiles) {
|
|
140
|
+
const envPath = path_1.default.join(projectRoot, envFile);
|
|
141
|
+
if (!fs_1.default.existsSync(envPath))
|
|
142
|
+
continue;
|
|
143
|
+
const lines = fs_1.default.readFileSync(envPath, "utf-8").split("\n");
|
|
144
|
+
const result = [];
|
|
145
|
+
for (const line of lines) {
|
|
146
|
+
const trimmed = line.trim();
|
|
147
|
+
if (!trimmed || trimmed.startsWith("#")) {
|
|
148
|
+
result.push(line);
|
|
149
|
+
continue;
|
|
150
|
+
}
|
|
151
|
+
const eqIndex = trimmed.indexOf("=");
|
|
152
|
+
if (eqIndex === -1) {
|
|
153
|
+
result.push(line);
|
|
154
|
+
continue;
|
|
155
|
+
}
|
|
156
|
+
const key = trimmed.substring(0, eqIndex).trim();
|
|
157
|
+
result.push(`${key}=${generateExampleValue(key)}`);
|
|
158
|
+
}
|
|
159
|
+
return { found: true, content: result.join("\n"), sourceFile: envFile };
|
|
160
|
+
}
|
|
161
|
+
return { found: false };
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Detect the broad project type from package.json structure.
|
|
165
|
+
* Note: projectRoot param kept for future use (e.g. checking file structure).
|
|
166
|
+
*/
|
|
167
|
+
function detectProjectType(_projectRoot, pkg) {
|
|
168
|
+
var _a, _b, _c;
|
|
169
|
+
if (!pkg)
|
|
170
|
+
return "Node.js Project";
|
|
171
|
+
const deps = {
|
|
172
|
+
...((_a = pkg.dependencies) !== null && _a !== void 0 ? _a : {}),
|
|
173
|
+
...((_b = pkg.devDependencies) !== null && _b !== void 0 ? _b : {}),
|
|
174
|
+
};
|
|
175
|
+
if (pkg.bin)
|
|
176
|
+
return "CLI Tool";
|
|
177
|
+
if (deps["electron"])
|
|
178
|
+
return "Desktop App";
|
|
179
|
+
if (deps["next"] || deps["nuxt"])
|
|
180
|
+
return "Full-Stack Web App";
|
|
181
|
+
if (deps["react"] ||
|
|
182
|
+
deps["vue"] ||
|
|
183
|
+
deps["svelte"] ||
|
|
184
|
+
deps["@angular/core"]) {
|
|
185
|
+
return "Frontend Web App";
|
|
186
|
+
}
|
|
187
|
+
if (Object.keys(deps).some((d) => [
|
|
188
|
+
"express",
|
|
189
|
+
"fastify",
|
|
190
|
+
"koa",
|
|
191
|
+
"hapi",
|
|
192
|
+
"@nestjs/core",
|
|
193
|
+
"hono",
|
|
194
|
+
].includes(d))) {
|
|
195
|
+
return "Backend API";
|
|
196
|
+
}
|
|
197
|
+
if ((_c = pkg.keywords) === null || _c === void 0 ? void 0 : _c.includes("cli"))
|
|
198
|
+
return "CLI Tool";
|
|
199
|
+
if (pkg.main)
|
|
200
|
+
return "Node.js Library";
|
|
201
|
+
return "Node.js Project";
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Extract non-internal scripts from package.json.
|
|
205
|
+
*/
|
|
206
|
+
function extractScripts(pkg) {
|
|
207
|
+
if (!(pkg === null || pkg === void 0 ? void 0 : pkg.scripts))
|
|
208
|
+
return {};
|
|
209
|
+
const ignore = new Set([
|
|
210
|
+
"postinstall",
|
|
211
|
+
"prepare",
|
|
212
|
+
"prepublishOnly",
|
|
213
|
+
"prepack",
|
|
214
|
+
]);
|
|
215
|
+
return Object.fromEntries(Object.entries(pkg.scripts).filter(([name]) => !ignore.has(name)));
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Detect which config files exist in the project root.
|
|
219
|
+
*/
|
|
220
|
+
function detectConfigs(projectRoot) {
|
|
221
|
+
const exists = (...files) => files.some((f) => fs_1.default.existsSync(path_1.default.join(projectRoot, f)));
|
|
222
|
+
return {
|
|
223
|
+
docker: exists("Dockerfile", "docker-compose.yml", "docker-compose.yaml"),
|
|
224
|
+
eslint: exists(".eslintrc", ".eslintrc.js", ".eslintrc.json", ".eslintrc.yml"),
|
|
225
|
+
prettier: exists(".prettierrc", ".prettierrc.js", "prettier.config.js"),
|
|
226
|
+
ci: exists(".github/workflows", ".travis.yml", "circle.yml", ".gitlab-ci.yml"),
|
|
227
|
+
license: exists("LICENSE", "LICENSE.md", "LICENSE.txt"),
|
|
228
|
+
contributing: exists("CONTRIBUTING.md", "CONTRIBUTING"),
|
|
229
|
+
changelog: exists("CHANGELOG.md", "CHANGELOG"),
|
|
230
|
+
};
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* Resolve the repository URL from various package.json repository formats.
|
|
234
|
+
*/
|
|
235
|
+
function resolveRepository(repository) {
|
|
236
|
+
var _a;
|
|
237
|
+
if (!repository)
|
|
238
|
+
return null;
|
|
239
|
+
if (typeof repository === "string")
|
|
240
|
+
return repository;
|
|
241
|
+
return (_a = repository.url) !== null && _a !== void 0 ? _a : null;
|
|
242
|
+
}
|
|
243
|
+
/**
|
|
244
|
+
* Main scanner — aggregates all project information.
|
|
245
|
+
*/
|
|
246
|
+
function scanProject(projectRoot = process.cwd()) {
|
|
247
|
+
var _a, _b, _c, _d, _e, _f, _g;
|
|
248
|
+
const pkg = readPackageJson(projectRoot);
|
|
249
|
+
const stack = detectStack(pkg);
|
|
250
|
+
const envInfo = scanEnvFile(projectRoot);
|
|
251
|
+
const projectType = detectProjectType(projectRoot, pkg);
|
|
252
|
+
const scripts = extractScripts(pkg);
|
|
253
|
+
const configs = detectConfigs(projectRoot);
|
|
254
|
+
return {
|
|
255
|
+
name: (_a = pkg === null || pkg === void 0 ? void 0 : pkg.name) !== null && _a !== void 0 ? _a : path_1.default.basename(projectRoot),
|
|
256
|
+
version: (_b = pkg === null || pkg === void 0 ? void 0 : pkg.version) !== null && _b !== void 0 ? _b : "1.0.0",
|
|
257
|
+
description: (_c = pkg === null || pkg === void 0 ? void 0 : pkg.description) !== null && _c !== void 0 ? _c : null,
|
|
258
|
+
projectType,
|
|
259
|
+
stack,
|
|
260
|
+
scripts,
|
|
261
|
+
envInfo,
|
|
262
|
+
configs,
|
|
263
|
+
pkg,
|
|
264
|
+
author: (_d = pkg === null || pkg === void 0 ? void 0 : pkg.author) !== null && _d !== void 0 ? _d : null,
|
|
265
|
+
license: (_e = pkg === null || pkg === void 0 ? void 0 : pkg.license) !== null && _e !== void 0 ? _e : "MIT",
|
|
266
|
+
repository: resolveRepository(pkg === null || pkg === void 0 ? void 0 : pkg.repository),
|
|
267
|
+
homepage: (_f = pkg === null || pkg === void 0 ? void 0 : pkg.homepage) !== null && _f !== void 0 ? _f : null,
|
|
268
|
+
keywords: (_g = pkg === null || pkg === void 0 ? void 0 : pkg.keywords) !== null && _g !== void 0 ? _g : [],
|
|
269
|
+
};
|
|
270
|
+
}
|
|
271
|
+
//# sourceMappingURL=scanner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scanner.js","sourceRoot":"","sources":["../../src/scanner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
export interface PackageJson {
|
|
2
|
+
name?: string;
|
|
3
|
+
version?: string;
|
|
4
|
+
description?: string;
|
|
5
|
+
main?: string;
|
|
6
|
+
bin?: string | Record<string, string>;
|
|
7
|
+
scripts?: Record<string, string>;
|
|
8
|
+
dependencies?: Record<string, string>;
|
|
9
|
+
devDependencies?: Record<string, string>;
|
|
10
|
+
peerDependencies?: Record<string, string>;
|
|
11
|
+
keywords?: string[];
|
|
12
|
+
author?: string | {
|
|
13
|
+
name: string;
|
|
14
|
+
email?: string;
|
|
15
|
+
url?: string;
|
|
16
|
+
};
|
|
17
|
+
license?: string;
|
|
18
|
+
repository?: string | {
|
|
19
|
+
type: string;
|
|
20
|
+
url: string;
|
|
21
|
+
};
|
|
22
|
+
homepage?: string;
|
|
23
|
+
private?: boolean;
|
|
24
|
+
}
|
|
25
|
+
export interface EnvInfo {
|
|
26
|
+
found: boolean;
|
|
27
|
+
content?: string;
|
|
28
|
+
sourceFile?: string;
|
|
29
|
+
}
|
|
30
|
+
export interface DetectedConfigs {
|
|
31
|
+
docker: boolean;
|
|
32
|
+
eslint: boolean;
|
|
33
|
+
prettier: boolean;
|
|
34
|
+
ci: boolean;
|
|
35
|
+
license: boolean;
|
|
36
|
+
contributing: boolean;
|
|
37
|
+
changelog: boolean;
|
|
38
|
+
}
|
|
39
|
+
export type ProjectType = "CLI Tool" | "Backend API" | "Node.js Library" | "Full-Stack Web App" | "Frontend Web App" | "Desktop App" | "Node.js Project";
|
|
40
|
+
export interface ProjectData {
|
|
41
|
+
name: string;
|
|
42
|
+
version: string;
|
|
43
|
+
description: string | null;
|
|
44
|
+
projectType: ProjectType;
|
|
45
|
+
stack: string[];
|
|
46
|
+
scripts: Record<string, string>;
|
|
47
|
+
envInfo: EnvInfo;
|
|
48
|
+
configs: DetectedConfigs;
|
|
49
|
+
pkg: PackageJson | null;
|
|
50
|
+
author: string | {
|
|
51
|
+
name: string;
|
|
52
|
+
email?: string;
|
|
53
|
+
url?: string;
|
|
54
|
+
} | null;
|
|
55
|
+
license: string;
|
|
56
|
+
repository: string | null;
|
|
57
|
+
homepage: string | null;
|
|
58
|
+
keywords: string[];
|
|
59
|
+
}
|
|
60
|
+
export interface RunOptions {
|
|
61
|
+
output?: string;
|
|
62
|
+
overwrite?: boolean;
|
|
63
|
+
}
|
|
64
|
+
export interface RunResult {
|
|
65
|
+
outPath: string;
|
|
66
|
+
data: ProjectData;
|
|
67
|
+
markdown: string;
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,WAAW;IACxB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzC,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1C,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,GAAG;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACjE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,GAAG;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;IACpD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,OAAO;IACpB,KAAK,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,eAAe;IAC5B,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,EAAE,OAAO,CAAC;IAClB,EAAE,EAAE,OAAO,CAAC;IACZ,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,EAAE,OAAO,CAAC;IACtB,SAAS,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,MAAM,WAAW,GACjB,UAAU,GACV,aAAa,GACb,iBAAiB,GACjB,oBAAoB,GACpB,kBAAkB,GAClB,aAAa,GACb,iBAAiB,CAAC;AAExB,MAAM,WAAW,WAAW;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,WAAW,EAAE,WAAW,CAAC;IACzB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,eAAe,CAAC;IACzB,GAAG,EAAE,WAAW,GAAG,IAAI,CAAC;IACxB,MAAM,EAAE,MAAM,GAAG;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IACvE,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,UAAU;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,SAAS;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,WAAW,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;CACpB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test.d.ts","sourceRoot":"","sources":["../../test/test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const path_1 = __importDefault(require("path"));
|
|
7
|
+
const scanner_1 = require("../src/scanner");
|
|
8
|
+
const generator_1 = require("../src/generator");
|
|
9
|
+
console.log("\n🧪 Running smartreadme TypeScript tests...\n");
|
|
10
|
+
let passed = 0;
|
|
11
|
+
let failed = 0;
|
|
12
|
+
function test(label, fn) {
|
|
13
|
+
try {
|
|
14
|
+
fn();
|
|
15
|
+
console.log(` ✅ ${label}`);
|
|
16
|
+
passed++;
|
|
17
|
+
}
|
|
18
|
+
catch (err) {
|
|
19
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
20
|
+
console.log(` ❌ ${label}`);
|
|
21
|
+
console.log(` ${msg}`);
|
|
22
|
+
failed++;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
function assert(condition, msg) {
|
|
26
|
+
if (!condition)
|
|
27
|
+
throw new Error(msg);
|
|
28
|
+
}
|
|
29
|
+
// ── Scanner tests ─────────────────────────────────────────────────────────────
|
|
30
|
+
const projectRoot = path_1.default.join(__dirname, "..");
|
|
31
|
+
const data = (0, scanner_1.scanProject)(projectRoot);
|
|
32
|
+
test("scanProject returns an object", () => {
|
|
33
|
+
assert(typeof data === "object" && data !== null, "Expected object");
|
|
34
|
+
});
|
|
35
|
+
test("scanProject.name is a non-empty string", () => {
|
|
36
|
+
assert(typeof data.name === "string" && data.name.length > 0, `name="${data.name}"`);
|
|
37
|
+
});
|
|
38
|
+
test("scanProject.version is a semver-like string", () => {
|
|
39
|
+
assert(/^\d+\.\d+\.\d+/.test(data.version), `version="${data.version}"`);
|
|
40
|
+
});
|
|
41
|
+
test("scanProject.projectType is a valid type", () => {
|
|
42
|
+
const validTypes = [
|
|
43
|
+
"CLI Tool",
|
|
44
|
+
"Backend API",
|
|
45
|
+
"Node.js Library",
|
|
46
|
+
"Full-Stack Web App",
|
|
47
|
+
"Frontend Web App",
|
|
48
|
+
"Desktop App",
|
|
49
|
+
"Node.js Project",
|
|
50
|
+
];
|
|
51
|
+
assert(validTypes.includes(data.projectType), `Got: ${data.projectType}`);
|
|
52
|
+
});
|
|
53
|
+
test("scanProject.scripts is a plain object", () => {
|
|
54
|
+
assert(typeof data.scripts === "object" && !Array.isArray(data.scripts), "scripts is not an object");
|
|
55
|
+
});
|
|
56
|
+
test("scanProject.stack is an array", () => {
|
|
57
|
+
assert(Array.isArray(data.stack), "stack is not an array");
|
|
58
|
+
});
|
|
59
|
+
test("scanProject.envInfo has a found boolean", () => {
|
|
60
|
+
assert(typeof data.envInfo.found === "boolean", "envInfo.found not boolean");
|
|
61
|
+
});
|
|
62
|
+
test("scanProject.configs has all expected keys", () => {
|
|
63
|
+
const keys = [
|
|
64
|
+
"docker",
|
|
65
|
+
"eslint",
|
|
66
|
+
"prettier",
|
|
67
|
+
"ci",
|
|
68
|
+
"license",
|
|
69
|
+
"contributing",
|
|
70
|
+
"changelog",
|
|
71
|
+
];
|
|
72
|
+
for (const k of keys) {
|
|
73
|
+
assert(k in data.configs, `Missing configs.${k}`);
|
|
74
|
+
}
|
|
75
|
+
});
|
|
76
|
+
// ── generateExampleValue tests ────────────────────────────────────────────────
|
|
77
|
+
test("masks DB_PASSWORD as secret", () => {
|
|
78
|
+
assert((0, scanner_1.generateExampleValue)("DB_PASSWORD") === "your_secret_here", "wrong value");
|
|
79
|
+
});
|
|
80
|
+
test("masks OPENAI_API_KEY correctly", () => {
|
|
81
|
+
assert((0, scanner_1.generateExampleValue)("OPENAI_API_KEY") === "your_api_key_here", "wrong value");
|
|
82
|
+
});
|
|
83
|
+
test("masks JWT_TOKEN correctly", () => {
|
|
84
|
+
assert((0, scanner_1.generateExampleValue)("JWT_TOKEN") === "your_token_here", "wrong value");
|
|
85
|
+
});
|
|
86
|
+
test("masks PORT correctly", () => {
|
|
87
|
+
assert((0, scanner_1.generateExampleValue)("PORT") === "3000", "wrong value");
|
|
88
|
+
});
|
|
89
|
+
test("masks DATABASE_URL with mongo placeholder", () => {
|
|
90
|
+
const val = (0, scanner_1.generateExampleValue)("DATABASE_URL");
|
|
91
|
+
assert(val.startsWith("mongodb://") || val.startsWith("postgresql://"), `Got: ${val}`);
|
|
92
|
+
});
|
|
93
|
+
test("masks REDIS_URL correctly", () => {
|
|
94
|
+
const val = (0, scanner_1.generateExampleValue)("REDIS_URL");
|
|
95
|
+
assert(val.startsWith("redis://"), `Got: ${val}`);
|
|
96
|
+
});
|
|
97
|
+
test("masks NODE_ENV correctly", () => {
|
|
98
|
+
assert((0, scanner_1.generateExampleValue)("NODE_ENV") === "development", "wrong value");
|
|
99
|
+
});
|
|
100
|
+
// ── scanEnvFile tests ─────────────────────────────────────────────────────────
|
|
101
|
+
test("scanEnvFile returns found:false when no .env exists", () => {
|
|
102
|
+
const result = (0, scanner_1.scanEnvFile)("/tmp/nonexistent-project-xyz");
|
|
103
|
+
assert(result.found === false, `Expected found:false, got ${result.found}`);
|
|
104
|
+
});
|
|
105
|
+
// ── generateReadme tests ──────────────────────────────────────────────────────
|
|
106
|
+
const readme = (0, generator_1.generateReadme)(data);
|
|
107
|
+
test("generateReadme returns a non-empty string", () => {
|
|
108
|
+
assert(typeof readme === "string" && readme.length > 100, "Too short or not a string");
|
|
109
|
+
});
|
|
110
|
+
test("README starts with a # heading", () => {
|
|
111
|
+
assert(readme.startsWith("#"), "Does not start with #");
|
|
112
|
+
});
|
|
113
|
+
test("README contains About section", () => {
|
|
114
|
+
assert(readme.includes("## 📋 About"), "Missing About section");
|
|
115
|
+
});
|
|
116
|
+
test("README contains Getting Started section", () => {
|
|
117
|
+
assert(readme.includes("Getting Started"), "Missing Getting Started section");
|
|
118
|
+
});
|
|
119
|
+
test("README contains License section", () => {
|
|
120
|
+
assert(readme.includes("## 📄 License"), "Missing License section");
|
|
121
|
+
});
|
|
122
|
+
test("README contains Contributing section", () => {
|
|
123
|
+
assert(readme.includes("## 🤝 Contributing"), "Missing Contributing section");
|
|
124
|
+
});
|
|
125
|
+
test("README does not leak real env secrets", () => {
|
|
126
|
+
assert(!readme.includes("sk-real"), "Leaked real env value");
|
|
127
|
+
assert(!readme.includes("super_secret_key"), "Leaked real env value");
|
|
128
|
+
});
|
|
129
|
+
test("README has valid markdown heading structure", () => {
|
|
130
|
+
var _a;
|
|
131
|
+
const h2Count = ((_a = readme.match(/^## /gm)) !== null && _a !== void 0 ? _a : []).length;
|
|
132
|
+
assert(h2Count >= 3, `Expected at least 3 h2 sections, got ${h2Count}`);
|
|
133
|
+
});
|
|
134
|
+
// ── Summary ───────────────────────────────────────────────────────────────────
|
|
135
|
+
console.log(`\n ${passed} passed, ${failed} failed\n`);
|
|
136
|
+
if (failed > 0)
|
|
137
|
+
process.exit(1);
|
|
138
|
+
//# sourceMappingURL=test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test.js","sourceRoot":"","sources":["../../test/test.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "smartreadme",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Generate a professional README.md by scanning your project — zero config, zero dependencies",
|
|
5
|
+
"main": "dist/src/index.js",
|
|
6
|
+
"types": "dist/src/index.d.ts",
|
|
7
|
+
"bin": {
|
|
8
|
+
"smartreadme": "./dist/bin/cli.js"
|
|
9
|
+
},
|
|
10
|
+
"scripts": {
|
|
11
|
+
"build": "tsc --project tsconfig.json",
|
|
12
|
+
"dev": "tsc --project tsconfig.json --watch",
|
|
13
|
+
"start": "node dist/bin/cli.js",
|
|
14
|
+
"test": "ts-node --project tsconfig.json test/test.ts",
|
|
15
|
+
"typecheck": "tsc --noEmit",
|
|
16
|
+
"prepublishOnly": "npm run build"
|
|
17
|
+
},
|
|
18
|
+
"engines": {
|
|
19
|
+
"node": ">=18.0.0",
|
|
20
|
+
"npm": ">=9.0.0"
|
|
21
|
+
},
|
|
22
|
+
"keywords": [
|
|
23
|
+
"readme",
|
|
24
|
+
"generator",
|
|
25
|
+
"cli",
|
|
26
|
+
"documentation",
|
|
27
|
+
"markdown",
|
|
28
|
+
"typescript",
|
|
29
|
+
"scaffold"
|
|
30
|
+
],
|
|
31
|
+
"author": "Syed Mohiuddin Meshal <syedmohiuddinmeshal24@gmail.com>",
|
|
32
|
+
"repository": {
|
|
33
|
+
"type": "git",
|
|
34
|
+
"url": "https://github.com/meshal10613/smartreadme.git"
|
|
35
|
+
},
|
|
36
|
+
"homepage": "https://www.npmjs.com/package/smartreadme",
|
|
37
|
+
"bugs": {
|
|
38
|
+
"url": "https://github.com/meshal10613/smartreadme/issues"
|
|
39
|
+
},
|
|
40
|
+
"license": "MIT",
|
|
41
|
+
"devDependencies": {
|
|
42
|
+
"@types/node": "^20.12.0",
|
|
43
|
+
"ts-node": "^10.9.2",
|
|
44
|
+
"typescript": "^6.0.2"
|
|
45
|
+
},
|
|
46
|
+
"files": [
|
|
47
|
+
"dist",
|
|
48
|
+
"README.md"
|
|
49
|
+
]
|
|
50
|
+
}
|