stackscan 0.1.6

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 (369) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +222 -0
  3. package/dist/add.d.mts +3 -0
  4. package/dist/add.d.ts +3 -0
  5. package/dist/add.js +83 -0
  6. package/dist/add.mjs +7 -0
  7. package/dist/batch-import.d.mts +6 -0
  8. package/dist/batch-import.d.ts +6 -0
  9. package/dist/batch-import.js +5724 -0
  10. package/dist/batch-import.mjs +12 -0
  11. package/dist/chunk-22J2UHU7.mjs +1980 -0
  12. package/dist/chunk-2KG7JDHY.mjs +19 -0
  13. package/dist/chunk-2O2NMD7M.mjs +127 -0
  14. package/dist/chunk-3HEYJTUE.mjs +157 -0
  15. package/dist/chunk-3LPZV7KA.mjs +15 -0
  16. package/dist/chunk-3O2C34CJ.mjs +174 -0
  17. package/dist/chunk-3R4TXOZA.mjs +179 -0
  18. package/dist/chunk-3RJHZIII.mjs +174 -0
  19. package/dist/chunk-3XKWCBY6.mjs +105 -0
  20. package/dist/chunk-4OMBB3R6.mjs +52 -0
  21. package/dist/chunk-4THN5TT4.mjs +185 -0
  22. package/dist/chunk-4WCVZS6B.mjs +178 -0
  23. package/dist/chunk-5MNAT56X.mjs +23 -0
  24. package/dist/chunk-5VH7N3X6.mjs +109 -0
  25. package/dist/chunk-6A4WEZDZ.mjs +14 -0
  26. package/dist/chunk-6MIRBLO4.mjs +15 -0
  27. package/dist/chunk-6RCTNUF4.mjs +17 -0
  28. package/dist/chunk-7F4KWGMM.mjs +45 -0
  29. package/dist/chunk-7KF2HEU2.mjs +56 -0
  30. package/dist/chunk-7KONWCSX.mjs +15 -0
  31. package/dist/chunk-7TIXAYVC.mjs +10122 -0
  32. package/dist/chunk-ADMVFPX7.mjs +150 -0
  33. package/dist/chunk-AFJCX5SK.mjs +22 -0
  34. package/dist/chunk-ATNEVZPV.mjs +25 -0
  35. package/dist/chunk-BBP27ZGZ.mjs +4841 -0
  36. package/dist/chunk-BGT3PANW.mjs +64 -0
  37. package/dist/chunk-BJIQZNKU.mjs +184 -0
  38. package/dist/chunk-BKQW4ZNZ.mjs +19 -0
  39. package/dist/chunk-BMQTYZOD.mjs +144 -0
  40. package/dist/chunk-CZADURZD.mjs +674 -0
  41. package/dist/chunk-D2DOGM2Y.mjs +19 -0
  42. package/dist/chunk-D32C3FU6.mjs +45 -0
  43. package/dist/chunk-D6FFDX4P.mjs +158 -0
  44. package/dist/chunk-DUAFJVBN.mjs +44 -0
  45. package/dist/chunk-E24PAHCZ.mjs +146 -0
  46. package/dist/chunk-E3OD2BXY.mjs +14 -0
  47. package/dist/chunk-E4K5XYFI.mjs +210767 -0
  48. package/dist/chunk-EH2SEQZP.mjs +10119 -0
  49. package/dist/chunk-EH4FWTP5.mjs +21 -0
  50. package/dist/chunk-EOKQCSHI.mjs +10 -0
  51. package/dist/chunk-EQ4WRCPP.mjs +16 -0
  52. package/dist/chunk-EYXTSAAW.mjs +64 -0
  53. package/dist/chunk-F6Z4WXOF.mjs +146 -0
  54. package/dist/chunk-FM5BCBKT.mjs +77 -0
  55. package/dist/chunk-GXKIDBAX.mjs +146 -0
  56. package/dist/chunk-H6HA3IZE.mjs +1980 -0
  57. package/dist/chunk-H7WNQ3SS.mjs +23 -0
  58. package/dist/chunk-HBJEQ63D.mjs +205 -0
  59. package/dist/chunk-HTTDBNRT.mjs +146 -0
  60. package/dist/chunk-HYUKJUPF.mjs +177 -0
  61. package/dist/chunk-IFEEO473.mjs +49 -0
  62. package/dist/chunk-IILZ43EE.mjs +25 -0
  63. package/dist/chunk-ITGRHGUT.mjs +158 -0
  64. package/dist/chunk-J5JVDMED.mjs +45 -0
  65. package/dist/chunk-JH3SW4KH.mjs +4896 -0
  66. package/dist/chunk-JHVWSHNY.mjs +32 -0
  67. package/dist/chunk-JLFOQXQG.mjs +26 -0
  68. package/dist/chunk-K4BNSVJP.mjs +16 -0
  69. package/dist/chunk-KCDUZXVN.mjs +157 -0
  70. package/dist/chunk-KMDEPBKS.mjs +685 -0
  71. package/dist/chunk-L4AQWDD2.mjs +92 -0
  72. package/dist/chunk-L7I4UC35.mjs +158 -0
  73. package/dist/chunk-LB3L25FS.mjs +1980 -0
  74. package/dist/chunk-LDA354A3.mjs +158 -0
  75. package/dist/chunk-LSUI3VI4.mjs +19 -0
  76. package/dist/chunk-MB2X3DXF.mjs +45 -0
  77. package/dist/chunk-MBL4CIFG.mjs +28 -0
  78. package/dist/chunk-MLAUEAUQ.mjs +27 -0
  79. package/dist/chunk-NGEKE4DQ.mjs +23 -0
  80. package/dist/chunk-NJ4FK5BO.mjs +19 -0
  81. package/dist/chunk-OJZZPNXQ.mjs +1985 -0
  82. package/dist/chunk-P24PKCUA.mjs +25 -0
  83. package/dist/chunk-PFQIKEIL.mjs +15 -0
  84. package/dist/chunk-Q5ASM7HE.mjs +45 -0
  85. package/dist/chunk-Q7X2R7N7.mjs +16 -0
  86. package/dist/chunk-QAIJCQWH.mjs +157 -0
  87. package/dist/chunk-QQAUZGVG.mjs +2166 -0
  88. package/dist/chunk-QUIF3FJ2.mjs +55 -0
  89. package/dist/chunk-RDFZ4GVM.mjs +23 -0
  90. package/dist/chunk-RFRKMUNA.mjs +49 -0
  91. package/dist/chunk-RIIQA6S6.mjs +2204 -0
  92. package/dist/chunk-SGOSAU2P.mjs +51 -0
  93. package/dist/chunk-SLYSEMYE.mjs +21 -0
  94. package/dist/chunk-SNKLZ7VB.mjs +36 -0
  95. package/dist/chunk-TKKUEAN6.mjs +45 -0
  96. package/dist/chunk-TMH7EUXF.mjs +179 -0
  97. package/dist/chunk-TP55TF47.mjs +1980 -0
  98. package/dist/chunk-U4AFTAZI.mjs +1980 -0
  99. package/dist/chunk-U4EXCWGR.mjs +174 -0
  100. package/dist/chunk-U4OINWJM.mjs +42 -0
  101. package/dist/chunk-U63TGBAS.mjs +179 -0
  102. package/dist/chunk-UESFH6US.mjs +210773 -0
  103. package/dist/chunk-UITLHBZA.mjs +164 -0
  104. package/dist/chunk-VFD26CTJ.mjs +16 -0
  105. package/dist/chunk-VSWWWPO7.mjs +205 -0
  106. package/dist/chunk-VUVPGH7A.mjs +157 -0
  107. package/dist/chunk-W34IFT2J.mjs +45 -0
  108. package/dist/chunk-WPSGF5DK.mjs +92 -0
  109. package/dist/chunk-WPU2XV5B.mjs +25 -0
  110. package/dist/chunk-WTPR7TOE.mjs +146 -0
  111. package/dist/chunk-X3ATBJ5Q.mjs +14 -0
  112. package/dist/chunk-XMZATJRD.mjs +23 -0
  113. package/dist/chunk-Y2Y225MR.mjs +117 -0
  114. package/dist/chunk-YNDKJ5QJ.mjs +89 -0
  115. package/dist/chunk-YPQNYUP3.mjs +92 -0
  116. package/dist/chunk-ZH22D4SN.mjs +179 -0
  117. package/dist/chunk-ZSJJGBQR.mjs +39 -0
  118. package/dist/chunk-ZSMMBZHO.mjs +64 -0
  119. package/dist/chunk-ZTXCA3NN.mjs +74 -0
  120. package/dist/chunk-ZYMQR24Z.mjs +145 -0
  121. package/dist/cli.d.mts +1 -0
  122. package/dist/cli.d.ts +1 -0
  123. package/dist/cli.js +5770 -0
  124. package/dist/cli.mjs +25 -0
  125. package/dist/config.d.mts +5 -0
  126. package/dist/config.d.ts +5 -0
  127. package/dist/config.js +41 -0
  128. package/dist/config.mjs +7 -0
  129. package/dist/defaults.d.mts +3 -0
  130. package/dist/defaults.d.ts +3 -0
  131. package/dist/defaults.js +47 -0
  132. package/dist/defaults.mjs +7 -0
  133. package/dist/detectors/ci.d.mts +5 -0
  134. package/dist/detectors/ci.d.ts +5 -0
  135. package/dist/detectors/ci.js +59 -0
  136. package/dist/detectors/ci.mjs +7 -0
  137. package/dist/detectors/docker.d.mts +5 -0
  138. package/dist/detectors/docker.d.ts +5 -0
  139. package/dist/detectors/docker.js +50 -0
  140. package/dist/detectors/docker.mjs +7 -0
  141. package/dist/detectors/next.d.mts +7 -0
  142. package/dist/detectors/next.d.ts +7 -0
  143. package/dist/detectors/next.js +49 -0
  144. package/dist/detectors/next.mjs +7 -0
  145. package/dist/detectors/prisma.d.mts +7 -0
  146. package/dist/detectors/prisma.d.ts +7 -0
  147. package/dist/detectors/prisma.js +48 -0
  148. package/dist/detectors/prisma.mjs +7 -0
  149. package/dist/import.d.mts +2 -0
  150. package/dist/import.d.ts +2 -0
  151. package/dist/import.js +2062 -0
  152. package/dist/import.mjs +53 -0
  153. package/dist/output.d.mts +7 -0
  154. package/dist/output.d.ts +7 -0
  155. package/dist/output.js +3619 -0
  156. package/dist/output.mjs +13 -0
  157. package/dist/scan.d.mts +7 -0
  158. package/dist/scan.d.ts +7 -0
  159. package/dist/scan.js +5725 -0
  160. package/dist/scan.mjs +12 -0
  161. package/dist/scanner.d.mts +5 -0
  162. package/dist/scanner.d.ts +5 -0
  163. package/dist/scanner.js +5514 -0
  164. package/dist/scanner.mjs +14 -0
  165. package/dist/simple-icons-hex.d.mts +6751 -0
  166. package/dist/simple-icons-hex.d.ts +6751 -0
  167. package/dist/simple-icons-hex.js +10118 -0
  168. package/dist/simple-icons-hex.mjs +6736 -0
  169. package/dist/sync.d.mts +7 -0
  170. package/dist/sync.d.ts +7 -0
  171. package/dist/sync.js +5725 -0
  172. package/dist/sync.mjs +160 -0
  173. package/dist/techDefinitions.d.mts +5 -0
  174. package/dist/techDefinitions.d.ts +5 -0
  175. package/dist/techDefinitions.js +2004 -0
  176. package/dist/techDefinitions.mjs +7 -0
  177. package/dist/techMap.d.mts +5 -0
  178. package/dist/techMap.d.ts +5 -0
  179. package/dist/techMap.js +2018 -0
  180. package/dist/techMap.mjs +8 -0
  181. package/dist/types.d.mts +24 -0
  182. package/dist/types.d.ts +24 -0
  183. package/dist/types.js +18 -0
  184. package/dist/types.mjs +1 -0
  185. package/dist/typescript-7Q5RIVZY.mjs +6 -0
  186. package/dist/typescript-T5HXSZZS.mjs +5 -0
  187. package/dist/watch.d.mts +3 -0
  188. package/dist/watch.d.ts +3 -0
  189. package/dist/watch.js +2122 -0
  190. package/dist/watch.mjs +13 -0
  191. package/package.json +57 -0
  192. package/public/assets/logos/ai/huggingface.svg +1 -0
  193. package/public/assets/logos/ai/langchain.svg +1 -0
  194. package/public/assets/logos/ai/openai.svg +1 -0
  195. package/public/assets/logos/ai/replicate.svg +1 -0
  196. package/public/assets/logos/ai/tensorflow.svg +1 -0
  197. package/public/assets/logos/api/apollographql.svg +1 -0
  198. package/public/assets/logos/api/graphql.svg +1 -0
  199. package/public/assets/logos/api/relay.svg +1 -0
  200. package/public/assets/logos/api/trpc.svg +1 -0
  201. package/public/assets/logos/auth/argo.svg +1 -0
  202. package/public/assets/logos/auth/auth0.svg +1 -0
  203. package/public/assets/logos/auth/authjs.svg +73 -0
  204. package/public/assets/logos/auth/clerk.svg +1 -0
  205. package/public/assets/logos/auth/firebase.svg +1 -0
  206. package/public/assets/logos/auth/jsonwebtokens.svg +1 -0
  207. package/public/assets/logos/auth/keycloak.svg +1 -0
  208. package/public/assets/logos/auth/passport.svg +1 -0
  209. package/public/assets/logos/automation/lerna.svg +1 -0
  210. package/public/assets/logos/automation/nx.svg +1 -0
  211. package/public/assets/logos/automation/turborepo.svg +1 -0
  212. package/public/assets/logos/backend/adonisjs.svg +1 -0
  213. package/public/assets/logos/backend/express.svg +1 -0
  214. package/public/assets/logos/backend/fastify.svg +1 -0
  215. package/public/assets/logos/backend/koa.svg +1 -0
  216. package/public/assets/logos/backend/nestjs.svg +1 -0
  217. package/public/assets/logos/build/babel.svg +1 -0
  218. package/public/assets/logos/build/esbuild.svg +1 -0
  219. package/public/assets/logos/build/rollupdotjs.svg +1 -0
  220. package/public/assets/logos/build/snowpack.svg +1 -0
  221. package/public/assets/logos/build/swc.svg +1 -0
  222. package/public/assets/logos/build/vite.svg +15 -0
  223. package/public/assets/logos/build/webpack.svg +1 -0
  224. package/public/assets/logos/ci/circleci.svg +1 -0
  225. package/public/assets/logos/ci/githubactions.svg +1 -0
  226. package/public/assets/logos/ci/gitlab.svg +1 -0
  227. package/public/assets/logos/ci/jenkins.svg +1 -0
  228. package/public/assets/logos/ci/travisci.svg +1 -0
  229. package/public/assets/logos/cloud/cloudflare.svg +1 -0
  230. package/public/assets/logos/cloud/googlecloud.svg +1 -0
  231. package/public/assets/logos/cloud/microsoftazure.svg +1 -0
  232. package/public/assets/logos/cms/contentful.svg +1 -0
  233. package/public/assets/logos/cms/directus.svg +1 -0
  234. package/public/assets/logos/cms/ghost.svg +1 -0
  235. package/public/assets/logos/cms/keystone.svg +1 -0
  236. package/public/assets/logos/cms/sanity.svg +1 -0
  237. package/public/assets/logos/cms/shopify.svg +1 -0
  238. package/public/assets/logos/cms/strapi.svg +1 -0
  239. package/public/assets/logos/cms/wordpress.svg +1 -0
  240. package/public/assets/logos/container/docker.svg +1 -0
  241. package/public/assets/logos/container/kubernetes.svg +1 -0
  242. package/public/assets/logos/css/antdesign.svg +1 -0
  243. package/public/assets/logos/css/bootstrap.svg +1 -0
  244. package/public/assets/logos/css/bulma.svg +1 -0
  245. package/public/assets/logos/css/chakraui.svg +1 -0
  246. package/public/assets/logos/css/daisyui.svg +1 -0
  247. package/public/assets/logos/css/fallback/mantine-logo.svg +1 -0
  248. package/public/assets/logos/css/fallback/shadcnui.svg +1 -0
  249. package/public/assets/logos/css/foundation.svg +1 -0
  250. package/public/assets/logos/css/headlessui.svg +1 -0
  251. package/public/assets/logos/css/less.svg +1 -0
  252. package/public/assets/logos/css/mui.svg +1 -0
  253. package/public/assets/logos/css/postcss.svg +1 -0
  254. package/public/assets/logos/css/radixui.svg +1 -0
  255. package/public/assets/logos/css/sass.svg +1 -0
  256. package/public/assets/logos/css/shadcnui.svg +1 -0
  257. package/public/assets/logos/css/styledcomponents.svg +1 -0
  258. package/public/assets/logos/css/tailwindcss.svg +1 -0
  259. package/public/assets/logos/database/amazondynamodb.svg +1 -0
  260. package/public/assets/logos/database/apachecassandra.svg +1 -0
  261. package/public/assets/logos/database/cockroachlabs.svg +1 -0
  262. package/public/assets/logos/database/duckdb.svg +1 -0
  263. package/public/assets/logos/database/elasticsearch.svg +1 -0
  264. package/public/assets/logos/database/fauna.svg +3 -0
  265. package/public/assets/logos/database/mariadb.svg +1 -0
  266. package/public/assets/logos/database/mongodb.svg +1 -0
  267. package/public/assets/logos/database/mysql.svg +1 -0
  268. package/public/assets/logos/database/planetscale.svg +1 -0
  269. package/public/assets/logos/database/postgresql.svg +1 -0
  270. package/public/assets/logos/database/redis.svg +1 -0
  271. package/public/assets/logos/database/sqlite.svg +1 -0
  272. package/public/assets/logos/database/supabase.svg +1 -0
  273. package/public/assets/logos/database/surrealdb.svg +1 -0
  274. package/public/assets/logos/devops/ansible.svg +1 -0
  275. package/public/assets/logos/devops/pulumi.svg +1 -0
  276. package/public/assets/logos/devops/serverless.svg +1 -0
  277. package/public/assets/logos/devops/terraform.svg +1 -0
  278. package/public/assets/logos/fallback/31557565.svg +32 -0
  279. package/public/assets/logos/fallback/Drizzle--Streamline-Simple-Icons.svg +7 -0
  280. package/public/assets/logos/fallback/changesets.svg +43 -0
  281. package/public/assets/logos/fallback/lemonsqueezy.svg +8 -0
  282. package/public/assets/logos/fallback/mantine-logo.svg +1 -0
  283. package/public/assets/logos/fallback/reactquery.svg +12 -0
  284. package/public/assets/logos/fallback/shadcnui.svg +21 -0
  285. package/public/assets/logos/fallback/stitches.svg +10 -0
  286. package/public/assets/logos/format/prettier.svg +1 -0
  287. package/public/assets/logos/frontend/alpinedotjs.svg +1 -0
  288. package/public/assets/logos/frontend/angular.svg +1 -0
  289. package/public/assets/logos/frontend/astro.svg +1 -0
  290. package/public/assets/logos/frontend/backbone.svg +1 -0
  291. package/public/assets/logos/frontend/emberdotjs.svg +1 -0
  292. package/public/assets/logos/frontend/htmx.svg +1 -0
  293. package/public/assets/logos/frontend/lit.svg +1 -0
  294. package/public/assets/logos/frontend/nextdotjs.svg +1 -0
  295. package/public/assets/logos/frontend/nuxt.svg +1 -0
  296. package/public/assets/logos/frontend/preact.svg +1 -0
  297. package/public/assets/logos/frontend/qwik.svg +1 -0
  298. package/public/assets/logos/frontend/react.svg +1 -0
  299. package/public/assets/logos/frontend/remix.svg +1 -0
  300. package/public/assets/logos/frontend/solid.svg +1 -0
  301. package/public/assets/logos/frontend/svelte.svg +1 -0
  302. package/public/assets/logos/frontend/vuedotjs.svg +1 -0
  303. package/public/assets/logos/hosting/netlify.svg +1 -0
  304. package/public/assets/logos/hosting/railway.svg +1 -0
  305. package/public/assets/logos/hosting/render.svg +1 -0
  306. package/public/assets/logos/hosting/vercel.svg +1 -0
  307. package/public/assets/logos/language/csharp.svg +1 -0
  308. package/public/assets/logos/language/go.svg +1 -0
  309. package/public/assets/logos/language/javascript.svg +1 -0
  310. package/public/assets/logos/language/openjdk.svg +1 -0
  311. package/public/assets/logos/language/php.svg +1 -0
  312. package/public/assets/logos/language/python.svg +1 -0
  313. package/public/assets/logos/language/ruby.svg +1 -0
  314. package/public/assets/logos/language/rust.svg +1 -0
  315. package/public/assets/logos/language/typescript.svg +1 -0
  316. package/public/assets/logos/lint/commitlint.svg +1 -0
  317. package/public/assets/logos/lint/eslint.svg +1 -0
  318. package/public/assets/logos/lint/husky.svg +3 -0
  319. package/public/assets/logos/lint/lintstaged.svg +3 -0
  320. package/public/assets/logos/mobile/capacitor.svg +1 -0
  321. package/public/assets/logos/mobile/expo.svg +1 -0
  322. package/public/assets/logos/mobile/flutter.svg +1 -0
  323. package/public/assets/logos/mobile/ionic.svg +1 -0
  324. package/public/assets/logos/mobile/react.svg +1 -0
  325. package/public/assets/logos/network/axios.svg +1 -0
  326. package/public/assets/logos/network/brandfetch.svg +1 -0
  327. package/public/assets/logos/network/grpc.svg +1 -0
  328. package/public/assets/logos/network/openapiinitiative.svg +1 -0
  329. package/public/assets/logos/network/swr.svg +1 -0
  330. package/public/assets/logos/orm/drizzle.svg +1 -0
  331. package/public/assets/logos/orm/mongoose.svg +1 -0
  332. package/public/assets/logos/orm/prisma.svg +1 -0
  333. package/public/assets/logos/orm/typeorm.svg +1 -0
  334. package/public/assets/logos/package/npm.svg +1 -0
  335. package/public/assets/logos/package/pnpm.svg +1 -0
  336. package/public/assets/logos/package/yarn.svg +1 -0
  337. package/public/assets/logos/payment/fallback/lemonsqueezy.svg +1 -0
  338. package/public/assets/logos/payment/paypal.svg +1 -0
  339. package/public/assets/logos/payment/stripe.svg +1 -0
  340. package/public/assets/logos/runtime/bun.svg +1 -0
  341. package/public/assets/logos/runtime/deno.svg +1 -0
  342. package/public/assets/logos/ssg/eleventy.svg +1 -0
  343. package/public/assets/logos/ssg/gatsby.svg +1 -0
  344. package/public/assets/logos/ssg/hugo.svg +1 -0
  345. package/public/assets/logos/ssg/jekyll.svg +1 -0
  346. package/public/assets/logos/state/mobx.svg +1 -0
  347. package/public/assets/logos/state/recoil.svg +1 -0
  348. package/public/assets/logos/state/redux.svg +1 -0
  349. package/public/assets/logos/state/xstate.svg +1 -0
  350. package/public/assets/logos/state/zustand.svg +1 -0
  351. package/public/assets/logos/testing/chai.svg +1 -0
  352. package/public/assets/logos/testing/cypress.svg +1 -0
  353. package/public/assets/logos/testing/jasmine.svg +1 -0
  354. package/public/assets/logos/testing/jest.svg +1 -0
  355. package/public/assets/logos/testing/mocha.svg +1 -0
  356. package/public/assets/logos/testing/playwright.svg +1 -0
  357. package/public/assets/logos/testing/puppeteer.svg +1 -0
  358. package/public/assets/logos/testing/storybook.svg +1 -0
  359. package/public/assets/logos/testing/testinglibrary.svg +1 -0
  360. package/public/assets/logos/testing/vitest.svg +1 -0
  361. package/public/assets/logos/utility/d3.svg +1 -0
  362. package/public/assets/logos/utility/leaflet.svg +1 -0
  363. package/public/assets/logos/utility/lodash.svg +1 -0
  364. package/public/assets/logos/utility/pyup.svg +1 -0
  365. package/public/assets/logos/utility/reactivex.svg +1 -0
  366. package/public/assets/logos/utility/threedotjs.svg +1 -0
  367. package/public/assets/logos/utility/zod.svg +1 -0
  368. package/public/stackscan-white.svg +26 -0
  369. package/public/stackscan.svg +26 -0
@@ -0,0 +1,92 @@
1
+ import {
2
+ techMap
3
+ } from "./chunk-2KG7JDHY.mjs";
4
+ import {
5
+ simple_icons_hex_default
6
+ } from "./chunk-7TIXAYVC.mjs";
7
+
8
+ // src/batch-import.ts
9
+ import fs from "fs";
10
+ import path from "path";
11
+ var INPUT_DIR = path.join(process.cwd(), "stacksync", "input");
12
+ var OUTPUT_DIR = path.join(process.cwd(), "stacksync", "output");
13
+ function toCamelCase(str) {
14
+ return str.replace(/[^a-zA-Z0-9 ]/g, "").split(" ").map((word, index) => {
15
+ if (index === 0) return word.toLowerCase();
16
+ return word.charAt(0).toUpperCase() + word.slice(1).toLowerCase();
17
+ }).join("");
18
+ }
19
+ async function batchImport(options = {}) {
20
+ console.log("\u{1F680} Starting Batch Import...");
21
+ if (options.color) {
22
+ console.log(`\u{1F3A8} Color mode: ${options.color}`);
23
+ }
24
+ if (!fs.existsSync(INPUT_DIR)) {
25
+ console.log(`Creating input directory at: ${INPUT_DIR}`);
26
+ fs.mkdirSync(INPUT_DIR, { recursive: true });
27
+ console.log('Please place your project folders inside "stacksync/input" and run this command again.');
28
+ process.exit(0);
29
+ }
30
+ const entries = fs.readdirSync(INPUT_DIR, { withFileTypes: true });
31
+ const projectDirs = entries.filter((dirent) => dirent.isDirectory());
32
+ if (projectDirs.length === 0) {
33
+ console.log('\u26A0\uFE0F No project directories found in "stacksync/input".');
34
+ return;
35
+ }
36
+ console.log(`Found ${projectDirs.length} projects to process.
37
+ `);
38
+ for (const dir of projectDirs) {
39
+ const projectPath = path.join(INPUT_DIR, dir.name);
40
+ const packageJsonPath = path.join(projectPath, "package.json");
41
+ if (fs.existsSync(packageJsonPath)) {
42
+ try {
43
+ const content = fs.readFileSync(packageJsonPath, "utf-8");
44
+ const pkg = JSON.parse(content);
45
+ const allDeps = { ...pkg.dependencies, ...pkg.devDependencies };
46
+ const detectedTechs = [];
47
+ Object.keys(allDeps).forEach((dep) => {
48
+ if (techMap[dep]) {
49
+ const tech = techMap[dep];
50
+ let color = null;
51
+ if (options.color === "white") color = "#FFFFFF";
52
+ else if (options.color === "black") color = "#000000";
53
+ else if (options.color && options.color.startsWith("#")) color = options.color;
54
+ else {
55
+ const depSlug = dep.toLowerCase();
56
+ const nameSlug = tech.name.toLowerCase();
57
+ const nameSlugNoSpaces = tech.name.toLowerCase().replace(/\s+/g, "");
58
+ const hex = simple_icons_hex_default[depSlug] || simple_icons_hex_default[nameSlug] || simple_icons_hex_default[nameSlugNoSpaces];
59
+ if (hex) color = `#${hex}`;
60
+ }
61
+ detectedTechs.push({
62
+ name: tech.name,
63
+ slug: dep,
64
+ logo: `https://raw.githubusercontent.com/benjamindotdev/stacksync/main/assets/logos/${tech.logo}`,
65
+ color
66
+ });
67
+ }
68
+ });
69
+ const uniqueTechs = Array.from(new Set(detectedTechs.map((t) => t.slug))).map((slug) => detectedTechs.find((t) => t.slug === slug));
70
+ const outputFolderName = toCamelCase(dir.name);
71
+ const projectOutputDir = path.join(OUTPUT_DIR, outputFolderName);
72
+ if (!fs.existsSync(projectOutputDir)) {
73
+ fs.mkdirSync(projectOutputDir, { recursive: true });
74
+ }
75
+ fs.writeFileSync(
76
+ path.join(projectOutputDir, "stack.json"),
77
+ JSON.stringify(uniqueTechs, null, 2)
78
+ );
79
+ console.log(`\u2705 ${dir.name.padEnd(20)} -> ${outputFolderName}/stack.json (${uniqueTechs.length} techs)`);
80
+ } catch (err) {
81
+ console.error(`\u274C Error processing ${dir.name}:`, err.message);
82
+ }
83
+ } else {
84
+ console.warn(`\u26A0\uFE0F Skipping "${dir.name}": No package.json found.`);
85
+ }
86
+ }
87
+ console.log("\n\u2728 Batch import complete.");
88
+ }
89
+
90
+ export {
91
+ batchImport
92
+ };
@@ -0,0 +1,25 @@
1
+ import {
2
+ require_lib
3
+ } from "./chunk-RIIQA6S6.mjs";
4
+ import {
5
+ init_esm_shims
6
+ } from "./chunk-RDFZ4GVM.mjs";
7
+ import {
8
+ __toESM
9
+ } from "./chunk-7KF2HEU2.mjs";
10
+
11
+ // src/detectors/prisma.ts
12
+ init_esm_shims();
13
+ var import_fs_extra = __toESM(require_lib());
14
+ import path from "path";
15
+ async function detectPrisma(repoPath) {
16
+ const schema = path.join(repoPath, "prisma/schema.prisma");
17
+ if (await import_fs_extra.default.pathExists(schema)) {
18
+ return { name: "Prisma ORM", logo: "orm/prisma.svg", type: "database" };
19
+ }
20
+ return null;
21
+ }
22
+
23
+ export {
24
+ detectPrisma
25
+ };
@@ -0,0 +1,146 @@
1
+ import {
2
+ copyAssets,
3
+ generateMarkdown
4
+ } from "./chunk-ZH22D4SN.mjs";
5
+ import {
6
+ simple_icons_hex_default
7
+ } from "./chunk-EH2SEQZP.mjs";
8
+ import {
9
+ techMap
10
+ } from "./chunk-2KG7JDHY.mjs";
11
+
12
+ // src/sync.ts
13
+ import fs from "fs";
14
+ import path from "path";
15
+ var BASE_DIR = path.join(process.cwd(), "stacksync");
16
+ async function sync(options = {}) {
17
+ console.log("\u{1F680} Starting Sync...");
18
+ if (options.color) {
19
+ console.log(`\u{1F3A8} Color mode: ${options.color}`);
20
+ }
21
+ if (!fs.existsSync(BASE_DIR)) {
22
+ console.log(`Creating stacksync directory at: ${BASE_DIR}`);
23
+ fs.mkdirSync(BASE_DIR, { recursive: true });
24
+ console.log('Please place your project folders inside "stacksync/" and run this command again.');
25
+ process.exit(0);
26
+ }
27
+ const entries = fs.readdirSync(BASE_DIR, { withFileTypes: true });
28
+ const projectDirs = entries.filter((dirent) => dirent.isDirectory() && dirent.name !== "input" && dirent.name !== "output");
29
+ if (projectDirs.length === 0) {
30
+ console.log('\u26A0\uFE0F No project directories found in "stacksync/".');
31
+ return;
32
+ }
33
+ console.log(`Found ${projectDirs.length} projects to process.
34
+ `);
35
+ const allProjects = [];
36
+ const allTechs = [];
37
+ for (const dir of projectDirs) {
38
+ const projectPath = path.join(BASE_DIR, dir.name);
39
+ const packageJsonPath = path.join(projectPath, "package.json");
40
+ if (fs.existsSync(packageJsonPath)) {
41
+ try {
42
+ const content = fs.readFileSync(packageJsonPath, "utf-8");
43
+ const pkg = JSON.parse(content);
44
+ const allDeps = { ...pkg.dependencies, ...pkg.devDependencies };
45
+ const detectedTechs = [];
46
+ Object.keys(allDeps).forEach((dep) => {
47
+ if (techMap[dep]) {
48
+ const tech = techMap[dep];
49
+ let color = null;
50
+ if (options.color === "white") color = "#FFFFFF";
51
+ else if (options.color === "black") color = "#000000";
52
+ else if (options.color && options.color.startsWith("#")) color = options.color;
53
+ else {
54
+ const depSlug = dep.toLowerCase();
55
+ const nameSlug = tech.name.toLowerCase();
56
+ const nameSlugNoSpaces = tech.name.toLowerCase().replace(/\s+/g, "");
57
+ const hex = simple_icons_hex_default[depSlug] || simple_icons_hex_default[nameSlug] || simple_icons_hex_default[nameSlugNoSpaces];
58
+ if (hex) color = `#${hex}`;
59
+ }
60
+ detectedTechs.push({
61
+ name: tech.name,
62
+ slug: dep,
63
+ logo: tech.logo,
64
+ // Raw path for resolution
65
+ color
66
+ });
67
+ }
68
+ });
69
+ const uniqueTechs = Array.from(new Set(detectedTechs.map((t) => t.slug))).map((slug) => detectedTechs.find((t) => t.slug === slug));
70
+ const assetsDir = path.join(process.cwd(), "public", "assets", "logos");
71
+ if (options.copyAssets !== false) {
72
+ await copyAssets(uniqueTechs, assetsDir, { colorMode: options.color });
73
+ }
74
+ const techsWithUrls = uniqueTechs.map((t) => ({
75
+ ...t,
76
+ logo: `https://raw.githubusercontent.com/benjamindotdev/stacksync/main/public/assets/logos/${t.logo}`,
77
+ relativePath: `./public/assets/logos/${t.logo}`
78
+ }));
79
+ allTechs.push(...techsWithUrls);
80
+ fs.writeFileSync(
81
+ path.join(projectPath, "stack.json"),
82
+ JSON.stringify(techsWithUrls, null, 2)
83
+ );
84
+ const mdContent = generateMarkdown(techsWithUrls);
85
+ fs.writeFileSync(path.join(projectPath, "stack.md"), mdContent);
86
+ allProjects.push({
87
+ name: dir.name,
88
+ techs: techsWithUrls
89
+ });
90
+ console.log(`\u2705 ${dir.name.padEnd(20)} -> stack.json (${uniqueTechs.length} techs)`);
91
+ } catch (err) {
92
+ console.error(`\u274C Error processing ${dir.name}:`, err.message);
93
+ }
94
+ } else {
95
+ console.warn(`\u26A0\uFE0F Skipping "${dir.name}": No package.json found.`);
96
+ }
97
+ }
98
+ if (allProjects.length > 0) {
99
+ updateRootReadme(allProjects);
100
+ }
101
+ console.log("\n\u2728 Sync complete.");
102
+ }
103
+ function updateRootReadme(projects) {
104
+ const readmePath = path.join(process.cwd(), "README.md");
105
+ if (!fs.existsSync(readmePath)) {
106
+ console.log("\u26A0\uFE0F No root README.md found to update.");
107
+ return;
108
+ }
109
+ let readmeContent = fs.readFileSync(readmePath, "utf-8");
110
+ const startMarker = "<!-- STACKSYNC_START -->";
111
+ const endMarker = "<!-- STACKSYNC_END -->";
112
+ let newSection = `${startMarker}
113
+ ## My Projects
114
+
115
+ `;
116
+ for (const p of projects) {
117
+ newSection += `### ${p.name}
118
+ `;
119
+ newSection += `<p>
120
+ `;
121
+ for (const t of p.techs) {
122
+ const src = t.relativePath || t.logo;
123
+ newSection += ` <img src="${src}" alt="${t.name}" height="25" style="margin-right: 10px;" />
124
+ `;
125
+ }
126
+ newSection += `</p>
127
+
128
+ `;
129
+ }
130
+ newSection += `${endMarker}`;
131
+ if (readmeContent.includes(startMarker) && readmeContent.includes(endMarker)) {
132
+ const regex = new RegExp(`${startMarker}[\\s\\S]*?${endMarker}`);
133
+ readmeContent = readmeContent.replace(regex, newSection);
134
+ console.log(`\u{1F4DD} Updated root README.md with ${projects.length} projects.`);
135
+ } else {
136
+ readmeContent += `
137
+
138
+ ${newSection}`;
139
+ console.log(`\u{1F4DD} Appended projects to root README.md.`);
140
+ }
141
+ fs.writeFileSync(readmePath, readmeContent);
142
+ }
143
+
144
+ export {
145
+ sync
146
+ };
@@ -0,0 +1,14 @@
1
+ // src/detectors/prisma.ts
2
+ import fs from "fs-extra";
3
+ import path from "path";
4
+ async function detectPrisma(repoPath) {
5
+ const schema = path.join(repoPath, "prisma/schema.prisma");
6
+ if (await fs.pathExists(schema)) {
7
+ return { name: "Prisma ORM", logo: "orm/prisma.svg", type: "database" };
8
+ }
9
+ return null;
10
+ }
11
+
12
+ export {
13
+ detectPrisma
14
+ };
@@ -0,0 +1,23 @@
1
+ // src/defaults.ts
2
+ var DEFAULT_CATEGORY_ICONS = {
3
+ ai: "brain",
4
+ auth: "lock",
5
+ backend: "server",
6
+ build: "package",
7
+ cloud: "cloud",
8
+ css: "palette",
9
+ lint: "check-square",
10
+ network: "globe",
11
+ state: "layers",
12
+ utility: "wrench",
13
+ // Optional refinements
14
+ validation: "shield-check",
15
+ date: "clock",
16
+ cli: "terminal",
17
+ git: "git-branch",
18
+ http: "arrow-left-right"
19
+ };
20
+
21
+ export {
22
+ DEFAULT_CATEGORY_ICONS
23
+ };
@@ -0,0 +1,117 @@
1
+ import {
2
+ generateMarkdown
3
+ } from "./chunk-4WCVZS6B.mjs";
4
+ import {
5
+ techMap
6
+ } from "./chunk-2KG7JDHY.mjs";
7
+ import {
8
+ simple_icons_hex_default
9
+ } from "./chunk-EH2SEQZP.mjs";
10
+
11
+ // src/batch-import.ts
12
+ import fs from "fs";
13
+ import path from "path";
14
+ var INPUT_DIR = path.join(process.cwd(), "stacksync", "input");
15
+ var OUTPUT_DIR = path.join(process.cwd(), "stacksync", "output");
16
+ function toCamelCase(str) {
17
+ return str.replace(/[^a-zA-Z0-9 ]/g, "").split(" ").map((word, index) => {
18
+ if (index === 0) return word.toLowerCase();
19
+ return word.charAt(0).toUpperCase() + word.slice(1).toLowerCase();
20
+ }).join("");
21
+ }
22
+ async function batchImport(options = {}) {
23
+ console.log("\u{1F680} Starting Batch Import...");
24
+ if (options.color) {
25
+ console.log(`\u{1F3A8} Color mode: ${options.color}`);
26
+ }
27
+ if (!fs.existsSync(INPUT_DIR)) {
28
+ console.log(`Creating input directory at: ${INPUT_DIR}`);
29
+ fs.mkdirSync(INPUT_DIR, { recursive: true });
30
+ console.log('Please place your project folders inside "stacksync/input" and run this command again.');
31
+ process.exit(0);
32
+ }
33
+ const entries = fs.readdirSync(INPUT_DIR, { withFileTypes: true });
34
+ const projectDirs = entries.filter((dirent) => dirent.isDirectory());
35
+ if (projectDirs.length === 0) {
36
+ console.log('\u26A0\uFE0F No project directories found in "stacksync/input".');
37
+ return;
38
+ }
39
+ console.log(`Found ${projectDirs.length} projects to process.
40
+ `);
41
+ for (const dir of projectDirs) {
42
+ const projectPath = path.join(INPUT_DIR, dir.name);
43
+ const packageJsonPath = path.join(projectPath, "package.json");
44
+ if (fs.existsSync(packageJsonPath)) {
45
+ try {
46
+ const content = fs.readFileSync(packageJsonPath, "utf-8");
47
+ const pkg = JSON.parse(content);
48
+ const allDeps = { ...pkg.dependencies, ...pkg.devDependencies };
49
+ const detectedTechs = [];
50
+ Object.keys(allDeps).forEach((dep) => {
51
+ if (techMap[dep]) {
52
+ const tech = techMap[dep];
53
+ let color = null;
54
+ if (options.color === "white") color = "#FFFFFF";
55
+ else if (options.color === "black") color = "#000000";
56
+ else if (options.color && options.color.startsWith("#")) color = options.color;
57
+ else {
58
+ const depSlug = dep.toLowerCase();
59
+ const nameSlug = tech.name.toLowerCase();
60
+ const nameSlugNoSpaces = tech.name.toLowerCase().replace(/\s+/g, "");
61
+ const hex = simple_icons_hex_default[depSlug] || simple_icons_hex_default[nameSlug] || simple_icons_hex_default[nameSlugNoSpaces];
62
+ if (hex) color = `#${hex}`;
63
+ }
64
+ detectedTechs.push({
65
+ name: tech.name,
66
+ slug: dep,
67
+ logo: `https://raw.githubusercontent.com/benjamindotdev/stacksync/main/assets/logos/${tech.logo}`,
68
+ color
69
+ });
70
+ }
71
+ });
72
+ const uniqueTechs = Array.from(new Set(detectedTechs.map((t) => t.slug))).map((slug) => detectedTechs.find((t) => t.slug === slug));
73
+ const outputFolderName = toCamelCase(dir.name);
74
+ const projectOutputDir = path.join(OUTPUT_DIR, outputFolderName);
75
+ if (!fs.existsSync(projectOutputDir)) {
76
+ fs.mkdirSync(projectOutputDir, { recursive: true });
77
+ }
78
+ fs.writeFileSync(
79
+ path.join(projectOutputDir, "stack.json"),
80
+ JSON.stringify(uniqueTechs, null, 2)
81
+ );
82
+ const mdContent = generateMarkdown(uniqueTechs);
83
+ fs.writeFileSync(path.join(projectOutputDir, "stack.md"), mdContent);
84
+ const readmePath = path.join(projectPath, "README.md");
85
+ if (fs.existsSync(readmePath)) {
86
+ let readmeContent = fs.readFileSync(readmePath, "utf-8");
87
+ const startMarker = "<!-- STACKSYNC_START -->";
88
+ const endMarker = "<!-- STACKSYNC_END -->";
89
+ const newSection = `${startMarker}
90
+ ${mdContent}
91
+ ${endMarker}`;
92
+ if (readmeContent.includes(startMarker) && readmeContent.includes(endMarker)) {
93
+ const regex = new RegExp(`${startMarker}[\\s\\S]*?${endMarker}`);
94
+ readmeContent = readmeContent.replace(regex, newSection);
95
+ console.log(`\u{1F4DD} Updated README.md for ${dir.name}`);
96
+ } else {
97
+ readmeContent += `
98
+
99
+ ${newSection}`;
100
+ console.log(`\u{1F4DD} Appended to README.md for ${dir.name}`);
101
+ }
102
+ fs.writeFileSync(readmePath, readmeContent);
103
+ }
104
+ console.log(`\u2705 ${dir.name.padEnd(20)} -> ${outputFolderName}/stack.json (${uniqueTechs.length} techs)`);
105
+ } catch (err) {
106
+ console.error(`\u274C Error processing ${dir.name}:`, err.message);
107
+ }
108
+ } else {
109
+ console.warn(`\u26A0\uFE0F Skipping "${dir.name}": No package.json found.`);
110
+ }
111
+ }
112
+ console.log("\n\u2728 Batch import complete.");
113
+ }
114
+
115
+ export {
116
+ batchImport
117
+ };
@@ -0,0 +1,89 @@
1
+ import {
2
+ techMap
3
+ } from "./chunk-D2DOGM2Y.mjs";
4
+ import {
5
+ simple_icons_hex_default
6
+ } from "./chunk-7TIXAYVC.mjs";
7
+
8
+ // src/batch-import.ts
9
+ import fs from "fs";
10
+ import path from "path";
11
+ var INPUT_DIR = path.join(process.cwd(), "stacksync", "input");
12
+ var OUTPUT_DIR = path.join(process.cwd(), "stacksync", "output");
13
+ function toCamelCase(str) {
14
+ return str.replace(/[^a-zA-Z0-9 ]/g, "").split(" ").map((word, index) => {
15
+ if (index === 0) return word.toLowerCase();
16
+ return word.charAt(0).toUpperCase() + word.slice(1).toLowerCase();
17
+ }).join("");
18
+ }
19
+ async function batchImport(options = {}) {
20
+ console.log("\u{1F680} Starting Batch Import...");
21
+ if (options.color) {
22
+ console.log(`\u{1F3A8} Color mode: ${options.color}`);
23
+ }
24
+ if (!fs.existsSync(INPUT_DIR)) {
25
+ console.log(`Creating input directory at: ${INPUT_DIR}`);
26
+ fs.mkdirSync(INPUT_DIR, { recursive: true });
27
+ console.log('Please place your project folders inside "stacksync/input" and run this command again.');
28
+ process.exit(0);
29
+ }
30
+ const entries = fs.readdirSync(INPUT_DIR, { withFileTypes: true });
31
+ const projectDirs = entries.filter((dirent) => dirent.isDirectory());
32
+ if (projectDirs.length === 0) {
33
+ console.log('\u26A0\uFE0F No project directories found in "stacksync/input".');
34
+ return;
35
+ }
36
+ console.log(`Found ${projectDirs.length} projects to process.
37
+ `);
38
+ for (const dir of projectDirs) {
39
+ const projectPath = path.join(INPUT_DIR, dir.name);
40
+ const packageJsonPath = path.join(projectPath, "package.json");
41
+ if (fs.existsSync(packageJsonPath)) {
42
+ try {
43
+ const content = fs.readFileSync(packageJsonPath, "utf-8");
44
+ const pkg = JSON.parse(content);
45
+ const allDeps = { ...pkg.dependencies, ...pkg.devDependencies };
46
+ const detectedTechs = [];
47
+ Object.keys(allDeps).forEach((dep) => {
48
+ if (techMap[dep]) {
49
+ const tech = techMap[dep];
50
+ let color = null;
51
+ if (options.color === "white") color = "#FFFFFF";
52
+ else if (options.color === "black") color = "#000000";
53
+ else if (options.color && options.color.startsWith("#")) color = options.color;
54
+ else {
55
+ const hex = simple_icons_hex_default[dep] || simple_icons_hex_default[tech.name.toLowerCase()];
56
+ if (hex) color = `#${hex}`;
57
+ }
58
+ detectedTechs.push({
59
+ name: tech.name,
60
+ slug: dep,
61
+ logo: `https://raw.githubusercontent.com/benjamindotdev/stacksync/main/assets/logos/${tech.logo}`,
62
+ color
63
+ });
64
+ }
65
+ });
66
+ const uniqueTechs = Array.from(new Set(detectedTechs.map((t) => t.slug))).map((slug) => detectedTechs.find((t) => t.slug === slug));
67
+ const outputFolderName = toCamelCase(dir.name);
68
+ const projectOutputDir = path.join(OUTPUT_DIR, outputFolderName);
69
+ if (!fs.existsSync(projectOutputDir)) {
70
+ fs.mkdirSync(projectOutputDir, { recursive: true });
71
+ }
72
+ fs.writeFileSync(
73
+ path.join(projectOutputDir, "stack.json"),
74
+ JSON.stringify(uniqueTechs, null, 2)
75
+ );
76
+ console.log(`\u2705 ${dir.name.padEnd(20)} -> ${outputFolderName}/stack.json (${uniqueTechs.length} techs)`);
77
+ } catch (err) {
78
+ console.error(`\u274C Error processing ${dir.name}:`, err.message);
79
+ }
80
+ } else {
81
+ console.warn(`\u26A0\uFE0F Skipping "${dir.name}": No package.json found.`);
82
+ }
83
+ }
84
+ console.log("\n\u2728 Batch import complete.");
85
+ }
86
+
87
+ export {
88
+ batchImport
89
+ };
@@ -0,0 +1,92 @@
1
+ import {
2
+ techMap
3
+ } from "./chunk-D2DOGM2Y.mjs";
4
+ import {
5
+ simple_icons_hex_default
6
+ } from "./chunk-7TIXAYVC.mjs";
7
+
8
+ // src/batch-import.ts
9
+ import fs from "fs";
10
+ import path from "path";
11
+ var INPUT_DIR = path.join(process.cwd(), "stacksync", "input");
12
+ var OUTPUT_DIR = path.join(process.cwd(), "stacksync", "output");
13
+ function toCamelCase(str) {
14
+ return str.replace(/[^a-zA-Z0-9 ]/g, "").split(" ").map((word, index) => {
15
+ if (index === 0) return word.toLowerCase();
16
+ return word.charAt(0).toUpperCase() + word.slice(1).toLowerCase();
17
+ }).join("");
18
+ }
19
+ async function batchImport(options = {}) {
20
+ console.log("\u{1F680} Starting Batch Import...");
21
+ if (options.color) {
22
+ console.log(`\u{1F3A8} Color mode: ${options.color}`);
23
+ }
24
+ if (!fs.existsSync(INPUT_DIR)) {
25
+ console.log(`Creating input directory at: ${INPUT_DIR}`);
26
+ fs.mkdirSync(INPUT_DIR, { recursive: true });
27
+ console.log('Please place your project folders inside "stacksync/input" and run this command again.');
28
+ process.exit(0);
29
+ }
30
+ const entries = fs.readdirSync(INPUT_DIR, { withFileTypes: true });
31
+ const projectDirs = entries.filter((dirent) => dirent.isDirectory());
32
+ if (projectDirs.length === 0) {
33
+ console.log('\u26A0\uFE0F No project directories found in "stacksync/input".');
34
+ return;
35
+ }
36
+ console.log(`Found ${projectDirs.length} projects to process.
37
+ `);
38
+ for (const dir of projectDirs) {
39
+ const projectPath = path.join(INPUT_DIR, dir.name);
40
+ const packageJsonPath = path.join(projectPath, "package.json");
41
+ if (fs.existsSync(packageJsonPath)) {
42
+ try {
43
+ const content = fs.readFileSync(packageJsonPath, "utf-8");
44
+ const pkg = JSON.parse(content);
45
+ const allDeps = { ...pkg.dependencies, ...pkg.devDependencies };
46
+ const detectedTechs = [];
47
+ Object.keys(allDeps).forEach((dep) => {
48
+ if (techMap[dep]) {
49
+ const tech = techMap[dep];
50
+ let color = null;
51
+ if (options.color === "white") color = "#FFFFFF";
52
+ else if (options.color === "black") color = "#000000";
53
+ else if (options.color && options.color.startsWith("#")) color = options.color;
54
+ else {
55
+ const depSlug = dep.toLowerCase();
56
+ const nameSlug = tech.name.toLowerCase();
57
+ const nameSlugNoSpaces = tech.name.toLowerCase().replace(/\s+/g, "");
58
+ const hex = simple_icons_hex_default[depSlug] || simple_icons_hex_default[nameSlug] || simple_icons_hex_default[nameSlugNoSpaces];
59
+ if (hex) color = `#${hex}`;
60
+ }
61
+ detectedTechs.push({
62
+ name: tech.name,
63
+ slug: dep,
64
+ logo: `https://raw.githubusercontent.com/benjamindotdev/stacksync/main/assets/logos/${tech.logo}`,
65
+ color
66
+ });
67
+ }
68
+ });
69
+ const uniqueTechs = Array.from(new Set(detectedTechs.map((t) => t.slug))).map((slug) => detectedTechs.find((t) => t.slug === slug));
70
+ const outputFolderName = toCamelCase(dir.name);
71
+ const projectOutputDir = path.join(OUTPUT_DIR, outputFolderName);
72
+ if (!fs.existsSync(projectOutputDir)) {
73
+ fs.mkdirSync(projectOutputDir, { recursive: true });
74
+ }
75
+ fs.writeFileSync(
76
+ path.join(projectOutputDir, "stack.json"),
77
+ JSON.stringify(uniqueTechs, null, 2)
78
+ );
79
+ console.log(`\u2705 ${dir.name.padEnd(20)} -> ${outputFolderName}/stack.json (${uniqueTechs.length} techs)`);
80
+ } catch (err) {
81
+ console.error(`\u274C Error processing ${dir.name}:`, err.message);
82
+ }
83
+ } else {
84
+ console.warn(`\u26A0\uFE0F Skipping "${dir.name}": No package.json found.`);
85
+ }
86
+ }
87
+ console.log("\n\u2728 Batch import complete.");
88
+ }
89
+
90
+ export {
91
+ batchImport
92
+ };