codedna 0.2.0__tar.gz → 0.2.1__tar.gz

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 (353) hide show
  1. codedna-0.2.1/.env.ls +6 -0
  2. {codedna-0.2.0 → codedna-0.2.1}/PKG-INFO +1 -1
  3. {codedna-0.2.0 → codedna-0.2.1}/codedna/plan.py +12 -4
  4. codedna-0.2.1/dashboard/app/api/billing/checkout/route.ts +49 -0
  5. {codedna-0.2.0 → codedna-0.2.1}/dashboard/app/billing/page.tsx +98 -10
  6. {codedna-0.2.0 → codedna-0.2.1}/dashboard/app/pricing/page.tsx +108 -61
  7. {codedna-0.2.0 → codedna-0.2.1}/dashboard/lib/i18n/en.ts +1 -0
  8. {codedna-0.2.0 → codedna-0.2.1}/dashboard/lib/i18n/tr.ts +1 -0
  9. {codedna-0.2.0 → codedna-0.2.1}/pyproject.toml +1 -1
  10. codedna-0.2.0/dashboard/app/api/billing/checkout/route.ts +0 -47
  11. {codedna-0.2.0 → codedna-0.2.1}/.env.example +0 -0
  12. {codedna-0.2.0 → codedna-0.2.1}/.github/workflows/codedna.yml +0 -0
  13. {codedna-0.2.0 → codedna-0.2.1}/.gitignore +0 -0
  14. {codedna-0.2.0 → codedna-0.2.1}/.python-version +0 -0
  15. {codedna-0.2.0 → codedna-0.2.1}/README.md +0 -0
  16. {codedna-0.2.0 → codedna-0.2.1}/codedna/__init__.py +0 -0
  17. {codedna-0.2.0 → codedna-0.2.1}/codedna/ai_fingerprint.py +0 -0
  18. {codedna-0.2.0 → codedna-0.2.1}/codedna/analyzer.py +0 -0
  19. {codedna-0.2.0 → codedna-0.2.1}/codedna/api.py +0 -0
  20. {codedna-0.2.0 → codedna-0.2.1}/codedna/auth.py +0 -0
  21. {codedna-0.2.0 → codedna-0.2.1}/codedna/bus_factor.py +0 -0
  22. {codedna-0.2.0 → codedna-0.2.1}/codedna/cli.py +0 -0
  23. {codedna-0.2.0 → codedna-0.2.1}/codedna/db.py +0 -0
  24. {codedna-0.2.0 → codedna-0.2.1}/codedna/git_hook.py +0 -0
  25. {codedna-0.2.0 → codedna-0.2.1}/codedna/integrations/__init__.py +0 -0
  26. {codedna-0.2.0 → codedna-0.2.1}/codedna/integrations/github_bot.py +0 -0
  27. {codedna-0.2.0 → codedna-0.2.1}/codedna/integrations/jira.py +0 -0
  28. {codedna-0.2.0 → codedna-0.2.1}/codedna/integrations/lemonsqueezy.py +0 -0
  29. {codedna-0.2.0 → codedna-0.2.1}/codedna/interview.py +0 -0
  30. {codedna-0.2.0 → codedna-0.2.1}/codedna/onboarding.py +0 -0
  31. {codedna-0.2.0 → codedna-0.2.1}/codedna/protection.py +0 -0
  32. {codedna-0.2.0 → codedna-0.2.1}/codedna/rate_limit.py +0 -0
  33. {codedna-0.2.0 → codedna-0.2.1}/codedna/scorer.py +0 -0
  34. {codedna-0.2.0 → codedna-0.2.1}/codedna/sprint_health.py +0 -0
  35. {codedna-0.2.0 → codedna-0.2.1}/codedna/survey.py +0 -0
  36. {codedna-0.2.0 → codedna-0.2.1}/codedna/tech_debt.py +0 -0
  37. {codedna-0.2.0 → codedna-0.2.1}/dashboard/.env.local.example +0 -0
  38. {codedna-0.2.0 → codedna-0.2.1}/dashboard/.gitignore +0 -0
  39. {codedna-0.2.0 → codedna-0.2.1}/dashboard/README.md +0 -0
  40. {codedna-0.2.0 → codedna-0.2.1}/dashboard/app/ai-compare/page.tsx +0 -0
  41. {codedna-0.2.0 → codedna-0.2.1}/dashboard/app/api/auth/login/route.ts +0 -0
  42. {codedna-0.2.0 → codedna-0.2.1}/dashboard/app/api/auth/logout/route.ts +0 -0
  43. {codedna-0.2.0 → codedna-0.2.1}/dashboard/app/api/auth/me/route.ts +0 -0
  44. {codedna-0.2.0 → codedna-0.2.1}/dashboard/app/api/auth/register/route.ts +0 -0
  45. {codedna-0.2.0 → codedna-0.2.1}/dashboard/app/bus-factor/page.tsx +0 -0
  46. {codedna-0.2.0 → codedna-0.2.1}/dashboard/app/commits/page.tsx +0 -0
  47. {codedna-0.2.0 → codedna-0.2.1}/dashboard/app/debt/page.tsx +0 -0
  48. {codedna-0.2.0 → codedna-0.2.1}/dashboard/app/favicon.ico +0 -0
  49. {codedna-0.2.0 → codedna-0.2.1}/dashboard/app/files/page.tsx +0 -0
  50. {codedna-0.2.0 → codedna-0.2.1}/dashboard/app/fonts/GeistMonoVF.woff +0 -0
  51. {codedna-0.2.0 → codedna-0.2.1}/dashboard/app/fonts/GeistVF.woff +0 -0
  52. {codedna-0.2.0 → codedna-0.2.1}/dashboard/app/globals.css +0 -0
  53. {codedna-0.2.0 → codedna-0.2.1}/dashboard/app/interview/page.tsx +0 -0
  54. {codedna-0.2.0 → codedna-0.2.1}/dashboard/app/layout.tsx +0 -0
  55. {codedna-0.2.0 → codedna-0.2.1}/dashboard/app/login/page.tsx +0 -0
  56. {codedna-0.2.0 → codedna-0.2.1}/dashboard/app/onboarding/page.tsx +0 -0
  57. {codedna-0.2.0 → codedna-0.2.1}/dashboard/app/page.tsx +0 -0
  58. {codedna-0.2.0 → codedna-0.2.1}/dashboard/app/protected/page.tsx +0 -0
  59. {codedna-0.2.0 → codedna-0.2.1}/dashboard/app/register/page.tsx +0 -0
  60. {codedna-0.2.0 → codedna-0.2.1}/dashboard/app/settings/integrations/page.tsx +0 -0
  61. {codedna-0.2.0 → codedna-0.2.1}/dashboard/app/sprints/page.tsx +0 -0
  62. {codedna-0.2.0 → codedna-0.2.1}/dashboard/components/AnlamaGrafigi.tsx +0 -0
  63. {codedna-0.2.0 → codedna-0.2.1}/dashboard/components/AuthProvider.tsx +0 -0
  64. {codedna-0.2.0 → codedna-0.2.1}/dashboard/components/ClientProviders.tsx +0 -0
  65. {codedna-0.2.0 → codedna-0.2.1}/dashboard/components/CommitTable.tsx +0 -0
  66. {codedna-0.2.0 → codedna-0.2.1}/dashboard/components/CostInfoTooltip.tsx +0 -0
  67. {codedna-0.2.0 → codedna-0.2.1}/dashboard/components/FeatureGate.tsx +0 -0
  68. {codedna-0.2.0 → codedna-0.2.1}/dashboard/components/FileHeatmap.tsx +0 -0
  69. {codedna-0.2.0 → codedna-0.2.1}/dashboard/components/HataBanner.tsx +0 -0
  70. {codedna-0.2.0 → codedna-0.2.1}/dashboard/components/LanguageSwitcher.tsx +0 -0
  71. {codedna-0.2.0 → codedna-0.2.1}/dashboard/components/NavClient.tsx +0 -0
  72. {codedna-0.2.0 → codedna-0.2.1}/dashboard/components/OverviewTitles.tsx +0 -0
  73. {codedna-0.2.0 → codedna-0.2.1}/dashboard/components/QuickInsights.tsx +0 -0
  74. {codedna-0.2.0 → codedna-0.2.1}/dashboard/components/RiskBadge.tsx +0 -0
  75. {codedna-0.2.0 → codedna-0.2.1}/dashboard/components/SummaryCards.tsx +0 -0
  76. {codedna-0.2.0 → codedna-0.2.1}/dashboard/components/UpgradeBanner.tsx +0 -0
  77. {codedna-0.2.0 → codedna-0.2.1}/dashboard/lib/api.ts +0 -0
  78. {codedna-0.2.0 → codedna-0.2.1}/dashboard/lib/auth.ts +0 -0
  79. {codedna-0.2.0 → codedna-0.2.1}/dashboard/lib/i18n/index.tsx +0 -0
  80. {codedna-0.2.0 → codedna-0.2.1}/dashboard/lib/plan.ts +0 -0
  81. {codedna-0.2.0 → codedna-0.2.1}/dashboard/next-env.d.ts +0 -0
  82. {codedna-0.2.0 → codedna-0.2.1}/dashboard/next.config.mjs +0 -0
  83. {codedna-0.2.0 → codedna-0.2.1}/dashboard/package-lock.json +0 -0
  84. {codedna-0.2.0 → codedna-0.2.1}/dashboard/package.json +0 -0
  85. {codedna-0.2.0 → codedna-0.2.1}/dashboard/postcss.config.mjs +0 -0
  86. {codedna-0.2.0 → codedna-0.2.1}/dashboard/tailwind.config.ts +0 -0
  87. {codedna-0.2.0 → codedna-0.2.1}/dashboard/tsconfig.json +0 -0
  88. {codedna-0.2.0 → codedna-0.2.1}/hooks/post-commit +0 -0
  89. {codedna-0.2.0 → codedna-0.2.1}/uv.lock +0 -0
  90. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/.bin/tsc +0 -0
  91. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/.bin/tsserver +0 -0
  92. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/.package-lock.json +0 -0
  93. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/@types/node/LICENSE +0 -0
  94. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/@types/node/README.md +0 -0
  95. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/@types/node/assert/strict.d.ts +0 -0
  96. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/@types/node/assert.d.ts +0 -0
  97. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/@types/node/async_hooks.d.ts +0 -0
  98. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/@types/node/buffer.buffer.d.ts +0 -0
  99. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/@types/node/buffer.d.ts +0 -0
  100. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/@types/node/child_process.d.ts +0 -0
  101. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/@types/node/cluster.d.ts +0 -0
  102. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/@types/node/compatibility/disposable.d.ts +0 -0
  103. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/@types/node/compatibility/index.d.ts +0 -0
  104. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/@types/node/compatibility/indexable.d.ts +0 -0
  105. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/@types/node/compatibility/iterators.d.ts +0 -0
  106. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/@types/node/console.d.ts +0 -0
  107. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/@types/node/constants.d.ts +0 -0
  108. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/@types/node/crypto.d.ts +0 -0
  109. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/@types/node/dgram.d.ts +0 -0
  110. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/@types/node/diagnostics_channel.d.ts +0 -0
  111. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/@types/node/dns/promises.d.ts +0 -0
  112. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/@types/node/dns.d.ts +0 -0
  113. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/@types/node/domain.d.ts +0 -0
  114. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/@types/node/events.d.ts +0 -0
  115. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/@types/node/fs/promises.d.ts +0 -0
  116. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/@types/node/fs.d.ts +0 -0
  117. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/@types/node/globals.d.ts +0 -0
  118. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/@types/node/globals.typedarray.d.ts +0 -0
  119. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/@types/node/http.d.ts +0 -0
  120. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/@types/node/http2.d.ts +0 -0
  121. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/@types/node/https.d.ts +0 -0
  122. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/@types/node/index.d.ts +0 -0
  123. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/@types/node/inspector.generated.d.ts +0 -0
  124. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/@types/node/module.d.ts +0 -0
  125. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/@types/node/net.d.ts +0 -0
  126. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/@types/node/os.d.ts +0 -0
  127. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/@types/node/package.json +0 -0
  128. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/@types/node/path.d.ts +0 -0
  129. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/@types/node/perf_hooks.d.ts +0 -0
  130. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/@types/node/process.d.ts +0 -0
  131. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/@types/node/punycode.d.ts +0 -0
  132. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/@types/node/querystring.d.ts +0 -0
  133. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/@types/node/readline/promises.d.ts +0 -0
  134. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/@types/node/readline.d.ts +0 -0
  135. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/@types/node/repl.d.ts +0 -0
  136. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/@types/node/sea.d.ts +0 -0
  137. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/@types/node/stream/consumers.d.ts +0 -0
  138. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/@types/node/stream/promises.d.ts +0 -0
  139. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/@types/node/stream/web.d.ts +0 -0
  140. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/@types/node/stream.d.ts +0 -0
  141. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/@types/node/string_decoder.d.ts +0 -0
  142. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/@types/node/test.d.ts +0 -0
  143. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/@types/node/timers/promises.d.ts +0 -0
  144. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/@types/node/timers.d.ts +0 -0
  145. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/@types/node/tls.d.ts +0 -0
  146. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/@types/node/trace_events.d.ts +0 -0
  147. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/@types/node/ts5.6/buffer.buffer.d.ts +0 -0
  148. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/@types/node/ts5.6/globals.typedarray.d.ts +0 -0
  149. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/@types/node/ts5.6/index.d.ts +0 -0
  150. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/@types/node/tty.d.ts +0 -0
  151. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/@types/node/url.d.ts +0 -0
  152. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/@types/node/util.d.ts +0 -0
  153. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/@types/node/v8.d.ts +0 -0
  154. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/@types/node/vm.d.ts +0 -0
  155. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/@types/node/wasi.d.ts +0 -0
  156. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/@types/node/web-globals/abortcontroller.d.ts +0 -0
  157. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/@types/node/web-globals/domexception.d.ts +0 -0
  158. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/@types/node/web-globals/events.d.ts +0 -0
  159. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/@types/node/web-globals/fetch.d.ts +0 -0
  160. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/@types/node/worker_threads.d.ts +0 -0
  161. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/@types/node/zlib.d.ts +0 -0
  162. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/@types/vscode/LICENSE +0 -0
  163. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/@types/vscode/README.md +0 -0
  164. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/@types/vscode/index.d.ts +0 -0
  165. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/@types/vscode/package.json +0 -0
  166. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/LICENSE.txt +0 -0
  167. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/README.md +0 -0
  168. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/SECURITY.md +0 -0
  169. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/ThirdPartyNoticeText.txt +0 -0
  170. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/bin/tsc +0 -0
  171. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/bin/tsserver +0 -0
  172. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/_tsc.js +0 -0
  173. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/_tsserver.js +0 -0
  174. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/_typingsInstaller.js +0 -0
  175. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/cs/diagnosticMessages.generated.json +0 -0
  176. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/de/diagnosticMessages.generated.json +0 -0
  177. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/es/diagnosticMessages.generated.json +0 -0
  178. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/fr/diagnosticMessages.generated.json +0 -0
  179. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/it/diagnosticMessages.generated.json +0 -0
  180. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/ja/diagnosticMessages.generated.json +0 -0
  181. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/ko/diagnosticMessages.generated.json +0 -0
  182. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.d.ts +0 -0
  183. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.decorators.d.ts +0 -0
  184. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.decorators.legacy.d.ts +0 -0
  185. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.dom.asynciterable.d.ts +0 -0
  186. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.dom.d.ts +0 -0
  187. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.dom.iterable.d.ts +0 -0
  188. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2015.collection.d.ts +0 -0
  189. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2015.core.d.ts +0 -0
  190. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2015.d.ts +0 -0
  191. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2015.generator.d.ts +0 -0
  192. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2015.iterable.d.ts +0 -0
  193. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2015.promise.d.ts +0 -0
  194. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2015.proxy.d.ts +0 -0
  195. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2015.reflect.d.ts +0 -0
  196. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2015.symbol.d.ts +0 -0
  197. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts +0 -0
  198. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2016.array.include.d.ts +0 -0
  199. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2016.d.ts +0 -0
  200. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2016.full.d.ts +0 -0
  201. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2016.intl.d.ts +0 -0
  202. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts +0 -0
  203. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2017.d.ts +0 -0
  204. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2017.date.d.ts +0 -0
  205. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2017.full.d.ts +0 -0
  206. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2017.intl.d.ts +0 -0
  207. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2017.object.d.ts +0 -0
  208. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts +0 -0
  209. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2017.string.d.ts +0 -0
  210. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2017.typedarrays.d.ts +0 -0
  211. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts +0 -0
  212. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2018.asynciterable.d.ts +0 -0
  213. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2018.d.ts +0 -0
  214. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2018.full.d.ts +0 -0
  215. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2018.intl.d.ts +0 -0
  216. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2018.promise.d.ts +0 -0
  217. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2018.regexp.d.ts +0 -0
  218. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2019.array.d.ts +0 -0
  219. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2019.d.ts +0 -0
  220. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2019.full.d.ts +0 -0
  221. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2019.intl.d.ts +0 -0
  222. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2019.object.d.ts +0 -0
  223. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2019.string.d.ts +0 -0
  224. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2019.symbol.d.ts +0 -0
  225. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2020.bigint.d.ts +0 -0
  226. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2020.d.ts +0 -0
  227. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2020.date.d.ts +0 -0
  228. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2020.full.d.ts +0 -0
  229. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2020.intl.d.ts +0 -0
  230. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2020.number.d.ts +0 -0
  231. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2020.promise.d.ts +0 -0
  232. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts +0 -0
  233. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2020.string.d.ts +0 -0
  234. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts +0 -0
  235. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2021.d.ts +0 -0
  236. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2021.full.d.ts +0 -0
  237. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2021.intl.d.ts +0 -0
  238. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2021.promise.d.ts +0 -0
  239. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2021.string.d.ts +0 -0
  240. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2021.weakref.d.ts +0 -0
  241. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2022.array.d.ts +0 -0
  242. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2022.d.ts +0 -0
  243. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2022.error.d.ts +0 -0
  244. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2022.full.d.ts +0 -0
  245. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2022.intl.d.ts +0 -0
  246. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2022.object.d.ts +0 -0
  247. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2022.regexp.d.ts +0 -0
  248. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2022.string.d.ts +0 -0
  249. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2023.array.d.ts +0 -0
  250. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2023.collection.d.ts +0 -0
  251. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2023.d.ts +0 -0
  252. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2023.full.d.ts +0 -0
  253. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2023.intl.d.ts +0 -0
  254. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2024.arraybuffer.d.ts +0 -0
  255. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2024.collection.d.ts +0 -0
  256. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2024.d.ts +0 -0
  257. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2024.full.d.ts +0 -0
  258. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2024.object.d.ts +0 -0
  259. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2024.promise.d.ts +0 -0
  260. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2024.regexp.d.ts +0 -0
  261. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2024.sharedmemory.d.ts +0 -0
  262. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2024.string.d.ts +0 -0
  263. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es5.d.ts +0 -0
  264. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es6.d.ts +0 -0
  265. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.esnext.array.d.ts +0 -0
  266. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.esnext.collection.d.ts +0 -0
  267. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.esnext.d.ts +0 -0
  268. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.esnext.decorators.d.ts +0 -0
  269. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.esnext.disposable.d.ts +0 -0
  270. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.esnext.error.d.ts +0 -0
  271. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.esnext.float16.d.ts +0 -0
  272. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.esnext.full.d.ts +0 -0
  273. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.esnext.intl.d.ts +0 -0
  274. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.esnext.iterator.d.ts +0 -0
  275. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.esnext.promise.d.ts +0 -0
  276. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.esnext.sharedmemory.d.ts +0 -0
  277. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.scripthost.d.ts +0 -0
  278. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.webworker.asynciterable.d.ts +0 -0
  279. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.webworker.d.ts +0 -0
  280. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.webworker.importscripts.d.ts +0 -0
  281. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.webworker.iterable.d.ts +0 -0
  282. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/pl/diagnosticMessages.generated.json +0 -0
  283. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/pt-br/diagnosticMessages.generated.json +0 -0
  284. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/ru/diagnosticMessages.generated.json +0 -0
  285. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/tr/diagnosticMessages.generated.json +0 -0
  286. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/tsc.js +0 -0
  287. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/tsserver.js +0 -0
  288. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/tsserverlibrary.d.ts +0 -0
  289. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/tsserverlibrary.js +0 -0
  290. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/typesMap.json +0 -0
  291. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/typescript.d.ts +0 -0
  292. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/typescript.js +0 -0
  293. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/typingsInstaller.js +0 -0
  294. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/watchGuard.js +0 -0
  295. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/zh-cn/diagnosticMessages.generated.json +0 -0
  296. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/zh-tw/diagnosticMessages.generated.json +0 -0
  297. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/package.json +0 -0
  298. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/undici-types/LICENSE +0 -0
  299. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/undici-types/README.md +0 -0
  300. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/undici-types/agent.d.ts +0 -0
  301. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/undici-types/api.d.ts +0 -0
  302. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/undici-types/balanced-pool.d.ts +0 -0
  303. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/undici-types/cache.d.ts +0 -0
  304. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/undici-types/client.d.ts +0 -0
  305. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/undici-types/connector.d.ts +0 -0
  306. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/undici-types/content-type.d.ts +0 -0
  307. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/undici-types/cookies.d.ts +0 -0
  308. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/undici-types/diagnostics-channel.d.ts +0 -0
  309. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/undici-types/dispatcher.d.ts +0 -0
  310. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/undici-types/env-http-proxy-agent.d.ts +0 -0
  311. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/undici-types/errors.d.ts +0 -0
  312. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/undici-types/eventsource.d.ts +0 -0
  313. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/undici-types/fetch.d.ts +0 -0
  314. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/undici-types/file.d.ts +0 -0
  315. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/undici-types/filereader.d.ts +0 -0
  316. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/undici-types/formdata.d.ts +0 -0
  317. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/undici-types/global-dispatcher.d.ts +0 -0
  318. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/undici-types/global-origin.d.ts +0 -0
  319. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/undici-types/handlers.d.ts +0 -0
  320. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/undici-types/header.d.ts +0 -0
  321. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/undici-types/index.d.ts +0 -0
  322. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/undici-types/interceptors.d.ts +0 -0
  323. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/undici-types/mock-agent.d.ts +0 -0
  324. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/undici-types/mock-client.d.ts +0 -0
  325. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/undici-types/mock-errors.d.ts +0 -0
  326. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/undici-types/mock-interceptor.d.ts +0 -0
  327. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/undici-types/mock-pool.d.ts +0 -0
  328. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/undici-types/package.json +0 -0
  329. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/undici-types/patch.d.ts +0 -0
  330. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/undici-types/pool-stats.d.ts +0 -0
  331. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/undici-types/pool.d.ts +0 -0
  332. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/undici-types/proxy-agent.d.ts +0 -0
  333. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/undici-types/readable.d.ts +0 -0
  334. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/undici-types/retry-agent.d.ts +0 -0
  335. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/undici-types/retry-handler.d.ts +0 -0
  336. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/undici-types/util.d.ts +0 -0
  337. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/undici-types/webidl.d.ts +0 -0
  338. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/undici-types/websocket.d.ts +0 -0
  339. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/out/apiClient.js +0 -0
  340. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/out/apiClient.js.map +0 -0
  341. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/out/decorations.js +0 -0
  342. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/out/decorations.js.map +0 -0
  343. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/out/extension.js +0 -0
  344. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/out/extension.js.map +0 -0
  345. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/out/statusBar.js +0 -0
  346. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/out/statusBar.js.map +0 -0
  347. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/package-lock.json +0 -0
  348. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/package.json +0 -0
  349. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/src/apiClient.ts +0 -0
  350. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/src/decorations.ts +0 -0
  351. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/src/extension.ts +0 -0
  352. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/src/statusBar.ts +0 -0
  353. {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/tsconfig.json +0 -0
codedna-0.2.1/.env.ls ADDED
@@ -0,0 +1,6 @@
1
+ LEMONSQUEEZY_API_KEY=eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiI5NGQ1OWNlZi1kYmI4LTRlYTUtYjE3OC1kMjU0MGZjZDY5MTkiLCJqdGkiOiJjNDRkOTE2Y2VkMTkzYWY4Y2YxYzE0NWNiOWFkZGQwMDhkYjI3MjFmN2RjMTY2YmY2ZjZmYzYzMjk2YWQ1MDIyMzExMTNhNWY0OTYwYjQ0MCIsImlhdCI6MTc4MjIzMzAxNC43NTY5MzYsIm5iZiI6MTc4MjIzMzAxNC43NTY5MzgsImV4cCI6MTc5Nzk4NDAwMC4wNDM2ODcsInN1YiI6Ijc0NTI2NzIiLCJzY29wZXMiOltdfQ.RpIFrkd63uqxWvY52AdyT84kKaN703-OkMr58bp0_60ro9-LhgpKyJY1fjCqO4Fb4ikubUerACTJy-NBkZXJMPaJ7L3YYZvD9ZyuUN7Ui6R7ipQknSP8sii5TDhYCITEXjZHblC_l3z6x-K-AKkwu7_tJKt2aeJK0nas31fkvdvh1JAX9F7KzkxWUCOYKSCMEXmjM07-l4Rs4_mLV06cu-DHpWWwgGd92RV13CPDZ8MGeI8Wp8qLuWVgFXAw--6uo1O3jlepZYltUAuBZN8hS_jyf05oBVoCCiB4N8yr59ejLCbRA6JQEydY7VqbPwmsqPg9FgdIP0Z3QScLZyOi4Enf6S65nKk0IShPT9DYpwyqQ52za1ibvxQhlI72w9MVvf2aInF-AknkM4ABw73JQf-R_kX7EMOtkXm7SlXy7XfirFBgrg2wmKw-lOodm6qAoWX98Q7p_En58PRka671GPziNebeUNXPmezlLG3BG3MJTWExQO8ljw_pAcETcvl6u--NqnSmi4bw6aFaWUuXNIa0-z87g3p6H0831yFbjjslBNWiRpwrhnJSx-4NyDIpleZR0iQde_5lyEU-eDIG8V9V-lKjSxLDgjiJLD-8dIsZGHz0bVRhgCAvs-QdzVr9eGGe0MEtizhEqr3CUX6YTR5DiPSHM5xRMdbqmsV6vTo
2
+ LEMONSQUEEZY_STORE_ID=415918
3
+ LEMONSQUEEZY_WEBHOOK_SECRET=webhook-test-secret-1234567890
4
+ LS_VARIANT_PRO=1828791
5
+ LS_VARIANT_TEAM=1828772
6
+ LS_VARIANT_ENTERPRISE=1828714
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: codedna
3
- Version: 0.2.0
3
+ Version: 0.2.1
4
4
  Summary: AI kod şeffaflık aracı — her commit'te AI yazım oranını ve anlama skorunu ölçer
5
5
  Project-URL: Homepage, https://codedna.dev
6
6
  Project-URL: Repository, https://github.com/natureco-official/codedna
@@ -87,7 +87,9 @@ def activate_license(key: str) -> Plan:
87
87
  """
88
88
  Lisans anahtarını doğrula ve aktif et.
89
89
 
90
- Gerçek doğrulama Faz 9'da API üzerinden yapılacak.
90
+ Not: Lemon Squeezy lisans key API'si sağlamaz — satın alma checkout URL
91
+ üzerinden yapılır, webhook ile subscription_status güncellenir.
92
+
91
93
  Şimdilik anahtar formatına göre plan belirler:
92
94
  - 'CDNA-PRO-...' → pro
93
95
  - 'CDNA-TEAM-...' → team
@@ -100,6 +102,8 @@ def activate_license(key: str) -> Plan:
100
102
  Aktif edilen plan seviyesi
101
103
  """
102
104
  anahtar = key.upper().strip()
105
+
106
+ # Plan belirleme
103
107
  if anahtar.startswith("CDNA-PRO"):
104
108
  plan = Plan.PRO
105
109
  elif anahtar.startswith("CDNA-TEAM"):
@@ -109,13 +113,17 @@ def activate_license(key: str) -> Plan:
109
113
  else:
110
114
  raise ValueError(f"Geçersiz lisans anahtarı formatı: {key!r}")
111
115
 
112
- # Lisans dosyasını yaz
116
+ _write_license_file(plan, anahtar)
117
+ return plan
118
+
119
+
120
+ def _write_license_file(plan: Plan, key: str) -> None:
121
+ """Lisans dosyasını yaz."""
113
122
  _LISANS_YOLU.parent.mkdir(parents=True, exist_ok=True)
114
123
  _LISANS_YOLU.write_text(
115
- json.dumps({"plan": plan.value, "key": anahtar}, ensure_ascii=False, indent=2),
124
+ json.dumps({"plan": plan.value, "key": key}, ensure_ascii=False, indent=2),
116
125
  encoding="utf-8",
117
126
  )
118
- return plan
119
127
 
120
128
 
121
129
  def activate_demo_license(plan: Plan) -> Plan:
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Next.js API Route — Billing Checkout
3
+ * Cookie'deki JWT token'ı FastAPI'ye iletir.
4
+ */
5
+
6
+ import { NextRequest, NextResponse } from "next/server";
7
+
8
+ const API_URL = process.env.NEXT_PUBLIC_API_URL || "http://localhost:8000";
9
+
10
+ export async function POST(req: NextRequest) {
11
+ const govde = await req.json().catch(() => null);
12
+ if (!govde?.plan) {
13
+ return NextResponse.json({ detail: "Plan zorunlu." }, { status: 422 });
14
+ }
15
+
16
+ // Cookie'den token al
17
+ const token = req.cookies.get("codedna_token")?.value;
18
+ if (!token) {
19
+ return NextResponse.json({ detail: "Token gerekli." }, { status: 401 });
20
+ }
21
+
22
+ // FastAPI'ye ilet
23
+ try {
24
+ const yanit = await fetch(`${API_URL}/billing/checkout`, {
25
+ method: "POST",
26
+ headers: {
27
+ "Authorization": `Bearer ${token}`,
28
+ "Content-Type": "application/json",
29
+ },
30
+ body: JSON.stringify({ plan: govde.plan }),
31
+ });
32
+
33
+ const veri = await yanit.json();
34
+
35
+ if (!yanit.ok) {
36
+ return NextResponse.json(
37
+ { detail: veri.detail || "Bilinmeyen hata" },
38
+ { status: yanit.status }
39
+ );
40
+ }
41
+
42
+ return NextResponse.json(veri);
43
+ } catch (e) {
44
+ return NextResponse.json(
45
+ { detail: "API'ye bağlanılamadı." },
46
+ { status: 503 }
47
+ );
48
+ }
49
+ }
@@ -49,10 +49,16 @@ function PlanKarti({
49
49
  )}
50
50
  <div>
51
51
  <h3 className="text-white font-bold text-lg">{planAdi}</h3>
52
- <div className="mt-1 flex items-end gap-1">
53
- <span className="text-2xl font-bold text-white">${fiyat}</span>
54
- {fiyat !== "0" && fiyat !== "?" && (
55
- <span className="text-gray-500 text-sm mb-0.5">{t("pricing_per_month")}</span>
52
+ <div className="flex items-end gap-1">
53
+ {fiyat === "?" ? (
54
+ <span className="text-2xl font-bold text-white">{t("pricing_contact_sales").split(" ")[0]}</span>
55
+ ) : (
56
+ <>
57
+ <span className="text-2xl font-bold text-white">₺{fiyat}</span>
58
+ {fiyat !== "0" && (
59
+ <span className="text-gray-500 text-sm mb-0.5">{t("pricing_per_month")}</span>
60
+ )}
61
+ </>
56
62
  )}
57
63
  </div>
58
64
  </div>
@@ -67,7 +73,7 @@ function PlanKarti({
67
73
  </div>
68
74
  ) : plan === "enterprise" ? (
69
75
  <a
70
- href="mailto:hello@codedna.dev"
76
+ href="mailto:hello@natureco.me"
71
77
  className="w-full text-center py-2 px-3 rounded-xl border border-cyan-500 text-cyan-400 hover:bg-cyan-500/10 transition-colors text-sm font-medium"
72
78
  >
73
79
  {t("pricing_contact_sales")}
@@ -82,7 +88,7 @@ function PlanKarti({
82
88
  : "bg-gray-800 hover:bg-gray-700 text-white"
83
89
  }`}
84
90
  >
85
- {yukleniyor ? "..." : t("billing_upgrade")}
91
+ {yukleniyor ? "..." : `💳 ${t("billing_upgrade")}`}
86
92
  </button>
87
93
  )}
88
94
  </div>
@@ -117,6 +123,7 @@ export default function BillingSayfasi() {
117
123
  const [abonelik, setAbonelik] = useState<AbonelikVeri | null>(null);
118
124
  const [checkoutYukleniyor, setCheckoutYukleniyor] = useState(false);
119
125
  const [checkoutHata, setCheckoutHata] = useState("");
126
+ const [iptalYukleniyor, setIptalYukleniyor] = useState(false);
120
127
 
121
128
  useEffect(() => {
122
129
  // Cookie üzerinden abonelik bilgisi al
@@ -167,6 +174,36 @@ export default function BillingSayfasi() {
167
174
  }
168
175
  };
169
176
 
177
+ const handleIptal = async () => {
178
+ if (!confirm("Aboneliği iptal etmek istediğinize emin misiniz? Lemon Squeezy portalına yönlendirileceksiniz.")) {
179
+ return;
180
+ }
181
+ setIptalYukleniyor(true);
182
+ try {
183
+ // Müşteriyi Lemon Squeezy customer portal'a yönlendir
184
+ // Bu gerçek API ile yapılır (subscription cancel)
185
+ const res = await fetch("/api/billing/customer-portal", {
186
+ method: "POST",
187
+ credentials: "include",
188
+ });
189
+ if (res.ok) {
190
+ const data = await res.json();
191
+ if (data.url) {
192
+ window.location.href = data.url;
193
+ } else {
194
+ alert("Müşteri portalı oluşturulamadı. Daha sonra tekrar deneyin.");
195
+ }
196
+ } else {
197
+ // Henüz API yoksa - demo: sadece sayfayı yenile
198
+ alert("Müşteri portalı yakında hazır olacak. Şimdilik: codedna plan demo komutunu kullanabilirsiniz.");
199
+ }
200
+ } catch (e) {
201
+ alert("Hata: " + (e instanceof Error ? e.message : "Bilinmeyen"));
202
+ } finally {
203
+ setIptalYukleniyor(false);
204
+ }
205
+ };
206
+
170
207
  const mevcutPlan = abonelik?.plan ?? kullanici?.plan ?? "free";
171
208
  const abonelikDurum = abonelik?.subscription_status ?? "none";
172
209
 
@@ -233,13 +270,64 @@ export default function BillingSayfasi() {
233
270
  <span className="text-cyan-400">◈</span> {t("billing_upgrade")}
234
271
  </h2>
235
272
  <div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-4">
236
- <PlanKarti plan="free" fiyat="0" mevcutPlan={mevcutPlan} vurgulu={false} onYukselt={handleYukselt} yukleniyor={checkoutYukleniyor} t={t} />
237
- <PlanKarti plan="pro" fiyat="19" mevcutPlan={mevcutPlan} vurgulu={false} onYukselt={handleYukselt} yukleniyor={checkoutYukleniyor} t={t} />
238
- <PlanKarti plan="team" fiyat="49" mevcutPlan={mevcutPlan} vurgulu={true} onYukselt={handleYukselt} yukleniyor={checkoutYukleniyor} t={t} />
239
- <PlanKarti plan="enterprise" fiyat="?" mevcutPlan={mevcutPlan} vurgulu={false} onYukselt={handleYukselt} yukleniyor={checkoutYukleniyor} t={t} />
273
+ <PlanKarti plan="free" fiyat="0" mevcutPlan={mevcutPlan} vurgulu={false} onYukselt={handleYukselt} yukleniyor={checkoutYukleniyor} t={t} />
274
+ <PlanKarti plan="pro" fiyat="400" mevcutPlan={mevcutPlan} vurgulu={false} onYukselt={handleYukselt} yukleniyor={checkoutYukleniyor} t={t} />
275
+ <PlanKarti plan="team" fiyat="800" mevcutPlan={mevcutPlan} vurgulu={true} onYukselt={handleYukselt} yukleniyor={checkoutYukleniyor} t={t} />
276
+ <PlanKarti plan="enterprise" fiyat="1650" mevcutPlan={mevcutPlan} vurgulu={false} onYukselt={handleYukselt} yukleniyor={checkoutYukleniyor} t={t} />
240
277
  </div>
241
278
  </div>
242
279
 
280
+ {/* Abonelik Detayları */}
281
+ {abonelik && abonelikDurum === "active" && mevcutPlan !== "free" && (
282
+ <div className="bg-gray-900 border border-gray-800 rounded-xl p-5 space-y-4">
283
+ <h2 className="text-white font-semibold flex items-center gap-2">
284
+ <span className="text-cyan-400">◈</span> Abonelik Detayları
285
+ </h2>
286
+
287
+ <div className="grid grid-cols-1 sm:grid-cols-2 gap-3 text-sm">
288
+ <div>
289
+ <p className="text-gray-500 text-xs uppercase tracking-wider">Plan</p>
290
+ <p className="text-white font-semibold uppercase mt-0.5">{mevcutPlan}</p>
291
+ </div>
292
+ <div>
293
+ <p className="text-gray-500 text-xs uppercase tracking-wider">Durum</p>
294
+ <div className="mt-0.5">
295
+ <AbonelikDurum durum={abonelikDurum} t={t} />
296
+ </div>
297
+ </div>
298
+ <div>
299
+ <p className="text-gray-500 text-xs uppercase tracking-wider">Aylık Ücret</p>
300
+ <p className="text-white font-semibold mt-0.5">
301
+ ₺{mevcutPlan === "pro" ? "400" : mevcutPlan === "team" ? "800" : mevcutPlan === "enterprise" ? "1,650" : "—"}
302
+ </p>
303
+ </div>
304
+ <div>
305
+ <p className="text-gray-500 text-xs uppercase tracking-wider">Sonraki Ödeme</p>
306
+ <p className="text-white font-semibold mt-0.5">Aylık (otomatik)</p>
307
+ </div>
308
+ {abonelik?.lemonsqueezy_customer_id && (
309
+ <div className="sm:col-span-2">
310
+ <p className="text-gray-500 text-xs uppercase tracking-wider">Müşteri ID</p>
311
+ <p className="text-white font-mono text-xs mt-0.5">{abonelik.lemonsqueezy_customer_id}</p>
312
+ </div>
313
+ )}
314
+ </div>
315
+
316
+ <div className="pt-2 border-t border-gray-800 flex items-center justify-between">
317
+ <p className="text-xs text-gray-500">
318
+ İstediğiniz zaman iptal edebilirsiniz. Mevcut ay için ödeme yapılmış olur.
319
+ </p>
320
+ <button
321
+ onClick={handleIptal}
322
+ disabled={iptalYukleniyor}
323
+ className="bg-red-500/10 hover:bg-red-500/20 border border-red-500/30 text-red-400 text-sm font-semibold px-4 py-2 rounded-lg transition-colors disabled:opacity-50"
324
+ >
325
+ {iptalYukleniyor ? "..." : "Aboneliği İptal Et"}
326
+ </button>
327
+ </div>
328
+ </div>
329
+ )}
330
+
243
331
  {/* Pricing karşılaştırması linki */}
244
332
  <p className="text-center text-sm text-gray-600">
245
333
  Tüm özellikleri karşılaştırmak için{" "}
@@ -1,23 +1,28 @@
1
1
  "use client";
2
2
 
3
- import Link from "next/link";
4
3
  import { useTranslation } from "@/lib/i18n";
5
4
  import { PLAN_LIMITS, Plan, getCurrentPlan } from "@/lib/plan";
6
5
  import { useState, useEffect } from "react";
6
+ import { useRouter } from "next/navigation";
7
7
 
8
- // Fiyatlar (statik — ödeme sistemi Faz 9'da)
8
+ const CHECK = "✓";
9
+ const CROSS = "✗";
10
+ const LOCK = "🔒";
11
+
12
+ // Fiyatlar TRY - Lemon Squeezy'den
9
13
  const PRICES: Record<Plan, string> = {
10
14
  free: "0",
11
- pro: "19",
12
- team: "49",
13
- enterprise: "?",
15
+ pro: "400",
16
+ team: "800",
17
+ enterprise: "1650",
14
18
  };
15
19
 
16
- const CHECK = "";
17
- const CROSS = "";
18
- const LOCK = "🔒";
20
+ const PLAN_VARIANT: Record<Exclude<Plan, "free">, string> = {
21
+ pro: "pro",
22
+ team: "team",
23
+ enterprise: "enterprise",
24
+ };
19
25
 
20
- /** Özellik değerini okunabilir string'e çevir */
21
26
  function limitGoster(
22
27
  value: number | boolean,
23
28
  t: (k: string) => string,
@@ -33,48 +38,80 @@ interface PlanKarti {
33
38
  plan: Plan;
34
39
  vurgulu: boolean;
35
40
  fiyat: string;
36
- buton: "started" | "sales" | "current";
37
41
  }
38
42
 
39
43
  export default function PricingSayfasi() {
40
44
  const { t: tRaw } = useTranslation();
41
- // limitGoster string parametresi alabilsin diye sarmala
42
45
  const t = (k: string) => tRaw(k as Parameters<typeof tRaw>[0]);
46
+ const router = useRouter();
43
47
  const [mevcutPlan, setMevcutPlan] = useState<Plan>("free");
48
+ const [yukleniyor, setYukleniyor] = useState<Plan | null>(null);
49
+ const [hata, setHata] = useState<string>("");
44
50
 
45
51
  useEffect(() => {
46
52
  setMevcutPlan(getCurrentPlan());
47
53
  }, []);
48
54
 
49
55
  const planlar: PlanKarti[] = [
50
- { plan: "free", vurgulu: false, fiyat: PRICES.free, buton: "started" },
51
- { plan: "pro", vurgulu: false, fiyat: PRICES.pro, buton: "started" },
52
- { plan: "team", vurgulu: true, fiyat: PRICES.team, buton: "started" },
53
- { plan: "enterprise", vurgulu: false, fiyat: PRICES.enterprise, buton: "sales" },
56
+ { plan: "free", vurgulu: false, fiyat: PRICES.free },
57
+ { plan: "pro", vurgulu: false, fiyat: PRICES.pro },
58
+ { plan: "team", vurgulu: true, fiyat: PRICES.team },
59
+ { plan: "enterprise", vurgulu: false, fiyat: PRICES.enterprise },
54
60
  ];
55
61
 
56
62
  const planAdi = (p: Plan) =>
57
63
  ({ free: t("plan_free"), pro: t("plan_pro"), team: t("plan_team"), enterprise: t("plan_enterprise") })[p];
58
64
 
59
- // Özellik satırları
60
- type OzellikSatiri = {
61
- label: string;
62
- values: (string | React.ReactNode)[];
63
- kilitli?: boolean[];
65
+ // Lemon Squeezy checkout'a yonlendir
66
+ const handleBuy = async (plan: Exclude<Plan, "free">) => {
67
+ if (yukleniyor) return;
68
+ setYukleniyor(plan);
69
+ setHata("");
70
+
71
+ try {
72
+ // Once login kontrolu - /api/auth/me cookie uzerinden calisiyor
73
+ const meRes = await fetch("/api/auth/me", { credentials: "include" });
74
+ if (!meRes.ok) {
75
+ // Login degilse login'e yonlendir
76
+ router.push(`/login?redirect=/pricing&plan=${plan}`);
77
+ return;
78
+ }
79
+
80
+ // Checkout istegi - cookie otomatik gider
81
+ const response = await fetch("/api/billing/checkout", {
82
+ method: "POST",
83
+ headers: { "Content-Type": "application/json" },
84
+ body: JSON.stringify({ plan }),
85
+ credentials: "include",
86
+ });
87
+
88
+ if (!response.ok) {
89
+ const err = await response.json().catch(() => ({ detail: "Bilinmeyen hata" }));
90
+ throw new Error(err.detail || `HTTP ${response.status}`);
91
+ }
92
+
93
+ const data = await response.json();
94
+ if (data.checkout_url) {
95
+ // Lemon Squeezy checkout sayfasina yonlendir
96
+ window.location.href = data.checkout_url;
97
+ } else {
98
+ throw new Error("Checkout URL alinamadi");
99
+ }
100
+ } catch (e: any) {
101
+ setHata(e.message || "Odeme sayfasi acilamadi");
102
+ setYukleniyor(null);
103
+ }
64
104
  };
65
105
 
66
- const ozellikler: OzellikSatiri[] = [
106
+ // Ozellik satirlari
107
+ const ozellikler = [
67
108
  {
68
109
  label: t("pricing_feature_repos"),
69
- values: planlar.map((k) =>
70
- limitGoster(PLAN_LIMITS[k.plan].max_repos, t)
71
- ),
110
+ values: planlar.map((k) => limitGoster(PLAN_LIMITS[k.plan].max_repos, t)),
72
111
  },
73
112
  {
74
113
  label: t("pricing_feature_files"),
75
- values: planlar.map((k) =>
76
- limitGoster(PLAN_LIMITS[k.plan].max_files_scan, t)
77
- ),
114
+ values: planlar.map((k) => limitGoster(PLAN_LIMITS[k.plan].max_files_scan, t)),
78
115
  },
79
116
  {
80
117
  label: t("pricing_feature_history"),
@@ -86,49 +123,35 @@ export default function PricingSayfasi() {
86
123
  },
87
124
  {
88
125
  label: t("pricing_feature_dashboard"),
89
- values: planlar.map((k) =>
90
- limitGoster(PLAN_LIMITS[k.plan].dashboard_access, t)
91
- ),
126
+ values: planlar.map((k) => limitGoster(PLAN_LIMITS[k.plan].dashboard_access, t)),
92
127
  },
93
128
  {
94
129
  label: t("pricing_feature_github"),
95
- values: planlar.map((k) =>
96
- limitGoster(PLAN_LIMITS[k.plan].github_actions, t)
97
- ),
130
+ values: planlar.map((k) => limitGoster(PLAN_LIMITS[k.plan].github_actions, t)),
98
131
  },
99
132
  {
100
133
  label: t("pricing_feature_slack"),
101
- values: planlar.map((k) =>
102
- limitGoster(PLAN_LIMITS[k.plan].slack_notify, t)
103
- ),
134
+ values: planlar.map((k) => limitGoster(PLAN_LIMITS[k.plan].slack_notify, t)),
104
135
  kilitli: planlar.map((k) => !PLAN_LIMITS[k.plan].slack_notify),
105
136
  },
106
137
  {
107
138
  label: `${t("pricing_feature_bus_factor")} ${LOCK}`,
108
- values: planlar.map((k) =>
109
- limitGoster(PLAN_LIMITS[k.plan].bus_factor, t)
110
- ),
139
+ values: planlar.map((k) => limitGoster(PLAN_LIMITS[k.plan].bus_factor, t)),
111
140
  kilitli: planlar.map((k) => !PLAN_LIMITS[k.plan].bus_factor),
112
141
  },
113
142
  {
114
143
  label: `${t("pricing_feature_sprint")} ${LOCK}`,
115
- values: planlar.map((k) =>
116
- limitGoster(PLAN_LIMITS[k.plan].sprint_health, t)
117
- ),
144
+ values: planlar.map((k) => limitGoster(PLAN_LIMITS[k.plan].sprint_health, t)),
118
145
  kilitli: planlar.map((k) => !PLAN_LIMITS[k.plan].sprint_health),
119
146
  },
120
147
  {
121
148
  label: `${t("pricing_feature_ai_comparison")} ${LOCK}`,
122
- values: planlar.map((k) =>
123
- limitGoster(PLAN_LIMITS[k.plan].ai_comparison, t)
124
- ),
149
+ values: planlar.map((k) => limitGoster(PLAN_LIMITS[k.plan].ai_comparison, t)),
125
150
  kilitli: planlar.map((k) => !PLAN_LIMITS[k.plan].ai_comparison),
126
151
  },
127
152
  {
128
153
  label: t("pricing_feature_team_members"),
129
- values: planlar.map((k) =>
130
- limitGoster(PLAN_LIMITS[k.plan].team_members, t)
131
- ),
154
+ values: planlar.map((k) => limitGoster(PLAN_LIMITS[k.plan].team_members, t)),
132
155
  },
133
156
  {
134
157
  label: t("pricing_feature_support"),
@@ -143,16 +166,25 @@ export default function PricingSayfasi() {
143
166
 
144
167
  return (
145
168
  <div className="space-y-10">
146
- {/* Başlık */}
169
+ {/* Baslik */}
147
170
  <div className="text-center">
148
171
  <h1 className="text-3xl font-bold text-white">💎 {t("pricing_title")}</h1>
149
172
  <p className="text-gray-500 mt-2">{t("pricing_subtitle")}</p>
150
173
  </div>
151
174
 
152
- {/* Plan kartları */}
175
+ {/* Hata mesaji */}
176
+ {hata && (
177
+ <div className="max-w-2xl mx-auto bg-red-500/10 border border-red-500/30 text-red-300 px-4 py-3 rounded-xl text-sm text-center">
178
+ {hata}
179
+ </div>
180
+ )}
181
+
182
+ {/* Plan kartlari */}
153
183
  <div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-5">
154
184
  {planlar.map((k) => {
155
185
  const isCurrent = k.plan === mevcutPlan;
186
+ const isLoading = yukleniyor === k.plan;
187
+ const isPaid = k.plan !== "free";
156
188
  return (
157
189
  <div
158
190
  key={k.plan}
@@ -162,7 +194,6 @@ export default function PricingSayfasi() {
162
194
  : "border-gray-800"
163
195
  }`}
164
196
  >
165
- {/* Most Popular badge */}
166
197
  {k.vurgulu && (
167
198
  <div className="absolute -top-3 left-1/2 -translate-x-1/2">
168
199
  <span className="bg-cyan-500 text-gray-950 text-xs font-bold px-3 py-1 rounded-full">
@@ -180,7 +211,7 @@ export default function PricingSayfasi() {
180
211
  </span>
181
212
  ) : (
182
213
  <>
183
- <span className="text-3xl font-bold text-white">${k.fiyat}</span>
214
+ <span className="text-3xl font-bold text-white">₺{k.fiyat}</span>
184
215
  {k.fiyat !== "0" && (
185
216
  <span className="text-gray-500 text-sm mb-1">
186
217
  {t("pricing_per_month")}
@@ -196,31 +227,47 @@ export default function PricingSayfasi() {
196
227
  <div className="w-full text-center py-2 px-4 rounded-xl border border-gray-700 text-gray-500 text-sm font-medium">
197
228
  {t("pricing_current_plan")}
198
229
  </div>
199
- ) : k.buton === "sales" ? (
200
- <Link
201
- href="mailto:hello@codedna.dev"
230
+ ) : k.plan === "enterprise" ? (
231
+ <a
232
+ href="mailto:hello@natureco.me"
202
233
  className="w-full text-center py-2 px-4 rounded-xl border border-cyan-500 text-cyan-400 hover:bg-cyan-500/10 transition-colors text-sm font-medium"
203
234
  >
204
235
  {t("pricing_contact_sales")}
205
- </Link>
236
+ </a>
237
+ ) : isPaid ? (
238
+ <button
239
+ onClick={() => handleBuy(k.plan as Exclude<Plan, "free">)}
240
+ disabled={isLoading}
241
+ className={`w-full py-2 px-4 rounded-xl text-sm font-semibold transition-colors ${
242
+ k.vurgulu
243
+ ? "bg-cyan-500 hover:bg-cyan-400 text-gray-950"
244
+ : "bg-gray-800 hover:bg-gray-700 text-white"
245
+ } ${isLoading ? "opacity-50 cursor-wait" : ""}`}
246
+ >
247
+ {isLoading ? (
248
+ <span>Yukleniyor...</span>
249
+ ) : (
250
+ <>💳 {t("pricing_get_started_paid")}</>
251
+ )}
252
+ </button>
206
253
  ) : (
207
- <Link
208
- href="#"
209
- className={`w-full text-center py-2 px-4 rounded-xl text-sm font-semibold transition-colors ${
254
+ <button
255
+ onClick={() => router.push("/login?redirect=/pricing")}
256
+ className={`w-full py-2 px-4 rounded-xl text-sm font-semibold transition-colors ${
210
257
  k.vurgulu
211
258
  ? "bg-cyan-500 hover:bg-cyan-400 text-gray-950"
212
259
  : "bg-gray-800 hover:bg-gray-700 text-white"
213
260
  }`}
214
261
  >
215
262
  {t("pricing_get_started")}
216
- </Link>
263
+ </button>
217
264
  )}
218
265
  </div>
219
266
  );
220
267
  })}
221
268
  </div>
222
269
 
223
- {/* Özellik karşılaştırma tablosu */}
270
+ {/* Ozellik karsilastirma tablosu */}
224
271
  <div className="bg-gray-900 border border-gray-800 rounded-2xl overflow-hidden">
225
272
  <table className="w-full text-sm">
226
273
  <thead>
@@ -91,6 +91,7 @@ export const en = {
91
91
  pricing_most_popular: "Most Popular",
92
92
  pricing_per_month: "/mo",
93
93
  pricing_get_started: "Get Started",
94
+ pricing_get_started_paid: "Upgrade Now",
94
95
  pricing_contact_sales: "Contact Sales",
95
96
  pricing_current_plan: "Current Plan",
96
97
  pricing_feature_repos: "Repositories",
@@ -93,6 +93,7 @@ export const tr: Record<TranslationKey, string> = {
93
93
  pricing_most_popular: "En Popüler",
94
94
  pricing_per_month: "/ay",
95
95
  pricing_get_started: "Başla",
96
+ pricing_get_started_paid: "Hemen Yükselt",
96
97
  pricing_contact_sales: "Satışla İletişim",
97
98
  pricing_current_plan: "Mevcut Plan",
98
99
  pricing_feature_repos: "Repo sayısı",
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "codedna"
3
- version = "0.2.0"
3
+ version = "0.2.1"
4
4
  description = "AI kod şeffaflık aracı — her commit'te AI yazım oranını ve anlama skorunu ölçer"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.10"
@@ -1,47 +0,0 @@
1
- /**
2
- * Next.js API Route — /api/billing/checkout
3
- * Cookie'deki token'ı alıp FastAPI'ye checkout isteği proxy'ler.
4
- */
5
-
6
- import { NextRequest, NextResponse } from "next/server";
7
- import { cookies } from "next/headers";
8
-
9
- const API_URL = process.env.NEXT_PUBLIC_API_URL || "http://localhost:8000";
10
-
11
- export async function POST(req: NextRequest) {
12
- const cookieStore = cookies();
13
- const token = cookieStore.get("codedna_token")?.value;
14
-
15
- if (!token) {
16
- return NextResponse.json({ detail: "Giriş yapınız." }, { status: 401 });
17
- }
18
-
19
- const govde = await req.json().catch(() => null);
20
- if (!govde?.plan) {
21
- return NextResponse.json({ detail: "Plan zorunlu." }, { status: 422 });
22
- }
23
-
24
- try {
25
- const fastapiYanit = await fetch(`${API_URL}/billing/checkout`, {
26
- method: "POST",
27
- headers: {
28
- "Content-Type": "application/json",
29
- Authorization: `Bearer ${token}`,
30
- },
31
- body: JSON.stringify({ plan: govde.plan }),
32
- });
33
-
34
- const veri = await fastapiYanit.json();
35
-
36
- if (!fastapiYanit.ok) {
37
- return NextResponse.json(
38
- { detail: veri.detail || "Checkout URL alınamadı." },
39
- { status: fastapiYanit.status }
40
- );
41
- }
42
-
43
- return NextResponse.json(veri);
44
- } catch {
45
- return NextResponse.json({ detail: "API'ye bağlanılamadı." }, { status: 503 });
46
- }
47
- }
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes