stackscan 0.1.17 → 0.1.19

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 (39) hide show
  1. package/dist/chunk-2R4IRVBW.mjs +19 -0
  2. package/dist/chunk-3JWM3QKI.mjs +2013 -0
  3. package/dist/chunk-5XOMETBV.mjs +158 -0
  4. package/dist/chunk-75Z7C4SW.mjs +19 -0
  5. package/dist/chunk-AU42WGBI.mjs +158 -0
  6. package/dist/chunk-BPDLELPJ.mjs +235 -0
  7. package/dist/chunk-JFE6WNCW.mjs +235 -0
  8. package/dist/chunk-MEH6MW3S.mjs +235 -0
  9. package/dist/chunk-NWUJIUCE.mjs +2028 -0
  10. package/dist/chunk-OX7SYHLD.mjs +235 -0
  11. package/dist/chunk-QNTMPVPN.mjs +19 -0
  12. package/dist/chunk-RRAAD3VC.mjs +2075 -0
  13. package/dist/chunk-TEUMOU3M.mjs +158 -0
  14. package/dist/cli.js +224 -95
  15. package/dist/cli.mjs +7 -5
  16. package/dist/index.js +220 -93
  17. package/dist/index.mjs +4 -4
  18. package/dist/scan.d.mts +2 -1
  19. package/dist/scan.d.ts +2 -1
  20. package/dist/scan.js +220 -93
  21. package/dist/scan.mjs +3 -3
  22. package/dist/scan.old.d.mts +8 -0
  23. package/dist/scan.old.d.ts +8 -0
  24. package/dist/scan.old.js +5770 -0
  25. package/dist/scan.old.mjs +205 -0
  26. package/dist/sync.js +129 -34
  27. package/dist/sync.mjs +3 -3
  28. package/dist/techDefinitions.js +129 -34
  29. package/dist/techDefinitions.mjs +1 -1
  30. package/dist/techMap.js +129 -34
  31. package/dist/techMap.mjs +2 -2
  32. package/package.json +1 -1
  33. package/public/assets/logos/backend/convex.svg +5 -0
  34. package/public/assets/logos/backend/springboot.svg +1 -0
  35. package/public/assets/logos/css/shadcn.svg +6 -0
  36. package/public/assets/logos/defaults/package.svg +18 -0
  37. package/public/assets/logos/language/css3.svg +6 -0
  38. package/public/assets/logos/language/html5.svg +6 -0
  39. package/public/assets/logos/language/typescript.svg +1 -1
@@ -0,0 +1,205 @@
1
+ import {
2
+ techMap
3
+ } from "./chunk-LSUI3VI4.mjs";
4
+ import "./chunk-LB3L25FS.mjs";
5
+ import {
6
+ copyAssets,
7
+ generateMarkdown
8
+ } from "./chunk-UJM3S22V.mjs";
9
+ import "./chunk-NGEKE4DQ.mjs";
10
+ import "./chunk-EOKQCSHI.mjs";
11
+ import {
12
+ simple_icons_hex_default
13
+ } from "./chunk-EH2SEQZP.mjs";
14
+
15
+ // src/scan.old.ts
16
+ import fs from "fs";
17
+ import path from "path";
18
+ var BASE_DIR = path.join(process.cwd(), "public", "stackscan");
19
+ var SKIPPED_TECHS = [
20
+ "react-dom"
21
+ ];
22
+ var CATEGORY_PRIORITY = [
23
+ "language",
24
+ "framework",
25
+ "mobile",
26
+ "frontend",
27
+ "backend",
28
+ "runtime",
29
+ "database",
30
+ "orm",
31
+ "auth",
32
+ "api",
33
+ "state",
34
+ "css",
35
+ "cloud",
36
+ "hosting",
37
+ "devops",
38
+ "container",
39
+ "ci",
40
+ "testing",
41
+ "build",
42
+ "lint",
43
+ "format",
44
+ "automation",
45
+ "package",
46
+ "ai",
47
+ "network",
48
+ "utility",
49
+ "cms",
50
+ "ssg",
51
+ "payment"
52
+ ];
53
+ var getCategoryPriority = (cat) => {
54
+ const idx = CATEGORY_PRIORITY.indexOf(cat ? cat.toLowerCase() : "");
55
+ return idx === -1 ? 999 : idx;
56
+ };
57
+ async function scan(options = {}) {
58
+ if (options.readme === void 0) options.readme = true;
59
+ console.log("\u{1F680} Starting Scan...");
60
+ if (options.color) {
61
+ console.log(`\u{1F3A8} Color mode: ${options.color}`);
62
+ }
63
+ if (!fs.existsSync(BASE_DIR)) {
64
+ console.log(`Creating stackscan directory at: ${BASE_DIR}`);
65
+ fs.mkdirSync(BASE_DIR, { recursive: true });
66
+ console.log('Please place your project folders inside "public/stackscan/" and run this command again.');
67
+ process.exit(0);
68
+ }
69
+ const entries = fs.readdirSync(BASE_DIR, { withFileTypes: true });
70
+ const projectDirs = entries.filter((dirent) => dirent.isDirectory() && dirent.name !== "input" && dirent.name !== "output");
71
+ if (projectDirs.length === 0) {
72
+ console.log('\u26A0\uFE0F No project directories found in "public/stackscan/".');
73
+ return;
74
+ }
75
+ console.log(`Found ${projectDirs.length} projects to process.
76
+ `);
77
+ const allProjects = [];
78
+ const allTechs = [];
79
+ for (const dir of projectDirs) {
80
+ const projectPath = path.join(BASE_DIR, dir.name);
81
+ const packageJsonPath = path.join(projectPath, "package.json");
82
+ if (fs.existsSync(packageJsonPath)) {
83
+ try {
84
+ const content = fs.readFileSync(packageJsonPath, "utf-8");
85
+ const pkg = JSON.parse(content);
86
+ const allDeps = { ...pkg.dependencies, ...pkg.devDependencies };
87
+ const detectedTechs = [];
88
+ Object.keys(allDeps).forEach((dep) => {
89
+ if (SKIPPED_TECHS.includes(dep)) return;
90
+ if (techMap[dep]) {
91
+ const tech = techMap[dep];
92
+ let color = null;
93
+ if (options.color === "white") color = "#FFFFFF";
94
+ else if (options.color === "black") color = "#000000";
95
+ else if (options.color && options.color.startsWith("#")) color = options.color;
96
+ else {
97
+ const depSlug = dep.toLowerCase();
98
+ const nameSlug = tech.name.toLowerCase();
99
+ const nameSlugNoSpaces = tech.name.toLowerCase().replace(/\s+/g, "");
100
+ const hex = simple_icons_hex_default[depSlug] || simple_icons_hex_default[nameSlug] || simple_icons_hex_default[nameSlugNoSpaces];
101
+ if (hex) color = `#${hex}`;
102
+ }
103
+ detectedTechs.push({
104
+ name: tech.name,
105
+ slug: dep,
106
+ logo: tech.logo,
107
+ // Raw path for resolution
108
+ type: tech.type,
109
+ color
110
+ });
111
+ }
112
+ });
113
+ let uniqueTechs = Array.from(new Set(detectedTechs.map((t) => t.slug))).map((slug) => detectedTechs.find((t) => t.slug === slug));
114
+ const seenLogos = /* @__PURE__ */ new Set();
115
+ uniqueTechs = uniqueTechs.filter((t) => {
116
+ if (seenLogos.has(t.logo)) {
117
+ return false;
118
+ }
119
+ seenLogos.add(t.logo);
120
+ return true;
121
+ });
122
+ uniqueTechs.sort((a, b) => {
123
+ const pA = getCategoryPriority(a.type);
124
+ const pB = getCategoryPriority(b.type);
125
+ if (pA !== pB) return pA - pB;
126
+ return a.name.localeCompare(b.name);
127
+ });
128
+ const assetsDir = path.join(process.cwd(), "public", "assets", "logos");
129
+ if (options.copyAssets !== false) {
130
+ await copyAssets(uniqueTechs, assetsDir, { colorMode: options.color });
131
+ }
132
+ const techsWithUrls = uniqueTechs.map((t) => ({
133
+ ...t,
134
+ logo: `https://raw.githubusercontent.com/benjamindotdev/stackscan/main/public/assets/logos/${t.logo}`,
135
+ relativePath: `./public/assets/logos/${t.logo}`
136
+ }));
137
+ allTechs.push(...techsWithUrls);
138
+ fs.writeFileSync(
139
+ path.join(projectPath, "stack.json"),
140
+ JSON.stringify(techsWithUrls, null, 2)
141
+ );
142
+ const mdContent = generateMarkdown(techsWithUrls);
143
+ fs.writeFileSync(path.join(projectPath, "stack.md"), mdContent);
144
+ allProjects.push({
145
+ name: dir.name,
146
+ techs: techsWithUrls
147
+ });
148
+ console.log(`\u2705 ${dir.name.padEnd(20)} -> stack.json (${uniqueTechs.length} techs)`);
149
+ } catch (err) {
150
+ console.error(`\u274C Error processing ${dir.name}:`, err.message);
151
+ }
152
+ } else {
153
+ console.warn(`\u26A0\uFE0F Skipping "${dir.name}": No package.json found.`);
154
+ }
155
+ }
156
+ if (options.readme && allProjects.length > 0) {
157
+ updateRootReadme(allProjects);
158
+ } else if (!options.readme) {
159
+ console.log("Skipping README update (--no-readme passed).");
160
+ }
161
+ console.log("\n\u2728 Sync complete.");
162
+ }
163
+ function updateRootReadme(projects) {
164
+ const readmePath = path.join(process.cwd(), "README.md");
165
+ if (!fs.existsSync(readmePath)) {
166
+ console.log("\u26A0\uFE0F No root README.md found to update.");
167
+ return;
168
+ }
169
+ let readmeContent = fs.readFileSync(readmePath, "utf-8");
170
+ const startMarker = "<!-- STACKSYNC_START -->";
171
+ const endMarker = "<!-- STACKSYNC_END -->";
172
+ let newSection = `${startMarker}
173
+ ## My Projects
174
+
175
+ `;
176
+ for (const p of projects) {
177
+ newSection += `### ${p.name}
178
+ `;
179
+ newSection += `<p>
180
+ `;
181
+ for (const t of p.techs) {
182
+ const src = t.relativePath || t.logo;
183
+ newSection += ` <img src="${src}" alt="${t.name}" height="25" style="margin-right: 10px;" />
184
+ `;
185
+ }
186
+ newSection += `</p>
187
+
188
+ `;
189
+ }
190
+ newSection += `${endMarker}`;
191
+ if (readmeContent.includes(startMarker) && readmeContent.includes(endMarker)) {
192
+ const regex = new RegExp(`${startMarker}[\\s\\S]*?${endMarker}`);
193
+ readmeContent = readmeContent.replace(regex, newSection);
194
+ console.log(`\u{1F4DD} Updated root README.md with ${projects.length} projects.`);
195
+ } else {
196
+ readmeContent += `
197
+
198
+ ${newSection}`;
199
+ console.log(`\u{1F4DD} Appended projects to root README.md.`);
200
+ }
201
+ fs.writeFileSync(readmePath, readmeContent);
202
+ }
203
+ export {
204
+ scan
205
+ };
package/dist/sync.js CHANGED
@@ -168,7 +168,10 @@ var techDefinitions = [
168
168
  "id": "remix",
169
169
  "name": "Remix",
170
170
  "aliases": [
171
- "remix"
171
+ "remix",
172
+ "@remix-run/react",
173
+ "@remix-run/node",
174
+ "@remix-run/serve"
172
175
  ],
173
176
  "category": "frontend",
174
177
  "logo": "frontend/remix.svg",
@@ -248,7 +251,10 @@ var techDefinitions = [
248
251
  "id": "angular",
249
252
  "name": "Angular",
250
253
  "aliases": [
251
- "@angular/core"
254
+ "@angular/core",
255
+ "@angular/common",
256
+ "@angular/platform-browser",
257
+ "@angular/cli"
252
258
  ],
253
259
  "category": "frontend",
254
260
  "logo": "frontend/angular.svg",
@@ -258,7 +264,9 @@ var techDefinitions = [
258
264
  "id": "lit",
259
265
  "name": "Lit",
260
266
  "aliases": [
261
- "lit"
267
+ "lit",
268
+ "lit-element",
269
+ "lit-html"
262
270
  ],
263
271
  "category": "frontend",
264
272
  "logo": "frontend/lit.svg",
@@ -278,7 +286,8 @@ var techDefinitions = [
278
286
  "id": "ember",
279
287
  "name": "Ember",
280
288
  "aliases": [
281
- "ember-source"
289
+ "ember-source",
290
+ "ember-cli"
282
291
  ],
283
292
  "category": "frontend",
284
293
  "logo": "frontend/emberdotjs.svg",
@@ -378,22 +387,14 @@ var techDefinitions = [
378
387
  "id": "mantine",
379
388
  "name": "Mantine",
380
389
  "aliases": [
381
- "@mantine/core"
390
+ "@mantine/core",
391
+ "@mantine/hooks",
392
+ "@mantine/form"
382
393
  ],
383
394
  "category": "css",
384
395
  "logo": "fallback/mantine-logo.svg",
385
396
  "frameworks": []
386
397
  },
387
- {
388
- "id": "shadcnui",
389
- "name": "shadcn/ui",
390
- "aliases": [
391
- "shadcn"
392
- ],
393
- "category": "css",
394
- "logo": "css/shadcnui.svg",
395
- "frameworks": []
396
- },
397
398
  {
398
399
  "id": "daisyui",
399
400
  "name": "DaisyUI",
@@ -428,7 +429,8 @@ var techDefinitions = [
428
429
  "id": "headlessui",
429
430
  "name": "Headless UI",
430
431
  "aliases": [
431
- "@headlessui/react"
432
+ "@headlessui/react",
433
+ "@headlessui/vue"
432
434
  ],
433
435
  "category": "css",
434
436
  "logo": "css/headlessui.svg",
@@ -438,7 +440,9 @@ var techDefinitions = [
438
440
  "id": "emotion",
439
441
  "name": "Emotion",
440
442
  "aliases": [
441
- "@emotion/react"
443
+ "@emotion/react",
444
+ "@emotion/styled",
445
+ "@emotion/css"
442
446
  ],
443
447
  "category": "css",
444
448
  "logo": "css/emotion.svg",
@@ -498,7 +502,9 @@ var techDefinitions = [
498
502
  "id": "redux",
499
503
  "name": "Redux",
500
504
  "aliases": [
501
- "redux"
505
+ "redux",
506
+ "react-redux",
507
+ "@reduxjs/toolkit"
502
508
  ],
503
509
  "category": "state",
504
510
  "logo": "state/redux.svg",
@@ -508,7 +514,9 @@ var techDefinitions = [
508
514
  "id": "mobx",
509
515
  "name": "MobX",
510
516
  "aliases": [
511
- "mobx"
517
+ "mobx",
518
+ "mobx-react",
519
+ "mobx-react-lite"
512
520
  ],
513
521
  "category": "state",
514
522
  "logo": "state/mobx.svg",
@@ -548,7 +556,9 @@ var techDefinitions = [
548
556
  "id": "xstate",
549
557
  "name": "XState",
550
558
  "aliases": [
551
- "xstate"
559
+ "xstate",
560
+ "@xstate/react",
561
+ "@xstate/fsm"
552
562
  ],
553
563
  "category": "state",
554
564
  "logo": "state/xstate.svg",
@@ -558,7 +568,10 @@ var techDefinitions = [
558
568
  "id": "tanstackquery",
559
569
  "name": "TanStack Query",
560
570
  "aliases": [
561
- "@tanstack/react-query"
571
+ "@tanstack/react-query",
572
+ "@tanstack/vue-query",
573
+ "@tanstack/svelte-query",
574
+ "react-query"
562
575
  ],
563
576
  "category": "state",
564
577
  "logo": "fallback/reactquery.svg",
@@ -768,7 +781,11 @@ var techDefinitions = [
768
781
  "id": "storybook",
769
782
  "name": "Storybook",
770
783
  "aliases": [
771
- "@storybook/react"
784
+ "storybook",
785
+ "@storybook/react",
786
+ "@storybook/vue",
787
+ "@storybook/angular",
788
+ "@storybook/addon-essentials"
772
789
  ],
773
790
  "category": "testing",
774
791
  "logo": "testing/storybook.svg",
@@ -948,7 +965,8 @@ var techDefinitions = [
948
965
  "id": "prisma",
949
966
  "name": "Prisma",
950
967
  "aliases": [
951
- "prisma"
968
+ "prisma",
969
+ "@prisma/client"
952
970
  ],
953
971
  "category": "orm",
954
972
  "logo": "orm/prisma.svg",
@@ -988,7 +1006,9 @@ var techDefinitions = [
988
1006
  "id": "postgresql",
989
1007
  "name": "PostgreSQL",
990
1008
  "aliases": [
991
- "pg"
1009
+ "pg",
1010
+ "pg-promise",
1011
+ "node-postgres"
992
1012
  ],
993
1013
  "category": "database",
994
1014
  "logo": "database/postgresql.svg",
@@ -1019,7 +1039,8 @@ var techDefinitions = [
1019
1039
  "id": "sqlite",
1020
1040
  "name": "SQLite",
1021
1041
  "aliases": [
1022
- "sqlite3"
1042
+ "sqlite3",
1043
+ "better-sqlite3"
1023
1044
  ],
1024
1045
  "category": "database",
1025
1046
  "logo": "database/sqlite.svg",
@@ -1039,7 +1060,9 @@ var techDefinitions = [
1039
1060
  "id": "redis",
1040
1061
  "name": "Redis",
1041
1062
  "aliases": [
1042
- "redis"
1063
+ "redis",
1064
+ "ioredis",
1065
+ "@redis/client"
1043
1066
  ],
1044
1067
  "category": "database",
1045
1068
  "logo": "database/redis.svg",
@@ -1219,7 +1242,11 @@ var techDefinitions = [
1219
1242
  "id": "auth0",
1220
1243
  "name": "Auth0",
1221
1244
  "aliases": [
1222
- "auth0"
1245
+ "auth0",
1246
+ "auth0-js",
1247
+ "@auth0/auth0-react",
1248
+ "@auth0/auth0-vue",
1249
+ "@auth0/auth0-angular"
1223
1250
  ],
1224
1251
  "category": "auth",
1225
1252
  "logo": "auth/auth0.svg",
@@ -1229,7 +1256,9 @@ var techDefinitions = [
1229
1256
  "id": "clerk",
1230
1257
  "name": "Clerk",
1231
1258
  "aliases": [
1232
- "@clerk/nextjs"
1259
+ "@clerk/nextjs",
1260
+ "@clerk/clerk-react",
1261
+ "@clerk/clerk-sdk-node"
1233
1262
  ],
1234
1263
  "category": "auth",
1235
1264
  "logo": "auth/clerk.svg",
@@ -1239,7 +1268,9 @@ var techDefinitions = [
1239
1268
  "id": "supabaseauth",
1240
1269
  "name": "Supabase Auth",
1241
1270
  "aliases": [
1242
- "@supabase/auth-helpers-nextjs"
1271
+ "@supabase/auth-helpers-nextjs",
1272
+ "@supabase/auth-helpers-react",
1273
+ "@supabase/ssr"
1243
1274
  ],
1244
1275
  "category": "auth",
1245
1276
  "logo": "database/supabase.svg",
@@ -1249,7 +1280,10 @@ var techDefinitions = [
1249
1280
  "id": "firebaseauth",
1250
1281
  "name": "Firebase Auth",
1251
1282
  "aliases": [
1252
- "firebase"
1283
+ "firebase",
1284
+ "firebase-admin",
1285
+ "@firebase/app",
1286
+ "@firebase/auth"
1253
1287
  ],
1254
1288
  "category": "auth",
1255
1289
  "logo": "auth/firebase.svg",
@@ -1331,7 +1365,9 @@ var techDefinitions = [
1331
1365
  "id": "langchain",
1332
1366
  "name": "LangChain",
1333
1367
  "aliases": [
1334
- "langchain"
1368
+ "langchain",
1369
+ "@langchain/core",
1370
+ "@langchain/openai"
1335
1371
  ],
1336
1372
  "category": "ai",
1337
1373
  "logo": "ai/langchain.svg",
@@ -1511,7 +1547,10 @@ var techDefinitions = [
1511
1547
  "id": "aws",
1512
1548
  "name": "AWS",
1513
1549
  "aliases": [
1514
- "aws-sdk"
1550
+ "aws-sdk",
1551
+ "@aws-sdk/client-s3",
1552
+ "@aws-sdk/client-dynamodb",
1553
+ "@aws-sdk/client-lambda"
1515
1554
  ],
1516
1555
  "category": "cloud",
1517
1556
  "logo": "cloud/amazonwebservices.svg",
@@ -1731,7 +1770,8 @@ var techDefinitions = [
1731
1770
  "id": "shopify",
1732
1771
  "name": "Shopify",
1733
1772
  "aliases": [
1734
- "@shopify/shopify-api"
1773
+ "@shopify/shopify-api",
1774
+ "shopify"
1735
1775
  ],
1736
1776
  "category": "cms",
1737
1777
  "logo": "cms/shopify.svg",
@@ -1991,7 +2031,9 @@ var techDefinitions = [
1991
2031
  "id": "stripe",
1992
2032
  "name": "Stripe",
1993
2033
  "aliases": [
1994
- "stripe"
2034
+ "stripe",
2035
+ "@stripe/stripe-js",
2036
+ "@stripe/react-stripe-js"
1995
2037
  ],
1996
2038
  "category": "payment",
1997
2039
  "logo": "payment/stripe.svg",
@@ -2016,6 +2058,59 @@ var techDefinitions = [
2016
2058
  "category": "payment",
2017
2059
  "logo": "fallback/lemonsqueezy.svg",
2018
2060
  "frameworks": []
2061
+ },
2062
+ {
2063
+ "id": "css",
2064
+ "name": "CSS",
2065
+ "aliases": [
2066
+ "css"
2067
+ ],
2068
+ "category": "language",
2069
+ "logo": "language/css3.svg",
2070
+ "frameworks": []
2071
+ },
2072
+ {
2073
+ "id": "html",
2074
+ "name": "HTML",
2075
+ "aliases": [
2076
+ "html"
2077
+ ],
2078
+ "category": "language",
2079
+ "logo": "language/html5.svg",
2080
+ "frameworks": []
2081
+ },
2082
+ {
2083
+ "id": "convex",
2084
+ "name": "Convex",
2085
+ "aliases": [
2086
+ "convex",
2087
+ "convex-dev"
2088
+ ],
2089
+ "category": "backend",
2090
+ "logo": "backend/convex.svg",
2091
+ "frameworks": []
2092
+ },
2093
+ {
2094
+ "id": "shadcn",
2095
+ "name": "shadcn/ui",
2096
+ "aliases": [
2097
+ "shadcn",
2098
+ "shadcn-ui",
2099
+ "shadcn/ui"
2100
+ ],
2101
+ "category": "css",
2102
+ "logo": "css/shadcn.svg",
2103
+ "frameworks": []
2104
+ },
2105
+ {
2106
+ "id": "springboot",
2107
+ "name": "Spring Boot",
2108
+ "aliases": [
2109
+ "spring-boot"
2110
+ ],
2111
+ "category": "backend",
2112
+ "logo": "backend/springboot.svg",
2113
+ "frameworks": []
2019
2114
  }
2020
2115
  ];
2021
2116
 
package/dist/sync.mjs CHANGED
@@ -1,8 +1,8 @@
1
1
  import {
2
2
  sync
3
- } from "./chunk-XS2LU2MN.mjs";
4
- import "./chunk-LSUI3VI4.mjs";
5
- import "./chunk-LB3L25FS.mjs";
3
+ } from "./chunk-5XOMETBV.mjs";
4
+ import "./chunk-2R4IRVBW.mjs";
5
+ import "./chunk-RRAAD3VC.mjs";
6
6
  import "./chunk-UJM3S22V.mjs";
7
7
  import "./chunk-NGEKE4DQ.mjs";
8
8
  import "./chunk-EOKQCSHI.mjs";